kimiflare 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/util/sse.ts","../src/util/errors.ts","../src/agent/client.ts","../src/tools/registry.ts","../src/agent/loop.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/tools/executor.ts","../src/ui/diff-view.tsx","../src/ui/tool-view.tsx","../src/ui/chat.tsx","../src/ui/status.tsx","../src/ui/permission.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/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 interface KimiConfig {\n accountId: string;\n apiToken: string;\n model: string;\n}\n\nexport const DEFAULT_MODEL = \"@cf/moonshotai/kimi-k2.6\";\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\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\n if (envAccount && envToken) {\n return { accountId: envAccount, apiToken: envToken, model: envModel };\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 };\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}\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 = {\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\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\";\n\nexport interface ToolContext {\n cwd: string;\n signal?: AbortSignal;\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\";\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 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}\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 });\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 },\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","import { platform, release, homedir } from \"node:os\";\nimport { basename } from \"node:path\";\nimport type { ToolSpec } from \"../tools/registry.js\";\n\nexport interface SystemPromptOpts {\n cwd: string;\n tools: ToolSpec[];\n model: string;\n now?: Date;\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- 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","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","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\";\n\nexport const ALL_TOOLS: ToolSpec[] = [\n readTool,\n writeTool,\n editTool,\n bashTool,\n globTool,\n grepTool,\n webFetchTool,\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 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 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\nexport function ToolView({ evt }: { evt: ToolEventState }) {\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\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 && evt.expanded ? (\n <Box marginLeft={2} flexDirection=\"column\">\n {evt.result.split(\"\\n\").slice(0, 20).map((l, i) => (\n <Text key={i} color=\"gray\">{l}</Text>\n ))}\n {evt.result.split(\"\\n\").length > 20 && (\n <Text color=\"gray\">... ({evt.result.split(\"\\n\").length - 20} more lines)</Text>\n )}\n </Box>\n ) : null}\n {evt.result && !evt.expanded && 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\";\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}\n\nexport function ChatView({ events, showReasoning }: Props) {\n return (\n <Box flexDirection=\"column\">\n {events.map((e) => (\n <EventView key={e.key} evt={e} showReasoning={showReasoning} />\n ))}\n </Box>\n );\n}\n\nfunction EventView({ evt, showReasoning }: { evt: ChatEvent; showReasoning: boolean }) {\n if (evt.kind === \"user\") {\n return (\n <Box marginY={0}>\n <Text color=\"cyan\">› </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=\"gray\" dimColor>\n ✧ thinking: {evt.reasoning.length > 400 ? evt.reasoning.slice(0, 400) + \"…\" : evt.reasoning}\n </Text>\n </Box>\n ) : null}\n {evt.text ? <Text>{evt.text}</Text> : null}\n </Box>\n );\n }\n if (evt.kind === \"tool\") {\n return <ToolView evt={evt} />;\n }\n if (evt.kind === \"info\") {\n return (\n <Text color=\"gray\" dimColor>\n {evt.text}\n </Text>\n );\n }\n return <Text color=\"red\">! {evt.text}</Text>;\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { Usage } from \"../agent/messages.js\";\n\ninterface Props {\n model: string;\n usage: Usage | null;\n thinking: boolean;\n hint?: string;\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 }: Props) {\n const parts: string[] = [`model: ${shortModel(model)}`];\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 parts.push(\n `in: ${usage.prompt_tokens}${cached ? ` (${cached} cached)` : \"\"}`,\n `out: ${usage.completion_tokens}`,\n `$${cost.toFixed(5)}`,\n );\n }\n if (thinking) parts.push(\"thinking…\");\n if (hint) parts.push(hint);\n\n return (\n <Box>\n <Text color=\"gray\" dimColor>\n {parts.join(\" · \")}\n </Text>\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\";\n\ninterface Props {\n tool: ToolSpec;\n args: Record<string, unknown>;\n onDecide: (decision: PermissionDecision) => void;\n}\n\nexport function PermissionModal({ tool, args, onDecide }: 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=\"yellow\" paddingX={1}>\n <Text color=\"yellow\" bold>\n Permission requested\n </Text>\n <Text>\n tool: <Text color=\"magenta\">{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=\"gray\">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","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 } 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) => void;\n onHistoryUp?: () => void;\n onHistoryDown?: () => void;\n onClearQueueItem?: (text: string) => void;\n focus?: boolean;\n mask?: string;\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}: Props) {\n const [cursorOffset, setCursorOffset] = useState(value.length);\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 // Let app-level handlers process these\n if (key.ctrl && input === \"c\") return;\n if (key.ctrl && input === \"r\") return;\n if (key.tab) return;\n\n if (key.return) {\n onSubmit(value);\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.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 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 // Ctrl+Backspace -> delete word backward\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 nextValue = value.slice(0, cursorOffset) + input + value.slice(cursorOffset);\n nextCursor = cursorOffset + input.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","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 GITHUB_API = \"https://api.github.com/repos/sinameraji/kimiflare/releases/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(GITHUB_API, {\n headers: { \"User-Agent\": \"kimiflare-update-checker\" },\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { tag_name?: string };\n return data.tag_name ?? 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","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 { 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 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 { configPath, DEFAULT_MODEL } from \"./config.js\";\nimport { unlink } from \"node:fs/promises\";\n\ninterface Cfg {\n accountId: string;\n apiToken: string;\n model: string;\n}\n\ninterface PendingPermission {\n tool: ToolSpec;\n args: Record<string, unknown>;\n resolve: (d: PermissionDecision) => void;\n}\n\nlet nextAssistantId = 1;\nlet nextKey = 1;\nconst mkKey = () => `evt_${nextKey++}`;\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\" },\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<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\n const messagesRef = useRef<ChatMessage[]>([\n {\n role: \"system\",\n content: buildSystemPrompt({ cwd: process.cwd(), tools: ALL_TOOLS, model: cfg?.model ?? DEFAULT_MODEL }),\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\n useInput((inputChar, key) => {\n if (key.ctrl && inputChar === \"c\") {\n if (busy && activeControllerRef.current) {\n activeControllerRef.current.abort();\n setEvents((e) => [...e, { kind: \"info\", key: mkKey(), text: \"(interrupted)\" }]);\n } else {\n exit();\n }\n }\n if (key.ctrl && inputChar === \"r\") setShowReasoning((s) => !s);\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 handleSlash = useCallback(\n (cmd: string): boolean => {\n const c = cmd.trim().toLowerCase();\n if (c === \"/exit\" || c === \"/quit\") {\n exit();\n return true;\n }\n if (c === \"/clear\") {\n messagesRef.current = [messagesRef.current[0]!];\n setEvents([{ kind: \"info\", key: mkKey(), text: \"conversation cleared\" }]);\n setUsage(null);\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 === \"/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: /clear /reasoning /cost /model /update /logout /help /exit · keys: ctrl-r toggle reasoning, ctrl-c interrupt/exit\",\n },\n ]);\n return true;\n }\n return false;\n },\n [cfg, exit, usage, updateInfo],\n );\n\n const processMessage = useCallback(\n async (text: string) => {\n if (!cfg) return;\n const trimmed = text.trim();\n if (!trimmed) return;\n\n if (trimmed.startsWith(\"/\") && handleSlash(trimmed)) return;\n\n setEvents((e) => [...e, { kind: \"user\", key: mkKey(), text: trimmed }]);\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 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 askPermission: (req) =>\n new Promise<PermissionDecision>((resolve) => {\n setPerm({ tool: req.tool, args: req.args, resolve });\n }),\n },\n });\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],\n );\n\n useEffect(() => {\n if (!busy && queue.length > 0) {\n const next = queue[0]!;\n setQueue((q) => q.slice(1));\n processMessage(next);\n }\n }, [busy, queue, processMessage]);\n\n const submit = useCallback(\n (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n\n if (busy) {\n setQueue((q) => [...q, trimmed]);\n setHistory((h) => (h.length > 0 && h[h.length - 1] === trimmed ? h : [...h, trimmed]));\n setInput(\"\");\n setHistoryIndex(-1);\n return;\n }\n\n setHistory((h) => (h.length > 0 && h[h.length - 1] === trimmed ? h : [...h, trimmed]));\n setInput(\"\");\n setHistoryIndex(-1);\n processMessage(trimmed);\n },\n [busy, processMessage],\n );\n\n useEffect(() => {\n // Force a re-render tick so streaming state change is flushed.\n }, [events]);\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 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 return (\n <Box flexDirection=\"column\">\n <ChatView events={events} showReasoning={showReasoning} />\n {perm ? (\n <PermissionModal\n tool={perm.tool}\n args={perm.args}\n onDecide={(d) => {\n perm.resolve(d);\n setPerm(null);\n }}\n />\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {queue.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {queue.map((q, i) => (\n <Text key={`queue_${i}`} color=\"gray\" dimColor>\n ⏳ {q}\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\" : \"enter to send · /help\"}\n />\n <Box>\n {busy ? (\n <Box>\n <Text color=\"yellow\">\n <Spinner type=\"dots\" />\n </Text>\n <Text color=\"gray\"> working…</Text>\n </Box>\n ) : (\n <Box>\n <Text color=\"cyan\">› </Text>\n <CustomTextInput\n value={input}\n onChange={setInput}\n onSubmit={submit}\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.indexOf(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 )}\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","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","Box","Text","jsx","jsxs","render","process","styles","chalk","Text","jsx","readFile","writeFile","mkdir","homedir","join","dirname","useState","Box","Text","jsx","jsxs","useState","useEffect","Box","Text","useInput","Spinner","jsx","jsxs","resolve","renderApp","opts"]}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "kimiflare",
3
+ "version": "0.1.0",
4
+ "description": "Kimiflare — a terminal coding agent powered by Kimi-K2.6 on Cloudflare Workers AI.",
5
+ "type": "module",
6
+ "bin": {
7
+ "kimiflare": "bin/kimiflare.mjs"
8
+ },
9
+ "files": [
10
+ "bin",
11
+ "dist",
12
+ "PLAN.md"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20"
16
+ },
17
+ "scripts": {
18
+ "build": "tsup",
19
+ "dev": "tsx src/index.tsx",
20
+ "typecheck": "tsc --noEmit",
21
+ "start": "node bin/kimiflare.mjs",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "dependencies": {
25
+ "commander": "^12.1.0",
26
+ "diff": "^7.0.0",
27
+ "fast-glob": "^3.3.2",
28
+ "ink": "^7.0.1",
29
+ "ink-select-input": "^6.2.0",
30
+ "ink-spinner": "^5.0.0",
31
+ "ink-text-input": "^6.0.0",
32
+ "react": "^19.2.0",
33
+ "react-devtools-core": "^6.1.2",
34
+ "turndown": "^7.2.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/diff": "^7.0.0",
38
+ "@types/node": "^22.9.0",
39
+ "@types/react": "^19.2.0",
40
+ "@types/turndown": "^5.0.5",
41
+ "tsup": "^8.3.5",
42
+ "tsx": "^4.19.2",
43
+ "typescript": "^5.7.2"
44
+ }
45
+ }