kimiflare 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/index.js +579 -195
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/util/sse.ts","../src/util/errors.ts","../src/agent/client.ts","../src/tools/registry.ts","../src/agent/loop.ts","../src/mode.ts","../src/agent/system-prompt.ts","../src/util/paths.ts","../src/tools/read.ts","../src/tools/write.ts","../src/tools/edit.ts","../src/tools/bash.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/web-fetch.ts","../src/tasks-state.ts","../src/tools/tasks.ts","../src/tools/executor.ts","../src/agent/compact.ts","../src/ui/diff-view.tsx","../src/ui/tool-view.tsx","../src/ui/chat.tsx","../src/ui/status.tsx","../src/ui/permission.tsx","../src/ui/resume-picker.tsx","../src/ui/task-list.tsx","../node_modules/chalk/source/vendor/ansi-styles/index.js","../node_modules/chalk/source/vendor/supports-color/index.js","../node_modules/chalk/source/utilities.js","../node_modules/chalk/source/index.js","../src/ui/text-input.tsx","../src/util/update-check.ts","../src/ui/onboarding.tsx","../src/ui/theme.ts","../src/sessions.ts","../src/app.tsx","../src/index.tsx"],"sourcesContent":["import { readFile, mkdir, writeFile, chmod } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport type ReasoningEffort = \"low\" | \"medium\" | \"high\";\n\nexport interface KimiConfig {\n accountId: string;\n apiToken: string;\n model: string;\n theme?: string;\n reasoningEffort?: ReasoningEffort;\n}\n\nexport const DEFAULT_MODEL = \"@cf/moonshotai/kimi-k2.6\";\nexport const DEFAULT_REASONING_EFFORT: ReasoningEffort = \"medium\";\n\nexport function configPath(): string {\n const xdg = process.env.XDG_CONFIG_HOME || join(homedir(), \".config\");\n return join(xdg, \"kimiflare\", \"config.json\");\n}\n\nfunction readReasoningEffortEnv(): ReasoningEffort | undefined {\n const raw = process.env.KIMI_REASONING_EFFORT?.toLowerCase();\n if (raw === \"low\" || raw === \"medium\" || raw === \"high\") return raw;\n return undefined;\n}\n\nexport async function loadConfig(): Promise<KimiConfig | null> {\n const envAccount = process.env.CLOUDFLARE_ACCOUNT_ID ?? process.env.CF_ACCOUNT_ID;\n const envToken = process.env.CLOUDFLARE_API_TOKEN ?? process.env.CF_API_TOKEN;\n const envModel = process.env.KIMI_MODEL ?? DEFAULT_MODEL;\n const envEffort = readReasoningEffortEnv();\n const envTheme = process.env.KIMI_THEME;\n\n if (envAccount && envToken) {\n return {\n accountId: envAccount,\n apiToken: envToken,\n model: envModel,\n theme: envTheme,\n reasoningEffort: envEffort,\n };\n }\n\n try {\n const raw = await readFile(configPath(), \"utf8\");\n const parsed = JSON.parse(raw) as Partial<KimiConfig>;\n if (parsed.accountId && parsed.apiToken) {\n return {\n accountId: envAccount ?? parsed.accountId,\n apiToken: envToken ?? parsed.apiToken,\n model: envModel ?? parsed.model ?? DEFAULT_MODEL,\n theme: envTheme ?? parsed.theme,\n reasoningEffort: envEffort ?? parsed.reasoningEffort,\n };\n }\n } catch {\n /* no config file */\n }\n return null;\n}\n\nexport async function saveConfig(cfg: KimiConfig): Promise<string> {\n const p = configPath();\n await mkdir(join(p, \"..\"), { recursive: true });\n await writeFile(p, JSON.stringify(cfg, null, 2), \"utf8\");\n await chmod(p, 0o600);\n return p;\n}\n","// Minimal SSE reader that yields the payload of each `data:` event.\n// Handles:\n// - line splits across chunk boundaries\n// - multi-line data (rfc says concatenate with \\n)\n// - CRLF or LF line endings\n// - events that don't start with `data:` (ignored)\n// Does NOT handle retry / event-id / named events — we don't need them.\n\nexport async function* readSSE(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<string, void, void> {\n const reader = stream.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n try {\n while (true) {\n if (signal?.aborted) throw new DOMException(\"aborted\", \"AbortError\");\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n buffer = buffer.replace(/\\r\\n/g, \"\\n\");\n\n let sep: number;\n while ((sep = buffer.indexOf(\"\\n\\n\")) !== -1) {\n const event = buffer.slice(0, sep);\n buffer = buffer.slice(sep + 2);\n const data = extractData(event);\n if (data !== null) yield data;\n }\n }\n // Flush any final event without a trailing blank line.\n buffer += decoder.decode();\n const tail = extractData(buffer.trim());\n if (tail !== null) yield tail;\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction extractData(event: string): string | null {\n if (!event) return null;\n const parts: string[] = [];\n for (const raw of event.split(\"\\n\")) {\n if (!raw.startsWith(\"data:\")) continue;\n // SSE allows an optional single space after the colon.\n parts.push(raw.slice(5).replace(/^ /, \"\"));\n }\n return parts.length ? parts.join(\"\\n\") : null;\n}\n","export class KimiApiError extends Error {\n constructor(\n message: string,\n public readonly code?: number,\n public readonly httpStatus?: number,\n ) {\n super(message);\n this.name = \"KimiApiError\";\n }\n}\n\nexport class PermissionDeniedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PermissionDeniedError\";\n }\n}\n","import { readSSE } from \"../util/sse.js\";\nimport { KimiApiError } from \"../util/errors.js\";\nimport type { ChatMessage, ToolDef, Usage } from \"./messages.js\";\n\nexport type KimiEvent =\n | { type: \"reasoning\"; delta: string }\n | { type: \"text\"; delta: string }\n | { type: \"tool_call_start\"; index: number; id: string; name: string }\n | { type: \"tool_call_args\"; index: number; argsDelta: string }\n | { type: \"tool_call_complete\"; index: number; id: string; name: string; arguments: string }\n | { type: \"usage\"; usage: Usage }\n | { type: \"done\"; finishReason: string | null; usage: Usage | null };\n\nexport interface RunKimiOpts {\n accountId: string;\n apiToken: string;\n model: string;\n messages: ChatMessage[];\n tools?: ToolDef[];\n signal?: AbortSignal;\n temperature?: number;\n maxCompletionTokens?: number;\n reasoningEffort?: \"low\" | \"medium\" | \"high\";\n}\n\nconst RETRYABLE_CODE = 3040; // \"Capacity temporarily exceeded\"\nconst MAX_ATTEMPTS = 5;\n\nexport async function* runKimi(opts: RunKimiOpts): AsyncGenerator<KimiEvent, void, void> {\n const url = `https://api.cloudflare.com/client/v4/accounts/${opts.accountId}/ai/run/${opts.model}`;\n const body: Record<string, unknown> = {\n messages: opts.messages,\n ...(opts.tools && opts.tools.length\n ? { tools: opts.tools, tool_choice: \"auto\", parallel_tool_calls: true }\n : {}),\n stream: true,\n temperature: opts.temperature ?? 0.2,\n max_completion_tokens: opts.maxCompletionTokens ?? 16384,\n };\n if (opts.reasoningEffort) {\n body.reasoning_effort = opts.reasoningEffort;\n }\n\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${opts.apiToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: opts.signal,\n });\n\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n\n // Cloudflare returns HTTP 200 + application/json with {success:false,errors:[{code:3040}]}\n // for transient capacity errors. Retry those; surface everything else.\n if (!contentType.includes(\"text/event-stream\")) {\n const text = await res.text();\n let parsed: unknown = null;\n try {\n parsed = JSON.parse(text);\n } catch {\n /* ignore */\n }\n const err = extractCloudflareError(parsed);\n if (err?.code === RETRYABLE_CODE && attempt < MAX_ATTEMPTS - 1) {\n const delay = 500 * 2 ** attempt + Math.random() * 250;\n await sleep(delay, opts.signal);\n continue;\n }\n const msg = err?.message ?? `HTTP ${res.status}: ${text.slice(0, 300)}`;\n throw new KimiApiError(`kimiflare: ${msg}`, err?.code, res.status);\n }\n\n if (!res.body) throw new KimiApiError(\"kimiflare: empty response body\", undefined, res.status);\n\n yield* parseStream(res.body, opts.signal);\n return;\n }\n}\n\nasync function* parseStream(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<KimiEvent, void, void> {\n const toolCalls = new Map<number, { id: string; name: string; args: string }>();\n let lastUsage: Usage | null = null;\n let finishReason: string | null = null;\n\n for await (const dataStr of readSSE(body, signal)) {\n if (dataStr === \"[DONE]\") break;\n let chunk: StreamChunk | null = null;\n try {\n chunk = JSON.parse(dataStr);\n } catch {\n continue;\n }\n if (!chunk) continue;\n\n if (chunk.usage) {\n lastUsage = chunk.usage;\n yield { type: \"usage\", usage: chunk.usage };\n }\n\n const choice = chunk.choices?.[0];\n if (!choice) continue;\n\n const d = choice.delta;\n if (d) {\n if (typeof d.reasoning_content === \"string\" && d.reasoning_content.length) {\n yield { type: \"reasoning\", delta: d.reasoning_content };\n }\n if (typeof d.content === \"string\" && d.content.length) {\n yield { type: \"text\", delta: d.content };\n }\n if (Array.isArray(d.tool_calls)) {\n for (const tc of d.tool_calls) {\n const idx = typeof tc.index === \"number\" ? tc.index : 0;\n let buf = toolCalls.get(idx);\n const incomingName = tc.function?.name ?? null;\n const incomingId = tc.id ?? null;\n if (!buf) {\n buf = { id: incomingId ?? `tc_${idx}`, name: incomingName ?? \"\", args: \"\" };\n toolCalls.set(idx, buf);\n if (buf.name) {\n yield { type: \"tool_call_start\", index: idx, id: buf.id, name: buf.name };\n }\n } else {\n if (!buf.name && incomingName) {\n buf.name = incomingName;\n yield { type: \"tool_call_start\", index: idx, id: buf.id, name: buf.name };\n }\n if (buf.id.startsWith(\"tc_\") && incomingId) buf.id = incomingId;\n }\n const argDelta = tc.function?.arguments;\n if (typeof argDelta === \"string\" && argDelta.length) {\n buf.args += argDelta;\n yield { type: \"tool_call_args\", index: idx, argsDelta: argDelta };\n }\n }\n }\n }\n\n if (choice.finish_reason) finishReason = choice.finish_reason;\n }\n\n for (const [idx, buf] of [...toolCalls.entries()].sort((a, b) => a[0] - b[0])) {\n if (!buf.name) continue;\n yield {\n type: \"tool_call_complete\",\n index: idx,\n id: buf.id,\n name: buf.name,\n arguments: buf.args,\n };\n }\n\n yield { type: \"done\", finishReason, usage: lastUsage };\n}\n\ninterface StreamChunk {\n choices?: StreamChoice[];\n usage?: Usage;\n}\ninterface StreamChoice {\n delta?: StreamDelta;\n finish_reason?: string | null;\n index?: number;\n}\ninterface StreamDelta {\n role?: string | null;\n content?: string | null;\n reasoning_content?: string | null;\n tool_calls?: StreamToolCall[];\n}\ninterface StreamToolCall {\n index?: number;\n id?: string | null;\n type?: string | null;\n function?: { name?: string | null; arguments?: string | null };\n}\n\nfunction extractCloudflareError(parsed: unknown): { code?: number; message?: string } | null {\n if (!parsed || typeof parsed !== \"object\") return null;\n const p = parsed as { success?: boolean; errors?: Array<{ code?: number; message?: string }> };\n if (p.success === false && Array.isArray(p.errors) && p.errors.length > 0) {\n return { code: p.errors[0]?.code, message: p.errors[0]?.message };\n }\n return null;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(new DOMException(\"aborted\", \"AbortError\"));\n const t = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(t);\n reject(new DOMException(\"aborted\", \"AbortError\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","import type { ToolDef } from \"../agent/messages.js\";\nimport type { Task } from \"../tasks-state.js\";\n\nexport interface ToolContext {\n cwd: string;\n signal?: AbortSignal;\n onTasks?: (tasks: Task[]) => void;\n}\n\nexport interface ToolRender {\n title: string;\n body?: string;\n diff?: { path: string; before: string; after: string };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface ToolSpec<Args = any> {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n needsPermission: boolean;\n render?: (args: Args) => ToolRender;\n run: (args: Args, ctx: ToolContext) => Promise<string>;\n}\n\nexport function toOpenAIToolDefs(tools: ToolSpec[]): ToolDef[] {\n return tools.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n }));\n}\n","import { runKimi } from \"./client.js\";\nimport { toOpenAIToolDefs, type ToolSpec } from \"../tools/registry.js\";\nimport type { ToolExecutor, PermissionAsker, ToolResult } from \"../tools/executor.js\";\nimport type { ChatMessage, ToolCall, Usage } from \"./messages.js\";\nimport type { Task } from \"../tasks-state.js\";\n\nexport interface AgentCallbacks {\n onAssistantStart?: () => void;\n onReasoningDelta?: (text: string) => void;\n onTextDelta?: (text: string) => void;\n onToolCallStart?: (index: number, id: string, name: string) => void;\n onToolCallArgs?: (index: number, delta: string) => void;\n onToolCallFinalized?: (call: ToolCall) => void;\n onUsage?: (usage: Usage) => void;\n onAssistantFinal?: (msg: ChatMessage) => void;\n onToolResult?: (result: ToolResult) => void;\n onTasks?: (tasks: Task[]) => void;\n askPermission: PermissionAsker;\n}\n\nexport interface AgentTurnOpts {\n accountId: string;\n apiToken: string;\n model: string;\n messages: ChatMessage[];\n tools: ToolSpec[];\n executor: ToolExecutor;\n cwd: string;\n signal: AbortSignal;\n callbacks: AgentCallbacks;\n maxToolIterations?: number;\n temperature?: number;\n maxCompletionTokens?: number;\n reasoningEffort?: \"low\" | \"medium\" | \"high\";\n}\n\nexport async function runAgentTurn(opts: AgentTurnOpts): Promise<void> {\n const max = opts.maxToolIterations ?? 50;\n const toolDefs = toOpenAIToolDefs(opts.tools);\n\n for (let iter = 0; iter < max; iter++) {\n const toolCalls: ToolCall[] = [];\n let content = \"\";\n let reasoning = \"\";\n opts.callbacks.onAssistantStart?.();\n\n const events = runKimi({\n accountId: opts.accountId,\n apiToken: opts.apiToken,\n model: opts.model,\n messages: opts.messages,\n tools: toolDefs,\n signal: opts.signal,\n temperature: opts.temperature,\n maxCompletionTokens: opts.maxCompletionTokens,\n reasoningEffort: opts.reasoningEffort,\n });\n\n for await (const ev of events) {\n switch (ev.type) {\n case \"reasoning\":\n reasoning += ev.delta;\n opts.callbacks.onReasoningDelta?.(ev.delta);\n break;\n case \"text\":\n content += ev.delta;\n opts.callbacks.onTextDelta?.(ev.delta);\n break;\n case \"tool_call_start\":\n opts.callbacks.onToolCallStart?.(ev.index, ev.id, ev.name);\n break;\n case \"tool_call_args\":\n opts.callbacks.onToolCallArgs?.(ev.index, ev.argsDelta);\n break;\n case \"tool_call_complete\": {\n const call: ToolCall = {\n id: ev.id,\n type: \"function\",\n function: { name: ev.name, arguments: ev.arguments },\n };\n toolCalls.push(call);\n opts.callbacks.onToolCallFinalized?.(call);\n break;\n }\n case \"usage\":\n opts.callbacks.onUsage?.(ev.usage);\n break;\n case \"done\":\n break;\n }\n }\n\n const assistantMsg: ChatMessage = {\n role: \"assistant\",\n content: content || null,\n ...(reasoning ? { reasoning_content: reasoning } : {}),\n ...(toolCalls.length ? { tool_calls: toolCalls } : {}),\n };\n opts.messages.push(assistantMsg);\n opts.callbacks.onAssistantFinal?.(assistantMsg);\n\n if (toolCalls.length === 0) return;\n\n for (const tc of toolCalls) {\n if (opts.signal.aborted) throw new DOMException(\"aborted\", \"AbortError\");\n const result = await opts.executor.run(\n { id: tc.id, name: tc.function.name, arguments: tc.function.arguments },\n opts.callbacks.askPermission,\n { cwd: opts.cwd, signal: opts.signal, onTasks: opts.callbacks.onTasks },\n );\n opts.messages.push({\n role: \"tool\",\n tool_call_id: result.tool_call_id,\n content: result.content,\n name: result.name,\n });\n opts.callbacks.onToolResult?.(result);\n }\n }\n\n throw new Error(`kimiflare: tool iteration limit reached (${opts.maxToolIterations ?? 50})`);\n}\n","export type Mode = \"edit\" | \"plan\" | \"auto\";\n\nexport const MODES: Mode[] = [\"edit\", \"plan\", \"auto\"];\n\nexport function nextMode(m: Mode): Mode {\n const i = MODES.indexOf(m);\n return MODES[(i + 1) % MODES.length]!;\n}\n\nexport function modeDescription(m: Mode): string {\n switch (m) {\n case \"edit\":\n return \"edit — default; prompts for permission before mutating tools\";\n case \"plan\":\n return \"plan — read-only research; blocks writes/edits/bash until you exit plan mode\";\n case \"auto\":\n return \"auto — autonomous; auto-approves every tool call (use with care)\";\n }\n}\n\nexport const MUTATING_TOOLS = new Set([\"write\", \"edit\", \"bash\"]);\n\nexport function isBlockedInPlanMode(toolName: string): boolean {\n return MUTATING_TOOLS.has(toolName);\n}\n\nexport function systemPromptForMode(m: Mode): string {\n if (m === \"plan\") {\n return \"\\n\\nPLAN MODE is active. The user wants you to investigate and produce a plan WITHOUT making any changes. Do not call write, edit, or bash. Only use read/glob/grep/web-fetch. At the end, present a concise plan (bullets, files to change, approach). The user will review and then exit plan mode to execute.\";\n }\n if (m === \"auto\") {\n return \"\\n\\nAUTO MODE is active. The user has opted into autonomous execution — every tool call will be auto-approved. Work efficiently, but do not take irreversible destructive actions (rm -rf, git push --force, dropping tables, etc.) without pausing to describe them in chat first. Prefer smaller reversible steps.\";\n }\n return \"\";\n}\n","import { platform, release, homedir } from \"node:os\";\nimport { basename } from \"node:path\";\nimport type { ToolSpec } from \"../tools/registry.js\";\nimport { systemPromptForMode, type Mode } from \"../mode.js\";\n\nexport interface SystemPromptOpts {\n cwd: string;\n tools: ToolSpec[];\n model: string;\n now?: Date;\n mode?: Mode;\n}\n\nexport function buildSystemPrompt(opts: SystemPromptOpts): string {\n const now = opts.now ?? new Date();\n const date = now.toISOString().slice(0, 10);\n const shell = process.env.SHELL ? basename(process.env.SHELL) : \"sh\";\n const toolsBlock = opts.tools\n .map((t) => {\n const perm = t.needsPermission ? \" [needs user permission]\" : \"\";\n return `- \\`${t.name}\\`${perm}: ${t.description.split(\"\\n\")[0]}`;\n })\n .join(\"\\n\");\n\n return `You are kimiflare, an interactive coding assistant running in the user's terminal. You act on the user's local filesystem through the tools listed below. You are powered by the ${opts.model} model on Cloudflare Workers AI.\n\nEnvironment:\n- Working directory: ${opts.cwd}\n- Platform: ${platform()} ${release()}\n- Shell: ${shell}\n- Home: ${homedir()}\n- Today: ${date}\n\nTools available:\n${toolsBlock}\n\nHow to work:\n- Prefer calling tools over guessing. Read files before editing them. Use \\`glob\\` and \\`grep\\` to explore code before assuming structure.\n- Before any mutating tool call (write, edit, bash), state in one short sentence what you're about to do, then call the tool. The user will be asked to approve each mutating call.\n- When the user asks for a change, make the change. Do not paste code in chat that you could apply with \\`edit\\` or \\`write\\`.\n- For multi-step work, call \\`tasks_set\\` at the start with a short task list (one task \"in_progress\", the rest \"pending\"), then call it again after each step completes (flip that one to \"completed\" and the next to \"in_progress\"). Skip it for trivial single-step requests.\n- Keep responses terse. The user sees tool calls and their results inline — do not re-summarize them unless asked.\n- If a tool returns an error, read it carefully and adjust; do not retry the same call blindly.\n- You have a 262k-token context window. Read as much of a file as needed rather than guessing.\n- If a request is ambiguous, ask one focused question instead of making large assumptions.\n- When you finish a task, stop. Do not add a closing summary.${opts.mode ? systemPromptForMode(opts.mode) : \"\"}`;\n}\n","import { resolve, isAbsolute } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport function resolvePath(cwd: string, input: string): string {\n if (input.startsWith(\"~/\") || input === \"~\") {\n return resolve(homedir(), input === \"~\" ? \".\" : input.slice(2));\n }\n return isAbsolute(input) ? input : resolve(cwd, input);\n}\n\nexport function truncate(s: string, n: number): string {\n if (s.length <= n) return s;\n return s.slice(0, n) + `\\n... [truncated, ${s.length - n} chars omitted]`;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { resolvePath } from \"../util/paths.js\";\n\nconst MAX_BYTES = 2 * 1024 * 1024;\n\ninterface Args {\n path: string;\n offset?: number;\n limit?: number;\n}\n\nexport const readTool: ToolSpec<Args> = {\n name: \"read\",\n description:\n \"Read a text file from the local filesystem. Supports optional line offset/limit. Refuses files larger than 2MB. Returns contents with 1-indexed line numbers prefixed, cat -n style.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Path to the file. Absolute or relative to cwd.\" },\n offset: { type: \"integer\", description: \"1-indexed line number to start reading from.\", minimum: 1 },\n limit: { type: \"integer\", description: \"Maximum number of lines to return.\", minimum: 1 },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n needsPermission: false,\n render: ({ path }) => ({ title: `read ${path}` }),\n async run(args, ctx) {\n const abs = resolvePath(ctx.cwd, args.path);\n const st = await stat(abs);\n if (st.size > MAX_BYTES) throw new Error(`file too large: ${st.size} bytes (max ${MAX_BYTES})`);\n const text = await readFile(abs, \"utf8\");\n const lines = text.split(\"\\n\");\n const start = Math.max(0, (args.offset ?? 1) - 1);\n const end = args.limit ? Math.min(lines.length, start + args.limit) : lines.length;\n const width = String(end).length;\n return lines\n .slice(start, end)\n .map((l, i) => `${String(start + i + 1).padStart(width, \" \")}\\t${l}`)\n .join(\"\\n\");\n },\n};\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { resolvePath } from \"../util/paths.js\";\n\ninterface Args {\n path: string;\n content: string;\n}\n\nexport const writeTool: ToolSpec<Args> = {\n name: \"write\",\n description:\n \"Create a file or overwrite an existing one with the given contents. Prompts the user for permission first and shows a diff preview.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n content: { type: \"string\" },\n },\n required: [\"path\", \"content\"],\n additionalProperties: false,\n },\n needsPermission: true,\n render: (args) => ({\n title: `write ${args.path} (${args.content.length} chars)`,\n diff: { path: args.path, before: \"\", after: args.content },\n }),\n async run(args, ctx) {\n const abs = resolvePath(ctx.cwd, args.path);\n let before = \"\";\n try {\n before = await readFile(abs, \"utf8\");\n } catch {\n /* new file */\n }\n await mkdir(dirname(abs), { recursive: true });\n await writeFile(abs, args.content, \"utf8\");\n const verb = before ? \"Overwrote\" : \"Created\";\n return `${verb} ${args.path} (${args.content.length} chars).`;\n },\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { resolvePath } from \"../util/paths.js\";\n\ninterface Args {\n path: string;\n old_string: string;\n new_string: string;\n replace_all?: boolean;\n}\n\nexport const editTool: ToolSpec<Args> = {\n name: \"edit\",\n description:\n \"Replace an exact string in a file. If replace_all is false (default), the old_string must appear exactly once or the call fails. Prompts the user for permission first and shows a diff preview.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n old_string: { type: \"string\", description: \"Exact text to replace.\" },\n new_string: { type: \"string\", description: \"Replacement text.\" },\n replace_all: { type: \"boolean\", default: false },\n },\n required: [\"path\", \"old_string\", \"new_string\"],\n additionalProperties: false,\n },\n needsPermission: true,\n render: (args) => ({\n title: `edit ${args.path}${args.replace_all ? \" (replace_all)\" : \"\"}`,\n diff: { path: args.path, before: args.old_string, after: args.new_string },\n }),\n async run(args, ctx) {\n const abs = resolvePath(ctx.cwd, args.path);\n const orig = await readFile(abs, \"utf8\");\n const occurrences = countOccurrences(orig, args.old_string);\n if (occurrences === 0) throw new Error(`old_string not found in ${args.path}`);\n if (occurrences > 1 && !args.replace_all) {\n throw new Error(\n `old_string appears ${occurrences} times in ${args.path}; pass replace_all=true or include more surrounding context`,\n );\n }\n const next = args.replace_all\n ? orig.split(args.old_string).join(args.new_string)\n : orig.replace(args.old_string, args.new_string);\n await writeFile(abs, next, \"utf8\");\n return `Replaced ${occurrences} occurrence(s) in ${args.path}.`;\n },\n};\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (!needle) return 0;\n let count = 0;\n let from = 0;\n while (true) {\n const i = haystack.indexOf(needle, from);\n if (i === -1) return count;\n count++;\n from = i + needle.length;\n }\n}\n","import { spawn } from \"node:child_process\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { truncate } from \"../util/paths.js\";\n\ninterface Args {\n command: string;\n timeout_ms?: number;\n}\n\nconst DEFAULT_TIMEOUT = 120_000;\nconst MAX_TIMEOUT = 600_000;\nconst OUTPUT_CAP = 30_000;\n\nexport const bashTool: ToolSpec<Args> = {\n name: \"bash\",\n description:\n \"Run a shell command via `bash -lc`. Prompts the user for permission before executing. stdout and stderr are captured, combined, and capped at 30KB.\",\n parameters: {\n type: \"object\",\n properties: {\n command: { type: \"string\" },\n timeout_ms: {\n type: \"integer\",\n description: \"Milliseconds. Default 120000, max 600000.\",\n minimum: 1000,\n maximum: MAX_TIMEOUT,\n },\n },\n required: [\"command\"],\n additionalProperties: false,\n },\n needsPermission: true,\n render: (args) => ({ title: `bash: ${args.command}`.slice(0, 120) }),\n run(args, ctx) {\n const timeout = Math.min(Math.max(1000, args.timeout_ms ?? DEFAULT_TIMEOUT), MAX_TIMEOUT);\n return new Promise<string>((resolve, reject) => {\n const child = spawn(\"bash\", [\"-lc\", args.command], {\n cwd: ctx.cwd,\n signal: ctx.signal,\n });\n let stdout = \"\";\n let stderr = \"\";\n let killedByTimeout = false;\n const timer = setTimeout(() => {\n killedByTimeout = true;\n child.kill(\"SIGKILL\");\n }, timeout);\n child.stdout.on(\"data\", (d: Buffer) => {\n stdout += d.toString(\"utf8\");\n });\n child.stderr.on(\"data\", (d: Buffer) => {\n stderr += d.toString(\"utf8\");\n });\n child.on(\"error\", (e) => {\n clearTimeout(timer);\n reject(e);\n });\n child.on(\"close\", (code, signal) => {\n clearTimeout(timer);\n const header = killedByTimeout\n ? `(timed out after ${timeout}ms)`\n : `exit=${code ?? \"?\"}${signal ? ` signal=${signal}` : \"\"}`;\n const parts: string[] = [header];\n if (stdout) parts.push(`--- stdout ---\\n${stdout.trimEnd()}`);\n if (stderr) parts.push(`--- stderr ---\\n${stderr.trimEnd()}`);\n if (!stdout && !stderr) parts.push(\"(no output)\");\n resolve(truncate(parts.join(\"\\n\"), OUTPUT_CAP));\n });\n });\n },\n};\n","import fg from \"fast-glob\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { resolvePath } from \"../util/paths.js\";\n\ninterface Args {\n pattern: string;\n path?: string;\n}\n\nexport const globTool: ToolSpec<Args> = {\n name: \"glob\",\n description:\n \"Find files matching a glob pattern (e.g. `**/*.ts`). Returns up to 200 absolute paths, sorted by mtime descending.\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: { type: \"string\", description: \"Glob pattern, e.g. `src/**/*.ts`.\" },\n path: { type: \"string\", description: \"Root directory. Defaults to cwd.\" },\n },\n required: [\"pattern\"],\n additionalProperties: false,\n },\n needsPermission: false,\n render: (args) => ({ title: `glob ${args.pattern}${args.path ? ` in ${args.path}` : \"\"}` }),\n async run(args, ctx) {\n const root = args.path ? resolvePath(ctx.cwd, args.path) : ctx.cwd;\n const entries = (await fg(args.pattern, {\n cwd: root,\n absolute: true,\n dot: false,\n onlyFiles: false,\n stats: true,\n })) as unknown as Array<{ path: string; stats?: { mtimeMs: number } }>;\n entries.sort((a, b) => (b.stats?.mtimeMs ?? 0) - (a.stats?.mtimeMs ?? 0));\n const paths = entries.slice(0, 200).map((e) => e.path);\n return paths.length ? paths.join(\"\\n\") : \"(no matches)\";\n },\n};\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { readFile } from \"node:fs/promises\";\nimport fg from \"fast-glob\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { resolvePath, truncate } from \"../util/paths.js\";\n\nconst pExecFile = promisify(execFile);\n\ninterface Args {\n pattern: string;\n path?: string;\n glob?: string;\n case_insensitive?: boolean;\n output_mode?: \"content\" | \"files\";\n}\n\nlet cachedHasRg: boolean | null = null;\nasync function hasRipgrep(): Promise<boolean> {\n if (cachedHasRg !== null) return cachedHasRg;\n try {\n await pExecFile(\"rg\", [\"--version\"]);\n cachedHasRg = true;\n } catch {\n cachedHasRg = false;\n }\n return cachedHasRg;\n}\n\nexport const grepTool: ToolSpec<Args> = {\n name: \"grep\",\n description:\n \"Search file contents for a regular expression. Shells out to ripgrep if available, otherwise uses a JavaScript fallback. Output is capped at 30KB.\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: { type: \"string\", description: \"Regex pattern.\" },\n path: { type: \"string\", description: \"Root directory. Defaults to cwd.\" },\n glob: { type: \"string\", description: \"Filter files by glob, e.g. `*.ts`.\" },\n case_insensitive: { type: \"boolean\" },\n output_mode: {\n type: \"string\",\n enum: [\"content\", \"files\"],\n description: \"`content` returns matching lines; `files` returns matching file paths only.\",\n },\n },\n required: [\"pattern\"],\n additionalProperties: false,\n },\n needsPermission: false,\n render: (args) => ({ title: `grep ${args.pattern}${args.glob ? ` (${args.glob})` : \"\"}` }),\n async run(args, ctx) {\n const root = args.path ? resolvePath(ctx.cwd, args.path) : ctx.cwd;\n const mode = args.output_mode ?? \"content\";\n if (await hasRipgrep()) return runRipgrep(args, root, mode);\n return runJsFallback(args, root, mode);\n },\n};\n\nasync function runRipgrep(\n args: Args,\n root: string,\n mode: \"content\" | \"files\",\n): Promise<string> {\n const rgArgs = [\"--no-heading\", \"--color=never\", \"--line-number\"];\n if (args.case_insensitive) rgArgs.push(\"-i\");\n if (args.glob) rgArgs.push(\"--glob\", args.glob);\n if (mode === \"files\") rgArgs.push(\"-l\");\n rgArgs.push(\"--\", args.pattern, root);\n try {\n const { stdout } = await pExecFile(\"rg\", rgArgs, { maxBuffer: 10 * 1024 * 1024 });\n const trimmed = stdout.trim();\n return trimmed ? truncate(trimmed, 30_000) : \"(no matches)\";\n } catch (e) {\n const err = e as { code?: number; stderr?: string };\n if (err.code === 1) return \"(no matches)\";\n throw new Error(err.stderr || String(e));\n }\n}\n\nasync function runJsFallback(\n args: Args,\n root: string,\n mode: \"content\" | \"files\",\n): Promise<string> {\n const re = new RegExp(args.pattern, args.case_insensitive ? \"i\" : \"\");\n const globPattern = args.glob ? `**/${args.glob}` : \"**/*\";\n const files = await fg(globPattern, {\n cwd: root,\n absolute: true,\n dot: false,\n onlyFiles: true,\n ignore: [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\"],\n });\n const out: string[] = [];\n for (const file of files.slice(0, 5000)) {\n try {\n const content = await readFile(file, \"utf8\");\n if (mode === \"files\") {\n if (re.test(content)) out.push(file);\n } else {\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n if (re.test(lines[i]!)) {\n out.push(`${file}:${i + 1}:${lines[i]}`);\n if (out.length > 500) break;\n }\n }\n }\n } catch {\n /* binary or unreadable — skip */\n }\n if (out.length > 500) break;\n }\n return out.length ? truncate(out.join(\"\\n\"), 30_000) : \"(no matches)\";\n}\n","import TurndownService from \"turndown\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { truncate } from \"../util/paths.js\";\n\ninterface Args {\n url: string;\n}\n\nconst MAX_BYTES = 1 * 1024 * 1024;\nconst MAX_OUTPUT = 100_000;\nconst TIMEOUT_MS = 20_000;\n\nexport const webFetchTool: ToolSpec<Args> = {\n name: \"web_fetch\",\n description:\n \"Fetch a URL over HTTPS and return its content. HTML pages are converted to markdown. Output is capped at ~100KB.\",\n parameters: {\n type: \"object\",\n properties: {\n url: { type: \"string\", description: \"Full URL, http(s).\" },\n },\n required: [\"url\"],\n additionalProperties: false,\n },\n needsPermission: false,\n render: (args) => ({ title: `GET ${args.url}` }),\n async run(args) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n const res = await fetch(args.url, {\n redirect: \"follow\",\n signal: controller.signal,\n headers: { \"user-agent\": \"kimiflare/0.1 (+https://github.com/sinameraji/kimiflare)\" },\n });\n const ct = res.headers.get(\"content-type\") ?? \"\";\n const body = await res.text();\n const bounded = body.length > MAX_BYTES ? body.slice(0, MAX_BYTES) : body;\n if (ct.toLowerCase().includes(\"html\")) {\n const td = new TurndownService({ headingStyle: \"atx\", codeBlockStyle: \"fenced\" });\n return truncate(`# ${args.url}\\n\\n${td.turndown(bounded)}`, MAX_OUTPUT);\n }\n return truncate(`# ${args.url}\\n\\n${bounded}`, MAX_OUTPUT);\n } finally {\n clearTimeout(timer);\n }\n },\n};\n","export type TaskStatus = \"pending\" | \"in_progress\" | \"completed\";\n\nexport interface Task {\n id: string;\n title: string;\n status: TaskStatus;\n}\n\nexport function isValidStatus(s: unknown): s is TaskStatus {\n return s === \"pending\" || s === \"in_progress\" || s === \"completed\";\n}\n\nexport function validateTasks(input: unknown): Task[] {\n if (!Array.isArray(input)) throw new Error(\"tasks must be an array\");\n return input.map((t, i) => {\n if (!t || typeof t !== \"object\") throw new Error(`tasks[${i}] must be an object`);\n const rec = t as Record<string, unknown>;\n const id = typeof rec.id === \"string\" && rec.id.length > 0 ? rec.id : String(i + 1);\n const title = typeof rec.title === \"string\" ? rec.title.trim() : \"\";\n if (!title) throw new Error(`tasks[${i}].title is required`);\n const status: TaskStatus = isValidStatus(rec.status) ? rec.status : \"pending\";\n return { id, title, status };\n });\n}\n","import type { ToolSpec } from \"./registry.js\";\nimport { validateTasks, type Task } from \"../tasks-state.js\";\n\ninterface TasksSetArgs {\n tasks: Task[];\n}\n\nexport const tasksSetTool: ToolSpec<TasksSetArgs> = {\n name: \"tasks_set\",\n description: [\n \"Set the visible task list shown to the user during this turn.\",\n \"Call this when the user has given you a multi-step job, or whenever progress changes:\",\n \"at the start (all tasks pending, with exactly one in_progress), and after each step completes\",\n \"(flip that task to completed and the next to in_progress).\",\n \"Pass the ENTIRE task list each call — this replaces the panel.\",\n \"Keep tasks short (one imperative clause). Only one should be in_progress at a time.\",\n \"For quick single-step requests, don't use this tool at all.\",\n ].join(\" \"),\n parameters: {\n type: \"object\",\n properties: {\n tasks: {\n type: \"array\",\n description: \"The full, ordered list of tasks. Pass every call.\",\n items: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Stable short id (e.g. '1', '2').\" },\n title: { type: \"string\", description: \"Short imperative task title.\" },\n status: {\n type: \"string\",\n enum: [\"pending\", \"in_progress\", \"completed\"],\n description: \"Only one task should be 'in_progress' at a time.\",\n },\n },\n required: [\"id\", \"title\", \"status\"],\n },\n },\n },\n required: [\"tasks\"],\n },\n needsPermission: false,\n render: (args) => ({\n title: `tasks (${args.tasks.length} items)`,\n body: args.tasks\n .map((t) => `${t.status === \"completed\" ? \"✓\" : t.status === \"in_progress\" ? \"▸\" : \"·\"} ${t.title}`)\n .join(\"\\n\"),\n }),\n run: async (args, ctx) => {\n let tasks: Task[];\n try {\n tasks = validateTasks(args.tasks);\n } catch (e) {\n return `Error: ${(e as Error).message}`;\n }\n ctx.onTasks?.(tasks);\n const summary = `${tasks.length} tasks set — ${tasks.filter((t) => t.status === \"completed\").length} done, ${tasks.filter((t) => t.status === \"in_progress\").length} active, ${tasks.filter((t) => t.status === \"pending\").length} pending`;\n return summary;\n },\n};\n","import type { ToolSpec, ToolContext } from \"./registry.js\";\nimport { readTool } from \"./read.js\";\nimport { writeTool } from \"./write.js\";\nimport { editTool } from \"./edit.js\";\nimport { bashTool } from \"./bash.js\";\nimport { globTool } from \"./glob.js\";\nimport { grepTool } from \"./grep.js\";\nimport { webFetchTool } from \"./web-fetch.js\";\nimport { tasksSetTool } from \"./tasks.js\";\n\nexport const ALL_TOOLS: ToolSpec[] = [\n readTool,\n writeTool,\n editTool,\n bashTool,\n globTool,\n grepTool,\n webFetchTool,\n tasksSetTool,\n];\n\nexport type PermissionDecision = \"allow\" | \"allow_session\" | \"deny\";\n\nexport interface PermissionRequest {\n tool: ToolSpec;\n args: Record<string, unknown>;\n sessionKey: string;\n}\n\nexport type PermissionAsker = (req: PermissionRequest) => Promise<PermissionDecision>;\n\nexport interface ToolInvocation {\n id: string;\n name: string;\n arguments: string;\n}\n\nexport interface ToolResult {\n tool_call_id: string;\n name: string;\n content: string;\n ok: boolean;\n}\n\nexport class ToolExecutor {\n private sessionAllowed = new Set<string>();\n private tools: Map<string, ToolSpec>;\n\n constructor(tools: ToolSpec[] = ALL_TOOLS) {\n this.tools = new Map(tools.map((t) => [t.name, t]));\n }\n\n list(): ToolSpec[] {\n return [...this.tools.values()];\n }\n\n clearSessionPermissions(): void {\n this.sessionAllowed.clear();\n }\n\n async run(\n call: ToolInvocation,\n askPermission: PermissionAsker,\n ctx: ToolContext,\n ): Promise<ToolResult> {\n const tool = this.tools.get(call.name);\n if (!tool) {\n return {\n tool_call_id: call.id,\n name: call.name,\n content: `Error: unknown tool \"${call.name}\". Valid tools: ${[...this.tools.keys()].join(\", \")}.`,\n ok: false,\n };\n }\n\n let args: Record<string, unknown>;\n try {\n args = call.arguments.trim() ? JSON.parse(call.arguments) : {};\n } catch (e) {\n return {\n tool_call_id: call.id,\n name: call.name,\n content: `Error: invalid JSON arguments for ${call.name}: ${(e as Error).message}. Arguments received: ${truncateForError(call.arguments)}`,\n ok: false,\n };\n }\n\n if (tool.needsPermission) {\n const sessionKey = this.permissionKey(tool, args);\n if (!this.sessionAllowed.has(sessionKey)) {\n const decision = await askPermission({ tool, args, sessionKey });\n if (decision === \"deny\") {\n return {\n tool_call_id: call.id,\n name: call.name,\n content: `Permission denied by user. Do not retry this exact call; ask the user what they want to do differently.`,\n ok: false,\n };\n }\n if (decision === \"allow_session\") this.sessionAllowed.add(sessionKey);\n }\n }\n\n try {\n const content = await tool.run(args as never, ctx);\n return { tool_call_id: call.id, name: call.name, content, ok: true };\n } catch (e) {\n return {\n tool_call_id: call.id,\n name: call.name,\n content: `Error running ${call.name}: ${(e as Error).message ?? String(e)}`,\n ok: false,\n };\n }\n }\n\n private permissionKey(tool: ToolSpec, args: Record<string, unknown>): string {\n if (tool.name === \"bash\" && typeof args.command === \"string\") {\n const firstToken = args.command.trim().split(/\\s+/)[0] ?? \"\";\n return `bash:${firstToken}`;\n }\n return tool.name;\n }\n}\n\nfunction truncateForError(s: string): string {\n return s.length <= 200 ? s : `${s.slice(0, 200)}... [${s.length - 200} more chars]`;\n}\n","import { runKimi } from \"./client.js\";\nimport type { ChatMessage } from \"./messages.js\";\n\nexport interface CompactOpts {\n accountId: string;\n apiToken: string;\n model: string;\n messages: ChatMessage[];\n keepLastTurns?: number;\n signal?: AbortSignal;\n}\n\nexport interface CompactResult {\n summary: string;\n newMessages: ChatMessage[];\n replacedCount: number;\n}\n\nconst SUMMARY_SYSTEM = `You are summarizing a terminal coding session so it can fit back into a short context window. Produce a dense summary that captures:\n- The user's goal(s) and what they've asked for.\n- Files read or modified, with paths.\n- Tools run (bash commands, edits) and the outcome of each.\n- Decisions made and open questions.\n- Any constraints or preferences the user has stated.\n\nDo not include speculation. Do not include chat-style pleasantries. Use short bullet form. Aim for ~400-800 tokens.`;\n\nfunction indexOfNthUserFromEnd(messages: ChatMessage[], n: number): number {\n let seen = 0;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]!.role === \"user\") {\n seen++;\n if (seen === n) return i;\n }\n }\n return -1;\n}\n\nexport async function compactMessages(opts: CompactOpts): Promise<CompactResult> {\n const keep = opts.keepLastTurns ?? 4;\n const messages = opts.messages;\n\n const systemMsg = messages.find((m) => m.role === \"system\");\n if (!systemMsg) throw new Error(\"compact: no system message found\");\n\n const cutoffUserIdx = indexOfNthUserFromEnd(messages, keep);\n const firstKeepIdx = cutoffUserIdx >= 0 ? cutoffUserIdx : messages.length;\n const toSummarize = messages.slice(1, firstKeepIdx);\n const toKeep = messages.slice(firstKeepIdx);\n\n if (toSummarize.length === 0) {\n return { summary: \"\", newMessages: messages, replacedCount: 0 };\n }\n\n const transcript = toSummarize\n .map((m) => {\n if (m.role === \"tool\") {\n const snippet = (m.content ?? \"\").slice(0, 500);\n return `[tool ${m.name ?? \"\"}] ${snippet}`;\n }\n if (m.role === \"assistant\") {\n const calls = m.tool_calls\n ? ` (tool_calls: ${m.tool_calls.map((c) => c.function.name).join(\", \")})`\n : \"\";\n return `[assistant]${calls} ${m.content ?? \"\"}`;\n }\n return `[${m.role}] ${m.content ?? \"\"}`;\n })\n .join(\"\\n\");\n\n let summary = \"\";\n const events = runKimi({\n accountId: opts.accountId,\n apiToken: opts.apiToken,\n model: opts.model,\n messages: [\n { role: \"system\", content: SUMMARY_SYSTEM },\n { role: \"user\", content: `Summarize this session so it can be replaced by your summary:\\n\\n${transcript}` },\n ],\n signal: opts.signal,\n temperature: 0.1,\n reasoningEffort: \"low\",\n });\n for await (const ev of events) {\n if (ev.type === \"text\") summary += ev.delta;\n }\n\n const summaryMsg: ChatMessage = {\n role: \"user\",\n content: `[compacted summary of earlier turns]\\n${summary.trim()}`,\n };\n\n return {\n summary: summary.trim(),\n newMessages: [systemMsg, summaryMsg, ...toKeep],\n replacedCount: toSummarize.length,\n };\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { createTwoFilesPatch } from \"diff\";\n\ninterface Props {\n path: string;\n before: string;\n after: string;\n maxLines?: number;\n}\n\nexport function DiffView({ path, before, after, maxLines = 40 }: Props) {\n const patch = createTwoFilesPatch(path, path, before, after, \"\", \"\", { context: 2 });\n const lines = patch.split(\"\\n\").slice(4); // drop the `Index:` + header block\n const truncated = lines.length > maxLines ? lines.slice(0, maxLines) : lines;\n\n return (\n <Box flexDirection=\"column\">\n {truncated.map((line, i) => <DiffLine key={i} line={line} />)}\n {lines.length > maxLines && (\n <Text color=\"gray\">... ({lines.length - maxLines} more lines)</Text>\n )}\n </Box>\n );\n}\n\nfunction DiffLine({ line }: { line: string }) {\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n return <Text color=\"green\">{line}</Text>;\n }\n if (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n return <Text color=\"red\">{line}</Text>;\n }\n if (line.startsWith(\"@@\")) {\n return <Text color=\"cyan\">{line}</Text>;\n }\n return <Text color=\"gray\">{line}</Text>;\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport Spinner from \"ink-spinner\";\nimport { DiffView } from \"./diff-view.js\";\n\nexport interface ToolEventState {\n id: string;\n name: string;\n args: string;\n status: \"running\" | \"done\" | \"error\";\n result?: string;\n render?: { title: string; body?: string; diff?: { path: string; before: string; after: string } };\n expanded?: boolean;\n}\n\ninterface Props {\n evt: ToolEventState;\n verbose?: boolean;\n}\n\nexport function ToolView({ evt, verbose }: Props) {\n const statusIcon =\n evt.status === \"running\" ? <Spinner type=\"dots\" /> : evt.status === \"error\" ? <Text color=\"red\">✗</Text> : <Text color=\"green\">✓</Text>;\n const title = evt.render?.title ?? `${evt.name}(${compactArgs(evt.args)})`;\n const expand = Boolean(evt.expanded || verbose);\n const lines = evt.result ? evt.result.split(\"\\n\") : [];\n const showLimit = verbose ? 200 : 20;\n\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text>\n {statusIcon} <Text color=\"magenta\">{title}</Text>\n </Text>\n {evt.render?.diff ? (\n <Box marginLeft={2}>\n <DiffView {...evt.render.diff} />\n </Box>\n ) : null}\n {evt.result && expand ? (\n <Box marginLeft={2} flexDirection=\"column\">\n {lines.slice(0, showLimit).map((l, i) => (\n <Text key={i} color=\"gray\">{l}</Text>\n ))}\n {lines.length > showLimit && (\n <Text color=\"gray\">... ({lines.length - showLimit} more lines)</Text>\n )}\n </Box>\n ) : null}\n {evt.result && !expand && evt.status !== \"running\" ? (\n <Text color=\"gray\"> {firstLine(evt.result)}</Text>\n ) : null}\n </Box>\n );\n}\n\nfunction compactArgs(raw: string): string {\n const s = raw.replace(/\\s+/g, \" \");\n return s.length <= 80 ? s : s.slice(0, 80) + \"…\";\n}\n\nfunction firstLine(s: string): string {\n const line = s.split(\"\\n\").find((l) => l.trim().length > 0) ?? \"\";\n return line.length <= 120 ? line : line.slice(0, 120) + \"…\";\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { ToolView, type ToolEventState } from \"./tool-view.js\";\nimport type { Theme } from \"./theme.js\";\n\nexport type ChatEvent =\n | { kind: \"user\"; key: string; text: string }\n | {\n kind: \"assistant\";\n key: string;\n id: number;\n text: string;\n reasoning: string;\n streaming: boolean;\n }\n | ({ kind: \"tool\"; key: string } & ToolEventState)\n | { kind: \"info\"; key: string; text: string }\n | { kind: \"error\"; key: string; text: string };\n\ninterface Props {\n events: ChatEvent[];\n showReasoning: boolean;\n theme: Theme;\n verbose?: boolean;\n}\n\nexport function ChatView({ events, showReasoning, theme, verbose }: Props) {\n return (\n <Box flexDirection=\"column\">\n {events.map((e) => (\n <EventView key={e.key} evt={e} showReasoning={showReasoning} theme={theme} verbose={verbose} />\n ))}\n </Box>\n );\n}\n\nfunction EventView({ evt, showReasoning, theme, verbose }: { evt: ChatEvent; showReasoning: boolean; theme: Theme; verbose?: boolean }) {\n if (evt.kind === \"user\") {\n return (\n <Box marginY={0}>\n <Text color={theme.user}>› </Text>\n <Text>{evt.text}</Text>\n </Box>\n );\n }\n if (evt.kind === \"assistant\") {\n return (\n <Box flexDirection=\"column\" marginY={0}>\n {showReasoning && evt.reasoning ? (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text color={theme.reasoning.color} dimColor={theme.reasoning.dim}>\n ✧ thinking: {evt.reasoning.length > 400 ? evt.reasoning.slice(0, 400) + \"…\" : evt.reasoning}\n </Text>\n </Box>\n ) : null}\n {evt.text ? (\n theme.assistant ? <Text color={theme.assistant}>{evt.text}</Text> : <Text>{evt.text}</Text>\n ) : null}\n </Box>\n );\n }\n if (evt.kind === \"tool\") {\n return <ToolView evt={evt} verbose={verbose} />;\n }\n if (evt.kind === \"info\") {\n return (\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {evt.text}\n </Text>\n );\n }\n return <Text color={theme.error}>! {evt.text}</Text>;\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { Usage } from \"../agent/messages.js\";\nimport type { Theme } from \"./theme.js\";\nimport type { ReasoningEffort } from \"../config.js\";\nimport type { Mode } from \"../mode.js\";\n\ninterface Props {\n model: string;\n usage: Usage | null;\n thinking: boolean;\n hint?: string;\n theme: Theme;\n mode: Mode;\n effort: ReasoningEffort;\n contextLimit: number;\n}\n\nconst PRICE_IN_PER_M = 0.95;\nconst PRICE_IN_CACHED_PER_M = 0.16;\nconst PRICE_OUT_PER_M = 4.0;\n\nexport function StatusBar({ model, usage, thinking, hint, theme, mode, effort, contextLimit }: Props) {\n const parts: string[] = [`model: ${shortModel(model)}`, `effort: ${effort}`];\n if (usage) {\n const cached = usage.prompt_tokens_details?.cached_tokens ?? 0;\n const uncachedIn = usage.prompt_tokens - cached;\n const cost =\n (uncachedIn * PRICE_IN_PER_M) / 1_000_000 +\n (cached * PRICE_IN_CACHED_PER_M) / 1_000_000 +\n (usage.completion_tokens * PRICE_OUT_PER_M) / 1_000_000;\n const pct = Math.round((usage.prompt_tokens / contextLimit) * 100);\n parts.push(\n `in: ${usage.prompt_tokens}${cached ? ` (${cached} cached)` : \"\"}`,\n `out: ${usage.completion_tokens}`,\n `ctx: ${pct}%`,\n `$${cost.toFixed(5)}`,\n );\n }\n if (thinking) parts.push(\"thinking…\");\n if (hint) parts.push(hint);\n\n const modeColor =\n mode === \"plan\" ? theme.modeBadge.plan : mode === \"auto\" ? theme.modeBadge.auto : theme.modeBadge.edit;\n const warn = usage && usage.prompt_tokens / contextLimit >= 0.8;\n\n return (\n <Box>\n <Text color={modeColor} bold>\n [{mode}]\n </Text>\n <Text> </Text>\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {parts.join(\" · \")}\n </Text>\n {warn ? (\n <Text color={theme.warn} bold>\n {\" · \"}/compact recommended\n </Text>\n ) : null}\n </Box>\n );\n}\n\nfunction shortModel(m: string): string {\n const last = m.split(\"/\").at(-1) ?? m;\n return last;\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport type { ToolSpec } from \"../tools/registry.js\";\nimport type { PermissionDecision } from \"../tools/executor.js\";\nimport { DiffView } from \"./diff-view.js\";\nimport type { Theme } from \"./theme.js\";\n\ninterface Props {\n tool: ToolSpec;\n args: Record<string, unknown>;\n onDecide: (decision: PermissionDecision) => void;\n theme: Theme;\n}\n\nexport function PermissionModal({ tool, args, onDecide, theme }: Props) {\n const render = tool.render?.(args);\n const items = [\n { label: \"Allow once\", value: \"allow\" as const },\n { label: \"Allow for this session\", value: \"allow_session\" as const },\n { label: \"Deny\", value: \"deny\" as const },\n ];\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.permission} paddingX={1}>\n <Text color={theme.permission} bold>\n Permission requested\n </Text>\n <Text>\n tool: <Text color={theme.tool}>{tool.name}</Text>\n </Text>\n {render?.title ? <Text>action: {render.title}</Text> : null}\n {render?.diff ? (\n <Box marginTop={1} flexDirection=\"column\">\n <DiffView {...render.diff} />\n </Box>\n ) : (\n <Text color={theme.info.color} dimColor={theme.info.dim}>args: {JSON.stringify(args)}</Text>\n )}\n <Box marginTop={1}>\n <SelectInput items={items} onSelect={(item) => onDecide(item.value)} />\n </Box>\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport type { SessionSummary } from \"../sessions.js\";\nimport type { Theme } from \"./theme.js\";\n\ninterface Props {\n sessions: SessionSummary[];\n onPick: (session: SessionSummary | null) => void;\n theme: Theme;\n}\n\nexport function ResumePicker({ sessions, onPick, theme }: Props) {\n if (sessions.length === 0) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.accent} paddingX={1}>\n <Text color={theme.accent} bold>\n Resume a session\n </Text>\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n No saved sessions yet. Press Enter to dismiss.\n </Text>\n <Box marginTop={1}>\n <SelectInput\n items={[{ label: \"(back)\", value: \"__cancel__\" }]}\n onSelect={() => onPick(null)}\n />\n </Box>\n </Box>\n );\n }\n\n const items = sessions.map((s) => ({\n label: `${formatDate(s.updatedAt)} · ${s.messageCount} msgs · ${s.firstPrompt}`,\n value: s.id,\n }));\n items.push({ label: \"(cancel)\", value: \"__cancel__\" });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.accent} paddingX={1}>\n <Text color={theme.accent} bold>\n Resume a session\n </Text>\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n Arrow keys to select, Enter to confirm.\n </Text>\n <Box marginTop={1}>\n <SelectInput\n items={items}\n onSelect={(item) => {\n if (item.value === \"__cancel__\") return onPick(null);\n const picked = sessions.find((s) => s.id === item.value) ?? null;\n onPick(picked);\n }}\n />\n </Box>\n </Box>\n );\n}\n\nfunction formatDate(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n } catch {\n return iso;\n }\n}\n","import React, { useEffect, useState } from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { Task } from \"../tasks-state.js\";\nimport type { Theme } from \"./theme.js\";\n\ninterface Props {\n tasks: Task[];\n theme: Theme;\n startedAt: number | null;\n tokensDelta: number;\n}\n\nconst MAX_VISIBLE = 6;\n\nexport function TaskList({ tasks, theme, startedAt, tokensDelta }: Props) {\n const [now, setNow] = useState(Date.now());\n\n useEffect(() => {\n if (startedAt === null) return;\n const allDone = tasks.length > 0 && tasks.every((t) => t.status === \"completed\");\n if (allDone) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [startedAt, tasks]);\n\n if (tasks.length === 0) return null;\n\n const active = tasks.find((t) => t.status === \"in_progress\");\n const done = tasks.filter((t) => t.status === \"completed\").length;\n const total = tasks.length;\n const allDone = done === total;\n\n const header = active\n ? active.title\n : allDone\n ? `Done (${total} tasks)`\n : `Tasks (${done}/${total})`;\n\n const elapsed = startedAt ? formatElapsed(now - startedAt) : null;\n const headerStats = [elapsed, tokensDelta > 0 ? `↑ ${formatTokens(tokensDelta)} tokens` : null]\n .filter(Boolean)\n .join(\" · \");\n\n const visibleTasks = tasks.slice(0, MAX_VISIBLE);\n const hiddenPending = Math.max(0, tasks.length - visibleTasks.length);\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={allDone ? \"green\" : theme.accent} bold>\n {allDone ? \"✓\" : \"▸\"} {header}\n </Text>\n {headerStats && (\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {\" \"}({headerStats})\n </Text>\n )}\n </Box>\n {visibleTasks.map((t) => (\n <TaskRow key={t.id} task={t} theme={theme} />\n ))}\n {hiddenPending > 0 && (\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {\" \"}… +{hiddenPending} more\n </Text>\n )}\n </Box>\n );\n}\n\nfunction TaskRow({ task, theme }: { task: Task; theme: Theme }) {\n if (task.status === \"completed\") {\n return (\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {\" \"}✓ <Text strikethrough>{task.title}</Text>\n </Text>\n );\n }\n if (task.status === \"in_progress\") {\n return (\n <Text color={theme.accent} bold>\n {\" \"}■ {task.title}\n </Text>\n );\n }\n return (\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {\" \"}☐ {task.title}\n </Text>\n );\n}\n\nfunction formatElapsed(ms: number): string {\n const total = Math.floor(ms / 1000);\n const m = Math.floor(total / 60);\n const s = total % 60;\n if (m === 0) return `${s}s`;\n return `${m}m ${s}s`;\n}\n\nfunction formatTokens(n: number): string {\n if (n < 1000) return String(n);\n return `${(n / 1000).toFixed(1)}k`;\n}\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport { Text, useInput } from \"ink\";\nimport chalk from \"chalk\";\n\ninterface Props {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (value: string, display?: string) => void;\n onHistoryUp?: () => void;\n onHistoryDown?: () => void;\n onClearQueueItem?: (text: string) => void;\n focus?: boolean;\n mask?: string;\n enablePaste?: boolean;\n}\n\nconst PASTE_CHAR_THRESHOLD = 200;\nconst PASTE_NEWLINE_THRESHOLD = 3;\n\nfunction shouldTreatAsPaste(input: string): boolean {\n if (input.length >= PASTE_CHAR_THRESHOLD) return true;\n const newlines = (input.match(/\\n/g) ?? []).length;\n return newlines >= PASTE_NEWLINE_THRESHOLD;\n}\n\nfunction newPasteId(): string {\n return Math.random().toString(36).slice(2, 7);\n}\n\nfunction countLines(s: string): number {\n return s.split(\"\\n\").length;\n}\n\nfunction findWordBoundaryForward(text: string, pos: number): number {\n while (pos < text.length && /\\w/.test(text[pos]!)) pos++;\n while (pos < text.length && !/\\w/.test(text[pos]!)) pos++;\n return pos;\n}\n\nfunction findWordBoundaryBackward(text: string, pos: number): number {\n while (pos > 0 && !/\\w/.test(text[pos - 1]!)) pos--;\n while (pos > 0 && /\\w/.test(text[pos - 1]!)) pos--;\n return pos;\n}\n\nexport function CustomTextInput({\n value,\n onChange,\n onSubmit,\n onHistoryUp,\n onHistoryDown,\n onClearQueueItem,\n focus = true,\n mask,\n enablePaste = false,\n}: Props) {\n const [cursorOffset, setCursorOffset] = useState(value.length);\n const pastesRef = useRef<Map<string, string>>(new Map());\n\n useEffect(() => {\n if (!focus) return;\n setCursorOffset((prev) => (prev > value.length ? value.length : prev));\n }, [value, focus]);\n\n useInput(\n (input, key) => {\n if (!focus) return;\n\n if (key.ctrl && input === \"c\") return;\n if (key.ctrl && input === \"r\") return;\n if (key.ctrl && input === \"o\") return;\n if (key.tab) return;\n\n if (key.return) {\n let full = value;\n let hasPastes = false;\n if (enablePaste && pastesRef.current.size > 0) {\n for (const [placeholder, fullText] of pastesRef.current) {\n if (full.includes(placeholder)) {\n full = full.split(placeholder).join(fullText);\n hasPastes = true;\n }\n }\n }\n onSubmit(full, hasPastes ? value : undefined);\n pastesRef.current.clear();\n setCursorOffset(0);\n return;\n }\n\n if (key.upArrow) {\n onHistoryUp?.();\n return;\n }\n\n if (key.downArrow) {\n onHistoryDown?.();\n return;\n }\n\n let nextCursor = cursorOffset;\n let nextValue = value;\n let didDelete = false;\n\n if (key.leftArrow) {\n if (key.meta) {\n nextCursor = findWordBoundaryBackward(value, cursorOffset);\n } else {\n nextCursor = cursorOffset - 1;\n }\n } else if (key.rightArrow) {\n if (key.meta) {\n nextCursor = findWordBoundaryForward(value, cursorOffset);\n } else {\n nextCursor = cursorOffset + 1;\n }\n } else if (key.meta && input === \"b\") {\n nextCursor = findWordBoundaryBackward(value, cursorOffset);\n } else if (key.meta && input === \"f\") {\n nextCursor = findWordBoundaryForward(value, cursorOffset);\n } else if (key.meta && input === \"d\") {\n didDelete = true;\n const boundary = findWordBoundaryForward(value, cursorOffset);\n nextValue = value.slice(0, cursorOffset) + value.slice(boundary);\n } else if (key.home || (key.ctrl && input === \"a\")) {\n nextCursor = 0;\n } else if (key.end || (key.ctrl && input === \"e\")) {\n nextCursor = value.length;\n } else if (key.backspace) {\n didDelete = true;\n const tokenBoundary = enablePaste\n ? findPasteTokenEndingAt(value, cursorOffset, pastesRef.current)\n : -1;\n if (tokenBoundary >= 0) {\n const token = value.slice(tokenBoundary, cursorOffset);\n pastesRef.current.delete(token);\n nextValue = value.slice(0, tokenBoundary) + value.slice(cursorOffset);\n nextCursor = tokenBoundary;\n } else if (key.meta || (key.ctrl && input === \"w\")) {\n const boundary = findWordBoundaryBackward(value, cursorOffset);\n nextValue = value.slice(0, boundary) + value.slice(cursorOffset);\n nextCursor = boundary;\n } else if (key.ctrl) {\n const boundary = findWordBoundaryBackward(value, cursorOffset);\n nextValue = value.slice(0, boundary) + value.slice(cursorOffset);\n nextCursor = boundary;\n } else {\n if (cursorOffset > 0) {\n nextValue = value.slice(0, cursorOffset - 1) + value.slice(cursorOffset);\n nextCursor = cursorOffset - 1;\n }\n }\n } else if (key.delete) {\n didDelete = true;\n if (key.meta || key.ctrl) {\n const boundary = findWordBoundaryForward(value, cursorOffset);\n nextValue = value.slice(0, cursorOffset) + value.slice(boundary);\n } else {\n nextValue = value.slice(0, cursorOffset) + value.slice(cursorOffset + 1);\n }\n } else if (key.ctrl && input === \"w\") {\n didDelete = true;\n const boundary = findWordBoundaryBackward(value, cursorOffset);\n nextValue = value.slice(0, boundary) + value.slice(cursorOffset);\n nextCursor = boundary;\n } else if (key.ctrl && input === \"u\") {\n didDelete = true;\n nextValue = value.slice(cursorOffset);\n nextCursor = 0;\n } else if (key.ctrl && input === \"k\") {\n didDelete = true;\n nextValue = value.slice(0, cursorOffset);\n } else if (input.length > 0 && !key.ctrl && !key.meta) {\n let toInsert = input;\n if (enablePaste && shouldTreatAsPaste(input)) {\n const lines = countLines(input);\n const id = newPasteId();\n const placeholder = `[pasted ${lines} line${lines === 1 ? \"\" : \"s\"} #${id}]`;\n pastesRef.current.set(placeholder, input);\n toInsert = placeholder;\n }\n nextValue = value.slice(0, cursorOffset) + toInsert + value.slice(cursorOffset);\n nextCursor = cursorOffset + toInsert.length;\n }\n\n if (nextCursor < 0) nextCursor = 0;\n if (nextCursor > nextValue.length) nextCursor = nextValue.length;\n\n if (didDelete && nextValue === \"\" && value !== \"\") {\n onClearQueueItem?.(value);\n }\n\n if (nextCursor !== cursorOffset) {\n setCursorOffset(nextCursor);\n }\n if (nextValue !== value) {\n onChange(nextValue);\n }\n },\n { isActive: focus },\n );\n\n const displayValue = mask ? mask.repeat(value.length) : value;\n\n let renderedValue = \"\";\n let i = 0;\n for (const char of displayValue) {\n renderedValue += i === cursorOffset ? chalk.inverse(char) : char;\n i++;\n }\n if (displayValue.length === 0) {\n renderedValue = chalk.inverse(\" \");\n } else if (cursorOffset === displayValue.length) {\n renderedValue += chalk.inverse(\" \");\n }\n\n return <Text>{renderedValue}</Text>;\n}\n\nfunction findPasteTokenEndingAt(\n value: string,\n pos: number,\n pastes: Map<string, string>,\n): number {\n if (pos <= 0 || value[pos - 1] !== \"]\") return -1;\n for (const placeholder of pastes.keys()) {\n if (placeholder.length > pos) continue;\n const start = pos - placeholder.length;\n if (value.slice(start, pos) === placeholder) return start;\n }\n return -1;\n}\n","import { readFile, writeFile, mkdir, access } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\nconst NPM_REGISTRY = \"https://registry.npmjs.org/kimiflare/latest\";\n\ninterface CacheEntry {\n checkedAt: number;\n latestVersion: string;\n hasUpdate: boolean;\n}\n\nfunction cachePath(): string {\n const xdg = process.env.XDG_CONFIG_HOME || join(homedir(), \".config\");\n return join(xdg, \"kimiflare\", \"update-check.json\");\n}\n\nfunction localPackageJsonPath(): string {\n // When bundled, __dirname is dist/. Go up one level to find package.json.\n const here = dirname(fileURLToPath(import.meta.url));\n return join(here, \"..\", \"..\", \"package.json\");\n}\n\nasync function readLocalVersion(): Promise<string | null> {\n try {\n const raw = await readFile(localPackageJsonPath(), \"utf8\");\n const parsed = JSON.parse(raw) as { version?: string };\n return parsed.version ?? null;\n } catch {\n return null;\n }\n}\n\nasync function readCache(): Promise<CacheEntry | null> {\n try {\n const raw = await readFile(cachePath(), \"utf8\");\n const parsed = JSON.parse(raw) as CacheEntry;\n if (Date.now() - parsed.checkedAt < CACHE_TTL_MS) {\n return parsed;\n }\n } catch {\n /* cache missing or expired */\n }\n return null;\n}\n\nasync function writeCache(entry: CacheEntry): Promise<void> {\n const p = cachePath();\n await mkdir(dirname(p), { recursive: true });\n await writeFile(p, JSON.stringify(entry), \"utf8\");\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(NPM_REGISTRY, {\n headers: { \"User-Agent\": \"kimiflare-update-checker\", Accept: \"application/json\" },\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nfunction stripV(v: string): string {\n return v.startsWith(\"v\") ? v.slice(1) : v;\n}\n\nfunction isNewer(local: string, remote: string): boolean {\n const a = stripV(local).split(\".\").map(Number);\n const b = stripV(remote).split(\".\").map(Number);\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n if (av < bv) return true;\n if (av > bv) return false;\n }\n return false;\n}\n\nexport interface UpdateCheckResult {\n hasUpdate: boolean;\n localVersion: string | null;\n latestVersion: string | null;\n}\n\nexport async function checkForUpdate(): Promise<UpdateCheckResult> {\n const localVersion = await readLocalVersion();\n if (!localVersion) return { hasUpdate: false, localVersion: null, latestVersion: null };\n\n const cached = await readCache();\n if (cached) {\n return { hasUpdate: cached.hasUpdate, localVersion, latestVersion: cached.latestVersion };\n }\n\n const latestVersion = await fetchLatestVersion();\n if (!latestVersion) {\n return { hasUpdate: false, localVersion, latestVersion: null };\n }\n\n const hasUpdate = isNewer(localVersion, latestVersion);\n await writeCache({ checkedAt: Date.now(), latestVersion, hasUpdate });\n return { hasUpdate, localVersion, latestVersion };\n}\n\nexport async function isGitRepo(): Promise<boolean> {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n await access(join(here, \"..\", \"..\", \".git\"));\n return true;\n } catch {\n return false;\n }\n}\n","import React, { useState } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { CustomTextInput } from \"./text-input.js\";\nimport { saveConfig, DEFAULT_MODEL } from \"../config.js\";\n\ninterface Props {\n onDone: (cfg: { accountId: string; apiToken: string; model: string }) => void;\n}\n\ntype Step = \"accountId\" | \"apiToken\" | \"model\" | \"confirm\";\n\nexport function Onboarding({ onDone }: Props) {\n const [step, setStep] = useState<Step>(\"accountId\");\n const [accountId, setAccountId] = useState(\"\");\n const [apiToken, setApiToken] = useState(\"\");\n const [model, setModel] = useState(DEFAULT_MODEL);\n const [savedPath, setSavedPath] = useState<string | null>(null);\n\n const handleAccountIdSubmit = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) return;\n setAccountId(trimmed);\n setStep(\"apiToken\");\n };\n\n const handleApiTokenSubmit = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) return;\n setApiToken(trimmed);\n setStep(\"model\");\n };\n\n const handleModelSubmit = (value: string) => {\n const trimmed = value.trim() || DEFAULT_MODEL;\n setModel(trimmed);\n setStep(\"confirm\");\n };\n\n const handleConfirm = async () => {\n const cfg = { accountId, apiToken, model };\n try {\n const path = await saveConfig(cfg);\n setSavedPath(path);\n onDone(cfg);\n } catch (e) {\n setSavedPath(`error: ${(e as Error).message}`);\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"cyan\">\n Welcome to kimiflare!\n </Text>\n <Text color=\"gray\" dimColor>\n Terminal coding agent powered by Kimi-K2.6 on Cloudflare Workers AI.\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n {step === \"accountId\" && (\n <>\n <Text>Enter your Cloudflare Account ID:</Text>\n <Box>\n <Text color=\"cyan\">› </Text>\n <CustomTextInput\n value={accountId}\n onChange={setAccountId}\n onSubmit={handleAccountIdSubmit}\n />\n </Box>\n </>\n )}\n\n {step === \"apiToken\" && (\n <>\n <Text>Enter your Cloudflare API Token:</Text>\n <Text color=\"gray\" dimColor>\n Create one at https://dash.cloudflare.com/profile/api-tokens\n </Text>\n <Box>\n <Text color=\"cyan\">› </Text>\n <CustomTextInput\n value={apiToken}\n onChange={setApiToken}\n onSubmit={handleApiTokenSubmit}\n mask=\"•\"\n />\n </Box>\n </>\n )}\n\n {step === \"model\" && (\n <>\n <Text>Model ID (press Enter for default):</Text>\n <Text color=\"gray\" dimColor>\n default: {DEFAULT_MODEL}\n </Text>\n <Box>\n <Text color=\"cyan\">› </Text>\n <CustomTextInput\n value={model}\n onChange={setModel}\n onSubmit={handleModelSubmit}\n />\n </Box>\n </>\n )}\n\n {step === \"confirm\" && (\n <>\n <Text>Ready to save configuration:</Text>\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text color=\"gray\">Account ID: {accountId}</Text>\n <Text color=\"gray\">API Token: {\"•\".repeat(apiToken.length)}</Text>\n <Text color=\"gray\">Model: {model}</Text>\n </Box>\n <Box marginTop={1}>\n <Text>Press Enter to confirm, or Ctrl+C to cancel</Text>\n </Box>\n <Box>\n <Text color=\"cyan\">› </Text>\n <CustomTextInput\n value=\"\"\n onChange={() => {}}\n onSubmit={handleConfirm}\n />\n </Box>\n </>\n )}\n\n {savedPath && (\n <Text color=\"green\">\n Config saved to {savedPath}\n </Text>\n )}\n </Box>\n </Box>\n );\n}\n","export type ColorName = string;\n\nexport interface DimColor {\n color: ColorName;\n dim: boolean;\n}\n\nexport interface Theme {\n name: string;\n label: string;\n user: ColorName;\n assistant: ColorName | undefined;\n reasoning: DimColor;\n info: DimColor;\n error: ColorName;\n warn: ColorName;\n tool: ColorName;\n spinner: ColorName;\n permission: ColorName;\n queue: DimColor;\n accent: ColorName;\n modeBadge: { plan: ColorName; auto: ColorName; edit: ColorName };\n}\n\nconst dark: Theme = {\n name: \"dark\",\n label: \"dark (default — for dark terminals)\",\n user: \"cyan\",\n assistant: undefined,\n reasoning: { color: \"gray\", dim: false },\n info: { color: \"gray\", dim: false },\n error: \"red\",\n warn: \"yellow\",\n tool: \"magenta\",\n spinner: \"yellow\",\n permission: \"yellow\",\n queue: { color: \"gray\", dim: false },\n accent: \"cyan\",\n modeBadge: { plan: \"blue\", auto: \"green\", edit: \"cyan\" },\n};\n\nconst light: Theme = {\n name: \"light\",\n label: \"light (for bright terminal backgrounds)\",\n user: \"blue\",\n assistant: undefined,\n reasoning: { color: \"blackBright\", dim: false },\n info: { color: \"blackBright\", dim: false },\n error: \"red\",\n warn: \"magenta\",\n tool: \"magenta\",\n spinner: \"blue\",\n permission: \"magenta\",\n queue: { color: \"blackBright\", dim: false },\n accent: \"blue\",\n modeBadge: { plan: \"blue\", auto: \"green\", edit: \"magenta\" },\n};\n\nconst highContrast: Theme = {\n name: \"high-contrast\",\n label: \"high-contrast (bold, bright colors for low-vision)\",\n user: \"cyanBright\",\n assistant: \"whiteBright\",\n reasoning: { color: \"whiteBright\", dim: false },\n info: { color: \"whiteBright\", dim: false },\n error: \"redBright\",\n warn: \"yellowBright\",\n tool: \"magentaBright\",\n spinner: \"yellowBright\",\n permission: \"yellowBright\",\n queue: { color: \"whiteBright\", dim: false },\n accent: \"cyanBright\",\n modeBadge: { plan: \"blueBright\", auto: \"greenBright\", edit: \"cyanBright\" },\n};\n\nexport const THEMES: Record<string, Theme> = {\n dark,\n light,\n \"high-contrast\": highContrast,\n};\n\nexport const DEFAULT_THEME_NAME = \"dark\";\n\nexport function resolveTheme(name: string | undefined): Theme {\n if (!name) return THEMES[DEFAULT_THEME_NAME]!;\n return THEMES[name] ?? THEMES[DEFAULT_THEME_NAME]!;\n}\n\nexport function themeNames(): string[] {\n return Object.keys(THEMES);\n}\n","import { readFile, writeFile, mkdir, readdir, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ChatMessage } from \"./agent/messages.js\";\n\nexport interface SessionSummary {\n id: string;\n filePath: string;\n cwd: string;\n firstPrompt: string;\n messageCount: number;\n updatedAt: string;\n}\n\nexport interface SessionFile {\n id: string;\n cwd: string;\n model: string;\n createdAt: string;\n updatedAt: string;\n messages: ChatMessage[];\n}\n\nfunction sessionsDir(): string {\n const xdg = process.env.XDG_DATA_HOME || join(homedir(), \".local\", \"share\");\n return join(xdg, \"kimiflare\", \"sessions\");\n}\n\nfunction sanitize(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 40);\n}\n\nexport function makeSessionId(firstPrompt: string): string {\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n const slug = sanitize(firstPrompt) || \"session\";\n return `${ts}_${slug}`;\n}\n\nexport async function saveSession(file: SessionFile): Promise<string> {\n const dir = sessionsDir();\n await mkdir(dir, { recursive: true });\n const path = join(dir, `${file.id}.json`);\n await writeFile(path, JSON.stringify(file, null, 2), \"utf8\");\n return path;\n}\n\nexport async function listSessions(limit = 30): Promise<SessionSummary[]> {\n const dir = sessionsDir();\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return [];\n }\n\n const summaries: SessionSummary[] = [];\n for (const name of entries) {\n if (!name.endsWith(\".json\")) continue;\n const path = join(dir, name);\n try {\n const [s, raw] = await Promise.all([stat(path), readFile(path, \"utf8\")]);\n const parsed = JSON.parse(raw) as SessionFile;\n const firstUser = parsed.messages.find((m) => m.role === \"user\");\n const firstPrompt =\n typeof firstUser?.content === \"string\" ? firstUser.content : \"(no prompt)\";\n summaries.push({\n id: parsed.id,\n filePath: path,\n cwd: parsed.cwd,\n firstPrompt: firstPrompt.slice(0, 80),\n messageCount: parsed.messages.filter((m) => m.role !== \"system\").length,\n updatedAt: parsed.updatedAt ?? s.mtime.toISOString(),\n });\n } catch {\n /* skip unreadable */\n }\n }\n summaries.sort((a, b) => (b.updatedAt < a.updatedAt ? -1 : 1));\n return summaries.slice(0, limit);\n}\n\nexport async function loadSession(filePath: string): Promise<SessionFile> {\n const raw = await readFile(filePath, \"utf8\");\n return JSON.parse(raw) as SessionFile;\n}\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { Box, Text, useApp, useInput, render } from \"ink\";\nimport Spinner from \"ink-spinner\";\nimport { runAgentTurn } from \"./agent/loop.js\";\nimport { buildSystemPrompt } from \"./agent/system-prompt.js\";\nimport { compactMessages } from \"./agent/compact.js\";\nimport { ToolExecutor, ALL_TOOLS, type PermissionDecision } from \"./tools/executor.js\";\nimport type { ToolSpec } from \"./tools/registry.js\";\nimport type { ChatMessage, Usage } from \"./agent/messages.js\";\nimport { ChatView, type ChatEvent } from \"./ui/chat.js\";\nimport { StatusBar } from \"./ui/status.js\";\nimport { PermissionModal } from \"./ui/permission.js\";\nimport { ResumePicker } from \"./ui/resume-picker.js\";\nimport { TaskList } from \"./ui/task-list.js\";\nimport type { Task } from \"./tasks-state.js\";\nimport type { ToolRender } from \"./tools/registry.js\";\nimport { CustomTextInput } from \"./ui/text-input.js\";\nimport { checkForUpdate, isGitRepo, type UpdateCheckResult } from \"./util/update-check.js\";\nimport { Onboarding } from \"./ui/onboarding.js\";\nimport {\n configPath,\n DEFAULT_MODEL,\n DEFAULT_REASONING_EFFORT,\n saveConfig,\n type ReasoningEffort,\n} from \"./config.js\";\nimport { resolveTheme, themeNames, type Theme } from \"./ui/theme.js\";\nimport { nextMode, type Mode, isBlockedInPlanMode } from \"./mode.js\";\nimport {\n listSessions,\n loadSession,\n makeSessionId,\n saveSession,\n type SessionSummary,\n} from \"./sessions.js\";\nimport { unlink } from \"node:fs/promises\";\n\ninterface Cfg {\n accountId: string;\n apiToken: string;\n model: string;\n theme?: string;\n reasoningEffort?: ReasoningEffort;\n}\n\ninterface PendingPermission {\n tool: ToolSpec;\n args: Record<string, unknown>;\n resolve: (d: PermissionDecision) => void;\n}\n\nconst CONTEXT_LIMIT = 262_000;\nconst AUTO_COMPACT_SUGGEST_PCT = 0.8;\n\nlet nextAssistantId = 1;\nlet nextKey = 1;\nconst mkKey = () => `evt_${nextKey++}`;\n\nconst EFFORT_DESCRIPTIONS: Record<ReasoningEffort, string> = {\n low: \"low — fastest; lightest reasoning. Best for simple Q&A, small edits, quick coordination.\",\n medium: \"medium — balanced (default). Solid quality on most edits, fast on trivial prompts.\",\n high: \"high — deepest reasoning; slowest. Best for complex debugging, architecture, multi-file refactors.\",\n};\n\nfunction App({ initialCfg }: { initialCfg: Cfg | null }) {\n const { exit } = useApp();\n const [cfg, setCfg] = useState<Cfg | null>(initialCfg);\n const [events, setEvents] = useState<ChatEvent[]>([\n { kind: \"info\", key: mkKey(), text: \"kimiflare · /help for commands · ctrl-c to exit · shift+tab to cycle modes\" },\n ]);\n const [input, setInput] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [usage, setUsage] = useState<Usage | null>(null);\n const [showReasoning, setShowReasoning] = useState(false);\n const [perm, setPerm] = useState<PendingPermission | null>(null);\n const [queue, setQueue] = useState<Array<{ full: string; display: string }>>([]);\n const [history, setHistory] = useState<string[]>([]);\n const [historyIndex, setHistoryIndex] = useState(-1);\n const [draftInput, setDraftInput] = useState(\"\");\n const [updateInfo, setUpdateInfo] = useState<UpdateCheckResult | null>(null);\n const [mode, setMode] = useState<Mode>(\"edit\");\n const [effort, setEffort] = useState<ReasoningEffort>(\n initialCfg?.reasoningEffort ?? DEFAULT_REASONING_EFFORT,\n );\n const [theme, setTheme] = useState<Theme>(resolveTheme(initialCfg?.theme));\n const [resumeSessions, setResumeSessions] = useState<SessionSummary[] | null>(null);\n const [tasks, setTasks] = useState<Task[]>([]);\n const [tasksStartedAt, setTasksStartedAt] = useState<number | null>(null);\n const [tasksStartTokens, setTasksStartTokens] = useState<number>(0);\n const [verbose, setVerbose] = useState(false);\n\n const messagesRef = useRef<ChatMessage[]>([\n {\n role: \"system\",\n content: buildSystemPrompt({\n cwd: process.cwd(),\n tools: ALL_TOOLS,\n model: cfg?.model ?? DEFAULT_MODEL,\n mode: \"edit\",\n }),\n },\n ]);\n const executorRef = useRef<ToolExecutor>(new ToolExecutor(ALL_TOOLS));\n const activeAsstIdRef = useRef<number | null>(null);\n const activeControllerRef = useRef<AbortController | null>(null);\n const sessionIdRef = useRef<string | null>(null);\n const modeRef = useRef<Mode>(mode);\n const effortRef = useRef<ReasoningEffort>(effort);\n\n useEffect(() => {\n modeRef.current = mode;\n messagesRef.current[0] = {\n role: \"system\",\n content: buildSystemPrompt({\n cwd: process.cwd(),\n tools: ALL_TOOLS,\n model: cfg?.model ?? DEFAULT_MODEL,\n mode,\n }),\n };\n if (mode === \"plan\") {\n executorRef.current.clearSessionPermissions();\n }\n }, [mode, cfg?.model]);\n\n useEffect(() => {\n effortRef.current = effort;\n }, [effort]);\n\n const saveSessionSafe = useCallback(async () => {\n if (!cfg) return;\n if (!sessionIdRef.current) {\n const firstUser = messagesRef.current.find((m) => m.role === \"user\");\n const firstText =\n typeof firstUser?.content === \"string\" ? firstUser.content : \"session\";\n sessionIdRef.current = makeSessionId(firstText);\n }\n try {\n await saveSession({\n id: sessionIdRef.current,\n cwd: process.cwd(),\n model: cfg.model,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n messages: messagesRef.current,\n });\n } catch {\n /* non-fatal */\n }\n }, [cfg]);\n\n useInput((inputChar, key) => {\n if (key.ctrl && inputChar === \"c\") {\n if (busy && activeControllerRef.current) {\n activeControllerRef.current.abort();\n setQueue([]);\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"(interrupted)\" }]);\n } else {\n exit();\n }\n return;\n }\n if (key.ctrl && inputChar === \"r\") {\n setShowReasoning((s) => !s);\n return;\n }\n if (key.shift && key.tab) {\n setMode((m) => {\n const nm = nextMode(m);\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `mode: ${nm}` },\n ]);\n return nm;\n });\n return;\n }\n if (key.ctrl && inputChar === \"o\") {\n setVerbose((v) => {\n const next = !v;\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `output: ${next ? \"verbose (full tool results)\" : \"compact\"}` },\n ]);\n return next;\n });\n return;\n }\n });\n\n const updateAssistant = useCallback(\n (id: number, patch: (e: Extract<ChatEvent, { kind: \"assistant\" }>) => Partial<ChatEvent>) => {\n setEvents((evts) =>\n evts.map((e) =>\n e.kind === \"assistant\" && e.id === id ? ({ ...e, ...patch(e) } as ChatEvent) : e,\n ),\n );\n },\n [],\n );\n\n const updateTool = useCallback(\n (id: string, patch: Partial<Extract<ChatEvent, { kind: \"tool\" }>>) => {\n setEvents((evts) =>\n evts.map((e) =>\n e.kind === \"tool\" && e.id === id ? ({ ...e, ...patch } as ChatEvent) : e,\n ),\n );\n },\n [],\n );\n\n const runCompact = useCallback(async () => {\n if (!cfg) return;\n if (busy) {\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"can't compact while model is running\" }]);\n return;\n }\n setBusy(true);\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"compacting conversation…\" }]);\n const controller = new AbortController();\n activeControllerRef.current = controller;\n try {\n const result = await compactMessages({\n accountId: cfg.accountId,\n apiToken: cfg.apiToken,\n model: cfg.model,\n messages: messagesRef.current,\n signal: controller.signal,\n });\n if (result.replacedCount === 0) {\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: \"nothing to compact yet\" },\n ]);\n } else {\n messagesRef.current = result.newMessages;\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `compacted ${result.replacedCount} messages into a summary`,\n },\n ]);\n await saveSessionSafe();\n }\n } catch (e) {\n if ((e as Error).name !== \"AbortError\") {\n setEvents((es) => [\n ...es,\n { kind: \"error\", key: mkKey(), text: `compact failed: ${(e as Error).message}` },\n ]);\n }\n } finally {\n setBusy(false);\n activeControllerRef.current = null;\n }\n }, [cfg, busy, saveSessionSafe]);\n\n const openResumePicker = useCallback(async () => {\n const sessions = await listSessions(30);\n setResumeSessions(sessions);\n }, []);\n\n const handleResumePick = useCallback(\n async (picked: SessionSummary | null) => {\n setResumeSessions(null);\n if (!picked) return;\n try {\n const file = await loadSession(picked.filePath);\n messagesRef.current = file.messages;\n sessionIdRef.current = file.id;\n setEvents([\n {\n kind: \"info\",\n key: mkKey(),\n text: `resumed session ${picked.id} (${picked.messageCount} msgs)`,\n },\n ]);\n const userMsgs = file.messages\n .filter((m) => m.role === \"user\" && typeof m.content === \"string\")\n .map((m) => m.content as string);\n if (userMsgs.length > 0) setHistory(userMsgs);\n setUsage(null);\n } catch (e) {\n setEvents((es) => [\n ...es,\n { kind: \"error\", key: mkKey(), text: `failed to load session: ${(e as Error).message}` },\n ]);\n }\n },\n [],\n );\n\n const handleSlash = useCallback(\n (cmd: string): boolean => {\n const raw = cmd.trim();\n const [head, ...rest] = raw.split(/\\s+/);\n const c = (head ?? \"\").toLowerCase();\n const arg = rest.join(\" \").trim().toLowerCase();\n\n if (c === \"/exit\" || c === \"/quit\") {\n exit();\n return true;\n }\n if (c === \"/clear\") {\n messagesRef.current = [messagesRef.current[0]!];\n sessionIdRef.current = null;\n setEvents([{ kind: \"info\", key: mkKey(), text: \"conversation cleared\" }]);\n setUsage(null);\n setTasks([]);\n setTasksStartedAt(null);\n setTasksStartTokens(0);\n return true;\n }\n if (c === \"/reasoning\") {\n setShowReasoning((s) => {\n const next = !s;\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `reasoning: ${next ? \"shown\" : \"hidden\"}` },\n ]);\n return next;\n });\n return true;\n }\n if (c === \"/cost\") {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: usage\n ? `prompt ${usage.prompt_tokens} / completion ${usage.completion_tokens}`\n : \"no usage yet\",\n },\n ]);\n return true;\n }\n if (c === \"/model\") {\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `current model: ${cfg?.model ?? \"unknown\"}` },\n ]);\n return true;\n }\n if (c === \"/thinking\" || c === \"/effort\") {\n if (!arg) {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `current: ${effort} · ${EFFORT_DESCRIPTIONS[effort]}\\nuse: /thinking low | medium | high`,\n },\n ]);\n return true;\n }\n if (arg === \"low\" || arg === \"medium\" || arg === \"high\") {\n setEffort(arg);\n if (cfg) void saveConfig({ ...cfg, reasoningEffort: arg }).catch(() => {});\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `thinking: ${arg} · ${EFFORT_DESCRIPTIONS[arg]}`,\n },\n ]);\n return true;\n }\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: \"usage: /thinking low | medium | high\" },\n ]);\n return true;\n }\n if (c === \"/theme\") {\n if (!arg) {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `current: ${theme.name} · available: ${themeNames().join(\", \")}`,\n },\n ]);\n return true;\n }\n const next = resolveTheme(arg);\n if (next.name !== arg) {\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `unknown theme \"${arg}\" — available: ${themeNames().join(\", \")}` },\n ]);\n return true;\n }\n setTheme(next);\n setCfg((c) => (c ? { ...c, theme: next.name } : c));\n if (cfg) void saveConfig({ ...cfg, theme: next.name }).catch(() => {});\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `theme: ${next.label}` },\n ]);\n return true;\n }\n if (c === \"/mode\") {\n if (!arg) {\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `current mode: ${mode} · use /mode edit|plan|auto or shift+tab` },\n ]);\n return true;\n }\n if (arg === \"edit\" || arg === \"plan\" || arg === \"auto\") {\n setMode(arg);\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `mode: ${arg}` },\n ]);\n return true;\n }\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: \"usage: /mode edit|plan|auto\" },\n ]);\n return true;\n }\n if (c === \"/plan\") {\n setMode(\"plan\");\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"mode: plan\" }]);\n return true;\n }\n if (c === \"/auto\") {\n setMode(\"auto\");\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"mode: auto\" }]);\n return true;\n }\n if (c === \"/edit\") {\n setMode(\"edit\");\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"mode: edit\" }]);\n return true;\n }\n if (c === \"/resume\") {\n void openResumePicker();\n return true;\n }\n if (c === \"/compact\") {\n void runCompact();\n return true;\n }\n if (c === \"/update\") {\n if (updateInfo?.hasUpdate) {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `updating from ${updateInfo.localVersion} → ${updateInfo.latestVersion}…`,\n },\n ]);\n isGitRepo().then((git) => {\n if (git) {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: \"run: git pull && npm install && npm run build then restart kimiflare\",\n },\n ]);\n } else {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: \"run: npm update -g kimiflare then restart\",\n },\n ]);\n }\n });\n } else {\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: \"no update available\" },\n ]);\n }\n return true;\n }\n if (c === \"/logout\") {\n unlink(configPath()).catch(() => {});\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `credentials cleared from ${configPath()}` },\n ]);\n setCfg(null);\n return true;\n }\n if (c === \"/help\") {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text:\n \"commands:\\n\" +\n \" /mode edit|plan|auto switch mode (or shift+tab to cycle)\\n\" +\n \" /plan /auto /edit shortcuts for /mode\\n\" +\n \" /thinking low|med|high set reasoning effort (quality vs speed)\\n\" +\n \" /theme NAME dark, light, high-contrast\\n\" +\n \" /resume pick a past conversation\\n\" +\n \" /compact summarize old turns to free context\\n\" +\n \" /reasoning toggle show/hide model reasoning\\n\" +\n \" /clear clear current conversation\\n\" +\n \" /cost /model /update /logout /help /exit\\n\" +\n \"keys: ctrl-c interrupt/exit · ctrl-r toggle reasoning · ctrl-o toggle verbose output · shift+tab cycle mode · ↑/↓ history\",\n },\n ]);\n return true;\n }\n return false;\n },\n [cfg, exit, usage, updateInfo, effort, theme, mode, openResumePicker, runCompact],\n );\n\n const processMessage = useCallback(\n async (text: string, displayText?: string) => {\n if (!cfg) return;\n const trimmed = text.trim();\n if (!trimmed) return;\n\n if (trimmed.startsWith(\"/\") && handleSlash(trimmed)) return;\n\n const display = displayText?.trim() || trimmed;\n setEvents((e) => [...e, { kind: \"user\", key: mkKey(), text: display }]);\n messagesRef.current.push({ role: \"user\", content: trimmed });\n setBusy(true);\n\n const controller = new AbortController();\n activeControllerRef.current = controller;\n\n try {\n await runAgentTurn({\n accountId: cfg.accountId,\n apiToken: cfg.apiToken,\n model: cfg.model,\n messages: messagesRef.current,\n tools: ALL_TOOLS,\n executor: executorRef.current,\n cwd: process.cwd(),\n signal: controller.signal,\n reasoningEffort: effortRef.current,\n callbacks: {\n onAssistantStart: () => {\n const id = nextAssistantId++;\n activeAsstIdRef.current = id;\n setEvents((e) => [\n ...e,\n { kind: \"assistant\", key: `asst_${id}`, id, text: \"\", reasoning: \"\", streaming: true },\n ]);\n },\n onReasoningDelta: (d) => {\n const id = activeAsstIdRef.current;\n if (id !== null) updateAssistant(id, (e) => ({ reasoning: e.reasoning + d }));\n },\n onTextDelta: (d) => {\n const id = activeAsstIdRef.current;\n if (id !== null) updateAssistant(id, (e) => ({ text: e.text + d }));\n },\n onAssistantFinal: () => {\n const id = activeAsstIdRef.current;\n if (id !== null) updateAssistant(id, () => ({ streaming: false }));\n },\n onToolCallFinalized: (call) => {\n const spec = executorRef.current.list().find((t) => t.name === call.function.name);\n let renderMeta: ToolRender | undefined;\n try {\n const args = call.function.arguments ? JSON.parse(call.function.arguments) : {};\n renderMeta = spec?.render?.(args);\n } catch {\n /* ignore render failure */\n }\n setEvents((e) => [\n ...e,\n {\n kind: \"tool\",\n key: `tool_${call.id}`,\n id: call.id,\n name: call.function.name,\n args: call.function.arguments,\n status: \"running\",\n render: renderMeta,\n expanded: false,\n },\n ]);\n },\n onToolResult: (r) => {\n updateTool(r.tool_call_id, {\n status: r.ok ? \"done\" : \"error\",\n result: r.content,\n });\n },\n onUsage: (u) => setUsage(u),\n onTasks: (nextTasks) => {\n setTasks((prev) => {\n if (prev.length === 0 && nextTasks.length > 0) {\n setTasksStartedAt(Date.now());\n setTasksStartTokens(usage?.prompt_tokens ?? 0);\n }\n if (nextTasks.length === 0) {\n setTasksStartedAt(null);\n setTasksStartTokens(0);\n }\n return nextTasks;\n });\n },\n askPermission: (req) =>\n new Promise<PermissionDecision>((resolve) => {\n if (modeRef.current === \"auto\") {\n resolve(\"allow\");\n return;\n }\n if (modeRef.current === \"plan\" && isBlockedInPlanMode(req.tool.name)) {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `plan mode blocked ${req.tool.name}; exit plan mode to execute`,\n },\n ]);\n resolve(\"deny\");\n return;\n }\n setPerm({ tool: req.tool, args: req.args, resolve });\n }),\n },\n });\n await saveSessionSafe();\n } catch (e) {\n if ((e as Error).name === \"AbortError\") {\n setEvents((es) => [...es, { kind: \"info\", key: mkKey(), text: \"(aborted)\" }]);\n } else {\n setEvents((es) => [\n ...es,\n { kind: \"error\", key: mkKey(), text: (e as Error).message ?? String(e) },\n ]);\n }\n } finally {\n setBusy(false);\n activeAsstIdRef.current = null;\n activeControllerRef.current = null;\n }\n },\n [cfg, handleSlash, updateAssistant, updateTool, saveSessionSafe],\n );\n\n useEffect(() => {\n if (!busy && queue.length > 0) {\n const next = queue[0]!;\n setQueue((q) => q.slice(1));\n processMessage(next.full, next.display);\n }\n }, [busy, queue, processMessage]);\n\n const submit = useCallback(\n (full: string, display?: string) => {\n const trimmedFull = full.trim();\n if (!trimmedFull) return;\n const trimmedDisplay = (display ?? full).trim() || trimmedFull;\n\n const historyEntry = trimmedDisplay;\n\n if (busy) {\n setQueue((q) => [...q, { full: trimmedFull, display: trimmedDisplay }]);\n setHistory((h) => (h.length > 0 && h[h.length - 1] === historyEntry ? h : [...h, historyEntry]));\n setInput(\"\");\n setHistoryIndex(-1);\n return;\n }\n\n setHistory((h) => (h.length > 0 && h[h.length - 1] === historyEntry ? h : [...h, historyEntry]));\n setInput(\"\");\n setHistoryIndex(-1);\n processMessage(trimmedFull, trimmedDisplay !== trimmedFull ? trimmedDisplay : undefined);\n },\n [busy, processMessage],\n );\n\n useEffect(() => {\n checkForUpdate().then((result) => {\n if (result.hasUpdate) {\n setUpdateInfo(result);\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `update available: ${result.localVersion} → ${result.latestVersion} · run /update to upgrade`,\n },\n ]);\n }\n });\n }, []);\n\n useEffect(() => {\n if (usage && usage.prompt_tokens / CONTEXT_LIMIT >= AUTO_COMPACT_SUGGEST_PCT) {\n setEvents((e) => {\n const last = e[e.length - 1];\n if (last?.kind === \"info\" && last.text.startsWith(\"context \")) return e;\n return [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `context ${Math.round((usage.prompt_tokens / CONTEXT_LIMIT) * 100)}% full — run /compact to summarize older turns`,\n },\n ];\n });\n }\n }, [usage]);\n\n if (!cfg) {\n return (\n <Onboarding\n onDone={(newCfg) => {\n setCfg(newCfg);\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: \"configuration saved — welcome to kimiflare!\" },\n ]);\n }}\n />\n );\n }\n\n if (resumeSessions !== null) {\n return (\n <Box flexDirection=\"column\">\n <ResumePicker sessions={resumeSessions} onPick={handleResumePick} theme={theme} />\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <ChatView events={events} showReasoning={showReasoning} theme={theme} verbose={verbose} />\n {perm ? (\n <PermissionModal\n tool={perm.tool}\n args={perm.args}\n theme={theme}\n onDecide={(d) => {\n perm.resolve(d);\n setPerm(null);\n }}\n />\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {tasks.length > 0 && (\n <TaskList\n tasks={tasks}\n theme={theme}\n startedAt={tasksStartedAt}\n tokensDelta={Math.max(0, (usage?.prompt_tokens ?? 0) - tasksStartTokens)}\n />\n )}\n {queue.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {queue.map((q, i) => (\n <Text key={`queue_${i}`} color={theme.queue.color} dimColor={theme.queue.dim}>\n ⏳ {q.display}\n </Text>\n ))}\n </Box>\n )}\n <StatusBar\n model={cfg.model}\n usage={usage}\n thinking={busy}\n hint={busy ? \"ctrl-c to interrupt · type to queue next\" : \"enter to send · /help · shift+tab cycles mode\"}\n theme={theme}\n mode={mode}\n effort={effort}\n contextLimit={CONTEXT_LIMIT}\n />\n {busy && (\n <Box>\n <Text color={theme.spinner}>\n <Spinner type=\"dots\" />\n </Text>\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {\" working…\"}\n </Text>\n </Box>\n )}\n <Box>\n <Text color={theme.user}>{busy ? \"⏳ \" : \"› \"}</Text>\n <CustomTextInput\n value={input}\n onChange={setInput}\n onSubmit={submit}\n enablePaste\n onHistoryUp={() => {\n if (history.length === 0) return;\n if (historyIndex === -1) {\n setDraftInput(input);\n const nextIndex = history.length - 1;\n setHistoryIndex(nextIndex);\n setInput(history[nextIndex]!);\n } else {\n const nextIndex = Math.max(0, historyIndex - 1);\n setHistoryIndex(nextIndex);\n setInput(history[nextIndex]!);\n }\n }}\n onHistoryDown={() => {\n if (historyIndex === -1) return;\n const nextIndex = historyIndex + 1;\n if (nextIndex >= history.length) {\n setHistoryIndex(-1);\n setInput(draftInput);\n } else {\n setHistoryIndex(nextIndex);\n setInput(history[nextIndex]!);\n }\n }}\n onClearQueueItem={(text) => {\n setQueue((q) => {\n const idx = q.findIndex((item) => item.display === text);\n if (idx >= 0) {\n const next = [...q];\n next.splice(idx, 1);\n return next;\n }\n return q;\n });\n }}\n />\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n\nexport async function renderApp(cfg: Cfg | null) {\n const instance = render(<App initialCfg={cfg} />);\n await instance.waitUntilExit();\n}\n","import { Command } from \"commander\";\nimport { loadConfig, DEFAULT_MODEL } from \"./config.js\";\nimport { runAgentTurn } from \"./agent/loop.js\";\nimport { buildSystemPrompt } from \"./agent/system-prompt.js\";\nimport { ToolExecutor, ALL_TOOLS } from \"./tools/executor.js\";\nimport type { ChatMessage } from \"./agent/messages.js\";\n\nconst program = new Command();\nprogram\n .name(\"kimiflare\")\n .description(\"Terminal coding agent powered by Kimi-K2.6 on Cloudflare Workers AI.\")\n .version(\"0.1.0\")\n .option(\"-p, --print <prompt>\", \"one-shot mode: send prompt, stream reply to stdout, exit\")\n .option(\"-m, --model <id>\", \"model id (defaults to @cf/moonshotai/kimi-k2.6)\")\n .option(\"--dangerously-allow-all\", \"auto-approve every permission prompt (print mode only)\")\n .option(\"--reasoning\", \"include reasoning in stdout (print mode only)\")\n .parse();\n\nconst opts = program.opts<{\n print?: string;\n model?: string;\n dangerouslyAllowAll?: boolean;\n reasoning?: boolean;\n}>();\n\nasync function main() {\n const cfg = await loadConfig();\n\n if (opts.print !== undefined) {\n if (!cfg) {\n console.error(\n \"kimiflare: missing credentials.\\n\" +\n \"Set CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN, or write them to\\n\" +\n \" ~/.config/kimiflare/config.json (chmod 600)\\n\" +\n \" { \\\"accountId\\\": \\\"...\\\", \\\"apiToken\\\": \\\"...\\\", \\\"model\\\": \\\"@cf/moonshotai/kimi-k2.6\\\" }\",\n );\n process.exit(2);\n }\n const model = opts.model ?? cfg.model ?? DEFAULT_MODEL;\n await runPrintMode({\n ...cfg,\n model,\n prompt: opts.print,\n allowAll: !!opts.dangerouslyAllowAll,\n showReasoning: !!opts.reasoning,\n });\n return;\n }\n\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.error(\n \"kimiflare: interactive mode requires a TTY. Use `kimiflare -p \\\"...\\\"` for non-TTY / piped usage.\",\n );\n process.exit(2);\n }\n\n const { renderApp } = await import(\"./app.js\");\n if (cfg) {\n const model = opts.model ?? cfg.model ?? DEFAULT_MODEL;\n await renderApp({ ...cfg, model });\n } else {\n await renderApp(null);\n }\n}\n\ninterface PrintOpts {\n accountId: string;\n apiToken: string;\n model: string;\n prompt: string;\n allowAll: boolean;\n showReasoning: boolean;\n}\n\nasync function runPrintMode(opts: PrintOpts): Promise<void> {\n const cwd = process.cwd();\n const executor = new ToolExecutor(ALL_TOOLS);\n const messages: ChatMessage[] = [\n { role: \"system\", content: buildSystemPrompt({ cwd, tools: ALL_TOOLS, model: opts.model }) },\n { role: \"user\", content: opts.prompt },\n ];\n\n const controller = new AbortController();\n process.on(\"SIGINT\", () => controller.abort());\n\n let printedReasoningHeader = false;\n let printedAnswerHeader = false;\n\n await runAgentTurn({\n accountId: opts.accountId,\n apiToken: opts.apiToken,\n model: opts.model,\n messages,\n tools: ALL_TOOLS,\n executor,\n cwd,\n signal: controller.signal,\n callbacks: {\n onReasoningDelta: opts.showReasoning\n ? (delta) => {\n if (!printedReasoningHeader) {\n process.stderr.write(\"\\x1b[2m--- reasoning ---\\n\");\n printedReasoningHeader = true;\n }\n process.stderr.write(delta);\n }\n : undefined,\n onTextDelta: (delta) => {\n if (opts.showReasoning && printedReasoningHeader && !printedAnswerHeader) {\n process.stderr.write(\"\\n--- answer ---\\x1b[0m\\n\");\n printedAnswerHeader = true;\n }\n process.stdout.write(delta);\n },\n onToolCallFinalized: (call) => {\n process.stderr.write(`\\x1b[2m[tool ${call.function.name}(${call.function.arguments})]\\x1b[0m\\n`);\n },\n onToolResult: (result) => {\n const snippet =\n result.content.length > 400 ? result.content.slice(0, 400) + \"...\" : result.content;\n process.stderr.write(`\\x1b[2m[result: ${snippet.replace(/\\n/g, \" ⏎ \")}]\\x1b[0m\\n`);\n },\n askPermission: async ({ tool, args }) => {\n if (opts.allowAll) return \"allow\";\n process.stderr.write(\n `\\x1b[31m[permission denied: ${tool.name}(${JSON.stringify(args)}) — pass --dangerously-allow-all to approve in print mode]\\x1b[0m\\n`,\n );\n return \"deny\";\n },\n },\n });\n\n process.stdout.write(\"\\n\");\n}\n\nmain().catch((e) => {\n console.error(`kimiflare: ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n});\n"],"mappings":"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","names":["opts","resolve","opts","homedir","opts","homedir","readFile","mkdir","readFile","writeFile","readFile","writeFile","resolve","readFile","fg","MAX_BYTES","opts","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","render","Box","Text","SelectInput","jsx","jsxs","Box","Text","jsx","jsxs","allDone","process","styles","chalk","useState","useEffect","Text","jsx","readFile","writeFile","mkdir","homedir","join","dirname","useState","Box","Text","jsx","jsxs","readFile","writeFile","mkdir","stat","homedir","join","useState","useRef","useEffect","Box","Text","useInput","Spinner","jsx","jsxs","c","resolve","renderApp","opts"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/util/sse.ts","../src/util/errors.ts","../src/agent/client.ts","../src/tools/registry.ts","../src/agent/loop.ts","../src/mode.ts","../src/agent/system-prompt.ts","../src/util/paths.ts","../src/tools/read.ts","../src/tools/write.ts","../src/tools/edit.ts","../src/tools/bash.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/web-fetch.ts","../src/tasks-state.ts","../src/tools/tasks.ts","../src/tools/executor.ts","../src/agent/compact.ts","../src/ui/diff-view.tsx","../src/ui/tool-view.tsx","../src/ui/markdown.tsx","../src/ui/chat.tsx","../src/ui/status.tsx","../src/ui/permission.tsx","../src/ui/resume-picker.tsx","../src/ui/task-list.tsx","../node_modules/chalk/source/vendor/ansi-styles/index.js","../node_modules/chalk/source/vendor/supports-color/index.js","../node_modules/chalk/source/utilities.js","../node_modules/chalk/source/index.js","../src/ui/text-input.tsx","../src/util/update-check.ts","../src/ui/onboarding.tsx","../src/ui/theme.ts","../src/sessions.ts","../src/app.tsx","../src/index.tsx"],"sourcesContent":["import { readFile, mkdir, writeFile, chmod } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport type ReasoningEffort = \"low\" | \"medium\" | \"high\";\n\nexport interface KimiConfig {\n accountId: string;\n apiToken: string;\n model: string;\n theme?: string;\n reasoningEffort?: ReasoningEffort;\n}\n\nexport const DEFAULT_MODEL = \"@cf/moonshotai/kimi-k2.6\";\nexport const DEFAULT_REASONING_EFFORT: ReasoningEffort = \"medium\";\n\nexport function configPath(): string {\n const xdg = process.env.XDG_CONFIG_HOME || join(homedir(), \".config\");\n return join(xdg, \"kimiflare\", \"config.json\");\n}\n\nfunction readReasoningEffortEnv(): ReasoningEffort | undefined {\n const raw = process.env.KIMI_REASONING_EFFORT?.toLowerCase();\n if (raw === \"low\" || raw === \"medium\" || raw === \"high\") return raw;\n return undefined;\n}\n\nexport async function loadConfig(): Promise<KimiConfig | null> {\n const envAccount = process.env.CLOUDFLARE_ACCOUNT_ID ?? process.env.CF_ACCOUNT_ID;\n const envToken = process.env.CLOUDFLARE_API_TOKEN ?? process.env.CF_API_TOKEN;\n const envModel = process.env.KIMI_MODEL ?? DEFAULT_MODEL;\n const envEffort = readReasoningEffortEnv();\n const envTheme = process.env.KIMI_THEME;\n\n if (envAccount && envToken) {\n return {\n accountId: envAccount,\n apiToken: envToken,\n model: envModel,\n theme: envTheme,\n reasoningEffort: envEffort,\n };\n }\n\n try {\n const raw = await readFile(configPath(), \"utf8\");\n const parsed = JSON.parse(raw) as Partial<KimiConfig>;\n if (parsed.accountId && parsed.apiToken) {\n return {\n accountId: envAccount ?? parsed.accountId,\n apiToken: envToken ?? parsed.apiToken,\n model: envModel ?? parsed.model ?? DEFAULT_MODEL,\n theme: envTheme ?? parsed.theme,\n reasoningEffort: envEffort ?? parsed.reasoningEffort,\n };\n }\n } catch {\n /* no config file */\n }\n return null;\n}\n\nexport async function saveConfig(cfg: KimiConfig): Promise<string> {\n const p = configPath();\n await mkdir(join(p, \"..\"), { recursive: true });\n await writeFile(p, JSON.stringify(cfg, null, 2), \"utf8\");\n await chmod(p, 0o600);\n return p;\n}\n","// Minimal SSE reader that yields the payload of each `data:` event.\n// Handles:\n// - line splits across chunk boundaries\n// - multi-line data (rfc says concatenate with \\n)\n// - CRLF or LF line endings\n// - events that don't start with `data:` (ignored)\n// Does NOT handle retry / event-id / named events — we don't need them.\n\nexport async function* readSSE(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<string, void, void> {\n const reader = stream.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n try {\n while (true) {\n if (signal?.aborted) throw new DOMException(\"aborted\", \"AbortError\");\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n buffer = buffer.replace(/\\r\\n/g, \"\\n\");\n\n let sep: number;\n while ((sep = buffer.indexOf(\"\\n\\n\")) !== -1) {\n const event = buffer.slice(0, sep);\n buffer = buffer.slice(sep + 2);\n const data = extractData(event);\n if (data !== null) yield data;\n }\n }\n // Flush any final event without a trailing blank line.\n buffer += decoder.decode();\n const tail = extractData(buffer.trim());\n if (tail !== null) yield tail;\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction extractData(event: string): string | null {\n if (!event) return null;\n const parts: string[] = [];\n for (const raw of event.split(\"\\n\")) {\n if (!raw.startsWith(\"data:\")) continue;\n // SSE allows an optional single space after the colon.\n parts.push(raw.slice(5).replace(/^ /, \"\"));\n }\n return parts.length ? parts.join(\"\\n\") : null;\n}\n","export class KimiApiError extends Error {\n constructor(\n message: string,\n public readonly code?: number,\n public readonly httpStatus?: number,\n ) {\n super(message);\n this.name = \"KimiApiError\";\n }\n}\n\nexport class PermissionDeniedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PermissionDeniedError\";\n }\n}\n","import { readSSE } from \"../util/sse.js\";\nimport { KimiApiError } from \"../util/errors.js\";\nimport type { ChatMessage, ToolDef, Usage } from \"./messages.js\";\n\nexport type KimiEvent =\n | { type: \"reasoning\"; delta: string }\n | { type: \"text\"; delta: string }\n | { type: \"tool_call_start\"; index: number; id: string; name: string }\n | { type: \"tool_call_args\"; index: number; argsDelta: string }\n | { type: \"tool_call_complete\"; index: number; id: string; name: string; arguments: string }\n | { type: \"usage\"; usage: Usage }\n | { type: \"done\"; finishReason: string | null; usage: Usage | null };\n\nexport interface RunKimiOpts {\n accountId: string;\n apiToken: string;\n model: string;\n messages: ChatMessage[];\n tools?: ToolDef[];\n signal?: AbortSignal;\n temperature?: number;\n maxCompletionTokens?: number;\n reasoningEffort?: \"low\" | \"medium\" | \"high\";\n}\n\nconst RETRYABLE_CODE = 3040; // \"Capacity temporarily exceeded\"\nconst MAX_ATTEMPTS = 5;\n\nexport async function* runKimi(opts: RunKimiOpts): AsyncGenerator<KimiEvent, void, void> {\n const url = `https://api.cloudflare.com/client/v4/accounts/${opts.accountId}/ai/run/${opts.model}`;\n const body: Record<string, unknown> = {\n messages: opts.messages,\n ...(opts.tools && opts.tools.length\n ? { tools: opts.tools, tool_choice: \"auto\", parallel_tool_calls: true }\n : {}),\n stream: true,\n temperature: opts.temperature ?? 0.2,\n max_completion_tokens: opts.maxCompletionTokens ?? 16384,\n };\n if (opts.reasoningEffort) {\n body.reasoning_effort = opts.reasoningEffort;\n }\n\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${opts.apiToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: opts.signal,\n });\n\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n\n // Cloudflare returns HTTP 200 + application/json with {success:false,errors:[{code:3040}]}\n // for transient capacity errors. Retry those; surface everything else.\n if (!contentType.includes(\"text/event-stream\")) {\n const text = await res.text();\n let parsed: unknown = null;\n try {\n parsed = JSON.parse(text);\n } catch {\n /* ignore */\n }\n const err = extractCloudflareError(parsed);\n if (err?.code === RETRYABLE_CODE && attempt < MAX_ATTEMPTS - 1) {\n const delay = 500 * 2 ** attempt + Math.random() * 250;\n await sleep(delay, opts.signal);\n continue;\n }\n const msg = err?.message ?? `HTTP ${res.status}: ${text.slice(0, 300)}`;\n throw new KimiApiError(`kimiflare: ${msg}`, err?.code, res.status);\n }\n\n if (!res.body) throw new KimiApiError(\"kimiflare: empty response body\", undefined, res.status);\n\n yield* parseStream(res.body, opts.signal);\n return;\n }\n}\n\nasync function* parseStream(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<KimiEvent, void, void> {\n const toolCalls = new Map<number, { id: string; name: string; args: string }>();\n let lastUsage: Usage | null = null;\n let finishReason: string | null = null;\n\n for await (const dataStr of readSSE(body, signal)) {\n if (dataStr === \"[DONE]\") break;\n let chunk: StreamChunk | null = null;\n try {\n chunk = JSON.parse(dataStr);\n } catch {\n continue;\n }\n if (!chunk) continue;\n\n if (chunk.usage) {\n lastUsage = chunk.usage;\n yield { type: \"usage\", usage: chunk.usage };\n }\n\n const choice = chunk.choices?.[0];\n if (!choice) continue;\n\n const d = choice.delta;\n if (d) {\n if (typeof d.reasoning_content === \"string\" && d.reasoning_content.length) {\n yield { type: \"reasoning\", delta: d.reasoning_content };\n }\n if (typeof d.content === \"string\" && d.content.length) {\n yield { type: \"text\", delta: d.content };\n }\n if (Array.isArray(d.tool_calls)) {\n for (const tc of d.tool_calls) {\n const idx = typeof tc.index === \"number\" ? tc.index : 0;\n let buf = toolCalls.get(idx);\n const incomingName = tc.function?.name ?? null;\n const incomingId = tc.id ?? null;\n if (!buf) {\n buf = { id: incomingId ?? `tc_${idx}`, name: incomingName ?? \"\", args: \"\" };\n toolCalls.set(idx, buf);\n if (buf.name) {\n yield { type: \"tool_call_start\", index: idx, id: buf.id, name: buf.name };\n }\n } else {\n if (!buf.name && incomingName) {\n buf.name = incomingName;\n yield { type: \"tool_call_start\", index: idx, id: buf.id, name: buf.name };\n }\n if (buf.id.startsWith(\"tc_\") && incomingId) buf.id = incomingId;\n }\n const argDelta = tc.function?.arguments;\n if (typeof argDelta === \"string\" && argDelta.length) {\n buf.args += argDelta;\n yield { type: \"tool_call_args\", index: idx, argsDelta: argDelta };\n }\n }\n }\n }\n\n if (choice.finish_reason) finishReason = choice.finish_reason;\n }\n\n for (const [idx, buf] of [...toolCalls.entries()].sort((a, b) => a[0] - b[0])) {\n if (!buf.name) continue;\n yield {\n type: \"tool_call_complete\",\n index: idx,\n id: buf.id,\n name: buf.name,\n arguments: buf.args,\n };\n }\n\n yield { type: \"done\", finishReason, usage: lastUsage };\n}\n\ninterface StreamChunk {\n choices?: StreamChoice[];\n usage?: Usage;\n}\ninterface StreamChoice {\n delta?: StreamDelta;\n finish_reason?: string | null;\n index?: number;\n}\ninterface StreamDelta {\n role?: string | null;\n content?: string | null;\n reasoning_content?: string | null;\n tool_calls?: StreamToolCall[];\n}\ninterface StreamToolCall {\n index?: number;\n id?: string | null;\n type?: string | null;\n function?: { name?: string | null; arguments?: string | null };\n}\n\nfunction extractCloudflareError(parsed: unknown): { code?: number; message?: string } | null {\n if (!parsed || typeof parsed !== \"object\") return null;\n const p = parsed as { success?: boolean; errors?: Array<{ code?: number; message?: string }> };\n if (p.success === false && Array.isArray(p.errors) && p.errors.length > 0) {\n return { code: p.errors[0]?.code, message: p.errors[0]?.message };\n }\n return null;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(new DOMException(\"aborted\", \"AbortError\"));\n const t = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(t);\n reject(new DOMException(\"aborted\", \"AbortError\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","import type { ToolDef } from \"../agent/messages.js\";\nimport type { Task } from \"../tasks-state.js\";\n\nexport interface ToolContext {\n cwd: string;\n signal?: AbortSignal;\n onTasks?: (tasks: Task[]) => void;\n}\n\nexport interface ToolRender {\n title: string;\n body?: string;\n diff?: { path: string; before: string; after: string };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface ToolSpec<Args = any> {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n needsPermission: boolean;\n render?: (args: Args) => ToolRender;\n run: (args: Args, ctx: ToolContext) => Promise<string>;\n}\n\nexport function toOpenAIToolDefs(tools: ToolSpec[]): ToolDef[] {\n return tools.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n }));\n}\n","import { runKimi } from \"./client.js\";\nimport { toOpenAIToolDefs, type ToolSpec } from \"../tools/registry.js\";\nimport type { ToolExecutor, PermissionAsker, ToolResult } from \"../tools/executor.js\";\nimport type { ChatMessage, ToolCall, Usage } from \"./messages.js\";\nimport type { Task } from \"../tasks-state.js\";\n\nexport interface AgentCallbacks {\n onAssistantStart?: () => void;\n onReasoningDelta?: (text: string) => void;\n onTextDelta?: (text: string) => void;\n onToolCallStart?: (index: number, id: string, name: string) => void;\n onToolCallArgs?: (index: number, delta: string) => void;\n onToolCallFinalized?: (call: ToolCall) => void;\n onUsage?: (usage: Usage) => void;\n onAssistantFinal?: (msg: ChatMessage) => void;\n onToolResult?: (result: ToolResult) => void;\n onTasks?: (tasks: Task[]) => void;\n askPermission: PermissionAsker;\n}\n\nexport interface AgentTurnOpts {\n accountId: string;\n apiToken: string;\n model: string;\n messages: ChatMessage[];\n tools: ToolSpec[];\n executor: ToolExecutor;\n cwd: string;\n signal: AbortSignal;\n callbacks: AgentCallbacks;\n maxToolIterations?: number;\n temperature?: number;\n maxCompletionTokens?: number;\n reasoningEffort?: \"low\" | \"medium\" | \"high\";\n}\n\nexport async function runAgentTurn(opts: AgentTurnOpts): Promise<void> {\n const max = opts.maxToolIterations ?? 50;\n const toolDefs = toOpenAIToolDefs(opts.tools);\n\n for (let iter = 0; iter < max; iter++) {\n const toolCalls: ToolCall[] = [];\n let content = \"\";\n let reasoning = \"\";\n opts.callbacks.onAssistantStart?.();\n\n const events = runKimi({\n accountId: opts.accountId,\n apiToken: opts.apiToken,\n model: opts.model,\n messages: opts.messages,\n tools: toolDefs,\n signal: opts.signal,\n temperature: opts.temperature,\n maxCompletionTokens: opts.maxCompletionTokens,\n reasoningEffort: opts.reasoningEffort,\n });\n\n for await (const ev of events) {\n switch (ev.type) {\n case \"reasoning\":\n reasoning += ev.delta;\n opts.callbacks.onReasoningDelta?.(ev.delta);\n break;\n case \"text\":\n content += ev.delta;\n opts.callbacks.onTextDelta?.(ev.delta);\n break;\n case \"tool_call_start\":\n opts.callbacks.onToolCallStart?.(ev.index, ev.id, ev.name);\n break;\n case \"tool_call_args\":\n opts.callbacks.onToolCallArgs?.(ev.index, ev.argsDelta);\n break;\n case \"tool_call_complete\": {\n const call: ToolCall = {\n id: ev.id,\n type: \"function\",\n function: { name: ev.name, arguments: ev.arguments },\n };\n toolCalls.push(call);\n opts.callbacks.onToolCallFinalized?.(call);\n break;\n }\n case \"usage\":\n opts.callbacks.onUsage?.(ev.usage);\n break;\n case \"done\":\n break;\n }\n }\n\n const assistantMsg: ChatMessage = {\n role: \"assistant\",\n content: content || null,\n ...(reasoning ? { reasoning_content: reasoning } : {}),\n ...(toolCalls.length ? { tool_calls: toolCalls } : {}),\n };\n opts.messages.push(assistantMsg);\n opts.callbacks.onAssistantFinal?.(assistantMsg);\n\n if (toolCalls.length === 0) return;\n\n for (const tc of toolCalls) {\n if (opts.signal.aborted) throw new DOMException(\"aborted\", \"AbortError\");\n const result = await opts.executor.run(\n { id: tc.id, name: tc.function.name, arguments: tc.function.arguments },\n opts.callbacks.askPermission,\n { cwd: opts.cwd, signal: opts.signal, onTasks: opts.callbacks.onTasks },\n );\n opts.messages.push({\n role: \"tool\",\n tool_call_id: result.tool_call_id,\n content: result.content,\n name: result.name,\n });\n opts.callbacks.onToolResult?.(result);\n }\n }\n\n throw new Error(`kimiflare: tool iteration limit reached (${opts.maxToolIterations ?? 50})`);\n}\n","export type Mode = \"edit\" | \"plan\" | \"auto\";\n\nexport const MODES: Mode[] = [\"edit\", \"plan\", \"auto\"];\n\nexport function nextMode(m: Mode): Mode {\n const i = MODES.indexOf(m);\n return MODES[(i + 1) % MODES.length]!;\n}\n\nexport function modeDescription(m: Mode): string {\n switch (m) {\n case \"edit\":\n return \"edit — default; prompts for permission before mutating tools\";\n case \"plan\":\n return \"plan — read-only research; blocks writes/edits/bash until you exit plan mode\";\n case \"auto\":\n return \"auto — autonomous; auto-approves every tool call (use with care)\";\n }\n}\n\nexport const MUTATING_TOOLS = new Set([\"write\", \"edit\", \"bash\"]);\n\nexport function isBlockedInPlanMode(toolName: string): boolean {\n return MUTATING_TOOLS.has(toolName);\n}\n\nexport function systemPromptForMode(m: Mode): string {\n if (m === \"plan\") {\n return \"\\n\\nPLAN MODE is active. The user wants you to investigate and produce a plan WITHOUT making any changes. Do not call write, edit, or bash. Only use read/glob/grep/web-fetch. At the end, present a concise plan (bullets, files to change, approach). The user will review and then exit plan mode to execute.\";\n }\n if (m === \"auto\") {\n return \"\\n\\nAUTO MODE is active. The user has opted into autonomous execution — every tool call will be auto-approved. Work efficiently, but do not take irreversible destructive actions (rm -rf, git push --force, dropping tables, etc.) without pausing to describe them in chat first. Prefer smaller reversible steps.\";\n }\n return \"\";\n}\n","import { platform, release, homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport { readFileSync, statSync } from \"node:fs\";\nimport type { ToolSpec } from \"../tools/registry.js\";\nimport { systemPromptForMode, type Mode } from \"../mode.js\";\n\nexport interface SystemPromptOpts {\n cwd: string;\n tools: ToolSpec[];\n model: string;\n now?: Date;\n mode?: Mode;\n}\n\nconst CONTEXT_FILENAMES = [\"KIMI.md\", \"KIMIFLARE.md\", \"AGENT.md\"];\nconst MAX_CONTEXT_BYTES = 20 * 1024;\n\nexport interface ContextFile {\n name: string;\n path: string;\n content: string;\n lineCount: number;\n}\n\nexport function loadContextFile(cwd: string): ContextFile | null {\n for (const name of CONTEXT_FILENAMES) {\n const path = join(cwd, name);\n try {\n const s = statSync(path);\n if (!s.isFile() || s.size > MAX_CONTEXT_BYTES) continue;\n const content = readFileSync(path, \"utf8\");\n return { name, path, content, lineCount: content.split(\"\\n\").length };\n } catch {\n /* not present */\n }\n }\n return null;\n}\n\nexport function buildSystemPrompt(opts: SystemPromptOpts): string {\n const now = opts.now ?? new Date();\n const date = now.toISOString().slice(0, 10);\n const shell = process.env.SHELL ? basename(process.env.SHELL) : \"sh\";\n const toolsBlock = opts.tools\n .map((t) => {\n const perm = t.needsPermission ? \" [needs user permission]\" : \"\";\n return `- \\`${t.name}\\`${perm}: ${t.description.split(\"\\n\")[0]}`;\n })\n .join(\"\\n\");\n\n const base = `You are kimiflare, an interactive coding assistant running in the user's terminal. You act on the user's local filesystem through the tools listed below. You are powered by the ${opts.model} model on Cloudflare Workers AI.\n\nEnvironment:\n- Working directory: ${opts.cwd}\n- Platform: ${platform()} ${release()}\n- Shell: ${shell}\n- Home: ${homedir()}\n- Today: ${date}\n\nTools available:\n${toolsBlock}\n\nHow to work:\n- Prefer calling tools over guessing. Read files before editing them. Use \\`glob\\` and \\`grep\\` to explore code before assuming structure.\n- Before any mutating tool call (write, edit, bash), state in one short sentence what you're about to do, then call the tool. The user will be asked to approve each mutating call.\n- When the user asks for a change, make the change. Do not paste code in chat that you could apply with \\`edit\\` or \\`write\\`.\n- For multi-step work, call \\`tasks_set\\` at the start with a short task list (one task \"in_progress\", the rest \"pending\"), then call it again after each step completes (flip that one to \"completed\" and the next to \"in_progress\"). Skip it for trivial single-step requests.\n- Keep responses terse. The user sees tool calls and their results inline — do not re-summarize them unless asked.\n- If a tool returns an error, read it carefully and adjust; do not retry the same call blindly.\n- You have a 262k-token context window. Read as much of a file as needed rather than guessing.\n- If a request is ambiguous, ask one focused question instead of making large assumptions.\n- When you finish a task, stop. Do not add a closing summary.`;\n\n const ctx = loadContextFile(opts.cwd);\n const contextBlock = ctx\n ? `\\n\\nProject context from ${ctx.name} (${ctx.lineCount} lines, treat as authoritative):\\n${ctx.content.trim()}`\n : \"\";\n const modeBlock = opts.mode ? systemPromptForMode(opts.mode) : \"\";\n\n return base + contextBlock + modeBlock;\n}\n","import { resolve, isAbsolute, relative, sep } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport function resolvePath(cwd: string, input: string): string {\n if (input.startsWith(\"~/\") || input === \"~\") {\n return resolve(homedir(), input === \"~\" ? \".\" : input.slice(2));\n }\n return isAbsolute(input) ? input : resolve(cwd, input);\n}\n\nexport function truncate(s: string, n: number): string {\n if (s.length <= n) return s;\n return s.slice(0, n) + `\\n... [truncated, ${s.length - n} chars omitted]`;\n}\n\n/**\n * Collapse a path for display:\n * - If inside cwd, return the path relative to cwd.\n * - If not inside cwd and length > maxLen, return `…/last-two-segments`.\n * - Otherwise return the path unchanged.\n */\nexport function collapsePath(input: string, cwd: string, maxLen = 40): string {\n if (!input) return input;\n let abs: string;\n try {\n abs = resolvePath(cwd, input);\n } catch {\n return input;\n }\n const rel = relative(cwd, abs);\n if (rel && !rel.startsWith(\"..\") && !isAbsolute(rel)) {\n return rel === \"\" ? \".\" : rel;\n }\n if (input.length <= maxLen) return input;\n const parts = input.split(sep).filter(Boolean);\n if (parts.length <= 2) return input;\n return `…/${parts.slice(-2).join(sep)}`;\n}\n\n/**\n * Replace any long absolute-looking path (starting with `/` or `~`) inside `s`\n * with a collapsed form. Useful for compacting tool argument previews.\n */\nexport function collapsePathsInText(s: string, cwd: string, maxLen = 40): string {\n return s.replace(/([~/][^\\s\"',)}\\]]+)/g, (match) => collapsePath(match, cwd, maxLen));\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { resolvePath, collapsePath } from \"../util/paths.js\";\n\nconst MAX_BYTES = 2 * 1024 * 1024;\n\ninterface Args {\n path: string;\n offset?: number;\n limit?: number;\n}\n\nexport const readTool: ToolSpec<Args> = {\n name: \"read\",\n description:\n \"Read a text file from the local filesystem. Supports optional line offset/limit. Refuses files larger than 2MB. Returns contents with 1-indexed line numbers prefixed, cat -n style.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Path to the file. Absolute or relative to cwd.\" },\n offset: { type: \"integer\", description: \"1-indexed line number to start reading from.\", minimum: 1 },\n limit: { type: \"integer\", description: \"Maximum number of lines to return.\", minimum: 1 },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n needsPermission: false,\n render: ({ path }) => ({ title: `read ${collapsePath(path, process.cwd())}` }),\n async run(args, ctx) {\n const abs = resolvePath(ctx.cwd, args.path);\n const st = await stat(abs);\n if (st.size > MAX_BYTES) throw new Error(`file too large: ${st.size} bytes (max ${MAX_BYTES})`);\n const text = await readFile(abs, \"utf8\");\n const lines = text.split(\"\\n\");\n const start = Math.max(0, (args.offset ?? 1) - 1);\n const end = args.limit ? Math.min(lines.length, start + args.limit) : lines.length;\n const width = String(end).length;\n return lines\n .slice(start, end)\n .map((l, i) => `${String(start + i + 1).padStart(width, \" \")}\\t${l}`)\n .join(\"\\n\");\n },\n};\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { resolvePath, collapsePath } from \"../util/paths.js\";\n\ninterface Args {\n path: string;\n content: string;\n}\n\nexport const writeTool: ToolSpec<Args> = {\n name: \"write\",\n description:\n \"Create a file or overwrite an existing one with the given contents. Prompts the user for permission first and shows a diff preview.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n content: { type: \"string\" },\n },\n required: [\"path\", \"content\"],\n additionalProperties: false,\n },\n needsPermission: true,\n render: (args) => ({\n title: `write ${collapsePath(args.path, process.cwd())} (${args.content.length} chars)`,\n diff: { path: args.path, before: \"\", after: args.content },\n }),\n async run(args, ctx) {\n const abs = resolvePath(ctx.cwd, args.path);\n let before = \"\";\n try {\n before = await readFile(abs, \"utf8\");\n } catch {\n /* new file */\n }\n await mkdir(dirname(abs), { recursive: true });\n await writeFile(abs, args.content, \"utf8\");\n const verb = before ? \"Overwrote\" : \"Created\";\n return `${verb} ${args.path} (${args.content.length} chars).`;\n },\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { resolvePath, collapsePath } from \"../util/paths.js\";\n\ninterface Args {\n path: string;\n old_string: string;\n new_string: string;\n replace_all?: boolean;\n}\n\nexport const editTool: ToolSpec<Args> = {\n name: \"edit\",\n description:\n \"Replace an exact string in a file. If replace_all is false (default), the old_string must appear exactly once or the call fails. Prompts the user for permission first and shows a diff preview.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n old_string: { type: \"string\", description: \"Exact text to replace.\" },\n new_string: { type: \"string\", description: \"Replacement text.\" },\n replace_all: { type: \"boolean\", default: false },\n },\n required: [\"path\", \"old_string\", \"new_string\"],\n additionalProperties: false,\n },\n needsPermission: true,\n render: (args) => ({\n title: `edit ${collapsePath(args.path, process.cwd())}${args.replace_all ? \" (replace_all)\" : \"\"}`,\n diff: { path: args.path, before: args.old_string, after: args.new_string },\n }),\n async run(args, ctx) {\n const abs = resolvePath(ctx.cwd, args.path);\n const orig = await readFile(abs, \"utf8\");\n const occurrences = countOccurrences(orig, args.old_string);\n if (occurrences === 0) throw new Error(`old_string not found in ${args.path}`);\n if (occurrences > 1 && !args.replace_all) {\n throw new Error(\n `old_string appears ${occurrences} times in ${args.path}; pass replace_all=true or include more surrounding context`,\n );\n }\n const next = args.replace_all\n ? orig.split(args.old_string).join(args.new_string)\n : orig.replace(args.old_string, args.new_string);\n await writeFile(abs, next, \"utf8\");\n return `Replaced ${occurrences} occurrence(s) in ${args.path}.`;\n },\n};\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (!needle) return 0;\n let count = 0;\n let from = 0;\n while (true) {\n const i = haystack.indexOf(needle, from);\n if (i === -1) return count;\n count++;\n from = i + needle.length;\n }\n}\n","import { spawn } from \"node:child_process\";\nimport type { ToolSpec, ToolContext } from \"./registry.js\";\nimport { truncate } from \"../util/paths.js\";\n\ninterface Args {\n command: string;\n timeout_ms?: number;\n}\n\nconst DEFAULT_TIMEOUT = 120_000;\nconst MAX_TIMEOUT = 600_000;\nconst OUTPUT_CAP = 30_000;\n\nexport const bashTool: ToolSpec<Args> = {\n name: \"bash\",\n description:\n \"Run a shell command via `bash -lc`. Prompts the user for permission before executing. stdout and stderr are captured, combined, and capped at 30KB.\",\n parameters: {\n type: \"object\",\n properties: {\n command: { type: \"string\" },\n timeout_ms: {\n type: \"integer\",\n description: \"Milliseconds. Default 120000, max 600000.\",\n minimum: 1000,\n maximum: MAX_TIMEOUT,\n },\n },\n required: [\"command\"],\n additionalProperties: false,\n },\n needsPermission: true,\n render: (args) => ({ title: formatBashTitle(args.command) }),\n run: (args, ctx) => runBash(args, ctx),\n};\n\nfunction formatBashTitle(raw: string): string {\n let cmd = (raw ?? \"\").trim();\n const m = cmd.match(/^cd\\s+([^\\s&;]+)\\s*(?:&&|;)\\s*(.*)$/);\n if (m) cmd = m[2]!.trim();\n return `$ ${cmd}`.slice(0, 120);\n}\n\nfunction runBash(args: Args, ctx: ToolContext): Promise<string> {\n const timeout = Math.min(Math.max(1000, args.timeout_ms ?? DEFAULT_TIMEOUT), MAX_TIMEOUT);\n return new Promise<string>((resolve, reject) => {\n const child = spawn(\"bash\", [\"-lc\", args.command], {\n cwd: ctx.cwd,\n signal: ctx.signal,\n });\n let stdout = \"\";\n let stderr = \"\";\n let killedByTimeout = false;\n const timer = setTimeout(() => {\n killedByTimeout = true;\n child.kill(\"SIGKILL\");\n }, timeout);\n child.stdout.on(\"data\", (d: Buffer) => {\n stdout += d.toString(\"utf8\");\n });\n child.stderr.on(\"data\", (d: Buffer) => {\n stderr += d.toString(\"utf8\");\n });\n child.on(\"error\", (e) => {\n clearTimeout(timer);\n reject(e);\n });\n child.on(\"close\", (code, signal) => {\n clearTimeout(timer);\n const header = killedByTimeout\n ? `(timed out after ${timeout}ms)`\n : `exit=${code ?? \"?\"}${signal ? ` signal=${signal}` : \"\"}`;\n const parts: string[] = [header];\n if (stdout) parts.push(`--- stdout ---\\n${stdout.trimEnd()}`);\n if (stderr) parts.push(`--- stderr ---\\n${stderr.trimEnd()}`);\n if (!stdout && !stderr) parts.push(\"(no output)\");\n resolve(truncate(parts.join(\"\\n\"), OUTPUT_CAP));\n });\n });\n}\n","import fg from \"fast-glob\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { resolvePath, collapsePath } from \"../util/paths.js\";\n\ninterface Args {\n pattern: string;\n path?: string;\n}\n\nexport const globTool: ToolSpec<Args> = {\n name: \"glob\",\n description:\n \"Find files matching a glob pattern (e.g. `**/*.ts`). Returns up to 200 absolute paths, sorted by mtime descending.\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: { type: \"string\", description: \"Glob pattern, e.g. `src/**/*.ts`.\" },\n path: { type: \"string\", description: \"Root directory. Defaults to cwd.\" },\n },\n required: [\"pattern\"],\n additionalProperties: false,\n },\n needsPermission: false,\n render: (args) => ({ title: `glob ${args.pattern}${args.path ? ` in ${collapsePath(args.path, process.cwd())}` : \"\"}` }),\n async run(args, ctx) {\n const root = args.path ? resolvePath(ctx.cwd, args.path) : ctx.cwd;\n const entries = (await fg(args.pattern, {\n cwd: root,\n absolute: true,\n dot: false,\n onlyFiles: false,\n stats: true,\n })) as unknown as Array<{ path: string; stats?: { mtimeMs: number } }>;\n entries.sort((a, b) => (b.stats?.mtimeMs ?? 0) - (a.stats?.mtimeMs ?? 0));\n const paths = entries.slice(0, 200).map((e) => e.path);\n return paths.length ? paths.join(\"\\n\") : \"(no matches)\";\n },\n};\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { readFile } from \"node:fs/promises\";\nimport fg from \"fast-glob\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { resolvePath, truncate } from \"../util/paths.js\";\n\nconst pExecFile = promisify(execFile);\n\ninterface Args {\n pattern: string;\n path?: string;\n glob?: string;\n case_insensitive?: boolean;\n output_mode?: \"content\" | \"files\";\n}\n\nlet cachedHasRg: boolean | null = null;\nasync function hasRipgrep(): Promise<boolean> {\n if (cachedHasRg !== null) return cachedHasRg;\n try {\n await pExecFile(\"rg\", [\"--version\"]);\n cachedHasRg = true;\n } catch {\n cachedHasRg = false;\n }\n return cachedHasRg;\n}\n\nexport const grepTool: ToolSpec<Args> = {\n name: \"grep\",\n description:\n \"Search file contents for a regular expression. Shells out to ripgrep if available, otherwise uses a JavaScript fallback. Output is capped at 30KB.\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: { type: \"string\", description: \"Regex pattern.\" },\n path: { type: \"string\", description: \"Root directory. Defaults to cwd.\" },\n glob: { type: \"string\", description: \"Filter files by glob, e.g. `*.ts`.\" },\n case_insensitive: { type: \"boolean\" },\n output_mode: {\n type: \"string\",\n enum: [\"content\", \"files\"],\n description: \"`content` returns matching lines; `files` returns matching file paths only.\",\n },\n },\n required: [\"pattern\"],\n additionalProperties: false,\n },\n needsPermission: false,\n render: (args) => ({ title: `grep ${args.pattern}${args.glob ? ` (${args.glob})` : \"\"}` }),\n async run(args, ctx) {\n const root = args.path ? resolvePath(ctx.cwd, args.path) : ctx.cwd;\n const mode = args.output_mode ?? \"content\";\n if (await hasRipgrep()) return runRipgrep(args, root, mode);\n return runJsFallback(args, root, mode);\n },\n};\n\nasync function runRipgrep(\n args: Args,\n root: string,\n mode: \"content\" | \"files\",\n): Promise<string> {\n const rgArgs = [\"--no-heading\", \"--color=never\", \"--line-number\"];\n if (args.case_insensitive) rgArgs.push(\"-i\");\n if (args.glob) rgArgs.push(\"--glob\", args.glob);\n if (mode === \"files\") rgArgs.push(\"-l\");\n rgArgs.push(\"--\", args.pattern, root);\n try {\n const { stdout } = await pExecFile(\"rg\", rgArgs, { maxBuffer: 10 * 1024 * 1024 });\n const trimmed = stdout.trim();\n return trimmed ? truncate(trimmed, 30_000) : \"(no matches)\";\n } catch (e) {\n const err = e as { code?: number; stderr?: string };\n if (err.code === 1) return \"(no matches)\";\n throw new Error(err.stderr || String(e));\n }\n}\n\nasync function runJsFallback(\n args: Args,\n root: string,\n mode: \"content\" | \"files\",\n): Promise<string> {\n const re = new RegExp(args.pattern, args.case_insensitive ? \"i\" : \"\");\n const globPattern = args.glob ? `**/${args.glob}` : \"**/*\";\n const files = await fg(globPattern, {\n cwd: root,\n absolute: true,\n dot: false,\n onlyFiles: true,\n ignore: [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\"],\n });\n const out: string[] = [];\n for (const file of files.slice(0, 5000)) {\n try {\n const content = await readFile(file, \"utf8\");\n if (mode === \"files\") {\n if (re.test(content)) out.push(file);\n } else {\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n if (re.test(lines[i]!)) {\n out.push(`${file}:${i + 1}:${lines[i]}`);\n if (out.length > 500) break;\n }\n }\n }\n } catch {\n /* binary or unreadable — skip */\n }\n if (out.length > 500) break;\n }\n return out.length ? truncate(out.join(\"\\n\"), 30_000) : \"(no matches)\";\n}\n","import TurndownService from \"turndown\";\nimport type { ToolSpec } from \"./registry.js\";\nimport { truncate } from \"../util/paths.js\";\n\ninterface Args {\n url: string;\n}\n\nconst MAX_BYTES = 1 * 1024 * 1024;\nconst MAX_OUTPUT = 100_000;\nconst TIMEOUT_MS = 20_000;\n\nexport const webFetchTool: ToolSpec<Args> = {\n name: \"web_fetch\",\n description:\n \"Fetch a URL over HTTPS and return its content. HTML pages are converted to markdown. Output is capped at ~100KB.\",\n parameters: {\n type: \"object\",\n properties: {\n url: { type: \"string\", description: \"Full URL, http(s).\" },\n },\n required: [\"url\"],\n additionalProperties: false,\n },\n needsPermission: false,\n render: (args) => ({ title: `GET ${args.url}` }),\n async run(args) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n const res = await fetch(args.url, {\n redirect: \"follow\",\n signal: controller.signal,\n headers: { \"user-agent\": \"kimiflare/0.1 (+https://github.com/sinameraji/kimiflare)\" },\n });\n const ct = res.headers.get(\"content-type\") ?? \"\";\n const body = await res.text();\n const bounded = body.length > MAX_BYTES ? body.slice(0, MAX_BYTES) : body;\n if (ct.toLowerCase().includes(\"html\")) {\n const td = new TurndownService({ headingStyle: \"atx\", codeBlockStyle: \"fenced\" });\n return truncate(`# ${args.url}\\n\\n${td.turndown(bounded)}`, MAX_OUTPUT);\n }\n return truncate(`# ${args.url}\\n\\n${bounded}`, MAX_OUTPUT);\n } finally {\n clearTimeout(timer);\n }\n },\n};\n","export type TaskStatus = \"pending\" | \"in_progress\" | \"completed\";\n\nexport interface Task {\n id: string;\n title: string;\n status: TaskStatus;\n}\n\nexport function isValidStatus(s: unknown): s is TaskStatus {\n return s === \"pending\" || s === \"in_progress\" || s === \"completed\";\n}\n\nexport function validateTasks(input: unknown): Task[] {\n if (!Array.isArray(input)) throw new Error(\"tasks must be an array\");\n return input.map((t, i) => {\n if (!t || typeof t !== \"object\") throw new Error(`tasks[${i}] must be an object`);\n const rec = t as Record<string, unknown>;\n const id = typeof rec.id === \"string\" && rec.id.length > 0 ? rec.id : String(i + 1);\n const title = typeof rec.title === \"string\" ? rec.title.trim() : \"\";\n if (!title) throw new Error(`tasks[${i}].title is required`);\n const status: TaskStatus = isValidStatus(rec.status) ? rec.status : \"pending\";\n return { id, title, status };\n });\n}\n","import type { ToolSpec } from \"./registry.js\";\nimport { validateTasks, type Task } from \"../tasks-state.js\";\n\ninterface TasksSetArgs {\n tasks: Task[];\n}\n\nexport const tasksSetTool: ToolSpec<TasksSetArgs> = {\n name: \"tasks_set\",\n description: [\n \"Set the visible task list shown to the user during this turn.\",\n \"Call this when the user has given you a multi-step job, or whenever progress changes:\",\n \"at the start (all tasks pending, with exactly one in_progress), and after each step completes\",\n \"(flip that task to completed and the next to in_progress).\",\n \"Pass the ENTIRE task list each call — this replaces the panel.\",\n \"Keep tasks short (one imperative clause). Only one should be in_progress at a time.\",\n \"For quick single-step requests, don't use this tool at all.\",\n ].join(\" \"),\n parameters: {\n type: \"object\",\n properties: {\n tasks: {\n type: \"array\",\n description: \"The full, ordered list of tasks. Pass every call.\",\n items: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Stable short id (e.g. '1', '2').\" },\n title: { type: \"string\", description: \"Short imperative task title.\" },\n status: {\n type: \"string\",\n enum: [\"pending\", \"in_progress\", \"completed\"],\n description: \"Only one task should be 'in_progress' at a time.\",\n },\n },\n required: [\"id\", \"title\", \"status\"],\n },\n },\n },\n required: [\"tasks\"],\n },\n needsPermission: false,\n render: (args) => ({\n title: `tasks (${args.tasks.length} items)`,\n body: args.tasks\n .map((t) => `${t.status === \"completed\" ? \"✓\" : t.status === \"in_progress\" ? \"▸\" : \"·\"} ${t.title}`)\n .join(\"\\n\"),\n }),\n run: async (args, ctx) => {\n let tasks: Task[];\n try {\n tasks = validateTasks(args.tasks);\n } catch (e) {\n return `Error: ${(e as Error).message}`;\n }\n ctx.onTasks?.(tasks);\n const summary = `${tasks.length} tasks set — ${tasks.filter((t) => t.status === \"completed\").length} done, ${tasks.filter((t) => t.status === \"in_progress\").length} active, ${tasks.filter((t) => t.status === \"pending\").length} pending`;\n return summary;\n },\n};\n","import type { ToolSpec, ToolContext } from \"./registry.js\";\nimport { readTool } from \"./read.js\";\nimport { writeTool } from \"./write.js\";\nimport { editTool } from \"./edit.js\";\nimport { bashTool } from \"./bash.js\";\nimport { globTool } from \"./glob.js\";\nimport { grepTool } from \"./grep.js\";\nimport { webFetchTool } from \"./web-fetch.js\";\nimport { tasksSetTool } from \"./tasks.js\";\n\nexport const ALL_TOOLS: ToolSpec[] = [\n readTool,\n writeTool,\n editTool,\n bashTool,\n globTool,\n grepTool,\n webFetchTool,\n tasksSetTool,\n];\n\nexport type PermissionDecision = \"allow\" | \"allow_session\" | \"deny\";\n\nexport interface PermissionRequest {\n tool: ToolSpec;\n args: Record<string, unknown>;\n sessionKey: string;\n}\n\nexport type PermissionAsker = (req: PermissionRequest) => Promise<PermissionDecision>;\n\nexport interface ToolInvocation {\n id: string;\n name: string;\n arguments: string;\n}\n\nexport interface ToolResult {\n tool_call_id: string;\n name: string;\n content: string;\n ok: boolean;\n}\n\nexport class ToolExecutor {\n private sessionAllowed = new Set<string>();\n private tools: Map<string, ToolSpec>;\n\n constructor(tools: ToolSpec[] = ALL_TOOLS) {\n this.tools = new Map(tools.map((t) => [t.name, t]));\n }\n\n list(): ToolSpec[] {\n return [...this.tools.values()];\n }\n\n clearSessionPermissions(): void {\n this.sessionAllowed.clear();\n }\n\n async run(\n call: ToolInvocation,\n askPermission: PermissionAsker,\n ctx: ToolContext,\n ): Promise<ToolResult> {\n const tool = this.tools.get(call.name);\n if (!tool) {\n return {\n tool_call_id: call.id,\n name: call.name,\n content: `Error: unknown tool \"${call.name}\". Valid tools: ${[...this.tools.keys()].join(\", \")}.`,\n ok: false,\n };\n }\n\n let args: Record<string, unknown>;\n try {\n args = call.arguments.trim() ? JSON.parse(call.arguments) : {};\n } catch (e) {\n return {\n tool_call_id: call.id,\n name: call.name,\n content: `Error: invalid JSON arguments for ${call.name}: ${(e as Error).message}. Arguments received: ${truncateForError(call.arguments)}`,\n ok: false,\n };\n }\n\n if (tool.needsPermission) {\n const sessionKey = this.permissionKey(tool, args);\n if (!this.sessionAllowed.has(sessionKey)) {\n const decision = await askPermission({ tool, args, sessionKey });\n if (decision === \"deny\") {\n return {\n tool_call_id: call.id,\n name: call.name,\n content: `Permission denied by user. Do not retry this exact call; ask the user what they want to do differently.`,\n ok: false,\n };\n }\n if (decision === \"allow_session\") this.sessionAllowed.add(sessionKey);\n }\n }\n\n try {\n const content = await tool.run(args as never, ctx);\n return { tool_call_id: call.id, name: call.name, content, ok: true };\n } catch (e) {\n return {\n tool_call_id: call.id,\n name: call.name,\n content: `Error running ${call.name}: ${(e as Error).message ?? String(e)}`,\n ok: false,\n };\n }\n }\n\n private permissionKey(tool: ToolSpec, args: Record<string, unknown>): string {\n if (tool.name === \"bash\" && typeof args.command === \"string\") {\n const firstToken = args.command.trim().split(/\\s+/)[0] ?? \"\";\n return `bash:${firstToken}`;\n }\n return tool.name;\n }\n}\n\nfunction truncateForError(s: string): string {\n return s.length <= 200 ? s : `${s.slice(0, 200)}... [${s.length - 200} more chars]`;\n}\n","import { runKimi } from \"./client.js\";\nimport type { ChatMessage } from \"./messages.js\";\n\nexport interface CompactOpts {\n accountId: string;\n apiToken: string;\n model: string;\n messages: ChatMessage[];\n keepLastTurns?: number;\n signal?: AbortSignal;\n}\n\nexport interface CompactResult {\n summary: string;\n newMessages: ChatMessage[];\n replacedCount: number;\n}\n\nconst SUMMARY_SYSTEM = `You are summarizing a terminal coding session so it can fit back into a short context window. Produce a dense summary that captures:\n- The user's goal(s) and what they've asked for.\n- Files read or modified, with paths.\n- Tools run (bash commands, edits) and the outcome of each.\n- Decisions made and open questions.\n- Any constraints or preferences the user has stated.\n\nDo not include speculation. Do not include chat-style pleasantries. Use short bullet form. Aim for ~400-800 tokens.`;\n\nfunction indexOfNthUserFromEnd(messages: ChatMessage[], n: number): number {\n let seen = 0;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]!.role === \"user\") {\n seen++;\n if (seen === n) return i;\n }\n }\n return -1;\n}\n\nexport async function compactMessages(opts: CompactOpts): Promise<CompactResult> {\n const keep = opts.keepLastTurns ?? 4;\n const messages = opts.messages;\n\n const systemMsg = messages.find((m) => m.role === \"system\");\n if (!systemMsg) throw new Error(\"compact: no system message found\");\n\n const cutoffUserIdx = indexOfNthUserFromEnd(messages, keep);\n const firstKeepIdx = cutoffUserIdx >= 0 ? cutoffUserIdx : messages.length;\n const toSummarize = messages.slice(1, firstKeepIdx);\n const toKeep = messages.slice(firstKeepIdx);\n\n if (toSummarize.length === 0) {\n return { summary: \"\", newMessages: messages, replacedCount: 0 };\n }\n\n const transcript = toSummarize\n .map((m) => {\n if (m.role === \"tool\") {\n const snippet = (m.content ?? \"\").slice(0, 500);\n return `[tool ${m.name ?? \"\"}] ${snippet}`;\n }\n if (m.role === \"assistant\") {\n const calls = m.tool_calls\n ? ` (tool_calls: ${m.tool_calls.map((c) => c.function.name).join(\", \")})`\n : \"\";\n return `[assistant]${calls} ${m.content ?? \"\"}`;\n }\n return `[${m.role}] ${m.content ?? \"\"}`;\n })\n .join(\"\\n\");\n\n let summary = \"\";\n const events = runKimi({\n accountId: opts.accountId,\n apiToken: opts.apiToken,\n model: opts.model,\n messages: [\n { role: \"system\", content: SUMMARY_SYSTEM },\n { role: \"user\", content: `Summarize this session so it can be replaced by your summary:\\n\\n${transcript}` },\n ],\n signal: opts.signal,\n temperature: 0.1,\n reasoningEffort: \"low\",\n });\n for await (const ev of events) {\n if (ev.type === \"text\") summary += ev.delta;\n }\n\n const summaryMsg: ChatMessage = {\n role: \"user\",\n content: `[compacted summary of earlier turns]\\n${summary.trim()}`,\n };\n\n return {\n summary: summary.trim(),\n newMessages: [systemMsg, summaryMsg, ...toKeep],\n replacedCount: toSummarize.length,\n };\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { createTwoFilesPatch } from \"diff\";\n\ninterface Props {\n path: string;\n before: string;\n after: string;\n maxLines?: number;\n}\n\nexport function DiffView({ path, before, after, maxLines = 40 }: Props) {\n const patch = createTwoFilesPatch(path, path, before, after, \"\", \"\", { context: 2 });\n const raw = patch.split(\"\\n\").slice(4);\n const lines = raw.filter((l) => {\n if (l.startsWith(\"--- \") || l.startsWith(\"+++ \")) return false;\n if (l.startsWith(\"\\\\")) return false;\n return true;\n });\n\n const diffStats = countChanges(lines);\n const hideHeader =\n diffStats.changed <= 3 && diffStats.context <= 3 && diffStats.hunks <= 1;\n const filtered = hideHeader\n ? lines.filter((l) => !l.startsWith(\"@@\"))\n : lines;\n\n const truncated = filtered.length > maxLines ? filtered.slice(0, maxLines) : filtered;\n\n return (\n <Box flexDirection=\"column\">\n {truncated.map((line, i) => <DiffLine key={i} line={line} />)}\n {filtered.length > maxLines && (\n <Text color=\"gray\">... ({filtered.length - maxLines} more lines)</Text>\n )}\n </Box>\n );\n}\n\nfunction countChanges(lines: string[]): { changed: number; context: number; hunks: number } {\n let changed = 0;\n let context = 0;\n let hunks = 0;\n for (const l of lines) {\n if (l.startsWith(\"@@\")) hunks++;\n else if (l.startsWith(\"+\") || l.startsWith(\"-\")) changed++;\n else if (l.trim().length > 0) context++;\n }\n return { changed, context, hunks };\n}\n\nfunction DiffLine({ line }: { line: string }) {\n if (line.startsWith(\"+\")) return <Text color=\"green\">{line}</Text>;\n if (line.startsWith(\"-\")) return <Text color=\"red\">{line}</Text>;\n if (line.startsWith(\"@@\")) return <Text color=\"cyan\">{line}</Text>;\n return <Text color=\"gray\">{line}</Text>;\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport Spinner from \"ink-spinner\";\nimport { DiffView } from \"./diff-view.js\";\nimport { collapsePathsInText } from \"../util/paths.js\";\n\nexport interface ToolEventState {\n id: string;\n name: string;\n args: string;\n status: \"running\" | \"done\" | \"error\";\n result?: string;\n render?: { title: string; body?: string; diff?: { path: string; before: string; after: string } };\n expanded?: boolean;\n}\n\ninterface Props {\n evt: ToolEventState;\n verbose?: boolean;\n}\n\nexport function ToolView({ evt, verbose }: Props) {\n const statusIcon =\n evt.status === \"running\" ? <Spinner type=\"dots\" /> : evt.status === \"error\" ? <Text color=\"red\">✗</Text> : <Text color=\"green\">✓</Text>;\n const title = evt.render?.title ?? `${evt.name}(${compactArgs(evt.args)})`;\n const expand = Boolean(evt.expanded || verbose);\n const lines = evt.result ? evt.result.split(\"\\n\") : [];\n const showLimit = verbose ? 200 : 20;\n\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text>\n {statusIcon} <Text color=\"magenta\">{title}</Text>\n </Text>\n {evt.render?.diff ? (\n <Box marginLeft={2}>\n <DiffView {...evt.render.diff} />\n </Box>\n ) : null}\n {evt.result && expand ? (\n <Box marginLeft={2} flexDirection=\"column\">\n {lines.slice(0, showLimit).map((l, i) => (\n <Text key={i} color=\"gray\">{l}</Text>\n ))}\n {lines.length > showLimit && (\n <Text color=\"gray\">... ({lines.length - showLimit} more lines)</Text>\n )}\n </Box>\n ) : null}\n {evt.result && !expand && evt.status !== \"running\" ? (\n <Text color=\"gray\"> {firstLine(evt.result)}</Text>\n ) : null}\n </Box>\n );\n}\n\nfunction compactArgs(raw: string): string {\n const collapsed = collapsePathsInText(raw, process.cwd());\n const s = collapsed.replace(/\\s+/g, \" \");\n return s.length <= 80 ? s : s.slice(0, 80) + \"…\";\n}\n\nfunction firstLine(s: string): string {\n const line = s.split(\"\\n\").find((l) => l.trim().length > 0) ?? \"\";\n return line.length <= 120 ? line : line.slice(0, 120) + \"…\";\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { Theme } from \"./theme.js\";\n\ninterface Props {\n text: string;\n theme: Theme;\n}\n\ninterface InlineSegment {\n kind: \"plain\" | \"bold\" | \"italic\" | \"code\";\n text: string;\n}\n\nexport function MD({ text, theme }: Props) {\n const blocks = parseBlocks(text);\n return (\n <Box flexDirection=\"column\">\n {blocks.map((b, i) => (\n <Block key={i} block={b} theme={theme} />\n ))}\n </Box>\n );\n}\n\ntype Block =\n | { kind: \"paragraph\"; text: string }\n | { kind: \"heading\"; level: 1 | 2 | 3; text: string }\n | { kind: \"bullet\"; items: string[] }\n | { kind: \"quote\"; text: string }\n | { kind: \"code\"; lang?: string; text: string }\n | { kind: \"blank\" };\n\nfunction parseBlocks(src: string): Block[] {\n const out: Block[] = [];\n const lines = src.split(\"\\n\");\n let i = 0;\n while (i < lines.length) {\n const line = lines[i]!;\n if (line.trim() === \"\") {\n out.push({ kind: \"blank\" });\n i++;\n continue;\n }\n const fence = line.match(/^```(\\w*)\\s*$/);\n if (fence) {\n const lang = fence[1] || undefined;\n const start = i + 1;\n let end = start;\n while (end < lines.length && !/^```\\s*$/.test(lines[end]!)) end++;\n out.push({ kind: \"code\", lang, text: lines.slice(start, end).join(\"\\n\") });\n i = end + 1;\n continue;\n }\n const heading = line.match(/^(#{1,3})\\s+(.*)$/);\n if (heading) {\n out.push({ kind: \"heading\", level: heading[1]!.length as 1 | 2 | 3, text: heading[2]! });\n i++;\n continue;\n }\n if (/^\\s*>\\s?/.test(line)) {\n const quoteLines: string[] = [];\n while (i < lines.length && /^\\s*>\\s?/.test(lines[i]!)) {\n quoteLines.push(lines[i]!.replace(/^\\s*>\\s?/, \"\"));\n i++;\n }\n out.push({ kind: \"quote\", text: quoteLines.join(\"\\n\") });\n continue;\n }\n if (/^\\s*[-*]\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\s*[-*]\\s+/.test(lines[i]!)) {\n items.push(lines[i]!.replace(/^\\s*[-*]\\s+/, \"\"));\n i++;\n }\n out.push({ kind: \"bullet\", items });\n continue;\n }\n const paraLines: string[] = [line];\n i++;\n while (\n i < lines.length &&\n lines[i]!.trim() !== \"\" &&\n !/^(#{1,3})\\s+/.test(lines[i]!) &&\n !/^\\s*[-*]\\s+/.test(lines[i]!) &&\n !/^\\s*>\\s?/.test(lines[i]!) &&\n !/^```/.test(lines[i]!)\n ) {\n paraLines.push(lines[i]!);\n i++;\n }\n out.push({ kind: \"paragraph\", text: paraLines.join(\"\\n\") });\n }\n return out;\n}\n\nfunction Block({ block, theme }: { block: Block; theme: Theme }) {\n if (block.kind === \"blank\") return <Text> </Text>;\n if (block.kind === \"heading\") {\n return (\n <Box marginTop={block.level === 1 ? 1 : 0}>\n <Text bold color={theme.accent}>\n {renderInline(block.text, theme)}\n </Text>\n </Box>\n );\n }\n if (block.kind === \"bullet\") {\n return (\n <Box flexDirection=\"column\">\n {block.items.map((item, i) => (\n <Box key={i}>\n <Text color={theme.accent}> • </Text>\n <Text>{renderInline(item, theme)}</Text>\n </Box>\n ))}\n </Box>\n );\n }\n if (block.kind === \"quote\") {\n return (\n <Box marginLeft={2}>\n <Text color={theme.info.color} dimColor={theme.info.dim} italic>\n {renderInline(block.text, theme)}\n </Text>\n </Box>\n );\n }\n if (block.kind === \"code\") {\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n {block.text.split(\"\\n\").map((l, i) => (\n <Text key={i} color={theme.tool}>\n {l}\n </Text>\n ))}\n </Box>\n );\n }\n return <Text>{renderInline(block.text, theme)}</Text>;\n}\n\nfunction renderInline(src: string, theme: Theme): React.ReactNode {\n const segments = parseInline(src);\n return segments.map((seg, i) => {\n if (seg.kind === \"bold\") return <Text key={i} bold>{seg.text}</Text>;\n if (seg.kind === \"italic\") return <Text key={i} italic>{seg.text}</Text>;\n if (seg.kind === \"code\") return <Text key={i} color={theme.tool}>{seg.text}</Text>;\n return <Text key={i}>{seg.text}</Text>;\n });\n}\n\nfunction parseInline(src: string): InlineSegment[] {\n const out: InlineSegment[] = [];\n let i = 0;\n let buf = \"\";\n const flush = () => {\n if (buf) {\n out.push({ kind: \"plain\", text: buf });\n buf = \"\";\n }\n };\n while (i < src.length) {\n const ch = src[i]!;\n if (ch === \"`\") {\n const end = src.indexOf(\"`\", i + 1);\n if (end > i) {\n flush();\n out.push({ kind: \"code\", text: src.slice(i + 1, end) });\n i = end + 1;\n continue;\n }\n }\n if (ch === \"*\" && src[i + 1] === \"*\") {\n const end = src.indexOf(\"**\", i + 2);\n if (end > i + 1) {\n flush();\n out.push({ kind: \"bold\", text: src.slice(i + 2, end) });\n i = end + 2;\n continue;\n }\n }\n if (ch === \"_\" && src[i + 1] === \"_\") {\n const end = src.indexOf(\"__\", i + 2);\n if (end > i + 1) {\n flush();\n out.push({ kind: \"bold\", text: src.slice(i + 2, end) });\n i = end + 2;\n continue;\n }\n }\n if (ch === \"*\" && src[i + 1] !== \"*\") {\n const end = src.indexOf(\"*\", i + 1);\n if (end > i) {\n flush();\n out.push({ kind: \"italic\", text: src.slice(i + 1, end) });\n i = end + 1;\n continue;\n }\n }\n if (ch === \"_\" && !/\\w/.test(src[i - 1] ?? \"\") && src[i + 1] !== \"_\") {\n const end = src.indexOf(\"_\", i + 1);\n if (end > i && !/\\w/.test(src[end + 1] ?? \"\")) {\n flush();\n out.push({ kind: \"italic\", text: src.slice(i + 1, end) });\n i = end + 1;\n continue;\n }\n }\n buf += ch;\n i++;\n }\n flush();\n return out;\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { ToolView, type ToolEventState } from \"./tool-view.js\";\nimport { MD } from \"./markdown.js\";\nimport type { Theme } from \"./theme.js\";\n\nexport type ChatEvent =\n | { kind: \"user\"; key: string; text: string }\n | {\n kind: \"assistant\";\n key: string;\n id: number;\n text: string;\n reasoning: string;\n streaming: boolean;\n }\n | ({ kind: \"tool\"; key: string } & ToolEventState)\n | { kind: \"info\"; key: string; text: string }\n | { kind: \"error\"; key: string; text: string };\n\ninterface Props {\n events: ChatEvent[];\n showReasoning: boolean;\n theme: Theme;\n verbose?: boolean;\n}\n\nexport function ChatView({ events, showReasoning, theme, verbose }: Props) {\n return (\n <Box flexDirection=\"column\">\n {events.map((e) => (\n <EventView key={e.key} evt={e} showReasoning={showReasoning} theme={theme} verbose={verbose} />\n ))}\n </Box>\n );\n}\n\nfunction EventView({ evt, showReasoning, theme, verbose }: { evt: ChatEvent; showReasoning: boolean; theme: Theme; verbose?: boolean }) {\n if (evt.kind === \"user\") {\n return (\n <Box marginTop={1}>\n <Text color={theme.user}>› </Text>\n <Text>{evt.text}</Text>\n </Box>\n );\n }\n if (evt.kind === \"assistant\") {\n return (\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={1}>\n {showReasoning && evt.reasoning ? (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text color={theme.reasoning.color} dimColor={theme.reasoning.dim}>\n ✧ thinking: {evt.reasoning.length > 400 ? evt.reasoning.slice(0, 400) + \"…\" : evt.reasoning}\n </Text>\n </Box>\n ) : null}\n {evt.text ? <MD text={evt.text} theme={theme} /> : null}\n </Box>\n );\n }\n if (evt.kind === \"tool\") {\n return <ToolView evt={evt} verbose={verbose} />;\n }\n if (evt.kind === \"info\") {\n return (\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {evt.text}\n </Text>\n );\n }\n return <Text color={theme.error}>! {evt.text}</Text>;\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { Usage } from \"../agent/messages.js\";\nimport type { Theme } from \"./theme.js\";\nimport type { ReasoningEffort } from \"../config.js\";\nimport type { Mode } from \"../mode.js\";\n\ninterface Props {\n model: string;\n usage: Usage | null;\n thinking: boolean;\n hint?: string;\n theme: Theme;\n mode: Mode;\n effort: ReasoningEffort;\n contextLimit: number;\n}\n\nconst PRICE_IN_PER_M = 0.95;\nconst PRICE_IN_CACHED_PER_M = 0.16;\nconst PRICE_OUT_PER_M = 4.0;\n\nexport function StatusBar({ model, usage, thinking, hint, theme, mode, effort, contextLimit }: Props) {\n const parts: string[] = [`model: ${shortModel(model)}`, `effort: ${effort}`];\n if (usage) {\n const cached = usage.prompt_tokens_details?.cached_tokens ?? 0;\n const uncachedIn = usage.prompt_tokens - cached;\n const cost =\n (uncachedIn * PRICE_IN_PER_M) / 1_000_000 +\n (cached * PRICE_IN_CACHED_PER_M) / 1_000_000 +\n (usage.completion_tokens * PRICE_OUT_PER_M) / 1_000_000;\n const pct = Math.round((usage.prompt_tokens / contextLimit) * 100);\n parts.push(\n `in: ${usage.prompt_tokens}${cached ? ` (${cached} cached)` : \"\"}`,\n `out: ${usage.completion_tokens}`,\n `ctx: ${pct}%`,\n `$${cost.toFixed(5)}`,\n );\n }\n if (thinking) parts.push(\"thinking…\");\n if (hint) parts.push(hint);\n\n const modeColor =\n mode === \"plan\" ? theme.modeBadge.plan : mode === \"auto\" ? theme.modeBadge.auto : theme.modeBadge.edit;\n const warn = usage && usage.prompt_tokens / contextLimit >= 0.8;\n\n return (\n <Box>\n <Text color={modeColor} bold>\n [{mode}]\n </Text>\n <Text> </Text>\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {parts.join(\" · \")}\n </Text>\n {warn ? (\n <Text color={theme.warn} bold>\n {\" · \"}/compact recommended\n </Text>\n ) : null}\n </Box>\n );\n}\n\nfunction shortModel(m: string): string {\n const last = m.split(\"/\").at(-1) ?? m;\n return last;\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport type { ToolSpec } from \"../tools/registry.js\";\nimport type { PermissionDecision } from \"../tools/executor.js\";\nimport { DiffView } from \"./diff-view.js\";\nimport type { Theme } from \"./theme.js\";\n\ninterface Props {\n tool: ToolSpec;\n args: Record<string, unknown>;\n onDecide: (decision: PermissionDecision) => void;\n theme: Theme;\n}\n\nexport function PermissionModal({ tool, args, onDecide, theme }: Props) {\n const render = tool.render?.(args);\n const items = [\n { label: \"Allow once\", value: \"allow\" as const },\n { label: \"Allow for this session\", value: \"allow_session\" as const },\n { label: \"Deny\", value: \"deny\" as const },\n ];\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.permission} paddingX={1}>\n <Text color={theme.permission} bold>\n Permission requested\n </Text>\n <Text>\n tool: <Text color={theme.tool}>{tool.name}</Text>\n </Text>\n {render?.title ? <Text>action: {render.title}</Text> : null}\n {render?.diff ? (\n <Box marginTop={1} flexDirection=\"column\">\n <DiffView {...render.diff} />\n </Box>\n ) : (\n <Text color={theme.info.color} dimColor={theme.info.dim}>args: {JSON.stringify(args)}</Text>\n )}\n <Box marginTop={1}>\n <SelectInput items={items} onSelect={(item) => onDecide(item.value)} />\n </Box>\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport type { SessionSummary } from \"../sessions.js\";\nimport type { Theme } from \"./theme.js\";\n\ninterface Props {\n sessions: SessionSummary[];\n onPick: (session: SessionSummary | null) => void;\n theme: Theme;\n}\n\nexport function ResumePicker({ sessions, onPick, theme }: Props) {\n if (sessions.length === 0) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.accent} paddingX={1}>\n <Text color={theme.accent} bold>\n Resume a session\n </Text>\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n No saved sessions yet. Press Enter to dismiss.\n </Text>\n <Box marginTop={1}>\n <SelectInput\n items={[{ label: \"(back)\", value: \"__cancel__\" }]}\n onSelect={() => onPick(null)}\n />\n </Box>\n </Box>\n );\n }\n\n const items = sessions.map((s) => ({\n label: `${formatDate(s.updatedAt)} · ${s.messageCount} msgs · ${s.firstPrompt}`,\n value: s.id,\n }));\n items.push({ label: \"(cancel)\", value: \"__cancel__\" });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.accent} paddingX={1}>\n <Text color={theme.accent} bold>\n Resume a session\n </Text>\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n Arrow keys to select, Enter to confirm.\n </Text>\n <Box marginTop={1}>\n <SelectInput\n items={items}\n onSelect={(item) => {\n if (item.value === \"__cancel__\") return onPick(null);\n const picked = sessions.find((s) => s.id === item.value) ?? null;\n onPick(picked);\n }}\n />\n </Box>\n </Box>\n );\n}\n\nfunction formatDate(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n } catch {\n return iso;\n }\n}\n","import React, { useEffect, useState } from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { Task } from \"../tasks-state.js\";\nimport type { Theme } from \"./theme.js\";\n\ninterface Props {\n tasks: Task[];\n theme: Theme;\n startedAt: number | null;\n tokensDelta: number;\n}\n\nconst MAX_VISIBLE = 6;\n\nexport function TaskList({ tasks, theme, startedAt, tokensDelta }: Props) {\n const [now, setNow] = useState(Date.now());\n\n useEffect(() => {\n if (startedAt === null) return;\n const allDone = tasks.length > 0 && tasks.every((t) => t.status === \"completed\");\n if (allDone) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [startedAt, tasks]);\n\n if (tasks.length === 0) return null;\n\n const active = tasks.find((t) => t.status === \"in_progress\");\n const done = tasks.filter((t) => t.status === \"completed\").length;\n const total = tasks.length;\n const allDone = done === total;\n\n const header = active\n ? active.title\n : allDone\n ? `Done (${total} tasks)`\n : `Tasks (${done}/${total})`;\n\n const elapsed = startedAt ? formatElapsed(now - startedAt) : null;\n const headerStats = [elapsed, tokensDelta > 0 ? `↑ ${formatTokens(tokensDelta)} tokens` : null]\n .filter(Boolean)\n .join(\" · \");\n\n const visibleTasks = tasks.slice(0, MAX_VISIBLE);\n const hiddenPending = Math.max(0, tasks.length - visibleTasks.length);\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={allDone ? \"green\" : theme.accent} bold>\n {allDone ? \"✓\" : \"▸\"} {header}\n </Text>\n {headerStats && (\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {\" \"}({headerStats})\n </Text>\n )}\n </Box>\n {visibleTasks.map((t) => (\n <TaskRow key={t.id} task={t} theme={theme} />\n ))}\n {hiddenPending > 0 && (\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {\" \"}… +{hiddenPending} more\n </Text>\n )}\n </Box>\n );\n}\n\nfunction TaskRow({ task, theme }: { task: Task; theme: Theme }) {\n if (task.status === \"completed\") {\n return (\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {\" \"}✓ <Text strikethrough>{task.title}</Text>\n </Text>\n );\n }\n if (task.status === \"in_progress\") {\n return (\n <Text color={theme.accent} bold>\n {\" \"}■ {task.title}\n </Text>\n );\n }\n return (\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {\" \"}☐ {task.title}\n </Text>\n );\n}\n\nfunction formatElapsed(ms: number): string {\n const total = Math.floor(ms / 1000);\n const m = Math.floor(total / 60);\n const s = total % 60;\n if (m === 0) return `${s}s`;\n return `${m}m ${s}s`;\n}\n\nfunction formatTokens(n: number): string {\n if (n < 1000) return String(n);\n return `${(n / 1000).toFixed(1)}k`;\n}\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport { Text, useInput } from \"ink\";\nimport chalk from \"chalk\";\n\ninterface Props {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (value: string, display?: string) => void;\n onHistoryUp?: () => void;\n onHistoryDown?: () => void;\n onClearQueueItem?: (text: string) => void;\n focus?: boolean;\n mask?: string;\n enablePaste?: boolean;\n}\n\nconst PASTE_CHAR_THRESHOLD = 200;\nconst PASTE_NEWLINE_THRESHOLD = 3;\n\nfunction shouldTreatAsPaste(input: string): boolean {\n if (input.length >= PASTE_CHAR_THRESHOLD) return true;\n const newlines = (input.match(/\\n/g) ?? []).length;\n return newlines >= PASTE_NEWLINE_THRESHOLD;\n}\n\nfunction newPasteId(): string {\n return Math.random().toString(36).slice(2, 7);\n}\n\nfunction countLines(s: string): number {\n return s.split(\"\\n\").length;\n}\n\nfunction findWordBoundaryForward(text: string, pos: number): number {\n while (pos < text.length && /\\w/.test(text[pos]!)) pos++;\n while (pos < text.length && !/\\w/.test(text[pos]!)) pos++;\n return pos;\n}\n\nfunction findWordBoundaryBackward(text: string, pos: number): number {\n while (pos > 0 && !/\\w/.test(text[pos - 1]!)) pos--;\n while (pos > 0 && /\\w/.test(text[pos - 1]!)) pos--;\n return pos;\n}\n\nexport function CustomTextInput({\n value,\n onChange,\n onSubmit,\n onHistoryUp,\n onHistoryDown,\n onClearQueueItem,\n focus = true,\n mask,\n enablePaste = false,\n}: Props) {\n const [cursorOffset, setCursorOffset] = useState(value.length);\n const pastesRef = useRef<Map<string, string>>(new Map());\n\n useEffect(() => {\n if (!focus) return;\n setCursorOffset((prev) => (prev > value.length ? value.length : prev));\n }, [value, focus]);\n\n useInput(\n (input, key) => {\n if (!focus) return;\n\n if (key.ctrl && input === \"c\") return;\n if (key.ctrl && input === \"r\") return;\n if (key.ctrl && input === \"o\") return;\n if (key.tab) return;\n\n if (key.return) {\n let full = value;\n let hasPastes = false;\n if (enablePaste && pastesRef.current.size > 0) {\n for (const [placeholder, fullText] of pastesRef.current) {\n if (full.includes(placeholder)) {\n full = full.split(placeholder).join(fullText);\n hasPastes = true;\n }\n }\n }\n onSubmit(full, hasPastes ? value : undefined);\n pastesRef.current.clear();\n setCursorOffset(0);\n return;\n }\n\n if (key.upArrow) {\n onHistoryUp?.();\n return;\n }\n\n if (key.downArrow) {\n onHistoryDown?.();\n return;\n }\n\n let nextCursor = cursorOffset;\n let nextValue = value;\n let didDelete = false;\n\n if (key.leftArrow) {\n if (key.meta) {\n nextCursor = findWordBoundaryBackward(value, cursorOffset);\n } else {\n nextCursor = cursorOffset - 1;\n }\n } else if (key.rightArrow) {\n if (key.meta) {\n nextCursor = findWordBoundaryForward(value, cursorOffset);\n } else {\n nextCursor = cursorOffset + 1;\n }\n } else if (key.meta && input === \"b\") {\n nextCursor = findWordBoundaryBackward(value, cursorOffset);\n } else if (key.meta && input === \"f\") {\n nextCursor = findWordBoundaryForward(value, cursorOffset);\n } else if (key.meta && input === \"d\") {\n didDelete = true;\n const boundary = findWordBoundaryForward(value, cursorOffset);\n nextValue = value.slice(0, cursorOffset) + value.slice(boundary);\n } else if (key.home || (key.ctrl && input === \"a\")) {\n nextCursor = 0;\n } else if (key.end || (key.ctrl && input === \"e\")) {\n nextCursor = value.length;\n } else if (key.backspace) {\n didDelete = true;\n const tokenBoundary = enablePaste\n ? findPasteTokenEndingAt(value, cursorOffset, pastesRef.current)\n : -1;\n if (tokenBoundary >= 0) {\n const token = value.slice(tokenBoundary, cursorOffset);\n pastesRef.current.delete(token);\n nextValue = value.slice(0, tokenBoundary) + value.slice(cursorOffset);\n nextCursor = tokenBoundary;\n } else if (key.meta || (key.ctrl && input === \"w\")) {\n const boundary = findWordBoundaryBackward(value, cursorOffset);\n nextValue = value.slice(0, boundary) + value.slice(cursorOffset);\n nextCursor = boundary;\n } else if (key.ctrl) {\n const boundary = findWordBoundaryBackward(value, cursorOffset);\n nextValue = value.slice(0, boundary) + value.slice(cursorOffset);\n nextCursor = boundary;\n } else {\n if (cursorOffset > 0) {\n nextValue = value.slice(0, cursorOffset - 1) + value.slice(cursorOffset);\n nextCursor = cursorOffset - 1;\n }\n }\n } else if (key.delete) {\n didDelete = true;\n if (key.meta || key.ctrl) {\n const boundary = findWordBoundaryForward(value, cursorOffset);\n nextValue = value.slice(0, cursorOffset) + value.slice(boundary);\n } else {\n nextValue = value.slice(0, cursorOffset) + value.slice(cursorOffset + 1);\n }\n } else if (key.ctrl && input === \"w\") {\n didDelete = true;\n const boundary = findWordBoundaryBackward(value, cursorOffset);\n nextValue = value.slice(0, boundary) + value.slice(cursorOffset);\n nextCursor = boundary;\n } else if (key.ctrl && input === \"u\") {\n didDelete = true;\n nextValue = value.slice(cursorOffset);\n nextCursor = 0;\n } else if (key.ctrl && input === \"k\") {\n didDelete = true;\n nextValue = value.slice(0, cursorOffset);\n } else if (input.length > 0 && !key.ctrl && !key.meta) {\n let toInsert = input;\n if (enablePaste && shouldTreatAsPaste(input)) {\n const lines = countLines(input);\n const id = newPasteId();\n const placeholder = `[pasted ${lines} line${lines === 1 ? \"\" : \"s\"} #${id}]`;\n pastesRef.current.set(placeholder, input);\n toInsert = placeholder;\n }\n nextValue = value.slice(0, cursorOffset) + toInsert + value.slice(cursorOffset);\n nextCursor = cursorOffset + toInsert.length;\n }\n\n if (nextCursor < 0) nextCursor = 0;\n if (nextCursor > nextValue.length) nextCursor = nextValue.length;\n\n if (didDelete && nextValue === \"\" && value !== \"\") {\n onClearQueueItem?.(value);\n }\n\n if (nextCursor !== cursorOffset) {\n setCursorOffset(nextCursor);\n }\n if (nextValue !== value) {\n onChange(nextValue);\n }\n },\n { isActive: focus },\n );\n\n const displayValue = mask ? mask.repeat(value.length) : value;\n\n let renderedValue = \"\";\n let i = 0;\n for (const char of displayValue) {\n renderedValue += i === cursorOffset ? chalk.inverse(char) : char;\n i++;\n }\n if (displayValue.length === 0) {\n renderedValue = chalk.inverse(\" \");\n } else if (cursorOffset === displayValue.length) {\n renderedValue += chalk.inverse(\" \");\n }\n\n return <Text>{renderedValue}</Text>;\n}\n\nfunction findPasteTokenEndingAt(\n value: string,\n pos: number,\n pastes: Map<string, string>,\n): number {\n if (pos <= 0 || value[pos - 1] !== \"]\") return -1;\n for (const placeholder of pastes.keys()) {\n if (placeholder.length > pos) continue;\n const start = pos - placeholder.length;\n if (value.slice(start, pos) === placeholder) return start;\n }\n return -1;\n}\n","import { readFile, writeFile, mkdir, access } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\nconst NPM_REGISTRY = \"https://registry.npmjs.org/kimiflare/latest\";\n\ninterface CacheEntry {\n checkedAt: number;\n latestVersion: string;\n hasUpdate: boolean;\n}\n\nfunction cachePath(): string {\n const xdg = process.env.XDG_CONFIG_HOME || join(homedir(), \".config\");\n return join(xdg, \"kimiflare\", \"update-check.json\");\n}\n\nfunction localPackageJsonPath(): string {\n // When bundled, __dirname is dist/. Go up one level to find package.json.\n const here = dirname(fileURLToPath(import.meta.url));\n return join(here, \"..\", \"..\", \"package.json\");\n}\n\nasync function readLocalVersion(): Promise<string | null> {\n try {\n const raw = await readFile(localPackageJsonPath(), \"utf8\");\n const parsed = JSON.parse(raw) as { version?: string };\n return parsed.version ?? null;\n } catch {\n return null;\n }\n}\n\nasync function readCache(): Promise<CacheEntry | null> {\n try {\n const raw = await readFile(cachePath(), \"utf8\");\n const parsed = JSON.parse(raw) as CacheEntry;\n if (Date.now() - parsed.checkedAt < CACHE_TTL_MS) {\n return parsed;\n }\n } catch {\n /* cache missing or expired */\n }\n return null;\n}\n\nasync function writeCache(entry: CacheEntry): Promise<void> {\n const p = cachePath();\n await mkdir(dirname(p), { recursive: true });\n await writeFile(p, JSON.stringify(entry), \"utf8\");\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(NPM_REGISTRY, {\n headers: { \"User-Agent\": \"kimiflare-update-checker\", Accept: \"application/json\" },\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nfunction stripV(v: string): string {\n return v.startsWith(\"v\") ? v.slice(1) : v;\n}\n\nfunction isNewer(local: string, remote: string): boolean {\n const a = stripV(local).split(\".\").map(Number);\n const b = stripV(remote).split(\".\").map(Number);\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n if (av < bv) return true;\n if (av > bv) return false;\n }\n return false;\n}\n\nexport interface UpdateCheckResult {\n hasUpdate: boolean;\n localVersion: string | null;\n latestVersion: string | null;\n}\n\nexport async function checkForUpdate(): Promise<UpdateCheckResult> {\n const localVersion = await readLocalVersion();\n if (!localVersion) return { hasUpdate: false, localVersion: null, latestVersion: null };\n\n const cached = await readCache();\n if (cached) {\n return { hasUpdate: cached.hasUpdate, localVersion, latestVersion: cached.latestVersion };\n }\n\n const latestVersion = await fetchLatestVersion();\n if (!latestVersion) {\n return { hasUpdate: false, localVersion, latestVersion: null };\n }\n\n const hasUpdate = isNewer(localVersion, latestVersion);\n await writeCache({ checkedAt: Date.now(), latestVersion, hasUpdate });\n return { hasUpdate, localVersion, latestVersion };\n}\n\nexport async function isGitRepo(): Promise<boolean> {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n await access(join(here, \"..\", \"..\", \".git\"));\n return true;\n } catch {\n return false;\n }\n}\n","import React, { useState } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { CustomTextInput } from \"./text-input.js\";\nimport { saveConfig, DEFAULT_MODEL } from \"../config.js\";\n\ninterface Props {\n onDone: (cfg: { accountId: string; apiToken: string; model: string }) => void;\n}\n\ntype Step = \"accountId\" | \"apiToken\" | \"model\" | \"confirm\";\n\nexport function Onboarding({ onDone }: Props) {\n const [step, setStep] = useState<Step>(\"accountId\");\n const [accountId, setAccountId] = useState(\"\");\n const [apiToken, setApiToken] = useState(\"\");\n const [model, setModel] = useState(DEFAULT_MODEL);\n const [savedPath, setSavedPath] = useState<string | null>(null);\n\n const handleAccountIdSubmit = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) return;\n setAccountId(trimmed);\n setStep(\"apiToken\");\n };\n\n const handleApiTokenSubmit = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) return;\n setApiToken(trimmed);\n setStep(\"model\");\n };\n\n const handleModelSubmit = (value: string) => {\n const trimmed = value.trim() || DEFAULT_MODEL;\n setModel(trimmed);\n setStep(\"confirm\");\n };\n\n const handleConfirm = async () => {\n const cfg = { accountId, apiToken, model };\n try {\n const path = await saveConfig(cfg);\n setSavedPath(path);\n onDone(cfg);\n } catch (e) {\n setSavedPath(`error: ${(e as Error).message}`);\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"cyan\">\n Welcome to kimiflare!\n </Text>\n <Text color=\"gray\" dimColor>\n Terminal coding agent powered by Kimi-K2.6 on Cloudflare Workers AI.\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n {step === \"accountId\" && (\n <>\n <Text>Enter your Cloudflare Account ID:</Text>\n <Box>\n <Text color=\"cyan\">› </Text>\n <CustomTextInput\n value={accountId}\n onChange={setAccountId}\n onSubmit={handleAccountIdSubmit}\n />\n </Box>\n </>\n )}\n\n {step === \"apiToken\" && (\n <>\n <Text>Enter your Cloudflare API Token:</Text>\n <Text color=\"gray\" dimColor>\n Create one at https://dash.cloudflare.com/profile/api-tokens\n </Text>\n <Box>\n <Text color=\"cyan\">› </Text>\n <CustomTextInput\n value={apiToken}\n onChange={setApiToken}\n onSubmit={handleApiTokenSubmit}\n mask=\"•\"\n />\n </Box>\n </>\n )}\n\n {step === \"model\" && (\n <>\n <Text>Model ID (press Enter for default):</Text>\n <Text color=\"gray\" dimColor>\n default: {DEFAULT_MODEL}\n </Text>\n <Box>\n <Text color=\"cyan\">› </Text>\n <CustomTextInput\n value={model}\n onChange={setModel}\n onSubmit={handleModelSubmit}\n />\n </Box>\n </>\n )}\n\n {step === \"confirm\" && (\n <>\n <Text>Ready to save configuration:</Text>\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text color=\"gray\">Account ID: {accountId}</Text>\n <Text color=\"gray\">API Token: {\"•\".repeat(apiToken.length)}</Text>\n <Text color=\"gray\">Model: {model}</Text>\n </Box>\n <Box marginTop={1}>\n <Text>Press Enter to confirm, or Ctrl+C to cancel</Text>\n </Box>\n <Box>\n <Text color=\"cyan\">› </Text>\n <CustomTextInput\n value=\"\"\n onChange={() => {}}\n onSubmit={handleConfirm}\n />\n </Box>\n </>\n )}\n\n {savedPath && (\n <Text color=\"green\">\n Config saved to {savedPath}\n </Text>\n )}\n </Box>\n </Box>\n );\n}\n","export type ColorName = string;\n\nexport interface DimColor {\n color: ColorName;\n dim: boolean;\n}\n\nexport interface Theme {\n name: string;\n label: string;\n user: ColorName;\n assistant: ColorName | undefined;\n reasoning: DimColor;\n info: DimColor;\n error: ColorName;\n warn: ColorName;\n tool: ColorName;\n spinner: ColorName;\n permission: ColorName;\n queue: DimColor;\n accent: ColorName;\n modeBadge: { plan: ColorName; auto: ColorName; edit: ColorName };\n}\n\nconst dark: Theme = {\n name: \"dark\",\n label: \"dark (default — for dark terminals)\",\n user: \"cyan\",\n assistant: undefined,\n reasoning: { color: \"gray\", dim: false },\n info: { color: \"gray\", dim: false },\n error: \"red\",\n warn: \"yellow\",\n tool: \"magenta\",\n spinner: \"yellow\",\n permission: \"yellow\",\n queue: { color: \"gray\", dim: false },\n accent: \"cyan\",\n modeBadge: { plan: \"blue\", auto: \"green\", edit: \"cyan\" },\n};\n\nconst light: Theme = {\n name: \"light\",\n label: \"light (for bright terminal backgrounds)\",\n user: \"blue\",\n assistant: undefined,\n reasoning: { color: \"blackBright\", dim: false },\n info: { color: \"blackBright\", dim: false },\n error: \"red\",\n warn: \"magenta\",\n tool: \"magenta\",\n spinner: \"blue\",\n permission: \"magenta\",\n queue: { color: \"blackBright\", dim: false },\n accent: \"blue\",\n modeBadge: { plan: \"blue\", auto: \"green\", edit: \"magenta\" },\n};\n\nconst highContrast: Theme = {\n name: \"high-contrast\",\n label: \"high-contrast (bold, bright colors for low-vision)\",\n user: \"cyanBright\",\n assistant: \"whiteBright\",\n reasoning: { color: \"whiteBright\", dim: false },\n info: { color: \"whiteBright\", dim: false },\n error: \"redBright\",\n warn: \"yellowBright\",\n tool: \"magentaBright\",\n spinner: \"yellowBright\",\n permission: \"yellowBright\",\n queue: { color: \"whiteBright\", dim: false },\n accent: \"cyanBright\",\n modeBadge: { plan: \"blueBright\", auto: \"greenBright\", edit: \"cyanBright\" },\n};\n\nexport const THEMES: Record<string, Theme> = {\n dark,\n light,\n \"high-contrast\": highContrast,\n};\n\nexport const DEFAULT_THEME_NAME = \"dark\";\n\nexport function resolveTheme(name: string | undefined): Theme {\n if (!name) return THEMES[DEFAULT_THEME_NAME]!;\n return THEMES[name] ?? THEMES[DEFAULT_THEME_NAME]!;\n}\n\nexport function themeNames(): string[] {\n return Object.keys(THEMES);\n}\n","import { readFile, writeFile, mkdir, readdir, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ChatMessage } from \"./agent/messages.js\";\n\nexport interface SessionSummary {\n id: string;\n filePath: string;\n cwd: string;\n firstPrompt: string;\n messageCount: number;\n updatedAt: string;\n}\n\nexport interface SessionFile {\n id: string;\n cwd: string;\n model: string;\n createdAt: string;\n updatedAt: string;\n messages: ChatMessage[];\n}\n\nfunction sessionsDir(): string {\n const xdg = process.env.XDG_DATA_HOME || join(homedir(), \".local\", \"share\");\n return join(xdg, \"kimiflare\", \"sessions\");\n}\n\nfunction sanitize(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 40);\n}\n\nexport function makeSessionId(firstPrompt: string): string {\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n const slug = sanitize(firstPrompt) || \"session\";\n return `${ts}_${slug}`;\n}\n\nexport async function saveSession(file: SessionFile): Promise<string> {\n const dir = sessionsDir();\n await mkdir(dir, { recursive: true });\n const path = join(dir, `${file.id}.json`);\n await writeFile(path, JSON.stringify(file, null, 2), \"utf8\");\n return path;\n}\n\nexport async function listSessions(limit = 30): Promise<SessionSummary[]> {\n const dir = sessionsDir();\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return [];\n }\n\n const summaries: SessionSummary[] = [];\n for (const name of entries) {\n if (!name.endsWith(\".json\")) continue;\n const path = join(dir, name);\n try {\n const [s, raw] = await Promise.all([stat(path), readFile(path, \"utf8\")]);\n const parsed = JSON.parse(raw) as SessionFile;\n const firstUser = parsed.messages.find((m) => m.role === \"user\");\n const firstPrompt =\n typeof firstUser?.content === \"string\" ? firstUser.content : \"(no prompt)\";\n summaries.push({\n id: parsed.id,\n filePath: path,\n cwd: parsed.cwd,\n firstPrompt: firstPrompt.slice(0, 80),\n messageCount: parsed.messages.filter((m) => m.role !== \"system\").length,\n updatedAt: parsed.updatedAt ?? s.mtime.toISOString(),\n });\n } catch {\n /* skip unreadable */\n }\n }\n summaries.sort((a, b) => (b.updatedAt < a.updatedAt ? -1 : 1));\n return summaries.slice(0, limit);\n}\n\nexport async function loadSession(filePath: string): Promise<SessionFile> {\n const raw = await readFile(filePath, \"utf8\");\n return JSON.parse(raw) as SessionFile;\n}\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { Box, Text, useApp, useInput, render } from \"ink\";\nimport Spinner from \"ink-spinner\";\nimport { runAgentTurn } from \"./agent/loop.js\";\nimport { buildSystemPrompt } from \"./agent/system-prompt.js\";\nimport { compactMessages } from \"./agent/compact.js\";\nimport { ToolExecutor, ALL_TOOLS, type PermissionDecision } from \"./tools/executor.js\";\nimport type { ToolSpec } from \"./tools/registry.js\";\nimport type { ChatMessage, Usage } from \"./agent/messages.js\";\nimport { ChatView, type ChatEvent } from \"./ui/chat.js\";\nimport { StatusBar } from \"./ui/status.js\";\nimport { PermissionModal } from \"./ui/permission.js\";\nimport { ResumePicker } from \"./ui/resume-picker.js\";\nimport { TaskList } from \"./ui/task-list.js\";\nimport type { Task } from \"./tasks-state.js\";\nimport { loadContextFile } from \"./agent/system-prompt.js\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ToolRender } from \"./tools/registry.js\";\nimport { CustomTextInput } from \"./ui/text-input.js\";\nimport { checkForUpdate, isGitRepo, type UpdateCheckResult } from \"./util/update-check.js\";\nimport { Onboarding } from \"./ui/onboarding.js\";\nimport {\n configPath,\n DEFAULT_MODEL,\n DEFAULT_REASONING_EFFORT,\n saveConfig,\n type ReasoningEffort,\n} from \"./config.js\";\nimport { resolveTheme, themeNames, type Theme } from \"./ui/theme.js\";\nimport { nextMode, type Mode, isBlockedInPlanMode } from \"./mode.js\";\nimport {\n listSessions,\n loadSession,\n makeSessionId,\n saveSession,\n type SessionSummary,\n} from \"./sessions.js\";\nimport { unlink } from \"node:fs/promises\";\n\ninterface Cfg {\n accountId: string;\n apiToken: string;\n model: string;\n theme?: string;\n reasoningEffort?: ReasoningEffort;\n}\n\ninterface PendingPermission {\n tool: ToolSpec;\n args: Record<string, unknown>;\n resolve: (d: PermissionDecision) => void;\n}\n\nconst CONTEXT_LIMIT = 262_000;\nconst AUTO_COMPACT_SUGGEST_PCT = 0.8;\n\nlet nextAssistantId = 1;\nlet nextKey = 1;\nconst mkKey = () => `evt_${nextKey++}`;\n\nconst EFFORT_DESCRIPTIONS: Record<ReasoningEffort, string> = {\n low: \"low — fastest; lightest reasoning. Best for simple Q&A, small edits, quick coordination.\",\n medium: \"medium — balanced (default). Solid quality on most edits, fast on trivial prompts.\",\n high: \"high — deepest reasoning; slowest. Best for complex debugging, architecture, multi-file refactors.\",\n};\n\nfunction App({ initialCfg }: { initialCfg: Cfg | null }) {\n const { exit } = useApp();\n const [cfg, setCfg] = useState<Cfg | null>(initialCfg);\n const [events, setEvents] = useState<ChatEvent[]>(() => {\n const initial: ChatEvent[] = [\n { kind: \"info\", key: mkKey(), text: \"kimiflare · /help for commands · ctrl-c to exit · shift+tab to cycle modes\" },\n ];\n const ctxFile = loadContextFile(process.cwd());\n if (ctxFile) {\n initial.push({\n kind: \"info\",\n key: mkKey(),\n text: `loaded project context from ${ctxFile.name} (${ctxFile.lineCount} lines)`,\n });\n }\n return initial;\n });\n const [input, setInput] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [usage, setUsage] = useState<Usage | null>(null);\n const [showReasoning, setShowReasoning] = useState(false);\n const [perm, setPerm] = useState<PendingPermission | null>(null);\n const [queue, setQueue] = useState<Array<{ full: string; display: string }>>([]);\n const [history, setHistory] = useState<string[]>([]);\n const [historyIndex, setHistoryIndex] = useState(-1);\n const [draftInput, setDraftInput] = useState(\"\");\n const [updateInfo, setUpdateInfo] = useState<UpdateCheckResult | null>(null);\n const [mode, setMode] = useState<Mode>(\"edit\");\n const [effort, setEffort] = useState<ReasoningEffort>(\n initialCfg?.reasoningEffort ?? DEFAULT_REASONING_EFFORT,\n );\n const [theme, setTheme] = useState<Theme>(resolveTheme(initialCfg?.theme));\n const [resumeSessions, setResumeSessions] = useState<SessionSummary[] | null>(null);\n const [tasks, setTasks] = useState<Task[]>([]);\n const [tasksStartedAt, setTasksStartedAt] = useState<number | null>(null);\n const [tasksStartTokens, setTasksStartTokens] = useState<number>(0);\n const [verbose, setVerbose] = useState(false);\n\n const messagesRef = useRef<ChatMessage[]>([\n {\n role: \"system\",\n content: buildSystemPrompt({\n cwd: process.cwd(),\n tools: ALL_TOOLS,\n model: cfg?.model ?? DEFAULT_MODEL,\n mode: \"edit\",\n }),\n },\n ]);\n const executorRef = useRef<ToolExecutor>(new ToolExecutor(ALL_TOOLS));\n const activeAsstIdRef = useRef<number | null>(null);\n const activeControllerRef = useRef<AbortController | null>(null);\n const sessionIdRef = useRef<string | null>(null);\n const modeRef = useRef<Mode>(mode);\n const effortRef = useRef<ReasoningEffort>(effort);\n const tasksRef = useRef<Task[]>([]);\n const usageRef = useRef<Usage | null>(null);\n\n useEffect(() => {\n modeRef.current = mode;\n messagesRef.current[0] = {\n role: \"system\",\n content: buildSystemPrompt({\n cwd: process.cwd(),\n tools: ALL_TOOLS,\n model: cfg?.model ?? DEFAULT_MODEL,\n mode,\n }),\n };\n if (mode === \"plan\") {\n executorRef.current.clearSessionPermissions();\n }\n }, [mode, cfg?.model]);\n\n useEffect(() => {\n effortRef.current = effort;\n }, [effort]);\n\n const saveSessionSafe = useCallback(async () => {\n if (!cfg) return;\n if (!sessionIdRef.current) {\n const firstUser = messagesRef.current.find((m) => m.role === \"user\");\n const firstText =\n typeof firstUser?.content === \"string\" ? firstUser.content : \"session\";\n sessionIdRef.current = makeSessionId(firstText);\n }\n try {\n await saveSession({\n id: sessionIdRef.current,\n cwd: process.cwd(),\n model: cfg.model,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n messages: messagesRef.current,\n });\n } catch {\n /* non-fatal */\n }\n }, [cfg]);\n\n useInput((inputChar, key) => {\n if (key.ctrl && inputChar === \"c\") {\n if (busy && activeControllerRef.current) {\n activeControllerRef.current.abort();\n setQueue([]);\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"(interrupted)\" }]);\n } else {\n exit();\n }\n return;\n }\n if (key.ctrl && inputChar === \"r\") {\n setShowReasoning((s) => !s);\n return;\n }\n if (key.shift && key.tab) {\n setMode((m) => {\n const nm = nextMode(m);\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `mode: ${nm}` },\n ]);\n return nm;\n });\n return;\n }\n if (key.ctrl && inputChar === \"o\") {\n setVerbose((v) => {\n const next = !v;\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `output: ${next ? \"verbose (full tool results)\" : \"compact\"}` },\n ]);\n return next;\n });\n return;\n }\n });\n\n const updateAssistant = useCallback(\n (id: number, patch: (e: Extract<ChatEvent, { kind: \"assistant\" }>) => Partial<ChatEvent>) => {\n setEvents((evts) =>\n evts.map((e) =>\n e.kind === \"assistant\" && e.id === id ? ({ ...e, ...patch(e) } as ChatEvent) : e,\n ),\n );\n },\n [],\n );\n\n const updateTool = useCallback(\n (id: string, patch: Partial<Extract<ChatEvent, { kind: \"tool\" }>>) => {\n setEvents((evts) =>\n evts.map((e) =>\n e.kind === \"tool\" && e.id === id ? ({ ...e, ...patch } as ChatEvent) : e,\n ),\n );\n },\n [],\n );\n\n const runCompact = useCallback(async () => {\n if (!cfg) return;\n if (busy) {\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"can't compact while model is running\" }]);\n return;\n }\n setBusy(true);\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"compacting conversation…\" }]);\n const controller = new AbortController();\n activeControllerRef.current = controller;\n try {\n const result = await compactMessages({\n accountId: cfg.accountId,\n apiToken: cfg.apiToken,\n model: cfg.model,\n messages: messagesRef.current,\n signal: controller.signal,\n });\n if (result.replacedCount === 0) {\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: \"nothing to compact yet\" },\n ]);\n } else {\n messagesRef.current = result.newMessages;\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `compacted ${result.replacedCount} messages into a summary`,\n },\n ]);\n await saveSessionSafe();\n }\n } catch (e) {\n if ((e as Error).name !== \"AbortError\") {\n setEvents((es) => [\n ...es,\n { kind: \"error\", key: mkKey(), text: `compact failed: ${(e as Error).message}` },\n ]);\n }\n } finally {\n setBusy(false);\n activeControllerRef.current = null;\n }\n }, [cfg, busy, saveSessionSafe]);\n\n const openResumePicker = useCallback(async () => {\n const sessions = await listSessions(30);\n setResumeSessions(sessions);\n }, []);\n\n const runInit = useCallback(async () => {\n if (!cfg) return;\n if (busy) {\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"can't /init while model is running\" }]);\n return;\n }\n const cwd = process.cwd();\n for (const name of [\"KIMI.md\", \"KIMIFLARE.md\", \"AGENT.md\"]) {\n if (existsSync(join(cwd, name))) {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `${name} already exists at ${join(cwd, name)} — delete it first if you want to regenerate`,\n },\n ]);\n return;\n }\n }\n const prompt = [\n \"Generate a KIMI.md at the repository root so future agents have project context.\",\n \"\",\n \"First, use the `glob`, `read`, and `grep` tools to understand the project: read `package.json`, the top-level `README.md` if present, the tsconfig / build config, and skim the top-level source directory structure.\",\n \"\",\n \"Then call the `write` tool to create `KIMI.md` at the repo root with these sections, terse (aim ≤ 100 lines total):\",\n \"\",\n \"- **Project** — one-line description + primary language/runtime.\",\n \"- **Build / test / run** — exact shell commands an agent should use.\",\n \"- **Layout** — key directories and what lives in each.\",\n \"- **Conventions** — naming, import style, file structure, commit style, anything surprising.\",\n \"- **Do / Don't** — quirks or rules future agents should know.\",\n \"\",\n \"Do not call `tasks_set` for this. Just read what you need, then write the file.\",\n ].join(\"\\n\");\n\n setEvents((e) => [...e, { kind: \"user\", key: mkKey(), text: \"/init\" }]);\n messagesRef.current.push({ role: \"user\", content: prompt });\n setBusy(true);\n const controller = new AbortController();\n activeControllerRef.current = controller;\n\n try {\n await runAgentTurn({\n accountId: cfg.accountId,\n apiToken: cfg.apiToken,\n model: cfg.model,\n messages: messagesRef.current,\n tools: ALL_TOOLS,\n executor: executorRef.current,\n cwd,\n signal: controller.signal,\n reasoningEffort: effortRef.current,\n callbacks: {\n onAssistantStart: () => {\n const id = nextAssistantId++;\n activeAsstIdRef.current = id;\n setEvents((e) => [\n ...e,\n { kind: \"assistant\", key: `asst_${id}`, id, text: \"\", reasoning: \"\", streaming: true },\n ]);\n },\n onReasoningDelta: (d) => {\n const id = activeAsstIdRef.current;\n if (id !== null) updateAssistant(id, (e) => ({ reasoning: e.reasoning + d }));\n },\n onTextDelta: (d) => {\n const id = activeAsstIdRef.current;\n if (id !== null) updateAssistant(id, (e) => ({ text: e.text + d }));\n },\n onAssistantFinal: () => {\n const id = activeAsstIdRef.current;\n if (id !== null) updateAssistant(id, () => ({ streaming: false }));\n },\n onToolCallFinalized: (call) => {\n const spec = executorRef.current.list().find((t) => t.name === call.function.name);\n let renderMeta: ToolRender | undefined;\n try {\n const args = call.function.arguments ? JSON.parse(call.function.arguments) : {};\n renderMeta = spec?.render?.(args);\n } catch {\n /* ignore */\n }\n setEvents((e) => [\n ...e,\n {\n kind: \"tool\",\n key: `tool_${call.id}`,\n id: call.id,\n name: call.function.name,\n args: call.function.arguments,\n status: \"running\",\n render: renderMeta,\n expanded: false,\n },\n ]);\n },\n onToolResult: (r) => {\n updateTool(r.tool_call_id, { status: r.ok ? \"done\" : \"error\", result: r.content });\n },\n onUsage: (u) => {\n usageRef.current = u;\n setUsage(u);\n },\n askPermission: (req) =>\n new Promise<PermissionDecision>((resolve) => {\n if (modeRef.current === \"auto\") return resolve(\"allow\");\n setPerm({ tool: req.tool, args: req.args, resolve });\n }),\n },\n });\n\n if (existsSync(join(cwd, \"KIMI.md\"))) {\n messagesRef.current[0] = {\n role: \"system\",\n content: buildSystemPrompt({\n cwd,\n tools: ALL_TOOLS,\n model: cfg.model,\n mode: modeRef.current,\n }),\n };\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: \"KIMI.md generated; context loaded for future turns\" },\n ]);\n }\n } catch (e) {\n if ((e as Error).name !== \"AbortError\") {\n setEvents((es) => [\n ...es,\n { kind: \"error\", key: mkKey(), text: `init failed: ${(e as Error).message}` },\n ]);\n }\n } finally {\n setBusy(false);\n activeAsstIdRef.current = null;\n activeControllerRef.current = null;\n }\n }, [cfg, busy, updateAssistant, updateTool]);\n\n const handleResumePick = useCallback(\n async (picked: SessionSummary | null) => {\n setResumeSessions(null);\n if (!picked) return;\n try {\n const file = await loadSession(picked.filePath);\n messagesRef.current = file.messages;\n sessionIdRef.current = file.id;\n setEvents([\n {\n kind: \"info\",\n key: mkKey(),\n text: `resumed session ${picked.id} (${picked.messageCount} msgs)`,\n },\n ]);\n const userMsgs = file.messages\n .filter((m) => m.role === \"user\" && typeof m.content === \"string\")\n .map((m) => m.content as string);\n if (userMsgs.length > 0) setHistory(userMsgs);\n setUsage(null);\n } catch (e) {\n setEvents((es) => [\n ...es,\n { kind: \"error\", key: mkKey(), text: `failed to load session: ${(e as Error).message}` },\n ]);\n }\n },\n [],\n );\n\n const handleSlash = useCallback(\n (cmd: string): boolean => {\n const raw = cmd.trim();\n const [head, ...rest] = raw.split(/\\s+/);\n const c = (head ?? \"\").toLowerCase();\n const arg = rest.join(\" \").trim().toLowerCase();\n\n if (c === \"/exit\" || c === \"/quit\") {\n exit();\n return true;\n }\n if (c === \"/clear\") {\n messagesRef.current = [messagesRef.current[0]!];\n sessionIdRef.current = null;\n setEvents([{ kind: \"info\", key: mkKey(), text: \"conversation cleared\" }]);\n setUsage(null);\n setTasks([]);\n setTasksStartedAt(null);\n setTasksStartTokens(0);\n return true;\n }\n if (c === \"/reasoning\") {\n setShowReasoning((s) => {\n const next = !s;\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `reasoning: ${next ? \"shown\" : \"hidden\"}` },\n ]);\n return next;\n });\n return true;\n }\n if (c === \"/cost\") {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: usage\n ? `prompt ${usage.prompt_tokens} / completion ${usage.completion_tokens}`\n : \"no usage yet\",\n },\n ]);\n return true;\n }\n if (c === \"/model\") {\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `current model: ${cfg?.model ?? \"unknown\"}` },\n ]);\n return true;\n }\n if (c === \"/thinking\" || c === \"/effort\") {\n if (!arg) {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `current: ${effort} · ${EFFORT_DESCRIPTIONS[effort]}\\nuse: /thinking low | medium | high`,\n },\n ]);\n return true;\n }\n if (arg === \"low\" || arg === \"medium\" || arg === \"high\") {\n setEffort(arg);\n if (cfg) void saveConfig({ ...cfg, reasoningEffort: arg }).catch(() => {});\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `thinking: ${arg} · ${EFFORT_DESCRIPTIONS[arg]}`,\n },\n ]);\n return true;\n }\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: \"usage: /thinking low | medium | high\" },\n ]);\n return true;\n }\n if (c === \"/theme\") {\n if (!arg) {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `current: ${theme.name} · available: ${themeNames().join(\", \")}`,\n },\n ]);\n return true;\n }\n const next = resolveTheme(arg);\n if (next.name !== arg) {\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `unknown theme \"${arg}\" — available: ${themeNames().join(\", \")}` },\n ]);\n return true;\n }\n setTheme(next);\n setCfg((c) => (c ? { ...c, theme: next.name } : c));\n if (cfg) void saveConfig({ ...cfg, theme: next.name }).catch(() => {});\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `theme: ${next.label}` },\n ]);\n return true;\n }\n if (c === \"/mode\") {\n if (!arg) {\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `current mode: ${mode} · use /mode edit|plan|auto or shift+tab` },\n ]);\n return true;\n }\n if (arg === \"edit\" || arg === \"plan\" || arg === \"auto\") {\n setMode(arg);\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `mode: ${arg}` },\n ]);\n return true;\n }\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: \"usage: /mode edit|plan|auto\" },\n ]);\n return true;\n }\n if (c === \"/plan\") {\n setMode(\"plan\");\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"mode: plan\" }]);\n return true;\n }\n if (c === \"/auto\") {\n setMode(\"auto\");\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"mode: auto\" }]);\n return true;\n }\n if (c === \"/edit\") {\n setMode(\"edit\");\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"mode: edit\" }]);\n return true;\n }\n if (c === \"/resume\") {\n void openResumePicker();\n return true;\n }\n if (c === \"/compact\") {\n void runCompact();\n return true;\n }\n if (c === \"/init\") {\n void runInit();\n return true;\n }\n if (c === \"/update\") {\n if (updateInfo?.hasUpdate) {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `updating from ${updateInfo.localVersion} → ${updateInfo.latestVersion}…`,\n },\n ]);\n isGitRepo().then((git) => {\n if (git) {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: \"run: git pull && npm install && npm run build then restart kimiflare\",\n },\n ]);\n } else {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: \"run: npm update -g kimiflare then restart\",\n },\n ]);\n }\n });\n } else {\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: \"no update available\" },\n ]);\n }\n return true;\n }\n if (c === \"/logout\") {\n unlink(configPath()).catch(() => {});\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: `credentials cleared from ${configPath()}` },\n ]);\n setCfg(null);\n return true;\n }\n if (c === \"/help\") {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text:\n \"commands:\\n\" +\n \" /mode edit|plan|auto switch mode (or shift+tab to cycle)\\n\" +\n \" /plan /auto /edit shortcuts for /mode\\n\" +\n \" /thinking low|med|high set reasoning effort (quality vs speed)\\n\" +\n \" /theme NAME dark, light, high-contrast\\n\" +\n \" /resume pick a past conversation\\n\" +\n \" /compact summarize old turns to free context\\n\" +\n \" /init scan this repo and write a KIMI.md for future agents\\n\" +\n \" /reasoning toggle show/hide model reasoning\\n\" +\n \" /clear clear current conversation\\n\" +\n \" /cost /model /update /logout /help /exit\\n\" +\n \"keys: ctrl-c interrupt/exit · ctrl-r toggle reasoning · ctrl-o toggle verbose output · shift+tab cycle mode · ↑/↓ history\",\n },\n ]);\n return true;\n }\n return false;\n },\n [cfg, exit, usage, updateInfo, effort, theme, mode, openResumePicker, runCompact, runInit],\n );\n\n const processMessage = useCallback(\n async (text: string, displayText?: string) => {\n if (!cfg) return;\n const trimmed = text.trim();\n if (!trimmed) return;\n\n if (trimmed.startsWith(\"/\") && handleSlash(trimmed)) return;\n\n const display = displayText?.trim() || trimmed;\n setEvents((e) => [...e, { kind: \"user\", key: mkKey(), text: display }]);\n messagesRef.current.push({ role: \"user\", content: trimmed });\n setBusy(true);\n\n const controller = new AbortController();\n activeControllerRef.current = controller;\n\n try {\n await runAgentTurn({\n accountId: cfg.accountId,\n apiToken: cfg.apiToken,\n model: cfg.model,\n messages: messagesRef.current,\n tools: ALL_TOOLS,\n executor: executorRef.current,\n cwd: process.cwd(),\n signal: controller.signal,\n reasoningEffort: effortRef.current,\n callbacks: {\n onAssistantStart: () => {\n const id = nextAssistantId++;\n activeAsstIdRef.current = id;\n setEvents((e) => [\n ...e,\n { kind: \"assistant\", key: `asst_${id}`, id, text: \"\", reasoning: \"\", streaming: true },\n ]);\n },\n onReasoningDelta: (d) => {\n const id = activeAsstIdRef.current;\n if (id !== null) updateAssistant(id, (e) => ({ reasoning: e.reasoning + d }));\n },\n onTextDelta: (d) => {\n const id = activeAsstIdRef.current;\n if (id !== null) updateAssistant(id, (e) => ({ text: e.text + d }));\n },\n onAssistantFinal: () => {\n const id = activeAsstIdRef.current;\n if (id !== null) updateAssistant(id, () => ({ streaming: false }));\n },\n onToolCallFinalized: (call) => {\n const spec = executorRef.current.list().find((t) => t.name === call.function.name);\n let renderMeta: ToolRender | undefined;\n try {\n const args = call.function.arguments ? JSON.parse(call.function.arguments) : {};\n renderMeta = spec?.render?.(args);\n } catch {\n /* ignore render failure */\n }\n setEvents((e) => [\n ...e,\n {\n kind: \"tool\",\n key: `tool_${call.id}`,\n id: call.id,\n name: call.function.name,\n args: call.function.arguments,\n status: \"running\",\n render: renderMeta,\n expanded: false,\n },\n ]);\n },\n onToolResult: (r) => {\n updateTool(r.tool_call_id, {\n status: r.ok ? \"done\" : \"error\",\n result: r.content,\n });\n },\n onUsage: (u) => {\n usageRef.current = u;\n setUsage(u);\n },\n onTasks: (nextTasks) => {\n const prevEmpty = tasksRef.current.length === 0;\n tasksRef.current = nextTasks;\n setTasks(nextTasks);\n if (prevEmpty && nextTasks.length > 0) {\n setTasksStartedAt(Date.now());\n setTasksStartTokens(usageRef.current?.prompt_tokens ?? 0);\n }\n if (nextTasks.length === 0) {\n setTasksStartedAt(null);\n setTasksStartTokens(0);\n }\n },\n askPermission: (req) =>\n new Promise<PermissionDecision>((resolve) => {\n if (modeRef.current === \"auto\") {\n resolve(\"allow\");\n return;\n }\n if (modeRef.current === \"plan\" && isBlockedInPlanMode(req.tool.name)) {\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `plan mode blocked ${req.tool.name}; exit plan mode to execute`,\n },\n ]);\n resolve(\"deny\");\n return;\n }\n setPerm({ tool: req.tool, args: req.args, resolve });\n }),\n },\n });\n await saveSessionSafe();\n } catch (e) {\n if ((e as Error).name === \"AbortError\") {\n setEvents((es) => [...es, { kind: \"info\", key: mkKey(), text: \"(aborted)\" }]);\n } else {\n setEvents((es) => [\n ...es,\n { kind: \"error\", key: mkKey(), text: (e as Error).message ?? String(e) },\n ]);\n }\n } finally {\n setBusy(false);\n activeAsstIdRef.current = null;\n activeControllerRef.current = null;\n }\n },\n [cfg, handleSlash, updateAssistant, updateTool, saveSessionSafe],\n );\n\n useEffect(() => {\n if (!busy && queue.length > 0) {\n const next = queue[0]!;\n setQueue((q) => q.slice(1));\n processMessage(next.full, next.display);\n }\n }, [busy, queue, processMessage]);\n\n const submit = useCallback(\n (full: string, display?: string) => {\n const trimmedFull = full.trim();\n if (!trimmedFull) return;\n const trimmedDisplay = (display ?? full).trim() || trimmedFull;\n\n const historyEntry = trimmedDisplay;\n\n if (busy) {\n setQueue((q) => [...q, { full: trimmedFull, display: trimmedDisplay }]);\n setHistory((h) => (h.length > 0 && h[h.length - 1] === historyEntry ? h : [...h, historyEntry]));\n setInput(\"\");\n setHistoryIndex(-1);\n return;\n }\n\n setHistory((h) => (h.length > 0 && h[h.length - 1] === historyEntry ? h : [...h, historyEntry]));\n setInput(\"\");\n setHistoryIndex(-1);\n processMessage(trimmedFull, trimmedDisplay !== trimmedFull ? trimmedDisplay : undefined);\n },\n [busy, processMessage],\n );\n\n useEffect(() => {\n checkForUpdate().then((result) => {\n if (result.hasUpdate) {\n setUpdateInfo(result);\n setEvents((e) => [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `update available: ${result.localVersion} → ${result.latestVersion} · run /update to upgrade`,\n },\n ]);\n }\n });\n }, []);\n\n useEffect(() => {\n if (usage && usage.prompt_tokens / CONTEXT_LIMIT >= AUTO_COMPACT_SUGGEST_PCT) {\n setEvents((e) => {\n const last = e[e.length - 1];\n if (last?.kind === \"info\" && last.text.startsWith(\"context \")) return e;\n return [\n ...e,\n {\n kind: \"info\",\n key: mkKey(),\n text: `context ${Math.round((usage.prompt_tokens / CONTEXT_LIMIT) * 100)}% full — run /compact to summarize older turns`,\n },\n ];\n });\n }\n }, [usage]);\n\n if (!cfg) {\n return (\n <Onboarding\n onDone={(newCfg) => {\n setCfg(newCfg);\n setEvents((e) => [\n ...e,\n { kind: \"info\", key: mkKey(), text: \"configuration saved — welcome to kimiflare!\" },\n ]);\n }}\n />\n );\n }\n\n if (resumeSessions !== null) {\n return (\n <Box flexDirection=\"column\">\n <ResumePicker sessions={resumeSessions} onPick={handleResumePick} theme={theme} />\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <ChatView events={events} showReasoning={showReasoning} theme={theme} verbose={verbose} />\n {perm ? (\n <PermissionModal\n tool={perm.tool}\n args={perm.args}\n theme={theme}\n onDecide={(d) => {\n perm.resolve(d);\n setPerm(null);\n }}\n />\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {tasks.length > 0 && (\n <TaskList\n tasks={tasks}\n theme={theme}\n startedAt={tasksStartedAt}\n tokensDelta={Math.max(0, (usage?.prompt_tokens ?? 0) - tasksStartTokens)}\n />\n )}\n {queue.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {queue.map((q, i) => (\n <Text key={`queue_${i}`} color={theme.queue.color} dimColor={theme.queue.dim}>\n ⏳ {q.display}\n </Text>\n ))}\n </Box>\n )}\n <StatusBar\n model={cfg.model}\n usage={usage}\n thinking={busy}\n hint={busy ? \"ctrl-c to interrupt · type to queue next\" : \"enter to send · /help · shift+tab cycles mode\"}\n theme={theme}\n mode={mode}\n effort={effort}\n contextLimit={CONTEXT_LIMIT}\n />\n {busy && (\n <Box>\n <Text color={theme.spinner}>\n <Spinner type=\"dots\" />\n </Text>\n <Text color={theme.info.color} dimColor={theme.info.dim}>\n {\" working…\"}\n </Text>\n </Box>\n )}\n <Box>\n <Text color={theme.user}>{busy ? \"⏳ \" : \"› \"}</Text>\n <CustomTextInput\n value={input}\n onChange={setInput}\n onSubmit={submit}\n enablePaste\n onHistoryUp={() => {\n if (history.length === 0) return;\n if (historyIndex === -1) {\n setDraftInput(input);\n const nextIndex = history.length - 1;\n setHistoryIndex(nextIndex);\n setInput(history[nextIndex]!);\n } else {\n const nextIndex = Math.max(0, historyIndex - 1);\n setHistoryIndex(nextIndex);\n setInput(history[nextIndex]!);\n }\n }}\n onHistoryDown={() => {\n if (historyIndex === -1) return;\n const nextIndex = historyIndex + 1;\n if (nextIndex >= history.length) {\n setHistoryIndex(-1);\n setInput(draftInput);\n } else {\n setHistoryIndex(nextIndex);\n setInput(history[nextIndex]!);\n }\n }}\n onClearQueueItem={(text) => {\n setQueue((q) => {\n const idx = q.findIndex((item) => item.display === text);\n if (idx >= 0) {\n const next = [...q];\n next.splice(idx, 1);\n return next;\n }\n return q;\n });\n }}\n />\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n\nexport async function renderApp(cfg: Cfg | null) {\n const instance = render(<App initialCfg={cfg} />);\n await instance.waitUntilExit();\n}\n","import { Command } from \"commander\";\nimport { loadConfig, DEFAULT_MODEL } from \"./config.js\";\nimport { runAgentTurn } from \"./agent/loop.js\";\nimport { buildSystemPrompt } from \"./agent/system-prompt.js\";\nimport { ToolExecutor, ALL_TOOLS } from \"./tools/executor.js\";\nimport type { ChatMessage } from \"./agent/messages.js\";\n\nconst program = new Command();\nprogram\n .name(\"kimiflare\")\n .description(\"Terminal coding agent powered by Kimi-K2.6 on Cloudflare Workers AI.\")\n .version(\"0.1.0\")\n .option(\"-p, --print <prompt>\", \"one-shot mode: send prompt, stream reply to stdout, exit\")\n .option(\"-m, --model <id>\", \"model id (defaults to @cf/moonshotai/kimi-k2.6)\")\n .option(\"--dangerously-allow-all\", \"auto-approve every permission prompt (print mode only)\")\n .option(\"--reasoning\", \"include reasoning in stdout (print mode only)\")\n .parse();\n\nconst opts = program.opts<{\n print?: string;\n model?: string;\n dangerouslyAllowAll?: boolean;\n reasoning?: boolean;\n}>();\n\nasync function main() {\n const cfg = await loadConfig();\n\n if (opts.print !== undefined) {\n if (!cfg) {\n console.error(\n \"kimiflare: missing credentials.\\n\" +\n \"Set CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN, or write them to\\n\" +\n \" ~/.config/kimiflare/config.json (chmod 600)\\n\" +\n \" { \\\"accountId\\\": \\\"...\\\", \\\"apiToken\\\": \\\"...\\\", \\\"model\\\": \\\"@cf/moonshotai/kimi-k2.6\\\" }\",\n );\n process.exit(2);\n }\n const model = opts.model ?? cfg.model ?? DEFAULT_MODEL;\n await runPrintMode({\n ...cfg,\n model,\n prompt: opts.print,\n allowAll: !!opts.dangerouslyAllowAll,\n showReasoning: !!opts.reasoning,\n });\n return;\n }\n\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.error(\n \"kimiflare: interactive mode requires a TTY. Use `kimiflare -p \\\"...\\\"` for non-TTY / piped usage.\",\n );\n process.exit(2);\n }\n\n const { renderApp } = await import(\"./app.js\");\n if (cfg) {\n const model = opts.model ?? cfg.model ?? DEFAULT_MODEL;\n await renderApp({ ...cfg, model });\n } else {\n await renderApp(null);\n }\n}\n\ninterface PrintOpts {\n accountId: string;\n apiToken: string;\n model: string;\n prompt: string;\n allowAll: boolean;\n showReasoning: boolean;\n}\n\nasync function runPrintMode(opts: PrintOpts): Promise<void> {\n const cwd = process.cwd();\n const executor = new ToolExecutor(ALL_TOOLS);\n const messages: ChatMessage[] = [\n { role: \"system\", content: buildSystemPrompt({ cwd, tools: ALL_TOOLS, model: opts.model }) },\n { role: \"user\", content: opts.prompt },\n ];\n\n const controller = new AbortController();\n process.on(\"SIGINT\", () => controller.abort());\n\n let printedReasoningHeader = false;\n let printedAnswerHeader = false;\n\n await runAgentTurn({\n accountId: opts.accountId,\n apiToken: opts.apiToken,\n model: opts.model,\n messages,\n tools: ALL_TOOLS,\n executor,\n cwd,\n signal: controller.signal,\n callbacks: {\n onReasoningDelta: opts.showReasoning\n ? (delta) => {\n if (!printedReasoningHeader) {\n process.stderr.write(\"\\x1b[2m--- reasoning ---\\n\");\n printedReasoningHeader = true;\n }\n process.stderr.write(delta);\n }\n : undefined,\n onTextDelta: (delta) => {\n if (opts.showReasoning && printedReasoningHeader && !printedAnswerHeader) {\n process.stderr.write(\"\\n--- answer ---\\x1b[0m\\n\");\n printedAnswerHeader = true;\n }\n process.stdout.write(delta);\n },\n onToolCallFinalized: (call) => {\n process.stderr.write(`\\x1b[2m[tool ${call.function.name}(${call.function.arguments})]\\x1b[0m\\n`);\n },\n onToolResult: (result) => {\n const snippet =\n result.content.length > 400 ? result.content.slice(0, 400) + \"...\" : result.content;\n process.stderr.write(`\\x1b[2m[result: ${snippet.replace(/\\n/g, \" ⏎ \")}]\\x1b[0m\\n`);\n },\n askPermission: async ({ tool, args }) => {\n if (opts.allowAll) return \"allow\";\n process.stderr.write(\n `\\x1b[31m[permission denied: ${tool.name}(${JSON.stringify(args)}) — pass --dangerously-allow-all to approve in print mode]\\x1b[0m\\n`,\n );\n return \"deny\";\n },\n },\n });\n\n process.stdout.write(\"\\n\");\n}\n\nmain().catch((e) => {\n console.error(`kimiflare: ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n});\n"],"mappings":"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","names":["sep","opts","resolve","opts","homedir","join","opts","homedir","readFile","mkdir","readFile","writeFile","readFile","writeFile","resolve","readFile","fg","MAX_BYTES","opts","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","render","Box","Text","SelectInput","jsx","jsxs","Box","Text","jsx","jsxs","allDone","process","styles","chalk","useState","useEffect","Text","jsx","readFile","writeFile","mkdir","homedir","join","dirname","useState","Box","Text","jsx","jsxs","readFile","writeFile","mkdir","stat","homedir","join","useState","useRef","useEffect","Box","Text","useInput","Spinner","join","jsx","jsxs","resolve","c","renderApp","opts"]}
|