@kernelonpanic/kitcode 1.0.1-beta → 1.2.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 +281 -280
- package/README.ru.md +276 -275
- package/dist/index.js +1419 -412
- package/dist/index.js.map +1 -1
- package/package.json +9 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/app/add.ts","../src/config/schema.ts","../src/providers/errors.ts","../src/providers/types.ts","../src/providers/model-info.ts","../src/config/detect.ts","../src/config/paths.ts","../src/config/store.ts","../src/config/trust.ts","../src/app/ask.ts","../src/ui/sanitize.ts","../src/app/runtime.ts","../src/core/session.ts","../src/core/agent.ts","../src/providers/pricing.ts","../src/core/budget.ts","../src/core/checkpoint.ts","../src/tools/safepath.ts","../src/core/diagnostics.ts","../src/tools/bash.ts","../src/tools/summary.ts","../src/core/attachments.ts","../src/core/compact.ts","../src/core/prompt.ts","../src/core/subagent.ts","../src/core/usage.ts","../src/mcp/client.ts","../src/mcp/bridge.ts","../package.json","../src/version.ts","../src/providers/balance.ts","../src/providers/catalog.ts","../src/providers/anthropic.ts","../src/providers/rate-limits.ts","../src/providers/openai-compat.ts","../src/providers/registry.ts","../src/tools/permissions.ts","../src/tools/edit.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/sensitive.ts","../src/tools/regex.ts","../src/tools/read.ts","../src/tools/types.ts","../src/tools/write.ts","../src/tools/registry.ts","../src/prompts/library.ts","../src/skills/library.ts","../src/skills/install.ts","../src/tools/skill.ts","../src/tools/task.ts","../src/core/update.ts","../src/app/configcmd.ts","../src/app/secret.ts","../src/app/tui.tsx","../src/ui/App.tsx","../src/mcp/add.ts","../src/ui/commands.ts","../src/ui/components/Confirm.tsx","../src/ui/input.ts","../src/ui/layout.ts","../src/ui/i18n.ts","../src/ui/theme.ts","../src/ui/components/LanguagePicker.tsx","../src/ui/components/Logo.tsx","../src/ui/workspace.ts","../src/ui/components/Onboarding.tsx","../src/ui/components/PermissionPrompt.tsx","../src/ui/components/Diff.tsx","../src/ui/diff.ts","../src/ui/components/Picker.tsx","../src/ui/components/PromptInput.tsx","../src/ui/history.ts","../src/ui/components/StatusBar.tsx","../src/ui/time.ts","../src/ui/components/Transcript.tsx","../src/ui/markdown.tsx","../src/ui/transcript.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { resolve } from 'node:path'\nimport type { AgentMode } from './tools/permissions'\nimport { addProvider } from './app/add'\nimport { ask } from './app/ask'\nimport { showConfig } from './app/configcmd'\nimport { readApiKey } from './app/secret'\nimport { listSessions, shortSessionId } from './core/session'\nimport { startTui } from './app/tui'\nimport { deletePrompt, listPrompts } from './prompts/library'\nimport { revokeWorkspaceTrust, trustWorkspace } from './config/trust'\nimport { KITCODE_VERSION } from './version'\n\nconst program = new Command()\n\nprogram\n .name('kitcode')\n .description('Terminal coding agent with a config you never have to write by hand')\n .version(KITCODE_VERSION)\n .option('-c, --continue', 'resume the most recent session for this directory')\n .option('-r, --resume <id>', 'reopen a past chat by id (any unique part of it works)')\n .option('--cwd <path>', 'run in this directory instead of the current one')\n .option('--model <ref>', 'start the session with this model (provider/model or model)')\n .option('--mode <mode>', 'start in this permission mode: normal | accept | plan')\n .action(async (options: { continue?: boolean; resume?: string; cwd?: string; model?: string; mode?: string }) => {\n const MODES: AgentMode[] = ['normal', 'accept', 'plan']\n if (options.mode && !MODES.includes(options.mode as AgentMode)) {\n throw new Error(`Unknown mode \"${options.mode}\". Use normal, accept or plan.`)\n }\n let cwd = options.cwd\n if (cwd) {\n try {\n cwd = resolve(cwd)\n } catch {\n \n }\n }\n await startTui({\n continueSession: options.continue,\n resumeId: options.resume,\n cwd,\n modelRef: options.model,\n mode: options.mode as AgentMode | undefined,\n })\n })\n\nprogram\n .command('trust')\n .description('trust this workspace so its project config and skills can be loaded')\n .option('--revoke', 'remove trust for this workspace')\n .action(async (options: { revoke?: boolean }) => {\n const workspace = options.revoke\n ? await revokeWorkspaceTrust(process.cwd())\n : await trustWorkspace(process.cwd())\n console.log(`${options.revoke ? 'trust removed' : 'workspace trusted'}: ${workspace}`)\n })\n\nprogram\n .command('sessions')\n .description('list past chats')\n .action(async () => {\n const entries = await listSessions(30)\n if (entries.length === 0) {\n console.log('no saved sessions')\n return\n }\n for (const entry of entries) {\n console.log(\n `${shortSessionId(entry.id)} ${entry.updatedAt.slice(0, 16).replace('T', ' ')} ` +\n `${String(entry.messageCount).padStart(3)} msgs ${entry.cwd}`,\n )\n if (entry.title) console.log(` ${entry.title}`)\n }\n console.log('\\nreopen one with: kitcode -r <id>')\n })\n\nprogram\n .command('add')\n .description('detect and add a provider; the API key is read securely')\n .argument('<url>', 'API base URL, e.g. https://openrouter.ai/api/v1')\n .option('--name <name>', 'override the derived provider id')\n .option('--local', 'write ./kitcode.json in this directory instead of the global config')\n .option('--key-env <name>', 'read the API key from this environment variable')\n .option('--key-stdin', 'read the API key from stdin')\n .action(async (\n url: string,\n options: { name?: string; local?: boolean; keyEnv?: string; keyStdin?: boolean },\n ) => {\n const key = await readApiKey(options)\n await addProvider(url, key, options)\n })\n\nprogram\n .command('ask')\n .description('run a single turn and print the answer')\n .argument('<text...>')\n .option('-y, --yes', 'approve every tool call without asking')\n .option('--mode <mode>', 'normal | accept | plan')\n .action(async (text: string[], options: { yes?: boolean; mode?: string }) => {\n const mode = options.mode\n if (mode && !(['normal', 'accept', 'plan'] as AgentMode[]).includes(mode as AgentMode)) {\n throw new Error(`Unknown mode \"${mode}\". Use normal, accept or plan.`)\n }\n await ask(text.join(' '), { yes: options.yes, mode: mode as AgentMode | undefined })\n })\n\nprogram\n .command('config')\n .description('show where the config and keys live')\n .option('--local', 'move the config into ./kitcode.json in this directory')\n .action(async (options: { local?: boolean }) => {\n await showConfig(options)\n })\n\nconst prompts = program.command('prompt').description('manage saved prompts')\n\nprompts\n .command('list')\n .description('list saved prompts')\n .action(async () => {\n const saved = await listPrompts()\n if (saved.length === 0) {\n console.log('no saved prompts')\n return\n }\n for (const prompt of saved) {\n console.log(`${prompt.slug}\\t${prompt.name}${prompt.description ? ` — ${prompt.description}` : ''}`)\n }\n })\n\nprompts\n .command('rm')\n .description('delete a saved prompt')\n .argument('<slug>')\n .action(async (slug: string) => {\n console.log((await deletePrompt(slug)) ? `deleted ${slug}` : `no such prompt: ${slug}`)\n })\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n})\n","import { existsSync } from 'node:fs'\nimport { formatModelRef, parseModelRef } from '../config/schema'\nimport { detectProvider } from '../config/detect'\nimport { authPath, projectConfigPath } from '../config/paths'\nimport {\n configLocation,\n initProjectConfig,\n loadAuth,\n loadProjectConfig,\n loadRuntimeConfig,\n saveAuth,\n saveConfig,\n} from '../config/store'\nimport { isWorkspaceTrusted, trustWorkspace } from '../config/trust'\nimport type { ModelInfo } from '../providers/types'\n\nconst PREFERRED = ['claude-opus-5', 'claude-sonnet-5', 'gpt-5', 'claude-opus-4-8']\nconst LABEL_WIDTH = 10\nconst ALTERNATIVES = 2\n\nexport async function addProvider(\n url: string,\n key: string,\n options: { name?: string; local?: boolean } = {},\n): Promise<void> {\n const cwd = process.cwd()\n if (options.local) {\n const existing = projectConfigPath(cwd)\n if (existsSync(existing) && !(await isWorkspaceTrusted(cwd))) {\n throw new Error(\n `Project config already exists at ${existing}. Review it and run \"kitcode trust\" before adding a provider to it.`,\n )\n }\n }\n const detected = await detectProvider(url, key, { name: options.name })\n if (options.local) {\n await initProjectConfig(cwd)\n await trustWorkspace(cwd)\n }\n const config = options.local ? await loadProjectConfig(cwd) : (await loadRuntimeConfig(cwd)).config\n const auth = await loadAuth()\n\n config.providers[detected.id] = detected.config\n auth[detected.id] = key\n\n const models = detected.models\n if (!config.model) {\n const chosen = pickDefault(models)\n if (chosen) config.model = formatModelRef(detected.id, chosen)\n }\n\n await saveConfig(config)\n await saveAuth(auth)\n const location = await configLocation()\n\n const protocol = detected.config.type === 'anthropic' ? 'Anthropic' : 'OpenAI-compatible'\n const rows: [string, string][] = [\n ['provider', `${detected.id} — this endpoint speaks the ${protocol} protocol`],\n ['models', models.length === 0 ? 'none listed by this endpoint' : `${models.length} available`],\n ['default', describeDefault(config.model, detected.id, models)],\n ]\n\n alternatives(models, config.model, detected.id).forEach((model, index) => {\n const ref = formatModelRef(detected.id, model.id)\n rows.push([index === 0 ? 'also try' : '', `${ref} ${price(model)}`])\n })\n\n rows.push(['config', `${location.path} (${location.scope})`])\n rows.push(['key', `${authPath} — mode 0600, never written into a project directory`])\n rows.push(['next', 'run kitcode to start a session; /model switches models'])\n\n for (const [label, value] of rows) console.log(label.padEnd(LABEL_WIDTH) + value)\n}\n\nfunction describeDefault(ref: string | undefined, providerId: string, models: ModelInfo[]): string {\n if (!ref) return 'not set — start kitcode and pick one with /model'\n const parsed = parseModelRef(ref)\n if (parsed?.provider !== providerId) return `${ref} — already in your config, left alone`\n return `${ref} ${price(models.find((model) => model.id === parsed.model))}`\n}\n\nfunction price(model: ModelInfo | undefined): string {\n const pricing = model?.pricing\n if (!pricing) return 'pricing not reported by this endpoint'\n return `${money(pricing.input)} in / ${money(pricing.output)} out per million tokens`\n}\n\nfunction money(value: number): string {\n return `$${value >= 1 ? value.toFixed(2) : Number(value.toFixed(4))}`\n}\n\nfunction pickDefault(models: ModelInfo[]): string | undefined {\n for (const preferred of PREFERRED) {\n const match = models.find((model) => model.id.endsWith(preferred))\n if (match) return match.id\n }\n return models[0]?.id\n}\n\nfunction alternatives(\n models: ModelInfo[],\n defaultRef: string | undefined,\n providerId: string,\n): ModelInfo[] {\n const ranked = [\n ...PREFERRED.flatMap((preferred) => models.filter((model) => model.id.endsWith(preferred))),\n ...models.filter((model) => model.pricing),\n ...models,\n ]\n const picked = new Map<string, ModelInfo>()\n for (const model of ranked) {\n if (picked.size === ALTERNATIVES) break\n if (formatModelRef(providerId, model.id) !== defaultRef) picked.set(model.id, model)\n }\n return [...picked.values()]\n}\n","import { z } from 'zod'\n\nexport function isAllowedEndpointUrl(value: string): boolean {\n try {\n const url = new URL(value)\n if (url.username || url.password) return false\n if (url.protocol === 'https:') return true\n if (url.protocol !== 'http:') return false\n const host = url.hostname.toLowerCase()\n return (\n host === 'localhost' ||\n host.endsWith('.localhost') ||\n host === '[::1]' ||\n host === '::1' ||\n /^127(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}$/.test(host)\n )\n } catch {\n return false\n }\n}\n\nconst httpUrl = z.string().refine(isAllowedEndpointUrl, {\n message: 'must use https, except for localhost/127.0.0.1 development endpoints',\n})\n\nexport const providerKindSchema = z.enum(['anthropic', 'openai'])\n\nexport const providerConfigSchema = z.object({\n type: providerKindSchema,\n baseUrl: httpUrl,\n label: z.string().optional(),\n keyEnv: z.string().optional(),\n headers: z.record(z.string(), z.string()).optional(),\n})\n\nexport const effortSchema = z.enum(['low', 'medium', 'high', 'xhigh', 'max'])\n\nexport const permissionModeSchema = z.enum(['allow', 'ask', 'deny'])\n\nconst mcpStdioSchema = z.object({\n type: z.literal('stdio'),\n command: z.string().min(1),\n args: z.array(z.string()).default([]),\n env: z.record(z.string(), z.string()).default({}),\n enabled: z.boolean().default(true),\n})\n\nconst mcpHttpSchema = z.object({\n type: z.literal('http'),\n url: httpUrl,\n headers: z.record(z.string(), z.string()).default({}),\n enabled: z.boolean().default(true),\n})\n\nexport const mcpServerSchema = z.discriminatedUnion('type', [mcpStdioSchema, mcpHttpSchema])\n\nexport const themeSchema = z.object({\n accent: z.string().default('#a78bfa'),\n})\n\nexport const langSchema = z.enum(['en', 'ru'])\n\nexport const budgetSchema = z.object({\n maxTokensPerTurn: z.number().int().min(0).max(10_000_000).default(10_000_000),\n maxCostUsdPerTurn: z.number().positive().max(1_000).default(5),\n maxSubagentsPerTurn: z.number().int().min(0).max(16).default(3),\n})\n\nexport const diagnosticsSchema = z.object({\n autoRun: z.boolean().default(true),\n commands: z.array(z.string().trim().min(1).max(20_000)).max(8).default([]),\n})\n\nexport const updatesSchema = z.object({\n \n checkOnStart: z.boolean().default(false),\n})\n\nexport const configSchema = z.object({\n version: z.literal(1).default(1),\n model: z.string().optional(),\n lang: langSchema.optional(),\n theme: themeSchema.default({ accent: '#a78bfa' }),\n effort: effortSchema.default('xhigh'),\n thinking: z.boolean().default(true),\n maxTokens: z.number().int().positive().max(200_000).default(64_000),\n budget: budgetSchema.default({\n maxTokensPerTurn: 10_000_000,\n maxCostUsdPerTurn: 5,\n maxSubagentsPerTurn: 3,\n }),\n diagnostics: diagnosticsSchema.default({ autoRun: true, commands: [] }),\n updates: updatesSchema.default({ checkOnStart: false }),\n providers: z.record(z.string(), providerConfigSchema).default({}),\n permissions: z.record(z.string(), permissionModeSchema).default({}),\n mcp: z.record(z.string(), mcpServerSchema).default({}),\n})\n\nexport const authSchema = z.record(z.string(), z.string())\n\nexport type ProviderConfig = z.infer<typeof providerConfigSchema>\nexport type McpServerConfig = z.infer<typeof mcpServerSchema>\nexport type Config = z.infer<typeof configSchema>\nexport type AuthFile = z.infer<typeof authSchema>\n\nexport function defaultConfig(): Config {\n return configSchema.parse({})\n}\n\nexport function parseModelRef(ref: string): { provider: string; model: string } | null {\n const slash = ref.indexOf('/')\n if (slash <= 0 || slash === ref.length - 1) return null\n return { provider: ref.slice(0, slash), model: ref.slice(slash + 1) }\n}\n\nexport function formatModelRef(provider: string, model: string): string {\n return `${provider}/${model}`\n}\n","import Anthropic from '@anthropic-ai/sdk'\nimport OpenAI from 'openai'\nimport { ProviderError } from './types'\n\nexport const REQUEST_TIMEOUT_MS = 600_000\nexport const MAX_RETRIES = 3\n\nconst EXCERPT_CHARS = 240\nconst CAPTURE_CHARS = EXCERPT_CHARS * 2\n\nconst RETRYABLE_STATUS = new Set([408, 409, 429])\nconst PERMANENT_STATUS = new Set([400, 401, 403, 404, 405, 422])\n\nconst SECRET =\n /Bearer\\s+\\S+|\\b(?:sk|pk|rk|xai|gsk|ghp|gho|hf|nvapi|glpat)[-_][A-Za-z0-9._-]{4,}|\\b[A-Za-z0-9]{32,}\\b/g\nconst NAMED_SECRET =\n /((?:[\"']?)(?:authorization|x-api-key|api[-_ ]?key|access[-_ ]?token|refresh[-_ ]?token|token|secret|password|cookie|set-cookie)(?:[\"']?)\\s*[:=]\\s*)(?:Bearer\\s+\\S+|\"[^\"\\r\\n]*\"|'[^'\\r\\n]*'|[^\\s,;}\\]]+)/gi\n\nconst CONNECTION_REASONS: Record<string, string> = {\n ENOTFOUND: 'the hostname does not resolve',\n EAI_AGAIN: 'the DNS lookup failed, the resolver is unreachable or throttled',\n ECONNREFUSED: 'nothing is listening on that host and port',\n ECONNRESET: 'the connection was reset before the response finished',\n ECONNABORTED: 'the connection was aborted',\n ETIMEDOUT: 'the connection timed out',\n EHOSTUNREACH: 'the host is unreachable',\n ENETUNREACH: 'the network is unreachable',\n EPIPE: 'the connection closed mid-request',\n UND_ERR_SOCKET: 'the socket closed unexpectedly',\n CERT_HAS_EXPIRED: 'the TLS certificate has expired',\n DEPTH_ZERO_SELF_SIGNED_CERT: 'the TLS certificate is self-signed',\n UNABLE_TO_VERIFY_LEAF_SIGNATURE: 'the TLS certificate chain cannot be verified',\n}\n\nexport function describeProviderFailure(error: unknown, providerId: string): string {\n const abort = abortKind(error)\n if (abort === 'user') return `Request to \"${providerId}\" was cancelled.`\n if (abort === 'timeout') {\n return `Request to \"${providerId}\" ran out of time before the provider answered — it may be overloaded, try again.`\n }\n\n const status = statusOf(error)\n if (status !== undefined) return describeStatus(status, providerId, error)\n\n const reason = connectionReason(error)\n if (reason) {\n return `Cannot reach \"${providerId}\": ${reason}. Check the base URL and your network.`\n }\n\n return `Request to \"${providerId}\" failed — ${snippet(messageOf(error))}`\n}\n\nexport function isRetryableFailure(error: unknown): boolean {\n const abort = abortKind(error)\n if (abort === 'user') return false\n if (abort === 'timeout') return true\n\n const status = statusOf(error)\n if (status === undefined) return connectionReason(error) !== undefined\n if (PERMANENT_STATUS.has(status)) return false\n return RETRYABLE_STATUS.has(status) || status >= 500\n}\n\nfunction statusOf(error: unknown): number | undefined {\n const value = prop(error, 'status') ?? prop(error, 'statusCode')\n return typeof value === 'number' && value >= 100 ? value : undefined\n}\n\nexport function isUserAbort(error: unknown, signal?: AbortSignal): boolean {\n return signal?.aborted === true || abortKind(error) === 'user'\n}\n\nexport function isConnectionFailure(error: unknown): boolean {\n return connectionReason(error) !== undefined\n}\n\nexport function toProviderError(error: unknown, providerId: string): ProviderError {\n return new ProviderError(describeProviderFailure(error, providerId), providerId, statusOf(error), {\n cause: error,\n })\n}\n\nexport interface ResponseCapture {\n fetch: (input: Parameters<typeof fetch>[0], init?: RequestInit) => Promise<Response>\n succeeded(): boolean\n headers(): Headers | null\n head(): Promise<string>\n}\n\nexport function captureResponseHead(): ResponseCapture {\n let ok = false\n let responseHeaders: Headers | null = null\n let head: Promise<string> = Promise.resolve('')\n return {\n succeeded: () => ok,\n headers: () => responseHeaders,\n head: () => head,\n fetch: async (input, init) => {\n const response = await fetch(input, init)\n ok = response.ok\n responseHeaders = new Headers(response.headers)\n if (!response.body) {\n head = Promise.resolve('')\n return response\n }\n const [forward, copy] = response.body.tee()\n head = readHead(copy)\n return new Response(forward, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n },\n }\n}\n\nasync function readHead(stream: ReadableStream<Uint8Array>): Promise<string> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let text = ''\n try {\n while (text.length < CAPTURE_CHARS) {\n const { done, value } = await reader.read()\n if (done) break\n text += decoder.decode(value, { stream: true })\n }\n } catch {\n return text\n } finally {\n void reader.cancel().catch(() => {})\n }\n return text\n}\n\nexport async function invalidStreamError(\n providerId: string,\n capture: ResponseCapture,\n cause?: unknown,\n): Promise<ProviderError> {\n const excerpt = snippet(await capture.head(), EXCERPT_CHARS)\n const detail = excerpt === '' ? 'the body was empty' : `the body began: ${excerpt}`\n return new ProviderError(\n `\"${providerId}\" returned a response that is not a valid streaming chat completion — no stream events arrived and ${detail}. The endpoint may speak a different protocol than the one configured for it.`,\n providerId,\n undefined,\n cause === undefined ? undefined : { cause },\n )\n}\n\nfunction describeStatus(status: number, providerId: string, error: unknown): string {\n const detail = detailOf(error, status)\n const wait = retryAfterSeconds(error)\n const after = wait === undefined ? undefined : `retry after ${wait}s`\n\n if (status === 401) {\n return `The API key for \"${providerId}\" was rejected (401) — re-run: kitcode add <url>`\n }\n if (status === 403) {\n return `The API key for \"${providerId}\" is valid but has no access to this model (403)${detail}`\n }\n if (status === 404) {\n return `\"${providerId}\" has no such model, or the base URL is wrong (404)${detail}`\n }\n if (status === 408) {\n return `Request to \"${providerId}\" timed out (408) — ${after ?? 'try again'}`\n }\n if (status === 429) {\n return `\"${providerId}\" rate limited this request (429) — ${after ?? 'try again shortly'}`\n }\n if (status >= 500) {\n return `\"${providerId}\" is down or overloaded (${status}) — try again shortly`\n }\n return `\"${providerId}\" rejected the request (${status})${detail}`\n}\n\nfunction abortKind(error: unknown): 'user' | 'timeout' | undefined {\n if (\n error instanceof Anthropic.APIConnectionTimeoutError ||\n error instanceof OpenAI.APIConnectionTimeoutError\n ) {\n return 'timeout'\n }\n if (error instanceof Anthropic.APIUserAbortError || error instanceof OpenAI.APIUserAbortError) {\n return 'user'\n }\n const name = prop(error, 'name')\n if (name === 'TimeoutError') return 'timeout'\n if (name === 'AbortError') return 'user'\n return undefined\n}\n\nfunction connectionReason(error: unknown): string | undefined {\n const links = chain(error)\n for (const link of links) {\n for (const candidate of [link, ...siblings(link)]) {\n const code = prop(candidate, 'code')\n const known = typeof code === 'string' ? CONNECTION_REASONS[code] : undefined\n if (known) return `${known} (${code})`\n }\n }\n\n const deepest = links[links.length - 1]\n if (links.length > 1 && deepest instanceof Error) return snippet(deepest.message)\n\n const message = messageOf(error)\n return /fetch failed|connection error|socket|network/i.test(message) ? snippet(message) : undefined\n}\n\nfunction chain(error: unknown): unknown[] {\n const links: unknown[] = []\n let current = error\n while (current !== null && typeof current === 'object' && links.length < 5) {\n links.push(current)\n current = (current as { cause?: unknown }).cause\n }\n return links\n}\n\nfunction siblings(link: unknown): unknown[] {\n const errors = prop(link, 'errors')\n return Array.isArray(errors) ? errors.slice(0, 4) : []\n}\n\nfunction retryAfterSeconds(error: unknown): number | undefined {\n const millis = Number(header(error, 'retry-after-ms'))\n if (Number.isFinite(millis) && millis > 0) return Math.ceil(millis / 1000)\n\n const raw = header(error, 'retry-after')\n if (raw === undefined) return undefined\n const seconds = Number(raw)\n if (Number.isFinite(seconds) && seconds > 0) return Math.ceil(seconds)\n const at = Date.parse(raw)\n return Number.isNaN(at) ? undefined : Math.max(1, Math.ceil((at - Date.now()) / 1000))\n}\n\nfunction header(error: unknown, name: string): string | undefined {\n const headers = prop(error, 'headers')\n if (headers === null || typeof headers !== 'object') return undefined\n const bag = headers as { get?: (key: string) => string | null }\n if (typeof bag.get === 'function') return bag.get(name) ?? undefined\n const value = (headers as Record<string, unknown>)[name]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction detailOf(error: unknown, status: number): string {\n const raw = bodyMessage(error) ?? messageOf(error).replace(new RegExp(`^${status}\\\\s+`), '')\n const text = snippet(raw)\n if (text === '' || text === String(status) || text === 'status code (no body)') return ''\n return ` — ${text}`\n}\n\nfunction bodyMessage(error: unknown): string | undefined {\n const body = prop(error, 'error')\n const nested = prop(body, 'error')\n const candidates = [prop(body, 'message'), prop(nested, 'message'), prop(body, 'detail')]\n const found = candidates.find((value) => typeof value === 'string' && value.trim() !== '')\n return typeof found === 'string' ? found : undefined\n}\n\nfunction messageOf(error: unknown): string {\n if (error instanceof Error) return error.message\n if (typeof error === 'string') return error\n if (error === null || error === undefined) return 'unknown error'\n return String(error)\n}\n\nfunction snippet(text: string, limit = 160): string {\n return redactSecrets(oneLine(text)).slice(0, limit)\n}\n\nfunction oneLine(text: string): string {\n return text.replace(/\\s+/g, ' ').trim()\n}\n\nexport function redactSecrets(text: string, knownSecrets: Iterable<string> = []): string {\n let safe = text.replace(NAMED_SECRET, '$1[redacted]').replace(SECRET, '[redacted]')\n for (const secret of knownSecrets) {\n if (secret.length >= 4) safe = safe.split(secret).join('[redacted]')\n }\n return safe\n}\n\nfunction prop(value: unknown, key: string): unknown {\n if (value === null || typeof value !== 'object') return undefined\n return (value as Record<string, unknown>)[key]\n}\n","export type Effort = 'low' | 'medium' | 'high' | 'xhigh' | 'max'\n\nexport type JsonSchema = Record<string, unknown>\n\nexport interface ModelPricing {\n input: number\n output: number\n cacheWrite?: number\n cacheRead?: number\n}\n\nexport interface ModelInfo {\n id: string\n name?: string\n contextWindow?: number\n maxOutput?: number\n pricing?: ModelPricing\n}\n\nexport interface ToolSchema {\n name: string\n description: string\n inputSchema: JsonSchema\n}\n\nexport interface TextBlock {\n type: 'text'\n text: string\n}\n\nexport interface ThinkingBlock {\n type: 'thinking'\n text: string\n raw?: unknown\n}\n\nexport interface ToolUseBlock {\n type: 'tool_use'\n id: string\n name: string\n input: unknown\n}\n\nexport interface ToolResultBlock {\n type: 'tool_result'\n toolUseId: string\n content: string\n isError?: boolean\n}\n\nexport interface ImageBlock {\n type: 'image'\n mediaType: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp'\n data: string\n name: string\n}\n\nexport interface FileBlock {\n type: 'file'\n mediaType: string\n text: string\n name: string\n}\n\nexport type ContentBlock =\n | TextBlock\n | ThinkingBlock\n | ToolUseBlock\n | ToolResultBlock\n | ImageBlock\n | FileBlock\n\nexport type MessageRole = 'user' | 'assistant'\n\nexport interface Message {\n role: MessageRole\n content: ContentBlock[]\n}\n\nexport interface ChatRequest {\n model: string\n system: string\n messages: Message[]\n tools: ToolSchema[]\n maxTokens: number\n effort?: Effort\n thinking?: boolean\n signal?: AbortSignal\n}\n\nexport type StopReason =\n | 'end_turn'\n | 'tool_use'\n | 'max_tokens'\n | 'pause_turn'\n | 'refusal'\n | 'aborted'\n\nexport interface Usage {\n input: number\n output: number\n cacheWrite: number\n cacheRead: number\n}\n\nexport interface RefusalInfo {\n category?: string | null\n explanation?: string | null\n}\n\nexport interface RateLimitBucket {\n limit?: number\n remaining?: number\n reset?: string\n}\n\nexport interface RateLimits {\n requests?: RateLimitBucket\n tokens?: RateLimitBucket\n inputTokens?: RateLimitBucket\n outputTokens?: RateLimitBucket\n}\n\nexport type StreamEvent =\n | { type: 'text_delta'; text: string }\n | { type: 'thinking_delta'; text: string }\n | { type: 'tool_call'; id: string; name: string; input: unknown }\n | { type: 'usage'; usage: Usage }\n | { type: 'rate_limits'; limits: RateLimits }\n | { type: 'done'; stopReason: StopReason; content: ContentBlock[]; refusal?: RefusalInfo }\n\nexport type ProviderKind = 'anthropic' | 'openai'\n\nexport interface Provider {\n readonly id: string\n readonly kind: ProviderKind\n stream(req: ChatRequest): AsyncIterable<StreamEvent>\n listModels(): Promise<ModelInfo[]>\n knownModels(): ModelInfo[]\n}\n\nexport class ProviderError extends Error {\n constructor(\n message: string,\n readonly providerId: string,\n readonly status?: number,\n options?: ErrorOptions,\n ) {\n super(message, options)\n this.name = 'ProviderError'\n }\n}\n\nexport function emptyUsage(): Usage {\n return { input: 0, output: 0, cacheWrite: 0, cacheRead: 0 }\n}\n\nexport function addUsage(a: Usage, b: Usage): Usage {\n return {\n input: a.input + b.input,\n output: a.output + b.output,\n cacheWrite: a.cacheWrite + b.cacheWrite,\n cacheRead: a.cacheRead + b.cacheRead,\n }\n}\n","import type { ModelInfo, ModelPricing } from './types'\n\ninterface RawModel {\n id?: unknown\n name?: unknown\n display_name?: unknown\n context_length?: unknown\n context_window?: unknown\n max_context_length?: unknown\n max_model_len?: unknown\n model_max_length?: unknown\n max_sequence_length?: unknown\n max_input_tokens?: unknown\n top_provider?: { context_length?: unknown; context_window?: unknown } | null\n pricing?: unknown\n}\n\nexport function modelInfoFromRaw(entry: unknown): ModelInfo | null {\n if (typeof entry !== 'object' || entry === null) return null\n const raw = entry as RawModel\n if (typeof raw.id !== 'string' || raw.id === '') return null\n\n const model: ModelInfo = { id: raw.id }\n const name = typeof raw.name === 'string' ? raw.name : raw.display_name\n if (typeof name === 'string' && name !== '') model.name = name\n\n const contextWindow =\n positiveInt(raw.context_length) ??\n positiveInt(raw.context_window) ??\n positiveInt(raw.max_context_length) ??\n positiveInt(raw.max_model_len) ??\n positiveInt(raw.model_max_length) ??\n positiveInt(raw.max_sequence_length) ??\n positiveInt(raw.top_provider?.context_length) ??\n positiveInt(raw.top_provider?.context_window) ??\n positiveInt(raw.max_input_tokens)\n if (contextWindow !== undefined) model.contextWindow = contextWindow\n\n const pricing = toPricing(raw.pricing)\n if (pricing) model.pricing = pricing\n\n return model\n}\n\nfunction toPricing(raw: unknown): ModelPricing | undefined {\n if (typeof raw !== 'object' || raw === null) return undefined\n const source = raw as Record<string, unknown>\n const input = perMillion(source.prompt)\n const output = perMillion(source.completion)\n if (input === undefined || output === undefined) return undefined\n\n const pricing: ModelPricing = { input, output }\n const cacheWrite = perMillion(source.input_cache_write)\n const cacheRead = perMillion(source.input_cache_read)\n if (cacheWrite !== undefined) pricing.cacheWrite = cacheWrite\n if (cacheRead !== undefined) pricing.cacheRead = cacheRead\n return pricing\n}\n\nfunction perMillion(value: unknown): number | undefined {\n const perToken = toNumber(value)\n if (perToken === undefined || perToken <= 0) return undefined\n return Math.round(perToken * 1e12) / 1e6\n}\n\nfunction positiveInt(value: unknown): number | undefined {\n const parsed = toNumber(value)\n if (parsed === undefined || parsed <= 0) return undefined\n return Math.trunc(parsed)\n}\n\nfunction toNumber(value: unknown): number | undefined {\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value !== 'string' || value.trim() === '') return undefined\n const parsed = Number(value)\n return Number.isFinite(parsed) ? parsed : undefined\n}\n","import { redactSecrets } from '../providers/errors'\nimport { modelInfoFromRaw } from '../providers/model-info'\nimport type { ModelInfo } from '../providers/types'\nimport { isAllowedEndpointUrl } from './schema'\nimport type { ProviderConfig } from './schema'\n\nexport interface DetectedProvider {\n id: string\n config: ProviderConfig\n models: ModelInfo[]\n}\n\nexport interface DetectOptions {\n name?: string\n fetchImpl?: typeof fetch\n timeoutMs?: number\n}\n\nexport const DETECT_TIMEOUT_MS = 15_000\nconst MAX_DETECT_BODY_BYTES = 5_000_000\n\nconst anthropicHost = 'api.anthropic.com'\nconst anthropicBaseUrl = 'https://api.anthropic.com'\n\nexport async function detectProvider(\n rawUrl: string,\n apiKey: string,\n opts: DetectOptions = {},\n): Promise<DetectedProvider> {\n const fetchImpl = withTimeout(opts.fetchImpl ?? fetch, opts.timeoutMs ?? DETECT_TIMEOUT_MS)\n const baseUrl = normaliseBaseUrl(rawUrl)\n if (!isAllowedEndpointUrl(baseUrl)) {\n throw new Error('API URL must use https; plain http is only allowed for localhost or 127.0.0.1.')\n }\n const id = opts.name ?? providerIdFromUrl(baseUrl)\n\n if (hostname(baseUrl) === anthropicHost) {\n const probed = await probe(\n fetchImpl,\n `${anthropicBaseUrl}/v1/models?limit=1000`,\n anthropicHeaders(apiKey),\n )\n return {\n id,\n config: { type: 'anthropic', baseUrl: anthropicBaseUrl },\n models: probed.ok ? parseModelList(probed.body) : [],\n }\n }\n\n let last: Probe | undefined\n for (const candidate of candidateBaseUrls(baseUrl)) {\n const url = `${candidate}/models`\n let attempt = await probe(fetchImpl, url, { Authorization: `Bearer ${apiKey}` })\n last = attempt\n if (attempt.ok && isModelListBody(attempt.body)) {\n const anthropic = advertisesAnthropicProtocol(attempt.body)\n return {\n id,\n config: anthropic\n ? { type: 'anthropic', baseUrl: anthropicRoot(candidate) }\n : { type: 'openai', baseUrl: candidate },\n models: parseModelList(attempt.body),\n }\n }\n\n if (attempt.status === 401 || attempt.status === 403) {\n attempt = await probe(fetchImpl, url, anthropicHeaders(apiKey))\n last = attempt\n if (attempt.ok) {\n return {\n id,\n config: { type: 'anthropic', baseUrl: anthropicRoot(candidate) },\n models: parseModelList(attempt.body),\n }\n }\n }\n if (!attempt.ok && attempt.status !== 404 && attempt.status !== 0) break\n }\n\n throw new Error(describeFailure(last!))\n}\n\nexport function normaliseBaseUrl(rawUrl: string): string {\n return rawUrl.trim().replace(/\\/+$/, '')\n}\n\nexport function providerIdFromUrl(url: string): string {\n const host = hostname(url)\n if (isAddressLiteral(host)) {\n const port = new URL(url).port\n return port ? `local-${port}` : 'local'\n }\n const labels = host.split('.')\n const label = labels.find((part) => part !== 'api' && part !== '') ?? 'provider'\n return label.replace(/[^a-z0-9-]/g, '-')\n}\n\nfunction isAddressLiteral(host: string): boolean {\n return host === 'localhost' || /^[0-9.]+$/.test(host) || host.includes(':')\n}\n\nexport function parseModelList(body: unknown): ModelInfo[] {\n const data = Array.isArray(body) ? body : (body as { data?: unknown } | null)?.data\n if (!Array.isArray(data)) return []\n return data.flatMap((entry) => {\n const model = modelInfoFromRaw(entry)\n return model ? [model] : []\n })\n}\n\ninterface Probe {\n ok: boolean\n url: string\n status: number\n body: unknown\n text: string\n}\n\nasync function probe(\n fetchImpl: typeof fetch,\n url: string,\n headers: Record<string, string>,\n): Promise<Probe> {\n let response: Response\n try {\n response = await fetchImpl(url, { method: 'GET', headers })\n } catch (error) {\n return { ok: false, url, status: 0, body: undefined, text: describeThrown(error) }\n }\n let text: string\n try {\n text = await boundedResponseText(response)\n } catch (error) {\n return {\n ok: false,\n url,\n status: response.status,\n body: undefined,\n text: describeThrown(error),\n }\n }\n let body: unknown\n try {\n body = JSON.parse(text)\n } catch {\n body = undefined\n }\n return { ok: response.ok, url, status: response.status, body, text }\n}\n\nasync function boundedResponseText(response: Response): Promise<string> {\n const declared = Number(response.headers.get('content-length'))\n if (Number.isFinite(declared) && declared > MAX_DETECT_BODY_BYTES) {\n await response.body?.cancel().catch(() => undefined)\n throw new Error(`response exceeded ${MAX_DETECT_BODY_BYTES / 1_000_000} MB`)\n }\n if (!response.body) return ''\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let bytes = 0\n let text = ''\n try {\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n bytes += value.byteLength\n if (bytes > MAX_DETECT_BODY_BYTES) {\n throw new Error(`response exceeded ${MAX_DETECT_BODY_BYTES / 1_000_000} MB`)\n }\n text += decoder.decode(value, { stream: true })\n }\n return text + decoder.decode()\n } finally {\n void reader.cancel().catch(() => undefined)\n }\n}\n\nfunction withTimeout(fetchImpl: typeof fetch, timeoutMs: number): typeof fetch {\n return async (input, init) => {\n const controller = new AbortController()\n const expiry = new Error(`timed out after ${Math.round(timeoutMs / 100) / 10}s`)\n \n \n expiry.name = 'TimeoutError'\n let timer: ReturnType<typeof setTimeout> | undefined\n const expired = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n controller.abort(expiry)\n reject(expiry)\n }, timeoutMs)\n })\n try {\n return await Promise.race([fetchImpl(input, { ...init, signal: controller.signal }), expired])\n } finally {\n clearTimeout(timer)\n }\n }\n}\n\nfunction candidateBaseUrls(baseUrl: string): string[] {\n return baseUrl.endsWith('/v1') ? [baseUrl] : [baseUrl, `${baseUrl}/v1`]\n}\n\nfunction anthropicHeaders(apiKey: string): Record<string, string> {\n return { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' }\n}\n\nfunction isModelListBody(body: unknown): boolean {\n return Array.isArray(body) || Array.isArray((body as { data?: unknown } | null)?.data)\n}\n\nfunction anthropicRoot(baseUrl: string): string {\n return baseUrl.replace(/\\/v1$/, '')\n}\n\nfunction advertisesAnthropicProtocol(body: unknown): boolean {\n const entries = modelEntries(body)\n if (entries.length === 0) return false\n\n const endpointTypes = new Set(\n entries.flatMap((entry) => stringList(entry['supported_endpoint_types'])),\n )\n if (endpointTypes.size > 0) {\n return endpointTypes.has('anthropic') && !endpointTypes.has('openai')\n }\n\n if (entries.some(isVendorNamespaced)) return false\n return entries.every((entry) => entry['owned_by'] === 'anthropic')\n}\n\nfunction isVendorNamespaced(entry: Record<string, unknown>): boolean {\n return typeof entry['id'] === 'string' && entry['id'].includes('/')\n}\n\nfunction modelEntries(body: unknown): Record<string, unknown>[] {\n const data = Array.isArray(body) ? body : (body as { data?: unknown } | null)?.data\n if (!Array.isArray(data)) return []\n return data.filter(\n (entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null,\n )\n}\n\nfunction stringList(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n return value.filter((item): item is string => typeof item === 'string')\n}\n\nfunction describeFailure(attempt: Probe): string {\n const status = attempt.status === 0 ? 'request failed' : `HTTP ${attempt.status}`\n const snippet = redactSecrets(attempt.text.trim()).slice(0, 200)\n const detail = snippet === '' ? '' : `: ${snippet}`\n return `No OpenAI- or Anthropic-compatible API found at ${attempt.url} (${status})${detail}`\n}\n\nfunction describeThrown(error: unknown): string {\n if (!(error instanceof Error)) return String(error)\n const cause = error.cause instanceof Error ? ` (${error.cause.message})` : ''\n return `${error.message}${cause}`\n}\n\nfunction hostname(url: string): string {\n try {\n return new URL(url).hostname.toLowerCase()\n } catch {\n throw new Error(`Not a valid URL: ${url}`)\n }\n}\n","import { chmod, mkdir, stat } from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\n\nconst explicitHome = process.env.KITCODE_HOME\n\nexport const homeDir = explicitHome || path.join(os.homedir(), '.kitcode')\n\nexport const configPath = path.join(homeDir, 'config.json')\n\nexport const authPath = path.join(homeDir, 'auth.json')\n\nexport const trustPath = path.join(homeDir, 'trusted-workspaces.json')\n\nexport const promptsDir = path.join(homeDir, 'prompts')\n\nexport const sessionsDir = path.join(homeDir, 'sessions')\n\nexport const checkpointsDir = path.join(homeDir, 'checkpoints')\n\nexport const cacheDir = path.join(homeDir, 'cache')\n\nexport const skillsDir = path.join(homeDir, 'skills')\n\nexport function projectSkillsDir(dir: string): string {\n return path.join(dir, '.kitcode', 'skills')\n}\n\nconst projectConfigName = 'kitcode.json'\n\nexport type ConfigScope = 'env' | 'project' | 'global'\n\nexport interface ConfigLocation {\n path: string\n scope: ConfigScope\n}\n\nexport function projectConfigPath(dir: string): string {\n return path.join(path.resolve(dir), projectConfigName)\n}\n\nasync function findProjectConfig(from: string): Promise<string | undefined> {\n let dir = path.resolve(from)\n for (;;) {\n const candidate = path.join(dir, projectConfigName)\n if (await isFile(candidate)) return candidate\n const parent = path.dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\nexport async function resolveConfigLocation(cwd: string = process.cwd()): Promise<ConfigLocation> {\n const override = process.env.KITCODE_CONFIG\n if (override) return { path: path.resolve(override), scope: 'env' }\n\n const project = await findProjectConfig(cwd)\n if (project) return { path: project, scope: 'project' }\n\n return { path: configPath, scope: 'global' }\n}\n\nexport async function workspaceRootFor(cwd: string = process.cwd()): Promise<string> {\n const project = await findProjectConfig(cwd)\n return project ? path.dirname(project) : path.resolve(cwd)\n}\n\nexport async function ensureDir(dir: string, mode = 0o700): Promise<void> {\n await mkdir(dir, { recursive: true, mode })\n await chmod(dir, mode)\n}\n\nasync function isFile(file: string): Promise<boolean> {\n try {\n return (await stat(file)).isFile()\n } catch {\n return false\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { chmod, readFile, rename, rm, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport type { z } from 'zod'\nimport type { ConfigLocation } from './paths'\nimport {\n authPath,\n configPath,\n ensureDir,\n homeDir,\n projectConfigPath,\n resolveConfigLocation,\n} from './paths'\nimport type { AuthFile, Config, ProviderConfig } from './schema'\nimport { authSchema, configSchema, defaultConfig } from './schema'\nimport { isWorkspaceTrusted } from './trust'\n\nlet active: ConfigLocation | undefined\n\nexport async function configLocation(): Promise<ConfigLocation> {\n active ??= await resolveConfigLocation()\n return active\n}\n\nexport async function loadConfig(cwd?: string): Promise<Config> {\n const location = await resolveConfigLocation(cwd)\n return loadConfigAt(location)\n}\n\nexport async function loadProjectConfig(dir: string): Promise<Config> {\n return loadConfigAt({ path: projectConfigPath(dir), scope: 'project' })\n}\n\nexport interface RuntimeConfigLoad {\n config: Config\n ignoredProject?: ConfigLocation\n}\n\nexport async function loadRuntimeConfig(cwd: string): Promise<RuntimeConfigLoad> {\n const location = await resolveConfigLocation(cwd)\n if (location.scope === 'project' && !(await isWorkspaceTrusted(cwd))) {\n const ignoredProject = location\n const config = await loadConfigAt({ path: configPath, scope: 'global' })\n return { config, ignoredProject }\n }\n return { config: await loadConfigAt(location) }\n}\n\nasync function loadConfigAt(location: ConfigLocation): Promise<Config> {\n active = location\n const raw = await readJson(location.path)\n if (raw === undefined) return defaultConfig()\n const result = configSchema.safeParse(raw)\n if (!result.success) throw new Error(formatIssues(location.path, result.error))\n return result.data\n}\n\nexport async function saveConfig(config: Config): Promise<void> {\n const location = await configLocation()\n await writeJsonAtomic(location.path, config)\n}\n\nexport async function initProjectConfig(dir: string): Promise<ConfigLocation> {\n const location: ConfigLocation = { path: projectConfigPath(dir), scope: 'project' }\n if ((await readJson(location.path)) === undefined) {\n await writeJsonAtomic(location.path, defaultConfig())\n }\n return location\n}\n\nexport async function loadAuth(): Promise<AuthFile> {\n await hardenPrivateHome()\n const raw = await readJson(authPath)\n if (raw === undefined) return {}\n await chmod(authPath, 0o600)\n const result = authSchema.safeParse(raw)\n if (!result.success) throw new Error(formatIssues(authPath, result.error))\n return result.data\n}\n\nexport async function saveAuth(auth: AuthFile): Promise<void> {\n await writeJsonAtomic(authPath, auth, 0o600)\n}\n\nasync function hardenPrivateHome(): Promise<void> {\n try {\n await chmod(homeDir, 0o700)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n }\n}\n\nexport function resolveApiKey(\n providerId: string,\n providerConfig: ProviderConfig,\n auth: AuthFile = {},\n): string | undefined {\n const candidates = [\n providerConfig.keyEnv ? process.env[providerConfig.keyEnv] : undefined,\n process.env[conventionalKeyEnv(providerId)],\n auth[providerId],\n providerConfig.type === 'anthropic' ? process.env.ANTHROPIC_API_KEY : undefined,\n ]\n return candidates.find((value) => value !== undefined && value !== '')\n}\n\nexport function conventionalKeyEnv(providerId: string): string {\n return `KITCODE_${providerId.replace(/[^a-zA-Z0-9]+/g, '_').toUpperCase()}_KEY`\n}\n\nexport function expandEnvRefs(value: string): string {\n return value.replace(/\\$\\{env:([^}]+)\\}/g, (_match, name: string) => process.env[name] ?? '')\n}\n\nexport function expandEnvRecord(record: Record<string, string>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(record).map(([key, value]) => [key, expandEnvRefs(value)]),\n )\n}\n\nasync function readJson(file: string): Promise<unknown> {\n let text: string\n try {\n text = await readFile(file, 'utf8')\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined\n throw error\n }\n try {\n return JSON.parse(text)\n } catch (error) {\n throw new Error(`${file} is not valid JSON: ${(error as Error).message}`)\n }\n}\n\nasync function writeJsonAtomic(file: string, value: unknown, mode?: number): Promise<void> {\n await ensureDir(path.dirname(file))\n const temp = `${file}.${randomUUID()}.tmp`\n try {\n await writeFile(temp, `${JSON.stringify(value, null, 2)}\\n`, { encoding: 'utf8', mode })\n await rename(temp, file)\n } catch (error) {\n await rm(temp, { force: true })\n throw error\n }\n}\n\nfunction formatIssues(file: string, error: z.ZodError): string {\n const lines = error.issues.map(\n (issue) => ` ${issue.path.join('.') || '(root)'}: ${issue.message}`,\n )\n return [`${file} is invalid:`, ...lines].join('\\n')\n}\n","import { randomUUID } from 'node:crypto'\nimport { readFile, realpath, rename, rm, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport { ensureDir, trustPath, workspaceRootFor } from './paths'\n\ninterface TrustFile {\n version: 1\n workspaces: string[]\n}\n\nconst emptyTrust = (): TrustFile => ({ version: 1, workspaces: [] })\n\nexport async function canonicalWorkspace(cwd: string): Promise<string> {\n const resolved = await workspaceRootFor(cwd)\n return realpath(resolved).catch(() => resolved)\n}\n\nexport async function isWorkspaceTrusted(cwd: string): Promise<boolean> {\n const workspace = await canonicalWorkspace(cwd)\n const trust = await loadTrust()\n return trust.workspaces.includes(workspace)\n}\n\nexport async function trustWorkspace(cwd: string): Promise<string> {\n const workspace = await canonicalWorkspace(cwd)\n const trust = await loadTrust()\n if (!trust.workspaces.includes(workspace)) {\n trust.workspaces.push(workspace)\n trust.workspaces.sort()\n await saveTrust(trust)\n }\n return workspace\n}\n\nexport async function revokeWorkspaceTrust(cwd: string): Promise<string> {\n const workspace = await canonicalWorkspace(cwd)\n const trust = await loadTrust()\n const workspaces = trust.workspaces.filter((entry) => entry !== workspace)\n if (workspaces.length !== trust.workspaces.length) await saveTrust({ version: 1, workspaces })\n return workspace\n}\n\nasync function loadTrust(): Promise<TrustFile> {\n let parsed: unknown\n try {\n parsed = JSON.parse(await readFile(trustPath, 'utf8'))\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return emptyTrust()\n return emptyTrust()\n }\n if (typeof parsed !== 'object' || parsed === null) return emptyTrust()\n const value = parsed as { version?: unknown; workspaces?: unknown }\n if (value.version !== 1 || !Array.isArray(value.workspaces)) return emptyTrust()\n return {\n version: 1,\n workspaces: value.workspaces.filter((entry): entry is string => typeof entry === 'string'),\n }\n}\n\nasync function saveTrust(value: TrustFile): Promise<void> {\n await ensureDir(path.dirname(trustPath))\n const temp = `${trustPath}.${randomUUID()}.tmp`\n try {\n await writeFile(temp, `${JSON.stringify(value, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 })\n await rename(temp, trustPath)\n } catch (error) {\n await rm(temp, { force: true })\n throw error\n }\n}\n","import { createInterface } from 'node:readline/promises'\nimport type { AgentHooks, PermissionRequest } from '../core/types'\nimport type { AgentMode } from '../tools/permissions'\nimport { sanitizeTerminalText } from '../ui/sanitize'\nimport { boot } from './runtime'\n\nconst RU_YES = new Set(['y', 'н'])\n\nexport async function ask(\n text: string,\n options: { yes?: boolean; mode?: AgentMode } = {},\n): Promise<void> {\n const { runtime, history, warnings, shutdown } = await boot({\n cwd: process.cwd(),\n bypass: options.yes,\n mode: options.mode,\n })\n\n for (const warning of warnings) console.error(sanitizeTerminalText(warning))\n\n const controller = new AbortController()\n const onInterrupt = () => controller.abort()\n process.on('SIGINT', onInterrupt)\n\n const hooks: AgentHooks = {\n onEvent(event) {\n if (event.type === 'text_delta') process.stdout.write(sanitizeTerminalText(event.text))\n else if (event.type === 'tool_start') {\n process.stderr.write(`\\n· ${sanitizeTerminalText(event.summary)}\\n`)\n } else if (event.type === 'notice') {\n process.stderr.write(`\\n${sanitizeTerminalText(event.text)}\\n`)\n }\n },\n async requestPermission(request) {\n if (options.yes) return 'once'\n if (!process.stdin.isTTY) return 'deny'\n const rl = createInterface({ input: process.stdin, output: process.stderr })\n try {\n const details = permissionDetails(request)\n const answer = await rl.question(\n `\\nallow ${sanitizeTerminalText(request.summary)}?${details ? `\\n${details}` : ''}\\n[y/N] `,\n )\n return RU_YES.has(answer.trim().toLowerCase().charAt(0)) ? 'once' : 'deny'\n } finally {\n rl.close()\n }\n },\n }\n\n try {\n const next = await runtime.run(\n [...history, { role: 'user', content: [{ type: 'text', text }] }],\n hooks,\n controller.signal,\n )\n await runtime.persist(next)\n process.stdout.write('\\n')\n console.error(runtime.usageLine())\n } finally {\n process.off('SIGINT', onInterrupt)\n await shutdown()\n }\n}\n\nfunction permissionDetails(request: PermissionRequest): string {\n let text: string\n if (request.display?.kind === 'text') text = request.display.text\n else if (request.display?.kind === 'list') {\n text = [request.display.title, ...request.display.items.map((item) => `- ${item}`)].join('\\n')\n } else if (request.display?.kind === 'diff') {\n text = [\n request.display.path,\n '--- current',\n request.display.before,\n '+++ proposed',\n request.display.after,\n ].join('\\n')\n } else {\n try {\n text = JSON.stringify(request.input, null, 2)\n } catch {\n text = String(request.input)\n }\n }\n const safe = sanitizeTerminalText(text)\n return safe.length > 20_000 ? `${safe.slice(0, 20_000)}\\n... preview truncated` : safe\n}\n","\nexport function sanitizeTerminalText(value: unknown): string {\n const text = String(value ?? '')\n let output = ''\n\n for (let index = 0; index < text.length; index += 1) {\n const code = text.charCodeAt(index)\n\n if (code === 0x1b) {\n const next = text.charCodeAt(index + 1)\n if (next === 0x5b) index = skipCsi(text, index + 2)\n else if (next === 0x5d) index = skipControlString(text, index + 2, true)\n else if (next === 0x50 || next === 0x58 || next === 0x5e || next === 0x5f) {\n index = skipControlString(text, index + 2, false)\n } else if (!Number.isNaN(next)) {\n index += 1\n }\n continue\n }\n\n if (code === 0x9b) {\n index = skipCsi(text, index + 1)\n continue\n }\n if (code === 0x90 || code === 0x98 || code === 0x9d || code === 0x9e || code === 0x9f) {\n index = skipControlString(text, index + 1, code === 0x9d)\n continue\n }\n\n if ((code < 0x20 && code !== 0x09 && code !== 0x0a) || (code >= 0x7f && code <= 0x9f)) {\n continue\n }\n if ((code >= 0x202a && code <= 0x202e) || (code >= 0x2066 && code <= 0x2069)) continue\n output += text[index]\n }\n\n return output\n}\n\nfunction skipCsi(text: string, from: number): number {\n for (let index = from; index < text.length; index += 1) {\n const code = text.charCodeAt(index)\n if (code >= 0x40 && code <= 0x7e) return index\n }\n return text.length - 1\n}\n\nfunction skipControlString(text: string, from: number, bellTerminates: boolean): number {\n for (let index = from; index < text.length; index += 1) {\n const code = text.charCodeAt(index)\n if (bellTerminates && code === 0x07) return index\n if (code === 0x9c) return index\n if (code === 0x1b && text.charCodeAt(index + 1) === 0x5c) return index + 1\n }\n return text.length - 1\n}\n","import { detectProvider } from '../config/detect'\nimport { formatModelRef, parseModelRef } from '../config/schema'\nimport type { Config } from '../config/schema'\nimport path from 'node:path'\nimport { mkdir } from 'node:fs/promises'\nimport { projectSkillsDir, skillsDir } from '../config/paths'\nimport {\n configLocation,\n loadAuth,\n loadRuntimeConfig,\n resolveApiKey,\n saveAuth,\n saveConfig,\n} from '../config/store'\nimport { canonicalWorkspace, isWorkspaceTrusted } from '../config/trust'\nimport { runTurn } from '../core/agent'\nimport type { AgentConfig, ToolLookup } from '../core/agent'\nimport { createTurnBudget } from '../core/budget'\nimport type { TurnBudget } from '../core/budget'\nimport { beginCheckpoint, undoLatestCheckpoint } from '../core/checkpoint'\nimport type { FileCheckpoint } from '../core/checkpoint'\nimport { runAutomaticDiagnostics } from '../core/diagnostics'\nimport {\n loadAttachment,\n loadAutomaticAttachment,\n loadClipboardImage as readClipboardImage,\n} from '../core/attachments'\nimport {\n compactCutIndex,\n compactHistory,\n estimateCompactTokens,\n shouldAutoCompact,\n} from '../core/compact'\nimport { buildSystemPrompt } from '../core/prompt'\nimport {\n createSession,\n deleteAllSessions as deleteAllStoredSessions,\n deleteSession as deleteStoredSession,\n exportSession as exportStoredSession,\n latestSessionFor,\n listSessions,\n loadSession,\n renameSession as renameStoredSession,\n resolveSessionId,\n saveSession,\n shortSessionId,\n} from '../core/session'\nimport { createSubagentRunner } from '../core/subagent'\nimport type { AgentHooks, ContextUsage, SessionState } from '../core/types'\nimport {\n contextTokens,\n createUsageTracker,\n formatUsageBreakdown,\n formatUsageCompact,\n usageParts,\n} from '../core/usage'\nimport { createMcpManager } from '../mcp/client'\nimport { fetchProviderBalance } from '../providers/balance'\nimport { loadModels } from '../providers/catalog'\nimport { pricingFor } from '../providers/pricing'\nimport { createRegistry } from '../providers/registry'\nimport { formatRateLimits } from '../providers/rate-limits'\nimport type { Effort, Message, ModelInfo, ModelPricing, RateLimits } from '../providers/types'\nimport { createPermissionEngine } from '../tools/permissions'\nimport type { AgentMode } from '../tools/permissions'\nimport { builtinTools, createToolRegistry } from '../tools/registry'\nimport { deletePrompt, getPrompt, listPrompts, promptExists, savePrompt } from '../prompts/library'\nimport { discoverSkills, formatSkillCatalogue, loadSkill } from '../skills/library'\nimport { installSkill } from '../skills/install'\nimport { createSkillTool } from '../tools/skill'\nimport { createTaskTool } from '../tools/task'\nimport type { Lang } from '../ui/i18n'\nimport type { Runtime } from '../ui/runtime'\nimport type { PickerItem } from '../ui/types'\nimport { checkForUpdates } from '../core/update'\nimport { KITCODE_COMMIT, KITCODE_VERSION } from '../version'\n\nconst PREFERRED = ['claude-opus-5', 'claude-sonnet-5', 'gpt-5', 'claude-opus-4-8']\n\nexport interface Boot {\n runtime: Runtime\n history: Message[]\n warnings: string[]\n shutdown(): Promise<void>\n}\n\nexport async function boot(options: {\n cwd: string\n continueSession?: boolean\n resumeId?: string\n bypass?: boolean\n mode?: AgentMode\n modelRef?: string\n}): Promise<Boot> {\n const loadedConfig = await loadRuntimeConfig(options.cwd)\n const config = loadedConfig.config\n const auth = await loadAuth()\n const location = await configLocation()\n const warnings: string[] = []\n const workspaceRoot = await canonicalWorkspace(options.cwd)\n const workspaceTrusted = await isWorkspaceTrusted(options.cwd)\n const startupUpdate = config.updates.checkOnStart ? checkForUpdates() : null\n if (loadedConfig.ignoredProject) {\n warnings.push(\n `Project config ignored until this workspace is trusted: ${loadedConfig.ignoredProject.path}. ` +\n `Review it, then run: kitcode trust`,\n )\n }\n\n let registry = createRegistry(config, auth)\n const modelPricing = new Map<string, ModelPricing>()\n const rememberModels = (providerId: string, models: ModelInfo[]) => {\n for (const model of models) {\n if (model.pricing) modelPricing.set(formatModelRef(providerId, model.id), model.pricing)\n }\n }\n const resolvePricing = (ref: string) => modelPricing.get(ref) ?? pricingFor(ref)\n const tools = createToolRegistry(builtinTools())\n const permissions = createPermissionEngine(config.permissions)\n if (options.bypass) permissions.bypass.enable()\n if (options.mode) permissions.mode.set(options.mode)\n\n const skillRoots = workspaceTrusted ? [projectSkillsDir(workspaceRoot), skillsDir] : [skillsDir]\n let skills = await discoverSkills(skillRoots)\n if (skills.length > 0) tools.register([createSkillTool(skills)])\n\n const mcp = createMcpManager(config.mcp)\n await mcp.connectAll()\n let registeredMcpToolNames = new Set<string>()\n const syncMcpTools = () => {\n tools.unregister(registeredMcpToolNames)\n const connected = mcp.tools()\n tools.register(connected)\n registeredMcpToolNames = new Set(\n connected.filter((tool) => tools.get(tool.name) === tool).map((tool) => tool.name),\n )\n }\n syncMcpTools()\n for (const state of mcp.states()) {\n if (state.status === 'error') warnings.push(`MCP \"${state.name}\": ${state.error ?? 'failed'}`)\n }\n\n let session: SessionState\n if (options.resumeId) {\n session = await loadSession(await resolveSessionId(options.resumeId))\n } else {\n session =\n (options.continueSession ? await latestSessionFor(options.cwd) : null) ??\n createSession(options.cwd, config.model ?? '')\n }\n\n const usage = createUsageTracker(session.usage, resolvePricing)\n const skillCatalogue = formatSkillCatalogue(skills)\n const mainSystemPrompt = () =>\n buildSystemPrompt({\n cwd: options.cwd,\n toolNames: tools.list().map((tool) => tool.name),\n skills: skillCatalogue,\n })\n\n let modelRef = session.model || config.model || ''\n if (options.modelRef) modelRef = options.modelRef\n let contextUsage: ContextUsage | undefined =\n session.context?.model === modelRef ? session.context : undefined\n let modelContextWindow: number | null = null\n let latestRateLimits: { model: string; limits: RateLimits } | undefined\n const contextListeners = new Set<() => void>()\n\n const notifyContext = () => {\n for (const listener of contextListeners) listener()\n }\n\n const knownContextWindow = (ref: string): number | null => {\n const parsed = parseModelRef(ref)\n if (!parsed) return null\n try {\n const models = registry.get(parsed.provider).knownModels()\n rememberModels(parsed.provider, models)\n const found = models.find((model) => model.id === parsed.model)\n return found?.contextWindow ?? null\n } catch {\n return null\n }\n }\n\n const activateModel = (\n ref: string,\n restoredContext?: ContextUsage,\n discoveredWindow?: number,\n ) => {\n modelRef = ref\n if (latestRateLimits?.model !== ref) latestRateLimits = undefined\n contextUsage = restoredContext?.model === ref ? restoredContext : undefined\n modelContextWindow = discoveredWindow ?? knownContextWindow(ref)\n notifyContext()\n }\n\n modelContextWindow = knownContextWindow(modelRef)\n\n \n async function refreshModelContextWindow(): Promise<void> {\n const targetRef = modelRef\n const parsed = parseModelRef(targetRef)\n if (!parsed) {\n if (modelRef === targetRef) {\n modelContextWindow = null\n notifyContext()\n }\n return\n }\n \n \n \n let next = modelContextWindow ?? knownContextWindow(targetRef)\n try {\n const provider = registry.get(parsed.provider)\n const models = await loadModels(provider)\n rememberModels(parsed.provider, models)\n const found = models.find((m) => m.id === parsed.model)\n next = found?.contextWindow ?? next\n } catch {\n \n }\n if (modelRef === targetRef) {\n modelContextWindow = next\n notifyContext()\n }\n }\n\n const agentConfigFor = (system: string, toolset: ToolLookup): AgentConfig => {\n const resolved = registry.resolve(modelRef)\n return {\n provider: resolved.provider,\n modelId: resolved.modelId,\n modelRef,\n system,\n tools: toolset,\n permissions,\n usage,\n cwd: options.cwd,\n maxTokens: config.maxTokens,\n effort: config.effort,\n thinking: config.thinking,\n budget: activeBudget,\n checkpoint: activeCheckpoint,\n }\n }\n\n let activeBudget: TurnBudget | undefined\n let activeCheckpoint: FileCheckpoint | undefined\n let activeAgentCount = 0\n const activeAgents: { description: string; progress: string[] }[] = []\n\n const subagentRunner = createSubagentRunner(agentConfigFor, tools)\n const wrappedRunner = {\n run: async (request: import('../core/subagent').SubagentRequest): Promise<string> => {\n activeAgentCount += 1\n const entry = { description: request.description ?? '', progress: [] as string[] }\n activeAgents.push(entry)\n const trackedRequest = {\n ...request,\n onProgress: (summary: string) => {\n entry.progress.push(summary)\n request.onProgress(summary)\n },\n }\n try {\n return await subagentRunner.run(trackedRequest)\n } finally {\n activeAgentCount = Math.max(0, activeAgentCount - 1)\n const idx = activeAgents.indexOf(entry)\n if (idx !== -1) activeAgents.splice(idx, 1)\n }\n },\n }\n\n tools.register([\n createTaskTool(wrappedRunner, config.budget.maxSubagentsPerTurn),\n ])\n\n let persistQueue: Promise<void> = Promise.resolve()\n\n const persistConfig = async (mutate: (draft: Config) => void) => {\n mutate(config)\n await saveConfig(config)\n }\n\n const compactWithBudget = async (\n history: Message[],\n signal: AbortSignal,\n budget: TurnBudget,\n ) => {\n if (compactCutIndex(history) <= 0) {\n return { history, compacted: false as const, removedMessages: 0 }\n }\n const resolved = registry.resolve(modelRef)\n const budgetDecision = budget.beforeRequest({\n modelRef,\n maxOutputTokens: Math.min(4_096, config.maxTokens),\n estimatedInputTokens: estimateCompactTokens(history),\n })\n if (!budgetDecision.allowed) throw new Error(budgetDecision.reason)\n const result = await compactHistory({\n provider: resolved.provider,\n model: resolved.modelId,\n history,\n maxTokens: budgetDecision.maxOutputTokens,\n signal,\n })\n if (result.usage) {\n budget.record(modelRef, result.usage)\n usage.record(modelRef, result.usage)\n }\n if (result.rateLimits) latestRateLimits = { model: modelRef, limits: result.rateLimits }\n if (result.compacted) {\n contextUsage = undefined\n session.context = undefined\n notifyContext()\n }\n return result\n }\n\n const runtime: Runtime = {\n cwd: options.cwd,\n\n needsSetup: () => Object.keys(config.providers).length === 0,\n\n async addProvider(url, key) {\n const detected = await detectProvider(url, key)\n rememberModels(detected.id, detected.models)\n config.providers[detected.id] = detected.config\n auth[detected.id] = key\n\n const chosen = preferredModel(detected.models)\n if (chosen) config.model = formatModelRef(detected.id, chosen)\n\n await saveConfig(config)\n await saveAuth(auth)\n\n registry = createRegistry(config, auth)\n const nextRef = config.model ?? ''\n const discovered = detected.models.find((model) => model.id === chosen)?.contextWindow\n activateModel(nextRef, undefined, discovered)\n void refreshModelContextWindow()\n\n const kind = detected.config.type === 'anthropic' ? 'Anthropic' : 'OpenAI-compatible'\n return `${detected.id} · ${kind} · ${detected.models.length} models`\n },\n\n currentProviderId: () => parseModelRef(modelRef)?.provider,\n\n listProviderItems: () =>\n Object.entries(config.providers).map(([id, entry]) => ({\n key: id,\n label: entry.label ?? id,\n hint: `${entry.type === 'anthropic' ? 'Anthropic' : 'OpenAI-compatible'} · ${entry.baseUrl}`,\n })),\n\n async useProvider(id) {\n const models = await loadModels(registry.get(id))\n rememberModels(id, models)\n const chosen = preferredModel(models)\n if (!chosen) throw new Error(`\"${id}\" returned no models to switch to.`)\n const ref = formatModelRef(id, chosen)\n registry.resolve(ref)\n activateModel(ref, undefined, models.find((model) => model.id === chosen)?.contextWindow)\n await persistConfig((draft) => {\n draft.model = ref\n })\n void refreshModelContextWindow()\n return ref\n },\n\n async logout(providerId) {\n const provider = config.providers[providerId]\n if (!provider) throw new Error(`Provider \"${providerId}\" is not configured.`)\n const previousKey = auth[providerId]\n const previousModel = config.model\n const previousActiveModel = modelRef\n const wasActive = parseModelRef(modelRef)?.provider === providerId\n const configuredWasRemoved = parseModelRef(config.model ?? '')?.provider === providerId\n\n delete config.providers[providerId]\n delete auth[providerId]\n if (configuredWasRemoved) {\n config.model =\n !wasActive && config.providers[parseModelRef(modelRef)?.provider ?? ''] ? modelRef : undefined\n }\n registry = createRegistry(config, auth)\n\n let nextModel: string | undefined\n if (wasActive) {\n if (config.model) {\n try {\n registry.resolve(config.model)\n nextModel = config.model\n } catch {\n config.model = undefined\n }\n }\n if (!nextModel) {\n for (const remaining of Object.keys(config.providers)) {\n try {\n const models = await loadModels(registry.get(remaining))\n rememberModels(remaining, models)\n const chosen = preferredModel(models)\n if (!chosen) continue\n nextModel = formatModelRef(remaining, chosen)\n config.model = nextModel\n break\n } catch {\n \n }\n }\n }\n }\n\n try {\n await saveConfig(config)\n await saveAuth(auth)\n } catch (error) {\n config.providers[providerId] = provider\n if (previousKey !== undefined) auth[providerId] = previousKey\n config.model = previousModel\n registry = createRegistry(config, auth)\n if (wasActive) activateModel(previousActiveModel)\n await Promise.allSettled([saveConfig(config), saveAuth(auth)])\n throw error\n }\n\n if (wasActive) {\n activateModel(nextModel ?? '')\n if (nextModel) void refreshModelContextWindow()\n }\n return { removed: providerId, wasActive, ...(nextModel ? { nextModel } : {}) }\n },\n\n sessionId: () => session.id,\n\n async newSession() {\n await persistQueue.catch(() => undefined)\n session = createSession(options.cwd, modelRef)\n usage.reset()\n contextUsage = undefined\n latestRateLimits = undefined\n notifyContext()\n return session.id\n },\n\n async listSessionItems() {\n await persistQueue.catch(() => undefined)\n const entries = await listSessions(30)\n return entries.map((entry) => ({\n key: entry.id,\n label: entry.title || `${shortSessionId(entry.id)} ${entry.updatedAt.slice(0, 16).replace('T', ' ')}`,\n hint: `${entry.updatedAt.slice(0, 16).replace('T', ' ')} · ${entry.messageCount} msgs · ${entry.cwd}`,\n }))\n },\n\n async resumeSession(id) {\n const loaded = await loadSession(await resolveSessionId(id))\n session = loaded\n usage.restore(loaded.usage)\n activateModel(loaded.model || modelRef, loaded.context)\n void refreshModelContextWindow()\n return loaded.messages\n },\n\n async renameSession(id, title) {\n await persistQueue.catch(() => undefined)\n const renamed = await renameStoredSession(id, title)\n if (renamed.id === session.id) session = renamed\n return renamed.title ?? shortSessionId(renamed.id)\n },\n\n async deleteSession(id) {\n await persistQueue.catch(() => undefined)\n const resolved = await resolveSessionId(id)\n const wasActive = resolved === session.id\n await deleteStoredSession(resolved)\n if (!wasActive) return { id: resolved, wasActive: false }\n\n session = createSession(options.cwd, modelRef)\n usage.restore([])\n contextUsage = undefined\n latestRateLimits = undefined\n notifyContext()\n return { id: resolved, wasActive: true, newSessionId: session.id }\n },\n\n async deleteAllSessions() {\n await persistQueue.catch(() => undefined)\n const result = await deleteAllStoredSessions()\n session = createSession(options.cwd, modelRef)\n usage.restore([])\n contextUsage = undefined\n latestRateLimits = undefined\n notifyContext()\n return { deleted: result.deleted.length, failed: result.failed }\n },\n\n async exportSession(id, destination) {\n await persistQueue.catch(() => undefined)\n const target = destination\n ? path.resolve(options.cwd, destination)\n : path.join(options.cwd, '.kitcode-exports')\n if (!destination) await mkdir(target, { recursive: true, mode: 0o700 })\n return (await exportStoredSession(id, target)).path\n },\n\n configPath: () => location.path,\n\n listSkills: () => skills.map((skill) => ({ name: skill.name, description: skill.description })),\n\n getModelRef: () => modelRef,\n async setModelRef(ref) {\n registry.resolve(ref)\n activateModel(ref)\n await persistConfig((draft) => {\n draft.model = ref\n })\n void refreshModelContextWindow()\n },\n\n getEffort: () => config.effort,\n async setEffort(effort: Effort) {\n await persistConfig((draft) => {\n draft.effort = effort\n })\n },\n\n getThinking: () => config.thinking,\n async setThinking(enabled) {\n await persistConfig((draft) => {\n draft.thinking = enabled\n })\n },\n\n getMaxTokensPerTurn: () => config.budget.maxTokensPerTurn,\n async setMaxTokensPerTurn(tokens: number) {\n await persistConfig((draft) => {\n draft.budget.maxTokensPerTurn = tokens\n })\n },\n\n getLang: () => config.lang,\n async setLang(lang: Lang) {\n await persistConfig((draft) => {\n draft.lang = lang\n })\n },\n\n getAccent: () => config.theme.accent,\n async setAccent(value) {\n await persistConfig((draft) => {\n draft.theme.accent = value\n })\n },\n\n getMode: () => permissions.mode.get(),\n cycleMode: () => permissions.mode.cycle(),\n\n isBypassEnabled: () => permissions.bypass.isEnabled(),\n setBypass(enabled) {\n if (enabled) permissions.bypass.enable()\n else permissions.bypass.disable()\n },\n\n mcpSummary() {\n const states = mcp.states()\n return {\n connected: states.filter((state) => state.status === 'connected').length,\n failed: states.filter((state) => state.status === 'error').length,\n }\n },\n\n activeAgentsCount: () => activeAgentCount,\n\n activeAgentsList: () => activeAgents.map((a) => ({\n description: a.description,\n progress: [...a.progress],\n })),\n\n mcpServers: () => mcp.states(),\n\n async addMcpServer(name, server) {\n if (Object.hasOwn(config.mcp, name)) {\n throw new Error(`MCP server \"${name}\" already exists.`)\n }\n\n config.mcp[name] = server\n await mcp.reconnect(name)\n const state = mcp.state(name)\n if (!state || state.status !== 'connected') {\n delete config.mcp[name]\n await mcp.remove(name)\n throw new Error(state?.error ?? `MCP server \"${name}\" did not connect.`)\n }\n\n try {\n await saveConfig(config)\n } catch (error) {\n delete config.mcp[name]\n await mcp.remove(name)\n throw error\n }\n\n syncMcpTools()\n return state\n },\n\n async removeMcpServer(name) {\n const existing = config.mcp[name]\n if (!existing) throw new Error(`MCP server \"${name}\" does not exist.`)\n\n delete config.mcp[name]\n try {\n await saveConfig(config)\n } catch (error) {\n config.mcp[name] = existing\n throw error\n }\n\n await mcp.remove(name)\n syncMcpTools()\n },\n\n async setMcpEnabled(name, enabled) {\n const existing = config.mcp[name]\n if (!existing) throw new Error(`MCP server \"${name}\" does not exist.`)\n const previous = existing.enabled\n existing.enabled = enabled\n try {\n await saveConfig(config)\n await mcp.reconnect(name)\n } catch (error) {\n existing.enabled = previous\n await saveConfig(config).catch(() => undefined)\n await mcp.reconnect(name).catch(() => undefined)\n throw error\n }\n syncMcpTools()\n const state = mcp.state(name)\n if (!state) throw new Error(`MCP server \"${name}\" disappeared.`)\n return state\n },\n\n modelContext: () => {\n const exact = contextUsage?.model === modelRef\n const used = exact && contextUsage ? contextTokens(contextUsage.usage) : 0\n return { window: modelContextWindow, used, exact }\n },\n\n subscribeContext(listener) {\n contextListeners.add(listener)\n return () => contextListeners.delete(listener)\n },\n\n resetContext() {\n contextUsage = undefined\n session.context = undefined\n notifyContext()\n },\n\n undoLastCheckpoint: () =>\n undoLatestCheckpoint({ cwd: options.cwd, sessionId: session.id }),\n\n usageLine: () => formatUsageCompact(usage),\n usageReport: () => formatUsageBreakdown(usage),\n rateLimitsReport() {\n if (!latestRateLimits || latestRateLimits.model !== modelRef) return null\n const lines = formatRateLimits(latestRateLimits.limits)\n return lines.length > 0 ? `rate limits\\n${lines.join('\\n')}` : null\n },\n async providerBalance() {\n const providerId = parseModelRef(modelRef)?.provider\n if (!providerId) return null\n const provider = config.providers[providerId]\n if (!provider) return null\n const key = resolveApiKey(providerId, provider, auth)\n return key ? fetchProviderBalance(provider, key) : null\n },\n usageParts: () => usageParts(usage),\n\n async listModelItems() {\n const items: PickerItem[] = []\n for (const providerId of Object.keys(config.providers)) {\n try {\n const models = await loadModels(registry.get(providerId))\n rememberModels(providerId, models)\n for (const model of models) {\n items.push({\n key: formatModelRef(providerId, model.id),\n label: formatModelRef(providerId, model.id),\n hint: model.pricing ? `$${model.pricing.input}/$${model.pricing.output}` : undefined,\n })\n }\n } catch {\n warnings.push(`Could not list models for \"${providerId}\"`)\n }\n }\n return items\n },\n\n async listPromptItems() {\n const prompts = await listPrompts()\n return prompts.map((prompt) => ({\n key: prompt.slug,\n label: prompt.name,\n hint: prompt.description || undefined,\n }))\n },\n\n async readPrompt(slug) {\n const prompt = await getPrompt(slug)\n return prompt?.body ?? ''\n },\n\n async savePrompt(name, body) {\n await savePrompt({ name, body })\n },\n\n async deletePrompt(slug) {\n const ok = await deletePrompt(slug)\n if (!ok) throw new Error(`Prompt \"${slug}\" not found.`)\n },\n\n async loadSkill(name) {\n const meta = skills.find((s) => s.name === name)\n if (!meta) throw new Error(`Skill \"${name}\" not found.`)\n return (await loadSkill(meta)).body\n },\n\n async installSkill(source) {\n const result = await installSkill(source)\n \n skills = await discoverSkills(skillRoots)\n return result\n },\n\n async loadAttachment(requestedPath) {\n return (await loadAttachment(options.cwd, requestedPath)).block\n },\n\n async loadAutomaticAttachment(requestedPath) {\n return (await loadAutomaticAttachment(options.cwd, requestedPath))?.block ?? null\n },\n\n async loadClipboardImage() {\n return readClipboardImage()\n },\n\n async compact(history, signal) {\n return compactWithBudget(history, signal, createTurnBudget(config.budget, resolvePricing))\n },\n\n async checkerReport() {\n const providerId = parseModelRef(modelRef)?.provider\n const provider = providerId ? config.providers[providerId] : undefined\n const states = mcp.states()\n const lines = [\n `KitCode ${KITCODE_VERSION} · ${KITCODE_COMMIT.slice(0, 12)}`,\n `updates: ${config.updates.checkOnStart ? 'enabled' : 'disabled'}`,\n `runtime: Node ${process.versions.node} · ${process.platform}/${process.arch}`,\n `workspace: ${options.cwd}`,\n `config: ${location.path}`,\n `session: ${shortSessionId(session.id)} · ${session.messages.length} messages`,\n `model: ${modelRef || 'not selected'}`,\n ]\n if (providerId && provider) {\n lines.push(\n `provider: ${provider.label ?? providerId} · ${provider.type} · ${provider.baseUrl}`,\n )\n try {\n const models = await registry.get(providerId).listModels()\n rememberModels(providerId, models)\n lines.push(`provider check: ok · ${models.length} models`)\n } catch (error) {\n lines.push(`provider check: failed · ${error instanceof Error ? error.message : String(error)}`)\n }\n } else {\n lines.push('provider check: not configured')\n }\n const context = runtime.modelContext()\n lines.push(\n `context: ${context.exact ? context.used : 'unknown'} / ${context.window ?? 'unknown'}`,\n `MCP: ${states.filter((state) => state.status === 'connected').length} connected · ${states.filter((state) => state.status === 'disabled').length} disabled · ${states.filter((state) => state.status === 'error').length} failed`,\n )\n return lines.join('\\n')\n },\n\n startupUpdateCheck: () => startupUpdate,\n\n async run(history, hooks, signal) {\n \n \n syncMcpTools()\n let requestHistory = history\n const budget = createTurnBudget(config.budget, resolvePricing)\n const previousContext = runtime.modelContext()\n if (shouldAutoCompact(previousContext.used, previousContext.window)) {\n hooks.onEvent({ type: 'notice', level: 'info', text: 'Context is 80% full; compacting older messages…' })\n try {\n const result = await compactWithBudget(requestHistory, signal, budget)\n if (result.compacted) {\n requestHistory = result.history\n hooks.onEvent({\n type: 'notice',\n level: 'info',\n text: `Compacted older context; kept the latest conversation (${result.removedMessages} messages replaced).`,\n })\n }\n } catch (error) {\n if (signal.aborted) return history\n hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: `Automatic context compaction failed; continuing with the original context: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n }\n const requestModelRef = modelRef\n const checkpoint = beginCheckpoint({ cwd: options.cwd, sessionId: session.id })\n activeBudget = budget\n activeCheckpoint = checkpoint\n const trackedHooks: AgentHooks = {\n ...hooks,\n onEvent(event) {\n if (event.type === 'turn_start') {\n contextUsage = undefined\n notifyContext()\n }\n if (event.type === 'usage') {\n contextUsage = { model: requestModelRef, usage: event.usage }\n notifyContext()\n }\n if (event.type === 'rate_limits') {\n latestRateLimits = { model: requestModelRef, limits: event.limits }\n }\n hooks.onEvent(event)\n },\n }\n try {\n const next = await runTurn(\n agentConfigFor(mainSystemPrompt(), tools),\n requestHistory,\n trackedHooks,\n signal,\n )\n if (config.diagnostics.autoRun && !signal.aborted) {\n await runAutomaticDiagnostics({\n cwd: options.cwd,\n changedFiles: checkpoint.changedPaths(),\n configuredCommands: config.diagnostics.commands,\n permissions,\n hooks: trackedHooks,\n signal,\n })\n }\n return next\n } finally {\n try {\n await checkpoint.commit()\n } catch (error) {\n hooks.onEvent({\n type: 'notice',\n level: 'error',\n text: `Could not save the automatic undo checkpoint: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n if (activeCheckpoint === checkpoint) activeCheckpoint = undefined\n if (activeBudget === budget) {\n activeBudget = undefined\n }\n }\n },\n\n async persist(history) {\n const snapshot: SessionState = {\n ...session,\n messages: history,\n usage: usage.entries(),\n model: modelRef,\n context: contextUsage,\n }\n session = snapshot\n const save = persistQueue.catch(() => undefined).then(() => saveSession(snapshot))\n persistQueue = save\n await save\n },\n }\n\n void refreshModelContextWindow()\n\n return {\n runtime,\n history: session.messages,\n warnings,\n async shutdown() {\n try {\n await persistQueue\n } finally {\n await mcp.close()\n }\n },\n }\n}\n\nfunction preferredModel(models: ModelInfo[]): string | undefined {\n for (const preferred of PREFERRED) {\n const match = models.find((model) => model.id.endsWith(preferred))\n if (match) return match.id\n }\n return models[0]?.id\n}\n","import { randomBytes } from 'node:crypto'\nimport { readFile, readdir, rename, stat, unlink, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport { ensureDir, sessionsDir } from '../config/paths'\nimport { redactSecrets } from '../providers/errors'\nimport type { ContentBlock, Message, Usage } from '../providers/types'\nimport type { ContextUsage, SessionState, UsageEntry } from './types'\n\nconst MAX_SESSION_BYTES = 50_000_000\n\nexport interface SessionSummary {\n id: string\n title?: string\n cwd: string\n model: string\n updatedAt: string\n messageCount: number\n}\n\nexport interface DeleteAllSessionsResult {\n deleted: string[]\n failed: Array<{ id: string; error: string }>\n}\n\nexport function createSession(cwd: string, model: string): SessionState {\n const now = new Date().toISOString()\n const stamp = now.replace(/[:.]/g, '-')\n return {\n id: `${stamp}-${randomBytes(3).toString('hex')}`,\n cwd,\n createdAt: now,\n updatedAt: now,\n model,\n messages: [],\n usage: [],\n }\n}\n\nexport async function saveSession(state: SessionState): Promise<void> {\n assertSessionId(state.id)\n state.updatedAt = new Date().toISOString()\n await ensureDir(sessionsDir)\n const file = path.join(sessionsDir, `${state.id}.json`)\n const temp = `${file}.${process.pid}.${randomBytes(4).toString('hex')}.tmp`\n await writeFile(temp, JSON.stringify(state), { encoding: 'utf8', mode: 0o600 })\n await atomicRename(temp, file)\n}\n\nasync function atomicRename(from: string, to: string, retries = 5): Promise<void> {\n for (let attempt = 0; attempt < retries; attempt++) {\n try {\n await rename(from, to)\n return\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code\n if (code !== 'EPERM' && code !== 'EBUSY') throw error\n if (attempt < retries - 1) {\n await new Promise((resolve) => setTimeout(resolve, 50 * (attempt + 1)))\n }\n }\n }\n await rename(from, to)\n}\n\nexport async function loadSession(id: string): Promise<SessionState> {\n assertSessionId(id)\n const file = path.join(sessionsDir, `${id}.json`)\n let raw: string\n try {\n const info = await stat(file)\n if (info.size > MAX_SESSION_BYTES) {\n throw new Error(`Session exceeds the ${MAX_SESSION_BYTES / 1_000_000} MB load limit: ${file}`)\n }\n raw = await readFile(file, 'utf8')\n } catch (error) {\n if (error instanceof Error && error.message.startsWith('Session exceeds')) throw error\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`No session found at ${file}`)\n }\n throw new Error(`Could not read session ${file}: ${(error as Error).message}`)\n }\n const state = readState(raw)\n if (!state) throw new Error(`Session file is not readable as a session: ${file}`)\n return state\n}\n\nexport async function listSessions(limit = 20): Promise<SessionSummary[]> {\n const files = await filesByRecency()\n const summaries: SessionSummary[] = []\n for (const file of files.slice(0, limit)) {\n const state = readState(await readFile(file, 'utf8').catch(() => ''))\n if (state) {\n summaries.push({\n id: state.id,\n title: state.title,\n cwd: state.cwd,\n model: state.model,\n updatedAt: state.updatedAt,\n messageCount: state.messages.length,\n })\n }\n }\n return summaries\n}\n\nexport async function renameSession(query: string, title: string): Promise<SessionState> {\n const id = await resolveSessionId(query)\n const trimmed = title.trim().replace(/[\\r\\n\\0-\\x1f\\x7f]+/g, ' ').slice(0, 120)\n if (!trimmed) throw new Error('Give the session a non-empty title.')\n const state = await loadSession(id)\n state.title = trimmed\n await saveSession(state)\n return state\n}\n\nexport async function deleteSession(query: string): Promise<string> {\n const id = await resolveSessionId(query)\n assertSessionId(id)\n await unlink(path.join(sessionsDir, `${id}.json`)).catch((error: NodeJS.ErrnoException) => {\n if (error.code === 'ENOENT') throw new Error(`Session no longer exists: ${id}`)\n throw error\n })\n return id\n}\n\nexport async function deleteAllSessions(): Promise<DeleteAllSessionsResult> {\n let names: string[]\n try {\n names = await readdir(sessionsDir)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return { deleted: [], failed: [] }\n throw error\n }\n\n const ids = names.flatMap((name) => {\n if (!name.endsWith('.json')) return []\n const id = name.slice(0, -'.json'.length)\n try {\n assertSessionId(id)\n return [id]\n } catch {\n return []\n }\n })\n const results = await Promise.allSettled(\n ids.map((id) => unlink(path.join(sessionsDir, `${id}.json`))),\n )\n const deleted: string[] = []\n const failed: DeleteAllSessionsResult['failed'] = []\n for (const [index, result] of results.entries()) {\n const id = ids[index] as string\n if (result.status === 'fulfilled' || (result.reason as NodeJS.ErrnoException)?.code === 'ENOENT') {\n deleted.push(id)\n } else {\n failed.push({\n id,\n error: result.reason instanceof Error ? result.reason.message : String(result.reason),\n })\n }\n }\n return { deleted, failed }\n}\n\nexport async function exportSession(\n query: string,\n destination: string,\n): Promise<{ id: string; path: string }> {\n const id = await resolveSessionId(query)\n const state = await loadSession(id)\n const target = await resolveExportTarget(destination, state)\n await writeFile(target, renderSessionMarkdown(state), {\n encoding: 'utf8',\n mode: 0o600,\n flag: 'wx',\n }).catch((error: NodeJS.ErrnoException) => {\n if (error.code === 'EEXIST') {\n throw new Error(`Export already exists; choose another path: ${target}`)\n }\n throw error\n })\n return { id, path: target }\n}\n\nexport async function latestSessionFor(cwd: string): Promise<SessionState | null> {\n for (const file of await filesByRecency()) {\n const state = readState(await readFile(file, 'utf8').catch(() => ''))\n if (state?.cwd === cwd) return state\n }\n return null\n}\n\nexport function sanitizeHistory(messages: Message[]): Message[] {\n const resolved = new Set<string>()\n const out: Message[] = []\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n const content = message.content.filter(\n (block) => block.type !== 'tool_use' || resolved.has(block.id),\n )\n for (const block of message.content) {\n if (block.type === 'tool_result') resolved.add(block.toolUseId)\n }\n if (content.length === 0) continue\n out.push(content.length === message.content.length ? message : { ...message, content })\n }\n return out.reverse()\n}\n\nasync function filesByRecency(): Promise<string[]> {\n let names: string[]\n try {\n names = await readdir(sessionsDir)\n } catch {\n return []\n }\n const dated = await Promise.all(\n names\n .filter((name) => name.endsWith('.json'))\n .map(async (name) => {\n const file = path.join(sessionsDir, name)\n const info = await stat(file).catch(() => null)\n return { file, at: info?.mtimeMs ?? 0, size: info?.size ?? 0 }\n }),\n )\n return dated\n .filter((entry) => entry.size <= MAX_SESSION_BYTES)\n .sort((a, b) => b.at - a.at)\n .map((entry) => entry.file)\n}\n\nfunction readState(raw: string): SessionState | null {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return null\n }\n if (typeof parsed !== 'object' || parsed === null) return null\n const state = parsed as Partial<SessionState>\n if (typeof state.id !== 'string' || !Array.isArray(state.messages)) return null\n return {\n id: state.id,\n title: typeof state.title === 'string' ? state.title.slice(0, 120) : undefined,\n cwd: typeof state.cwd === 'string' ? state.cwd : '',\n createdAt: typeof state.createdAt === 'string' ? state.createdAt : '',\n updatedAt: typeof state.updatedAt === 'string' ? state.updatedAt : '',\n model: typeof state.model === 'string' ? state.model : '',\n messages: state.messages as Message[],\n usage: Array.isArray(state.usage) ? (state.usage as UsageEntry[]) : [],\n context: readContextUsage(state.context),\n }\n}\n\nasync function resolveExportTarget(destination: string, state: SessionState): Promise<string> {\n const resolved = path.resolve(destination)\n const info = await stat(resolved).catch(() => null)\n if (info?.isDirectory()) {\n return path.join(resolved, exportFileName(state))\n }\n if (info) throw new Error(`Export destination is not a directory: ${resolved}`)\n const parent = await stat(path.dirname(resolved)).catch(() => null)\n if (!parent?.isDirectory()) throw new Error(`Export directory does not exist: ${path.dirname(resolved)}`)\n return resolved\n}\n\nfunction exportFileName(state: SessionState): string {\n const title = state.title\n ?.toLowerCase()\n .replace(/[^a-z0-9а-яё]+/giu, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 48)\n return `kitcode-session-${title || shortSessionId(state.id)}.md`\n}\n\nfunction renderSessionMarkdown(state: SessionState): string {\n const lines = [\n `# ${state.title || `KitCode session ${shortSessionId(state.id)}`}`,\n '',\n `- Session: ${state.id}`,\n `- Workspace: ${state.cwd}`,\n `- Model: ${state.model || 'unknown'}`,\n `- Updated: ${state.updatedAt}`,\n '',\n ]\n for (const message of state.messages) {\n const rendered = renderMessage(message.content)\n if (!rendered) continue\n lines.push(`## ${message.role === 'user' ? 'User' : 'Assistant'}`, '', rendered, '')\n }\n return `${redactSecrets(lines.join('\\n')).trimEnd()}\\n`\n}\n\nfunction renderMessage(content: ContentBlock[]): string {\n const sections: string[] = []\n for (const block of content) {\n if (block.type === 'text') sections.push(block.text)\n else if (block.type === 'image') sections.push(`[Image attached: ${block.name}]`)\n else if (block.type === 'file') sections.push(`[File attached: ${block.name}]\\n\\n${block.text}`)\n else if (block.type === 'tool_use') sections.push(`> Tool: ${block.name}`)\n else if (block.type === 'tool_result') {\n sections.push(`> Tool result${block.isError ? ' (error)' : ''}:\\n> ${block.content.replace(/\\n/g, '\\n> ')}`)\n }\n \n }\n return sections.join('\\n\\n').trim()\n}\n\nfunction readContextUsage(value: unknown): ContextUsage | undefined {\n if (typeof value !== 'object' || value === null) return undefined\n const candidate = value as { model?: unknown; usage?: unknown }\n if (typeof candidate.model !== 'string') return undefined\n const usage = readUsage(candidate.usage)\n return usage ? { model: candidate.model, usage } : undefined\n}\n\nfunction readUsage(value: unknown): Usage | undefined {\n if (typeof value !== 'object' || value === null) return undefined\n const usage = value as Partial<Record<keyof Usage, unknown>>\n const fields: Array<keyof Usage> = ['input', 'output', 'cacheWrite', 'cacheRead']\n if (fields.some((field) => typeof usage[field] !== 'number' || !Number.isFinite(usage[field]))) {\n return undefined\n }\n return {\n input: usage.input as number,\n output: usage.output as number,\n cacheWrite: usage.cacheWrite as number,\n cacheRead: usage.cacheRead as number,\n }\n}\n\nexport function shortSessionId(id: string): string {\n const dash = id.lastIndexOf('-')\n return dash === -1 ? id : id.slice(dash + 1)\n}\n\nexport async function resolveSessionId(query: string): Promise<string> {\n const trimmed = query.trim()\n if (trimmed === '') throw new Error('Give a session id. List them with: kitcode sessions')\n\n const summaries = await listSessions(200)\n const exact = summaries.find((entry) => entry.id === trimmed)\n if (exact) return exact.id\n\n const matches = summaries.filter((entry) => entry.id.includes(trimmed))\n if (matches.length === 1) return (matches[0] as SessionSummary).id\n if (matches.length === 0) {\n throw new Error(`No session matches \"${trimmed}\". List them with: kitcode sessions`)\n }\n throw new Error(\n `\"${trimmed}\" matches ${matches.length} sessions. Be more specific:\\n` +\n matches\n .slice(0, 5)\n .map((entry) => ` ${shortSessionId(entry.id)} ${entry.updatedAt} ${entry.cwd}`)\n .join('\\n'),\n )\n}\n\nfunction assertSessionId(id: string): void {\n if (!/^[A-Za-z0-9_-]{1,240}$/.test(id)) {\n throw new Error(`Invalid session id: ${id}`)\n }\n}\n","import type {\n ChatRequest,\n ContentBlock,\n Effort,\n Message,\n Provider,\n RefusalInfo,\n StopReason,\n ToolResultBlock,\n ToolSchema,\n ToolUseBlock,\n Usage,\n} from '../providers/types'\nimport { ProviderError } from '../providers/types'\nimport type {\n FileCheckpointSink,\n PermissionMode,\n Tool,\n ToolContext,\n ToolDisplay,\n} from '../tools/types'\nimport type { AgentHooks } from './types'\nimport { sanitizeHistory } from './session'\nimport type { TurnBudget } from './budget'\n\nconst MAX_PAUSE_RESUMES = 5\nconst MAX_RETRIES = 3\nconst INITIAL_BACKOFF_MS = 1000\n\nexport const MAX_TURN_STEPS = 64\nexport const MAX_TOOL_CALLS_PER_STEP = 32\n\nexport interface ToolLookup {\n get(name: string): Tool | undefined\n schemas(): ToolSchema[]\n}\n\nexport interface PermissionGate {\n decide(tool: Tool, requested?: PermissionMode): PermissionMode\n grantForSession(name: string): void\n denyReason?(tool: Tool, requested?: PermissionMode): string | undefined\n}\n\nexport interface UsageSink {\n record(modelRef: string, usage: Usage): void\n}\n\nexport interface AgentConfig {\n provider: Provider\n modelId: string\n modelRef: string\n system: string\n tools: ToolLookup\n permissions: PermissionGate\n usage: UsageSink\n cwd: string\n maxTokens: number\n effort: Effort\n thinking: boolean\n budget?: TurnBudget\n checkpoint?: FileCheckpointSink\n}\n\ninterface StreamOutcome {\n content: ContentBlock[]\n stopReason: StopReason\n refusal?: RefusalInfo\n}\n\nexport async function runTurn(\n cfg: AgentConfig,\n history: Message[],\n hooks: AgentHooks,\n signal: AbortSignal,\n): Promise<Message[]> {\n let messages = [...history]\n let pauses = 0\n let steps = 0\n\n for (;;) {\n if (++steps > MAX_TURN_STEPS) {\n hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: `Stopped after ${MAX_TURN_STEPS} model calls without finishing, to avoid burning tokens in a loop. Ask again with a narrower request.`,\n })\n hooks.onEvent({ type: 'turn_end', stopReason: 'max_tokens' })\n return messages\n }\n\n const budgetDecision = cfg.budget?.beforeRequest({\n modelRef: cfg.modelRef,\n maxOutputTokens: cfg.maxTokens,\n estimatedInputTokens: estimateRequestTokens(cfg, messages),\n })\n if (budgetDecision && !budgetDecision.allowed) {\n hooks.onEvent({ type: 'notice', level: 'warn', text: budgetDecision.reason })\n hooks.onEvent({ type: 'turn_end', stopReason: 'max_tokens' })\n return messages\n }\n\n hooks.onEvent({ type: 'turn_start' })\n const outcome = await consumeStream(\n cfg,\n messages,\n hooks,\n signal,\n budgetDecision?.maxOutputTokens ?? cfg.maxTokens,\n )\n messages.push({ role: 'assistant', content: outcome.content })\n\n if (outcome.stopReason === 'aborted') {\n hooks.onEvent({ type: 'turn_end', stopReason: 'aborted' })\n return sanitizeHistory(messages)\n }\n\n if (outcome.stopReason === 'tool_use') {\n const callCount = outcome.content.filter((block) => block.type === 'tool_use').length\n if (callCount > MAX_TOOL_CALLS_PER_STEP) {\n hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: `The model returned ${callCount} tool calls at once; the limit is ${MAX_TOOL_CALLS_PER_STEP}. None were run. Ask it to split the work into smaller batches.`,\n })\n hooks.onEvent({ type: 'turn_end', stopReason: 'max_tokens' })\n return sanitizeHistory(messages)\n }\n const results = await runToolCalls(cfg, outcome.content, hooks, signal)\n if (results.length > 0) messages.push({ role: 'user', content: results })\n if (signal.aborted) {\n hooks.onEvent({ type: 'turn_end', stopReason: 'aborted' })\n return sanitizeHistory(messages)\n }\n continue\n }\n\n if (outcome.stopReason === 'pause_turn') {\n pauses += 1\n if (pauses <= MAX_PAUSE_RESUMES) continue\n hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: `Server-side tool loop still paused after ${MAX_PAUSE_RESUMES} resumes; stopping.`,\n })\n }\n\n if (outcome.stopReason === 'refusal') {\n hooks.onEvent({ type: 'notice', level: 'warn', text: describeRefusal(outcome.refusal) })\n }\n\n if (outcome.stopReason === 'max_tokens') {\n hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: 'Output hit maxTokens and was cut off. Raise maxTokens in config or ask it to continue.',\n })\n }\n\n hooks.onEvent({ type: 'turn_end', stopReason: outcome.stopReason })\n return messages\n }\n}\n\nasync function consumeStream(\n cfg: AgentConfig,\n messages: Message[],\n hooks: AgentHooks,\n signal: AbortSignal,\n maxTokens: number,\n): Promise<StreamOutcome> {\n const request: ChatRequest = {\n model: cfg.modelId,\n system: cfg.system,\n messages,\n tools: cfg.tools.schemas(),\n maxTokens,\n effort: cfg.effort,\n thinking: cfg.thinking,\n signal,\n }\n\n let outcome: StreamOutcome | undefined\n\n for await (const event of streamWithRetry(cfg.provider, request, cfg.modelRef, signal)) {\n switch (event.type) {\n case 'text_delta':\n hooks.onEvent({ type: 'text_delta', text: event.text })\n break\n case 'thinking_delta':\n hooks.onEvent({ type: 'thinking_delta', text: event.text })\n break\n case 'usage':\n cfg.budget?.record(cfg.modelRef, event.usage)\n cfg.usage.record(cfg.modelRef, event.usage)\n hooks.onEvent({ type: 'usage', model: cfg.modelRef, usage: event.usage })\n break\n case 'rate_limits':\n hooks.onEvent({ type: 'rate_limits', model: cfg.modelRef, limits: event.limits })\n break\n case 'tool_call':\n break\n case 'done':\n outcome = { content: event.content, stopReason: event.stopReason, refusal: event.refusal }\n break\n }\n }\n\n if (outcome) return outcome\n if (signal.aborted) return { content: [], stopReason: 'aborted' }\n throw new Error(\n `\"${cfg.provider.id}\" ended the stream without completing the turn — nothing was generated. The endpoint answered, but not with a usable ${cfg.provider.kind} response.`,\n )\n}\n\nasync function* streamWithRetry(\n provider: Provider,\n request: ChatRequest,\n modelRef: string,\n signal: AbortSignal,\n): AsyncGenerator<import('../providers/types').StreamEvent> {\n let lastError: unknown\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n if (signal.aborted) return\n try {\n for await (const event of provider.stream(request)) {\n yield event\n }\n return\n } catch (error) {\n lastError = error\n if (attempt >= MAX_RETRIES) break\n const waitMs = retryBackoffMs(error, attempt)\n if (waitMs > 0) {\n await sleep(waitMs, signal)\n continue\n }\n break\n }\n }\n if (lastError) throw lastError\n}\n\nfunction retryBackoffMs(error: unknown, attempt: number): number {\n if (!isRateLimitError(error)) return 0\n const serverWait = retryAfterFromError(error)\n if (serverWait > 0) return Math.min(serverWait, 60_000)\n return Math.min(INITIAL_BACKOFF_MS * 2 ** attempt, 30_000)\n}\n\nfunction isRateLimitError(error: unknown): boolean {\n if (!(error instanceof ProviderError)) return false\n return error.status === 429\n}\n\nfunction retryAfterFromError(error: unknown): number {\n const cause = (error as { cause?: unknown })?.cause\n const headers = (cause as { headers?: unknown })?.headers\n if (headers && typeof (headers as { get?: unknown }).get === 'function') {\n const ms = Number((headers as { get: (k: string) => string | null }).get('retry-after-ms'))\n if (Number.isFinite(ms) && ms > 0) return ms\n const raw = (headers as { get: (k: string) => string | null }).get('retry-after')\n if (raw) {\n const s = Number(raw)\n if (Number.isFinite(s) && s > 0) return s * 1000\n }\n }\n return 0\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const id = setTimeout(resolve, ms)\n signal.addEventListener('abort', () => {\n clearTimeout(id)\n reject(signal.reason ?? new Error('Aborted'))\n }, { once: true })\n })\n}\n\nfunction estimateRequestTokens(cfg: AgentConfig, messages: Message[]): number {\n let characters = cfg.system.length\n try {\n characters += JSON.stringify(messages, (_key, value) =>\n typeof value === 'object' && value !== null && (value as { type?: unknown }).type === 'image'\n ? `[image:${'#'.repeat(2_000)}]`\n : value,\n ).length\n characters += JSON.stringify(cfg.tools.schemas()).length\n } catch {\n return Math.max(1, characters)\n }\n\n return Math.max(1, characters)\n}\n\nasync function runToolCalls(\n cfg: AgentConfig,\n content: ContentBlock[],\n hooks: AgentHooks,\n signal: AbortSignal,\n): Promise<ToolResultBlock[]> {\n const calls = content.filter((block): block is ToolUseBlock => block.type === 'tool_use')\n const results: ToolResultBlock[] = []\n for (const call of calls) {\n results.push(await runOneCall(cfg, call, hooks, signal))\n }\n return results\n}\n\nasync function runOneCall(\n cfg: AgentConfig,\n call: ToolUseBlock,\n hooks: AgentHooks,\n signal: AbortSignal,\n): Promise<ToolResultBlock> {\n const tool = cfg.tools.get(call.name)\n if (!tool) {\n return toolError(call.id, `Unknown tool \"${call.name}\". Use only the tools provided.`)\n }\n\n const summary = describeCall(tool, call.input)\n const ctx: ToolContext = {\n cwd: cfg.cwd,\n signal,\n requestPermission: (request) => hooks.requestPermission(request),\n checkpoint: cfg.checkpoint,\n onEvent: (event) => hooks.onEvent(event),\n confirm: async (question) =>\n (await hooks.requestPermission({\n toolName: tool.name,\n summary: question,\n input: call.input,\n })) !== 'deny',\n }\n\n const requestedPermission = requestedPermissionFor(tool, call.input, ctx)\n const gate = cfg.permissions.decide(tool, requestedPermission)\n if (gate === 'deny') {\n return toolError(\n call.id,\n cfg.permissions.denyReason?.(tool, requestedPermission) ??\n `Tool \"${tool.name}\" is disabled by the user's configuration. Do not retry it; find another way or ask.`,\n )\n }\n\n if (gate === 'ask') {\n const decision = await hooks.requestPermission({\n toolName: tool.name,\n summary,\n input: call.input,\n display: await previewCall(tool, call.input, ctx),\n allowAlways: canAlwaysApprove(tool),\n })\n if (decision === 'deny') {\n return toolError(call.id, 'The user declined this call. Do not retry it; ask how to proceed.')\n }\n if (decision === 'always') cfg.permissions.grantForSession(tool.name)\n }\n\n if (signal.aborted) {\n return toolError(call.id, 'Interrupted by the user before this tool ran.')\n }\n\n hooks.onEvent({ type: 'tool_start', id: call.id, name: tool.name, summary })\n\n try {\n const result = await tool.execute(call.input, ctx)\n hooks.onEvent({\n type: 'tool_end',\n id: call.id,\n isError: result.isError === true,\n content: result.content,\n display: result.display,\n })\n return {\n type: 'tool_result',\n toolUseId: call.id,\n content: result.content,\n isError: result.isError,\n }\n } catch (error) {\n const text = error instanceof Error ? error.message : String(error)\n hooks.onEvent({ type: 'tool_end', id: call.id, isError: true, content: text })\n return toolError(call.id, text)\n }\n}\n\nasync function previewCall(\n tool: Tool,\n input: unknown,\n ctx: ToolContext,\n): Promise<ToolDisplay | undefined> {\n const preview = tool.preview\n if (!preview) return undefined\n try {\n return await preview.call(tool, input, ctx)\n } catch {\n return undefined\n }\n}\n\nfunction canAlwaysApprove(tool: Tool): boolean {\n return tool.name !== 'bash' && tool.name !== 'task' && !tool.name.startsWith('mcp__')\n}\n\nfunction requestedPermissionFor(\n tool: Tool,\n input: unknown,\n ctx: ToolContext,\n): PermissionMode | undefined {\n try {\n return tool.permission?.(input, ctx)\n } catch {\n return undefined\n }\n}\n\nfunction describeCall(tool: Tool, input: unknown): string {\n try {\n return tool.summarize(input)\n } catch {\n return tool.name\n }\n}\n\nfunction describeRefusal(refusal: RefusalInfo | undefined): string {\n const parts = ['The model declined this request.']\n if (refusal?.category) parts.push(`Category: ${refusal.category}.`)\n if (refusal?.explanation) parts.push(refusal.explanation)\n return parts.join(' ')\n}\n\nfunction toolError(toolUseId: string, content: string): ToolResultBlock {\n return { type: 'tool_result', toolUseId, content, isError: true }\n}\n","import type { ModelPricing, Usage } from './types'\n\nconst CACHE_WRITE_MULTIPLIER = 1.25\nconst CACHE_READ_MULTIPLIER = 0.1\n\nconst PRICING: Record<string, ModelPricing> = {\n 'claude-opus-5': { input: 5, output: 25 },\n 'claude-opus-4-8': { input: 5, output: 25 },\n 'claude-sonnet-5': { input: 3, output: 15 },\n 'claude-haiku-4-5': { input: 1, output: 5 },\n 'claude-fable-5': { input: 10, output: 50 },\n}\n\nexport function pricingFor(model: string): ModelPricing | undefined {\n const direct = PRICING[model]\n if (direct) return direct\n const slash = model.lastIndexOf('/')\n return slash === -1 ? undefined : PRICING[model.slice(slash + 1)]\n}\n\nexport function costOf(usage: Usage, pricing?: ModelPricing): number | null {\n if (!pricing) return null\n const cacheWrite = pricing.cacheWrite ?? pricing.input * CACHE_WRITE_MULTIPLIER\n const cacheRead = pricing.cacheRead ?? pricing.input * CACHE_READ_MULTIPLIER\n const total =\n usage.input * pricing.input +\n usage.output * pricing.output +\n usage.cacheWrite * cacheWrite +\n usage.cacheRead * cacheRead\n return total / 1_000_000\n}\n","import { addUsage, emptyUsage } from '../providers/types'\nimport type { Usage } from '../providers/types'\nimport { costOf, pricingFor } from '../providers/pricing'\nimport type { PricingResolver } from './usage'\n\nexport interface BudgetLimits {\n maxTokensPerTurn: number\n maxCostUsdPerTurn: number\n}\n\nexport interface TurnBudget {\n beforeRequest(request: {\n modelRef: string\n maxOutputTokens: number\n estimatedInputTokens: number\n }): { allowed: true; maxOutputTokens: number } | { allowed: false; reason: string }\n record(modelRef: string, usage: Usage): void\n snapshot(): { tokens: number; costUsd: number | null }\n}\n\nexport function createTurnBudget(\n limits: BudgetLimits,\n resolvePricing: PricingResolver = pricingFor,\n): TurnBudget {\n let usage = emptyUsage()\n let costUsd: number | null = 0\n\n const snapshot = () => ({\n tokens: usage.input + usage.output + usage.cacheWrite + usage.cacheRead,\n costUsd,\n })\n\n return {\n beforeRequest(request) {\n const current = snapshot()\n if (limits.maxTokensPerTurn > 0 && current.tokens >= limits.maxTokensPerTurn) {\n return {\n allowed: false,\n reason: `Turn stopped at the token budget (${limits.maxTokensPerTurn.toLocaleString()} tokens). This is a safety limit to prevent runaway costs. To disable it, run: /budget 0`,\n }\n }\n if (current.costUsd !== null && current.costUsd >= limits.maxCostUsdPerTurn) {\n return {\n allowed: false,\n reason: `Turn stopped at the cost budget ($${limits.maxCostUsdPerTurn.toFixed(2)}). Send another message to continue.`,\n }\n }\n\n const estimatedInput = finitePositive(request.estimatedInputTokens)\n const tokenLimit = limits.maxTokensPerTurn\n let outputLimit = tokenLimit === 0\n ? finitePositive(request.maxOutputTokens)\n : Math.min(\n finitePositive(request.maxOutputTokens),\n tokenLimit - current.tokens - estimatedInput,\n )\n if (outputLimit < 1) {\n return {\n allowed: false,\n reason: `Turn stopped because the next request would exceed the token budget (${limits.maxTokensPerTurn.toLocaleString()} tokens). This is a safety limit to prevent runaway costs. To disable it, run: /budget 0`,\n }\n }\n\n const pricing = resolvePricing(request.modelRef)\n if (pricing && current.costUsd !== null) {\n const remainingUsd = limits.maxCostUsdPerTurn - current.costUsd\n const inputUsd = (estimatedInput * pricing.input) / 1_000_000\n const affordableOutput = Math.floor(\n ((remainingUsd - inputUsd) * 1_000_000) / pricing.output,\n )\n outputLimit = Math.min(outputLimit, affordableOutput)\n if (outputLimit < 1) {\n return {\n allowed: false,\n reason: `Turn stopped because the next request would exceed the cost budget ($${limits.maxCostUsdPerTurn.toFixed(2)}). Send another message to continue.`,\n }\n }\n }\n\n return { allowed: true, maxOutputTokens: Math.floor(outputLimit) }\n },\n record(modelRef, next) {\n usage = addUsage(usage, normalizeUsage(next))\n const priced = costOf(usage, resolvePricing(modelRef))\n costUsd = priced\n },\n snapshot,\n }\n}\n\nfunction normalizeUsage(usage: Usage): Usage {\n return {\n input: finitePositive(usage.input),\n output: finitePositive(usage.output),\n cacheWrite: finitePositive(usage.cacheWrite),\n cacheRead: finitePositive(usage.cacheRead),\n }\n}\n\nfunction finitePositive(value: number): number {\n return Number.isFinite(value) && value > 0 ? value : 0\n}\n","import { createHash, randomBytes } from 'node:crypto'\nimport { createReadStream } from 'node:fs'\nimport {\n chmod,\n lstat,\n mkdir,\n readFile,\n readdir,\n rename,\n stat,\n unlink,\n writeFile,\n} from 'node:fs/promises'\nimport path from 'node:path'\nimport { checkpointsDir, ensureDir } from '../config/paths'\nimport { resolveInside } from '../tools/safepath'\n\nconst VERSION = 1\nconst MAX_FILE_BYTES = 5_000_000\nconst MAX_CHECKPOINT_BYTES = 20_000_000\nconst MAX_CHECKPOINT_JSON_BYTES = 30_000_000\nconst MAX_CHECKPOINTS_PER_SESSION = 20\nconst MAX_ENTRIES = 256\nconst CHECKPOINT_NAME = /^\\d{13}-[a-f0-9]{8}\\.json$/\nlet lastCheckpointTimestamp = 0\n\ninterface FileSnapshot {\n existed: boolean\n data?: string\n mode?: number\n}\n\ninterface Fingerprint {\n existed: boolean\n sha256?: string\n}\n\ninterface CheckpointEntry {\n path: string\n before: FileSnapshot\n after: Fingerprint\n}\n\ninterface StoredCheckpoint {\n version: typeof VERSION\n sessionId: string\n cwd: string\n createdAt: string\n entries: CheckpointEntry[]\n}\n\ninterface CapturedEntry {\n path: string\n absolutePath: string\n before: FileSnapshot\n}\n\nexport interface CheckpointCommit {\n id: string\n paths: string[]\n}\n\nexport interface UndoFailure {\n path: string\n error: string\n}\n\nexport interface UndoResult {\n found: boolean\n restored: string[]\n removed: string[]\n conflicts: string[]\n failed: UndoFailure[]\n}\n\nexport interface FileCheckpoint {\n \n capture(absolutePath: string): Promise<void>\n \n markChanged(absolutePath: string): void\n \n changedPaths(): string[]\n \n commit(): Promise<CheckpointCommit | null>\n}\n\nexport function beginCheckpoint(options: {\n cwd: string\n sessionId: string\n storageDir?: string\n}): FileCheckpoint {\n assertSessionId(options.sessionId)\n const root = workspaceRoot(options.cwd)\n const storageDir = options.storageDir ?? checkpointsDir\n const captured = new Map<string, CapturedEntry>()\n const pending = new Map<string, Promise<void>>()\n const changed = new Set<string>()\n let capturedBytes = 0\n let finished = false\n\n const locate = (file: string) => {\n const safe = resolveInside(root, file)\n if (!safe.ok || safe.relative === '') {\n throw new Error(safe.ok ? 'The workspace root cannot be checkpointed as a file.' : safe.reason)\n }\n return safe\n }\n\n return {\n async capture(absolutePath) {\n if (finished) throw new Error('This checkpoint is already closed.')\n const safe = locate(absolutePath)\n if (captured.has(safe.relative)) return\n const active = pending.get(safe.relative)\n if (active) return active\n if (captured.size + pending.size >= MAX_ENTRIES) {\n throw new Error(`Automatic undo is limited to ${MAX_ENTRIES} files per message.`)\n }\n\n const task = (async () => {\n const { snapshot, bytes } = await snapshotFile(safe.path)\n if (capturedBytes + bytes > MAX_CHECKPOINT_BYTES) {\n throw new Error(\n `Automatic undo is limited to ${MAX_CHECKPOINT_BYTES / 1_000_000} MB of original files per message.`,\n )\n }\n capturedBytes += bytes\n captured.set(safe.relative, {\n path: safe.relative,\n absolutePath: safe.path,\n before: snapshot,\n })\n })()\n pending.set(safe.relative, task)\n try {\n await task\n } finally {\n pending.delete(safe.relative)\n }\n },\n\n markChanged(absolutePath) {\n if (finished) return\n const resolved = path.resolve(absolutePath)\n let capturedEntry = [...captured.values()].find((entry) => entry.absolutePath === resolved)\n if (!capturedEntry) {\n const safe = resolveInside(root, absolutePath)\n if (safe.ok) capturedEntry = captured.get(safe.relative)\n }\n if (capturedEntry) changed.add(capturedEntry.path)\n },\n\n changedPaths() {\n return [...changed].sort()\n },\n\n async commit() {\n if (finished) return null\n finished = true\n await Promise.all(pending.values())\n\n const entries: CheckpointEntry[] = []\n for (const relativePath of [...changed].sort()) {\n const entry = captured.get(relativePath)\n if (!entry) continue\n const after = await fingerprint(entry.absolutePath)\n if (matchesSnapshot(entry.before, after)) continue\n entries.push({ path: entry.path, before: entry.before, after })\n }\n if (entries.length === 0) return null\n\n const stored: StoredCheckpoint = {\n version: VERSION,\n sessionId: options.sessionId,\n cwd: root,\n createdAt: new Date().toISOString(),\n entries,\n }\n const sessionDir = path.join(storageDir, options.sessionId)\n await ensureDir(storageDir)\n await ensureDir(sessionDir)\n lastCheckpointTimestamp = Math.max(Date.now(), lastCheckpointTimestamp + 1)\n const id = `${String(lastCheckpointTimestamp).padStart(13, '0')}-${randomBytes(4).toString('hex')}`\n await writeCheckpoint(path.join(sessionDir, `${id}.json`), stored)\n await pruneCheckpoints(sessionDir)\n return { id, paths: entries.map((entry) => entry.path) }\n },\n }\n}\n\nexport async function undoLatestCheckpoint(options: {\n cwd: string\n sessionId: string\n storageDir?: string\n}): Promise<UndoResult> {\n assertSessionId(options.sessionId)\n const root = workspaceRoot(options.cwd)\n const sessionDir = path.join(options.storageDir ?? checkpointsDir, options.sessionId)\n const file = await newestCheckpoint(sessionDir)\n const empty: UndoResult = { found: false, restored: [], removed: [], conflicts: [], failed: [] }\n if (!file) return empty\n\n const checkpoint = await readCheckpoint(file)\n if (checkpoint.sessionId !== options.sessionId || checkpoint.cwd !== root) {\n throw new Error('The latest undo checkpoint belongs to a different workspace or session.')\n }\n\n const result: UndoResult = { ...empty, found: true }\n const retry: CheckpointEntry[] = []\n for (const entry of checkpoint.entries) {\n const safe = resolveInside(root, entry.path)\n if (!safe.ok || safe.relative !== entry.path) {\n result.conflicts.push(entry.path)\n continue\n }\n\n try {\n const current = await fingerprint(safe.path)\n if (!sameFingerprint(current, entry.after)) {\n result.conflicts.push(entry.path)\n continue\n }\n if (entry.before.existed) {\n await restoreFile(root, entry.path, entry.before, entry.after)\n result.restored.push(entry.path)\n } else {\n await unlink(safe.path)\n result.removed.push(entry.path)\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n result.failed.push({ path: entry.path, error: message })\n retry.push(entry)\n }\n }\n\n if (retry.length === 0) {\n await unlink(file)\n } else {\n await writeCheckpoint(file, { ...checkpoint, entries: retry })\n }\n return result\n}\n\nasync function snapshotFile(file: string): Promise<{ snapshot: FileSnapshot; bytes: number }> {\n let info\n try {\n info = await lstat(file)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { snapshot: { existed: false }, bytes: 0 }\n }\n throw error\n }\n if (!info.isFile()) throw new Error(`Cannot checkpoint a non-file path: ${file}`)\n if (info.size > MAX_FILE_BYTES) {\n throw new Error(`Cannot checkpoint ${file}: it exceeds the ${MAX_FILE_BYTES / 1_000_000} MB limit.`)\n }\n const data = await readFile(file)\n if (data.length > MAX_FILE_BYTES) {\n throw new Error(`Cannot checkpoint ${file}: it changed beyond the file-size limit while reading.`)\n }\n return {\n snapshot: { existed: true, data: data.toString('base64'), mode: info.mode & 0o777 },\n bytes: data.length,\n }\n}\n\nasync function fingerprint(file: string): Promise<Fingerprint> {\n let info\n try {\n info = await lstat(file)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return { existed: false }\n throw error\n }\n const hash = createHash('sha256')\n if (!info.isFile()) {\n hash.update(`kitcode:${info.isDirectory() ? 'directory' : 'non-file'}`)\n return { existed: true, sha256: hash.digest('hex') }\n }\n for await (const chunk of createReadStream(file)) hash.update(chunk as Buffer)\n return { existed: true, sha256: hash.digest('hex') }\n}\n\nfunction matchesSnapshot(before: FileSnapshot, after: Fingerprint): boolean {\n if (before.existed !== after.existed) return false\n if (!before.existed) return true\n const data = Buffer.from(before.data ?? '', 'base64')\n return after.sha256 === createHash('sha256').update(data).digest('hex')\n}\n\nfunction sameFingerprint(a: Fingerprint, b: Fingerprint): boolean {\n return a.existed === b.existed && (!a.existed || a.sha256 === b.sha256)\n}\n\nasync function restoreFile(\n root: string,\n relativePath: string,\n snapshot: FileSnapshot,\n expected: Fingerprint,\n): Promise<void> {\n const safe = resolveInside(root, relativePath)\n if (!safe.ok || safe.relative !== relativePath) throw new Error('The restore path changed.')\n const data = decodeSnapshot(snapshot)\n await mkdir(path.dirname(safe.path), { recursive: true })\n const rechecked = resolveInside(root, relativePath)\n if (!rechecked.ok || rechecked.path !== safe.path || rechecked.relative !== relativePath) {\n throw new Error('The restore path changed while preparing its parent directory.')\n }\n const temp = `${rechecked.path}.${process.pid}.${randomBytes(4).toString('hex')}.undo`\n try {\n await writeFile(temp, data, { mode: snapshot.mode ?? 0o600 })\n await chmod(temp, snapshot.mode ?? 0o600)\n const finalPath = resolveInside(root, relativePath)\n if (!finalPath.ok || finalPath.path !== rechecked.path || finalPath.relative !== relativePath) {\n throw new Error('The restore path changed before the file could be replaced.')\n }\n if (!sameFingerprint(await fingerprint(finalPath.path), expected)) {\n throw new Error('The file changed while the checkpoint was being restored.')\n }\n await rename(temp, rechecked.path)\n } catch (error) {\n await unlink(temp).catch(() => undefined)\n throw error\n }\n}\n\nasync function writeCheckpoint(file: string, checkpoint: StoredCheckpoint): Promise<void> {\n const body = `${JSON.stringify(checkpoint)}\\n`\n if (Buffer.byteLength(body) > MAX_CHECKPOINT_JSON_BYTES) {\n throw new Error('Undo checkpoint exceeds its storage limit.')\n }\n const temp = `${file}.${process.pid}.${randomBytes(4).toString('hex')}.tmp`\n try {\n await writeFile(temp, body, { encoding: 'utf8', mode: 0o600 })\n await chmod(temp, 0o600)\n await rename(temp, file)\n } catch (error) {\n await unlink(temp).catch(() => undefined)\n throw error\n }\n}\n\nasync function readCheckpoint(file: string): Promise<StoredCheckpoint> {\n const info = await stat(file)\n if (info.size > MAX_CHECKPOINT_JSON_BYTES) throw new Error('Undo checkpoint is too large to read.')\n let parsed: unknown\n try {\n parsed = JSON.parse(await readFile(file, 'utf8'))\n } catch (error) {\n throw new Error(`Undo checkpoint is not valid JSON: ${(error as Error).message}`)\n }\n if (!isCheckpoint(parsed)) throw new Error('Undo checkpoint has an invalid format.')\n return parsed\n}\n\nfunction isCheckpoint(value: unknown): value is StoredCheckpoint {\n if (typeof value !== 'object' || value === null) return false\n const item = value as Partial<StoredCheckpoint>\n if (\n item.version !== VERSION ||\n typeof item.sessionId !== 'string' ||\n typeof item.cwd !== 'string' ||\n typeof item.createdAt !== 'string' ||\n !Array.isArray(item.entries) ||\n item.entries.length === 0 ||\n item.entries.length > MAX_ENTRIES\n ) {\n return false\n }\n return item.entries.every((entry) => {\n if (typeof entry !== 'object' || entry === null) return false\n const candidate = entry as Partial<CheckpointEntry>\n if (\n typeof candidate.path !== 'string' ||\n candidate.path === '' ||\n path.isAbsolute(candidate.path) ||\n typeof candidate.before !== 'object' ||\n candidate.before === null ||\n typeof candidate.after !== 'object' ||\n candidate.after === null ||\n typeof candidate.before.existed !== 'boolean' ||\n typeof candidate.after.existed !== 'boolean'\n ) {\n return false\n }\n if (candidate.before.existed) {\n if (\n typeof candidate.before.data !== 'string' ||\n typeof candidate.before.mode !== 'number' ||\n !Number.isInteger(candidate.before.mode) ||\n candidate.before.mode < 0 ||\n candidate.before.mode > 0o777 ||\n !validBase64(candidate.before.data)\n ) {\n return false\n }\n if (Buffer.byteLength(candidate.before.data, 'base64') > MAX_FILE_BYTES) return false\n }\n return (\n !candidate.after.existed ||\n (typeof candidate.after.sha256 === 'string' && /^[a-f0-9]{64}$/.test(candidate.after.sha256))\n )\n })\n}\n\nfunction decodeSnapshot(snapshot: FileSnapshot): Buffer {\n if (!snapshot.existed || typeof snapshot.data !== 'string' || !validBase64(snapshot.data)) {\n throw new Error('Checkpoint does not contain restorable file data.')\n }\n const data = Buffer.from(snapshot.data, 'base64')\n if (data.length > MAX_FILE_BYTES) throw new Error('Checkpoint file data exceeds the restore limit.')\n return data\n}\n\nfunction validBase64(value: string): boolean {\n return value.length % 4 === 0 && /^[A-Za-z0-9+/]*={0,2}$/.test(value)\n}\n\nasync function newestCheckpoint(sessionDir: string): Promise<string | null> {\n let names: string[]\n try {\n names = await readdir(sessionDir)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null\n throw error\n }\n const name = names.filter((candidate) => CHECKPOINT_NAME.test(candidate)).sort().at(-1)\n return name ? path.join(sessionDir, name) : null\n}\n\nasync function pruneCheckpoints(sessionDir: string): Promise<void> {\n const names = (await readdir(sessionDir))\n .filter((candidate) => CHECKPOINT_NAME.test(candidate))\n .sort()\n .reverse()\n await Promise.all(\n names.slice(MAX_CHECKPOINTS_PER_SESSION).map((name) => unlink(path.join(sessionDir, name))),\n )\n}\n\nfunction workspaceRoot(cwd: string): string {\n const safe = resolveInside(cwd, '.')\n if (!safe.ok) throw new Error(safe.reason)\n return safe.path\n}\n\nfunction assertSessionId(id: string): void {\n if (!/^[A-Za-z0-9_-]{1,240}$/.test(id)) {\n throw new Error(`Invalid session id: ${id}`)\n }\n}\n","import { realpathSync } from 'node:fs'\nimport { basename, dirname, isAbsolute, relative, resolve, sep } from 'node:path'\n\nexport type SafePath = { ok: true; path: string; relative: string } | { ok: false; reason: string }\n\nfunction canonicalize(target: string): string {\n try {\n return realpathSync(target)\n } catch {\n let current = target\n const trailing: string[] = []\n for (let i = 0; i < 64; i++) {\n try {\n return resolve(realpathSync(current), ...trailing)\n } catch {\n const parent = dirname(current)\n if (parent === current) break\n trailing.unshift(basename(current))\n current = parent\n }\n }\n return resolve(current, ...trailing)\n }\n}\n\nexport function resolveInside(cwd: string, userPath: string): SafePath {\n const root = canonicalize(resolve(cwd))\n const target = canonicalize(resolve(root, userPath))\n const rel = relative(root, target)\n if (rel !== '' && (isAbsolute(rel) || rel.split(sep)[0] === '..')) {\n return { ok: false, reason: `Path ${userPath} resolves outside the workspace root ${root}` }\n }\n return { ok: true, path: target, relative: rel }\n}\n\nexport function patternEscapes(pattern: string): boolean {\n return isAbsolute(pattern) || pattern.split('/').includes('..') || pattern.split('\\\\').includes('..')\n}\n","import { readFile, stat } from 'node:fs/promises'\nimport path from 'node:path'\nimport { bashTool } from '../tools/bash'\nimport { brief } from '../tools/summary'\nimport type { Tool, ToolContext, ToolResult } from '../tools/types'\nimport type { PermissionGate } from './agent'\nimport type { AgentHooks } from './types'\n\nconst MAX_PACKAGE_BYTES = 1_000_000\nconst DIAGNOSTIC_TIMEOUT_MS = 300_000\n\nconst diagnosticsTool: Tool = {\n name: 'diagnostics',\n description: 'Run detected project checks after file edits.',\n inputSchema: { type: 'object' },\n defaultPermission: 'ask',\n summarize: () => 'automatic project checks',\n execute: async () => ({ content: '' }),\n}\n\nexport interface DiagnosticsSummary {\n commands: string[]\n failed: string[]\n skipped: boolean\n}\n\nexport async function detectDiagnosticCommands(\n cwd: string,\n configured: string[] = [],\n): Promise<string[]> {\n const custom = configured.map((command) => command.trim()).filter(Boolean)\n if (custom.length > 0) return custom.slice(0, 8)\n\n const commands: string[] = []\n const packageJson = await readPackageJson(path.join(cwd, 'package.json'))\n if (packageJson) {\n const manager = await packageManager(cwd, packageJson.packageManager)\n for (const name of ['lint', 'typecheck', 'check', 'test']) {\n if (typeof packageJson.scripts?.[name] === 'string') {\n commands.push(scriptCommand(manager, name))\n }\n }\n }\n\n if (await isFile(path.join(cwd, 'Cargo.toml'))) {\n commands.push('cargo check', 'cargo test')\n }\n if (await isFile(path.join(cwd, 'go.mod'))) commands.push('go test ./...')\n if (\n (await isFile(path.join(cwd, 'pyproject.toml'))) ||\n (await isFile(path.join(cwd, 'pytest.ini'))) ||\n (await isFile(path.join(cwd, 'tox.ini')))\n ) {\n commands.push('python -m pytest')\n }\n\n return [...new Set(commands)].slice(0, 8)\n}\n\nexport async function runAutomaticDiagnostics(options: {\n cwd: string\n changedFiles: string[]\n configuredCommands?: string[]\n permissions: PermissionGate\n hooks: AgentHooks\n signal: AbortSignal\n execute?: (command: string, ctx: ToolContext) => Promise<ToolResult>\n}): Promise<DiagnosticsSummary> {\n const commands = await detectDiagnosticCommands(options.cwd, options.configuredCommands)\n const summary: DiagnosticsSummary = { commands, failed: [], skipped: false }\n if (options.changedFiles.length === 0 || commands.length === 0 || options.signal.aborted) {\n summary.skipped = true\n return summary\n }\n\n const gate = options.permissions.decide(diagnosticsTool)\n if (gate === 'deny') {\n summary.skipped = true\n options.hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: 'Automatic project checks were skipped by the current permission settings.',\n })\n return summary\n }\n\n if (gate === 'ask') {\n const decision = await options.hooks.requestPermission({\n toolName: diagnosticsTool.name,\n summary: `run ${commands.length} automatic project ${commands.length === 1 ? 'check' : 'checks'}`,\n input: { commands, changedFiles: options.changedFiles },\n display: {\n kind: 'list',\n title: `After changes to ${options.changedFiles.length} ${options.changedFiles.length === 1 ? 'file' : 'files'}`,\n items: commands,\n },\n allowAlways: true,\n })\n if (options.signal.aborted) {\n summary.skipped = true\n return summary\n }\n if (decision === 'deny') {\n summary.skipped = true\n options.hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: 'Automatic project checks were skipped.',\n })\n return summary\n }\n if (decision === 'always') options.permissions.grantForSession(diagnosticsTool.name)\n }\n\n const ctx: ToolContext = {\n cwd: options.cwd,\n signal: options.signal,\n confirm: async () => true,\n requestPermission: options.hooks.requestPermission,\n }\n const execute = options.execute ?? ((command, context) =>\n bashTool.execute({ command, timeoutMs: DIAGNOSTIC_TIMEOUT_MS }, context))\n\n for (const [index, command] of commands.entries()) {\n if (options.signal.aborted) {\n summary.skipped = true\n break\n }\n const id = `diagnostics-${Date.now()}-${index}`\n const callSummary = `check · ${brief(command, 160)}`\n options.hooks.onEvent({ type: 'tool_start', id, name: diagnosticsTool.name, summary: callSummary })\n try {\n const result = await execute(command, ctx)\n if (result.isError) summary.failed.push(command)\n options.hooks.onEvent({\n type: 'tool_end',\n id,\n isError: result.isError === true,\n content: result.content,\n display: result.display,\n })\n } catch (error) {\n summary.failed.push(command)\n options.hooks.onEvent({\n type: 'tool_end',\n id,\n isError: true,\n content: error instanceof Error ? error.message : String(error),\n })\n }\n }\n return summary\n}\n\ninterface PackageJson {\n packageManager?: string\n scripts?: Record<string, unknown>\n}\n\nasync function readPackageJson(file: string): Promise<PackageJson | null> {\n try {\n const info = await stat(file)\n if (!info.isFile() || info.size > MAX_PACKAGE_BYTES) return null\n const value: unknown = JSON.parse(await readFile(file, 'utf8'))\n if (typeof value !== 'object' || value === null) return null\n const candidate = value as PackageJson\n return {\n packageManager:\n typeof candidate.packageManager === 'string' ? candidate.packageManager : undefined,\n scripts:\n typeof candidate.scripts === 'object' && candidate.scripts !== null\n ? candidate.scripts\n : undefined,\n }\n } catch {\n return null\n }\n}\n\ntype PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nasync function packageManager(cwd: string, declared?: string): Promise<PackageManager> {\n const name = declared?.split('@')[0]\n if (name === 'pnpm' || name === 'yarn' || name === 'bun' || name === 'npm') return name\n if (await isFile(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm'\n if (await isFile(path.join(cwd, 'yarn.lock'))) return 'yarn'\n if (\n (await isFile(path.join(cwd, 'bun.lock'))) ||\n (await isFile(path.join(cwd, 'bun.lockb')))\n ) {\n return 'bun'\n }\n return 'npm'\n}\n\nfunction scriptCommand(manager: PackageManager, name: string): string {\n return manager === 'yarn' ? `yarn ${name}` : `${manager} run ${name}`\n}\n\nasync function isFile(file: string): Promise<boolean> {\n try {\n return (await stat(file)).isFile()\n } catch {\n return false\n }\n}\n","import { spawn } from 'node:child_process'\nimport { brief } from './summary'\nimport type { Tool, ToolResult } from './types'\n\nconst DEFAULT_TIMEOUT = 120_000\nconst MAX_TIMEOUT = 600_000\nconst MAX_OUTPUT = 100_000\nconst MAX_COMMAND_CHARS = 20_000\n\ninterface BashInput {\n command: string\n timeoutMs?: number\n}\n\nexport const bashTool: Tool = {\n name: 'bash',\n description:\n 'Run a shell command in the workspace root. stdout and stderr are merged. Avoid commands that wait for interactive input.',\n inputSchema: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description: 'Shell command to run',\n maxLength: MAX_COMMAND_CHARS,\n },\n timeoutMs: {\n type: 'integer',\n description: `Timeout in milliseconds (default ${DEFAULT_TIMEOUT}, maximum ${MAX_TIMEOUT})`,\n minimum: 1,\n },\n },\n required: ['command'],\n additionalProperties: false,\n },\n defaultPermission: 'ask',\n summarize(input) {\n return `bash(${brief((input as BashInput).command)})`\n },\n async preview(input) {\n return { kind: 'text', text: (input as BashInput).command }\n },\n execute(input, ctx) {\n const { command, timeoutMs } = input as BashInput\n if (command.length > MAX_COMMAND_CHARS) {\n return Promise.resolve<ToolResult>({\n content: `Command exceeds the ${MAX_COMMAND_CHARS} character limit.`,\n isError: true,\n })\n }\n const requested = timeoutMs && timeoutMs > 0 ? timeoutMs : DEFAULT_TIMEOUT\n const timeout = Math.min(requested, MAX_TIMEOUT)\n if (ctx.signal.aborted) {\n return Promise.resolve<ToolResult>({ content: '[cancelled before the command started]', isError: true })\n }\n\n return new Promise<ToolResult>((settle) => {\n const child = spawn(command, {\n shell: true,\n cwd: ctx.cwd,\n detached: process.platform !== 'win32',\n stdio: ['ignore', 'pipe', 'pipe'],\n \n \n \n windowsHide: true,\n })\n\n const chunks: string[] = []\n let captured = 0\n let truncated = false\n const collect = (buf: Buffer) => {\n if (truncated) return\n \n let text: string\n try {\n text = buf.toString('utf8')\n } catch {\n text = buf.toString()\n }\n if (text.length > MAX_OUTPUT - captured) {\n chunks.push(text.slice(0, MAX_OUTPUT - captured))\n truncated = true\n return\n }\n chunks.push(text)\n captured += text.length\n }\n child.stdout.on('data', collect)\n child.stderr.on('data', collect)\n\n const killTree = () => {\n if (child.pid == null) return\n if (process.platform === 'win32') {\n try {\n spawn('taskkill', ['/pid', String(child.pid), '/t', '/f'], { stdio: 'ignore' })\n } catch {\n child.kill('SIGKILL')\n }\n return\n }\n try {\n process.kill(-child.pid, 'SIGKILL')\n } catch {\n child.kill('SIGKILL')\n }\n }\n\n let timedOut = false\n let aborted = false\n const timer = setTimeout(() => {\n timedOut = true\n killTree()\n }, timeout)\n const onAbort = () => {\n aborted = true\n killTree()\n }\n ctx.signal.addEventListener('abort', onAbort, { once: true })\n\n const finish = (result: ToolResult) => {\n clearTimeout(timer)\n ctx.signal.removeEventListener('abort', onAbort)\n settle(result)\n }\n\n child.on('error', (error) => {\n finish({ content: `Command failed to start: ${error.message}`, isError: true })\n })\n\n child.on('close', (code, signal) => {\n const output = chunks.join('')\n const notes: string[] = []\n if (truncated) notes.push(`[output truncated at ${MAX_OUTPUT} characters]`)\n if (aborted) notes.push('[command was cancelled]')\n else if (timedOut) notes.push(`[command timed out after ${timeout}ms]`)\n \n \n if (code !== 0 && !aborted && !timedOut) {\n notes.push(`[exit ${signal ? `signal ${signal}` : `code ${code}`}]`)\n }\n const body = output.trim() === '' ? '(no output)' : output.replace(/\\n+$/, '')\n finish({ content: [body, ...notes].join('\\n'), isError: aborted || timedOut || code !== 0 })\n })\n })\n },\n}\n","export function brief(value: unknown, max = 60): string {\n const text = String(value ?? '')\n .replace(/\\s+/g, ' ')\n .trim()\n return text.length > max ? `${text.slice(0, max - 1)}…` : text\n}\n","import { execFile } from 'node:child_process'\nimport { readFile, stat } from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { ContentBlock, FileBlock, ImageBlock } from '../providers/types'\n\nconst MAX_IMAGE_BYTES = 10 * 1024 * 1024\nconst MAX_TEXT_BYTES = 256 * 1024\nconst MAX_CLIPBOARD_OUTPUT_BYTES = MAX_IMAGE_BYTES + 64 * 1024\n\nconst AUTO_PATH_NAMES = new Set(['dockerfile', 'license', 'makefile', 'readme'])\nconst SENSITIVE_AUTO_NAMES = new Set([\n '.env',\n '.netrc',\n '.npmrc',\n '.pypirc',\n 'auth.json',\n 'credentials.json',\n 'id_dsa',\n 'id_ed25519',\n 'id_ecdsa',\n 'id_rsa',\n 'kitcode.json',\n 'secret.json',\n 'secrets.json',\n 'tokens.json',\n])\nconst SENSITIVE_AUTO_EXTENSIONS = new Set(['.jks', '.key', '.keystore', '.p12', '.pem', '.pfx'])\n\nexport interface LoadedAttachment {\n block: ImageBlock | FileBlock\n bytes: number\n path: string\n}\n\nexport type ClipboardCommandRunner = (command: string, args: string[]) => Promise<Buffer>\n\nexport async function loadAttachment(cwd: string, requestedPath: string): Promise<LoadedAttachment> {\n const resolved = resolveAttachmentPath(cwd, requestedPath)\n const info = await stat(resolved).catch((error: NodeJS.ErrnoException) => {\n if (error.code === 'ENOENT') throw new Error(`Attachment not found: ${resolved}`)\n throw error\n })\n if (!info.isFile()) throw new Error(`Attachment is not a regular file: ${resolved}`)\n\n return loadResolvedAttachment(resolved, info.size)\n}\n\nexport async function loadAutomaticAttachment(\n cwd: string,\n requestedPath: string,\n): Promise<LoadedAttachment | null> {\n if (!looksLikeAttachmentPath(requestedPath)) return null\n const resolved = resolveAttachmentPath(cwd, requestedPath)\n const info = await stat(resolved).catch((error: NodeJS.ErrnoException) => {\n if (error.code === 'ENOENT' || error.code === 'ENOTDIR') return null\n throw error\n })\n if (!info?.isFile()) return null\n if (isSensitiveAutomaticPath(resolved)) {\n throw new Error(\n `For safety, sensitive-looking files must be attached explicitly with /attach: ${path.basename(resolved)}`,\n )\n }\n return loadResolvedAttachment(resolved, info.size)\n}\n\nexport function looksLikeAttachmentPath(value: string): boolean {\n const trimmed = value.trim()\n if (!trimmed || /[\\r\\n\\0]/.test(trimmed)) return false\n const candidate = normalizeInputPath(trimmed)\n if (/^file:\\/\\//i.test(candidate)) return true\n if (path.isAbsolute(candidate)) return true\n if (/^(?:~|\\.{1,2})[\\\\/]/.test(candidate)) return true\n if (candidate.includes('/') || candidate.includes('\\\\')) return true\n const basename = path.basename(candidate).toLowerCase()\n return path.extname(basename) !== '' || AUTO_PATH_NAMES.has(basename)\n}\n\nexport async function loadClipboardImage(\n platform: NodeJS.Platform = process.platform,\n runner: ClipboardCommandRunner = runClipboardCommand,\n): Promise<ImageBlock> {\n const commands = clipboardCommands(platform)\n if (commands.length === 0) {\n throw new Error(`Clipboard image paste is not supported on ${platform}. Use /attach <path>.`)\n }\n\n for (const command of commands) {\n try {\n const data = await runner(command.file, command.args)\n if (data.length === 0) continue\n const mediaType = detectImage(data)\n if (!mediaType) continue\n if (data.length > MAX_IMAGE_BYTES) {\n throw new Error(`Clipboard image is larger than ${formatBytes(MAX_IMAGE_BYTES)}.`)\n }\n return {\n type: 'image',\n mediaType,\n data: data.toString('base64'),\n name: clipboardImageName(mediaType),\n }\n } catch (error) {\n if (error instanceof Error && error.message.startsWith('Clipboard image is larger')) {\n throw error\n }\n }\n }\n\n const hint =\n platform === 'linux'\n ? 'Copy an image first; Linux requires wl-paste or xclip.'\n : 'Copy an image first, then press Ctrl+V or Cmd+V again.'\n throw new Error(`No supported image found in the clipboard. ${hint}`)\n}\n\nasync function loadResolvedAttachment(resolved: string, size: number): Promise<LoadedAttachment> {\n\n const name = safeName(path.basename(resolved))\n const imageLimitCandidate = size <= MAX_IMAGE_BYTES\n if (!imageLimitCandidate) {\n throw new Error(`Attachment is larger than ${formatBytes(MAX_IMAGE_BYTES)}: ${name}`)\n }\n const data = await readFile(resolved)\n const mediaType = detectImage(data)\n if (mediaType) {\n return {\n path: resolved,\n bytes: data.length,\n block: { type: 'image', mediaType, data: data.toString('base64'), name },\n }\n }\n\n if (data.length > MAX_TEXT_BYTES) {\n throw new Error(`Text attachment is larger than ${formatBytes(MAX_TEXT_BYTES)}: ${name}`)\n }\n if (data.includes(0)) throw new Error(`Unsupported binary attachment: ${name}`)\n let text: string\n try {\n text = new TextDecoder('utf-8', { fatal: true }).decode(data)\n } catch {\n throw new Error(`Attachment is neither a supported image nor UTF-8 text: ${name}`)\n }\n return {\n path: resolved,\n bytes: data.length,\n block: { type: 'file', mediaType: textMime(resolved), text, name },\n }\n}\n\nfunction resolveAttachmentPath(cwd: string, requestedPath: string): string {\n const cleaned = normalizeInputPath(requestedPath.trim())\n if (!cleaned) throw new Error('Give a file path: /attach <path>')\n if (/^file:\\/\\//i.test(cleaned)) {\n try {\n return path.normalize(fileURLToPath(cleaned))\n } catch {\n throw new Error(`Invalid local file URL: ${cleaned}`)\n }\n }\n const expanded =\n cleaned === '~'\n ? os.homedir()\n : cleaned.startsWith('~/')\n ? path.join(os.homedir(), cleaned.slice(2))\n : cleaned\n return path.isAbsolute(expanded) ? path.normalize(expanded) : path.resolve(cwd, expanded)\n}\n\nfunction isSensitiveAutomaticPath(file: string): boolean {\n const basename = path.basename(file).toLowerCase()\n return (\n basename.startsWith('.env.') ||\n SENSITIVE_AUTO_NAMES.has(basename) ||\n SENSITIVE_AUTO_EXTENSIONS.has(path.extname(basename))\n )\n}\n\nexport function attachmentLabel(block: ContentBlock): string | null {\n if (block.type === 'image') return `image: ${block.name}`\n if (block.type === 'file') return `file: ${block.name}`\n return null\n}\n\nfunction detectImage(data: Buffer): ImageBlock['mediaType'] | null {\n if (\n data.length >= 8 &&\n data.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))\n ) {\n return 'image/png'\n }\n if (data.length >= 3 && data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) {\n return 'image/jpeg'\n }\n const prefix = data.subarray(0, 6).toString('ascii')\n if (prefix === 'GIF87a' || prefix === 'GIF89a') return 'image/gif'\n if (\n data.length >= 12 &&\n data.subarray(0, 4).toString('ascii') === 'RIFF' &&\n data.subarray(8, 12).toString('ascii') === 'WEBP'\n ) {\n return 'image/webp'\n }\n return null\n}\n\nfunction clipboardImageName(mediaType: ImageBlock['mediaType']): string {\n if (mediaType === 'image/jpeg') return 'clipboard.jpg'\n if (mediaType === 'image/gif') return 'clipboard.gif'\n if (mediaType === 'image/webp') return 'clipboard.webp'\n return 'clipboard.png'\n}\n\nfunction clipboardCommands(platform: NodeJS.Platform): Array<{ file: string; args: string[] }> {\n if (platform === 'darwin') {\n return [{ file: 'osascript', args: ['-l', 'JavaScript', '-e', MACOS_CLIPBOARD_SCRIPT] }]\n }\n if (platform === 'win32') {\n return [\n {\n file: 'powershell.exe',\n args: ['-NoLogo', '-NoProfile', '-NonInteractive', '-Sta', '-Command', WINDOWS_CLIPBOARD_SCRIPT],\n },\n ]\n }\n if (platform === 'linux') {\n const types = ['image/png', 'image/jpeg', 'image/webp', 'image/gif']\n return [\n ...types.map((type) => ({ file: 'wl-paste', args: ['--no-newline', '--type', type] })),\n ...types.map((type) => ({\n file: 'xclip',\n args: ['-selection', 'clipboard', '-t', type, '-o'],\n })),\n ]\n }\n return []\n}\n\nfunction runClipboardCommand(command: string, args: string[]): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n execFile(\n command,\n args,\n {\n encoding: null,\n maxBuffer: MAX_CLIPBOARD_OUTPUT_BYTES,\n timeout: 5000,\n windowsHide: true,\n },\n (error, stdout) => {\n if (error) reject(error)\n else resolve(Buffer.isBuffer(stdout) ? stdout : Buffer.from(stdout))\n },\n )\n })\n}\n\nconst MACOS_CLIPBOARD_SCRIPT = String.raw`\nObjC.import('AppKit')\nObjC.import('Foundation')\n\nfunction present(value) {\n return value !== null && value !== undefined && ObjC.unwrap(value) !== undefined\n}\n\nfunction pngFromTiff(tiff) {\n if (!present(tiff)) return null\n const bitmap = $.NSBitmapImageRep.imageRepWithData(tiff)\n if (!present(bitmap)) return null\n return bitmap.representationUsingTypeProperties(\n $.NSBitmapImageFileTypePNG,\n $.NSDictionary.dictionary,\n )\n}\n\nconst pasteboard = $.NSPasteboard.generalPasteboard\nlet data = null\nconst directTypes = [\n $.NSPasteboardTypePNG,\n $('public.jpeg'),\n $('com.compuserve.gif'),\n $('public.webp'),\n $('org.webmproject.webp'),\n]\nfor (const type of directTypes) {\n const candidate = pasteboard.dataForType(type)\n if (present(candidate)) {\n data = candidate\n break\n }\n}\n\nif (!present(data)) data = pngFromTiff(pasteboard.dataForType($.NSPasteboardTypeTIFF))\n\nif (!present(data)) {\n const fileUrl = pasteboard.stringForType($.NSPasteboardTypeFileURL)\n if (present(fileUrl)) {\n const image = $.NSImage.alloc.initWithContentsOfURL($.NSURL.URLWithString(fileUrl))\n if (present(image)) data = pngFromTiff(image.TIFFRepresentation)\n }\n}\n\nif (!present(data)) {\n const files = pasteboard.propertyListForType($.NSFilenamesPboardType)\n if (present(files) && ObjC.unwrap(files.count) > 0) {\n const image = $.NSImage.alloc.initWithContentsOfURL(\n $.NSURL.fileURLWithPath(files.objectAtIndex(0)),\n )\n if (present(image)) {\n data = pngFromTiff(image.TIFFRepresentation)\n }\n }\n}\n\nif (!present(data)) throw new Error('no clipboard image')\n$.NSFileHandle.fileHandleWithStandardOutput.writeData(data)\n`\n\nconst WINDOWS_CLIPBOARD_SCRIPT = String.raw`\nAdd-Type -AssemblyName System.Windows.Forms\nAdd-Type -AssemblyName System.Drawing\n$image = [System.Windows.Forms.Clipboard]::GetImage()\nif ($null -eq $image) { exit 2 }\n$stream = New-Object System.IO.MemoryStream\ntry {\n $image.Save($stream, [System.Drawing.Imaging.ImageFormat]::Png)\n $bytes = $stream.ToArray()\n [Console]::OpenStandardOutput().Write($bytes, 0, $bytes.Length)\n} finally {\n $stream.Dispose()\n $image.Dispose()\n}\n`\n\nfunction textMime(file: string): string {\n const extension = path.extname(file).toLowerCase()\n const known: Record<string, string> = {\n '.json': 'application/json',\n '.md': 'text/markdown',\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'text/javascript',\n '.mjs': 'text/javascript',\n '.cjs': 'text/javascript',\n '.ts': 'text/typescript',\n '.tsx': 'text/typescript',\n '.jsx': 'text/javascript',\n '.xml': 'application/xml',\n '.yaml': 'application/yaml',\n '.yml': 'application/yaml',\n '.csv': 'text/csv',\n }\n return known[extension] ?? 'text/plain'\n}\n\nfunction normalizeInputPath(value: string): string {\n if (value.length >= 2) {\n const first = value[0]\n const last = value.at(-1)\n if ((first === '\"' && last === '\"') || (first === \"'\" && last === \"'\")) {\n return value.slice(1, -1)\n }\n }\n return value.replace(/\\\\([\\\\ \"'()\\[\\]{}&;#$!])/g, (_match, character: string) => character)\n}\n\nfunction safeName(value: string): string {\n return value.replace(/[\\r\\n\\0-\\x1f\\x7f]/g, '').slice(0, 200) || 'attachment'\n}\n\nfunction formatBytes(value: number): string {\n return `${Math.round(value / 1024 / 1024)} MB`\n}\n","import type {\n ContentBlock,\n Message,\n Provider,\n RateLimits,\n Usage,\n} from '../providers/types'\n\nconst KEEP_USER_TURNS = 2\nconst MAX_SOURCE_CHARS = 500_000\nconst MAX_TOOL_RESULT_CHARS = 8_000\nconst MAX_TEXT_BLOCK_CHARS = 50_000\n\nexport interface CompactResult {\n history: Message[]\n compacted: boolean\n removedMessages: number\n usage?: Usage\n rateLimits?: RateLimits\n}\n\nexport async function compactHistory(options: {\n provider: Provider\n model: string\n history: Message[]\n maxTokens: number\n signal: AbortSignal\n}): Promise<CompactResult> {\n const cut = compactCutIndex(options.history)\n if (cut <= 0) {\n return { history: options.history, compacted: false, removedMessages: 0 }\n }\n\n const source = renderHistory(options.history.slice(0, cut))\n if (!source.trim()) {\n return { history: options.history, compacted: false, removedMessages: 0 }\n }\n\n let summary = ''\n let finalText = ''\n let usage: Usage | undefined\n let rateLimits: RateLimits | undefined\n const stream = options.provider.stream({\n model: options.model,\n system:\n 'Summarize the earlier coding conversation for another agent. Preserve concrete requirements, user preferences, architectural decisions, commands and files changed, test results, bugs, errors, and unfinished work. Be concise but lossless. Do not include private chain-of-thought or invent details. Return only the durable summary.',\n messages: [\n {\n role: 'user',\n content: [{ type: 'text', text: `Earlier conversation to compact:\\n\\n${source}` }],\n },\n ],\n tools: [],\n maxTokens: Math.max(512, Math.min(4_096, options.maxTokens)),\n thinking: false,\n signal: options.signal,\n })\n\n for await (const event of stream) {\n if (event.type === 'text_delta') summary += event.text\n else if (event.type === 'usage') usage = event.usage\n else if (event.type === 'rate_limits') rateLimits = event.limits\n else if (event.type === 'done') {\n finalText = event.content\n .filter((block) => block.type === 'text')\n .map((block) => (block.type === 'text' ? block.text : ''))\n .join('')\n }\n }\n\n summary = (finalText || summary).trim()\n if (!summary) throw new Error('The provider returned an empty context summary.')\n\n const prefix: Message[] = [\n {\n role: 'user',\n content: [{ type: 'text', text: `[Earlier conversation summary]\\n${summary}` }],\n },\n {\n role: 'assistant',\n content: [{ type: 'text', text: 'Earlier context loaded. I will continue from this summary.' }],\n },\n ]\n return {\n history: [...prefix, ...options.history.slice(cut)],\n compacted: true,\n removedMessages: cut,\n usage,\n rateLimits,\n }\n}\n\nexport function shouldAutoCompact(used: number, window: number | null): boolean {\n return window !== null && window > 0 && used / window >= 0.8\n}\n\nexport function compactCutIndex(history: Message[]): number {\n const userTurns: number[] = []\n for (const [index, message] of history.entries()) {\n if (isConversationUser(message)) userTurns.push(index)\n }\n if (userTurns.length <= KEEP_USER_TURNS) return 0\n return userTurns[userTurns.length - KEEP_USER_TURNS] ?? 0\n}\n\nexport function estimateCompactTokens(history: Message[]): number {\n const cut = compactCutIndex(history)\n if (cut <= 0) return 1\n const rendered = renderHistory(history.slice(0, cut))\n return Math.max(1, Math.min(rendered.length, MAX_SOURCE_CHARS) + 1_000)\n}\n\nfunction isConversationUser(message: Message): boolean {\n if (message.role !== 'user') return false\n return message.content.some(\n (block) =>\n block.type === 'image' ||\n block.type === 'file' ||\n (block.type === 'text' && !block.text.startsWith('[Earlier conversation summary]')),\n )\n}\n\nfunction renderHistory(history: Message[]): string {\n let result = ''\n for (const message of history) {\n const blocks = message.content.map(renderBlock).filter(Boolean)\n if (blocks.length === 0) continue\n const part = `${message.role.toUpperCase()}:\\n${blocks.join('\\n\\n')}`\n if (result.length + part.length > MAX_SOURCE_CHARS) {\n result += '\\n\\n[...older context truncated for compaction...]'\n break\n }\n result += (result ? '\\n\\n' : '') + part\n }\n return result\n}\n\nfunction renderBlock(block: ContentBlock): string {\n switch (block.type) {\n case 'text':\n return truncate(block.text, MAX_TEXT_BLOCK_CHARS)\n case 'thinking':\n return ''\n case 'image':\n return `[Image attached: ${block.name}]`\n case 'file':\n return `[File attached: ${block.name}]\\n${truncate(block.text, MAX_TOOL_RESULT_CHARS)}`\n case 'tool_use':\n return `[Tool call: ${block.name}]\\n${safeJson(block.input)}`\n case 'tool_result':\n return `[Tool result${block.isError ? ' (error)' : ''}]\\n${truncate(block.content, MAX_TOOL_RESULT_CHARS)}`\n }\n}\n\nfunction safeJson(value: unknown): string {\n try {\n return truncate(JSON.stringify(value, null, 2), MAX_TOOL_RESULT_CHARS)\n } catch {\n return '[unserializable input]'\n }\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length <= max ? value : `${value.slice(0, max)}\\n[...truncated...]`\n}\n","import os from 'node:os'\n\nexport function buildSystemPrompt(args: {\n cwd: string\n toolNames: string[]\n skills?: string\n}): string {\n const lines = [\n \"You are kitcode, a coding agent running in the user's terminal.\",\n '',\n \"Work directly on the codebase with the tools you have. Read before you edit — never guess a file's contents. Prefer a targeted edit over rewriting a file. Match the surrounding code's style, naming and idiom.\",\n '',\n 'Be brief. The user is reading a terminal, not a report. Lead with the outcome, then only the detail that changes what they would do next. No preamble, no restating the request, no summary of what you are about to do before every tool call. Never narrate routine actions.',\n '',\n 'Do what was asked and no more. Do not add abstractions, helpers, error handling for impossible states, or files nobody requested. If you think the request is mistaken, say so in one sentence and then do it as asked.',\n '',\n 'Report honestly. If a command failed, show the output. If you skipped something, say so. Only claim something works when you verified it.',\n '',\n \"Some tools require the user's approval before they run. A denial is an answer, not an obstacle — ask what to do instead rather than retrying or working around it.\",\n '',\n `Working directory: ${args.cwd}`,\n `Platform: ${process.platform} ${os.arch()}`,\n `Tools: ${args.toolNames.join(', ')}`,\n ]\n\n if (args.skills && args.skills.trim() !== '') {\n lines.push('', args.skills)\n }\n\n return lines.join('\\n')\n}\n","import type { Message } from '../providers/types'\nimport { brief } from '../tools/summary'\nimport type { AgentConfig, ToolLookup } from './agent'\nimport { runTurn } from './agent'\nimport type { AgentEvent, AgentHooks, PermissionDecision, PermissionRequest } from './types'\n\nexport const TASK_TOOL_NAME = 'task'\n\nexport const MAX_SUBAGENT_STEPS = 12\n\nexport const SUBAGENT_NO_ANSWER =\n 'The subagent stopped without writing a final answer — it was interrupted or ended on a tool call. Nothing was reported back: do the work directly, or delegate it again with a narrower prompt.'\n\nexport const SUBAGENT_CANCELLED = 'The subagent was cancelled before it produced anything.'\n\nconst STEP_LIMIT_NOTE = `The subagent was stopped after ${MAX_SUBAGENT_STEPS} model calls without finishing, so anything above is partial. Do the work directly or delegate a narrower piece of it.`\n\nconst SUBAGENT_SYSTEM = [\n 'You are a subagent launched by the main kitcode agent to carry out one task on your own.',\n '',\n 'Nobody is reading along and nobody can answer you. Never ask a question, never stop to propose a plan, never wait for approval. If the request is ambiguous, take the most reasonable reading, do the work, and state the assumption in your answer.',\n '',\n 'Your final message is the return value — it is the only thing the caller ever sees. End with the answer itself: the findings, the file paths, the conclusion. Never end with \"I will now...\" or a recap of the steps you took. Carry over every concrete detail the caller needs (paths, names, line numbers) and leave out the narration of how you found them.',\n].join('\\n')\n\nexport interface SubagentRequest {\n prompt: string\n description?: string\n signal: AbortSignal\n onProgress(summary: string): void\n onEvent?(event: AgentEvent): void\n confirm?(question: string): Promise<boolean>\n requestPermission?(request: PermissionRequest): Promise<PermissionDecision>\n}\n\nexport interface SubagentRunner {\n run(request: SubagentRequest): Promise<string>\n}\n\nexport function createSubagentRunner(\n makeConfig: (system: string, tools: ToolLookup) => AgentConfig,\n tools: ToolLookup,\n): SubagentRunner {\n return {\n async run(request) {\n if (request.signal.aborted) return SUBAGENT_CANCELLED\n\n const base = makeConfig(SUBAGENT_SYSTEM, tools)\n const cfg: AgentConfig = {\n ...base,\n tools: {\n get: (name) =>\n name === TASK_TOOL_NAME ? undefined : base.tools.get(name),\n schemas: () =>\n base.tools.schemas().filter((schema) => schema.name !== TASK_TOOL_NAME),\n },\n system: `${SUBAGENT_SYSTEM}\\n\\nWorking directory: ${base.cwd}`,\n }\n\n const limit = new AbortController()\n const signal = AbortSignal.any([request.signal, limit.signal])\n let steps = 0\n\n const hooks: AgentHooks = {\n onEvent(event) {\n if (event.type === 'turn_start' && ++steps > MAX_SUBAGENT_STEPS) limit.abort()\n if (event.type === 'tool_start') request.onProgress(brief(event.summary, 80))\n if (event.type === 'subagent_start' || event.type === 'subagent_end' || event.type === 'subagent_event') return\n request.onEvent?.(event)\n },\n async requestPermission(permission) {\n if (request.requestPermission) {\n return request.requestPermission({\n ...permission,\n summary: `subagent · ${permission.summary}`,\n })\n }\n const allowed = await request.confirm?.(`subagent · ${permission.summary}`)\n return allowed === true ? 'once' : 'deny'\n },\n }\n\n const history: Message[] = [\n { role: 'user', content: [{ type: 'text', text: request.prompt }] },\n ]\n const text = finalText(await runTurn(cfg, history, hooks, signal))\n\n if (!limit.signal.aborted) return text\n return text === SUBAGENT_NO_ANSWER ? STEP_LIMIT_NOTE : `${text}\\n\\n${STEP_LIMIT_NOTE}`\n },\n }\n}\n\nfunction finalText(messages: Message[]): string {\n const last = messages.findLast((message) => message.role === 'assistant')\n const text = (last?.content ?? [])\n .filter((block) => block.type === 'text')\n .map((block) => block.text)\n .join('\\n')\n .trim()\n return text === '' ? SUBAGENT_NO_ANSWER : text\n}\n","import { addUsage, emptyUsage } from '../providers/types'\nimport type { Usage } from '../providers/types'\nimport type { ModelPricing } from '../providers/types'\nimport { costOf, pricingFor } from '../providers/pricing'\nimport type { UsageEntry } from './types'\n\nexport interface UsageTotals {\n usage: Usage\n costUsd: number | null\n requests: number\n}\n\nexport interface UsageTracker {\n record(modelRef: string, usage: Usage): void\n restore(entries: UsageSeed[]): void\n entries(): UsageEntry[]\n totals(): UsageTotals\n reset(): void\n}\n\ntype UsageSeed = Pick<UsageEntry, 'model' | 'usage' | 'requests'>\n\nexport type PricingResolver = (modelRef: string) => ModelPricing | undefined\n\nexport function createUsageTracker(\n initial: UsageSeed[] = [],\n resolvePricing: PricingResolver = pricingFor,\n): UsageTracker {\n const byModel = new Map<string, { usage: Usage; requests: number }>(\n initial.map((entry) => [entry.model, { usage: entry.usage, requests: entry.requests }]),\n )\n\n const entries = (): UsageEntry[] =>\n [...byModel].map(([model, { usage, requests }]) => ({\n model,\n usage,\n requests,\n costUsd: costOf(usage, resolvePricing(model)),\n }))\n\n return {\n record(modelRef, usage) {\n const current = byModel.get(modelRef)\n byModel.set(modelRef, {\n usage: addUsage(current?.usage ?? emptyUsage(), usage),\n requests: (current?.requests ?? 0) + 1,\n })\n },\n restore(initial) {\n byModel.clear()\n for (const entry of initial) {\n byModel.set(entry.model, { usage: entry.usage, requests: entry.requests })\n }\n },\n entries,\n totals() {\n let usage = emptyUsage()\n let requests = 0\n let cost: number | null = null\n for (const entry of entries()) {\n usage = addUsage(usage, entry.usage)\n requests += entry.requests\n if (entry.costUsd !== null) cost = (cost ?? 0) + entry.costUsd\n }\n return { usage, costUsd: cost, requests }\n },\n reset() {\n byModel.clear()\n },\n }\n}\n\nexport interface UsageSummary {\n input: string\n output: string\n cache: string | null\n costUsd: number | null\n \n totalTokens: number\n}\n\nexport function usageParts(tracker: UsageTracker): UsageSummary {\n const { usage, costUsd } = tracker.totals()\n const cache = usage.cacheRead + usage.cacheWrite\n return {\n input: tokens(usage.input),\n output: tokens(usage.output),\n cache: cache > 0 ? tokens(cache) : null,\n costUsd,\n totalTokens: usage.input + usage.output + cache,\n }\n}\n\nexport function contextTokens(usage: Usage): number {\n return usage.input + usage.output + usage.cacheWrite + usage.cacheRead\n}\n\nexport function formatUsageCompact(tracker: UsageTracker): string {\n const { usage, costUsd } = tracker.totals()\n const cache = usage.cacheRead + usage.cacheWrite\n const parts = [`${tokens(usage.input)}↑`, `${tokens(usage.output)}↓`]\n if (cache > 0) parts.push(`(${tokens(cache)} cache)`)\n const head = parts.join(' ')\n return costUsd === null ? head : `${head} · ${dollars(costUsd)}`\n}\n\nexport function formatUsageBreakdown(tracker: UsageTracker): string {\n const entries = tracker.entries()\n if (entries.length === 0) return 'No usage recorded yet.'\n\n const lines: string[] = []\n for (const entry of entries) {\n lines.push(`${entry.model} ${entry.requests} ${entry.requests === 1 ? 'request' : 'requests'}`)\n lines.push(` input ${tokens(entry.usage.input)}`)\n lines.push(` output ${tokens(entry.usage.output)}`)\n lines.push(` cache write ${tokens(entry.usage.cacheWrite)}`)\n lines.push(` cache read ${tokens(entry.usage.cacheRead)}`)\n lines.push(` cost ${entry.costUsd === null ? 'unknown pricing' : dollars(entry.costUsd)}`)\n }\n lines.push('', `total ${formatUsageCompact(tracker)}`)\n return lines.join('\\n')\n}\n\nfunction tokens(count: number): string {\n if (count < 1000) return String(count)\n const [value, suffix] = count < 1_000_000 ? [count / 1000, 'k'] : [count / 1_000_000, 'M']\n return `${value.toFixed(1).replace(/\\.0$/, '')}${suffix}`\n}\n\nexport function dollars(amount: number): string {\n return amount > 0 && amount < 0.01 ? '<$0.01' : `$${amount.toFixed(2)}`\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\nimport type { CallToolResult, Tool as McpTool } from '@modelcontextprotocol/sdk/types.js'\nimport type { McpServerConfig } from '../config/schema'\nimport { expandEnvRecord } from '../config/store'\nimport { redactSecrets } from '../providers/errors'\nimport type { Tool } from '../tools/types'\nimport { bridgeMcpTool } from './bridge'\nimport { KITCODE_VERSION } from '../version'\n\nexport type McpStatus = 'connected' | 'connecting' | 'error' | 'disabled'\n\nexport interface McpServerState {\n name: string\n status: McpStatus\n toolCount: number\n error?: string\n}\n\nconst clientInfo = { name: 'kitcode', version: KITCODE_VERSION }\nconst connectTimeoutMs = 15_000\nconst stderrTailLimit = 400\nconst maxToolPages = 20\nconst maxTools = 256\n\nconst inheritedEnvKeys = new Set([\n 'PATH',\n 'HOME',\n 'USER',\n 'LOGNAME',\n 'SHELL',\n 'TMPDIR',\n 'TMP',\n 'TEMP',\n 'SystemRoot',\n 'WINDIR',\n 'COMSPEC',\n 'PATHEXT',\n 'APPDATA',\n 'LOCALAPPDATA',\n])\n\ninterface Session {\n client: Client\n tools: Tool[]\n}\n\nexport function createMcpManager(servers: Record<string, McpServerConfig>) {\n const serverStates = new Map<string, McpServerState>()\n const sessions = new Map<string, Session>()\n\n for (const [name, config] of Object.entries(servers)) {\n serverStates.set(name, {\n name,\n status: config.enabled ? 'connecting' : 'disabled',\n toolCount: 0,\n })\n }\n\n async function callTool(\n server: string,\n tool: string,\n args: unknown,\n signal?: AbortSignal,\n ): Promise<CallToolResult> {\n const session = sessions.get(server)\n if (!session) throw new Error(`MCP server \"${server}\" is not connected`)\n const result = await session.client.callTool(\n { name: tool, arguments: args as Record<string, unknown> },\n undefined,\n { signal },\n )\n return result as CallToolResult\n }\n\n async function connect(name: string, config: McpServerConfig): Promise<void> {\n serverStates.set(name, { name, status: 'connecting', toolCount: 0 })\n const client = new Client(clientInfo)\n client.onclose = () => {\n if (sessions.delete(name)) {\n serverStates.set(name, {\n name,\n status: 'error',\n toolCount: 0,\n error: 'connection closed',\n })\n }\n }\n const transport = createTransport(config)\n const stderrTail = captureStderr(transport)\n try {\n const descriptors = await withTimeout(\n handshake(client, transport),\n `timed out after ${connectTimeoutMs / 1000}s`,\n )\n const tools = descriptors.map((descriptor) =>\n bridgeMcpTool(name, descriptor, (tool, args, signal) => callTool(name, tool, args, signal)),\n )\n sessions.set(name, { client, tools })\n serverStates.set(name, { name, status: 'connected', toolCount: tools.length })\n } catch (error) {\n await client.close().catch(() => {})\n serverStates.set(name, {\n name,\n status: 'error',\n toolCount: 0,\n error: describeFailure(error, stderrTail(), configuredSecrets(config)),\n })\n }\n }\n\n async function disconnect(name: string): Promise<void> {\n const session = sessions.get(name)\n if (!session) return\n sessions.delete(name)\n await session.client.close().catch(() => {})\n }\n\n return {\n async connectAll(): Promise<void> {\n const enabled = Object.entries(servers).filter(([, config]) => config.enabled)\n await Promise.all(enabled.map(([name, config]) => connect(name, config)))\n },\n\n async reconnect(name: string): Promise<void> {\n const config = servers[name]\n if (!config) return\n await disconnect(name)\n if (!config.enabled) {\n serverStates.set(name, { name, status: 'disabled', toolCount: 0 })\n return\n }\n await connect(name, config)\n },\n\n async remove(name: string): Promise<void> {\n await disconnect(name)\n serverStates.delete(name)\n },\n\n async close(): Promise<void> {\n const open = [...sessions.values()]\n sessions.clear()\n await Promise.all(open.map((session) => session.client.close().catch(() => {})))\n },\n\n states(): McpServerState[] {\n return [...serverStates.values()]\n },\n\n state(name: string): McpServerState | undefined {\n return serverStates.get(name)\n },\n\n tools(): Tool[] {\n return [...sessions.values()].flatMap((session) => session.tools)\n },\n\n callTool,\n }\n}\n\nexport type McpManager = ReturnType<typeof createMcpManager>\n\nasync function handshake(client: Client, transport: McpTransport): Promise<McpTool[]> {\n await client.connect(transport, { timeout: connectTimeoutMs })\n const collected: McpTool[] = []\n let cursor: string | undefined\n let pages = 0\n do {\n if (++pages > maxToolPages) throw new Error(`MCP tool listing exceeded ${maxToolPages} pages`)\n const page = await client.listTools({ cursor })\n collected.push(...page.tools)\n if (collected.length > maxTools) throw new Error(`MCP server exposed more than ${maxTools} tools`)\n cursor = page.nextCursor\n } while (cursor)\n return collected\n}\n\ntype McpTransport = StdioClientTransport | StreamableHTTPClientTransport\n\nfunction createTransport(config: McpServerConfig): McpTransport {\n if (config.type === 'stdio') {\n return new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: { ...inheritedEnv(), ...expandEnvRecord(config.env) },\n stderr: 'pipe',\n })\n }\n return new StreamableHTTPClientTransport(new URL(config.url), {\n requestInit: { headers: expandEnvRecord(config.headers) },\n })\n}\n\nfunction captureStderr(transport: McpTransport): () => string {\n if (!(transport instanceof StdioClientTransport)) return () => ''\n let tail = ''\n transport.stderr?.on('data', (chunk: Buffer) => {\n tail = (tail + chunk.toString()).slice(-stderrTailLimit)\n })\n return () => tail.trim()\n}\n\nfunction describeFailure(error: unknown, stderr: string, secrets: string[]): string {\n const message = error instanceof Error ? error.message : String(error)\n return redactSecrets(stderr ? `${message} — ${stderr}` : message, secrets)\n}\n\nfunction configuredSecrets(config: McpServerConfig): string[] {\n const record = config.type === 'stdio' ? config.env : config.headers\n return Object.values(expandEnvRecord(record)).filter((value) => value.length >= 4)\n}\n\nexport function inheritedEnv(source: NodeJS.ProcessEnv = process.env): Record<string, string> {\n const env: Record<string, string> = {}\n for (const [key, value] of Object.entries(source)) {\n if (value !== undefined && inheritedEnvKeys.has(key)) env[key] = value\n }\n return env\n}\n\nfunction withTimeout<T>(work: Promise<T>, message: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined\n const expiry = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(message)), connectTimeoutMs)\n })\n return Promise.race([work, expiry]).finally(() => clearTimeout(timer))\n}\n","import type { CallToolResult, ContentBlock, Tool as McpTool } from '@modelcontextprotocol/sdk/types.js'\nimport type { JsonSchema } from '../providers/types'\nimport type { Tool, ToolResult } from '../tools/types'\n\nconst MAX_RESULT_CHARS = 200_000\n\nexport type McpToolCall = (\n tool: string,\n args: unknown,\n signal?: AbortSignal,\n) => Promise<CallToolResult>\n\nexport function bridgeMcpTool(server: string, descriptor: McpTool, call: McpToolCall): Tool {\n const tool = descriptor.name\n return {\n name: `mcp__${server}__${tool}`,\n description: descriptor.description ?? descriptor.title ?? tool,\n inputSchema: inputSchemaOf(descriptor),\n defaultPermission: 'ask',\n summarize: (input) => `${server}:${tool}${argumentPreview(input)}`,\n preview: async (input) => ({ kind: 'text', text: printableInput(input) }),\n execute: (input, ctx) => invoke(call, tool, input, ctx.signal),\n }\n}\n\nfunction printableInput(input: unknown): string {\n try {\n return JSON.stringify(input, null, 2)\n } catch {\n return String(input)\n }\n}\n\nasync function invoke(\n call: McpToolCall,\n tool: string,\n input: unknown,\n signal: AbortSignal,\n): Promise<ToolResult> {\n try {\n const result = await call(tool, input, signal)\n return { content: flattenResult(result), isError: result.isError }\n } catch (error) {\n return { content: error instanceof Error ? error.message : String(error), isError: true }\n }\n}\n\nfunction flattenResult(result: CallToolResult): string {\n const rendered = (result.content ?? []).map(renderPart).join('\\n')\n const value = rendered || (result.structuredContent ? JSON.stringify(result.structuredContent) : '(no content)')\n if (value.length <= MAX_RESULT_CHARS) return value\n return `${value.slice(0, MAX_RESULT_CHARS)}\\n... truncated MCP result at ${MAX_RESULT_CHARS} characters`\n}\n\nfunction renderPart(part: ContentBlock): string {\n if (part.type === 'text') return part.text\n if (part.type === 'resource') {\n return 'text' in part.resource ? part.resource.text : `[resource ${part.resource.uri}]`\n }\n if (part.type === 'resource_link') return `[resource ${part.uri}]`\n return `[${part.type}]`\n}\n\nfunction inputSchemaOf(descriptor: McpTool): JsonSchema {\n const schema: unknown = descriptor.inputSchema\n if (schema === null || typeof schema !== 'object') {\n return { type: 'object', properties: {}, additionalProperties: false }\n }\n return schema as JsonSchema\n}\n\nfunction argumentPreview(input: unknown): string {\n if (input === null || typeof input !== 'object') return ''\n const entries = Object.entries(input as Record<string, unknown>)\n if (entries.length === 0) return ''\n const shown = entries.slice(0, 3).map(([key, value]) => `${key}=${clip(value)}`)\n if (entries.length > shown.length) shown.push('…')\n return `(${shown.join(' ')})`\n}\n\nfunction clip(value: unknown): string {\n const text = typeof value === 'string' ? value : JSON.stringify(value)\n if (typeof text !== 'string') return String(value)\n return text.length > 40 ? `${text.slice(0, 39)}…` : text\n}\n","{\n \"name\": \"@kernelonpanic/kitcode\",\n \"version\": \"1.0.1-beta\",\n \"description\": \"Terminal coding agent with a config you never have to write by hand\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\n \"kitcode\": \"dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=22\"\n },\n \"scripts\": {\n \"dev\": \"tsx src/index.ts\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"prepare\": \"tsup\",\n \"prepublishOnly\": \"npm run typecheck && npm test\"\n },\n \"dependencies\": {\n \"@anthropic-ai/sdk\": \"^0.115.0\",\n \"@modelcontextprotocol/sdk\": \"^1.30.0\",\n \"chalk\": \"^6.0.0\",\n \"commander\": \"^15.0.0\",\n \"fast-glob\": \"^3.3.3\",\n \"ink\": \"^7.1.1\",\n \"ink-spinner\": \"^5.0.0\",\n \"ink-text-input\": \"^6.0.0\",\n \"openai\": \"^7.3.0\",\n \"react\": \"^19.2.8\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^26.1.2\",\n \"@types/react\": \"^19.2.18\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.23.1\",\n \"typescript\": \"^7.0.2\",\n \"vitest\": \"^4.1.10\"\n },\n \"overrides\": {\n \"esbuild\": \"0.28.1\"\n },\n \"keywords\": [\n \"cli\",\n \"coding-agent\",\n \"ai\",\n \"terminal\",\n \"anthropic\",\n \"openai\",\n \"mcp\"\n ]\n}\n","import pkg from '../package.json' with { type: 'json' }\n\ndeclare const __KITCODE_COMMIT__: string\n\nexport const KITCODE_VERSION = pkg.version\nexport const KITCODE_REPOSITORY = 'PanicOnKernel/KitCode'\nexport const KITCODE_COMMIT =\n typeof __KITCODE_COMMIT__ === 'string' && __KITCODE_COMMIT__ !== ''\n ? __KITCODE_COMMIT__\n : 'development'\n","import type { ProviderConfig } from '../config/schema'\nimport { expandEnvRecord } from '../config/store'\n\nexport interface ProviderBalance {\n kind: 'balance' | 'key-limit'\n currency: string\n amount: string\n}\n\nconst MAX_RESPONSE_BYTES = 64_000\n\nexport async function fetchProviderBalance(\n config: ProviderConfig,\n apiKey: string,\n options: { fetchImpl?: typeof fetch; timeoutMs?: number } = {},\n): Promise<ProviderBalance[] | null> {\n const endpoints = balanceEndpoints(config.baseUrl)\n if (endpoints.length === 0) return null\n\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 10_000)\n try {\n for (const endpoint of endpoints) {\n try {\n const response = await (options.fetchImpl ?? fetch)(endpoint.url, {\n method: 'GET',\n redirect: 'error',\n headers: {\n Accept: 'application/json',\n ...expandEnvRecord(config.headers ?? {}),\n Authorization: `Bearer ${apiKey}`,\n },\n signal: controller.signal,\n })\n if (!response.ok) continue\n const text = await limitedResponseText(response, MAX_RESPONSE_BYTES)\n if (text === null) continue\n const balance = endpoint.parse(JSON.parse(text))\n if (balance?.length) return balance\n } catch {\n if (controller.signal.aborted) break\n }\n }\n return null\n } finally {\n clearTimeout(timer)\n }\n}\n\ninterface BalanceEndpoint {\n url: string\n parse(body: unknown): ProviderBalance[] | null\n}\n\nfunction balanceEndpoints(baseUrl: string): BalanceEndpoint[] {\n let url: URL\n try {\n url = new URL(baseUrl)\n } catch {\n return []\n }\n const host = url.hostname.toLowerCase()\n if (host === 'api.deepseek.com') {\n return [endpoint(url.origin, '/user/balance', deepSeekBalance)]\n }\n if (host === 'openrouter.ai') {\n return [\n endpoint(url.origin, '/api/v1/key', openRouterKeyBalance),\n endpoint(url.origin, '/api/v1/credits', openRouterCreditsBalance),\n ]\n }\n if (host === 'api.siliconflow.cn' || host === 'api.siliconflow.com') {\n return [endpoint(url.origin, '/v1/user/info', siliconFlowBalance)]\n }\n if (host === 'api.apimart.ai') {\n return [endpoint(url.origin, '/v1/user/balance', apiMartBalance)]\n }\n if (host === 'api.openai.com' || host === 'api.anthropic.com') return []\n\n \n \n \n return [\n endpoint(url.origin, '/user/balance', deepSeekBalance),\n endpoint(url.origin, '/api/v1/key', openRouterKeyBalance),\n endpoint(url.origin, '/api/v1/credits', openRouterCreditsBalance),\n endpoint(url.origin, '/v1/user/info', siliconFlowBalance),\n endpoint(url.origin, '/v1/user/balance', apiMartBalance),\n endpoint(url.origin, '/v1/balance', genericBalance),\n ]\n}\n\nfunction endpoint(\n origin: string,\n path: string,\n parse: BalanceEndpoint['parse'],\n): BalanceEndpoint {\n return { url: `${origin}${path}`, parse }\n}\n\nfunction deepSeekBalance(body: unknown): ProviderBalance[] | null {\n const infos = record(body)?.['balance_infos']\n if (!Array.isArray(infos)) return null\n const balances = infos.flatMap((item) => {\n const entry = record(item)\n const currency = currencyCode(entry?.['currency'])\n const amount = decimal(entry?.['total_balance'])\n return currency && amount ? [{ kind: 'balance' as const, currency, amount }] : []\n })\n return balances.length > 0 ? balances : null\n}\n\nfunction openRouterKeyBalance(body: unknown): ProviderBalance[] | null {\n const remaining = finiteNumber(record(record(body)?.['data'])?.['limit_remaining'])\n return remaining === null\n ? null\n : [{ kind: 'key-limit', currency: 'USD', amount: String(remaining) }]\n}\n\nfunction openRouterCreditsBalance(body: unknown): ProviderBalance[] | null {\n const data = record(record(body)?.['data'])\n const credits = finiteNumber(data?.['total_credits'])\n const usage = finiteNumber(data?.['total_usage'])\n if (credits === null || usage === null) return null\n return [\n {\n kind: 'balance',\n currency: 'USD',\n amount: Math.max(0, credits - usage).toFixed(2),\n },\n ]\n}\n\nfunction siliconFlowBalance(body: unknown): ProviderBalance[] | null {\n const root = record(body)\n if (root?.['status'] !== true) return null\n const amount = decimal(record(root['data'])?.['balance'])\n return amount ? [{ kind: 'balance', currency: 'credits', amount }] : null\n}\n\nfunction apiMartBalance(body: unknown): ProviderBalance[] | null {\n const root = record(body)\n if (root?.['success'] !== true) return null\n const amount = decimal(root['remain_balance'])\n return amount ? [{ kind: 'balance', currency: 'credits', amount }] : null\n}\n\nfunction genericBalance(body: unknown): ProviderBalance[] | null {\n const root = record(body)\n const data = record(root?.['data'])\n const amount = decimal(root?.['balance'] ?? data?.['balance'])\n if (!amount) return null\n const currency = currencyCode(root?.['currency'] ?? data?.['currency']) ?? 'credits'\n return [{ kind: 'balance', currency, amount }]\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : null\n}\n\nfunction currencyCode(value: unknown): string | null {\n return typeof value === 'string' && /^[A-Z]{3}$/.test(value) ? value : null\n}\n\nfunction decimal(value: unknown): string | null {\n if (typeof value === 'number') {\n return Number.isFinite(value) && value >= 0 ? String(value) : null\n }\n return typeof value === 'string' && /^\\d+(?:\\.\\d+)?$/.test(value) ? value : null\n}\n\nfunction finiteNumber(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : null\n}\n\nasync function limitedResponseText(response: Response, limit: number): Promise<string | null> {\n const declared = Number(response.headers.get('content-length'))\n if (Number.isFinite(declared) && declared > limit) return null\n if (!response.body) return ''\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let size = 0\n let text = ''\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) return text + decoder.decode()\n size += value.byteLength\n if (size > limit) {\n await reader.cancel()\n return null\n }\n text += decoder.decode(value, { stream: true })\n }\n } finally {\n reader.releaseLock()\n }\n}\n","import { chmod, readFile, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport { cacheDir, ensureDir } from '../config/paths'\nimport type { ModelInfo, Provider } from './types'\n\nconst MAX_AGE_MS = 24 * 60 * 60 * 1000\nconst CACHE_VERSION = 2\n\ninterface ModelCache {\n version?: number\n fetchedAt: number\n models: ModelInfo[]\n}\n\nexport async function loadModels(provider: Provider, refresh = false): Promise<ModelInfo[]> {\n const file = cacheFile(provider.id)\n const cached = await readCache(file)\n if (\n !refresh &&\n cached?.version === CACHE_VERSION &&\n Date.now() - cached.fetchedAt < MAX_AGE_MS\n ) {\n return cached.models\n }\n\n let models: ModelInfo[]\n try {\n models = await provider.listModels()\n } catch (error) {\n if (cached) return cached.models\n const known = provider.knownModels()\n if (known.length > 0) return known\n throw error\n }\n\n await writeCache(file, models)\n return models\n}\n\nexport function refreshModels(provider: Provider): Promise<ModelInfo[]> {\n return loadModels(provider, true)\n}\n\nfunction cacheFile(providerId: string): string {\n return path.join(cacheDir, 'models', `${providerId.replace(/[^\\w.-]/g, '_')}.json`)\n}\n\nasync function readCache(file: string): Promise<ModelCache | undefined> {\n try {\n return JSON.parse(await readFile(file, 'utf8')) as ModelCache\n } catch {\n return undefined\n }\n}\n\nasync function writeCache(file: string, models: ModelInfo[]): Promise<void> {\n const payload: ModelCache = { version: CACHE_VERSION, fetchedAt: Date.now(), models }\n try {\n await ensureDir(path.dirname(file))\n await writeFile(file, JSON.stringify(payload), { encoding: 'utf8', mode: 0o600 })\n await chmod(file, 0o600)\n } catch {\n return\n }\n}\n","import Anthropic from '@anthropic-ai/sdk'\nimport {\n captureResponseHead,\n invalidStreamError,\n isConnectionFailure,\n isUserAbort,\n MAX_RETRIES,\n REQUEST_TIMEOUT_MS,\n toProviderError,\n} from './errors'\nimport { pricingFor } from './pricing'\nimport { parseRateLimits } from './rate-limits'\nimport type {\n ChatRequest,\n ContentBlock,\n Message,\n ModelInfo,\n Provider,\n StopReason,\n StreamEvent,\n ToolSchema,\n Usage,\n} from './types'\n\nconst STOP_REASONS: Record<string, StopReason> = {\n end_turn: 'end_turn',\n tool_use: 'tool_use',\n max_tokens: 'max_tokens',\n model_context_window_exceeded: 'max_tokens',\n pause_turn: 'pause_turn',\n refusal: 'refusal',\n}\n\nconst KNOWN_MODELS: ModelInfo[] = [\n knownModel('claude-opus-5', 'Claude Opus 5', 1_000_000, 128_000),\n knownModel('claude-opus-4-8', 'Claude Opus 4.8', 1_000_000, 128_000),\n knownModel('claude-sonnet-5', 'Claude Sonnet 5', 1_000_000, 128_000),\n knownModel('claude-haiku-4-5', 'Claude Haiku 4.5', 200_000, 64_000),\n knownModel('claude-fable-5', 'Claude Fable 5', 1_000_000, 128_000),\n]\n\nexport function createAnthropicProvider(args: {\n id: string\n apiKey: string\n baseUrl?: string\n headers?: Record<string, string>\n timeoutMs?: number\n}): Provider {\n const client = new Anthropic({\n apiKey: args.apiKey,\n baseURL: args.baseUrl,\n defaultHeaders: args.headers,\n maxRetries: MAX_RETRIES,\n timeout: args.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n return {\n id: args.id,\n kind: 'anthropic',\n stream: (req) => streamTurn(client, args.id, req),\n listModels: () => listModels(client, args.id),\n knownModels: () => KNOWN_MODELS,\n }\n}\n\nasync function* streamTurn(\n client: Anthropic,\n providerId: string,\n req: ChatRequest,\n): AsyncGenerator<StreamEvent> {\n const params: Anthropic.MessageStreamParams = {\n model: req.model,\n max_tokens: req.maxTokens,\n system: [{ type: 'text', text: req.system, cache_control: { type: 'ephemeral' } }],\n messages: toMessageParams(req.messages),\n tools: toToolParams(req.tools),\n }\n if (req.thinking) params.thinking = { type: 'adaptive', display: 'summarized' }\n if (req.effort) params.output_config = { effort: req.effort }\n\n let thinking = ''\n let text = ''\n let events = 0\n let final: Anthropic.Message\n const capture = captureResponseHead()\n const stream = client\n .withOptions({ fetch: capture.fetch })\n .messages.stream(params, { signal: req.signal })\n\n try {\n for await (const event of stream) {\n events += 1\n if (event.type !== 'content_block_delta') continue\n if (event.delta.type === 'text_delta') {\n text += event.delta.text\n yield { type: 'text_delta', text: event.delta.text }\n } else if (event.delta.type === 'thinking_delta') {\n thinking += event.delta.thinking\n yield { type: 'thinking_delta', text: event.delta.thinking }\n }\n }\n final = await stream.finalMessage()\n } catch (error) {\n if (isUserAbort(error, req.signal)) {\n const partial = stream.currentMessage\n if (partial) yield { type: 'usage', usage: toUsage(partial.usage) }\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n yield { type: 'done', stopReason: 'aborted', content: partialContent(thinking, text) }\n return\n }\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n if (events === 0 && capture.succeeded() && !isConnectionFailure(error)) {\n throw await invalidStreamError(providerId, capture, error)\n }\n throw toProviderError(error, providerId)\n }\n\n const stopReason = STOP_REASONS[final.stop_reason ?? ''] ?? 'end_turn'\n const content = toContentBlocks(final.content)\n\n for (const block of content) {\n if (block.type === 'tool_use') {\n yield { type: 'tool_call', id: block.id, name: block.name, input: block.input }\n }\n }\n yield { type: 'usage', usage: toUsage(final.usage) }\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n yield {\n type: 'done',\n stopReason,\n content,\n ...(stopReason === 'refusal' ? { refusal: toRefusal(final.stop_details) } : {}),\n }\n}\n\nasync function listModels(client: Anthropic, providerId: string): Promise<ModelInfo[]> {\n try {\n const models: ModelInfo[] = []\n for await (const model of client.models.list({ limit: 100 })) {\n models.push({\n id: model.id,\n name: model.display_name,\n contextWindow: model.max_input_tokens ?? undefined,\n maxOutput: model.max_tokens ?? undefined,\n pricing: pricingFor(model.id),\n })\n }\n return models\n } catch (error) {\n throw toProviderError(error, providerId)\n }\n}\n\nfunction toMessageParams(messages: Message[]): Anthropic.MessageParam[] {\n const params: Anthropic.MessageParam[] = []\n for (const message of messages) {\n const content = message.content.flatMap(toBlockParams)\n if (content.length > 0) params.push({ role: message.role, content })\n }\n return params\n}\n\nfunction toBlockParams(block: ContentBlock): Anthropic.ContentBlockParam[] {\n switch (block.type) {\n case 'text':\n return [{ type: 'text', text: block.text }]\n case 'thinking':\n return block.raw ? [block.raw as Anthropic.ContentBlockParam] : []\n case 'tool_use':\n return [{ type: 'tool_use', id: block.id, name: block.name, input: block.input }]\n case 'tool_result':\n return [\n {\n type: 'tool_result',\n tool_use_id: block.toolUseId,\n content: block.content,\n is_error: block.isError,\n },\n ]\n case 'image':\n return [\n {\n type: 'image',\n source: { type: 'base64', media_type: block.mediaType, data: block.data },\n },\n ]\n case 'file':\n return [{ type: 'text', text: `[Attached file: ${block.name}]\\n${block.text}` }]\n }\n}\n\nfunction toToolParams(tools: ToolSchema[]): Anthropic.Tool[] {\n return tools.map((tool, index) => {\n const param: Anthropic.Tool = {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema as Anthropic.Tool['input_schema'],\n }\n if (index === tools.length - 1) param.cache_control = { type: 'ephemeral' }\n return param\n })\n}\n\nfunction toContentBlocks(blocks: Anthropic.ContentBlock[]): ContentBlock[] {\n const content: ContentBlock[] = []\n for (const block of blocks) {\n if (block.type === 'text') content.push({ type: 'text', text: block.text })\n else if (block.type === 'thinking')\n content.push({ type: 'thinking', text: block.thinking, raw: block })\n else if (block.type === 'redacted_thinking')\n content.push({ type: 'thinking', text: '', raw: block })\n else if (block.type === 'tool_use')\n content.push({ type: 'tool_use', id: block.id, name: block.name, input: block.input })\n }\n return content\n}\n\nfunction partialContent(thinking: string, text: string): ContentBlock[] {\n const content: ContentBlock[] = []\n if (thinking) content.push({ type: 'thinking', text: thinking })\n if (text) content.push({ type: 'text', text })\n return content\n}\n\nfunction toUsage(usage: Anthropic.Usage): Usage {\n return {\n input: usage.input_tokens ?? 0,\n output: usage.output_tokens ?? 0,\n cacheWrite: usage.cache_creation_input_tokens ?? 0,\n cacheRead: usage.cache_read_input_tokens ?? 0,\n }\n}\n\nfunction toRefusal(details: Anthropic.RefusalStopDetails | null) {\n return { category: details?.category ?? null, explanation: details?.explanation ?? null }\n}\n\nfunction knownModel(id: string, name: string, contextWindow: number, maxOutput: number): ModelInfo {\n return { id, name, contextWindow, maxOutput, pricing: pricingFor(id) }\n}\n","import type { RateLimitBucket, RateLimits } from './types'\n\ntype HeaderNames = {\n limit?: string[]\n remaining?: string[]\n reset?: string[]\n}\n\nconst SCHEMES: Record<keyof RateLimits, HeaderNames> = {\n requests: {\n limit: [\n 'x-ratelimit-limit-requests',\n 'anthropic-ratelimit-requests-limit',\n 'ratelimit-limit',\n 'x-ratelimit-limit',\n ],\n remaining: [\n 'x-ratelimit-remaining-requests',\n 'anthropic-ratelimit-requests-remaining',\n 'ratelimit-remaining',\n 'x-ratelimit-remaining',\n ],\n reset: [\n 'x-ratelimit-reset-requests',\n 'anthropic-ratelimit-requests-reset',\n 'ratelimit-reset',\n 'x-ratelimit-reset',\n ],\n },\n tokens: {\n limit: ['x-ratelimit-limit-tokens', 'anthropic-ratelimit-tokens-limit'],\n remaining: ['x-ratelimit-remaining-tokens', 'anthropic-ratelimit-tokens-remaining'],\n reset: ['x-ratelimit-reset-tokens', 'anthropic-ratelimit-tokens-reset'],\n },\n inputTokens: {\n limit: ['anthropic-ratelimit-input-tokens-limit'],\n remaining: ['anthropic-ratelimit-input-tokens-remaining'],\n reset: ['anthropic-ratelimit-input-tokens-reset'],\n },\n outputTokens: {\n limit: ['anthropic-ratelimit-output-tokens-limit'],\n remaining: ['anthropic-ratelimit-output-tokens-remaining'],\n reset: ['anthropic-ratelimit-output-tokens-reset'],\n },\n}\n\nexport function parseRateLimits(headers: Headers | null): RateLimits | null {\n if (!headers) return null\n const limits: RateLimits = {}\n for (const [name, scheme] of Object.entries(SCHEMES) as Array<\n [keyof RateLimits, HeaderNames]\n >) {\n const bucket = readBucket(headers, scheme)\n if (bucket) limits[name] = bucket\n }\n return Object.keys(limits).length > 0 ? limits : null\n}\n\nfunction readBucket(headers: Headers, names: HeaderNames): RateLimitBucket | null {\n const limit = readNumber(headers, names.limit)\n const remaining = readNumber(headers, names.remaining)\n const reset = readReset(headers, names.reset)\n if (limit === undefined && remaining === undefined && reset === undefined) return null\n return {\n ...(limit === undefined ? {} : { limit }),\n ...(remaining === undefined ? {} : { remaining }),\n ...(reset === undefined ? {} : { reset }),\n }\n}\n\nfunction first(headers: Headers, names: string[] | undefined): string | undefined {\n for (const name of names ?? []) {\n const value = headers.get(name)?.trim()\n if (value) return value\n }\n return undefined\n}\n\nfunction readNumber(headers: Headers, names: string[] | undefined): number | undefined {\n const value = first(headers, names)\n if (!value || !/^\\d+(?:\\.\\d+)?$/.test(value)) return undefined\n const parsed = Number(value)\n return Number.isFinite(parsed) && parsed >= 0 && parsed <= 1e15 ? parsed : undefined\n}\n\nfunction readReset(headers: Headers, names: string[] | undefined): string | undefined {\n const value = first(headers, names)\n if (!value || value.length > 80 || /[\\r\\n\\0-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/.test(value)) {\n return undefined\n }\n return value\n}\n\nexport function formatRateLimits(limits: RateLimits): string[] {\n const labels: Array<[keyof RateLimits, string]> = [\n ['requests', 'requests'],\n ['tokens', 'tokens'],\n ['inputTokens', 'input tokens'],\n ['outputTokens', 'output tokens'],\n ]\n return labels.flatMap(([key, label]) => {\n const bucket = limits[key]\n if (!bucket) return []\n const amount =\n bucket.remaining !== undefined && bucket.limit !== undefined\n ? `${formatNumber(bucket.remaining)} / ${formatNumber(bucket.limit)} left`\n : bucket.remaining !== undefined\n ? `${formatNumber(bucket.remaining)} left`\n : bucket.limit !== undefined\n ? `limit ${formatNumber(bucket.limit)}`\n : ''\n const reset = bucket.reset ? `reset ${bucket.reset}` : ''\n const details = [amount, reset].filter(Boolean).join(' · ')\n return [`${label}${details ? ` ${details}` : ''}`]\n })\n}\n\nfunction formatNumber(value: number): string {\n return Number.isInteger(value) ? value.toLocaleString('en-US') : String(value)\n}\n","import OpenAI from 'openai'\nimport {\n captureResponseHead,\n invalidStreamError,\n isUserAbort,\n MAX_RETRIES,\n REQUEST_TIMEOUT_MS,\n toProviderError,\n} from './errors'\nimport { modelInfoFromRaw } from './model-info'\nimport { pricingFor } from './pricing'\nimport { parseRateLimits } from './rate-limits'\nimport { emptyUsage } from './types'\nimport type {\n ChatRequest,\n ContentBlock,\n Message,\n ModelInfo,\n Provider,\n StopReason,\n StreamEvent,\n ToolSchema,\n ToolUseBlock,\n Usage,\n} from './types'\n\nconst FINISH_REASONS: Record<string, StopReason> = {\n tool_calls: 'tool_use',\n stop: 'end_turn',\n length: 'max_tokens',\n content_filter: 'refusal',\n}\n\ninterface PartialCall {\n id: string\n name: string\n args: string\n}\n\ntype ReasoningDelta = { reasoning_content?: string | null; reasoning?: string | null }\n\ntype ToolCallDelta = OpenAI.Chat.ChatCompletionChunk.Choice.Delta.ToolCall\n\nexport function createOpenAiProvider(args: {\n id: string\n apiKey: string\n baseUrl: string\n headers?: Record<string, string>\n timeoutMs?: number\n}): Provider {\n const client = new OpenAI({\n baseURL: args.baseUrl,\n apiKey: args.apiKey,\n defaultHeaders: args.headers,\n maxRetries: MAX_RETRIES,\n timeout: args.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n return {\n id: args.id,\n kind: 'openai',\n stream: (req) => streamTurn(client, args.id, req),\n listModels: () => listModels(client, args.id),\n knownModels: () => [],\n }\n}\n\nasync function* streamTurn(\n client: OpenAI,\n providerId: string,\n req: ChatRequest,\n): AsyncGenerator<StreamEvent> {\n let text = ''\n let thinking = ''\n let finishReason: string | null = null\n let aborted = false\n let usage = emptyUsage()\n let sawUsage = false\n let recognised = 0\n const calls = new Map<number, PartialCall>()\n const capture = captureResponseHead()\n\n try {\n const stream = await client.withOptions({ fetch: capture.fetch }).chat.completions.create(\n {\n model: req.model,\n max_tokens: req.maxTokens,\n messages: toChatMessages(req.system, req.messages),\n ...(req.tools.length > 0 ? { tools: toChatTools(req.tools) } : {}),\n stream: true,\n stream_options: { include_usage: true },\n },\n { signal: req.signal },\n )\n\n for await (const chunk of stream) {\n if (chunk.usage) {\n usage = toUsage(chunk.usage)\n sawUsage = true\n }\n if (!Array.isArray(chunk.choices)) continue\n recognised += 1\n const choice = chunk.choices[0]\n if (!choice) continue\n if (choice.finish_reason) finishReason = choice.finish_reason\n const delta = choice.delta as typeof choice.delta & ReasoningDelta\n const reasoning = delta.reasoning_content ?? delta.reasoning\n if (reasoning) {\n thinking += reasoning\n yield { type: 'thinking_delta', text: reasoning }\n }\n if (delta.content) {\n text += delta.content\n yield { type: 'text_delta', text: delta.content }\n }\n for (const call of delta.tool_calls ?? []) accumulate(calls, call)\n }\n } catch (error) {\n if (!isUserAbort(error, req.signal)) {\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n throw toProviderError(error, providerId)\n }\n aborted = true\n }\n\n const content = toContentBlocks(thinking, text, calls)\n if (aborted || req.signal?.aborted) {\n if (sawUsage) yield { type: 'usage', usage }\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n yield { type: 'done', stopReason: 'aborted', content }\n return\n }\n\n if (recognised === 0) throw await invalidStreamError(providerId, capture)\n\n for (const block of content) {\n if (block.type === 'tool_use') {\n yield { type: 'tool_call', id: block.id, name: block.name, input: block.input }\n }\n }\n if (sawUsage) yield { type: 'usage', usage }\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n yield { type: 'done', stopReason: resolveStop(finishReason, calls.size > 0), content }\n}\n\nfunction resolveStop(finishReason: string | null, hasCalls: boolean): StopReason {\n const mapped = FINISH_REASONS[finishReason ?? '']\n if (mapped === 'max_tokens' || mapped === 'refusal') return mapped\n if (hasCalls) return 'tool_use'\n return mapped ?? 'end_turn'\n}\n\nasync function listModels(client: OpenAI, providerId: string): Promise<ModelInfo[]> {\n try {\n const models: ModelInfo[] = []\n for await (const model of client.models.list()) {\n const metadata = modelInfoFromRaw(model) ?? { id: model.id }\n models.push({ ...metadata, pricing: metadata.pricing ?? pricingFor(model.id) })\n }\n return models\n } catch (error) {\n throw toProviderError(error, providerId)\n }\n}\n\nfunction accumulate(calls: Map<number, PartialCall>, delta: ToolCallDelta): void {\n const call = calls.get(delta.index) ?? { id: '', name: '', args: '' }\n if (delta.id) call.id += delta.id\n if (delta.function?.name) call.name += delta.function.name\n if (delta.function?.arguments) call.args += delta.function.arguments\n calls.set(delta.index, call)\n}\n\nfunction toContentBlocks(\n thinking: string,\n text: string,\n calls: Map<number, PartialCall>,\n): ContentBlock[] {\n const content: ContentBlock[] = []\n if (thinking) content.push({ type: 'thinking', text: thinking })\n if (text) content.push({ type: 'text', text })\n const sorted = [...calls.entries()].sort((a, b) => a[0] - b[0])\n const tmpId = (position: number) => `call_${position}`\n for (const [position, [, call]] of sorted.entries()) {\n content.push({\n type: 'tool_use',\n id: call.id || tmpId(position),\n name: call.name,\n input: parseArguments(call.args),\n })\n }\n return content\n}\n\nfunction parseArguments(args: string): Record<string, unknown> {\n if (!args) return {}\n try {\n return JSON.parse(args) as Record<string, unknown>\n } catch {\n return {}\n }\n}\n\nfunction toChatMessages(\n system: string,\n messages: Message[],\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n const out: OpenAI.Chat.ChatCompletionMessageParam[] = [{ role: 'system', content: system }]\n for (const message of messages) {\n if (message.role === 'assistant') out.push(...toAssistantMessage(message.content))\n else out.push(...toUserMessages(message.content))\n }\n return out\n}\n\nfunction toUserMessages(content: ContentBlock[]): OpenAI.Chat.ChatCompletionMessageParam[] {\n const out: OpenAI.Chat.ChatCompletionMessageParam[] = []\n for (const block of content) {\n if (block.type === 'tool_result') {\n out.push({ role: 'tool', tool_call_id: block.toolUseId, content: block.content })\n }\n }\n const parts: OpenAI.Chat.ChatCompletionContentPart[] = []\n for (const block of content) {\n if (block.type === 'text') parts.push({ type: 'text', text: block.text })\n if (block.type === 'file') {\n parts.push({ type: 'text', text: `[Attached file: ${block.name}]\\n${block.text}` })\n }\n if (block.type === 'image') {\n parts.push({\n type: 'image_url',\n image_url: { url: `data:${block.mediaType};base64,${block.data}` },\n })\n }\n }\n if (parts.length === 1 && parts[0]?.type === 'text') {\n out.push({ role: 'user', content: parts[0].text })\n } else if (parts.length > 0) {\n out.push({ role: 'user', content: parts })\n }\n return out\n}\n\nfunction toAssistantMessage(content: ContentBlock[]): OpenAI.Chat.ChatCompletionMessageParam[] {\n const toolCalls = content\n .filter((block): block is ToolUseBlock => block.type === 'tool_use')\n .map((block) => ({\n id: block.id,\n type: 'function' as const,\n function: { name: block.name, arguments: JSON.stringify(block.input ?? {}) },\n }))\n const text = joinText(content)\n if (!text && toolCalls.length === 0) return []\n const message: OpenAI.Chat.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n content: text || null,\n }\n if (toolCalls.length > 0) message.tool_calls = toolCalls\n return [message]\n}\n\nfunction joinText(content: ContentBlock[]): string {\n return content.map((block) => (block.type === 'text' ? block.text : '')).join('')\n}\n\nfunction toChatTools(tools: ToolSchema[]): OpenAI.Chat.ChatCompletionFunctionTool[] {\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }))\n}\n\nfunction toUsage(usage: NonNullable<OpenAI.Chat.ChatCompletionChunk['usage']>): Usage {\n return normalizeOpenAiUsage(usage)\n}\n\nexport function normalizeOpenAiUsage(usage: {\n prompt_tokens?: number | null\n completion_tokens?: number | null\n prompt_tokens_details?: { cached_tokens?: number | null } | null\n}): Usage {\n \n \n \n const cacheRead = usage.prompt_tokens_details?.cached_tokens ?? 0\n return {\n input: Math.max(0, (usage.prompt_tokens ?? 0) - cacheRead),\n output: usage.completion_tokens ?? 0,\n cacheWrite: 0,\n cacheRead,\n }\n}\n","import { parseModelRef } from '../config/schema'\nimport type { AuthFile, Config, ProviderConfig } from '../config/schema'\nimport { resolveApiKey } from '../config/store'\nimport { createAnthropicProvider } from './anthropic'\nimport { createOpenAiProvider } from './openai-compat'\nimport type { Provider } from './types'\n\nexport interface ResolvedModel {\n provider: Provider\n modelId: string\n}\n\nexport interface ProviderRegistry {\n get(id: string): Provider\n resolve(ref: string): ResolvedModel\n}\n\nexport function createRegistry(config: Config, auth: AuthFile): ProviderRegistry {\n const built = new Map<string, Provider>()\n\n function get(id: string): Provider {\n const cached = built.get(id)\n if (cached) return cached\n\n const entry = config.providers[id]\n if (!entry) throw new Error(unknownProviderMessage(id, Object.keys(config.providers)))\n\n const provider = build(id, entry, apiKey(id, entry, auth))\n built.set(id, provider)\n return provider\n }\n\n return {\n get,\n resolve(ref) {\n const parsed = parseModelRef(ref)\n if (!parsed) {\n throw new Error(\n `Model \"${ref}\" is not a \"<provider>/<model>\" reference, e.g. \"anthropic/claude-opus-5\".`,\n )\n }\n return { provider: get(parsed.provider), modelId: parsed.model }\n },\n }\n}\n\nfunction build(id: string, entry: ProviderConfig, key: string): Provider {\n const args = { id, apiKey: key, baseUrl: entry.baseUrl, headers: entry.headers }\n return entry.type === 'anthropic' ? createAnthropicProvider(args) : createOpenAiProvider(args)\n}\n\nfunction apiKey(id: string, entry: ProviderConfig, auth: AuthFile): string {\n const key = resolveApiKey(id, entry, auth)\n if (key) return key\n throw new Error(\n `No API key for provider \"${id}\"${entry.keyEnv ? ` (env ${entry.keyEnv} is unset)` : ''}. ` +\n `Add one with: kitcode add ${entry.baseUrl}`,\n )\n}\n\nfunction unknownProviderMessage(id: string, known: string[]): string {\n const configured = known.length > 0 ? known.join(', ') : 'none'\n return (\n `Unknown provider \"${id}\". Configured providers: ${configured}. ` +\n `Add it with: kitcode add <url>`\n )\n}\n","import type { PermissionMode, Tool } from './types'\n\nexport type AgentMode = 'normal' | 'accept' | 'plan'\n\nexport const MODES: AgentMode[] = ['normal', 'accept', 'plan']\n\nexport interface PermissionEngine {\n resolve(tool: Tool, requested?: PermissionMode): PermissionMode\n decide(tool: Tool, requested?: PermissionMode): PermissionMode\n grantForSession(toolName: string): void\n bypass: {\n enable(): void\n disable(): void\n isEnabled(): boolean\n }\n denyReason(tool: Tool, requested?: PermissionMode): string | undefined\n mode: {\n get(): AgentMode\n set(mode: AgentMode): void\n cycle(): AgentMode\n }\n}\n\nexport const PLAN_REFUSAL =\n 'Plan mode is on: this tool changes state and is unavailable. Investigate with read-only tools and reply with a plan instead. Do not retry.'\n\nexport function createPermissionEngine(\n configPermissions: Record<string, PermissionMode>,\n): PermissionEngine {\n const sessionGrants = new Set<string>()\n let bypassEnabled = false\n let current: AgentMode = 'normal'\n\n const resolve = (tool: Tool, requested?: PermissionMode): PermissionMode =>\n configPermissions[tool.name] ?? requested ?? tool.defaultPermission\n\n return {\n resolve,\n decide(tool, requested) {\n const configured = resolve(tool, requested)\n if (configured === 'deny') return 'deny'\n if (current === 'plan' && configured !== 'allow') return 'deny'\n if (configured === 'allow') return 'allow'\n if (bypassEnabled) return 'allow'\n if (current === 'accept' && isFileEdit(tool)) return 'allow'\n if (sessionGrants.has(tool.name)) return 'allow'\n return 'ask'\n },\n grantForSession(toolName) {\n sessionGrants.add(toolName)\n },\n denyReason(tool, requested) {\n const configured = resolve(tool, requested)\n if (configured === 'deny' || configured === 'allow') return undefined\n return current === 'plan' ? PLAN_REFUSAL : undefined\n },\n bypass: {\n enable() {\n bypassEnabled = true\n },\n disable() {\n bypassEnabled = false\n },\n isEnabled() {\n return bypassEnabled\n },\n },\n mode: {\n get: () => current,\n set(mode) {\n current = mode\n },\n cycle() {\n current = MODES[(MODES.indexOf(current) + 1) % MODES.length] ?? 'normal'\n return current\n },\n },\n }\n}\n\nfunction isFileEdit(tool: Tool): boolean {\n return tool.name === 'write' || tool.name === 'edit'\n}\n","import { readFile, stat, writeFile } from 'node:fs/promises'\nimport { resolveInside } from './safepath'\nimport { brief } from './summary'\nimport type { Tool } from './types'\n\ninterface EditInput {\n path: string\n oldString: string\n newString: string\n replaceAll?: boolean\n}\n\nconst MAX_FILE_BYTES = 5_000_000\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (needle === '') return 0\n let count = 0\n let from = 0\n for (;;) {\n const at = haystack.indexOf(needle, from)\n if (at === -1) return count\n count += 1\n from = at + needle.length\n }\n}\n\nexport const editTool: Tool = {\n name: 'edit',\n description:\n 'Replace an exact string in a file. oldString must match the file byte for byte, including indentation, and must be unique unless replaceAll is true.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path, relative to the workspace root' },\n oldString: {\n type: 'string',\n description: 'Text to replace, with enough context to be unique',\n maxLength: MAX_FILE_BYTES,\n },\n newString: { type: 'string', description: 'Replacement text', maxLength: MAX_FILE_BYTES },\n replaceAll: { type: 'boolean', description: 'Replace every occurrence instead of requiring a unique match' },\n },\n required: ['path', 'oldString', 'newString'],\n additionalProperties: false,\n },\n defaultPermission: 'ask',\n summarize(input) {\n return `edit(${brief((input as EditInput).path)})`\n },\n async preview(input, ctx) {\n const { path, oldString, newString, replaceAll = false } = input as EditInput\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { kind: 'text', text: safe.reason }\n const info = await stat(safe.path).catch(() => null)\n if (info && info.size > MAX_FILE_BYTES) {\n return { kind: 'text', text: `Cannot preview ${path}: the file is too large.` }\n }\n const beforeBuffer = await readFile(safe.path).catch(() => null)\n if (!beforeBuffer) return { kind: 'text', text: `Cannot read ${path}.` }\n if (beforeBuffer.subarray(0, 8192).includes(0)) {\n return { kind: 'text', text: `Cannot preview binary file ${path}` }\n }\n const before = beforeBuffer.toString('utf8')\n const after = replacement(before, oldString, newString, replaceAll)\n return after === null\n ? { kind: 'text', text: `Cannot preview edit: oldString is not a valid match in ${path}.` }\n : { kind: 'diff', path, before, after }\n },\n async execute(input, ctx) {\n const { path, oldString, newString, replaceAll = false } = input as EditInput\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { content: safe.reason, isError: true }\n\n const info = await stat(safe.path).catch(() => null)\n if (info && info.size > MAX_FILE_BYTES) {\n return {\n content: `Cannot edit ${path}: the file exceeds the ${MAX_FILE_BYTES / 1_000_000} MB limit.`,\n isError: true,\n }\n }\n const beforeBuffer = await readFile(safe.path).catch(() => null)\n if (beforeBuffer === null) return { content: `Cannot read ${path}.`, isError: true }\n if (beforeBuffer.subarray(0, 8192).includes(0)) {\n return { content: `Cannot edit ${path}: it is a binary file, not text.`, isError: true }\n }\n const before = beforeBuffer.toString('utf8')\n\n const count = countOccurrences(before, oldString)\n if (count === 0) {\n return {\n content: `oldString was not found in ${path}. Read the file again and match the text exactly, including whitespace.`,\n isError: true,\n }\n }\n if (count > 1 && !replaceAll) {\n return {\n content: `oldString matches ${count} places in ${path}. Add more surrounding context to identify a single one, or set replaceAll to true.`,\n isError: true,\n }\n }\n\n const after = replacement(before, oldString, newString, replaceAll)\n if (after === null) return { content: `Could not prepare edit for ${path}.`, isError: true }\n if (Buffer.byteLength(after, 'utf8') > MAX_FILE_BYTES) {\n return {\n content: `Cannot edit ${path}: the result exceeds the ${MAX_FILE_BYTES / 1_000_000} MB limit.`,\n isError: true,\n }\n }\n\n try {\n await ctx.checkpoint?.capture(safe.path)\n } catch (error) {\n return { content: `Checkpoint capture failed: ${(error as Error).message}`, isError: true }\n }\n try {\n await writeFile(safe.path, after, 'utf8')\n ctx.checkpoint?.markChanged(safe.path)\n } catch (error) {\n return { content: `Failed to write ${path}: ${(error as Error).message}`, isError: true }\n }\n\n return {\n content: `Edited ${path} (${count} ${count === 1 ? 'replacement' : 'replacements'})`,\n display: { kind: 'diff', path, before, after },\n }\n },\n}\n\nfunction replacement(\n before: string,\n oldString: string,\n newString: string,\n replaceAll: boolean,\n): string | null {\n const count = countOccurrences(before, oldString)\n if (count === 0 || (count > 1 && !replaceAll)) return null\n if (replaceAll) return before.split(oldString).join(newString)\n const at = before.indexOf(oldString)\n return before.slice(0, at) + newString + before.slice(at + oldString.length)\n}\n","import { join } from 'node:path'\nimport fg from 'fast-glob'\nimport { patternEscapes, resolveInside } from './safepath'\nimport { brief } from './summary'\nimport type { Tool } from './types'\n\nconst MAX_RESULTS = 500\n\nexport const IGNORED_DIRECTORIES = ['**/node_modules/**', '**/.git/**', '**/dist/**']\n\ninterface GlobInput {\n pattern: string\n path?: string\n}\n\nexport const globTool: Tool = {\n name: 'glob',\n description:\n 'Find files by glob pattern, most recently modified first. Supports patterns like \"src/**/*.ts\". Hidden files, node_modules, .git and dist are skipped.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Glob pattern, e.g. **/*.test.ts' },\n path: { type: 'string', description: 'Directory to search in, relative to the workspace root' },\n },\n required: ['pattern'],\n additionalProperties: false,\n },\n defaultPermission: 'allow',\n summarize(input) {\n return `glob(${brief((input as GlobInput).pattern)})`\n },\n async execute(input, ctx) {\n const { pattern, path = '.' } = input as GlobInput\n if (patternEscapes(pattern)) {\n return { content: `Pattern ${pattern} must be relative to the workspace root.`, isError: true }\n }\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { content: safe.reason, isError: true }\n\n const entries = await fg(pattern, {\n cwd: safe.path,\n dot: false,\n onlyFiles: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n ignore: IGNORED_DIRECTORIES,\n stats: true,\n })\n if (entries.length === 0) return { content: `No files matched ${pattern}` }\n\n entries.sort((a, b) => (b.stats?.mtimeMs ?? 0) - (a.stats?.mtimeMs ?? 0))\n const paths = entries.slice(0, MAX_RESULTS).map((entry) => join(safe.relative, entry.path))\n if (entries.length > MAX_RESULTS) {\n paths.push(`... truncated: ${entries.length - MAX_RESULTS} more files matched.`)\n }\n return { content: paths.join('\\n') }\n },\n}\n","import { readFile, stat } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport fg from 'fast-glob'\nimport { IGNORED_DIRECTORIES } from './glob'\nimport { patternEscapes, resolveInside } from './safepath'\nimport { brief } from './summary'\nimport type { Tool } from './types'\nimport { isSensitivePath, mentionsSensitivePattern } from './sensitive'\nimport { createRegexMatcher } from './regex'\n\nconst MAX_MATCHES = 200\nconst MAX_FILE_BYTES = 1_000_000\nconst MAX_LINE_WIDTH = 300\nconst MAX_PATTERN_CHARS = 2_000\nconst MAX_FILES = 5_000\nconst MAX_TOTAL_BYTES = 50_000_000\n\ninterface GrepInput {\n pattern: string\n path?: string\n glob?: string\n maxMatches?: number\n}\n\nexport const grepTool: Tool = {\n name: 'grep',\n description:\n 'Search file contents with a JavaScript regular expression. Returns matching lines as path:line: text, most recently modified files first.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'JavaScript regular expression',\n maxLength: MAX_PATTERN_CHARS,\n },\n path: { type: 'string', description: 'Directory to search in, relative to the workspace root' },\n glob: { type: 'string', description: 'Glob limiting which files are searched, e.g. **/*.ts' },\n maxMatches: { type: 'integer', description: `Maximum matches to return (default ${MAX_MATCHES})`, minimum: 1 },\n },\n required: ['pattern'],\n additionalProperties: false,\n },\n defaultPermission: 'allow',\n permission(input, ctx) {\n const { path, glob } = (input as Partial<GrepInput> | null) ?? {}\n if (isSensitivePath(path) || mentionsSensitivePattern(glob)) return 'ask'\n const safe = ctx && path ? resolveInside(ctx.cwd, path) : undefined\n return safe?.ok && isSensitivePath(safe.relative) ? 'ask' : undefined\n },\n summarize(input) {\n return `grep(${brief((input as GrepInput).pattern)})`\n },\n async execute(input, ctx) {\n const { pattern, path = '.', glob = '**/*', maxMatches } = input as GrepInput\n if (pattern.length > MAX_PATTERN_CHARS) {\n return {\n content: `Regular expression is limited to ${MAX_PATTERN_CHARS} characters.`,\n isError: true,\n }\n }\n try {\n new RegExp(pattern)\n } catch (error) {\n return { content: `Invalid regular expression: ${(error as Error).message}`, isError: true }\n }\n\n if (patternEscapes(glob)) {\n return { content: `Glob ${glob} must be relative to the workspace root.`, isError: true }\n }\n\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { content: safe.reason, isError: true }\n\n const target = await stat(safe.path).catch(() => null)\n if (!target) return { content: `Path not found: ${path}`, isError: true }\n\n const discovered = target.isDirectory()\n ? (\n await fg(glob, {\n cwd: safe.path,\n dot: false,\n onlyFiles: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n ignore: IGNORED_DIRECTORIES,\n stats: true,\n })\n )\n .sort((a, b) => (b.stats?.mtimeMs ?? 0) - (a.stats?.mtimeMs ?? 0))\n .map((entry) => ({\n absolute: join(safe.path, entry.path),\n relative: join(safe.relative, entry.path),\n size: entry.stats?.size ?? 0,\n }))\n : [{ absolute: safe.path, relative: safe.relative, size: target.size }]\n const files = discovered.slice(0, MAX_FILES)\n const filesCapped = discovered.length > MAX_FILES\n\n const limit = Math.min(maxMatches ?? MAX_MATCHES, MAX_MATCHES)\n const hits: string[] = []\n let matchCapped = false\n let scanCapped = false\n let scannedBytes = 0\n const matcher = createRegexMatcher(pattern)\n\n try {\n for (const file of files) {\n if (ctx.signal.aborted) throw new Error('Search interrupted by the user.')\n if (file.size > MAX_FILE_BYTES) continue\n if (scannedBytes + file.size > MAX_TOTAL_BYTES) {\n scanCapped = true\n break\n }\n scannedBytes += file.size\n const buffer = await readFile(file.absolute).catch(() => null)\n if (!buffer || buffer.subarray(0, 4096).includes(0)) continue\n\n const lines = buffer.toString('utf8').split('\\n')\n const remaining = limit - hits.length\n const indexes = await matcher.match(lines, remaining + 1, ctx.signal)\n if (indexes.length > remaining) matchCapped = true\n for (const index of indexes.slice(0, remaining)) {\n const text = (lines[index] ?? '').trim()\n hits.push(\n `${file.relative}:${index + 1}: ${text.length > MAX_LINE_WIDTH ? `${text.slice(0, MAX_LINE_WIDTH)}…` : text}`,\n )\n }\n if (matchCapped) break\n }\n } catch (error) {\n return { content: (error as Error).message, isError: true }\n } finally {\n await matcher.close()\n }\n\n if (hits.length === 0) return { content: `No matches for ${pattern}` }\n if (matchCapped || scanCapped || filesCapped) {\n hits.push(\n matchCapped\n ? `... stopped at ${limit} matches. Narrow the pattern or glob for the rest.`\n : scanCapped\n ? `... stopped after scanning ${MAX_TOTAL_BYTES / 1_000_000} MB. Narrow the path or glob for the rest.`\n : `... searched the first ${MAX_FILES} files. Narrow the path or glob for the rest.`,\n )\n }\n return { content: hits.join('\\n') }\n },\n}\n","import path from 'node:path'\n\nconst sensitiveNames = new Set([\n '.npmrc',\n '.pypirc',\n '.git-credentials',\n 'auth.json',\n 'credentials',\n 'credentials.json',\n 'id_rsa',\n 'id_ed25519',\n])\n\nconst sensitiveExtensions = new Set(['.pem', '.key', '.p12', '.pfx'])\n\nexport function isSensitivePath(value: unknown): boolean {\n if (typeof value !== 'string') return false\n const normalized = value.replaceAll('\\\\', '/').toLowerCase()\n const name = path.posix.basename(normalized)\n if (name === '.env' || name.startsWith('.env.')) return true\n if (sensitiveNames.has(name) || sensitiveExtensions.has(path.posix.extname(name))) return true\n return normalized.split('/').some((part) => part === '.ssh' || part === '.aws')\n}\n\nexport function mentionsSensitivePattern(value: unknown): boolean {\n if (typeof value !== 'string') return false\n const lower = value.toLowerCase()\n return (\n isSensitivePath(lower) ||\n lower.includes('.env') ||\n lower.includes('.npmrc') ||\n lower.includes('auth.json') ||\n /\\.(?:pem|key|p12|pfx)(?:$|[^a-z0-9])/.test(lower)\n )\n}\n","import { Worker } from 'node:worker_threads'\n\nconst MATCH_TIMEOUT_MS = 300\n\nconst WORKER_SOURCE = String.raw`\n const { parentPort } = require('node:worker_threads')\n\n parentPort.on('message', ({ id, pattern, lines, maxMatches }) => {\n try {\n const regex = new RegExp(pattern)\n const indexes = []\n for (let index = 0; index < lines.length; index += 1) {\n const matched = regex.test(lines[index])\n regex.lastIndex = 0\n if (matched) indexes.push(index)\n if (indexes.length >= maxMatches) break\n }\n parentPort.postMessage({ id, indexes })\n } catch (error) {\n parentPort.postMessage({ id, error: error instanceof Error ? error.message : String(error) })\n }\n })\n`\n\ninterface WorkerReply {\n id: number\n indexes?: number[]\n error?: string\n}\n\nexport interface RegexMatcher {\n match(lines: string[], maxMatches: number, signal: AbortSignal): Promise<number[]>\n close(): Promise<void>\n}\n\nexport function createRegexMatcher(pattern: string): RegexMatcher {\n let worker = newWorker()\n let nextId = 0\n let closed = false\n\n return {\n match(lines, maxMatches, signal) {\n if (closed) return Promise.reject(new Error('Regular-expression worker is closed.'))\n if (signal.aborted) return Promise.reject(new Error('Search interrupted by the user.'))\n\n const id = ++nextId\n return new Promise<number[]>((resolve, reject) => {\n let settled = false\n const finish = (error?: Error, indexes?: number[]) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n worker.thread.off('message', onMessage)\n worker.thread.off('error', onError)\n if (error) reject(error)\n else resolve(indexes ?? [])\n }\n const onMessage = (reply: WorkerReply) => {\n if (reply.id !== id) return\n finish(reply.error ? new Error(reply.error) : undefined, reply.indexes)\n }\n const onError = (error: Error) => finish(error)\n const onAbort = () => {\n \n \n void worker.thread.terminate()\n worker = newWorker()\n finish(new Error('Search interrupted by the user.'))\n }\n const timer = setTimeout(() => {\n void worker.thread.terminate()\n worker = newWorker()\n finish(\n new Error(\n `Regular expression exceeded the ${MATCH_TIMEOUT_MS} ms per-file time limit. Narrow or simplify it.`,\n ),\n )\n }, MATCH_TIMEOUT_MS)\n\n signal.addEventListener('abort', onAbort, { once: true })\n worker.thread.on('message', onMessage)\n worker.thread.on('error', onError)\n worker.thread.postMessage({ id, pattern, lines, maxMatches })\n })\n },\n async close() {\n if (closed) return\n closed = true\n await worker.thread.terminate()\n },\n }\n}\n\ninterface WorkerHandle {\n thread: Worker\n}\n\nfunction newWorker(): WorkerHandle {\n const thread = new Worker(WORKER_SOURCE, { eval: true })\n \n \n thread.on('error', () => undefined)\n return { thread }\n}\n","import { readFile, stat } from 'node:fs/promises'\nimport { resolveInside } from './safepath'\nimport { brief } from './summary'\nimport type { Tool } from './types'\nimport { isSensitivePath } from './sensitive'\n\nconst MAX_LINES = 2000\nconst MAX_CHARS = 200_000\nconst MAX_FILE_BYTES = 5_000_000\n\ninterface ReadInput {\n path: string\n offset?: number\n limit?: number\n}\n\nexport const readTool: Tool = {\n name: 'read',\n description:\n 'Read a text file from the workspace. Returns numbered lines. Use offset and limit to page through large files.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path, relative to the workspace root' },\n offset: { type: 'integer', description: '1-based line to start 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 defaultPermission: 'allow',\n permission(input, ctx) {\n const target = (input as Partial<ReadInput> | null)?.path\n if (isSensitivePath(target)) return 'ask'\n const safe = ctx && target ? resolveInside(ctx.cwd, target) : undefined\n return safe?.ok && isSensitivePath(safe.relative) ? 'ask' : undefined\n },\n summarize(input) {\n return `read(${brief((input as ReadInput).path)})`\n },\n async execute(input, ctx) {\n const { path, offset = 1, limit } = input as ReadInput\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { content: safe.reason, isError: true }\n\n const info = await stat(safe.path).catch(() => null)\n if (!info) return { content: `File not found: ${path}`, isError: true }\n if (info.isDirectory()) {\n return { content: `${path} is a directory, not a file. Use glob to list its contents.`, isError: true }\n }\n if (info.size > MAX_FILE_BYTES) {\n return {\n content: `${path} is ${(info.size / 1_000_000).toFixed(1)} MB; read is limited to ${MAX_FILE_BYTES / 1_000_000} MB per file. Use grep or another targeted tool instead.`,\n isError: true,\n }\n }\n\n const buffer = await readFile(safe.path)\n if (buffer.subarray(0, 4096).includes(0)) {\n return { content: `${path} looks like a binary file and cannot be read as text.`, isError: true }\n }\n\n const lines = buffer.toString('utf8').split('\\n')\n if (lines.at(-1) === '') lines.pop()\n if (lines.length === 0) return { content: `${path} is empty.` }\n\n const start = Math.max(1, offset) - 1\n if (start >= lines.length) {\n return { content: `${path} has ${lines.length} lines, so offset ${offset} is past the end.`, isError: true }\n }\n\n const window = lines.slice(start, start + Math.min(limit ?? MAX_LINES, MAX_LINES))\n const rendered: string[] = []\n let chars = 0\n for (const [index, line] of window.entries()) {\n const numbered = `${start + index + 1}\\t${line}`\n if (chars + numbered.length > MAX_CHARS) break\n chars += numbered.length + 1\n rendered.push(numbered)\n }\n\n const remaining = lines.length - (start + rendered.length)\n if (remaining > 0) {\n rendered.push(\n `... truncated: ${remaining} more lines. Continue with offset ${start + rendered.length + 1}.`,\n )\n }\n return { content: rendered.join('\\n') }\n },\n}\n","import type { AgentEvent, PermissionDecision, PermissionRequest } from '../core/types'\nimport type { JsonSchema, ToolSchema } from '../providers/types'\n\nexport type PermissionMode = 'allow' | 'ask' | 'deny'\n\nexport interface FileCheckpointSink {\n capture(absolutePath: string): Promise<void>\n markChanged(absolutePath: string): void\n}\n\nexport interface ToolContext {\n cwd: string\n signal: AbortSignal\n confirm(question: string): Promise<boolean>\n requestPermission?(request: PermissionRequest): Promise<PermissionDecision>\n checkpoint?: FileCheckpointSink\n onEvent?(event: AgentEvent): void\n}\n\nexport type ToolDisplay =\n | { kind: 'text'; text: string }\n | { kind: 'diff'; path: string; before: string; after: string }\n | { kind: 'list'; title: string; items: string[] }\n\nexport interface ToolResult {\n content: string\n isError?: boolean\n display?: ToolDisplay\n}\n\nexport interface Tool {\n name: string\n description: string\n inputSchema: JsonSchema\n defaultPermission: PermissionMode\n permission?(input: unknown, ctx?: ToolContext): PermissionMode | undefined\n summarize(input: unknown): string\n preview?(input: unknown, ctx: ToolContext): Promise<ToolDisplay | undefined>\n execute(input: unknown, ctx: ToolContext): Promise<ToolResult>\n}\n\nexport function toToolSchema(tool: Tool): ToolSchema {\n return { name: tool.name, description: tool.description, inputSchema: tool.inputSchema }\n}\n","import { mkdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { dirname } from 'node:path'\nimport { resolveInside } from './safepath'\nimport { brief } from './summary'\nimport type { Tool } from './types'\n\ninterface WriteInput {\n path: string\n content: string\n}\n\nconst MAX_FILE_BYTES = 5_000_000\n\nexport const writeTool: Tool = {\n name: 'write',\n description:\n 'Write a file, replacing it if it already exists. Missing parent directories are created. Prefer edit for changing part of an existing file.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path, relative to the workspace root' },\n content: { type: 'string', description: 'Full file contents', maxLength: MAX_FILE_BYTES },\n },\n required: ['path', 'content'],\n additionalProperties: false,\n },\n defaultPermission: 'ask',\n summarize(input) {\n return `write(${brief((input as WriteInput).path)})`\n },\n async preview(input, ctx) {\n const { path, content } = input as WriteInput\n if (Buffer.byteLength(content, 'utf8') > MAX_FILE_BYTES) {\n return { kind: 'text', text: `Write is limited to ${MAX_FILE_BYTES / 1_000_000} MB.` }\n }\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { kind: 'text', text: safe.reason }\n const beforeInfo = await stat(safe.path).catch(() => null)\n if (beforeInfo && beforeInfo.size > MAX_FILE_BYTES) {\n return { kind: 'text', text: `Cannot preview ${path}: the existing file is too large.` }\n }\n const beforeBuffer = await readFile(safe.path).catch(() => null)\n if (beforeBuffer?.subarray(0, 8192).includes(0)) {\n return { kind: 'text', text: `Cannot preview binary file ${path}` }\n }\n return {\n kind: 'diff',\n path,\n before: beforeBuffer?.toString('utf8') ?? '',\n after: content,\n }\n },\n async execute(input, ctx) {\n const { path, content } = input as WriteInput\n if (Buffer.byteLength(content, 'utf8') > MAX_FILE_BYTES) {\n return {\n content: `Cannot write ${path}: content exceeds the ${MAX_FILE_BYTES / 1_000_000} MB limit.`,\n isError: true,\n }\n }\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { content: safe.reason, isError: true }\n\n const beforeInfo = await stat(safe.path).catch(() => null)\n if (beforeInfo && beforeInfo.size > MAX_FILE_BYTES) {\n return {\n content: `Cannot replace ${path}: the existing file exceeds the ${MAX_FILE_BYTES / 1_000_000} MB limit.`,\n isError: true,\n }\n }\n const beforeBuffer = await readFile(safe.path).catch(() => null)\n if (beforeBuffer instanceof Buffer && beforeBuffer.subarray(0, 8192).includes(0)) {\n return { content: `Cannot write ${path}: the existing file is binary, not text.`, isError: true }\n }\n let before = ''\n if (beforeBuffer) before = beforeBuffer.toString('utf8')\n try {\n await mkdir(dirname(safe.path), { recursive: true })\n await ctx.checkpoint?.capture(safe.path)\n await writeFile(safe.path, content, 'utf8')\n ctx.checkpoint?.markChanged(safe.path)\n } catch (error) {\n return { content: `Failed to write ${path}: ${(error as Error).message}`, isError: true }\n }\n\n const lines = content === '' ? 0 : content.replace(/\\n$/, '').split('\\n').length\n return {\n content: `${before === '' ? 'Created' : 'Updated'} ${path} (${lines} ${lines === 1 ? 'line' : 'lines'})`,\n display: { kind: 'diff', path, before, after: content },\n }\n },\n}\n","import type { ToolSchema } from '../providers/types'\nimport { bashTool } from './bash'\nimport { editTool } from './edit'\nimport { globTool } from './glob'\nimport { grepTool } from './grep'\nimport { readTool } from './read'\nimport { toToolSchema } from './types'\nimport type { Tool } from './types'\nimport { writeTool } from './write'\n\nexport interface ToolRegistry {\n get(name: string): Tool | undefined\n list(): Tool[]\n schemas(): ToolSchema[]\n register(tools: Tool[]): void\n unregister(names: Iterable<string>): void\n}\n\nexport function builtinTools(): Tool[] {\n return [readTool, writeTool, editTool, bashTool, globTool, grepTool]\n}\n\nexport function createToolRegistry(tools: Tool[]): ToolRegistry {\n const byName = new Map<string, Tool>()\n\n const register = (incoming: Tool[]) => {\n for (const tool of incoming) {\n if (!byName.has(tool.name)) byName.set(tool.name, tool)\n }\n }\n register(tools)\n\n return {\n get: (name) => byName.get(name),\n list: () => [...byName.values()],\n schemas: () => [...byName.values()].map(toToolSchema),\n register,\n unregister(names) {\n for (const name of names) byName.delete(name)\n },\n }\n}\n","import { chmod, readFile, readdir, unlink, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport { ensureDir, promptsDir } from '../config/paths'\n\nexport interface SavedPrompt {\n slug: string\n name: string\n description: string\n created: string\n body: string\n}\n\nexport async function savePrompt(input: {\n name: string\n description?: string\n body: string\n}): Promise<SavedPrompt> {\n const slug = slugify(input.name)\n if (!slug) throw new Error(`Prompt name has no letters or digits to name a file after: ${input.name}`)\n const prompt: SavedPrompt = {\n slug,\n name: input.name,\n description: input.description ?? '',\n created: new Date().toISOString(),\n body: input.body.trim(),\n }\n await ensureDir(promptsDir)\n const file = path.join(promptsDir, `${slug}.md`)\n await writeFile(file, serialize(prompt), {\n encoding: 'utf8',\n mode: 0o600,\n })\n await chmod(file, 0o600)\n return prompt\n}\n\nexport async function getPrompt(slug: string): Promise<SavedPrompt | null> {\n assertSlug(slug)\n try {\n return parse(slug, await readFile(path.join(promptsDir, `${slug}.md`), 'utf8'))\n } catch (error) {\n if (isMissing(error)) return null\n throw error\n }\n}\n\nexport async function listPrompts(): Promise<SavedPrompt[]> {\n let names: string[]\n try {\n names = await readdir(promptsDir)\n } catch (error) {\n if (!isMissing(error)) throw error\n return []\n }\n const prompts = await Promise.all(\n names\n .filter((name) => name.endsWith('.md'))\n .map(async (name) =>\n parse(name.slice(0, -3), await readFile(path.join(promptsDir, name), 'utf8')),\n ),\n )\n return prompts.sort((a, b) => a.name.localeCompare(b.name))\n}\n\nexport async function deletePrompt(slug: string): Promise<boolean> {\n assertSlug(slug)\n try {\n await unlink(path.join(promptsDir, `${slug}.md`))\n return true\n } catch (error) {\n if (isMissing(error)) return false\n throw error\n }\n}\n\nexport async function promptExists(slug: string): Promise<boolean> {\n assertSlug(slug)\n try {\n await readFile(path.join(promptsDir, `${slug}.md`), 'utf8')\n return true\n } catch (error) {\n if (isMissing(error)) return false\n throw error\n }\n}\n\nexport async function searchPrompts(query: string): Promise<SavedPrompt[]> {\n const needle = query.trim().toLowerCase()\n const prompts = await listPrompts()\n if (!needle) return prompts\n return prompts.filter(\n (prompt) =>\n prompt.name.toLowerCase().includes(needle) ||\n prompt.description.toLowerCase().includes(needle),\n )\n}\n\nfunction isMissing(error: unknown): boolean {\n return (error as NodeJS.ErrnoException).code === 'ENOENT'\n}\n\nfunction slugify(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\nfunction assertSlug(slug: string): void {\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug)) {\n throw new Error(`Invalid prompt id: ${slug}`)\n }\n}\n\nfunction serialize(prompt: SavedPrompt): string {\n const field = (key: string, value: string) => `${key}: ${value.replace(/\\s+/g, ' ').trim()}`\n return [\n '---',\n field('name', prompt.name),\n field('description', prompt.description),\n field('created', prompt.created),\n '---',\n '',\n prompt.body,\n '',\n ].join('\\n')\n}\n\nfunction parse(slug: string, text: string): SavedPrompt {\n const lines = text.split('\\n')\n const meta: Record<string, string> = {}\n let bodyStart = 0\n if (lines[0]?.trim() === '---') {\n let i = 1\n for (; i < lines.length && lines[i].trim() !== '---'; i++) {\n const colon = lines[i].indexOf(':')\n if (colon <= 0) continue\n const key = lines[i].slice(0, colon).trim()\n if (key === 'name' || key === 'description' || key === 'created') {\n meta[key] = lines[i].slice(colon + 1).trim()\n }\n }\n bodyStart = Math.min(i + 1, lines.length)\n }\n return {\n slug,\n name: meta.name || slug,\n description: meta.description ?? '',\n created: meta.created ?? '',\n body: lines.slice(bodyStart).join('\\n').trim(),\n }\n}\n","import { open, readFile, readdir, stat } from 'node:fs/promises'\nimport path from 'node:path'\n\nexport interface SkillMeta {\n name: string\n description: string\n dir: string\n file: string\n}\n\nexport interface Skill extends SkillMeta {\n body: string\n}\n\nconst SKILL_FILE = 'SKILL.md'\nconst FRONTMATTER_BYTES = 8192\nconst MAX_SKILL_BYTES = 5_000_000\nconst MAX_SKILLS_PER_ROOT = 500\n\nexport async function discoverSkills(dirs: string[]): Promise<SkillMeta[]> {\n const byName = new Map<string, SkillMeta>()\n for (const root of dirs) {\n const entries = await readdir(root).catch(() => [])\n const found = await Promise.all(\n entries.slice(0, MAX_SKILLS_PER_ROOT).map((entry) => readMeta(path.join(root, entry))),\n )\n for (const meta of found) {\n if (meta && !byName.has(meta.name)) byName.set(meta.name, meta)\n }\n }\n return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name))\n}\n\nexport async function loadSkill(meta: SkillMeta): Promise<Skill> {\n const info = await stat(meta.file)\n if (info.size > MAX_SKILL_BYTES) {\n throw new Error(`Skill file exceeds the ${MAX_SKILL_BYTES / 1_000_000} MB limit: ${meta.file}`)\n }\n const { body } = parseFrontmatter(await readFile(meta.file, 'utf8'))\n return { ...meta, body }\n}\n\nexport function formatSkillCatalogue(skills: SkillMeta[]): string {\n if (skills.length === 0) return ''\n const lines = skills.map((skill) => `- ${skill.name}${skill.description ? ` — ${skill.description}` : ''}`)\n return ['Skills available (use the skill tool to read one in full before doing that kind of work):', ...lines].join(\n '\\n',\n )\n}\n\nasync function readMeta(dir: string): Promise<SkillMeta | null> {\n const file = path.join(dir, SKILL_FILE)\n const head = await readFrontmatterBytes(file)\n if (head === null) return null\n const { fields } = parseFrontmatter(head)\n return { name: fields.name || path.basename(dir), description: fields.description ?? '', dir, file }\n}\n\nasync function readFrontmatterBytes(file: string): Promise<string | null> {\n const handle = await open(file, 'r').catch(() => null)\n if (!handle) return null\n try {\n const buffer = Buffer.alloc(FRONTMATTER_BYTES)\n const { bytesRead } = await handle.read(buffer, 0, FRONTMATTER_BYTES, 0)\n return buffer.subarray(0, bytesRead).toString('utf8')\n } catch {\n return null\n } finally {\n await handle.close().catch(() => {})\n }\n}\n\nfunction parseFrontmatter(text: string): { fields: Record<string, string>; body: string } {\n const lines = text.split('\\n')\n const fields: Record<string, string> = {}\n let bodyStart = 0\n if (lines[0]?.trim() === '---') {\n let i = 1\n for (; i < lines.length && lines[i].trim() !== '---'; i++) {\n const colon = lines[i].indexOf(':')\n if (colon <= 0) continue\n const key = lines[i].slice(0, colon).trim()\n if (key === 'name' || key === 'description') fields[key] = lines[i].slice(colon + 1).trim()\n }\n bodyStart = Math.min(i + 1, lines.length)\n }\n return { fields, body: lines.slice(bodyStart).join('\\n').trim() }\n}\n","import { execFileSync } from 'node:child_process'\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { chmod, mkdir } from 'node:fs/promises'\nimport path from 'node:path'\nimport { ensureDir, skillsDir } from '../config/paths'\n\nconst TMP_DIR = path.join(skillsDir, '.tmp')\n\nexport interface SkillInstallResult {\n name: string\n dir: string\n source: string\n}\n\nexport async function installSkill(source: string): Promise<SkillInstallResult> {\n await ensureDir(skillsDir)\n\n if (isGitHubUrl(source)) {\n return installFromGitHub(source)\n }\n\n if (isNpmPackage(source)) {\n return installFromNpm(source)\n }\n\n return installFromLocal(source)\n}\n\nfunction isGitHubUrl(input: string): boolean {\n return /^https?:\\/\\/(www\\.)?github\\.com\\/[\\w.-]+\\/[\\w.-]+/.test(input)\n}\n\nfunction isNpmPackage(input: string): boolean {\n if (input.includes('/') || input.includes('\\\\') || input.startsWith('.')) return false\n return /^(@[\\w.-]+\\/)?[\\w.-]+(@[\\w.*+-]+)?$/.test(input)\n}\n\nasync function installFromGitHub(url: string): Promise<SkillInstallResult> {\n const { owner, repo, subdir, branch } = parseGitHubUrl(url)\n const name = subdir || repo\n const skillDir = path.join(skillsDir, name)\n const tmpDir = path.join(TMP_DIR, `${name}-${Date.now()}`)\n\n try {\n rmSync(skillDir, { recursive: true, force: true })\n mkdirSync(tmpDir, { recursive: true })\n\n const cloneUrl = `https://github.com/${owner}/${repo}.git`\n const gitArgs = ['clone', '--depth', '1']\n if (branch) gitArgs.push('--branch', branch)\n gitArgs.push(cloneUrl, tmpDir)\n\n execFileSync('git', gitArgs, { stdio: 'ignore' })\n\n const skillFile = subdir ? path.join(tmpDir, subdir, 'SKILL.md') : path.join(tmpDir, 'SKILL.md')\n if (!existsSync(skillFile)) {\n throw new Error(`No SKILL.md found in \"${subdir || repo}\"`)\n }\n\n const body = readFileSync(skillFile, 'utf8')\n await writeSkillFile(skillDir, body)\n\n return { name, dir: skillDir, source: url }\n } finally {\n rmSync(tmpDir, { recursive: true, force: true })\n }\n}\n\nasync function installFromNpm(packageName: string): Promise<SkillInstallResult> {\n const name = packageName.replace(/^@/, '').replace(/\\/[^/]*$/, '').replace(/@[^@]*$/, '')\n const skillDir = path.join(skillsDir, name)\n const tmpDir = path.join(TMP_DIR, `${name}-${Date.now()}`)\n\n try {\n mkdirSync(tmpDir, { recursive: true })\n\n \n execFileSync('npm', ['pack', packageName, '--prefix', tmpDir], {\n stdio: 'ignore',\n })\n\n const files = readdirSync(tmpDir)\n const tarball = files.find((f) => f.endsWith('.tgz'))\n if (!tarball) {\n throw new Error(`Could not download npm package \"${packageName}\"`)\n }\n\n const tarballPath = path.join(tmpDir, tarball)\n const extractDir = path.join(tmpDir, 'extracted')\n mkdirSync(extractDir, { recursive: true })\n\n try {\n execFileSync('tar', ['-xzf', tarballPath, '-C', extractDir], { stdio: 'ignore' })\n } catch {\n \n const packageDir = path.join(tmpDir, 'node_modules', packageName)\n if (existsSync(packageDir)) {\n const skillFile = path.join(packageDir, 'SKILL.md')\n if (existsSync(skillFile)) {\n const body = readFileSync(skillFile, 'utf8')\n await writeSkillFile(skillDir, body)\n return { name, dir: skillDir, source: packageName }\n }\n }\n throw new Error('Could not extract the npm package. Is `tar` available?')\n }\n\n \n const extractedFiles = readdirSync(extractDir)\n const packageRoot = extractedFiles.find((f) => f === 'package')\n if (!packageRoot) throw new Error('Could not find package root in extracted files')\n\n const skillFile = path.join(extractDir, 'package', 'SKILL.md')\n if (!existsSync(skillFile)) {\n throw new Error(`No SKILL.md found in npm package \"${packageName}\"`)\n }\n\n const body = readFileSync(skillFile, 'utf8')\n await writeSkillFile(skillDir, body)\n\n return { name, dir: skillDir, source: packageName }\n } finally {\n rmSync(tmpDir, { recursive: true, force: true })\n }\n}\n\nasync function installFromLocal(srcPath: string): Promise<SkillInstallResult> {\n const resolved = path.resolve(srcPath)\n\n let skillDir: string\n let skillFile: string\n\n const directSkill = path.join(resolved, 'SKILL.md')\n if (existsSync(directSkill)) {\n skillDir = resolved\n skillFile = directSkill\n } else if (resolved.endsWith('SKILL.md') && existsSync(resolved)) {\n skillDir = path.dirname(resolved)\n skillFile = resolved\n } else {\n throw new Error(`No SKILL.md found at \"${srcPath}\"`)\n }\n\n const name = path.basename(skillDir)\n const destDir = path.join(skillsDir, name)\n const body = readFileSync(skillFile, 'utf8')\n\n await writeSkillFile(destDir, body)\n\n return { name, dir: destDir, source: resolved }\n}\n\nasync function writeSkillFile(dir: string, body: string): Promise<void> {\n await mkdir(dir, { recursive: true, mode: 0o700 })\n const file = path.join(dir, 'SKILL.md')\n writeFileSync(file, body)\n await chmod(file, 0o600)\n}\n\nfunction parseGitHubUrl(url: string): { owner: string; repo: string; subdir?: string; branch?: string } {\n \n \n \n const match = url.match(\n /^https?:\\/\\/(?:www\\.)?github\\.com\\/([^/]+)\\/([^/]+)(?:\\/tree\\/([^/]+)(?:\\/(.+)))?/,\n )\n if (!match) {\n const simple = url.match(/^https?:\\/\\/(?:www\\.)?github\\.com\\/([^/]+)\\/([^/]+)/)\n if (simple) {\n return { owner: simple[1], repo: simple[2] }\n }\n throw new Error(`Cannot parse GitHub URL: ${url}`)\n }\n return { owner: match[1], repo: match[2], branch: match[3], subdir: match[4] }\n}\n","import type { SkillMeta } from '../skills/library'\nimport { loadSkill } from '../skills/library'\nimport { brief } from './summary'\nimport type { Tool } from './types'\n\nconst MAX_BODY_CHARS = 64_000\n\ninterface SkillInput {\n name: string\n}\n\nexport function createSkillTool(skills: SkillMeta[]): Tool {\n const byName = new Map(skills.map((skill) => [skill.name, skill]))\n\n return {\n name: 'skill',\n description:\n 'Load the full instructions for one of the skills listed in the system prompt, then follow them. Call this before starting a task that a skill covers.',\n inputSchema: {\n type: 'object',\n properties: { name: { type: 'string', description: 'Name of the skill to load' } },\n required: ['name'],\n additionalProperties: false,\n },\n defaultPermission: 'allow',\n summarize(input) {\n return `skill(${brief((input as SkillInput).name)})`\n },\n async execute(input) {\n const name = String((input as SkillInput).name ?? '').trim()\n const meta = byName.get(name)\n if (!meta) return { content: unknownSkill(name, [...byName.keys()]), isError: true }\n\n let body: string\n try {\n body = (await loadSkill(meta)).body\n } catch (error) {\n return { content: `Could not read skill ${name} from ${meta.file}: ${error}`, isError: true }\n }\n\n const content =\n body.length > MAX_BODY_CHARS\n ? `${body.slice(0, MAX_BODY_CHARS)}\\n\\n... truncated: skill ${name} is ${body.length} characters, only the first ${MAX_BODY_CHARS} are shown. Read ${meta.file} directly for the rest.`\n : body\n return { content, display: { kind: 'text', text: `skill ${name}` } }\n },\n }\n}\n\nfunction unknownSkill(name: string, available: string[]): string {\n if (available.length === 0) return `No skills are installed, so \"${name}\" cannot be loaded.`\n return `No skill named \"${name}\". Available skills: ${available.join(', ')}.`\n}\n","import { randomBytes } from 'node:crypto'\nimport { TASK_TOOL_NAME } from '../core/subagent'\nimport type { SubagentRunner } from '../core/subagent'\nimport { brief } from './summary'\nimport type { Tool, ToolResult } from './types'\n\nconst MAX_PROGRESS_LINES = 10\n\nexport const MAX_SUBAGENTS_PER_TURN = 3\n\nconst DESCRIPTION = [\n 'Hand one self-contained sub-task to a subagent that works in its own fresh context and reports back a single summary.',\n 'Use it when the task is genuinely independent and its intermediate output would be long or noisy: a wide search across the repository, reading many files to answer one question, tracing where something is used.',\n 'Do not use it for work that is a couple of tool calls, and do not use it when you already have what you need — call the tools yourself instead.',\n 'The subagent shares this filesystem and working directory but has NO memory of this conversation and cannot ask you anything, so \"prompt\" must stand alone: the goal, the constraints, and exactly what to report back.',\n 'It runs to completion and you receive only its final message.',\n].join(' ')\n\nexport function createTaskTool(runner: SubagentRunner, maxSubagents = MAX_SUBAGENTS_PER_TURN): Tool {\n const spawnsPerTurn = new WeakMap<AbortSignal, number>()\n\n return {\n name: TASK_TOOL_NAME,\n description: DESCRIPTION,\n inputSchema: {\n type: 'object',\n properties: {\n description: { type: 'string', description: '3-6 word label for this task' },\n prompt: { type: 'string', description: 'Self-contained instruction for the subagent' },\n },\n required: ['description', 'prompt'],\n additionalProperties: false,\n },\n defaultPermission: 'ask',\n summarize(input) {\n return `task(${brief(field(input, 'description'))})`\n },\n async execute(input, ctx): Promise<ToolResult> {\n const instruction = field(input, 'prompt').trim()\n if (instruction === '') {\n return { content: 'task needs a prompt: the full instruction for the subagent.', isError: true }\n }\n\n const spawned = (spawnsPerTurn.get(ctx.signal) ?? 0) + 1\n spawnsPerTurn.set(ctx.signal, spawned)\n if (spawned > maxSubagents) {\n return {\n content: `Already delegated ${maxSubagents} subagents while answering this message, which is the limit. Do the remaining work yourself with the tools you have.`,\n isError: true,\n }\n }\n\n const progress: string[] = []\n const subagentId = `sa${randomBytes(4).toString('hex')}`\n const description = field(input, 'description') || 'subagent'\n ctx.onEvent?.({ type: 'subagent_start', id: subagentId, description })\n try {\n const content = await runner.run({\n prompt: instruction,\n description,\n signal: ctx.signal,\n onProgress: (line) => progress.push(line),\n onEvent: (event) => ctx.onEvent?.({ type: 'subagent_event', id: subagentId, event }),\n confirm: ctx.confirm,\n requestPermission: ctx.requestPermission,\n })\n ctx.onEvent?.({ type: 'subagent_end', id: subagentId, result: content })\n if (progress.length === 0) return { content }\n return {\n content,\n display: {\n kind: 'list',\n title: `task ${brief(field(input, 'description'), 40)}`,\n items: progress.slice(-MAX_PROGRESS_LINES),\n },\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error)\n ctx.onEvent?.({ type: 'subagent_end', id: subagentId, result: `The subagent failed: ${reason}` })\n return { content: `The subagent failed: ${reason}`, isError: true }\n }\n },\n }\n}\n\nfunction field(input: unknown, key: 'description' | 'prompt'): string {\n const value = (input as Record<string, unknown> | null | undefined)?.[key]\n return typeof value === 'string' ? value : ''\n}\n","import { KITCODE_COMMIT, KITCODE_REPOSITORY, KITCODE_VERSION } from '../version'\n\nconst UPDATE_URL = `https://api.github.com/repos/${KITCODE_REPOSITORY}/commits/main`\nconst TIMEOUT_MS = 4_000\nconst MAX_RESPONSE_BYTES = 128_000\n\nexport type UpdateCheck =\n | { status: 'current'; current: string; latest: string }\n | { status: 'available'; current: string; latest: string; url: string }\n | { status: 'unknown'; reason: string }\n\nexport async function checkForUpdates(\n fetcher: typeof fetch = fetch,\n currentCommit = KITCODE_COMMIT,\n): Promise<UpdateCheck> {\n if (currentCommit === 'development') {\n return { status: 'unknown', reason: 'development build has no embedded commit' }\n }\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS)\n try {\n const response = await fetcher(UPDATE_URL, {\n headers: {\n accept: 'application/vnd.github+json',\n 'user-agent': `KitCode/${KITCODE_VERSION}`,\n 'x-github-api-version': '2022-11-28',\n },\n redirect: 'error',\n signal: controller.signal,\n })\n if (!response.ok) {\n return { status: 'unknown', reason: `GitHub returned ${response.status}` }\n }\n const payload = (await readJsonBounded(response)) as { sha?: unknown; html_url?: unknown } | null\n if (!payload) return { status: 'unknown', reason: 'GitHub response was too large or invalid' }\n if (typeof payload.sha !== 'string' || !/^[0-9a-f]{40}$/i.test(payload.sha)) {\n return { status: 'unknown', reason: 'GitHub response did not contain a commit' }\n }\n const current = currentCommit.toLowerCase()\n const latest = payload.sha.toLowerCase()\n if (latest.startsWith(current) || current.startsWith(latest)) {\n return { status: 'current', current, latest }\n }\n const url =\n typeof payload.html_url === 'string' && payload.html_url.startsWith('https://github.com/')\n ? payload.html_url\n : `https://github.com/${KITCODE_REPOSITORY}/commits/main`\n return { status: 'available', current, latest, url }\n } catch (error) {\n return {\n status: 'unknown',\n reason:\n error instanceof Error && error.name === 'AbortError'\n ? 'GitHub check timed out'\n : 'GitHub check failed',\n }\n } finally {\n clearTimeout(timer)\n }\n}\n\nasync function readJsonBounded(response: Response): Promise<unknown | null> {\n const declared = Number(response.headers.get('content-length'))\n if (Number.isFinite(declared) && declared > MAX_RESPONSE_BYTES) return null\n if (!response.body) return null\n const reader = response.body.getReader()\n const chunks: Uint8Array[] = []\n let bytes = 0\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n bytes += value.byteLength\n if (bytes > MAX_RESPONSE_BYTES) {\n await reader.cancel()\n return null\n }\n chunks.push(value)\n }\n } finally {\n reader.releaseLock()\n }\n const combined = new Uint8Array(bytes)\n let offset = 0\n for (const chunk of chunks) {\n combined.set(chunk, offset)\n offset += chunk.byteLength\n }\n try {\n return JSON.parse(new TextDecoder().decode(combined))\n } catch {\n return null\n }\n}\n","import { authPath, projectConfigPath } from '../config/paths'\nimport {\n configLocation,\n initProjectConfig,\n loadProjectConfig,\n loadRuntimeConfig,\n saveConfig,\n} from '../config/store'\nimport { trustWorkspace } from '../config/trust'\n\nexport async function showConfig(options: { local?: boolean } = {}): Promise<void> {\n const cwd = process.cwd()\n\n if (options.local) {\n const current = (await loadRuntimeConfig(cwd)).config\n await initProjectConfig(cwd)\n await trustWorkspace(cwd)\n await loadProjectConfig(cwd)\n await saveConfig(current)\n console.log(`moved config to ${projectConfigPath(cwd)}`)\n }\n\n if (!options.local) await loadRuntimeConfig(cwd)\n\n const location = await configLocation()\n console.log(`config: ${location.path} (${location.scope})`)\n console.log(`keys: ${authPath} (never written into a project)`)\n}\n","import { emitKeypressEvents } from 'node:readline'\n\nconst MAX_KEY_CHARS = 16_384\n\nexport async function readApiKey(options: {\n keyEnv?: string\n keyStdin?: boolean\n}): Promise<string> {\n if (options.keyEnv && options.keyStdin) {\n throw new Error('Use either --key-env or --key-stdin, not both.')\n }\n\n if (options.keyEnv) {\n const key = process.env[options.keyEnv]?.trim()\n if (!key) throw new Error(`Environment variable ${options.keyEnv} is empty or unset.`)\n return validateKey(key)\n }\n\n if (options.keyStdin) {\n const key = (await readStdin()).trim()\n if (!key) throw new Error('No API key was received on stdin.')\n return validateKey(key)\n }\n\n return promptSecret('API key: ')\n}\n\nasync function readStdin(): Promise<string> {\n process.stdin.setEncoding('utf8')\n let value = ''\n for await (const chunk of process.stdin) {\n value += chunk\n if (value.length > MAX_KEY_CHARS) throw new Error('API key input is unexpectedly large.')\n }\n return value\n}\n\nfunction promptSecret(prompt: string): Promise<string> {\n const input = process.stdin\n const output = process.stderr\n if (!input.isTTY || typeof input.setRawMode !== 'function') {\n throw new Error('No interactive terminal. Pass the key through --key-env or --key-stdin.')\n }\n\n emitKeypressEvents(input)\n const wasRaw = input.isRaw\n const wasPaused = input.isPaused()\n output.write(prompt)\n input.setRawMode(true)\n input.resume()\n\n return new Promise<string>((resolve, reject) => {\n let value = ''\n const finish = (error?: Error) => {\n input.off('keypress', onKeypress)\n input.setRawMode(wasRaw)\n if (wasPaused) input.pause()\n output.write('\\n')\n if (error) reject(error)\n else if (value.trim() === '') reject(new Error('API key cannot be empty.'))\n else {\n try {\n resolve(validateKey(value.trim()))\n } catch (validationError) {\n reject(validationError as Error)\n }\n }\n }\n const onKeypress = (\n character: string,\n key: { name?: string; ctrl?: boolean; meta?: boolean },\n ) => {\n if (key.ctrl && key.name === 'c') return finish(new Error('Cancelled.'))\n if (key.name === 'return' || key.name === 'enter') return finish()\n if (key.name === 'backspace' || key.name === 'delete') {\n value = value.slice(0, -1)\n return\n }\n if (character && !key.ctrl && !key.meta && value.length < MAX_KEY_CHARS) value += character\n }\n input.on('keypress', onKeypress)\n })\n}\n\nfunction validateKey(value: string): string {\n if (value.length > MAX_KEY_CHARS) throw new Error('API key input is unexpectedly large.')\n if (/\\r|\\n/.test(value)) throw new Error('API key must be a single line.')\n return value\n}\n","import { render } from 'ink'\nimport { App } from '../ui/App'\nimport type { AgentMode } from '../tools/permissions'\nimport { boot } from './runtime'\n\nfunction clearTerminal(): void {\n if (process.stdout.isTTY) process.stdout.write('\\x1b[2J\\x1b[3J\\x1b[H')\n}\n\nexport async function startTui(options: {\n continueSession?: boolean\n resumeId?: string\n cwd?: string\n modelRef?: string\n mode?: AgentMode\n}): Promise<void> {\n const { runtime, history, warnings, shutdown } = await boot({\n cwd: options.cwd ?? process.cwd(),\n continueSession: options.continueSession,\n resumeId: options.resumeId,\n modelRef: options.modelRef,\n mode: options.mode,\n })\n\n clearTerminal()\n\n const instance = render(<App runtime={runtime} initialHistory={history} warnings={warnings} />, {\n \n \n \n incrementalRendering: true,\n maxFps: 30,\n })\n try {\n await instance.waitUntilExit()\n } finally {\n await shutdown()\n }\n}\n","import { Box, useApp } from 'ink'\nimport { execFile, execFileSync } from 'node:child_process'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { AgentEvent, AgentHooks, PermissionDecision, PermissionRequest } from '../core/types'\nimport { attachmentLabel, looksLikeAttachmentPath } from '../core/attachments'\nimport { parseMcpAddArgs } from '../mcp/add'\nimport type { McpAddError } from '../mcp/add'\nimport type { McpServerState } from '../mcp/client'\nimport type { ContentBlock, Effort, Message } from '../providers/types'\nimport { COMMANDS, closestCommand } from './commands'\nimport { Confirm } from './components/Confirm'\nimport { LanguagePicker } from './components/LanguagePicker'\nimport { Onboarding } from './components/Onboarding'\nimport { PermissionPrompt } from './components/PermissionPrompt'\nimport { Picker } from './components/Picker'\nimport { PromptInput } from './components/PromptInput'\nimport { StatusBar } from './components/StatusBar'\nimport { Transcript } from './components/Transcript'\nimport { appendInputHistory } from './history'\nimport { LANGS, StringsContext, stringsFor } from './i18n'\nimport type { Lang, Strings } from './i18n'\nimport { useTerminalInput } from './input'\nimport type { Runtime } from './runtime'\nimport { PRESETS, ThemeContext, makeTheme, resolveAccent } from './theme'\nimport { formatDuration } from './time'\nimport { applyEvents, emptyTranscript, fromHistory, pushNotice, pushUser } from './transcript'\nimport type { PickerItem } from './types'\n\nconst EFFORTS: Effort[] = ['low', 'medium', 'high', 'xhigh', 'max']\nconst STREAM_FRAME_MS = 50\nconst MAX_ATTACHMENTS = 8\n\nconst NEEDS_IDLE = new Set<string>([\n 'clear',\n 'resume',\n 'sessions',\n 'logout',\n 'bypass',\n 'undo',\n 'compact',\n 'checker',\n])\n\ntype QueuedItem =\n | { kind: 'command'; line: string }\n | { kind: 'message'; text: string; content: ContentBlock[] }\n\ntype Overlay =\n | { kind: 'none' }\n | { kind: 'permission'; request: PermissionRequest; resolve: (d: PermissionDecision) => void }\n | { kind: 'picker'; title: string; items: PickerItem[]; select: (key: string) => void }\n | {\n kind: 'confirm'\n title: string\n body?: string\n danger?: boolean\n resolve: (yes: boolean) => void\n }\n\nexport function App({\n runtime,\n initialHistory,\n warnings = [],\n}: {\n runtime: Runtime\n initialHistory: Message[]\n warnings?: string[]\n}) {\n const { exit } = useApp()\n const [transcript, setTranscript] = useState(() =>\n warnings.reduce((state, text) => pushNotice(state, 'warn', text), fromHistory(initialHistory)),\n )\n const [transcriptRevision, setTranscriptRevision] = useState(0)\n const [input, setInput] = useState('')\n const [promptHistory, setPromptHistory] = useState(() =>\n inputHistoryFromMessages(initialHistory),\n )\n const [busy, setBusy] = useState(false)\n const [pendingCount, setPendingCount] = useState(0)\n const queueRef = useRef<QueuedItem[]>([])\n const [attachments, setAttachments] = useState<ContentBlock[]>([])\n const attachmentsRef = useRef<ContentBlock[]>([])\n const automaticAttachmentTask = useRef<Promise<boolean> | null>(null)\n const clipboardPasteTask = useRef<Promise<void> | null>(null)\n const [overlay, setOverlay] = useState<Overlay>({ kind: 'none' })\n const [accent, setAccent] = useState(runtime.getAccent())\n const [lang, setLang] = useState<Lang | undefined>(runtime.getLang())\n const [setup, setSetup] = useState(runtime.needsSetup())\n const [, forceRender] = useState(0)\n const history = useRef<Message[]>(initialHistory)\n const abort = useRef<AbortController | null>(null)\n const sessionStart = useRef(Date.now())\n const turns = useRef(0)\n const [turnStart, setTurnStart] = useState<number | null>(null)\n const [, tick] = useState(0)\n const [context, setContext] = useState(() => runtime.modelContext())\n const transcriptEvents = useRef<AgentEvent[]>([])\n const transcriptTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const replaceAttachments = useCallback((next: ContentBlock[]) => {\n attachmentsRef.current = next\n setAttachments(next)\n }, [])\n\n const appendAttachment = useCallback((block: ContentBlock): boolean => {\n if (attachmentsRef.current.length >= MAX_ATTACHMENTS) return false\n const next = [...attachmentsRef.current, block]\n attachmentsRef.current = next\n setAttachments(next)\n return true\n }, [])\n\n const flushTranscriptEvents = useCallback(() => {\n if (transcriptTimer.current !== null) {\n clearTimeout(transcriptTimer.current)\n transcriptTimer.current = null\n }\n const events = transcriptEvents.current\n if (events.length === 0) return\n transcriptEvents.current = []\n setTranscript((state) => applyEvents(state, events))\n }, [])\n\n const queueTranscriptEvent = useCallback(\n (event: AgentEvent) => {\n transcriptEvents.current.push(event)\n if (event.type !== 'text_delta' && event.type !== 'thinking_delta') {\n flushTranscriptEvents()\n return\n }\n transcriptTimer.current ??= setTimeout(flushTranscriptEvents, STREAM_FRAME_MS)\n },\n [flushTranscriptEvents],\n )\n\n useEffect(\n () => () => {\n if (transcriptTimer.current !== null) clearTimeout(transcriptTimer.current)\n transcriptEvents.current = []\n },\n [],\n )\n\n useEffect(\n () => runtime.subscribeContext(() => setContext(runtime.modelContext())),\n [runtime],\n )\n\n useEffect(() => {\n if (turnStart === null) return\n const timer = setInterval(() => tick((n) => n + 1), 1000)\n return () => clearInterval(timer)\n }, [turnStart])\n\n \n \n \n \n \n \n \n useEffect(() => {\n if (process.platform === 'darwin') return\n let last = ''\n let cancelling = false\n let giveUp = false\n let polling = false\n let interval: ReturnType<typeof setInterval> | null = null\n const poll = () => {\n if (cancelling || giveUp || polling) return\n polling = true\n execFile(\n 'xclip',\n ['-o', '-selection', 'primary'],\n { encoding: 'utf8' },\n (error, stdout) => {\n polling = false\n if (cancelling) return\n if (error) {\n \n giveUp = true\n if (interval) clearInterval(interval)\n return\n }\n const sel = stdout.trim()\n if (sel && sel !== last) {\n last = sel\n copyToClipboard(sel)\n }\n },\n )\n }\n poll()\n interval = setInterval(poll, 750)\n return () => {\n cancelling = true\n if (interval) clearInterval(interval)\n }\n }, [])\n\n const theme = useMemo(() => makeTheme(accent), [accent])\n const strings = useMemo(() => stringsFor(lang), [lang])\n\n const notice = useCallback(\n (level: 'info' | 'warn' | 'error', text: string) => {\n flushTranscriptEvents()\n setTranscript((state) => pushNotice(state, level, text))\n },\n [flushTranscriptEvents],\n )\n\n useEffect(() => {\n const check = runtime.startupUpdateCheck()\n if (!check) return\n let active = true\n void check.then((result) => {\n if (active && result.status === 'available') {\n notice('info', strings.updateAvailable(result.latest.slice(0, 12), result.url))\n }\n })\n return () => {\n active = false\n }\n }, [notice, runtime, strings])\n\n const ask = useCallback(\n (title: string, body?: string, danger?: boolean) =>\n new Promise<boolean>((resolve) => {\n setOverlay({ kind: 'confirm', title, body, danger, resolve })\n }),\n [],\n )\n\n const pick = useCallback(\n (title: string, items: PickerItem[]) =>\n new Promise<string | null>((resolve) => {\n if (items.length === 0) {\n resolve(null)\n return\n }\n setOverlay({ kind: 'picker', title, items, select: resolve })\n }),\n [],\n )\n\n const runAgent = useCallback(async () => {\n const controller = new AbortController()\n abort.current = controller\n setBusy(true)\n setTurnStart(Date.now())\n turns.current += 1\n const hooks: AgentHooks = {\n onEvent: queueTranscriptEvent,\n requestPermission: (request) =>\n new Promise<PermissionDecision>((resolve) => {\n let settled = false\n const finish = (decision: PermissionDecision) => {\n if (settled) return\n settled = true\n controller.signal.removeEventListener('abort', cancel)\n resolve(decision)\n }\n const cancel = () => {\n setOverlay((current) =>\n current.kind === 'permission' && current.resolve === finish\n ? { kind: 'none' }\n : current,\n )\n finish('deny')\n }\n if (controller.signal.aborted) {\n finish('deny')\n return\n }\n controller.signal.addEventListener('abort', cancel, { once: true })\n setOverlay({ kind: 'permission', request, resolve: finish })\n }),\n }\n try {\n history.current = await runtime.run(history.current, hooks, controller.signal)\n void runtime\n .persist(history.current)\n .catch((error) => notice('error', error instanceof Error ? error.message : String(error)))\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n } finally {\n flushTranscriptEvents()\n abort.current = null\n setBusy(false)\n setTurnStart(null)\n \n const queue = queueRef.current\n if (queue.length > 0) {\n const [next, ...rest] = queue\n queueRef.current = rest\n setPendingCount(rest.length)\n queueMicrotask(() => enqueueNext(next))\n } else {\n setPendingCount(0)\n }\n }\n }, [flushTranscriptEvents, notice, queueTranscriptEvent, runtime])\n\n const applyAccent = useCallback(\n async (value: string) => {\n await runtime.setAccent(value)\n setAccent(value)\n notice('info', strings.accentSet(value, resolveAccent(value)))\n },\n [notice, runtime, strings],\n )\n\n const handleSlash = useCallback(\n async (line: string) => {\n const body = line.slice(1).trim()\n const firstSpace = body.search(/\\s/)\n const command = (firstSpace === -1 ? body : body.slice(0, firstSpace)).toLowerCase()\n const rawRest = firstSpace === -1 ? '' : body.slice(firstSpace).trim()\n const rest = rawRest ? rawRest.split(/\\s+/) : []\n setInput('')\n\n switch (command) {\n case 'help':\n notice(\n 'info',\n COMMANDS.map(\n (c) => `/${c.name}${c.args ? ` ${c.args}` : ''} — ${strings.cmd[c.name] ?? ''}`,\n )\n .concat(strings.escHelp)\n .join('\\n'),\n )\n return\n\n case 'exit':\n case 'quit':\n exit()\n return\n\n case 'clear':\n await runtime.newSession()\n history.current = []\n replaceAttachments([])\n setPromptHistory([])\n setTranscript(emptyTranscript())\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n void runtime\n .persist([])\n .catch((error) =>\n notice('error', error instanceof Error ? error.message : String(error)),\n )\n return\n\n case 'resume': {\n const items = await runtime.listSessionItems()\n if (items.length === 0) {\n notice('info', strings.sessionsEmpty)\n return\n }\n const choice = await pick(strings.titleSessions, items)\n if (!choice) return\n try {\n const restored = await runtime.resumeSession(choice)\n history.current = restored\n setPromptHistory(inputHistoryFromMessages(restored))\n setTranscript(\n pushNotice(\n fromHistory(restored),\n 'info',\n strings.resumed(choice.slice(-6), restored.length),\n ),\n )\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n forceRender((n) => n + 1)\n return\n }\n\n case 'sessions': {\n const items = await runtime.listSessionItems()\n if (items.length === 0) {\n notice('info', strings.sessionsEmpty)\n return\n }\n\n let action: string | undefined = rest[0]?.toLowerCase()\n if (action === 'list') {\n notice(\n 'info',\n items.map((item) => `${item.label}${item.hint ? ` — ${item.hint}` : ''}`).join('\\n'),\n )\n return\n }\n\n if (action === 'delete' && rest.length === 2 && rest[1]?.toLowerCase() === 'all') {\n if (!(await ask(strings.sessionDeleteAllAsk, strings.sessionDeleteAllAskBody, true))) {\n return\n }\n if (\n !(await ask(\n strings.sessionDeleteAllFinalAsk,\n strings.sessionDeleteAllFinalBody,\n true,\n ))\n ) {\n return\n }\n try {\n const result = await runtime.deleteAllSessions()\n history.current = []\n replaceAttachments([])\n setPromptHistory([])\n const message =\n result.failed.length === 0\n ? strings.sessionsDeletedAll(result.deleted)\n : [\n strings.sessionsDeleteAllFailed(result.deleted, result.failed.length),\n ...result.failed.slice(0, 5).map((failure) => `${failure.id}: ${failure.error}`),\n ].join('\\n')\n setTranscript(\n pushNotice(\n emptyTranscript(),\n result.failed.length === 0 ? 'info' : 'error',\n message,\n ),\n )\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n forceRender((n) => n + 1)\n return\n }\n\n let id = action ? rest[1] : undefined\n if (!id) id = (await pick(strings.titleSessions, items)) ?? undefined\n if (!id) return\n const matches = items.filter((item) => item.key === id || item.key.includes(id as string))\n if (matches.length !== 1) {\n notice('warn', `No saved session matches \"${id}\".`)\n return\n }\n id = matches[0]?.key ?? id\n\n if (!action) {\n action =\n (await pick(strings.titleSessionAction, [\n { key: 'resume', label: strings.sessionActionResume },\n { key: 'rename', label: strings.sessionActionRename },\n { key: 'delete', label: strings.sessionActionDelete },\n { key: 'export', label: strings.sessionActionExport },\n ])) ?? undefined\n }\n if (!action) return\n\n try {\n if (action === 'resume') {\n const restored = await runtime.resumeSession(id)\n history.current = restored\n replaceAttachments([])\n setPromptHistory(inputHistoryFromMessages(restored))\n setTranscript(\n pushNotice(fromHistory(restored), 'info', strings.resumed(id.slice(-6), restored.length)),\n )\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n } else if (action === 'rename') {\n const title = rest.slice(2).join(' ').trim()\n if (!title) {\n setInput(`/sessions rename ${id} `)\n notice('info', strings.sessionRenameUsage)\n return\n }\n notice('info', strings.sessionRenamed(await runtime.renameSession(id, title)))\n } else if (action === 'delete') {\n if (!(await ask(`${strings.sessionActionDelete}: ${id.slice(-6)}?`, strings.sessionDeleteAsk, true))) {\n return\n }\n const result = await runtime.deleteSession(id)\n const deletedMessage = strings.sessionDeleted(result.id.slice(-6))\n if (result.wasActive) {\n history.current = []\n replaceAttachments([])\n setPromptHistory([])\n setTranscript(pushNotice(emptyTranscript(), 'info', deletedMessage))\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n void runtime.persist([]).catch((error) =>\n notice('error', error instanceof Error ? error.message : String(error)),\n )\n } else {\n notice('info', deletedMessage)\n }\n } else if (action === 'export') {\n const destination = unquoteArg(rest.slice(2).join(' ').trim()) || undefined\n notice('info', strings.sessionExported(await runtime.exportSession(id, destination)))\n } else {\n notice('warn', 'Usage: /sessions [list|rename|delete [all]|export]')\n return\n }\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n forceRender((n) => n + 1)\n return\n }\n\n case 'undo': {\n try {\n const result = await runtime.undoLastCheckpoint()\n if (!result.found) {\n notice('info', strings.undoNothing)\n return\n }\n const lines = [strings.undoResult(result.restored.length, result.removed.length)]\n if (result.conflicts.length > 0) {\n lines.push(strings.undoConflicts(result.conflicts))\n }\n if (result.failed.length > 0) {\n lines.push(\n strings.undoFailed(\n result.failed.map((failure) => `${failure.path}: ${failure.error}`),\n ),\n )\n }\n notice(\n result.conflicts.length > 0 || result.failed.length > 0 ? 'warn' : 'info',\n lines.join('\\n'),\n )\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n\n case 'config':\n notice('info', strings.configAt(runtime.configPath()))\n return\n\n case 'login':\n setSetup(true)\n return\n\n case 'logout': {\n const providers = runtime.listProviderItems()\n if (providers.length === 0) {\n notice('warn', strings.logoutNothing)\n return\n }\n let providerId: string | undefined = rest[0]\n if (!providerId) {\n providerId =\n providers.length === 1\n ? providers[0]?.key\n : ((await pick(strings.titleLogout, providers)) ?? undefined)\n }\n if (!providerId) return\n if (!providers.some((provider) => provider.key === providerId)) {\n notice('warn', `Provider \"${providerId}\" is not configured.`)\n return\n }\n if (!(await ask(strings.logoutAsk(providerId), strings.logoutAskBody, true))) return\n try {\n const result = await runtime.logout(providerId)\n const message = `${strings.loggedOut(result.removed)}${result.nextModel ? `\\n${strings.modelSet(result.nextModel)}` : ''}`\n if (result.wasActive) {\n await runtime.newSession()\n history.current = []\n replaceAttachments([])\n setPromptHistory([])\n setTranscript(pushNotice(emptyTranscript(), 'info', message))\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n void runtime.persist([]).catch((error) =>\n notice('error', error instanceof Error ? error.message : String(error)),\n )\n } else {\n notice('info', message)\n }\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n setSetup(runtime.needsSetup())\n forceRender((n) => n + 1)\n return\n }\n\n case 'lang': {\n const choice = await pick(\n strings.titleLang,\n LANGS.map((entry) => ({ key: entry.key, label: entry.label })),\n )\n if (!choice) return\n await runtime.setLang(choice as Lang)\n setLang(choice as Lang)\n return\n }\n\n case 'skills': {\n const action = rest[0]?.toLowerCase()\n\n if (action === 'install') {\n const source = rest.slice(1).join(' ').trim()\n if (!source) {\n notice('warn', strings.skillsInstallUsage)\n return\n }\n notice('info', strings.skillsInstalling(source))\n try {\n const result = await runtime.installSkill(source)\n notice('info', strings.skillsInstalled(result.name, result.source))\n \n forceRender((n) => n + 1)\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n\n const skills = runtime.listSkills()\n if (skills.length === 0) {\n notice('info', strings.skillsEmpty)\n return\n }\n const items: PickerItem[] = skills.map((skill) => ({\n key: skill.name,\n label: skill.name,\n hint: skill.description || undefined,\n }))\n const choice = await pick(strings.titleSkills, items)\n if (!choice) return\n try {\n const body = await runtime.loadSkill(choice)\n \n setTranscript((state) => pushUser(state, `skill: ${choice}\\n${body}`))\n history.current = [...history.current, { role: 'user', content: [{ type: 'text', text: body }] }]\n void runAgent()\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n\n case 'usage': {\n const balance = await runtime.providerBalance()\n const providerBalances = balance?.filter((item) => item.kind === 'balance') ?? []\n const keyLimits = balance?.filter((item) => item.kind === 'key-limit') ?? []\n const balanceLines = [\n providerBalances.length > 0\n ? strings.providerBalance(formatBalances(providerBalances))\n : null,\n keyLimits.length > 0\n ? strings.providerKeyRemaining(formatBalances(keyLimits))\n : null,\n ]\n notice(\n 'info',\n [\n runtime.usageReport(),\n runtime.rateLimitsReport(),\n ...balanceLines,\n strings.sessionSummary(\n formatDuration(Date.now() - sessionStart.current),\n turns.current,\n ),\n ]\n .filter((line): line is string => line !== null)\n .join('\\n'),\n )\n return\n }\n\n case 'provider': {\n const items = runtime.listProviderItems()\n if (items.length === 0) {\n notice('warn', strings.providersEmpty)\n return\n }\n const choice = await pick(strings.titleProvider, items)\n if (!choice) return\n try {\n const ref = await runtime.useProvider(choice)\n notice('info', strings.providerSet(choice, ref))\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n forceRender((n) => n + 1)\n return\n }\n\n case 'mcp': {\n const action = rest[0]?.toLowerCase()\n if (action === 'add') {\n const parsed = parseMcpAddArgs(rest.slice(1))\n if (!parsed.ok) {\n const problem = mcpAddProblem(strings, parsed.error)\n notice(\n 'warn',\n parsed.error === 'usage' ? problem : `${problem}\\n${strings.mcpAddUsage}`,\n )\n return\n }\n if (runtime.mcpServers().some((state) => state.name === parsed.name)) {\n notice('warn', strings.mcpExists(parsed.name))\n return\n }\n\n notice('info', strings.mcpConnecting(parsed.name))\n try {\n const state = await runtime.addMcpServer(parsed.name, parsed.config)\n notice('info', strings.mcpAdded(state.name, state.toolCount))\n } catch (error) {\n notice(\n 'error',\n strings.mcpAddFailed(\n parsed.name,\n error instanceof Error ? error.message : String(error),\n ),\n )\n }\n forceRender((n) => n + 1)\n return\n }\n\n if (action === 'delete') {\n const states = runtime.mcpServers()\n let name: string | undefined = rest[1]\n if (!name) {\n if (states.length === 0) {\n notice('info', strings.mcpEmpty)\n return\n }\n name =\n (await pick(\n strings.titleMcpDelete,\n states.map((state) => ({\n key: state.name,\n label: state.name,\n hint: `${strings.mcpState[state.status] ?? state.status} · ${strings.mcpTools(state.toolCount)}`,\n })),\n )) ?? undefined\n if (!name) return\n }\n if (!states.some((state) => state.name === name)) {\n notice('warn', strings.mcpNotFound(name))\n return\n }\n\n try {\n await runtime.removeMcpServer(name)\n notice('info', strings.mcpDeleted(name))\n } catch (error) {\n notice(\n 'error',\n strings.mcpDeleteFailed(\n name,\n error instanceof Error ? error.message : String(error),\n ),\n )\n }\n forceRender((n) => n + 1)\n return\n }\n\n if (action === 'enable' || action === 'disable') {\n const states = runtime.mcpServers()\n const enabling = action === 'enable'\n const candidates = states.filter((state) =>\n enabling ? state.status === 'disabled' : state.status !== 'disabled',\n )\n let name: string | undefined = rest[1]\n if (!name) {\n if (candidates.length === 0) {\n notice('info', strings.mcpEmpty)\n return\n }\n name =\n (await pick(\n enabling ? strings.titleMcpEnable : strings.titleMcpDisable,\n candidates.map((state) => ({\n key: state.name,\n label: state.name,\n hint: strings.mcpState[state.status] ?? state.status,\n })),\n )) ?? undefined\n }\n if (!name) return\n if (!states.some((state) => state.name === name)) {\n notice('warn', strings.mcpNotFound(name))\n return\n }\n try {\n const state = await runtime.setMcpEnabled(name, enabling)\n if (enabling && state.status === 'error') {\n notice('error', strings.mcpToggleFailed(name, state.error ?? 'connection failed'))\n } else {\n notice(\n 'info',\n enabling ? strings.mcpEnabled(name, state.toolCount) : strings.mcpDisabled(name),\n )\n }\n } catch (error) {\n notice(\n 'error',\n strings.mcpToggleFailed(\n name,\n error instanceof Error ? error.message : String(error),\n ),\n )\n }\n forceRender((n) => n + 1)\n return\n }\n\n if (action && action !== 'list') {\n notice('warn', strings.mcpAddUsage)\n return\n }\n\n const { connected, failed } = runtime.mcpSummary()\n const states = runtime.mcpServers()\n const lines = states.map((state) => mcpStateLine(strings, state))\n notice(\n failed > 0 ? 'warn' : 'info',\n [\n strings.mcpStatus(connected, failed),\n ...(lines.length > 0 ? lines : [strings.mcpEmpty]),\n strings.mcpAddUsage,\n ].join('\\n'),\n )\n return\n }\n\n case 'attach': {\n if (rawRest.toLowerCase() === 'clear') {\n replaceAttachments([])\n notice('info', strings.attachmentsCleared)\n return\n }\n if (rawRest.toLowerCase() === 'clipboard') {\n if (attachmentsRef.current.length >= MAX_ATTACHMENTS) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return\n }\n if (clipboardPasteTask.current) return\n const task = runtime\n .loadClipboardImage()\n .then((block) => {\n if (appendAttachment(block)) {\n notice(\n 'info',\n strings.attachmentAdded(attachmentLabel(block) ?? 'clipboard image'),\n )\n }\n })\n .catch((error) =>\n notice('error', error instanceof Error ? error.message : String(error)),\n )\n clipboardPasteTask.current = task\n try {\n await task\n } finally {\n if (clipboardPasteTask.current === task) clipboardPasteTask.current = null\n }\n return\n }\n if (!rawRest) {\n notice('info', strings.attachUsage)\n return\n }\n if (attachmentsRef.current.length >= MAX_ATTACHMENTS) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return\n }\n try {\n const block = await runtime.loadAttachment(rawRest)\n if (appendAttachment(block)) {\n notice('info', strings.attachmentAdded(attachmentLabel(block) ?? 'attachment'))\n }\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n\n case 'compact': {\n const controller = new AbortController()\n abort.current = controller\n setBusy(true)\n setTurnStart(Date.now())\n notice('info', strings.compactStarting)\n try {\n const result = await runtime.compact(history.current, controller.signal)\n if (!result.compacted) {\n notice('info', strings.compactNothing)\n } else {\n history.current = result.history\n setPromptHistory(inputHistoryFromMessages(result.history))\n setTranscript(\n pushNotice(fromHistory(result.history), 'info', strings.compactDone(result.removedMessages)),\n )\n setTranscriptRevision((revision) => revision + 1)\n await runtime.persist(result.history)\n }\n } catch (error) {\n if (!controller.signal.aborted) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n } finally {\n abort.current = null\n setBusy(false)\n setTurnStart(null)\n const queue = queueRef.current\n if (queue.length > 0) {\n const [next, ...remaining] = queue\n queueRef.current = remaining\n setPendingCount(remaining.length)\n if (next) queueMicrotask(() => enqueueNext(next))\n } else {\n setPendingCount(0)\n }\n }\n forceRender((n) => n + 1)\n return\n }\n\n case 'subagents': {\n const agents = runtime.activeAgentsList()\n if (agents.length === 0) {\n notice('info', strings.subagentsStatus(0))\n return\n }\n const lines = agents.map((a, i) => {\n const label = a.description || `subagent ${i + 1}`\n const progress = a.progress.length > 0 ? ` · ${a.progress[a.progress.length - 1]}` : ''\n return `${label}${progress}`\n })\n notice('info', lines.join('\\n'))\n return\n }\n\n case 'checker':\n try {\n notice('info', await runtime.checkerReport())\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n\n case 'theme': {\n const requested = rest[0]\n if (requested) {\n await applyAccent(requested)\n return\n }\n const choice = await pick(\n strings.titleAccent,\n Object.entries(PRESETS).map(([name, hex]) => ({ key: name, label: name, hint: hex })),\n )\n if (choice) await applyAccent(choice)\n return\n }\n\n case 'thinking': {\n const next = !runtime.getThinking()\n await runtime.setThinking(next)\n notice('info', strings.reasoning(next))\n forceRender((n) => n + 1)\n return\n }\n\n case 'effort': {\n const choice = await pick(\n strings.titleEffort,\n EFFORTS.map((effort) => ({ key: effort, label: effort })),\n )\n if (!choice) return\n await runtime.setEffort(choice as Effort)\n notice('info', strings.effortSet(choice))\n forceRender((n) => n + 1)\n return\n }\n\n case 'budget': {\n const current = runtime.getMaxTokensPerTurn()\n if (rest[0]) {\n const tokens = Number(rest[0])\n if (tokens === 0) {\n await runtime.setMaxTokensPerTurn(0)\n notice('info', strings.budgetUnlimited)\n forceRender((n) => n + 1)\n } else if (!Number.isInteger(tokens) || tokens < 1_000 || tokens > 10_000_000) {\n notice('warn', strings.budgetInvalid)\n } else {\n await runtime.setMaxTokensPerTurn(tokens)\n notice('info', strings.budgetSet(tokens))\n forceRender((n) => n + 1)\n }\n } else {\n notice('info', current === 0 ? strings.budgetUnlimited : strings.budgetCurrent(current))\n }\n return\n }\n\n case 'model': {\n const items = await runtime.listModelItems()\n if (items.length === 0) {\n notice('warn', strings.noModels)\n return\n }\n const choice = await pick(strings.titleModel, items)\n if (!choice) return\n await runtime.setModelRef(choice)\n notice('info', strings.modelSet(choice))\n forceRender((n) => n + 1)\n return\n }\n\n case 'bypass': {\n if (runtime.isBypassEnabled()) {\n runtime.setBypass(false)\n notice('info', strings.bypassOff)\n forceRender((n) => n + 1)\n return\n }\n if (!(await ask(strings.bypassAsk1, strings.bypassAsk1Body, true))) {\n notice('info', strings.bypassCancelled)\n return\n }\n if (!(await ask(strings.bypassAsk2, strings.bypassAsk2Body, true))) {\n notice('info', strings.bypassCancelled)\n return\n }\n runtime.setBypass(true)\n notice('warn', strings.bypassOn)\n forceRender((n) => n + 1)\n return\n }\n\n case 'prompt': {\n const sub = rest[0]?.toLowerCase()\n\n if (sub === 'save') {\n const name = rest.slice(1).join(' ').trim()\n if (name) {\n \n const body = lastUserText(history.current)\n if (!body) {\n notice('warn', strings.promptNothing)\n return\n }\n await runtime.savePrompt(name, body)\n notice('info', strings.promptSaved(name))\n return\n }\n \n const recent = recentUserMessages(history.current, 20)\n if (recent.length > 0) {\n const items: PickerItem[] = recent.map((text, i) => ({\n key: `__recent_${i}__`,\n label: text.length > 60 ? `${text.slice(0, 60)}…` : text,\n hint: text.length > 60 ? undefined : undefined,\n }))\n items.push({ key: '__custom__', label: '— type a custom prompt —' })\n const choice = await pick(strings.titlePrompts, items)\n if (!choice) return\n if (choice === '__custom__') {\n setInput('/prompt save ')\n return\n }\n const index = parseInt(choice.replace('__recent_', '').replace('__', ''), 10)\n const body = recent[index] ?? ''\n if (!body) {\n notice('warn', strings.promptNothing)\n return\n }\n if (!(await ask(strings.promptSaveAsk, strings.promptSaveAskBody))) return\n \n const defaultName = body.split(/\\s+/).slice(0, 4).join('-').replace(/[^a-z0-9-]/gi, '').toLowerCase()\n const nameInput = `${defaultName || 'prompt'}`\n \n await runtime.savePrompt(nameInput, body)\n notice('info', `${strings.promptSaved(nameInput)}\\nRename the file if you want a different name.`)\n return\n }\n notice('warn', strings.promptNothing)\n return\n }\n\n if (sub === 'delete') {\n const name = rest.slice(1).join(' ').trim()\n if (name) {\n try {\n await runtime.deletePrompt(name)\n notice('info', strings.promptDeleted(name))\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n const items = await runtime.listPromptItems()\n if (items.length === 0) {\n notice('info', strings.promptsEmpty)\n return\n }\n const choice = await pick(strings.titlePrompts, items)\n if (!choice) return\n if (!(await ask(strings.promptDeleteUsage.replace('Usage: ', '').replace('<name>', choice || '') + '?', strings.sessionDeleteAsk, true))) return\n try {\n await runtime.deletePrompt(choice)\n notice('info', strings.promptDeleted(choice))\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n\n \n const items = await runtime.listPromptItems()\n if (items.length === 0) {\n notice('info', strings.promptsEmpty)\n return\n }\n const choice = await pick(strings.titlePrompts, items)\n if (!choice) return\n setInput(await runtime.readPrompt(choice))\n return\n }\n\n default: {\n const guess = closestCommand(command)\n notice(\n 'warn',\n guess ? strings.didYouMean(command, guess.name) : strings.unknownCommand(command),\n )\n }\n }\n },\n [applyAccent, appendAttachment, ask, exit, notice, pick, replaceAttachments, runtime, strings],\n )\n\n const enqueueNext = useCallback(\n (item: QueuedItem) => {\n if (item.kind === 'command') {\n void handleSlash(item.line)\n return\n }\n setTranscript((state) => pushUser(state, userDisplay(item.text, item.content)))\n history.current = [...history.current, { role: 'user', content: item.content }]\n void runAgent()\n },\n [handleSlash, runAgent],\n )\n\n const tryQueueAutomaticAttachment = useCallback(\n (requestedPath: string): Promise<boolean> => {\n if (!looksLikeAttachmentPath(requestedPath)) return Promise.resolve(false)\n if (automaticAttachmentTask.current) {\n return automaticAttachmentTask.current.then(() => false)\n }\n if (attachmentsRef.current.length >= MAX_ATTACHMENTS) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return Promise.resolve(true)\n }\n\n const task = runtime\n .loadAutomaticAttachment(requestedPath)\n .then((block) => {\n if (!block) return false\n if (!appendAttachment(block)) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return true\n }\n notice('info', strings.attachmentAdded(attachmentLabel(block) ?? 'attachment'))\n return true\n })\n .catch((error) => {\n notice('error', error instanceof Error ? error.message : String(error))\n return true\n })\n automaticAttachmentTask.current = task\n void task.finally(() => {\n if (automaticAttachmentTask.current === task) automaticAttachmentTask.current = null\n })\n return task\n },\n [appendAttachment, notice, runtime, strings],\n )\n\n const pasteClipboardImage = useCallback(() => {\n if (clipboardPasteTask.current) return\n if (attachmentsRef.current.length >= MAX_ATTACHMENTS) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return\n }\n const task = runtime\n .loadClipboardImage()\n .then((block) => {\n if (!appendAttachment(block)) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return\n }\n notice('info', strings.attachmentAdded(attachmentLabel(block) ?? 'clipboard image'))\n })\n .catch((error) => notice('error', error instanceof Error ? error.message : String(error)))\n clipboardPasteTask.current = task\n void task.finally(() => {\n if (clipboardPasteTask.current === task) clipboardPasteTask.current = null\n })\n }, [appendAttachment, notice, runtime, strings])\n\n const submit = useCallback(\n async (raw: string) => {\n const pendingAttachments = [automaticAttachmentTask.current, clipboardPasteTask.current].filter(\n (task): task is Promise<boolean> | Promise<void> => task !== null,\n )\n const detachedInput = pendingAttachments.length > 0\n if (detachedInput) {\n \n \n setInput('')\n await Promise.all(pendingAttachments)\n }\n const text = raw.trim()\n const submitSlash = () => {\n \n \n if (!detachedInput) setInput('')\n if (busy && slashNeedsIdle(text)) {\n queueRef.current = [...queueRef.current, { kind: 'command', line: text }]\n setPendingCount(queueRef.current.length)\n return\n }\n void handleSlash(text)\n }\n\n if (isKnownSlashCommand(text)) {\n submitSlash()\n return\n }\n if (text && looksLikeAttachmentPath(text) && (await tryQueueAutomaticAttachment(text))) {\n if (!detachedInput) setInput('')\n return\n }\n if (text.startsWith('/')) {\n submitSlash()\n return\n }\n const queuedAttachments = attachmentsRef.current\n if (!text && queuedAttachments.length === 0) return\n if (text) setPromptHistory((state) => appendInputHistory(state, text))\n if (!detachedInput) setInput('')\n const content: ContentBlock[] = [\n ...(text ? ([{ type: 'text', text }] as ContentBlock[]) : []),\n ...queuedAttachments,\n ]\n replaceAttachments([])\n const item: QueuedItem = { kind: 'message', text, content }\n if (busy) {\n queueRef.current = [...queueRef.current, item]\n setPendingCount(queueRef.current.length)\n return\n }\n setTranscript((state) => pushUser(state, userDisplay(text, content)))\n history.current = [...history.current, { role: 'user', content }]\n void runAgent()\n },\n [busy, handleSlash, replaceAttachments, runAgent, tryQueueAutomaticAttachment],\n )\n\n useTerminalInput((_char, key) => {\n if (key.tab && key.shift) {\n const next = runtime.cycleMode()\n notice('info', strings.modeChanged(strings.modeLabel[next] ?? next))\n forceRender((n) => n + 1)\n return\n }\n if (!key.escape) return\n if (busy && abort.current) {\n abort.current.abort()\n queueRef.current = []\n setPendingCount(0)\n notice('warn', strings.cancelled)\n return\n }\n if (overlay.kind === 'permission') {\n overlay.resolve('deny')\n setOverlay({ kind: 'none' })\n return\n }\n if (overlay.kind === 'confirm') {\n overlay.resolve(false)\n setOverlay({ kind: 'none' })\n return\n }\n if (overlay.kind === 'picker') {\n overlay.select('')\n setOverlay({ kind: 'none' })\n return\n }\n setInput('')\n })\n\n const shell = (children: React.ReactNode) => (\n <ThemeContext.Provider value={theme}>\n <StringsContext.Provider value={strings}>{children}</StringsContext.Provider>\n </ThemeContext.Provider>\n )\n\n if (lang === undefined) {\n return shell(\n <LanguagePicker\n onPick={(chosen) => {\n setLang(chosen)\n void runtime.setLang(chosen)\n }}\n />,\n )\n }\n\n if (setup) {\n return shell(\n <Onboarding\n onSubmit={async (url, key) => {\n const summary = await runtime.addProvider(url, key)\n setSetup(false)\n notice('info', `${summary}\\n${strings.configAt(runtime.configPath())}`)\n return summary\n }}\n />,\n )\n }\n\n return shell(\n <Box flexDirection=\"column\">\n <Transcript\n key={transcriptRevision}\n bubbles={transcript.bubbles}\n workspace={runtime.cwd}\n />\n\n {overlay.kind === 'permission' && (\n <PermissionPrompt\n request={overlay.request}\n onDecide={(decision) => {\n overlay.resolve(decision)\n setOverlay({ kind: 'none' })\n }}\n />\n )}\n\n {overlay.kind === 'picker' && (\n <Picker\n title={overlay.title}\n items={overlay.items}\n onSelect={(key) => {\n overlay.select(key)\n setOverlay({ kind: 'none' })\n }}\n onCancel={() => {\n overlay.select('')\n setOverlay({ kind: 'none' })\n }}\n />\n )}\n\n {overlay.kind === 'confirm' && (\n <Confirm\n title={overlay.title}\n body={overlay.body}\n danger={overlay.danger}\n onAnswer={(yes) => {\n overlay.resolve(yes)\n setOverlay({ kind: 'none' })\n }}\n />\n )}\n\n {overlay.kind === 'none' && (\n <PromptInput\n value={input}\n onChange={setInput}\n onSubmit={submit}\n onPastePath={tryQueueAutomaticAttachment}\n onPasteImage={pasteClipboardImage}\n disabled={busy}\n pending={pendingCount}\n hint={busy ? strings.escCancel : undefined}\n history={promptHistory}\n attachments={attachments.flatMap((block) => {\n const label = attachmentLabel(block)\n return label ? [label] : []\n })}\n />\n )}\n\n <StatusBar\n status={{\n modelRef: runtime.getModelRef() || strings.noModel,\n effort: runtime.getEffort(),\n thinking: runtime.getThinking(),\n usage: runtime.usageParts(),\n mcp: runtime.mcpSummary(),\n mode: runtime.getMode(),\n bypass: runtime.isBypassEnabled(),\n busy,\n sessionMs: Date.now() - sessionStart.current,\n turnMs: turnStart === null ? null : Date.now() - turnStart,\n activeAgents: runtime.activeAgentsCount(),\n context,\n }}\n />\n </Box>,\n )\n}\n\nfunction slashNeedsIdle(line: string): boolean {\n const [command = '', subcommand = ''] = line.slice(1).trim().toLowerCase().split(/\\s+/)\n return (\n NEEDS_IDLE.has(command) ||\n (command === 'mcp' &&\n (subcommand === 'add' ||\n subcommand === 'delete' ||\n subcommand === 'enable' ||\n subcommand === 'disable'))\n )\n}\n\nfunction isKnownSlashCommand(line: string): boolean {\n if (!line.startsWith('/')) return false\n const [name = ''] = line.slice(1).trim().toLowerCase().split(/\\s+/)\n return name === 'quit' || COMMANDS.some((command) => command.name === name)\n}\n\nfunction mcpAddProblem(strings: Strings, error: McpAddError): string {\n switch (error) {\n case 'invalid-name':\n return strings.mcpAddInvalidName\n case 'invalid-url':\n return strings.mcpAddInvalidUrl\n case 'http-args':\n return strings.mcpAddHttpArgs\n case 'usage':\n return strings.mcpAddUsage\n }\n}\n\nfunction mcpStateLine(strings: Strings, state: McpServerState): string {\n const mark = state.status === 'connected' ? '●' : state.status === 'error' ? '✗' : '○'\n const status = strings.mcpState[state.status] ?? state.status\n const tools = state.status === 'connected' ? ` · ${strings.mcpTools(state.toolCount)}` : ''\n const error = state.error ? ` · ${state.error}` : ''\n return `${mark} ${state.name} — ${status}${tools}${error}`\n}\n\nfunction formatBalances(\n balances: Array<{ amount: string; currency: string }>,\n): string {\n return balances.map((item) => `${item.amount} ${item.currency}`).join(' · ')\n}\n\nfunction lastUserText(messages: Message[]): string {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index]\n if (message?.role !== 'user') continue\n const text = userText(message)\n if (text) return text\n }\n return ''\n}\n\nfunction recentUserMessages(messages: Message[], max: number): string[] {\n const results: string[] = []\n for (let index = messages.length - 1; index >= 0 && results.length < max; index -= 1) {\n const message = messages[index]\n if (message?.role !== 'user') continue\n const text = userText(message)\n if (text) results.unshift(text)\n }\n return results\n}\n\nfunction inputHistoryFromMessages(messages: Message[]): string[] {\n return messages.reduce<string[]>((items, message) => {\n if (message.role !== 'user') return items\n return appendInputHistory(items, userText(message))\n }, [])\n}\n\nfunction userText(message: Message): string {\n return message.content\n .filter((block) => block.type === 'text')\n .map((block) => (block.type === 'text' ? block.text : ''))\n .join('\\n')\n .trim()\n}\n\nfunction userDisplay(text: string, content: ContentBlock[]): string {\n const labels = content.flatMap((block) => {\n const label = attachmentLabel(block)\n return label ? [`📎 ${label}`] : []\n })\n return [text, ...labels].filter(Boolean).join('\\n')\n}\n\nfunction unquoteArg(value: string): string {\n if (value.length < 2) return value\n const first = value[0]\n const last = value.at(-1)\n return (first === '\"' && last === '\"') || (first === \"'\" && last === \"'\")\n ? value.slice(1, -1)\n : value\n}\n\nfunction copyToClipboard(text: string): void {\n const run = (cmd: string, args: string[]) =>\n execFileSync(cmd, args, { input: text, stdio: ['pipe', 'ignore', 'ignore'] })\n if (process.platform === 'darwin') {\n try {\n run('pbcopy', [])\n } catch {\n \n }\n return\n }\n const candidates: Array<[string, string[]]> = [\n ['wl-copy', []],\n ['xclip', ['-selection', 'clipboard']],\n ['xsel', ['--clipboard', '--input']],\n ]\n for (const [cmd, args] of candidates) {\n try {\n run(cmd, args)\n return\n } catch {\n \n }\n }\n}\n","import type { McpServerConfig } from '../config/schema'\nimport { mcpServerSchema } from '../config/schema'\n\nexport type McpAddError = 'usage' | 'invalid-name' | 'invalid-url' | 'http-args'\n\nexport type McpAddParseResult =\n | { ok: true; name: string; config: McpServerConfig }\n | { ok: false; error: McpAddError }\n\nconst SERVER_NAME = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/\n\nexport function parseMcpAddArgs(args: string[]): McpAddParseResult {\n const [name, first, ...remaining] = args\n if (!name || !first) return { ok: false, error: 'usage' }\n if (!SERVER_NAME.test(name)) return { ok: false, error: 'invalid-name' }\n\n if (first === 'http') {\n const [url, ...extra] = remaining\n if (!url) return { ok: false, error: 'usage' }\n if (extra.length > 0) return { ok: false, error: 'http-args' }\n return httpServer(name, url)\n }\n\n if (first === 'stdio' || first === '--') {\n const [command, ...commandArgs] = remaining\n if (!command) return { ok: false, error: 'usage' }\n return stdioServer(name, command, commandArgs)\n }\n\n if (/^https?:\\/\\//.test(first)) {\n if (remaining.length > 0) return { ok: false, error: 'http-args' }\n return httpServer(name, first)\n }\n\n return stdioServer(name, first, remaining)\n}\n\nfunction httpServer(name: string, url: string): McpAddParseResult {\n const parsed = mcpServerSchema.safeParse({ type: 'http', url })\n return parsed.success\n ? { ok: true, name, config: parsed.data }\n : { ok: false, error: 'invalid-url' }\n}\n\nfunction stdioServer(name: string, command: string, args: string[]): McpAddParseResult {\n const parsed = mcpServerSchema.safeParse({ type: 'stdio', command, args })\n return parsed.success\n ? { ok: true, name, config: parsed.data }\n : { ok: false, error: 'usage' }\n}\n","export interface SlashCommand {\n name: string\n args?: string\n}\n\nexport const COMMANDS: SlashCommand[] = [\n { name: 'model' },\n { name: 'login' },\n { name: 'provider' },\n { name: 'logout', args: '[provider]' },\n { name: 'effort' },\n { name: 'thinking' },\n { name: 'budget', args: '[tokens]' },\n { name: 'theme', args: '[color]' },\n { name: 'lang' },\n { name: 'prompt', args: '[save <name>|delete <name>]' },\n { name: 'skills', args: '[install <source>]' },\n { name: 'bypass' },\n { name: 'usage' },\n { name: 'mcp', args: '[add|list|delete|enable|disable]' },\n { name: 'attach', args: '<path|clipboard|clear>' },\n { name: 'compact' },\n { name: 'checker' },\n { name: 'sessions', args: '[list|rename|delete [all]|export]' },\n { name: 'config' },\n { name: 'resume' },\n { name: 'undo' },\n { name: 'clear' },\n { name: 'help' },\n { name: 'exit' },\n { name: 'subagents' },\n]\n\nconst SUBCOMMANDS: SlashCommand[] = [\n { name: 'mcp add', args: '<name> <url|-- command>' },\n { name: 'mcp list' },\n { name: 'mcp delete', args: '[name]' },\n { name: 'mcp enable', args: '[name]' },\n { name: 'mcp disable', args: '[name]' },\n { name: 'sessions list' },\n { name: 'sessions rename', args: '[id] <title>' },\n { name: 'sessions delete', args: '[id]' },\n { name: 'sessions delete all' },\n { name: 'sessions export', args: '[id] [path]' },\n]\n\nexport function matchCommands(line: string): SlashCommand[] {\n if (!line.startsWith('/')) return []\n const token = line.slice(1)\n if (token.includes(' ')) {\n const needle = token.toLowerCase()\n return SUBCOMMANDS.filter((command) => command.name.startsWith(needle))\n }\n if (token === '') return COMMANDS\n\n const needle = token.toLowerCase()\n const starts = COMMANDS.filter((command) => command.name.startsWith(needle))\n if (starts.length > 0) return starts\n\n const contains = COMMANDS.filter((command) => command.name.includes(needle))\n if (contains.length > 0) return contains\n\n return COMMANDS.filter((command) => isSubsequence(needle, command.name))\n}\n\nexport function closestCommand(name: string): SlashCommand | undefined {\n const needle = name.toLowerCase()\n let best: SlashCommand | undefined\n let bestScore = Number.POSITIVE_INFINITY\n\n for (const command of COMMANDS) {\n const score = editDistance(needle, command.name)\n if (score < bestScore) {\n bestScore = score\n best = command\n }\n }\n\n return bestScore <= Math.max(2, Math.floor(needle.length / 2)) ? best : undefined\n}\n\nfunction isSubsequence(needle: string, haystack: string): boolean {\n let index = 0\n for (const character of haystack) {\n if (character === needle[index]) index += 1\n if (index === needle.length) return true\n }\n return needle.length === 0\n}\n\nfunction editDistance(a: string, b: string): number {\n let previous = Array.from({ length: b.length + 1 }, (_, index) => index)\n\n for (let i = 1; i <= a.length; i += 1) {\n const current = [i]\n for (let j = 1; j <= b.length; j += 1) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n current[j] = Math.min(\n (current[j - 1] ?? 0) + 1,\n (previous[j] ?? 0) + 1,\n (previous[j - 1] ?? 0) + cost,\n )\n }\n previous = current\n }\n\n return previous[b.length] ?? 0\n}\n","import { Box, Text } from 'ink'\nimport { useTerminalInput } from '../input'\nimport { normalizeHotkey } from '../layout'\nimport { useStrings } from '../i18n'\nimport { useTheme } from '../theme'\nimport { sanitizeTerminalText } from '../sanitize'\nimport type { ConfirmProps } from '../types'\n\nexport function Confirm({ title, body, danger, onAnswer }: ConfirmProps) {\n const theme = useTheme()\n const strings = useStrings()\n useTerminalInput((char, key) => {\n const c = normalizeHotkey(char)\n if (c === 'y') onAnswer(true)\n else if (c === 'n' || key.escape || key.return) onAnswer(false)\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={danger ? theme.error : theme.warn}\n paddingX={1}\n >\n <Text bold color={danger ? theme.error : theme.warn}>\n {sanitizeTerminalText(title)}\n </Text>\n {body && <Text dimColor>{sanitizeTerminalText(body)}</Text>}\n <Text>\n <Text bold>y</Text> {strings.yes} · <Text bold>n</Text> {strings.noDefault}\n </Text>\n </Box>\n )\n}\n","import { useInput, usePaste } from 'ink'\nimport type { Key } from 'ink'\nimport { useRef } from 'react'\n\nexport type TerminalInputHandler = (input: string, key: Key) => void\n\nexport function useTerminalInput(\n handler: TerminalInputHandler,\n options: { isActive?: boolean } = {},\n): void {\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n\n useInput((input, key) => {\n \n if (key.eventType === 'release') return\n handlerRef.current(input, key)\n }, options)\n}\n\nexport function useTerminalPaste(\n handler: (text: string) => void,\n options: { isActive?: boolean } = {},\n): void {\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n\n usePaste((text) => handlerRef.current(text), options)\n}\n","\n\nconst RU_TO_EN: Record<string, string> = {\n н: 'y',\n ф: 'a',\n т: 'n',\n}\n\nexport function normalizeHotkey(char: string | undefined): string {\n if (!char) return ''\n const lower = char.toLowerCase()\n return RU_TO_EN[lower] ?? lower\n}\n","import { createContext, useContext } from 'react'\n\nexport type Lang = 'en' | 'ru'\n\nexport const LANGS: { key: Lang; label: string }[] = [\n { key: 'en', label: 'English' },\n { key: 'ru', label: 'Русский' },\n]\n\nexport interface Strings {\n hint: string\n noProvider: string\n\n onboardIntro: string\n onboardExamples: string\n baseUrl: string\n apiKey: string\n detecting: string\n\n placeholder: string\n working: string\n suggestHelp: string\n more: (count: number) => string\n\n allowOnce: string\n always: string\n deny: string\n yes: string\n noDefault: string\n\n noMatches: string\n pickerHelp: (shown: number, total: number) => string\n\n noModel: string\n busy: string\n sessionFor: (elapsed: string) => string\n workingFor: (elapsed: string) => string\n titleProvider: string\n titleLogout: string\n titleSessions: string\n titleSessionAction: string\n resumed: (id: string, count: number) => string\n sessionsEmpty: string\n providerSet: (id: string, model: string) => string\n providersEmpty: string\n sessionSummary: (elapsed: string, turns: number) => string\n providerBalance: (balances: string) => string\n providerKeyRemaining: (balances: string) => string\n noThink: string\n mcpFailed: (count: number) => string\n\n escCancel: string\n escHelp: string\n cancelled: string\n queued: (count: number) => string\n configAt: (path: string) => string\n skillsEmpty: string\n skillsInstallUsage: string\n skillsInstalling: (source: string) => string\n skillsInstalled: (name: string, source: string) => string\n mcpStatus: (connected: number, failed: number) => string\n mcpEmpty: string\n mcpAddUsage: string\n mcpAddInvalidName: string\n mcpAddInvalidUrl: string\n mcpAddHttpArgs: string\n mcpExists: (name: string) => string\n mcpConnecting: (name: string) => string\n mcpAdded: (name: string, tools: number) => string\n mcpAddFailed: (name: string, error: string) => string\n mcpDeleted: (name: string) => string\n mcpDeleteFailed: (name: string, error: string) => string\n mcpNotFound: (name: string) => string\n mcpTools: (count: number) => string\n mcpEnabled: (name: string, tools: number) => string\n mcpDisabled: (name: string) => string\n mcpToggleFailed: (name: string, error: string) => string\n mcpState: Record<string, string>\n activeAgents: (count: number) => string\n subagentsStatus: (count: number) => string\n attachUsage: string\n attachmentAdded: (name: string) => string\n attachmentsCleared: string\n compactNothing: string\n compactStarting: string\n compactDone: (count: number) => string\n sessionRenameUsage: string\n sessionRenamed: (title: string) => string\n sessionDeleteAsk: string\n sessionDeleted: (id: string) => string\n sessionDeleteAllAsk: string\n sessionDeleteAllAskBody: string\n sessionDeleteAllFinalAsk: string\n sessionDeleteAllFinalBody: string\n sessionsDeletedAll: (count: number) => string\n sessionsDeleteAllFailed: (deleted: number, failed: number) => string\n sessionExported: (path: string) => string\n sessionActionResume: string\n sessionActionRename: string\n sessionActionDelete: string\n sessionActionExport: string\n updateAvailable: (version: string, url: string) => string\n accentSet: (name: string, hex: string) => string\n reasoning: (on: boolean) => string\n effortSet: (value: string) => string\n budgetCurrent: (tokens: number) => string\n budgetSet: (tokens: number) => string\n budgetUnlimited: string\n budgetInvalid: string\n modelSet: (value: string) => string\n noModels: string\n bypassOff: string\n bypassAsk1: string\n bypassAsk1Body: string\n bypassAsk2: string\n bypassAsk2Body: string\n bypassCancelled: string\n bypassOn: string\n logoutAsk: (provider: string) => string\n logoutAskBody: string\n loggedOut: (provider: string) => string\n logoutNothing: string\n promptUsage: string\n promptNothing: string\n promptSaved: (name: string) => string\n promptDeleteUsage: string\n promptDeleted: (name: string) => string\n promptNotFound: (name: string) => string\n promptSaveAsk: string\n promptSaveAskBody: string\n promptsEmpty: string\n unknownCommand: (name: string) => string\n didYouMean: (typed: string, guess: string) => string\n undoNothing: string\n undoResult: (restored: number, removed: number) => string\n undoConflicts: (paths: string[]) => string\n undoFailed: (failures: string[]) => string\n\n titleAccent: string\n titleEffort: string\n titleModel: string\n titlePrompts: string\n titleSkills: string\n titleLang: string\n titleMcpDelete: string\n titleMcpEnable: string\n titleMcpDisable: string\n modeLabel: Record<string, string>\n modeChanged: (label: string) => string\n\n cmd: Record<string, string>\n}\n\nconst en: Strings = {\n hint: 'type / for commands',\n noProvider: \"no provider yet — let's add one\",\n\n onboardIntro: 'Paste any OpenAI-compatible or Anthropic base URL, then its API key.',\n onboardExamples: 'e.g. https://openrouter.ai/api/v1 · https://api.anthropic.com',\n baseUrl: 'base url › ',\n apiKey: 'api key › ',\n detecting: 'detecting provider…',\n\n placeholder: 'ask, or / for commands',\n working: 'working…',\n suggestHelp: '↑↓ move · tab complete · enter run',\n more: (count) => `… ${count} more`,\n\n allowOnce: 'allow once',\n always: 'always',\n deny: 'deny',\n yes: 'yes',\n noDefault: 'no (default)',\n\n noMatches: 'no matches',\n pickerHelp: (shown, total) => `${shown} of ${total} · ↑↓ move · enter pick · esc cancel`,\n\n noModel: 'no model',\n busy: 'working',\n sessionFor: (elapsed) => `up ${elapsed}`,\n workingFor: (elapsed) => `working ${elapsed}`,\n titleProvider: 'Provider',\n titleLogout: 'Sign out of a provider',\n titleSessions: 'Resume a session',\n titleSessionAction: 'Session action',\n resumed: (id, count) => `Resumed ${id} — ${count} messages restored`,\n sessionsEmpty: 'No saved sessions yet.',\n providerSet: (id, model) => `Provider: ${id} · model ${model}`,\n providersEmpty: 'No providers configured. Use /login to add one.',\n sessionSummary: (elapsed, turns) => `session ${elapsed} · ${turns} turns`,\n providerBalance: (balances) => `provider balance: ${balances}`,\n providerKeyRemaining: (balances) => `API key limit remaining: ${balances}`,\n noThink: 'no-think',\n mcpFailed: (count) => `mcp:${count} failed`,\n\n escCancel: 'esc to cancel',\n escHelp: 'esc — cancel the running turn',\n cancelled: 'Cancelled.',\n queued: (count) => `queued: ${count}`,\n configAt: (path) => `config: ${path}`,\n skillsEmpty:\n 'No skills installed. Drop a folder with a SKILL.md into ~/.kitcode/skills or ./.kitcode/skills',\n skillsInstallUsage: 'Usage: /skills install <github-url|npm-package|local-path>',\n skillsInstalling: (source) => `Installing skill from \"${source}\"…`,\n skillsInstalled: (name, source) => `Skill \"${name}\" installed from \"${source}\"`,\n mcpStatus: (connected, failed) => `MCP: ${connected} connected, ${failed} failed`,\n mcpEmpty: 'No MCP servers configured.',\n mcpAddUsage:\n 'List: /mcp list · Enable/disable: /mcp enable|disable [name] · Delete: /mcp delete [name]\\nRemote: /mcp add <name> <https://url>\\nLocal: /mcp add <name> -- <command> [args]',\n mcpAddInvalidName: 'MCP name may contain only letters, numbers, _ and - (up to 64 chars).',\n mcpAddInvalidUrl: 'MCP URL must use HTTPS (HTTP is allowed only for localhost).',\n mcpAddHttpArgs: 'An HTTP MCP accepts one URL and no command arguments.',\n mcpExists: (name) => `MCP server \"${name}\" already exists.`,\n mcpConnecting: (name) => `Connecting MCP \"${name}\"…`,\n mcpAdded: (name, tools) => `MCP \"${name}\" connected and saved · ${tools} tools`,\n mcpAddFailed: (name, error) => `Could not add MCP \"${name}\": ${error}`,\n mcpDeleted: (name) => `MCP \"${name}\" disconnected and removed.`,\n mcpDeleteFailed: (name, error) => `Could not remove MCP \"${name}\": ${error}`,\n mcpNotFound: (name) => `MCP server \"${name}\" was not found.`,\n mcpTools: (count) => `${count} tools`,\n mcpEnabled: (name, tools) => `MCP \"${name}\" enabled · ${tools} tools`,\n mcpDisabled: (name) => `MCP \"${name}\" disabled.`,\n mcpToggleFailed: (name, error) => `Could not change MCP \"${name}\": ${error}`,\n mcpState: {\n connected: 'connected',\n connecting: 'connecting',\n error: 'error',\n disabled: 'disabled',\n },\n activeAgents: (count) => `agents: ${count}`,\n subagentsStatus: (count) =>\n count > 0 ? `Active sub-agents: ${count}` : 'No active sub-agents.',\n attachUsage:\n 'Usage: /attach <image-or-text-file> · /attach clipboard · /attach clear',\n attachmentAdded: (name) => `Attached for the next message: ${name}`,\n attachmentsCleared: 'Pending attachments cleared.',\n compactNothing: 'Not enough older conversation to compact yet.',\n compactStarting: 'Compacting context…',\n compactDone: (count) => `Context compacted · ${count} older messages replaced with a summary.`,\n sessionRenameUsage: 'Type the title after the command: /sessions rename <id> <title>',\n sessionRenamed: (title) => `Session renamed to \"${title}\".`,\n sessionDeleteAsk: 'The saved chat file will be deleted. This cannot be undone.',\n sessionDeleted: (id) => `Session ${id} deleted.`,\n sessionDeleteAllAsk: 'Delete every saved chat?',\n sessionDeleteAllAskBody:\n 'All KitCode sessions from every workspace will be permanently deleted.',\n sessionDeleteAllFinalAsk: 'Final confirmation: delete all chats?',\n sessionDeleteAllFinalBody:\n 'This cannot be undone. Press y only if you want to erase the complete session history.',\n sessionsDeletedAll: (count) => `All saved chats deleted · ${count} sessions removed.`,\n sessionsDeleteAllFailed: (deleted, failed) =>\n `Session cleanup was incomplete · ${deleted} removed, ${failed} failed.`,\n sessionExported: (path) => `Session exported to ${path}`,\n sessionActionResume: 'resume',\n sessionActionRename: 'rename',\n sessionActionDelete: 'delete',\n sessionActionExport: 'export Markdown',\n updateAvailable: (version, url) => `A newer KitCode build is available (${version}): ${url}`,\n accentSet: (name, hex) => `Accent: ${name} (${hex})`,\n reasoning: (on) => `Reasoning ${on ? 'on' : 'off'}`,\n effortSet: (value) => `Effort: ${value}`,\n budgetCurrent: (tokens) => `Token budget: ${tokens.toLocaleString()} per turn`,\n budgetSet: (tokens) => `Token budget set to ${tokens.toLocaleString()} per turn`,\n budgetUnlimited: 'Token budget: unlimited (0). Set /budget <tokens> to restore a limit.',\n budgetInvalid: 'Invalid budget: must be between 1,000 and 10,000,000',\n modelSet: (value) => `Model: ${value}`,\n noModels: 'No models available. Use /login to add a provider.',\n bypassOff: 'Approval prompts are back on.',\n bypassAsk1: 'Disable approval prompts for this session?',\n bypassAsk1Body: 'The agent will write files and run shell commands without asking.',\n bypassAsk2: 'Confirm once more.',\n bypassAsk2Body: 'This lasts until you quit. Tools set to \"deny\" in config stay blocked.',\n bypassCancelled: 'Bypass cancelled.',\n bypassOn: 'Bypass on — approvals disabled for this session.',\n logoutAsk: (provider) => `Sign out of \"${provider}\"?`,\n logoutAskBody: 'Its API key is removed from auth.json and the provider is dropped from the config.',\n loggedOut: (provider) => `Signed out of \"${provider}\".`,\n logoutNothing: 'No provider is signed in.',\n promptUsage: 'Usage: /prompt save <name>',\n promptNothing: 'Nothing to save yet — send a message first.',\n promptSaved: (name) => `Saved prompt \"${name}\"`,\n promptDeleteUsage: 'Usage: /prompt delete <name>',\n promptDeleted: (name) => `Deleted prompt \"${name}\"`,\n promptNotFound: (name) => `Prompt \"${name}\" not found.`,\n promptSaveAsk: 'Save this as a prompt?',\n promptSaveAskBody: 'The text will be saved to a file and can be loaded later with /prompt.',\n promptsEmpty: 'No saved prompts. Use /prompt save <name>.',\n unknownCommand: (name) => `Unknown command /${name}. Try /help`,\n didYouMean: (typed, guess) => `Unknown command /${typed}. Did you mean /${guess}?`,\n undoNothing: 'Nothing to undo in this session.',\n undoResult: (restored, removed) =>\n `Undo complete: ${restored} restored, ${removed} newly created removed.`,\n undoConflicts: (paths) =>\n `Kept newer changes in: ${paths.join(', ')}`,\n undoFailed: (failures) => `Could not restore: ${failures.join('; ')}`,\n\n titleAccent: 'Accent colour',\n titleEffort: 'Reasoning depth',\n titleModel: 'Model',\n titlePrompts: 'Saved prompts',\n titleSkills: 'Skill',\n titleLang: 'Language',\n titleMcpDelete: 'Remove an MCP server',\n titleMcpEnable: 'Enable an MCP server',\n titleMcpDisable: 'Disable an MCP server',\n modeLabel: { normal: 'normal', accept: 'auto-accept edits', plan: 'plan only' },\n modeChanged: (label) => `Mode: ${label} (shift+tab to cycle)`,\n\n cmd: {\n model: 'switch model',\n login: 'add a provider (url + key)',\n provider: 'switch between configured providers',\n logout: 'choose a provider to sign out from',\n effort: 'set reasoning depth',\n thinking: 'toggle reasoning',\n budget: 'set token budget per turn',\n theme: 'change the accent colour',\n lang: 'change the interface language',\n prompt: 'insert or save a prompt',\n 'prompt save': 'save the current or recent text as a prompt',\n 'prompt delete': 'delete a saved prompt',\n skills: 'list installed skills',\n bypass: 'disable approval prompts (asks twice)',\n usage: 'token and cost breakdown',\n mcp: 'show or add MCP servers',\n 'mcp add': 'connect and save an MCP server',\n 'mcp list': 'list MCP servers and connection status',\n 'mcp delete': 'disconnect and remove an MCP server',\n 'mcp enable': 'enable and connect an MCP server',\n 'mcp disable': 'disconnect without removing an MCP server',\n attach: 'attach an image or text file to the next message',\n compact: 'summarize older context and keep recent turns',\n checker: 'check local setup without spending model tokens',\n sessions: 'search and manage saved sessions',\n 'sessions list': 'list saved sessions',\n 'sessions rename': 'rename a saved session',\n 'sessions delete': 'delete a saved session',\n 'sessions delete all': 'permanently delete every saved chat',\n 'sessions export': 'export a session to Markdown',\n config: 'show where the config lives',\n resume: 'reopen a past chat',\n undo: 'undo file edits from the latest message',\n clear: 'start a fresh session',\n help: 'list commands',\n exit: 'quit',\n subagents: 'show active sub-agents and what they are doing',\n },\n}\n\nconst ru: Strings = {\n hint: 'нажми / для команд',\n noProvider: 'провайдер ещё не добавлен',\n\n onboardIntro: 'Вставь базовый URL любого OpenAI-совместимого или Anthropic API, затем ключ.',\n onboardExamples: 'например https://openrouter.ai/api/v1 · https://api.anthropic.com',\n baseUrl: 'базовый url › ',\n apiKey: 'api-ключ › ',\n detecting: 'определяю провайдера…',\n\n placeholder: 'спроси, или / для команд',\n working: 'работаю…',\n suggestHelp: '↑↓ выбор · tab — дополнить · enter — выполнить',\n more: (count) => `… ещё ${count}`,\n\n allowOnce: 'разрешить один раз',\n always: 'всегда',\n deny: 'отклонить',\n yes: 'да',\n noDefault: 'нет (по умолчанию)',\n\n noMatches: 'ничего не найдено',\n pickerHelp: (shown, total) => `${shown} из ${total} · ↑↓ выбор · enter — ок · esc — отмена`,\n\n noModel: 'нет модели',\n busy: 'работаю',\n sessionFor: (elapsed) => `в работе ${elapsed}`,\n workingFor: (elapsed) => `думает ${elapsed}`,\n titleProvider: 'Провайдер',\n titleLogout: 'Выбрать API для выхода',\n titleSessions: 'Восстановить сессию',\n titleSessionAction: 'Действие с сессией',\n resumed: (id, count) => `Сессия ${id} восстановлена — сообщений: ${count}`,\n sessionsEmpty: 'Сохранённых сессий пока нет.',\n providerSet: (id, model) => `Провайдер: ${id} · модель ${model}`,\n providersEmpty: 'Провайдеров нет. Добавь через /login.',\n sessionSummary: (elapsed, turns) => `сессия ${elapsed} · ходов: ${turns}`,\n providerBalance: (balances) => `баланс провайдера: ${balances}`,\n providerKeyRemaining: (balances) => `остаток лимита API-ключа: ${balances}`,\n noThink: 'без размышлений',\n mcpFailed: (count) => `mcp: ${count} с ошибкой`,\n\n escCancel: 'esc — отменить',\n escHelp: 'esc — отменить текущий ход',\n cancelled: 'Отменено.',\n queued: (count) => `в очереди: ${count}`,\n configAt: (path) => `конфиг: ${path}`,\n skillsEmpty:\n 'Скиллов нет. Положи папку с файлом SKILL.md в ~/.kitcode/skills или ./.kitcode/skills',\n skillsInstallUsage: 'Использование: /skills install <github-url|npm-пакет|локальный-путь>',\n skillsInstalling: (source) => `Устанавливаю скилл из \"${source}\"…`,\n skillsInstalled: (name, source) => `Скилл «${name}» установлен из \"${source}\"`,\n mcpStatus: (connected, failed) => `MCP: подключено ${connected}, с ошибкой ${failed}`,\n mcpEmpty: 'MCP-серверы пока не добавлены.',\n mcpAddUsage:\n 'Список: /mcp list · Вкл/выкл: /mcp enable|disable [имя] · Удалить: /mcp delete [имя]\\nУдалённый: /mcp add <имя> <https://url>\\nЛокальный: /mcp add <имя> -- <команда> [аргументы]',\n mcpAddInvalidName: 'Имя MCP: только буквы, цифры, _ и - (до 64 символов).',\n mcpAddInvalidUrl: 'URL MCP должен использовать HTTPS (HTTP разрешён только для localhost).',\n mcpAddHttpArgs: 'Для HTTP MCP укажи один URL без аргументов команды.',\n mcpExists: (name) => `MCP-сервер «${name}» уже существует.`,\n mcpConnecting: (name) => `Подключаю MCP «${name}»…`,\n mcpAdded: (name, tools) => `MCP «${name}» подключён и сохранён · инструментов: ${tools}`,\n mcpAddFailed: (name, error) => `Не удалось добавить MCP «${name}»: ${error}`,\n mcpDeleted: (name) => `MCP «${name}» отключён и удалён.`,\n mcpDeleteFailed: (name, error) => `Не удалось удалить MCP «${name}»: ${error}`,\n mcpNotFound: (name) => `MCP-сервер «${name}» не найден.`,\n mcpTools: (count) => `инструментов: ${count}`,\n mcpEnabled: (name, tools) => `MCP «${name}» включён · инструментов: ${tools}`,\n mcpDisabled: (name) => `MCP «${name}» выключен.`,\n mcpToggleFailed: (name, error) => `Не удалось изменить MCP «${name}»: ${error}`,\n mcpState: {\n connected: 'подключён',\n connecting: 'подключается',\n error: 'ошибка',\n disabled: 'отключён',\n },\n activeAgents: (count) => `агентов: ${count}`,\n subagentsStatus: (count) =>\n count > 0 ? `Активных суб-агентов: ${count}` : 'Нет активных суб-агентов.',\n attachUsage:\n 'Использование: /attach <картинка-или-текстовый-файл> · /attach clipboard · /attach clear',\n attachmentAdded: (name) => `Прикреплено к следующему сообщению: ${name}`,\n attachmentsCleared: 'Ожидающие вложения убраны.',\n compactNothing: 'Пока недостаточно старых сообщений для сжатия контекста.',\n compactStarting: 'Сжатие контекста…',\n compactDone: (count) => `Контекст сжат · старых сообщений заменено сводкой: ${count}.`,\n sessionRenameUsage: 'Допиши название: /sessions rename <id> <название>',\n sessionRenamed: (title) => `Сессия переименована в «${title}».`,\n sessionDeleteAsk: 'Файл сохранённого чата будет удалён без возможности восстановления.',\n sessionDeleted: (id) => `Сессия ${id} удалена.`,\n sessionDeleteAllAsk: 'Удалить вообще все сохранённые чаты?',\n sessionDeleteAllAskBody:\n 'Будут навсегда удалены все сессии KitCode из всех рабочих папок.',\n sessionDeleteAllFinalAsk: 'Последнее подтверждение: точно удалить все чаты?',\n sessionDeleteAllFinalBody:\n 'Это нельзя отменить. Нажимай y только если хочешь стереть всю историю сессий.',\n sessionsDeletedAll: (count) => `Все сохранённые чаты удалены · сессий: ${count}.`,\n sessionsDeleteAllFailed: (deleted, failed) =>\n `Удаление завершено не полностью · удалено: ${deleted}, ошибок: ${failed}.`,\n sessionExported: (path) => `Сессия экспортирована: ${path}`,\n sessionActionResume: 'открыть',\n sessionActionRename: 'переименовать',\n sessionActionDelete: 'удалить',\n sessionActionExport: 'экспортировать Markdown',\n updateAvailable: (version, url) => `Доступна новая версия KitCode (${version}): ${url}`,\n accentSet: (name, hex) => `Цвет: ${name} (${hex})`,\n reasoning: (on) => `Размышления ${on ? 'включены' : 'выключены'}`,\n effortSet: (value) => `Глубина: ${value}`,\n budgetCurrent: (tokens) => `Лимит токенов: ${tokens.toLocaleString()} за ход`,\n budgetSet: (tokens) => `Лимит токенов установлен: ${tokens.toLocaleString()} за ход`,\n budgetUnlimited: 'Лимит токенов: безлимитный (0). Введи /budget <число> чтобы вернуть лимит.',\n budgetInvalid: 'Неверный лимит: от 1 000 до 10 000 000',\n modelSet: (value) => `Модель: ${value}`,\n noModels: 'Моделей нет. Добавь провайдера через /login.',\n bypassOff: 'Подтверждения снова включены.',\n bypassAsk1: 'Отключить подтверждения на эту сессию?',\n bypassAsk1Body: 'Агент будет писать файлы и запускать команды без спроса.',\n bypassAsk2: 'Подтверди ещё раз.',\n bypassAsk2Body: 'Действует до выхода. Инструменты с «deny» в конфиге останутся заблокированы.',\n bypassCancelled: 'Отменено.',\n bypassOn: 'Байпас включён — подтверждения отключены до конца сессии.',\n logoutAsk: (provider) => `Выйти из «${provider}»?`,\n logoutAskBody: 'Ключ будет удалён из auth.json, а провайдер — из конфига.',\n loggedOut: (provider) => `Выполнен выход из «${provider}».`,\n logoutNothing: 'Ни один провайдер не подключён.',\n promptUsage: 'Использование: /prompt save <имя>',\n promptNothing: 'Пока нечего сохранять — сначала отправь сообщение.',\n promptSaved: (name) => `Промт «${name}» сохранён`,\n promptDeleteUsage: 'Использование: /prompt delete <имя>',\n promptDeleted: (name) => `Промт «${name}» удалён`,\n promptNotFound: (name) => `Промт «${name}» не найден.`,\n promptSaveAsk: 'Сохранить как промт?',\n promptSaveAskBody: 'Текст будет сохранён в файл и его можно будет загрузить позже через /prompt.',\n promptsEmpty: 'Сохранённых промтов нет. Используй /prompt save <имя>.',\n unknownCommand: (name) => `Неизвестная команда /${name}. Попробуй /help`,\n didYouMean: (typed, guess) => `Неизвестная команда /${typed}. Может быть /${guess}?`,\n undoNothing: 'В этой сессии пока нечего откатывать.',\n undoResult: (restored, removed) =>\n `Откат завершён: восстановлено ${restored}, удалено новых файлов ${removed}.`,\n undoConflicts: (paths) =>\n `Более свежие изменения сохранены в: ${paths.join(', ')}`,\n undoFailed: (failures) => `Не удалось восстановить: ${failures.join('; ')}`,\n\n titleAccent: 'Цвет акцента',\n titleEffort: 'Глубина размышлений',\n titleModel: 'Модель',\n titlePrompts: 'Сохранённые промты',\n titleSkills: 'Скиллы',\n titleLang: 'Язык',\n titleMcpDelete: 'Удалить MCP-сервер',\n titleMcpEnable: 'Включить MCP-сервер',\n titleMcpDisable: 'Выключить MCP-сервер',\n modeLabel: { normal: 'обычный', accept: 'правки без спроса', plan: 'только план' },\n modeChanged: (label) => `Режим: ${label} (shift+tab — переключить)`,\n\n cmd: {\n model: 'сменить модель',\n login: 'добавить провайдера (url + ключ)',\n provider: 'переключиться между провайдерами',\n logout: 'выбрать провайдера и удалить его ключ',\n effort: 'глубина размышлений',\n thinking: 'включить/выключить размышления',\n budget: 'лимит токенов за ход (0 = безлимит)',\n theme: 'сменить цвет акцента',\n lang: 'сменить язык интерфейса',\n prompt: 'вставить или сохранить промт',\n skills: 'список установленных скиллов',\n bypass: 'отключить подтверждения (спросит дважды)',\n usage: 'токены и стоимость',\n mcp: 'показать или добавить MCP-сервер',\n 'mcp add': 'подключить и сохранить MCP-сервер',\n 'mcp list': 'список MCP-серверов и их статус',\n 'mcp delete': 'отключить и удалить MCP-сервер',\n 'mcp enable': 'включить и подключить MCP-сервер',\n 'mcp disable': 'отключить MCP без удаления',\n attach: 'прикрепить картинку или текстовый файл к сообщению',\n compact: 'сжать старый контекст, сохранив последние ходы',\n checker: 'проверить настройку без траты токенов модели',\n sessions: 'поиск и управление сохранёнными сессиями',\n 'sessions list': 'список сохранённых сессий',\n 'sessions rename': 'переименовать сессию',\n 'sessions delete': 'удалить сессию',\n 'sessions delete all': 'навсегда удалить все сохранённые чаты',\n 'sessions export': 'экспортировать сессию в Markdown',\n config: 'где лежит конфиг',\n resume: 'открыть прошлый чат',\n undo: 'откатить правки файлов из последнего сообщения',\n clear: 'начать новую сессию',\n help: 'список команд',\n exit: 'выход',\n subagents: 'показать активных суб-агентов и чем заняты',\n },\n}\n\nconst DICTIONARIES: Record<Lang, Strings> = { en, ru }\n\nexport function stringsFor(lang: Lang | undefined): Strings {\n return DICTIONARIES[lang ?? 'en']\n}\n\nexport const StringsContext = createContext<Strings>(en)\n\nexport function useStrings(): Strings {\n return useContext(StringsContext)\n}\n","import { createContext, useContext } from 'react'\n\nexport const PRESETS: Record<string, string> = {\n purple: '#a78bfa',\n violet: '#8b5cf6',\n blue: '#60a5fa',\n cyan: '#22d3ee',\n green: '#4ade80',\n orange: '#fb923c',\n pink: '#f472b6',\n red: '#f87171',\n yellow: '#fbbf24',\n white: '#e5e7eb',\n}\n\nexport const DEFAULT_ACCENT = PRESETS.purple as string\n\nexport interface Theme {\n accent: string\n ok: string\n warn: string\n error: string\n}\n\nexport function resolveAccent(value: string | undefined): string {\n if (!value) return DEFAULT_ACCENT\n const preset = PRESETS[value.toLowerCase()]\n if (preset) return preset\n return /^#[0-9a-f]{6}$/i.test(value) ? value : DEFAULT_ACCENT\n}\n\nexport function makeTheme(accent: string | undefined): Theme {\n return {\n accent: resolveAccent(accent),\n ok: PRESETS.green as string,\n warn: PRESETS.yellow as string,\n error: PRESETS.red as string,\n }\n}\n\nexport const ThemeContext = createContext<Theme>(makeTheme(undefined))\n\nexport function useTheme(): Theme {\n return useContext(ThemeContext)\n}\n","import { Box, Text } from 'ink'\nimport { useState } from 'react'\nimport { LANGS } from '../i18n'\nimport type { Lang } from '../i18n'\nimport { useTheme } from '../theme'\nimport { useTerminalInput } from '../input'\nimport { Logo } from './Logo'\n\nexport function LanguagePicker({ onPick }: { onPick(lang: Lang): void }) {\n const theme = useTheme()\n const [cursor, setCursor] = useState(0)\n\n useTerminalInput((char, key) => {\n if (key.upArrow) return setCursor((index) => Math.max(0, index - 1))\n if (key.downArrow) return setCursor((index) => Math.min(LANGS.length - 1, index + 1))\n if (key.return) return onPick(LANGS[cursor]?.key ?? 'en')\n const digit = Number.parseInt(char, 10)\n if (digit >= 1 && digit <= LANGS.length) onPick(LANGS[digit - 1]?.key ?? 'en')\n })\n\n return (\n <Box flexDirection=\"column\">\n <Logo subtitle=\"language · язык\" />\n {LANGS.map((lang, index) => (\n <Text\n key={lang.key}\n color={index === cursor ? theme.accent : undefined}\n inverse={index === cursor}\n >\n {index + 1}. {lang.label}\n </Text>\n ))}\n <Text dimColor>↑↓ · enter</Text>\n </Box>\n )\n}\n","import { Box, Text, useWindowSize } from 'ink'\nimport { useStrings } from '../i18n'\nimport { useTheme } from '../theme'\nimport { formatWorkspacePath } from '../workspace'\n\nconst CAT = [' ╱\\\\_╱\\\\ ', ' ( o.o )', ' > ^ < ']\n\nexport function Logo({ subtitle, workspace }: { subtitle?: string; workspace?: string }) {\n const theme = useTheme()\n const strings = useStrings()\n const { columns } = useWindowSize()\n const location = workspace\n ? formatWorkspacePath(workspace, Math.max(6, Math.min(72, columns - 15)))\n : ''\n\n return (\n <Box width=\"100%\" marginBottom={1}>\n <Box flexDirection=\"column\" flexShrink={0}>\n {CAT.map((line) => (\n <Text key={line} color={theme.accent}>\n {line}\n </Text>\n ))}\n </Box>\n <Box flexDirection=\"column\" marginLeft={2} flexGrow={1} flexShrink={1} minWidth={0}>\n <Text color={theme.accent} bold>\n kitcode\n </Text>\n <Text dimColor wrap=\"truncate-end\">{subtitle ?? strings.hint}</Text>\n {location && (\n <Box width=\"100%\">\n <Text color={theme.accent}>⌂ </Text>\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n <Text dimColor wrap=\"truncate-start\">{location}</Text>\n </Box>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n","import { homedir } from 'node:os'\nimport { sanitizeTerminalText } from './sanitize'\n\nexport function formatWorkspacePath(\n value: string,\n maxWidth: number,\n home = homedir(),\n): string {\n const width = Math.max(1, Math.floor(maxWidth))\n const safe = oneLine(value)\n if (!safe) return ''\n\n const safeHome = oneLine(home).replace(/[\\\\/]+$/, '')\n const display = isInsideHome(safe, safeHome) ? `~${safe.slice(safeHome.length)}` : safe\n if (characters(display).length <= width) return display\n if (width === 1) return '…'\n\n const separator = display.includes('\\\\') && !display.includes('/') ? '\\\\' : '/'\n const parts = display.split(/[\\\\/]+/).filter(Boolean)\n if (parts.length === 0) return tail(display, width)\n\n const prefix = `…${separator}`\n const available = width - characters(prefix).length\n if (available <= 0) return tail(prefix, width)\n\n let result = parts.at(-1) ?? ''\n if (characters(result).length > available) return `${prefix}${tail(result, available)}`\n\n for (let index = parts.length - 2; index >= 0; index -= 1) {\n const candidate = `${parts[index]}${separator}${result}`\n if (characters(prefix + candidate).length > width) break\n result = candidate\n }\n return `${prefix}${result}`\n}\n\nfunction oneLine(value: string): string {\n return sanitizeTerminalText(value).replace(/[\\t\\r\\n]+/g, ' ').trim()\n}\n\nfunction isInsideHome(value: string, home: string): boolean {\n if (!home) return false\n return value === home || value.startsWith(`${home}/`) || value.startsWith(`${home}\\\\`)\n}\n\nfunction characters(value: string): string[] {\n return [...value]\n}\n\nfunction tail(value: string, width: number): string {\n return characters(value).slice(-width).join('')\n}\n","import { Box, Text } from 'ink'\nimport Spinner from 'ink-spinner'\nimport TextInput from 'ink-text-input'\nimport { useState } from 'react'\nimport { useStrings } from '../i18n'\nimport { useTheme } from '../theme'\nimport { sanitizeTerminalText } from '../sanitize'\nimport { Logo } from './Logo'\n\ntype Step = 'url' | 'key' | 'working'\n\nexport function Onboarding({ onSubmit }: { onSubmit(url: string, key: string): Promise<string> }) {\n const theme = useTheme()\n const strings = useStrings()\n const [step, setStep] = useState<Step>('url')\n const [url, setUrl] = useState('')\n const [key, setKey] = useState('')\n const [error, setError] = useState('')\n\n const submitKey = async (value: string) => {\n if (value.trim() === '') return\n setStep('working')\n setError('')\n try {\n await onSubmit(url.trim(), value.trim())\n } catch (cause) {\n setError(sanitizeTerminalText(cause instanceof Error ? cause.message : String(cause)))\n setKey('')\n setStep('key')\n }\n }\n\n return (\n <Box flexDirection=\"column\">\n <Logo subtitle={strings.noProvider} />\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text dimColor>{strings.onboardIntro}</Text>\n <Text dimColor>{strings.onboardExamples}</Text>\n </Box>\n\n {error !== '' && (\n <Box marginBottom={1}>\n <Text color={theme.error}>{error}</Text>\n </Box>\n )}\n\n {step === 'url' && (\n <Box>\n <Text color={theme.accent}>{strings.baseUrl}</Text>\n <TextInput\n value={url}\n onChange={setUrl}\n onSubmit={(value) => value.trim() !== '' && setStep('key')}\n placeholder=\"https://…\"\n />\n </Box>\n )}\n\n {step === 'key' && (\n <Box flexDirection=\"column\">\n <Text dimColor>{sanitizeTerminalText(url)}</Text>\n <Box>\n <Text color={theme.accent}>{strings.apiKey}</Text>\n <TextInput value={key} onChange={setKey} onSubmit={submitKey} mask=\"•\" />\n </Box>\n </Box>\n )}\n\n {step === 'working' && (\n <Text color={theme.accent}>\n <Spinner type=\"dots\" /> {strings.detecting}\n </Text>\n )}\n </Box>\n )\n}\n","import { Box, Text } from 'ink'\nimport { normalizeHotkey } from '../layout'\nimport { useTerminalInput } from '../input'\nimport { useStrings } from '../i18n'\nimport { useTheme } from '../theme'\nimport type { PermissionPromptProps } from '../types'\nimport { sanitizeTerminalText } from '../sanitize'\nimport { Diff } from './Diff'\n\nconst MAX_PREVIEW_CHARS = 20_000\n\nexport function PermissionPrompt({ request, onDecide }: PermissionPromptProps) {\n const theme = useTheme()\n const strings = useStrings()\n useTerminalInput((char, key) => {\n const c = normalizeHotkey(char)\n if (c === 'y') onDecide('once')\n else if (c === 'a' && request.allowAlways !== false) onDecide('always')\n else if (c === 'n' || key.escape || key.return) onDecide('deny')\n })\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.warn} paddingX={1}>\n <Text bold color={theme.warn}>\n {sanitizeTerminalText(request.summary)}\n </Text>\n\n {request.display?.kind === 'diff' && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>{sanitizeTerminalText(request.display.path)}</Text>\n <Diff before={request.display.before} after={request.display.after} />\n </Box>\n )}\n\n {request.display?.kind === 'text' && (\n <Text dimColor>{previewText(request.display.text)}</Text>\n )}\n\n {request.display?.kind === 'list' && (\n <Box flexDirection=\"column\">\n <Text dimColor>{sanitizeTerminalText(request.display.title)}</Text>\n {request.display.items.slice(0, 100).map((item, index) => (\n <Text key={index} dimColor>• {previewText(item, 1_000)}</Text>\n ))}\n </Box>\n )}\n\n {!request.display && <Text dimColor>{printInput(request.input)}</Text>}\n\n <Box marginTop={1}>\n <Text>\n <Text bold>y</Text> {strings.allowOnce} ·{' '}\n {request.allowAlways !== false && (\n <><Text bold>a</Text> {strings.always} ({sanitizeTerminalText(request.toolName)}) · </>\n )}\n <Text bold>n</Text> {strings.deny}\n </Text>\n </Box>\n </Box>\n )\n}\n\nfunction printInput(input: unknown): string {\n try {\n return previewText(JSON.stringify(input, null, 2))\n } catch {\n return previewText(input)\n }\n}\n\nfunction previewText(value: unknown, limit = MAX_PREVIEW_CHARS): string {\n const safe = sanitizeTerminalText(value)\n return safe.length > limit ? `${safe.slice(0, limit)}\\n... preview truncated` : safe\n}\n","import { Box, Text } from 'ink'\nimport { canRenderDiff, diffLines, MAX_RENDER_DIFF_CHARS, type DiffLine, truncate } from '../diff'\nimport { sanitizeTerminalText } from '../sanitize'\n\nexport function Diff({ before, after }: { before: string; after: string }) {\n if (!canRenderDiff(before, after)) {\n return (\n <Text dimColor>\n Diff preview omitted: it exceeds {MAX_RENDER_DIFF_CHARS.toLocaleString()} characters.\n </Text>\n )\n }\n const { hunk, hidden } = diffLines(sanitizeTerminalText(before), sanitizeTerminalText(after))\n return <DiffHunk lines={hunk} hidden={hidden} />\n}\n\nexport function DiffHunk({ lines, hidden }: { lines: DiffLine[]; hidden: number }) {\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, index) => (\n <Text\n key={index}\n color={line.kind === 'add' ? 'green' : line.kind === 'del' ? 'red' : 'gray'}\n dimColor={line.kind === 'ctx'}\n >\n {line.kind === 'add' ? '+ ' : line.kind === 'del' ? '- ' : ' '}\n {truncate(sanitizeTerminalText(line.text), 110)}\n </Text>\n ))}\n {hidden > 0 && <Text dimColor> … {hidden} more lines</Text>}\n </Box>\n )\n}\n","export interface DiffLine {\n kind: 'add' | 'del' | 'ctx'\n text: string\n}\n\nexport interface DiffResult {\n hunk: DiffLine[]\n hidden: number\n \n added: number\n \n removed: number\n}\n\nexport const MAX_RENDER_DIFF_CHARS = 500_000\n\nexport function canRenderDiff(before: string, after: string): boolean {\n return before.length + after.length <= MAX_RENDER_DIFF_CHARS\n}\n\nexport function diffLines(\n before: string,\n after: string,\n maxLines = 20,\n): DiffResult {\n const { added, removed, hunk } = diffBody(before, after)\n if (hunk.length <= maxLines) return { hunk, hidden: 0, added, removed }\n return { hunk: hunk.slice(0, maxLines), hidden: hunk.length - maxLines, added, removed }\n}\n\nexport function diffCounts(\n before: string,\n after: string,\n): { added: number; removed: number } {\n return diffBody(before, after)\n}\n\nfunction diffBody(\n before: string,\n after: string,\n): { added: number; removed: number; hunk: DiffLine[] } {\n const a = before === '' ? [] : before.split('\\n')\n const b = after === '' ? [] : after.split('\\n')\n\n let start = 0\n while (start < a.length && start < b.length && a[start] === b[start]) start += 1\n\n let endA = a.length\n let endB = b.length\n while (endA > start && endB > start && a[endA - 1] === b[endB - 1]) {\n endA -= 1\n endB -= 1\n }\n\n const hunk: DiffLine[] = []\n let added = 0\n let removed = 0\n for (let i = Math.max(0, start - 2); i < start; i += 1) {\n hunk.push({ kind: 'ctx', text: a[i] ?? '' })\n }\n for (let i = start; i < endA; i += 1) {\n hunk.push({ kind: 'del', text: a[i] ?? '' })\n removed += 1\n }\n for (let i = start; i < endB; i += 1) {\n hunk.push({ kind: 'add', text: b[i] ?? '' })\n added += 1\n }\n for (let i = endA; i < Math.min(a.length, endA + 2); i += 1) {\n hunk.push({ kind: 'ctx', text: a[i] ?? '' })\n }\n return { added, removed, hunk }\n}\n\nexport function truncate(text: string, width: number): string {\n return text.length <= width ? text : `${text.slice(0, width - 1)}…`\n}\n","import { Box, Text } from 'ink'\nimport { useMemo, useState } from 'react'\nimport { truncate } from '../diff'\nimport { useStrings } from '../i18n'\nimport { useTerminalInput } from '../input'\nimport { useTheme } from '../theme'\nimport { sanitizeTerminalText } from '../sanitize'\nimport type { PickerProps } from '../types'\n\nconst WINDOW = 10\n\nexport function Picker({ title, items, onSelect, onCancel }: PickerProps) {\n const theme = useTheme()\n const strings = useStrings()\n const [query, setQuery] = useState('')\n const [cursor, setCursor] = useState(0)\n\n const matches = useMemo(() => {\n const needle = query.toLowerCase()\n if (needle === '') return items\n return items.filter((item) =>\n `${item.label} ${item.hint ?? ''}`.toLowerCase().includes(needle),\n )\n }, [items, query])\n\n const active = Math.min(cursor, Math.max(0, matches.length - 1))\n\n useTerminalInput((char, key) => {\n if (key.escape) return onCancel()\n if (key.return) {\n const chosen = matches[active]\n return chosen ? onSelect(chosen.key) : onCancel()\n }\n if (key.upArrow) return setCursor(Math.max(0, active - 1))\n if (key.downArrow) return setCursor(Math.min(matches.length - 1, active + 1))\n if (key.backspace || key.delete) {\n setCursor(0)\n return setQuery((q) => q.slice(0, -1))\n }\n if (char && !key.ctrl && !key.meta) {\n setCursor(0)\n setQuery((q) => sanitizeTerminalText(q + char))\n }\n })\n\n const start = Math.max(0, Math.min(active - WINDOW + 2, matches.length - WINDOW))\n const visible = matches.slice(start, start + WINDOW)\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.accent} paddingX={1}>\n <Text bold color={theme.accent}>\n {sanitizeTerminalText(title)}\n {query !== '' && <Text dimColor> / {sanitizeTerminalText(query)}</Text>}\n </Text>\n\n {matches.length === 0 ? (\n <Text dimColor>{strings.noMatches}</Text>\n ) : (\n visible.map((item, index) => {\n const selected = start + index === active\n return (\n <Text key={item.key} color={selected ? theme.accent : undefined} inverse={selected}>\n {truncate(sanitizeTerminalText(item.label), 70)}\n {item.hint && (\n <Text dimColor> {truncate(sanitizeTerminalText(item.hint), 34)}</Text>\n )}\n </Text>\n )\n })\n )}\n\n <Text dimColor>\n {strings.pickerHelp(matches.length, items.length)}\n </Text>\n </Box>\n )\n}\n","import { Box, Text } from 'ink'\nimport type { Key } from 'ink'\nimport { memo, useEffect, useRef, useState } from 'react'\nimport { looksLikeAttachmentPath } from '../../core/attachments'\nimport { matchCommands } from '../commands'\nimport { moveInputHistory } from '../history'\nimport { useStrings } from '../i18n'\nimport { useTerminalInput, useTerminalPaste } from '../input'\nimport { useTheme } from '../theme'\nimport { sanitizeTerminalText } from '../sanitize'\nimport type { PromptInputProps } from '../types'\n\nconst WINDOW = 6\n\nexport const PromptInput = memo(function PromptInput({\n value,\n onChange,\n onSubmit,\n onPastePath,\n onPasteImage,\n disabled,\n pending,\n hint,\n history,\n attachments = [],\n}: PromptInputProps) {\n const theme = useTheme()\n const strings = useStrings()\n const safeValue = sanitizeTerminalText(value)\n const [selectionCursor, setSelectionCursor] = useState(0)\n const [inputCursor, setInputCursor] = useState(() => characters(safeValue).length)\n const [historyIndex, setHistoryIndex] = useState<number | null>(null)\n const historyDraft = useRef('')\n const pendingValue = useRef<string | null>(null)\n const valueRef = useRef(safeValue)\n const cursorRef = useRef(inputCursor)\n valueRef.current = safeValue\n cursorRef.current = inputCursor\n\n const suggestions = matchCommands(safeValue)\n const open = suggestions.length > 0\n const active = Math.min(selectionCursor, Math.max(0, suggestions.length - 1))\n\n useEffect(() => {\n setSelectionCursor(0)\n }, [safeValue])\n\n useEffect(() => {\n const length = characters(safeValue).length\n if (pendingValue.current === safeValue) {\n pendingValue.current = null\n setInputCursor((cursor) => clamp(cursor, 0, length))\n return\n }\n \n \n setInputCursor(length)\n }, [safeValue])\n\n const change = (next: string, cursor = characters(next).length) => {\n next = sanitizeTerminalText(next)\n const nextCursor = clamp(cursor, 0, characters(next).length)\n pendingValue.current = next\n valueRef.current = next\n cursorRef.current = nextCursor\n setInputCursor(nextCursor)\n setHistoryIndex(null)\n historyDraft.current = next\n onChange(next)\n }\n\n const submit = (next: string) => {\n setHistoryIndex(null)\n historyDraft.current = ''\n onSubmit(next)\n }\n\n const insertPastedText = (pasted: string) => {\n const inserted = characters(sanitizeTerminalText(pasted))\n if (inserted.length === 0) return\n const valueCharacters = characters(valueRef.current)\n const cursor = clamp(cursorRef.current, 0, valueCharacters.length)\n valueCharacters.splice(cursor, 0, ...inserted)\n change(valueCharacters.join(''), cursor + inserted.length)\n }\n\n useTerminalPaste((pasted) => {\n const safePaste = sanitizeTerminalText(pasted)\n if (onPastePath && looksLikeAttachmentPath(safePaste)) {\n void onPastePath(safePaste).then((consumed) => {\n if (!consumed) insertPastedText(safePaste)\n })\n return\n }\n insertPastedText(safePaste)\n })\n\n useTerminalInput((input, key) => {\n if (\n onPasteImage &&\n (key.ctrl || key.meta || key.super) &&\n (input.toLowerCase() === 'v' || input === '\\u0016')\n ) {\n onPasteImage()\n return\n }\n if (open && key.upArrow) {\n setSelectionCursor(Math.max(0, active - 1))\n return\n }\n if (open && key.downArrow) {\n setSelectionCursor(Math.min(suggestions.length - 1, active + 1))\n return\n }\n if (open && key.tab && !key.shift) {\n const chosen = suggestions[active]\n if (chosen) change(`/${chosen.name} `)\n return\n }\n if (open && key.return) {\n const chosen = suggestions[active]\n if (chosen) submit(`/${chosen.name}`)\n return\n }\n\n if (!open && (key.upArrow || key.downArrow)) {\n const moved = moveInputHistory(\n history,\n historyIndex,\n safeValue,\n historyDraft.current,\n key.upArrow ? 'previous' : 'next',\n )\n historyDraft.current = moved.draft\n setHistoryIndex(moved.index)\n setInputCursor(characters(moved.value).length)\n if (moved.value !== safeValue) {\n pendingValue.current = moved.value\n onChange(moved.value)\n }\n return\n }\n\n if (key.tab || key.upArrow || key.downArrow || key.escape || key.pageUp || key.pageDown) {\n return\n }\n if (key.return) {\n submit(safeValue)\n return\n }\n\n const valueCharacters = characters(safeValue)\n const cursor = clamp(inputCursor, 0, valueCharacters.length)\n if (key.leftArrow || key.rightArrow || key.home || key.end) {\n setInputCursor(nextCursor(cursor, valueCharacters.length, key))\n return\n }\n if (key.backspace) {\n if (cursor > 0) {\n valueCharacters.splice(cursor - 1, 1)\n change(valueCharacters.join(''), cursor - 1)\n }\n return\n }\n if (key.delete) {\n if (cursor < valueCharacters.length) {\n valueCharacters.splice(cursor, 1)\n change(valueCharacters.join(''), cursor)\n }\n return\n }\n if (input === '' || key.ctrl || key.meta) return\n\n const inserted = characters(sanitizeTerminalText(input))\n if (inserted.length === 0) return\n valueCharacters.splice(cursor, 0, ...inserted)\n change(valueCharacters.join(''), cursor + inserted.length)\n })\n\n const start = Math.max(0, Math.min(active - WINDOW + 2, suggestions.length - WINDOW))\n const visible = suggestions.slice(start, start + WINDOW)\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box\n width=\"100%\"\n borderStyle=\"round\"\n borderColor={disabled ? theme.warn : theme.accent}\n borderDimColor={disabled}\n paddingX={1}\n >\n <Text color={disabled ? 'gray' : theme.accent}>› </Text>\n {}\n <EditableText value={safeValue} cursor={inputCursor} placeholder={strings.placeholder} />\n {pending && pending > 0 ? <Text dimColor> · {strings.queued(pending)}</Text> : null}\n </Box>\n\n {attachments.length > 0 && (\n <Text dimColor>\n {' '}📎 {attachments.map(sanitizeTerminalText).join(' · ')}\n </Text>\n )}\n\n {disabled && hint && <Text dimColor> {sanitizeTerminalText(hint)}</Text>}\n\n {open && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {visible.map((command, index) => {\n const selected = start + index === active\n return (\n <Text key={command.name} color={selected ? theme.accent : undefined} dimColor={!selected}>\n {selected ? '❯ ' : ' '}/{command.name}\n {command.args ? ` ${command.args}` : ''}\n <Text dimColor> — {strings.cmd[command.name] ?? ''}</Text>\n </Text>\n )\n })}\n {suggestions.length > visible.length && (\n <Text dimColor>{strings.more(suggestions.length - visible.length)}</Text>\n )}\n <Text dimColor>{strings.suggestHelp}</Text>\n </Box>\n )}\n </Box>\n )\n})\n\nfunction EditableText({\n value,\n cursor,\n placeholder,\n}: {\n value: string\n cursor: number\n placeholder: string\n}) {\n const valueCharacters = characters(value)\n const at = clamp(cursor, 0, valueCharacters.length)\n if (valueCharacters.length === 0) {\n const placeholderCharacters = characters(sanitizeTerminalText(placeholder))\n return (\n <Text>\n <Text inverse>{placeholderCharacters[0] ?? ' '}</Text>\n <Text color=\"gray\">{placeholderCharacters.slice(1).join('')}</Text>\n </Text>\n )\n }\n\n return (\n <Text>\n {valueCharacters.slice(0, at).join('')}\n <Text inverse>{valueCharacters[at] ?? ' '}</Text>\n {valueCharacters.slice(at + 1).join('')}\n </Text>\n )\n}\n\nfunction nextCursor(cursor: number, length: number, key: Key): number {\n if (key.home) return 0\n if (key.end) return length\n if (key.leftArrow) return Math.max(0, cursor - 1)\n if (key.rightArrow) return Math.min(length, cursor + 1)\n return cursor\n}\n\nfunction characters(value: string): string[] {\n return [...value]\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, max))\n}\n","export interface HistoryMove {\n index: number | null\n value: string\n draft: string\n}\n\nexport function moveInputHistory(\n history: string[],\n index: number | null,\n value: string,\n draft: string,\n direction: 'previous' | 'next',\n): HistoryMove {\n if (history.length === 0) return { index, value, draft }\n\n if (direction === 'previous') {\n const nextIndex = index === null ? history.length - 1 : Math.max(0, index - 1)\n return {\n index: nextIndex,\n value: history[nextIndex] ?? value,\n draft: index === null ? value : draft,\n }\n }\n\n if (index === null) return { index, value, draft }\n if (index < history.length - 1) {\n const nextIndex = index + 1\n return { index: nextIndex, value: history[nextIndex] ?? value, draft }\n }\n return { index: null, value: draft, draft }\n}\n\nexport function appendInputHistory(history: string[], value: string, limit = 100): string[] {\n const text = value.trim()\n if (!text || history.at(-1) === text) return history\n return [...history, text].slice(-limit)\n}\n","import { Box, Text } from 'ink'\nimport { Fragment } from 'react'\nimport type { ReactNode } from 'react'\nimport { dollars } from '../../core/usage'\nimport type { Effort } from '../../providers/types'\nimport { useStrings } from '../i18n'\nimport { useTheme } from '../theme'\nimport { formatDuration } from '../time'\nimport { sanitizeTerminalText } from '../sanitize'\nimport type { StatusBarProps } from '../types'\n\nconst BAR_WIDTH = 12\n\nexport function StatusBar({ status }: StatusBarProps) {\n const theme = useTheme()\n const strings = useStrings()\n\n const primary: ReactNode[] = []\n const details: ReactNode[] = []\n\n primary.push(<ModelBadge key=\"model\" ref={status.modelRef} />)\n primary.push(<EffortLabel key=\"effort\" effort={status.effort} />)\n if (!status.thinking) {\n details.push(\n <Text key=\"think\" color={theme.warn}>\n {strings.noThink}\n </Text>,\n )\n }\n if (status.mode !== 'normal') {\n const modeColor = status.mode === 'accept' ? 'yellow' : status.mode === 'plan' ? 'blue' : theme.accent\n details.push(\n <Text key=\"mode\" color={modeColor}>\n {strings.modeLabel[status.mode] ?? status.mode}\n </Text>,\n )\n }\n\n if (status.usage) {\n const u = status.usage\n details.push(\n <Text key=\"usage\">\n <Text color=\"white\" bold>{u.input}</Text>\n <Text dimColor> ↑ </Text>\n <Text color={theme.ok}>{u.output}</Text>\n <Text dimColor> ↓</Text>\n {u.cache && (\n <>\n <Text dimColor> (</Text>\n <Text color=\"gray\">{u.cache} cache</Text>\n <Text dimColor>)</Text>\n </>\n )}\n {u.costUsd !== null && u.costUsd > 0 && (\n <>\n <Text dimColor> · </Text>\n <Text color={theme.warn} bold>\n {dollars(u.costUsd)}\n </Text>\n </>\n )}\n </Text>,\n )\n }\n\n details.push(\n <Text\n key=\"elapsed\"\n color={status.turnMs !== null ? theme.accent : undefined}\n bold={status.turnMs !== null}\n >\n {status.turnMs === null\n ? strings.sessionFor(formatDuration(status.sessionMs))\n : `${strings.working} ${formatDuration(status.turnMs)}`}\n </Text>,\n )\n\n if (status.bypass) {\n details.push(\n <Text key=\"bypass\" color=\"black\" backgroundColor={theme.warn} bold>\n {' '}BYPASS{' '}\n </Text>,\n )\n }\n\n return (\n <Box\n width=\"100%\"\n marginTop={1}\n paddingX={1}\n borderStyle=\"single\"\n borderTop\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderColor={theme.accent}\n borderDimColor\n alignItems=\"flex-start\"\n flexDirection=\"column\"\n >\n <Box width=\"100%\" alignItems=\"flex-start\">\n <Box flexGrow={1} flexShrink={1} flexWrap=\"wrap\">\n <Segments items={primary} />\n </Box>\n <Box\n flexShrink={0}\n marginLeft={2}\n flexDirection=\"column\"\n alignItems=\"flex-end\"\n >\n <ContextMeter context={status.context} />\n {(status.mcp.connected > 0 || status.mcp.failed > 0) && (\n <Text>\n {status.mcp.connected > 0 && (\n <Text color={theme.ok}>mcp:{status.mcp.connected}</Text>\n )}\n {status.mcp.connected > 0 && status.mcp.failed > 0 && (\n <Text dimColor> · </Text>\n )}\n {status.mcp.failed > 0 && (\n <Text color={theme.error}>{strings.mcpFailed(status.mcp.failed)}</Text>\n )}\n </Text>\n )}\n {status.activeAgents > 0 && (\n <Text color={theme.accent}>{strings.activeAgents(status.activeAgents)}</Text>\n )}\n </Box>\n </Box>\n {details.length > 0 && (\n <Box flexWrap=\"wrap\">\n <Segments items={details} />\n </Box>\n )}\n </Box>\n )\n}\n\nfunction Segments({ items }: { items: ReactNode[] }) {\n return items.flatMap((item, index) => {\n const elements: ReactNode[] = []\n if (index > 0) {\n elements.push(\n <Text key={`sep-${index}`} dimColor>\n {' '}·{' '}\n </Text>,\n )\n }\n elements.push(<Fragment key={`item-${index}`}>{item}</Fragment>)\n return elements\n })\n}\n\nfunction shortModel(ref: string): string {\n const safe = sanitizeTerminalText(ref)\n const slash = safe.lastIndexOf('/')\n return slash === -1 ? safe : safe.slice(slash + 1)\n}\n\nfunction ModelBadge({ ref: modelRef }: { ref: string }) {\n const theme = useTheme()\n const name = shortModel(modelRef)\n return (\n <Box borderColor={theme.accent} borderStyle=\"round\" paddingX={1}>\n <Text color={theme.accent} bold>{name}</Text>\n </Box>\n )\n}\n\nconst EFFORT_STYLES: Record<\n Effort,\n { label: string; color?: string; bold?: boolean; dim?: boolean }\n> = {\n max: { label: 'max', color: 'red', bold: true },\n xhigh: { label: 'xhigh', color: 'yellow', bold: true },\n high: { label: 'high', color: 'cyan' },\n medium: { label: 'medium', color: 'blue' },\n low: { label: 'low', color: 'gray', dim: true },\n}\n\nfunction EffortLabel({ effort }: { effort: Effort }) {\n const style = EFFORT_STYLES[effort]\n return (\n <Box borderColor={style.color ?? 'gray'} borderStyle=\"round\" paddingX={1}>\n <Text\n color={style.color}\n bold={style.bold}\n dimColor={style.dim}\n >\n {style.label}\n </Text>\n </Box>\n )\n}\n\nfunction tokens(count: number): string {\n if (count < 1000) return String(count)\n const [value, suffix] = count < 1_000_000 ? [count / 1000, 'k'] : [count / 1_000_000, 'M']\n return `${value.toFixed(1).replace(/\\.0$/, '')}${suffix}`\n}\n\nfunction ContextMeter({\n context,\n}: {\n context: { window: number | null; used: number; exact: boolean }\n}) {\n const theme = useTheme()\n const { window: win, used, exact } = context\n if (!exact || win === null || win <= 0) {\n return (\n <Text>\n <Text dimColor>ctx </Text>\n <Text color=\"gray\">{exact ? tokens(used) : '?'}</Text>\n {win && win > 0 && <Text dimColor>/{tokens(win)}</Text>}\n </Text>\n )\n }\n const pct = Math.min(Math.max(used / win, 0), 1)\n const filled = Math.max(0, Math.min(BAR_WIDTH, Math.round(BAR_WIDTH * pct)))\n\n const color = pct < 0.6 ? theme.ok : pct < 0.85 ? theme.warn : theme.error\n const percent = Math.round(pct * 100)\n\n return (\n <Text>\n <Text dimColor>ctx </Text>\n <Text color={color} bold>\n {`${percent}%`.padStart(4)}\n </Text>\n <Text color={color}> ▐{'█'.repeat(filled)}</Text>\n <Text color=\"gray\" dimColor>{'░'.repeat(BAR_WIDTH - filled)}</Text>\n <Text color={color}>▌</Text>\n <Text dimColor> {tokens(used)}/{tokens(win)}</Text>\n </Text>\n )\n}\n","export function formatDuration(ms: number): string {\n const total = Math.max(0, Math.round(ms / 1000))\n if (total < 60) return `${total}s`\n\n const minutes = Math.floor(total / 60)\n const seconds = total % 60\n if (minutes < 60) return `${minutes}m${String(seconds).padStart(2, '0')}s`\n\n const hours = Math.floor(minutes / 60)\n return `${hours}h${String(minutes % 60).padStart(2, '0')}m`\n}\n","import { Box, Static, Text } from 'ink'\nimport { memo, useMemo, useRef } from 'react'\nimport type { ReactNode } from 'react'\nimport Spinner from 'ink-spinner'\nimport { diffLines, truncate } from '../diff'\nimport { Markdown } from '../markdown'\nimport { useTheme } from '../theme'\nimport type { Bubble, TranscriptProps } from '../types'\nimport { DiffHunk } from './Diff'\nimport { Logo } from './Logo'\n\nconst HEADER = { kind: 'header' } as const\ntype StaticTranscriptItem = typeof HEADER | Bubble\n\nexport const Transcript = memo(function Transcript({ bubbles, workspace }: TranscriptProps) {\n const liveAt = bubbles.findLastIndex(\n (bubble) =>\n (bubble.kind === 'assistant' && bubble.streaming) ||\n (bubble.kind === 'tool' && bubble.state === 'running'),\n )\n const stableCount = liveAt === -1 ? bubbles.length : liveAt\n const stableRef = useRef<Bubble[]>([])\n if (stableRef.current.length < stableCount) {\n stableRef.current = [\n ...stableRef.current,\n ...bubbles.slice(stableRef.current.length, stableCount),\n ]\n } else if (stableRef.current.length > stableCount) {\n stableRef.current = bubbles.slice(0, stableCount)\n }\n const stable = stableRef.current\n const live = liveAt === -1 ? [] : bubbles.slice(liveAt)\n const staticItems: StaticTranscriptItem[] = [HEADER, ...stable]\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n {}\n <Static items={staticItems}>\n {(item) =>\n item.kind === 'header' ? (\n <Logo key=\"kitcode-header\" workspace={workspace} />\n ) : (\n <BubbleView key={item.id} bubble={item} />\n )\n }\n </Static>\n {live.map((bubble) => (\n <BubbleView key={bubble.id} bubble={bubble} />\n ))}\n </Box>\n )\n})\n\nconst BubbleView = memo(function BubbleView({ bubble }: { bubble: Bubble }) {\n const theme = useTheme()\n\n if (bubble.kind === 'user') {\n return (\n <Box marginTop={1}>\n <Text color={theme.accent} bold>\n › {bubble.text}\n </Text>\n </Box>\n )\n }\n\n if (bubble.kind === 'notice') {\n const color =\n bubble.level === 'error' ? theme.error : bubble.level === 'warn' ? theme.warn : theme.accent\n return (\n <Box marginTop={1}>\n <Text color={color}>{bubble.text}</Text>\n </Box>\n )\n }\n\n if (bubble.kind === 'assistant') {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {bubble.thinking.trim() !== '' && (\n <Text dimColor italic>\n {bubble.thinking.trim()}\n </Text>\n )}\n {bubble.streaming ? <Text>{bubble.text}</Text> : <Markdown>{bubble.text}</Markdown>}\n {bubble.streaming && bubble.text === '' && (\n <Text dimColor>\n <Spinner type=\"dots\" /> thinking\n </Text>\n )}\n </Box>\n )\n }\n\n if (bubble.kind === 'subagent') {\n return <SubagentView bubble={bubble} />\n }\n\n return <ToolView bubble={bubble} />\n})\n\nfunction ToolView({ bubble }: { bubble: Extract<Bubble, { kind: 'tool' }> }) {\n const theme = useTheme()\n const mark = bubble.state === 'running' ? '◌' : bubble.state === 'ok' ? '●' : '✗'\n const color =\n bubble.state === 'error' ? theme.error : bubble.state === 'ok' ? theme.ok : theme.warn\n const display = bubble.display\n const diff = useMemo(\n () => (display?.kind === 'diff' ? diffLines(display.before, display.after) : null),\n [display],\n )\n if (!diff) return <NonDiffToolView bubble={bubble} mark={mark} color={color} />\n const hasChanges = diff.added > 0 || diff.removed > 0\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={color}>\n {mark} {bubble.summary}\n {hasChanges && (\n <>\n {diff.added > 0 && <Text color={theme.ok} bold>{` +${diff.added}`}</Text>}\n {diff.removed > 0 && <Text color={theme.error} bold>{` -${diff.removed}`}</Text>}\n </>\n )}\n </Text>\n <Box marginLeft={2}>\n <DiffHunk lines={diff.hunk} hidden={diff.hidden} />\n </Box>\n </Box>\n )\n}\n\nfunction NonDiffToolView({\n bubble,\n mark,\n color,\n}: {\n bubble: Extract<Bubble, { kind: 'tool' }>\n mark: string\n color: string\n}) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={color}>\n {mark} {bubble.summary}\n </Text>\n {bubble.state !== 'running' &&\n bubble.content.trim() !== '' && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {previewLines(bubble.content).map((line, index) => (\n <Text key={index} dimColor>\n {truncate(line, 110)}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n )\n}\n\nfunction previewLines(content: string): string[] {\n const lines = content.split('\\n').filter((line) => line.trim() !== '')\n if (lines.length <= 6) return lines\n return [...lines.slice(0, 6), `… ${lines.length - 6} more lines`]\n}\n\nfunction SubagentView({ bubble }: { bubble: Extract<Bubble, { kind: 'subagent' }> }) {\n const theme = useTheme()\n const mark = bubble.state === 'running' ? '◌' : '●'\n const color = bubble.state === 'running' ? theme.warn : theme.ok\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={color} bold>\n {mark} subagent: {bubble.description}\n </Text>\n <Box marginLeft={2} flexDirection=\"column\">\n {bubble.bubbles.map((inner, index) => (\n <BubbleView key={index} bubble={inner} />\n ))}\n {bubble.state === 'done' && bubble.result && (\n <Box marginTop={1}>\n <Text dimColor>── result ──</Text>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n","import { Box, Text } from 'ink'\nimport { useMemo } from 'react'\nimport type { ReactNode } from 'react'\n\ninterface MdNode {\n type: 'heading' | 'paragraph' | 'blockquote' | 'ul' | 'ol'\n level?: number\n items?: string[]\n text?: string\n}\n\nexport function Markdown({ children }: { children: string }): ReactNode {\n const blocks = useMemo(() => extractBlocks(children), [children])\n return (\n <Box flexDirection=\"column\">\n {blocks.map((block, i) => (\n <BlockView key={i} block={block} />\n ))}\n </Box>\n )\n}\n\nfunction BlockView({ block }: { block: MdNode }): ReactNode {\n switch (block.type) {\n case 'heading': {\n const sizes = [22, 20, 18, 16, 14, 13]\n const size = sizes[(block.level ?? 1) - 1] ?? 14\n return (\n <Box marginTop={block.level === 1 ? 1 : 0}>\n <Text bold>{truncateBySize(block.text ?? '', size)}</Text>\n </Box>\n )\n }\n case 'blockquote':\n return (\n <Box marginLeft={2}>\n <Text dimColor>│ {block.text}</Text>\n </Box>\n )\n case 'ul':\n return (\n <Box flexDirection=\"column\">\n {(block.items ?? []).map((item, i) => (\n <Box key={i}>\n <Text dimColor>• </Text>\n <Text>{inline(item)}</Text>\n </Box>\n ))}\n </Box>\n )\n case 'ol':\n return (\n <Box flexDirection=\"column\">\n {(block.items ?? []).map((item, i) => (\n <Box key={i}>\n <Text dimColor>{`${i + 1}. `}</Text>\n <Text>{inline(item)}</Text>\n </Box>\n ))}\n </Box>\n )\n case 'paragraph':\n default:\n return <Text>{inline(block.text ?? '')}</Text>\n }\n}\n\nfunction truncateBySize(text: string, size: number): string {\n return text.length > size * 3 ? text.slice(0, size * 3) + '…' : text\n}\n\nconst HEADING_RE = /^(#{1,6})\\s+(.*)$/\nconst UL_RE = /^([-*+])\\s+(.*)$/\nconst OL_RE = /^(\\d+)\\.\\s+(.*)$/\nconst QUOTE_RE = /^>\\s?(.*)$/\n\nexport function extractBlocks(src: string): MdNode[] {\n const lines = src.replace(/\\r\\n/g, '\\n').split('\\n')\n const blocks: MdNode[] = []\n let paragraph: string[] = []\n let list: { ordered: boolean; items: string[] } | null = null\n let quote: string[] = []\n\n const flushParagraph = () => {\n if (paragraph.length) {\n blocks.push({ type: 'paragraph', text: paragraph.join(' ').trim() })\n paragraph = []\n }\n }\n const flushList = () => {\n if (list) {\n blocks.push({ type: list.ordered ? 'ol' : 'ul', items: list.items })\n list = null\n }\n }\n const flushQuote = () => {\n if (quote.length) {\n blocks.push({ type: 'blockquote', text: quote.join('\\n') })\n quote = []\n }\n }\n const flushAll = () => {\n flushParagraph()\n flushList()\n flushQuote()\n }\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n if (trimmed === '') {\n flushAll()\n continue\n }\n\n const heading = trimmed.match(HEADING_RE)\n if (heading) {\n flushAll()\n blocks.push({ type: 'heading', level: heading[1].length, text: heading[2].trim() })\n continue\n }\n\n const quoteMatch = trimmed.match(QUOTE_RE)\n if (quoteMatch) {\n flushParagraph()\n flushList()\n quote.push(quoteMatch[1])\n continue\n }\n\n const ulMatch = trimmed.match(UL_RE)\n if (ulMatch) {\n flushParagraph()\n flushQuote()\n if (!list || list.ordered) {\n flushList()\n list = { ordered: false, items: [] }\n }\n list.items.push(ulMatch[2].trim())\n continue\n }\n\n const olMatch = trimmed.match(OL_RE)\n if (olMatch) {\n flushParagraph()\n flushQuote()\n if (!list || !list.ordered) {\n flushList()\n list = { ordered: true, items: [] }\n }\n list.items.push(olMatch[2].trim())\n continue\n }\n\n \n flushList()\n flushQuote()\n paragraph.push(trimmed)\n }\n\n flushAll()\n return blocks\n}\n\nfunction inline(text: string): ReactNode {\n const nodes: ReactNode[] = []\n let rest = text\n let key = 0\n\n const RE =\n /(`+)([^`]+?)\\1|(\\*\\*)(.+?)\\2|(~~)(.+?)\\4|(\\*)(.+?)\\6|(__)(.+?)\\8/\n\n while (rest.length > 0) {\n const m = rest.match(RE)\n if (!m) {\n nodes.push(rest)\n break\n }\n const idx = m.index ?? 0\n if (idx > 0) nodes.push(rest.slice(0, idx))\n\n if (m[1]) {\n \n nodes.push(\n <Text key={key++} bold color=\"cyan\">\n {m[2]}\n </Text>,\n )\n } else if (m[3]) {\n \n nodes.push(\n <Text key={key++} bold>\n {inline(m[4] as string)}\n </Text>,\n )\n } else if (m[5]) {\n \n nodes.push(\n <Text key={key++} strikethrough>\n {m[6]}\n </Text>,\n )\n } else if (m[7]) {\n \n nodes.push(\n <Text key={key++} italic>\n {inline(m[8] as string)}\n </Text>,\n )\n } else if (m[9]) {\n \n nodes.push(\n <Text key={key++} bold>\n {inline(m[10] as string)}\n </Text>,\n )\n }\n\n rest = rest.slice(idx + m[0].length)\n }\n\n return nodes.length === 1 ? nodes[0] : nodes\n}\n","import type { AgentEvent } from '../core/types'\nimport type { Message } from '../providers/types'\nimport { attachmentLabel } from '../core/attachments'\nimport type { ToolDisplay } from '../tools/types'\nimport type { Bubble } from './types'\nimport { canRenderDiff, MAX_RENDER_DIFF_CHARS } from './diff'\nimport { sanitizeTerminalText } from './sanitize'\n\nexport interface TranscriptState {\n bubbles: Bubble[]\n seq: number\n}\n\nexport function emptyTranscript(): TranscriptState {\n return { bubbles: [], seq: 0 }\n}\n\nexport function pushUser(state: TranscriptState, text: string): TranscriptState {\n const id = `u${state.seq}`\n return {\n bubbles: [...state.bubbles, { kind: 'user', id, text: sanitizeTerminalText(text) }],\n seq: state.seq + 1,\n }\n}\n\nexport function pushNotice(\n state: TranscriptState,\n level: 'info' | 'warn' | 'error',\n text: string,\n): TranscriptState {\n const id = `n${state.seq}`\n return {\n bubbles: [...state.bubbles, { kind: 'notice', id, level, text: sanitizeTerminalText(text) }],\n seq: state.seq + 1,\n }\n}\n\nexport function applyEvent(state: TranscriptState, event: AgentEvent): TranscriptState {\n switch (event.type) {\n case 'text_delta':\n return appendToAssistant(state, (bubble) => ({\n ...bubble,\n text: bubble.text + sanitizeTerminalText(event.text),\n }))\n\n case 'thinking_delta':\n return appendToAssistant(state, (bubble) => ({\n ...bubble,\n thinking: bubble.thinking + sanitizeTerminalText(event.text),\n }))\n\n case 'tool_start':\n return {\n bubbles: [\n ...closeAssistant(state.bubbles),\n {\n kind: 'tool',\n id: event.id,\n name: sanitizeTerminalText(event.name),\n summary: sanitizeTerminalText(event.summary),\n state: 'running',\n content: '',\n },\n ],\n seq: state.seq + 1,\n }\n\n case 'tool_end':\n return {\n ...state,\n bubbles: state.bubbles.map((bubble) =>\n bubble.kind === 'tool' && bubble.id === event.id\n ? {\n ...bubble,\n state: event.isError ? 'error' : 'ok',\n content: sanitizeTerminalText(event.content),\n display: sanitizeDisplay(event.display),\n }\n : bubble,\n ),\n }\n\n case 'subagent_start':\n return {\n bubbles: [\n ...closeAssistant(state.bubbles),\n {\n kind: 'subagent',\n id: event.id,\n description: sanitizeTerminalText(event.description),\n state: 'running',\n seq: 0,\n bubbles: [],\n },\n ],\n seq: state.seq + 1,\n }\n\n case 'subagent_end':\n return {\n ...state,\n bubbles: state.bubbles.map((bubble) =>\n bubble.kind === 'subagent' && bubble.id === event.id\n ? { ...bubble, state: 'done', result: sanitizeTerminalText(event.result) }\n : bubble,\n ),\n }\n\n case 'subagent_event': {\n const idx = state.bubbles.findLastIndex(\n (b) => b.kind === 'subagent' && b.id === event.id,\n )\n if (idx === -1) return state\n const sub = state.bubbles[idx] as Extract<typeof state.bubbles[number], { kind: 'subagent' }>\n const innerState: TranscriptState = { bubbles: sub.bubbles, seq: sub.seq }\n const updated = applyEvent(innerState, event.event)\n return {\n ...state,\n bubbles: state.bubbles.map((bubble, i) =>\n i === idx\n ? { ...sub, seq: updated.seq, bubbles: updated.bubbles }\n : bubble,\n ),\n }\n }\n\n case 'notice':\n return pushNotice(state, event.level, event.text)\n\n case 'turn_end':\n return { ...state, bubbles: closeAssistant(state.bubbles) }\n\n case 'turn_start':\n case 'usage':\n case 'rate_limits':\n return state\n }\n}\n\nexport function applyEvents(state: TranscriptState, events: AgentEvent[]): TranscriptState {\n return coalesceDeltas(events).reduce(applyEvent, state)\n}\n\nfunction coalesceDeltas(events: AgentEvent[]): AgentEvent[] {\n const out: AgentEvent[] = []\n for (const event of events) {\n const previous = out.at(-1)\n if (event.type === 'text_delta' && previous?.type === 'text_delta') {\n out[out.length - 1] = { type: 'text_delta', text: previous.text + event.text }\n } else if (event.type === 'thinking_delta' && previous?.type === 'thinking_delta') {\n out[out.length - 1] = { type: 'thinking_delta', text: previous.text + event.text }\n } else {\n out.push(event)\n }\n }\n return out\n}\n\nfunction appendToAssistant(\n state: TranscriptState,\n update: (bubble: Extract<Bubble, { kind: 'assistant' }>) => Bubble,\n): TranscriptState {\n const last = state.bubbles.at(-1)\n if (last?.kind === 'assistant' && last.streaming) {\n return { ...state, bubbles: [...state.bubbles.slice(0, -1), update(last)] }\n }\n const fresh: Extract<Bubble, { kind: 'assistant' }> = {\n kind: 'assistant',\n id: `a${state.seq}`,\n text: '',\n thinking: '',\n streaming: true,\n }\n return { bubbles: [...state.bubbles, update(fresh)], seq: state.seq + 1 }\n}\n\nfunction closeAssistant(bubbles: Bubble[]): Bubble[] {\n if (!bubbles.some((bubble) => bubble.kind === 'assistant' && bubble.streaming)) return bubbles\n return bubbles.map((bubble) =>\n bubble.kind === 'assistant' && bubble.streaming ? { ...bubble, streaming: false } : bubble,\n )\n}\n\nexport function fromHistory(messages: Message[]): TranscriptState {\n let state = emptyTranscript()\n\n for (const message of messages) {\n if (message.role === 'user') {\n const displayed = message.content\n .flatMap((block) => {\n if (block.type === 'text') return [block.text]\n const label = attachmentLabel(block)\n return label ? [`📎 ${label}`] : []\n })\n .map((value) => sanitizeTerminalText(value).trim())\n .filter(Boolean)\n .join('\\n')\n if (displayed) state = pushUser(state, displayed)\n }\n for (const block of message.content) {\n if (block.type === 'text') {\n if (message.role === 'user') continue\n const text = sanitizeTerminalText(block.text).trim()\n if (text === '') continue\n state =\n {\n bubbles: [\n ...state.bubbles,\n { kind: 'assistant', id: `a${state.seq}`, text, thinking: '', streaming: false },\n ],\n seq: state.seq + 1,\n }\n } else if (block.type === 'tool_use') {\n state = {\n bubbles: [\n ...state.bubbles,\n {\n kind: 'tool',\n id: block.id,\n name: sanitizeTerminalText(block.name),\n summary: sanitizeTerminalText(block.name),\n state: 'ok',\n content: '',\n },\n ],\n seq: state.seq + 1,\n }\n } else if (block.type === 'tool_result') {\n state = {\n ...state,\n bubbles: state.bubbles.map((bubble) =>\n bubble.kind === 'tool' && bubble.id === block.toolUseId\n ? {\n ...bubble,\n state: block.isError ? 'error' : 'ok',\n content: sanitizeTerminalText(block.content),\n }\n : bubble,\n ),\n }\n } else if ((block.type === 'image' || block.type === 'file') && message.role === 'assistant') {\n const label = attachmentLabel(block)\n if (label) {\n state = {\n bubbles: [\n ...state.bubbles,\n {\n kind: 'assistant',\n id: `a${state.seq}`,\n text: `📎 ${sanitizeTerminalText(label)}`,\n thinking: '',\n streaming: false,\n },\n ],\n seq: state.seq + 1,\n }\n }\n }\n }\n }\n\n return state\n}\n\nfunction sanitizeDisplay(display: ToolDisplay | undefined): ToolDisplay | undefined {\n if (!display) return undefined\n if (display.kind === 'text') return { ...display, text: sanitizeTerminalText(display.text) }\n if (display.kind === 'list') {\n return {\n ...display,\n title: sanitizeTerminalText(display.title),\n items: display.items.map(sanitizeTerminalText),\n }\n }\n if (!canRenderDiff(display.before, display.after)) {\n return {\n kind: 'text',\n text: `Diff for ${sanitizeTerminalText(display.path)} omitted from the transcript because it exceeds ${MAX_RENDER_DIFF_CHARS.toLocaleString()} characters.`,\n }\n }\n return {\n ...display,\n path: sanitizeTerminalText(display.path),\n before: sanitizeTerminalText(display.before),\n after: sanitizeTerminalText(display.after),\n }\n}\n"],"mappings":"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","names":["resolve","apiKey","snippet","randomUUID","chmod","readFile","rename","rm","writeFile","path","path","path","chmod","record","readFile","path","randomUUID","writeFile","rename","rm","path","mkdir","readFile","rename","stat","writeFile","path","path","writeFile","rename","resolve","stat","readFile","field","MAX_RETRIES","resolve","characters","randomBytes","chmod","mkdir","readFile","readdir","rename","stat","unlink","writeFile","path","assertSessionId","active","path","randomBytes","unlink","readFile","mkdir","writeFile","chmod","rename","stat","readdir","readFile","stat","path","path","isFile","stat","readFile","readFile","stat","os","path","basename","resolve","first","finalText","os","initial","withTimeout","describeFailure","open","tail","record","apiKey","endpoint","path","parse","chmod","readFile","writeFile","path","path","readFile","writeFile","chmod","Anthropic","Anthropic","limits","OpenAI","OpenAI","streamTurn","listModels","toUsage","limits","toContentBlocks","resolve","readFile","stat","writeFile","MAX_FILE_BYTES","path","stat","readFile","writeFile","path","readFile","stat","join","fg","path","resolve","MAX_FILE_BYTES","path","stat","fg","join","readFile","readFile","stat","MAX_FILE_BYTES","path","stat","readFile","mkdir","readFile","stat","writeFile","dirname","MAX_FILE_BYTES","path","stat","readFile","mkdir","dirname","writeFile","chmod","readFile","readdir","unlink","writeFile","path","path","writeFile","chmod","readFile","readdir","prompts","unlink","field","readFile","readdir","stat","path","existsSync","chmod","mkdir","path","path","existsSync","skillFile","body","mkdir","chmod","randomBytes","randomBytes","MAX_RESPONSE_BYTES","PREFERRED","workspaceRoot","path","mkdir","tokens","prompts","resolve","Box","execFile","execFileSync","useEffect","useMemo","useRef","useState","first","needle","path","tokens","createContext","useContext","Box","Text","Box","Text","oneLine","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","Box","Text","useState","jsx","jsxs","useState","Box","Text","Box","Text","Box","Text","truncate","jsx","jsxs","Text","Box","truncate","jsx","jsxs","Box","Text","Box","Text","useState","jsx","jsxs","useState","active","Box","Text","truncate","Box","Text","useRef","useState","jsx","jsxs","WINDOW","PromptInput","useState","characters","useRef","open","active","nextCursor","Box","Text","Box","Text","Fragment","Fragment","jsx","jsxs","Text","Box","tokens","Box","Text","memo","useMemo","useRef","Spinner","Box","Text","useMemo","jsx","jsxs","Fragment","jsx","jsxs","memo","Transcript","useRef","Box","BubbleView","Text","Spinner","useMemo","truncate","jsx","jsxs","useState","useRef","useEffect","execFile","useMemo","active","ask","resolve","body","line","states","tokens","items","choice","Box","first","execFileSync","jsx","MODES","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/app/add.ts","../src/config/schema.ts","../src/providers/errors.ts","../src/providers/types.ts","../src/providers/model-info.ts","../src/config/detect.ts","../src/config/paths.ts","../src/config/store.ts","../src/config/trust.ts","../src/app/ask.ts","../src/ui/sanitize.ts","../src/app/runtime.ts","../src/core/session.ts","../src/core/agent.ts","../src/providers/pricing.ts","../src/core/budget.ts","../src/core/checkpoint.ts","../src/tools/safepath.ts","../src/core/diagnostics.ts","../src/tools/bash.ts","../src/tools/summary.ts","../src/core/attachments.ts","../src/core/compact.ts","../src/core/prompt.ts","../src/core/subagent.ts","../src/core/usage.ts","../src/mcp/client.ts","../src/mcp/bridge.ts","../package.json","../src/version.ts","../src/providers/balance.ts","../src/providers/catalog.ts","../src/providers/anthropic.ts","../src/providers/rate-limits.ts","../src/providers/openai-compat.ts","../src/providers/registry.ts","../src/tools/permissions.ts","../src/tools/edit.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/sensitive.ts","../src/tools/regex.ts","../src/tools/read.ts","../src/tools/types.ts","../src/tools/write.ts","../src/tools/registry.ts","../src/prompts/library.ts","../src/skills/library.ts","../src/skills/install.ts","../src/tools/skill.ts","../src/tools/task.ts","../src/core/update.ts","../src/app/configcmd.ts","../src/app/secret.ts","../src/app/tui.tsx","../src/ui/App.tsx","../src/mcp/add.ts","../src/ui/commands.ts","../src/ui/theme.ts","../src/ui/components/Confirm.tsx","../src/ui/input.ts","../src/ui/layout.ts","../src/ui/i18n.ts","../src/ui/components/LanguagePicker.tsx","../src/ui/components/Logo.tsx","../src/ui/workspace.ts","../src/ui/components/Onboarding.tsx","../src/ui/components/PermissionPrompt.tsx","../src/ui/components/Diff.tsx","../src/ui/diff.ts","../src/ui/components/Picker.tsx","../src/ui/components/PromptInput.tsx","../src/ui/history.ts","../src/ui/components/StatusBar.tsx","../src/ui/time.ts","../src/ui/components/TerminalViewport.tsx","../src/ui/components/Transcript.tsx","../src/ui/markdown.tsx","../src/ui/transcript.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { resolve } from 'node:path'\nimport type { AgentMode } from './tools/permissions'\nimport { addProvider } from './app/add'\nimport { ask } from './app/ask'\nimport { showConfig } from './app/configcmd'\nimport { readApiKey } from './app/secret'\nimport { listSessions, shortSessionId } from './core/session'\nimport { startTui } from './app/tui'\nimport { deletePrompt, listPrompts } from './prompts/library'\nimport { revokeWorkspaceTrust, trustWorkspace } from './config/trust'\nimport { KITCODE_VERSION } from './version'\n\nconst program = new Command()\n\nprogram\n .name('kitcode')\n .description('Terminal coding agent with a config you never have to write by hand')\n .version(KITCODE_VERSION)\n .option('-c, --continue', 'resume the most recent session for this directory')\n .option('-r, --resume <id>', 'reopen a past chat by id (any unique part of it works)')\n .option('--cwd <path>', 'run in this directory instead of the current one')\n .option('--model <ref>', 'start the session with this model (provider/model or model)')\n .option('--mode <mode>', 'start in this permission mode: normal | accept | plan')\n .action(async (options: { continue?: boolean; resume?: string; cwd?: string; model?: string; mode?: string }) => {\n const MODES: AgentMode[] = ['normal', 'accept', 'plan']\n if (options.mode && !MODES.includes(options.mode as AgentMode)) {\n throw new Error(`Unknown mode \"${options.mode}\". Use normal, accept or plan.`)\n }\n let cwd = options.cwd\n if (cwd) {\n try {\n cwd = resolve(cwd)\n } catch {\n \n }\n }\n await startTui({\n continueSession: options.continue,\n resumeId: options.resume,\n cwd,\n modelRef: options.model,\n mode: options.mode as AgentMode | undefined,\n })\n })\n\nprogram\n .command('trust')\n .description('trust this workspace so its project config and skills can be loaded')\n .option('--revoke', 'remove trust for this workspace')\n .action(async (options: { revoke?: boolean }) => {\n const workspace = options.revoke\n ? await revokeWorkspaceTrust(process.cwd())\n : await trustWorkspace(process.cwd())\n console.log(`${options.revoke ? 'trust removed' : 'workspace trusted'}: ${workspace}`)\n })\n\nprogram\n .command('sessions')\n .description('list past chats')\n .action(async () => {\n const entries = await listSessions(30)\n if (entries.length === 0) {\n console.log('no saved sessions')\n return\n }\n for (const entry of entries) {\n console.log(\n `${shortSessionId(entry.id)} ${entry.updatedAt.slice(0, 16).replace('T', ' ')} ` +\n `${String(entry.messageCount).padStart(3)} msgs ${entry.cwd}`,\n )\n if (entry.title) console.log(` ${entry.title}`)\n }\n console.log('\\nreopen one with: kitcode -r <id>')\n })\n\nprogram\n .command('add')\n .description('detect and add a provider; the API key is read securely')\n .argument('<url>', 'API base URL, e.g. https://openrouter.ai/api/v1')\n .option('--name <name>', 'override the derived provider id')\n .option('--local', 'write ./kitcode.json in this directory instead of the global config')\n .option('--key-env <name>', 'read the API key from this environment variable')\n .option('--key-stdin', 'read the API key from stdin')\n .action(async (\n url: string,\n options: { name?: string; local?: boolean; keyEnv?: string; keyStdin?: boolean },\n ) => {\n const key = await readApiKey(options)\n await addProvider(url, key, options)\n })\n\nprogram\n .command('ask')\n .description('run a single turn and print the answer')\n .argument('<text...>')\n .option('-y, --yes', 'approve every tool call without asking')\n .option('--mode <mode>', 'normal | accept | plan')\n .action(async (text: string[], options: { yes?: boolean; mode?: string }) => {\n const mode = options.mode\n if (mode && !(['normal', 'accept', 'plan'] as AgentMode[]).includes(mode as AgentMode)) {\n throw new Error(`Unknown mode \"${mode}\". Use normal, accept or plan.`)\n }\n await ask(text.join(' '), { yes: options.yes, mode: mode as AgentMode | undefined })\n })\n\nprogram\n .command('config')\n .description('show where the config and keys live')\n .option('--local', 'move the config into ./kitcode.json in this directory')\n .action(async (options: { local?: boolean }) => {\n await showConfig(options)\n })\n\nconst prompts = program.command('prompt').description('manage saved prompts')\n\nprompts\n .command('list')\n .description('list saved prompts')\n .action(async () => {\n const saved = await listPrompts()\n if (saved.length === 0) {\n console.log('no saved prompts')\n return\n }\n for (const prompt of saved) {\n console.log(`${prompt.slug}\\t${prompt.name}${prompt.description ? ` — ${prompt.description}` : ''}`)\n }\n })\n\nprompts\n .command('rm')\n .description('delete a saved prompt')\n .argument('<slug>')\n .action(async (slug: string) => {\n console.log((await deletePrompt(slug)) ? `deleted ${slug}` : `no such prompt: ${slug}`)\n })\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n})\n","import { existsSync } from 'node:fs'\nimport { formatModelRef, parseModelRef } from '../config/schema'\nimport { detectProvider } from '../config/detect'\nimport { authPath, projectConfigPath } from '../config/paths'\nimport {\n configLocation,\n initProjectConfig,\n loadAuth,\n loadProjectConfig,\n loadRuntimeConfig,\n saveAuth,\n saveConfig,\n} from '../config/store'\nimport { isWorkspaceTrusted, trustWorkspace } from '../config/trust'\nimport type { ModelInfo } from '../providers/types'\n\nconst PREFERRED = ['claude-opus-5', 'claude-sonnet-5', 'gpt-5', 'claude-opus-4-8']\nconst LABEL_WIDTH = 10\nconst ALTERNATIVES = 2\n\nexport async function addProvider(\n url: string,\n key: string,\n options: { name?: string; local?: boolean } = {},\n): Promise<void> {\n const cwd = process.cwd()\n if (options.local) {\n const existing = projectConfigPath(cwd)\n if (existsSync(existing) && !(await isWorkspaceTrusted(cwd))) {\n throw new Error(\n `Project config already exists at ${existing}. Review it and run \"kitcode trust\" before adding a provider to it.`,\n )\n }\n }\n const detected = await detectProvider(url, key, { name: options.name })\n if (options.local) {\n await initProjectConfig(cwd)\n await trustWorkspace(cwd)\n }\n const config = options.local ? await loadProjectConfig(cwd) : (await loadRuntimeConfig(cwd)).config\n const auth = await loadAuth()\n const configBefore = structuredClone(config)\n const authBefore = { ...auth }\n\n config.providers[detected.id] = detected.config\n auth[detected.id] = key\n\n const models = detected.models\n if (!config.model) {\n const chosen = pickDefault(models)\n if (chosen) config.model = formatModelRef(detected.id, chosen)\n }\n\n try {\n await saveConfig(config)\n await saveAuth(auth)\n } catch (error) {\n Object.assign(config, configBefore)\n for (const id of Object.keys(auth)) delete auth[id]\n Object.assign(auth, authBefore)\n await Promise.allSettled([saveConfig(config), saveAuth(auth)])\n throw error\n }\n const location = await configLocation()\n\n const protocol = detected.config.type === 'anthropic' ? 'Anthropic' : 'OpenAI-compatible'\n const rows: [string, string][] = [\n ['provider', `${detected.id} — this endpoint speaks the ${protocol} protocol`],\n ['models', models.length === 0 ? 'none listed by this endpoint' : `${models.length} available`],\n ['default', describeDefault(config.model, detected.id, models)],\n ]\n\n alternatives(models, config.model, detected.id).forEach((model, index) => {\n const ref = formatModelRef(detected.id, model.id)\n rows.push([index === 0 ? 'also try' : '', `${ref} ${price(model)}`])\n })\n\n rows.push(['config', `${location.path} (${location.scope})`])\n rows.push(['key', `${authPath} — mode 0600, never written into a project directory`])\n rows.push(['next', 'run kitcode to start a session; /model switches models'])\n\n for (const [label, value] of rows) console.log(label.padEnd(LABEL_WIDTH) + value)\n}\n\nfunction describeDefault(ref: string | undefined, providerId: string, models: ModelInfo[]): string {\n if (!ref) return 'not set — start kitcode and pick one with /model'\n const parsed = parseModelRef(ref)\n if (parsed?.provider !== providerId) return `${ref} — already in your config, left alone`\n return `${ref} ${price(models.find((model) => model.id === parsed.model))}`\n}\n\nfunction price(model: ModelInfo | undefined): string {\n const pricing = model?.pricing\n if (!pricing) return 'pricing not reported by this endpoint'\n return `${money(pricing.input)} in / ${money(pricing.output)} out per million tokens`\n}\n\nfunction money(value: number): string {\n return `$${value >= 1 ? value.toFixed(2) : Number(value.toFixed(4))}`\n}\n\nfunction pickDefault(models: ModelInfo[]): string | undefined {\n for (const preferred of PREFERRED) {\n const match = models.find((model) => model.id.endsWith(preferred))\n if (match) return match.id\n }\n return models[0]?.id\n}\n\nfunction alternatives(\n models: ModelInfo[],\n defaultRef: string | undefined,\n providerId: string,\n): ModelInfo[] {\n const ranked = [\n ...PREFERRED.flatMap((preferred) => models.filter((model) => model.id.endsWith(preferred))),\n ...models.filter((model) => model.pricing),\n ...models,\n ]\n const picked = new Map<string, ModelInfo>()\n for (const model of ranked) {\n if (picked.size === ALTERNATIVES) break\n if (formatModelRef(providerId, model.id) !== defaultRef) picked.set(model.id, model)\n }\n return [...picked.values()]\n}\n","import { z } from 'zod'\n\nconst reservedRecordKeys = new Set(['__proto__', 'prototype', 'constructor'])\n\nconst safeRecordKeySchema = z\n .string()\n .min(1)\n .max(256)\n .refine((value) => !reservedRecordKeys.has(value) && !/[\\0-\\x1f\\x7f]/.test(value), {\n message: 'contains a reserved or unsafe key',\n })\n\nexport const providerIdSchema = safeRecordKeySchema.regex(\n /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,\n 'must start with a letter or digit and contain only letters, digits, dots, underscores, or dashes',\n)\n\nexport function isAllowedEndpointUrl(value: string): boolean {\n try {\n const url = new URL(value)\n if (url.username || url.password) return false\n if (url.protocol === 'https:') return true\n if (url.protocol !== 'http:') return false\n const host = url.hostname.toLowerCase()\n return (\n host === 'localhost' ||\n host.endsWith('.localhost') ||\n host === '[::1]' ||\n host === '::1' ||\n /^127(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}$/.test(host)\n )\n } catch {\n return false\n }\n}\n\nconst httpUrl = z.string().refine(isAllowedEndpointUrl, {\n message: 'must use https, except for localhost/127.0.0.1 development endpoints',\n})\n\nexport const providerKindSchema = z.enum(['anthropic', 'openai'])\n\nexport const providerConfigSchema = z.object({\n type: providerKindSchema,\n baseUrl: httpUrl,\n label: z.string().optional(),\n keyEnv: z.string().optional(),\n headers: z.record(z.string(), z.string()).optional(),\n})\n\nexport const effortSchema = z.enum(['low', 'medium', 'high', 'xhigh', 'max'])\n\nexport const permissionModeSchema = z.enum(['allow', 'ask', 'deny'])\n\nconst mcpStdioSchema = z.object({\n type: z.literal('stdio'),\n command: z.string().min(1),\n args: z.array(z.string()).default([]),\n env: z.record(z.string(), z.string()).default({}),\n enabled: z.boolean().default(true),\n})\n\nconst mcpHttpSchema = z.object({\n type: z.literal('http'),\n url: httpUrl,\n headers: z.record(z.string(), z.string()).default({}),\n enabled: z.boolean().default(true),\n})\n\nexport const mcpServerSchema = z.discriminatedUnion('type', [mcpStdioSchema, mcpHttpSchema])\n\nexport const themeSchema = z.object({\n accent: z.string().default('#a78bfa'),\n})\n\nexport const langSchema = z.enum(['en', 'ru'])\n\nexport const budgetSchema = z.object({\n maxTokensPerTurn: z.number().int().min(0).max(10_000_000).default(10_000_000),\n maxCostUsdPerTurn: z.number().positive().max(1_000).default(5),\n maxSubagentsPerTurn: z.number().int().min(0).max(16).default(3),\n})\n\nexport const diagnosticsSchema = z.object({\n autoRun: z.boolean().default(true),\n commands: z.array(z.string().trim().min(1).max(20_000)).max(8).default([]),\n})\n\nexport const updatesSchema = z.object({\n checkOnStart: z.boolean().default(true),\n})\n\nexport const configSchema = z.object({\n version: z.literal(1).default(1),\n model: z.string().optional(),\n lang: langSchema.optional(),\n theme: themeSchema.default({ accent: '#a78bfa' }),\n effort: effortSchema.default('xhigh'),\n thinking: z.boolean().default(true),\n maxTokens: z.number().int().positive().max(200_000).default(64_000),\n budget: budgetSchema.default({\n maxTokensPerTurn: 10_000_000,\n maxCostUsdPerTurn: 5,\n maxSubagentsPerTurn: 3,\n }),\n diagnostics: diagnosticsSchema.default({ autoRun: true, commands: [] }),\n updates: updatesSchema.default({ checkOnStart: false }),\n providers: z.record(providerIdSchema, providerConfigSchema).default({}),\n permissions: z.record(safeRecordKeySchema, permissionModeSchema).default({}),\n mcp: z.record(safeRecordKeySchema, mcpServerSchema).default({}),\n})\n\nexport const authSchema = z.record(providerIdSchema, z.string())\n\nexport type ProviderConfig = z.infer<typeof providerConfigSchema>\nexport type McpServerConfig = z.infer<typeof mcpServerSchema>\nexport type Config = z.infer<typeof configSchema>\nexport type AuthFile = z.infer<typeof authSchema>\n\nexport function defaultConfig(): Config {\n return configSchema.parse({})\n}\n\nexport function parseModelRef(ref: string): { provider: string; model: string } | null {\n const slash = ref.indexOf('/')\n if (slash <= 0 || slash === ref.length - 1) return null\n return { provider: ref.slice(0, slash), model: ref.slice(slash + 1) }\n}\n\nexport function formatModelRef(provider: string, model: string): string {\n return `${provider}/${model}`\n}\n","import Anthropic from '@anthropic-ai/sdk'\nimport OpenAI from 'openai'\nimport { ProviderError } from './types'\n\nexport const REQUEST_TIMEOUT_MS = 600_000\nexport const MAX_RETRIES = 3\n\nconst EXCERPT_CHARS = 240\nconst CAPTURE_CHARS = EXCERPT_CHARS * 2\n\nconst RETRYABLE_STATUS = new Set([408, 409, 429])\nconst PERMANENT_STATUS = new Set([400, 401, 403, 404, 405, 422])\n\nconst SECRET =\n /Bearer\\s+\\S+|\\b(?:sk|pk|rk|xai|gsk|ghp|gho|hf|nvapi|glpat)[-_][A-Za-z0-9._-]{4,}|\\b[A-Za-z0-9]{32,}\\b/g\nconst NAMED_SECRET =\n /((?:[\"']?)(?:authorization|x-api-key|api[-_ ]?key|access[-_ ]?token|refresh[-_ ]?token|token|secret|password|cookie|set-cookie)(?:[\"']?)\\s*[:=]\\s*)(?:Bearer\\s+\\S+|\"[^\"\\r\\n]*\"|'[^'\\r\\n]*'|[^\\s,;}\\]]+)/gi\n\nconst CONNECTION_REASONS: Record<string, string> = {\n ENOTFOUND: 'the hostname does not resolve',\n EAI_AGAIN: 'the DNS lookup failed, the resolver is unreachable or throttled',\n ECONNREFUSED: 'nothing is listening on that host and port',\n ECONNRESET: 'the connection was reset before the response finished',\n ECONNABORTED: 'the connection was aborted',\n ETIMEDOUT: 'the connection timed out',\n EHOSTUNREACH: 'the host is unreachable',\n ENETUNREACH: 'the network is unreachable',\n EPIPE: 'the connection closed mid-request',\n UND_ERR_SOCKET: 'the socket closed unexpectedly',\n CERT_HAS_EXPIRED: 'the TLS certificate has expired',\n DEPTH_ZERO_SELF_SIGNED_CERT: 'the TLS certificate is self-signed',\n UNABLE_TO_VERIFY_LEAF_SIGNATURE: 'the TLS certificate chain cannot be verified',\n}\n\nexport function describeProviderFailure(error: unknown, providerId: string): string {\n const abort = abortKind(error)\n if (abort === 'user') return `Request to \"${providerId}\" was cancelled.`\n if (abort === 'timeout') {\n return `Request to \"${providerId}\" ran out of time before the provider answered — it may be overloaded, try again.`\n }\n\n const status = statusOf(error)\n if (status !== undefined) return describeStatus(status, providerId, error)\n\n const reason = connectionReason(error)\n if (reason) {\n return `Cannot reach \"${providerId}\": ${reason}. Check the base URL and your network.`\n }\n\n return `Request to \"${providerId}\" failed — ${snippet(messageOf(error))}`\n}\n\nexport function isRetryableFailure(error: unknown): boolean {\n const abort = abortKind(error)\n if (abort === 'user') return false\n if (abort === 'timeout') return true\n\n const status = statusOf(error)\n if (status === undefined) return connectionReason(error) !== undefined\n if (PERMANENT_STATUS.has(status)) return false\n return RETRYABLE_STATUS.has(status) || status >= 500\n}\n\nfunction statusOf(error: unknown): number | undefined {\n const value = prop(error, 'status') ?? prop(error, 'statusCode')\n return typeof value === 'number' && value >= 100 ? value : undefined\n}\n\nexport function isUserAbort(error: unknown, signal?: AbortSignal): boolean {\n return signal?.aborted === true || abortKind(error) === 'user'\n}\n\nexport function isConnectionFailure(error: unknown): boolean {\n return connectionReason(error) !== undefined\n}\n\nexport function toProviderError(error: unknown, providerId: string): ProviderError {\n return new ProviderError(describeProviderFailure(error, providerId), providerId, statusOf(error), {\n cause: error,\n })\n}\n\nexport interface ResponseCapture {\n fetch: (input: Parameters<typeof fetch>[0], init?: RequestInit) => Promise<Response>\n succeeded(): boolean\n headers(): Headers | null\n head(): Promise<string>\n}\n\nexport function captureResponseHead(): ResponseCapture {\n let ok = false\n let responseHeaders: Headers | null = null\n let head: Promise<string> = Promise.resolve('')\n return {\n succeeded: () => ok,\n headers: () => responseHeaders,\n head: () => head,\n fetch: async (input, init) => {\n const response = await fetch(input, init)\n ok = response.ok\n responseHeaders = new Headers(response.headers)\n if (!response.body) {\n head = Promise.resolve('')\n return response\n }\n const [forward, copy] = response.body.tee()\n head = readHead(copy)\n return new Response(forward, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n },\n }\n}\n\nasync function readHead(stream: ReadableStream<Uint8Array>): Promise<string> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let text = ''\n try {\n while (text.length < CAPTURE_CHARS) {\n const { done, value } = await reader.read()\n if (done) break\n text += decoder.decode(value, { stream: true })\n }\n } catch {\n return text\n } finally {\n void reader.cancel().catch(() => {})\n }\n return text\n}\n\nexport async function invalidStreamError(\n providerId: string,\n capture: ResponseCapture,\n cause?: unknown,\n): Promise<ProviderError> {\n const excerpt = snippet(await capture.head(), EXCERPT_CHARS)\n const detail = excerpt === '' ? 'the body was empty' : `the body began: ${excerpt}`\n return new ProviderError(\n `\"${providerId}\" returned a response that is not a valid streaming chat completion — no stream events arrived and ${detail}. The endpoint may speak a different protocol than the one configured for it.`,\n providerId,\n undefined,\n cause === undefined ? undefined : { cause },\n )\n}\n\nfunction describeStatus(status: number, providerId: string, error: unknown): string {\n const detail = detailOf(error, status)\n const wait = retryAfterSeconds(error)\n const after = wait === undefined ? undefined : `retry after ${wait}s`\n\n if (status === 401) {\n return `The API key for \"${providerId}\" was rejected (401) — re-run: kitcode add <url>`\n }\n if (status === 403) {\n return `The API key for \"${providerId}\" is valid but has no access to this model (403)${detail}`\n }\n if (status === 404) {\n return `\"${providerId}\" has no such model, or the base URL is wrong (404)${detail}`\n }\n if (status === 408) {\n return `Request to \"${providerId}\" timed out (408) — ${after ?? 'try again'}`\n }\n if (status === 429) {\n return `\"${providerId}\" rate limited this request (429) — ${after ?? 'try again shortly'}`\n }\n if (status >= 500) {\n return `\"${providerId}\" is down or overloaded (${status}) — try again shortly`\n }\n return `\"${providerId}\" rejected the request (${status})${detail}`\n}\n\nfunction abortKind(error: unknown): 'user' | 'timeout' | undefined {\n if (\n error instanceof Anthropic.APIConnectionTimeoutError ||\n error instanceof OpenAI.APIConnectionTimeoutError\n ) {\n return 'timeout'\n }\n if (error instanceof Anthropic.APIUserAbortError || error instanceof OpenAI.APIUserAbortError) {\n return 'user'\n }\n const name = prop(error, 'name')\n if (name === 'TimeoutError') return 'timeout'\n if (name === 'AbortError') return 'user'\n return undefined\n}\n\nfunction connectionReason(error: unknown): string | undefined {\n const links = chain(error)\n for (const link of links) {\n for (const candidate of [link, ...siblings(link)]) {\n const code = prop(candidate, 'code')\n const known = typeof code === 'string' ? CONNECTION_REASONS[code] : undefined\n if (known) return `${known} (${code})`\n }\n }\n\n const deepest = links[links.length - 1]\n if (links.length > 1 && deepest instanceof Error) return snippet(deepest.message)\n\n const message = messageOf(error)\n return /fetch failed|connection error|socket|network/i.test(message) ? snippet(message) : undefined\n}\n\nfunction chain(error: unknown): unknown[] {\n const links: unknown[] = []\n let current = error\n while (current !== null && typeof current === 'object' && links.length < 5) {\n links.push(current)\n current = (current as { cause?: unknown }).cause\n }\n return links\n}\n\nfunction siblings(link: unknown): unknown[] {\n const errors = prop(link, 'errors')\n return Array.isArray(errors) ? errors.slice(0, 4) : []\n}\n\nfunction retryAfterSeconds(error: unknown): number | undefined {\n const millis = Number(header(error, 'retry-after-ms'))\n if (Number.isFinite(millis) && millis > 0) return Math.ceil(millis / 1000)\n\n const raw = header(error, 'retry-after')\n if (raw === undefined) return undefined\n const seconds = Number(raw)\n if (Number.isFinite(seconds) && seconds > 0) return Math.ceil(seconds)\n const at = Date.parse(raw)\n return Number.isNaN(at) ? undefined : Math.max(1, Math.ceil((at - Date.now()) / 1000))\n}\n\nfunction header(error: unknown, name: string): string | undefined {\n const headers = prop(error, 'headers')\n if (headers === null || typeof headers !== 'object') return undefined\n const bag = headers as { get?: (key: string) => string | null }\n if (typeof bag.get === 'function') return bag.get(name) ?? undefined\n const value = (headers as Record<string, unknown>)[name]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction detailOf(error: unknown, status: number): string {\n const raw = bodyMessage(error) ?? messageOf(error).replace(new RegExp(`^${status}\\\\s+`), '')\n const text = snippet(raw)\n if (text === '' || text === String(status) || text === 'status code (no body)') return ''\n return ` — ${text}`\n}\n\nfunction bodyMessage(error: unknown): string | undefined {\n const body = prop(error, 'error')\n const nested = prop(body, 'error')\n const candidates = [prop(body, 'message'), prop(nested, 'message'), prop(body, 'detail')]\n const found = candidates.find((value) => typeof value === 'string' && value.trim() !== '')\n return typeof found === 'string' ? found : undefined\n}\n\nfunction messageOf(error: unknown): string {\n if (error instanceof Error) return error.message\n if (typeof error === 'string') return error\n if (error === null || error === undefined) return 'unknown error'\n return String(error)\n}\n\nfunction snippet(text: string, limit = 160): string {\n return redactSecrets(oneLine(text)).slice(0, limit)\n}\n\nfunction oneLine(text: string): string {\n return text.replace(/\\s+/g, ' ').trim()\n}\n\nexport function redactSecrets(text: string, knownSecrets: Iterable<string> = []): string {\n let safe = text.replace(NAMED_SECRET, '$1[redacted]').replace(SECRET, '[redacted]')\n for (const secret of knownSecrets) {\n if (secret.length >= 4) safe = safe.split(secret).join('[redacted]')\n }\n return safe\n}\n\nfunction prop(value: unknown, key: string): unknown {\n if (value === null || typeof value !== 'object') return undefined\n return (value as Record<string, unknown>)[key]\n}\n","export type Effort = 'low' | 'medium' | 'high' | 'xhigh' | 'max'\n\nexport type JsonSchema = Record<string, unknown>\n\nexport interface ModelPricing {\n input: number\n output: number\n cacheWrite?: number\n cacheRead?: number\n}\n\nexport interface ModelInfo {\n id: string\n name?: string\n contextWindow?: number\n maxOutput?: number\n pricing?: ModelPricing\n}\n\nexport interface ToolSchema {\n name: string\n description: string\n inputSchema: JsonSchema\n}\n\nexport interface TextBlock {\n type: 'text'\n text: string\n}\n\nexport interface ThinkingBlock {\n type: 'thinking'\n text: string\n raw?: unknown\n}\n\nexport interface ToolUseBlock {\n type: 'tool_use'\n id: string\n name: string\n input: unknown\n}\n\nexport interface ToolResultBlock {\n type: 'tool_result'\n toolUseId: string\n content: string\n isError?: boolean\n}\n\nexport interface ImageBlock {\n type: 'image'\n mediaType: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp'\n data: string\n name: string\n}\n\nexport interface FileBlock {\n type: 'file'\n mediaType: string\n text: string\n name: string\n}\n\nexport type ContentBlock =\n | TextBlock\n | ThinkingBlock\n | ToolUseBlock\n | ToolResultBlock\n | ImageBlock\n | FileBlock\n\nexport type MessageRole = 'user' | 'assistant'\n\nexport interface Message {\n role: MessageRole\n content: ContentBlock[]\n}\n\nexport interface ChatRequest {\n model: string\n system: string\n messages: Message[]\n tools: ToolSchema[]\n maxTokens: number\n effort?: Effort\n thinking?: boolean\n signal?: AbortSignal\n}\n\nexport type StopReason =\n | 'end_turn'\n | 'tool_use'\n | 'max_tokens'\n | 'pause_turn'\n | 'refusal'\n | 'aborted'\n\nexport interface Usage {\n input: number\n output: number\n cacheWrite: number\n cacheRead: number\n}\n\nexport interface RefusalInfo {\n category?: string | null\n explanation?: string | null\n}\n\nexport interface RateLimitBucket {\n limit?: number\n remaining?: number\n reset?: string\n}\n\nexport interface RateLimits {\n requests?: RateLimitBucket\n tokens?: RateLimitBucket\n inputTokens?: RateLimitBucket\n outputTokens?: RateLimitBucket\n}\n\nexport type StreamEvent =\n | { type: 'text_delta'; text: string }\n | { type: 'thinking_delta'; text: string }\n | { type: 'tool_call'; id: string; name: string; input: unknown }\n | { type: 'usage'; usage: Usage }\n | { type: 'rate_limits'; limits: RateLimits }\n | { type: 'done'; stopReason: StopReason; content: ContentBlock[]; refusal?: RefusalInfo }\n\nexport type ProviderKind = 'anthropic' | 'openai'\n\nexport interface Provider {\n readonly id: string\n readonly kind: ProviderKind\n stream(req: ChatRequest): AsyncIterable<StreamEvent>\n listModels(): Promise<ModelInfo[]>\n knownModels(): ModelInfo[]\n}\n\nexport class ProviderError extends Error {\n constructor(\n message: string,\n readonly providerId: string,\n readonly status?: number,\n options?: ErrorOptions,\n ) {\n super(message, options)\n this.name = 'ProviderError'\n }\n}\n\nexport function emptyUsage(): Usage {\n return { input: 0, output: 0, cacheWrite: 0, cacheRead: 0 }\n}\n\nexport function addUsage(a: Usage, b: Usage): Usage {\n return {\n input: a.input + b.input,\n output: a.output + b.output,\n cacheWrite: a.cacheWrite + b.cacheWrite,\n cacheRead: a.cacheRead + b.cacheRead,\n }\n}\n","import type { ModelInfo, ModelPricing } from './types'\n\ninterface RawModel {\n id?: unknown\n name?: unknown\n display_name?: unknown\n context_length?: unknown\n context_window?: unknown\n max_context_length?: unknown\n max_model_len?: unknown\n model_max_length?: unknown\n max_sequence_length?: unknown\n max_input_tokens?: unknown\n top_provider?: { context_length?: unknown; context_window?: unknown } | null\n pricing?: unknown\n}\n\nexport function modelInfoFromRaw(entry: unknown): ModelInfo | null {\n if (typeof entry !== 'object' || entry === null) return null\n const raw = entry as RawModel\n if (typeof raw.id !== 'string' || raw.id === '') return null\n\n const model: ModelInfo = { id: raw.id }\n const name = typeof raw.name === 'string' ? raw.name : raw.display_name\n if (typeof name === 'string' && name !== '') model.name = name\n\n const contextWindow =\n positiveInt(raw.context_length) ??\n positiveInt(raw.context_window) ??\n positiveInt(raw.max_context_length) ??\n positiveInt(raw.max_model_len) ??\n positiveInt(raw.model_max_length) ??\n positiveInt(raw.max_sequence_length) ??\n positiveInt(raw.top_provider?.context_length) ??\n positiveInt(raw.top_provider?.context_window) ??\n positiveInt(raw.max_input_tokens)\n if (contextWindow !== undefined) model.contextWindow = contextWindow\n\n const pricing = toPricing(raw.pricing)\n if (pricing) model.pricing = pricing\n\n return model\n}\n\nfunction toPricing(raw: unknown): ModelPricing | undefined {\n if (typeof raw !== 'object' || raw === null) return undefined\n const source = raw as Record<string, unknown>\n const input = perMillion(source.prompt)\n const output = perMillion(source.completion)\n if (input === undefined || output === undefined) return undefined\n\n const pricing: ModelPricing = { input, output }\n const cacheWrite = perMillion(source.input_cache_write)\n const cacheRead = perMillion(source.input_cache_read)\n if (cacheWrite !== undefined) pricing.cacheWrite = cacheWrite\n if (cacheRead !== undefined) pricing.cacheRead = cacheRead\n return pricing\n}\n\nfunction perMillion(value: unknown): number | undefined {\n const perToken = toNumber(value)\n if (perToken === undefined || perToken <= 0) return undefined\n return Math.round(perToken * 1e12) / 1e6\n}\n\nfunction positiveInt(value: unknown): number | undefined {\n const parsed = toNumber(value)\n if (parsed === undefined) return undefined\n const integer = Math.trunc(parsed)\n return integer >= 1 ? integer : undefined\n}\n\nfunction toNumber(value: unknown): number | undefined {\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value !== 'string' || value.trim() === '') return undefined\n const parsed = Number(value)\n return Number.isFinite(parsed) ? parsed : undefined\n}\n","import { redactSecrets } from '../providers/errors'\nimport { modelInfoFromRaw } from '../providers/model-info'\nimport type { ModelInfo } from '../providers/types'\nimport { isAllowedEndpointUrl, providerIdSchema } from './schema'\nimport type { ProviderConfig } from './schema'\n\nexport interface DetectedProvider {\n id: string\n config: ProviderConfig\n models: ModelInfo[]\n}\n\nexport interface DetectOptions {\n name?: string\n fetchImpl?: typeof fetch\n timeoutMs?: number\n}\n\nexport const DETECT_TIMEOUT_MS = 15_000\nconst MAX_DETECT_BODY_BYTES = 5_000_000\n\nconst anthropicHost = 'api.anthropic.com'\nconst anthropicBaseUrl = 'https://api.anthropic.com'\n\nexport async function detectProvider(\n rawUrl: string,\n apiKey: string,\n opts: DetectOptions = {},\n): Promise<DetectedProvider> {\n const fetchImpl = withTimeout(opts.fetchImpl ?? fetch, opts.timeoutMs ?? DETECT_TIMEOUT_MS)\n const baseUrl = normaliseBaseUrl(rawUrl)\n if (!isAllowedEndpointUrl(baseUrl)) {\n throw new Error('API URL must use https; plain http is only allowed for localhost or 127.0.0.1.')\n }\n const candidateId = opts.name ?? providerIdFromUrl(baseUrl)\n const parsedId = providerIdSchema.safeParse(candidateId)\n if (!parsedId.success) {\n throw new Error(`Invalid provider name \"${candidateId}\": ${parsedId.error.issues[0]?.message ?? 'invalid name'}`)\n }\n const id = parsedId.data\n\n if (hostname(baseUrl) === anthropicHost) {\n const probed = await probe(\n fetchImpl,\n `${anthropicBaseUrl}/v1/models?limit=1000`,\n anthropicHeaders(apiKey),\n )\n return {\n id,\n config: { type: 'anthropic', baseUrl: anthropicBaseUrl },\n models: probed.ok ? parseModelList(probed.body) : [],\n }\n }\n\n let last: Probe | undefined\n for (const candidate of candidateBaseUrls(baseUrl)) {\n const url = `${candidate}/models`\n let attempt = await probe(fetchImpl, url, { Authorization: `Bearer ${apiKey}` })\n last = attempt\n if (attempt.ok && isModelListBody(attempt.body)) {\n const anthropic = advertisesAnthropicProtocol(attempt.body)\n return {\n id,\n config: anthropic\n ? { type: 'anthropic', baseUrl: anthropicRoot(candidate) }\n : { type: 'openai', baseUrl: candidate },\n models: parseModelList(attempt.body),\n }\n }\n\n if (attempt.status === 401 || attempt.status === 403) {\n attempt = await probe(fetchImpl, url, anthropicHeaders(apiKey))\n last = attempt\n if (attempt.ok) {\n return {\n id,\n config: { type: 'anthropic', baseUrl: anthropicRoot(candidate) },\n models: parseModelList(attempt.body),\n }\n }\n }\n if (!attempt.ok && attempt.status !== 404 && attempt.status !== 0) break\n }\n\n throw new Error(describeFailure(last!))\n}\n\nexport function normaliseBaseUrl(rawUrl: string): string {\n return rawUrl.trim().replace(/\\/+$/, '')\n}\n\nexport function providerIdFromUrl(url: string): string {\n const host = hostname(url)\n if (isAddressLiteral(host)) {\n const port = new URL(url).port\n return port ? `local-${port}` : 'local'\n }\n const labels = host.split('.')\n const label = labels.find((part) => part !== 'api' && part !== '') ?? 'provider'\n const candidate = label.replace(/[^a-z0-9-]/g, '-').replace(/^-+|-+$/g, '') || 'provider'\n return providerIdSchema.safeParse(candidate).success ? candidate : `provider-${candidate}`\n}\n\nfunction isAddressLiteral(host: string): boolean {\n return host === 'localhost' || /^[0-9.]+$/.test(host) || host.includes(':')\n}\n\nexport function parseModelList(body: unknown): ModelInfo[] {\n const data = Array.isArray(body) ? body : (body as { data?: unknown } | null)?.data\n if (!Array.isArray(data)) return []\n return data.flatMap((entry) => {\n const model = modelInfoFromRaw(entry)\n return model ? [model] : []\n })\n}\n\ninterface Probe {\n ok: boolean\n url: string\n status: number\n body: unknown\n text: string\n}\n\nasync function probe(\n fetchImpl: typeof fetch,\n url: string,\n headers: Record<string, string>,\n): Promise<Probe> {\n let response: Response\n try {\n response = await fetchImpl(url, { method: 'GET', headers })\n } catch (error) {\n return { ok: false, url, status: 0, body: undefined, text: describeThrown(error) }\n }\n let text: string\n try {\n text = await boundedResponseText(response)\n } catch (error) {\n return {\n ok: false,\n url,\n status: response.status,\n body: undefined,\n text: describeThrown(error),\n }\n }\n let body: unknown\n try {\n body = JSON.parse(text)\n } catch {\n body = undefined\n }\n return { ok: response.ok, url, status: response.status, body, text }\n}\n\nasync function boundedResponseText(response: Response): Promise<string> {\n const declared = Number(response.headers.get('content-length'))\n if (Number.isFinite(declared) && declared > MAX_DETECT_BODY_BYTES) {\n await response.body?.cancel().catch(() => undefined)\n throw new Error(`response exceeded ${MAX_DETECT_BODY_BYTES / 1_000_000} MB`)\n }\n if (!response.body) return ''\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let bytes = 0\n let text = ''\n try {\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n bytes += value.byteLength\n if (bytes > MAX_DETECT_BODY_BYTES) {\n throw new Error(`response exceeded ${MAX_DETECT_BODY_BYTES / 1_000_000} MB`)\n }\n text += decoder.decode(value, { stream: true })\n }\n return text + decoder.decode()\n } finally {\n void reader.cancel().catch(() => undefined)\n }\n}\n\nfunction withTimeout(fetchImpl: typeof fetch, timeoutMs: number): typeof fetch {\n return async (input, init) => {\n const controller = new AbortController()\n const expiry = new Error(`timed out after ${Math.round(timeoutMs / 100) / 10}s`)\n \n \n expiry.name = 'TimeoutError'\n let timer: ReturnType<typeof setTimeout> | undefined\n const expired = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n controller.abort(expiry)\n reject(expiry)\n }, timeoutMs)\n })\n try {\n return await Promise.race([fetchImpl(input, { ...init, signal: controller.signal }), expired])\n } finally {\n clearTimeout(timer)\n }\n }\n}\n\nfunction candidateBaseUrls(baseUrl: string): string[] {\n return baseUrl.endsWith('/v1') ? [baseUrl] : [baseUrl, `${baseUrl}/v1`]\n}\n\nfunction anthropicHeaders(apiKey: string): Record<string, string> {\n return { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' }\n}\n\nfunction isModelListBody(body: unknown): boolean {\n return Array.isArray(body) || Array.isArray((body as { data?: unknown } | null)?.data)\n}\n\nfunction anthropicRoot(baseUrl: string): string {\n return baseUrl.replace(/\\/v1$/, '')\n}\n\nfunction advertisesAnthropicProtocol(body: unknown): boolean {\n const entries = modelEntries(body)\n if (entries.length === 0) return false\n\n const endpointTypes = new Set(\n entries.flatMap((entry) => stringList(entry['supported_endpoint_types'])),\n )\n if (endpointTypes.size > 0) {\n return endpointTypes.has('anthropic') && !endpointTypes.has('openai')\n }\n\n if (entries.some(isVendorNamespaced)) return false\n return entries.every((entry) => entry['owned_by'] === 'anthropic')\n}\n\nfunction isVendorNamespaced(entry: Record<string, unknown>): boolean {\n return typeof entry['id'] === 'string' && entry['id'].includes('/')\n}\n\nfunction modelEntries(body: unknown): Record<string, unknown>[] {\n const data = Array.isArray(body) ? body : (body as { data?: unknown } | null)?.data\n if (!Array.isArray(data)) return []\n return data.filter(\n (entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null,\n )\n}\n\nfunction stringList(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n return value.filter((item): item is string => typeof item === 'string')\n}\n\nfunction describeFailure(attempt: Probe): string {\n const status = attempt.status === 0 ? 'request failed' : `HTTP ${attempt.status}`\n const snippet = redactSecrets(attempt.text.trim()).slice(0, 200)\n const detail = snippet === '' ? '' : `: ${snippet}`\n return `No OpenAI- or Anthropic-compatible API found at ${attempt.url} (${status})${detail}`\n}\n\nfunction describeThrown(error: unknown): string {\n if (!(error instanceof Error)) return String(error)\n const cause = error.cause instanceof Error ? ` (${error.cause.message})` : ''\n return `${error.message}${cause}`\n}\n\nfunction hostname(url: string): string {\n try {\n return new URL(url).hostname.toLowerCase()\n } catch {\n throw new Error(`Not a valid URL: ${url}`)\n }\n}\n","import { chmod, mkdir, stat } from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\n\nconst explicitHome = process.env.KITCODE_HOME\n\nexport const homeDir = explicitHome || path.join(os.homedir(), '.kitcode')\n\nexport const configPath = path.join(homeDir, 'config.json')\n\nexport const authPath = path.join(homeDir, 'auth.json')\n\nexport const trustPath = path.join(homeDir, 'trusted-workspaces.json')\n\nexport const promptsDir = path.join(homeDir, 'prompts')\n\nexport const sessionsDir = path.join(homeDir, 'sessions')\n\nexport const checkpointsDir = path.join(homeDir, 'checkpoints')\n\nexport const cacheDir = path.join(homeDir, 'cache')\n\nexport const skillsDir = path.join(homeDir, 'skills')\n\nexport function projectSkillsDir(dir: string): string {\n return path.join(dir, '.kitcode', 'skills')\n}\n\nconst projectConfigName = 'kitcode.json'\n\nexport type ConfigScope = 'env' | 'project' | 'global'\n\nexport interface ConfigLocation {\n path: string\n scope: ConfigScope\n}\n\nexport function projectConfigPath(dir: string): string {\n return path.join(path.resolve(dir), projectConfigName)\n}\n\nasync function findProjectConfig(from: string): Promise<string | undefined> {\n let dir = path.resolve(from)\n for (;;) {\n const candidate = path.join(dir, projectConfigName)\n if (await isFile(candidate)) return candidate\n const parent = path.dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\nexport async function resolveConfigLocation(cwd: string = process.cwd()): Promise<ConfigLocation> {\n const override = process.env.KITCODE_CONFIG\n if (override) return { path: path.resolve(override), scope: 'env' }\n\n const project = await findProjectConfig(cwd)\n if (project) return { path: project, scope: 'project' }\n\n return { path: configPath, scope: 'global' }\n}\n\nexport async function workspaceRootFor(cwd: string = process.cwd()): Promise<string> {\n const project = await findProjectConfig(cwd)\n return project ? path.dirname(project) : path.resolve(cwd)\n}\n\nexport async function ensureDir(dir: string, mode = 0o700): Promise<void> {\n await mkdir(dir, { recursive: true, mode })\n await chmod(dir, mode)\n}\n\nasync function isFile(file: string): Promise<boolean> {\n try {\n return (await stat(file)).isFile()\n } catch {\n return false\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { chmod, mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport type { z } from 'zod'\nimport type { ConfigLocation } from './paths'\nimport {\n authPath,\n configPath,\n ensureDir,\n homeDir,\n projectConfigPath,\n resolveConfigLocation,\n} from './paths'\nimport type { AuthFile, Config, ProviderConfig } from './schema'\nimport { authSchema, configSchema, defaultConfig } from './schema'\nimport { isWorkspaceTrusted } from './trust'\n\nlet active: ConfigLocation | undefined\n\nexport async function configLocation(): Promise<ConfigLocation> {\n active ??= await resolveConfigLocation()\n return active\n}\n\nexport async function loadConfig(cwd?: string): Promise<Config> {\n const location = await resolveConfigLocation(cwd)\n return loadConfigAt(location)\n}\n\nexport async function loadProjectConfig(dir: string): Promise<Config> {\n return loadConfigAt({ path: projectConfigPath(dir), scope: 'project' })\n}\n\nexport interface RuntimeConfigLoad {\n config: Config\n ignoredProject?: ConfigLocation\n}\n\nexport async function loadRuntimeConfig(cwd: string): Promise<RuntimeConfigLoad> {\n const location = await resolveConfigLocation(cwd)\n if (location.scope === 'project' && !(await isWorkspaceTrusted(cwd))) {\n const ignoredProject = location\n const config = await loadConfigAt({ path: configPath, scope: 'global' })\n return { config, ignoredProject }\n }\n return { config: await loadConfigAt(location) }\n}\n\nasync function loadConfigAt(location: ConfigLocation): Promise<Config> {\n active = location\n const raw = await readJson(location.path)\n if (raw === undefined) return defaultConfig()\n const result = configSchema.safeParse(raw)\n if (!result.success) throw new Error(formatIssues(location.path, result.error))\n return result.data\n}\n\nexport async function saveConfig(config: Config): Promise<void> {\n const location = await configLocation()\n await writeJsonAtomic(location.path, config, location.scope === 'project' ? undefined : 0o600)\n}\n\nexport async function initProjectConfig(dir: string): Promise<ConfigLocation> {\n const location: ConfigLocation = { path: projectConfigPath(dir), scope: 'project' }\n if ((await readJson(location.path)) === undefined) {\n await writeJsonAtomic(location.path, defaultConfig())\n }\n return location\n}\n\nexport async function loadAuth(): Promise<AuthFile> {\n await hardenPrivateHome()\n const raw = await readJson(authPath)\n if (raw === undefined) return {}\n await chmod(authPath, 0o600)\n const result = authSchema.safeParse(raw)\n if (!result.success) throw new Error(formatIssues(authPath, result.error))\n return result.data\n}\n\nexport async function saveAuth(auth: AuthFile): Promise<void> {\n await writeJsonAtomic(authPath, auth, 0o600)\n}\n\nasync function hardenPrivateHome(): Promise<void> {\n try {\n await chmod(homeDir, 0o700)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n }\n}\n\nexport function resolveApiKey(\n providerId: string,\n providerConfig: ProviderConfig,\n auth: AuthFile = {},\n): string | undefined {\n const candidates = [\n providerConfig.keyEnv ? process.env[providerConfig.keyEnv] : undefined,\n process.env[conventionalKeyEnv(providerId)],\n auth[providerId],\n providerConfig.type === 'anthropic' ? process.env.ANTHROPIC_API_KEY : undefined,\n ]\n return candidates.find((value) => value !== undefined && value !== '')\n}\n\nexport function conventionalKeyEnv(providerId: string): string {\n return `KITCODE_${providerId.replace(/[^a-zA-Z0-9]+/g, '_').toUpperCase()}_KEY`\n}\n\nexport function expandEnvRefs(value: string): string {\n return value.replace(/\\$\\{env:([^}]+)\\}/g, (_match, name: string) => process.env[name] ?? '')\n}\n\nexport function expandEnvRecord(record: Record<string, string>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(record).map(([key, value]) => [key, expandEnvRefs(value)]),\n )\n}\n\nasync function readJson(file: string): Promise<unknown> {\n let text: string\n try {\n text = await readFile(file, 'utf8')\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined\n throw error\n }\n try {\n return JSON.parse(text)\n } catch (error) {\n throw new Error(`${file} is not valid JSON: ${(error as Error).message}`)\n }\n}\n\nasync function writeJsonAtomic(file: string, value: unknown, mode?: number): Promise<void> {\n const parent = path.dirname(file)\n if (isInside(homeDir, parent)) await ensureDir(parent)\n else await mkdir(parent, { recursive: true })\n const temp = `${file}.${randomUUID()}.tmp`\n try {\n await writeFile(temp, `${JSON.stringify(value, null, 2)}\\n`, { encoding: 'utf8', mode })\n await rename(temp, file)\n if (mode !== undefined) await chmod(file, mode)\n } catch (error) {\n await rm(temp, { force: true })\n throw error\n }\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(candidate))\n return relative === '' || (!path.isAbsolute(relative) && relative.split(path.sep)[0] !== '..')\n}\n\nfunction formatIssues(file: string, error: z.ZodError): string {\n const lines = error.issues.map(\n (issue) => ` ${issue.path.join('.') || '(root)'}: ${issue.message}`,\n )\n return [`${file} is invalid:`, ...lines].join('\\n')\n}\n","import { randomUUID } from 'node:crypto'\nimport { readFile, realpath, rename, rm, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport { ensureDir, trustPath, workspaceRootFor } from './paths'\n\n// Serialize complete read-modify-write operations, not only the final rename.\nlet trustLock: Promise<void> = Promise.resolve()\n\ninterface TrustFile {\n version: 1\n workspaces: string[]\n}\n\nconst emptyTrust = (): TrustFile => ({ version: 1, workspaces: [] })\n\nexport async function canonicalWorkspace(cwd: string): Promise<string> {\n const resolved = await workspaceRootFor(cwd)\n return realpath(resolved).catch(() => resolved)\n}\n\nexport async function isWorkspaceTrusted(cwd: string): Promise<boolean> {\n const workspace = await canonicalWorkspace(cwd)\n const trust = await loadTrust()\n return trust.workspaces.includes(workspace)\n}\n\nexport async function trustWorkspace(cwd: string): Promise<string> {\n const workspace = await canonicalWorkspace(cwd)\n await withTrustLock(async () => {\n const trust = await readTrust()\n if (!trust.workspaces.includes(workspace)) {\n trust.workspaces.push(workspace)\n trust.workspaces.sort()\n await writeTrust(trust)\n }\n })\n return workspace\n}\n\nexport async function revokeWorkspaceTrust(cwd: string): Promise<string> {\n const workspace = await canonicalWorkspace(cwd)\n await withTrustLock(async () => {\n const trust = await readTrust()\n const workspaces = trust.workspaces.filter((entry) => entry !== workspace)\n if (workspaces.length !== trust.workspaces.length) await writeTrust({ version: 1, workspaces })\n })\n return workspace\n}\n\nasync function loadTrust(): Promise<TrustFile> {\n await trustLock\n return readTrust()\n}\n\nasync function readTrust(): Promise<TrustFile> {\n let parsed: unknown\n try {\n parsed = JSON.parse(await readFile(trustPath, 'utf8'))\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return emptyTrust()\n return emptyTrust()\n }\n if (typeof parsed !== 'object' || parsed === null) return emptyTrust()\n const value = parsed as { version?: unknown; workspaces?: unknown }\n if (value.version !== 1 || !Array.isArray(value.workspaces)) return emptyTrust()\n return {\n version: 1,\n workspaces: value.workspaces.filter((entry): entry is string => typeof entry === 'string'),\n }\n}\n\nasync function writeTrust(value: TrustFile): Promise<void> {\n await ensureDir(path.dirname(trustPath))\n const temp = `${trustPath}.${randomUUID()}.tmp`\n try {\n await writeFile(temp, `${JSON.stringify(value, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 })\n await rename(temp, trustPath)\n } catch (error) {\n await rm(temp, { force: true })\n throw error\n }\n}\n\nasync function withTrustLock<T>(action: () => Promise<T>): Promise<T> {\n const previous = trustLock\n let release!: () => void\n trustLock = new Promise<void>((resolve) => {\n release = resolve\n })\n await previous\n try {\n return await action()\n } finally {\n release()\n }\n}\n","import { createInterface } from 'node:readline/promises'\nimport type { AgentHooks, PermissionRequest } from '../core/types'\nimport type { AgentMode } from '../tools/permissions'\nimport { sanitizeTerminalText } from '../ui/sanitize'\nimport { boot } from './runtime'\n\nconst RU_YES = new Set(['y', 'н'])\n\nexport async function ask(\n text: string,\n options: { yes?: boolean; mode?: AgentMode } = {},\n): Promise<void> {\n const { runtime, history, warnings, shutdown } = await boot({\n cwd: process.cwd(),\n bypass: options.yes,\n mode: options.mode,\n })\n\n for (const warning of warnings) console.error(sanitizeTerminalText(warning))\n\n const controller = new AbortController()\n const onInterrupt = () => controller.abort()\n process.on('SIGINT', onInterrupt)\n\n const hooks: AgentHooks = {\n onEvent(event) {\n if (event.type === 'text_delta') process.stdout.write(sanitizeTerminalText(event.text))\n else if (event.type === 'tool_start') {\n process.stderr.write(`\\n· ${sanitizeTerminalText(event.summary)}\\n`)\n } else if (event.type === 'notice') {\n process.stderr.write(`\\n${sanitizeTerminalText(event.text)}\\n`)\n }\n },\n async requestPermission(request) {\n if (options.yes) return 'once'\n if (!process.stdin.isTTY) return 'deny'\n const rl = createInterface({ input: process.stdin, output: process.stderr })\n try {\n const details = permissionDetails(request)\n const answer = await rl.question(\n `\\nallow ${sanitizeTerminalText(request.summary)}?${details ? `\\n${details}` : ''}\\n[y/N] `,\n )\n return RU_YES.has(answer.trim().toLowerCase().charAt(0)) ? 'once' : 'deny'\n } finally {\n rl.close()\n }\n },\n }\n\n try {\n const next = await runtime.run(\n [...history, { role: 'user', content: [{ type: 'text', text }] }],\n hooks,\n controller.signal,\n )\n await runtime.persist(next)\n process.stdout.write('\\n')\n console.error(runtime.usageLine())\n } finally {\n process.off('SIGINT', onInterrupt)\n await shutdown()\n }\n}\n\nfunction permissionDetails(request: PermissionRequest): string {\n let text: string\n if (request.display?.kind === 'text') text = request.display.text\n else if (request.display?.kind === 'list') {\n text = [request.display.title, ...request.display.items.map((item) => `- ${item}`)].join('\\n')\n } else if (request.display?.kind === 'diff') {\n text = [\n request.display.path,\n '--- current',\n request.display.before,\n '+++ proposed',\n request.display.after,\n ].join('\\n')\n } else {\n try {\n text = JSON.stringify(request.input, null, 2)\n } catch {\n text = String(request.input)\n }\n }\n const safe = sanitizeTerminalText(text)\n return safe.length > 20_000 ? `${safe.slice(0, 20_000)}\\n... preview truncated` : safe\n}\n","\nexport function sanitizeTerminalText(value: unknown): string {\n const text = String(value ?? '')\n let output = ''\n\n for (let index = 0; index < text.length; index += 1) {\n const code = text.charCodeAt(index)\n\n if (code === 0x1b) {\n const next = text.charCodeAt(index + 1)\n if (next === 0x5b) index = skipCsi(text, index + 2)\n else if (next === 0x5d) index = skipControlString(text, index + 2, true)\n else if (next === 0x50 || next === 0x58 || next === 0x5e || next === 0x5f) {\n index = skipControlString(text, index + 2, false)\n } else if (!Number.isNaN(next)) {\n index += 1\n }\n continue\n }\n\n if (code === 0x9b) {\n index = skipCsi(text, index + 1)\n continue\n }\n if (code === 0x90 || code === 0x98 || code === 0x9d || code === 0x9e || code === 0x9f) {\n index = skipControlString(text, index + 1, code === 0x9d)\n continue\n }\n\n if ((code < 0x20 && code !== 0x09 && code !== 0x0a) || (code >= 0x7f && code <= 0x9f)) {\n continue\n }\n if ((code >= 0x202a && code <= 0x202e) || (code >= 0x2066 && code <= 0x2069)) continue\n output += text[index]\n }\n\n return output\n}\n\nfunction skipCsi(text: string, from: number): number {\n for (let index = from; index < text.length; index += 1) {\n const code = text.charCodeAt(index)\n if (code >= 0x40 && code <= 0x7e) return index\n }\n return text.length - 1\n}\n\nfunction skipControlString(text: string, from: number, bellTerminates: boolean): number {\n for (let index = from; index < text.length; index += 1) {\n const code = text.charCodeAt(index)\n if (bellTerminates && code === 0x07) return index\n if (code === 0x9c) return index\n if (code === 0x1b && text.charCodeAt(index + 1) === 0x5c) return index + 1\n }\n return text.length - 1\n}\n","import { detectProvider } from '../config/detect'\nimport { formatModelRef, parseModelRef } from '../config/schema'\nimport type { Config } from '../config/schema'\nimport path from 'node:path'\nimport { mkdir } from 'node:fs/promises'\nimport { projectSkillsDir, skillsDir } from '../config/paths'\nimport {\n configLocation,\n loadAuth,\n loadRuntimeConfig,\n resolveApiKey,\n saveAuth,\n saveConfig,\n} from '../config/store'\nimport { canonicalWorkspace, isWorkspaceTrusted } from '../config/trust'\nimport { runTurn } from '../core/agent'\nimport type { AgentConfig, ToolLookup } from '../core/agent'\nimport { createTurnBudget } from '../core/budget'\nimport type { TurnBudget } from '../core/budget'\nimport { beginCheckpoint, undoLatestCheckpoint } from '../core/checkpoint'\nimport type { FileCheckpoint } from '../core/checkpoint'\nimport { runAutomaticDiagnostics } from '../core/diagnostics'\nimport {\n loadAttachment,\n loadAutomaticAttachment,\n loadClipboardImage as readClipboardImage,\n} from '../core/attachments'\nimport {\n compactCutIndex,\n compactHistory,\n estimateCompactBudget,\n shouldAutoCompact,\n} from '../core/compact'\nimport { buildSystemPrompt } from '../core/prompt'\nimport {\n createSession,\n deleteAllSessions as deleteAllStoredSessions,\n deleteSession as deleteStoredSession,\n exportSession as exportStoredSession,\n latestSessionFor,\n listSessions,\n loadSession,\n renameSession as renameStoredSession,\n resolveSessionId,\n saveSession,\n shortSessionId,\n} from '../core/session'\nimport { createSubagentRunner } from '../core/subagent'\nimport type { AgentHooks, ContextUsage, SessionState } from '../core/types'\nimport {\n contextTokens,\n createUsageTracker,\n formatUsageBreakdown,\n formatUsageCompact,\n usageParts,\n} from '../core/usage'\nimport { createMcpManager } from '../mcp/client'\nimport { fetchProviderBalance } from '../providers/balance'\nimport { loadModels } from '../providers/catalog'\nimport { pricingFor } from '../providers/pricing'\nimport { createRegistry } from '../providers/registry'\nimport { formatRateLimits } from '../providers/rate-limits'\nimport type { Effort, Message, ModelInfo, ModelPricing, RateLimits } from '../providers/types'\nimport { createPermissionEngine } from '../tools/permissions'\nimport type { AgentMode } from '../tools/permissions'\nimport { builtinTools, createToolRegistry } from '../tools/registry'\nimport { deletePrompt, getPrompt, listPrompts, promptExists, savePrompt } from '../prompts/library'\nimport { discoverSkills, formatSkillCatalogue, loadSkill } from '../skills/library'\nimport { installSkill } from '../skills/install'\nimport { createSkillTool } from '../tools/skill'\nimport { createTaskTool } from '../tools/task'\nimport type { Lang } from '../ui/i18n'\nimport type { Runtime } from '../ui/runtime'\nimport type { PickerItem } from '../ui/types'\nimport { checkForUpdates } from '../core/update'\nimport { KITCODE_COMMIT, KITCODE_VERSION } from '../version'\n\nconst PREFERRED = ['claude-opus-5', 'claude-sonnet-5', 'gpt-5', 'claude-opus-4-8']\n\nexport interface Boot {\n runtime: Runtime\n history: Message[]\n warnings: string[]\n shutdown(): Promise<void>\n}\n\nexport async function boot(options: {\n cwd: string\n continueSession?: boolean\n resumeId?: string\n bypass?: boolean\n mode?: AgentMode\n modelRef?: string\n}): Promise<Boot> {\n const loadedConfig = await loadRuntimeConfig(options.cwd)\n const config = loadedConfig.config\n const auth = await loadAuth()\n const location = await configLocation()\n const warnings: string[] = []\n const workspaceRoot = await canonicalWorkspace(options.cwd)\n const workspaceTrusted = await isWorkspaceTrusted(options.cwd)\n const startupUpdate = config.updates.checkOnStart ? checkForUpdates() : null\n if (loadedConfig.ignoredProject) {\n warnings.push(\n `Project config ignored until this workspace is trusted: ${loadedConfig.ignoredProject.path}. ` +\n `Review it, then run: kitcode trust`,\n )\n }\n\n let registry = createRegistry(config, auth)\n const modelPricing = new Map<string, ModelPricing>()\n const rememberModels = (providerId: string, models: ModelInfo[]) => {\n for (const model of models) {\n if (model.pricing) modelPricing.set(formatModelRef(providerId, model.id), model.pricing)\n }\n }\n const resolvePricing = (ref: string) => modelPricing.get(ref) ?? pricingFor(ref)\n const tools = createToolRegistry(builtinTools())\n const permissions = createPermissionEngine(config.permissions)\n if (options.bypass) permissions.bypass.enable()\n if (options.mode) permissions.mode.set(options.mode)\n\n const skillRoots = workspaceTrusted ? [projectSkillsDir(workspaceRoot), skillsDir] : [skillsDir]\n let skills = await discoverSkills(skillRoots)\n if (skills.length > 0) tools.register([createSkillTool(skills)])\n\n const mcp = createMcpManager(config.mcp)\n await mcp.connectAll()\n let registeredMcpToolNames = new Set<string>()\n const syncMcpTools = () => {\n tools.unregister(registeredMcpToolNames)\n const connected = mcp.tools()\n tools.register(connected)\n registeredMcpToolNames = new Set(\n connected.filter((tool) => tools.get(tool.name) === tool).map((tool) => tool.name),\n )\n }\n syncMcpTools()\n for (const state of mcp.states()) {\n if (state.status === 'error') warnings.push(`MCP \"${state.name}\": ${state.error ?? 'failed'}`)\n }\n\n let session: SessionState\n if (options.resumeId) {\n session = await loadSession(await resolveSessionId(options.resumeId))\n } else {\n session =\n (options.continueSession ? await latestSessionFor(options.cwd) : null) ??\n createSession(options.cwd, config.model ?? '')\n }\n\n const usage = createUsageTracker(session.usage, resolvePricing)\n let skillCatalogue = formatSkillCatalogue(skills)\n const mainSystemPrompt = () =>\n buildSystemPrompt({\n cwd: options.cwd,\n toolNames: tools.list().map((tool) => tool.name),\n skills: skillCatalogue,\n })\n\n let modelRef = session.model || config.model || ''\n if (options.modelRef) modelRef = options.modelRef\n let contextUsage: ContextUsage | undefined =\n session.context?.model === modelRef ? session.context : undefined\n let modelContextWindow: number | null = null\n let latestRateLimits: { model: string; limits: RateLimits } | undefined\n const contextListeners = new Set<() => void>()\n\n const notifyContext = () => {\n for (const listener of contextListeners) listener()\n }\n\n const knownContextWindow = (ref: string): number | null => {\n const parsed = parseModelRef(ref)\n if (!parsed) return null\n try {\n const models = registry.get(parsed.provider).knownModels()\n rememberModels(parsed.provider, models)\n const found = models.find((model) => model.id === parsed.model)\n return found?.contextWindow ?? null\n } catch {\n return null\n }\n }\n\n const activateModel = (\n ref: string,\n restoredContext?: ContextUsage,\n discoveredWindow?: number,\n ) => {\n modelRef = ref\n if (latestRateLimits?.model !== ref) latestRateLimits = undefined\n contextUsage = restoredContext?.model === ref ? restoredContext : undefined\n modelContextWindow = discoveredWindow ?? knownContextWindow(ref)\n notifyContext()\n }\n\n modelContextWindow = knownContextWindow(modelRef)\n\n \n async function refreshModelContextWindow(): Promise<void> {\n const targetRef = modelRef\n const parsed = parseModelRef(targetRef)\n if (!parsed) {\n if (modelRef === targetRef) {\n modelContextWindow = null\n notifyContext()\n }\n return\n }\n \n \n \n let next = modelContextWindow ?? knownContextWindow(targetRef)\n try {\n const provider = registry.get(parsed.provider)\n const models = await loadModels(provider)\n rememberModels(parsed.provider, models)\n const found = models.find((m) => m.id === parsed.model)\n next = found?.contextWindow ?? next\n } catch {\n \n }\n if (modelRef === targetRef) {\n modelContextWindow = next\n notifyContext()\n }\n }\n\n const agentConfigFor = (system: string, toolset: ToolLookup): AgentConfig => {\n const resolved = registry.resolve(modelRef)\n return {\n provider: resolved.provider,\n modelId: resolved.modelId,\n modelRef,\n system,\n tools: toolset,\n permissions,\n usage,\n cwd: options.cwd,\n maxTokens: config.maxTokens,\n effort: config.effort,\n thinking: config.thinking,\n budget: activeBudget,\n checkpoint: activeCheckpoint,\n }\n }\n\n let activeBudget: TurnBudget | undefined\n let activeCheckpoint: FileCheckpoint | undefined\n let activeAgentCount = 0\n const activeAgents: { description: string; progress: string[] }[] = []\n\n const subagentRunner = createSubagentRunner(agentConfigFor, tools)\n const wrappedRunner = {\n run: async (request: import('../core/subagent').SubagentRequest): Promise<string> => {\n activeAgentCount += 1\n const entry = { description: request.description ?? '', progress: [] as string[] }\n activeAgents.push(entry)\n const trackedRequest = {\n ...request,\n onProgress: (summary: string) => {\n entry.progress.push(summary)\n request.onProgress(summary)\n },\n }\n try {\n return await subagentRunner.run(trackedRequest)\n } finally {\n activeAgentCount = Math.max(0, activeAgentCount - 1)\n const idx = activeAgents.indexOf(entry)\n if (idx !== -1) activeAgents.splice(idx, 1)\n }\n },\n }\n\n tools.register([\n createTaskTool(wrappedRunner, config.budget.maxSubagentsPerTurn),\n ])\n\n let persistQueue: Promise<void> = Promise.resolve()\n\n let configQueue: Promise<void> = Promise.resolve()\n const persistConfig = (mutate: (draft: Config) => void): Promise<void> => {\n const save = configQueue.catch(() => undefined).then(async () => {\n const before = structuredClone(config)\n mutate(config)\n try {\n await saveConfig(config)\n } catch (error) {\n Object.assign(config, before)\n throw error\n }\n })\n configQueue = save\n return save\n }\n\n const compactWithBudget = async (\n history: Message[],\n signal: AbortSignal,\n budget: TurnBudget,\n ) => {\n if (compactCutIndex(history) <= 0) {\n return { history, compacted: false as const, removedMessages: 0 }\n }\n const resolved = registry.resolve(modelRef)\n const estimate = estimateCompactBudget(history, config.maxTokens)\n const budgetDecision = budget.beforeRequest({\n modelRef,\n maxOutputTokens: estimate.maxOutputTokens,\n estimatedInputTokens: estimate.inputTokens,\n })\n if (!budgetDecision.allowed) throw new Error(budgetDecision.reason)\n const result = await compactHistory({\n provider: resolved.provider,\n model: resolved.modelId,\n history,\n maxTokens: config.maxTokens,\n maxTotalOutputTokens: budgetDecision.maxOutputTokens,\n signal,\n })\n if (result.usage) {\n budget.record(modelRef, result.usage)\n usage.record(modelRef, result.usage)\n }\n if (result.rateLimits) latestRateLimits = { model: modelRef, limits: result.rateLimits }\n if (result.compacted) {\n contextUsage = undefined\n session.context = undefined\n notifyContext()\n }\n return result\n }\n\n const runtime: Runtime = {\n cwd: options.cwd,\n\n needsSetup: () => Object.keys(config.providers).length === 0,\n\n async addProvider(url, key) {\n const detected = await detectProvider(url, key)\n rememberModels(detected.id, detected.models)\n const configBefore = structuredClone(config)\n const authBefore = { ...auth }\n config.providers[detected.id] = detected.config\n auth[detected.id] = key\n\n const chosen = preferredModel(detected.models)\n if (chosen) config.model = formatModelRef(detected.id, chosen)\n\n try {\n await saveConfig(config)\n await saveAuth(auth)\n } catch (error) {\n Object.assign(config, configBefore)\n for (const id of Object.keys(auth)) delete auth[id]\n Object.assign(auth, authBefore)\n await Promise.allSettled([saveConfig(config), saveAuth(auth)])\n throw error\n }\n\n registry = createRegistry(config, auth)\n const nextRef = config.model ?? ''\n const discovered = detected.models.find((model) => model.id === chosen)?.contextWindow\n activateModel(nextRef, undefined, discovered)\n void refreshModelContextWindow()\n\n const kind = detected.config.type === 'anthropic' ? 'Anthropic' : 'OpenAI-compatible'\n return `${detected.id} · ${kind} · ${detected.models.length} models`\n },\n\n currentProviderId: () => parseModelRef(modelRef)?.provider,\n\n listProviderItems: () =>\n Object.entries(config.providers).map(([id, entry]) => ({\n key: id,\n label: entry.label ?? id,\n hint: `${entry.type === 'anthropic' ? 'Anthropic' : 'OpenAI-compatible'} · ${entry.baseUrl}`,\n })),\n\n async useProvider(id) {\n const models = await loadModels(registry.get(id))\n rememberModels(id, models)\n const chosen = preferredModel(models)\n if (!chosen) throw new Error(`\"${id}\" returned no models to switch to.`)\n const ref = formatModelRef(id, chosen)\n registry.resolve(ref)\n activateModel(ref, undefined, models.find((model) => model.id === chosen)?.contextWindow)\n await persistConfig((draft) => {\n draft.model = ref\n })\n void refreshModelContextWindow()\n return ref\n },\n\n async logout(providerId) {\n const provider = config.providers[providerId]\n if (!provider) throw new Error(`Provider \"${providerId}\" is not configured.`)\n const previousKey = auth[providerId]\n const previousModel = config.model\n const previousActiveModel = modelRef\n const wasActive = parseModelRef(modelRef)?.provider === providerId\n const configuredWasRemoved = parseModelRef(config.model ?? '')?.provider === providerId\n\n delete config.providers[providerId]\n delete auth[providerId]\n if (configuredWasRemoved) {\n config.model =\n !wasActive && config.providers[parseModelRef(modelRef)?.provider ?? ''] ? modelRef : undefined\n }\n registry = createRegistry(config, auth)\n\n let nextModel: string | undefined\n if (wasActive) {\n if (config.model) {\n try {\n registry.resolve(config.model)\n nextModel = config.model\n } catch {\n config.model = undefined\n }\n }\n if (!nextModel) {\n for (const remaining of Object.keys(config.providers)) {\n try {\n const models = await loadModels(registry.get(remaining))\n rememberModels(remaining, models)\n const chosen = preferredModel(models)\n if (!chosen) continue\n nextModel = formatModelRef(remaining, chosen)\n config.model = nextModel\n break\n } catch {\n \n }\n }\n }\n }\n\n try {\n await saveConfig(config)\n await saveAuth(auth)\n } catch (error) {\n config.providers[providerId] = provider\n if (previousKey !== undefined) auth[providerId] = previousKey\n config.model = previousModel\n registry = createRegistry(config, auth)\n if (wasActive) activateModel(previousActiveModel)\n await Promise.allSettled([saveConfig(config), saveAuth(auth)])\n throw error\n }\n\n if (wasActive) {\n activateModel(nextModel ?? '')\n if (nextModel) void refreshModelContextWindow()\n }\n return { removed: providerId, wasActive, ...(nextModel ? { nextModel } : {}) }\n },\n\n async changeProviderKey(providerId, newKey) {\n const provider = config.providers[providerId]\n if (!provider) throw new Error(`Provider \"${providerId}\" is not configured.`)\n\n const previousKey = auth[providerId]\n const restoreKey = () => {\n if (previousKey === undefined) delete auth[providerId]\n else auth[providerId] = previousKey\n }\n auth[providerId] = newKey\n\n try {\n const testRegistry = createRegistry(config, auth)\n await testRegistry.get(providerId).listModels()\n } catch (error) {\n restoreKey()\n throw new Error(\n `Key verification failed for \"${providerId}\": ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n\n try {\n await saveAuth(auth)\n } catch (error) {\n restoreKey()\n throw error\n }\n registry = createRegistry(config, auth)\n if (parseModelRef(modelRef)?.provider === providerId) {\n const models = await loadModels(registry.get(providerId))\n rememberModels(providerId, models)\n void refreshModelContextWindow()\n }\n },\n\n sessionId: () => session.id,\n\n async newSession() {\n await persistQueue.catch(() => undefined)\n session = createSession(options.cwd, modelRef)\n usage.reset()\n contextUsage = undefined\n latestRateLimits = undefined\n notifyContext()\n return session.id\n },\n\n async listSessionItems() {\n await persistQueue.catch(() => undefined)\n const entries = await listSessions(30)\n return entries.map((entry) => ({\n key: entry.id,\n label: entry.title || `${shortSessionId(entry.id)} ${entry.updatedAt.slice(0, 16).replace('T', ' ')}`,\n hint: `${entry.updatedAt.slice(0, 16).replace('T', ' ')} · ${entry.messageCount} msgs · ${entry.cwd}`,\n }))\n },\n\n async resumeSession(id) {\n const loaded = await loadSession(await resolveSessionId(id))\n session = loaded\n usage.restore(loaded.usage)\n activateModel(loaded.model || modelRef, loaded.context)\n void refreshModelContextWindow()\n return loaded.messages\n },\n\n async renameSession(id, title) {\n await persistQueue.catch(() => undefined)\n const renamed = await renameStoredSession(id, title)\n if (renamed.id === session.id) session = renamed\n return renamed.title ?? shortSessionId(renamed.id)\n },\n\n async deleteSession(id) {\n await persistQueue.catch(() => undefined)\n const resolved = await resolveSessionId(id)\n const wasActive = resolved === session.id\n await deleteStoredSession(resolved)\n if (!wasActive) return { id: resolved, wasActive: false }\n\n session = createSession(options.cwd, modelRef)\n usage.restore([])\n contextUsage = undefined\n latestRateLimits = undefined\n notifyContext()\n return { id: resolved, wasActive: true, newSessionId: session.id }\n },\n\n async deleteAllSessions() {\n await persistQueue.catch(() => undefined)\n const result = await deleteAllStoredSessions()\n session = createSession(options.cwd, modelRef)\n usage.restore([])\n contextUsage = undefined\n latestRateLimits = undefined\n notifyContext()\n return { deleted: result.deleted.length, failed: result.failed }\n },\n\n async exportSession(id, destination) {\n await persistQueue.catch(() => undefined)\n const target = destination\n ? path.resolve(options.cwd, destination)\n : path.join(options.cwd, '.kitcode-exports')\n if (!destination) await mkdir(target, { recursive: true, mode: 0o700 })\n return (await exportStoredSession(id, target)).path\n },\n\n configPath: () => location.path,\n\n listSkills: () => skills.map((skill) => ({ name: skill.name, description: skill.description })),\n\n getModelRef: () => modelRef,\n async setModelRef(ref) {\n registry.resolve(ref)\n activateModel(ref)\n await persistConfig((draft) => {\n draft.model = ref\n })\n void refreshModelContextWindow()\n },\n\n getEffort: () => config.effort,\n async setEffort(effort: Effort) {\n await persistConfig((draft) => {\n draft.effort = effort\n })\n },\n\n getThinking: () => config.thinking,\n async setThinking(enabled) {\n await persistConfig((draft) => {\n draft.thinking = enabled\n })\n },\n\n getMaxTokensPerTurn: () => config.budget.maxTokensPerTurn,\n async setMaxTokensPerTurn(tokens: number) {\n await persistConfig((draft) => {\n draft.budget.maxTokensPerTurn = tokens\n })\n },\n\n getLang: () => config.lang,\n async setLang(lang: Lang) {\n await persistConfig((draft) => {\n draft.lang = lang\n })\n },\n\n getAccent: () => config.theme.accent,\n async setAccent(value) {\n await persistConfig((draft) => {\n draft.theme.accent = value\n })\n },\n\n getMode: () => permissions.mode.get(),\n cycleMode: () => permissions.mode.cycle(),\n\n isBypassEnabled: () => permissions.bypass.isEnabled(),\n setBypass(enabled) {\n if (enabled) permissions.bypass.enable()\n else permissions.bypass.disable()\n },\n\n mcpSummary() {\n const states = mcp.states()\n return {\n connected: states.filter((state) => state.status === 'connected').length,\n failed: states.filter((state) => state.status === 'error').length,\n }\n },\n\n activeAgentsCount: () => activeAgentCount,\n\n activeAgentsList: () => activeAgents.map((a) => ({\n description: a.description,\n progress: [...a.progress],\n })),\n\n mcpServers: () => mcp.states(),\n\n async addMcpServer(name, server) {\n if (Object.hasOwn(config.mcp, name)) {\n throw new Error(`MCP server \"${name}\" already exists.`)\n }\n\n config.mcp[name] = server\n await mcp.reconnect(name)\n const state = mcp.state(name)\n if (!state || state.status !== 'connected') {\n delete config.mcp[name]\n await mcp.remove(name)\n throw new Error(state?.error ?? `MCP server \"${name}\" did not connect.`)\n }\n\n try {\n await saveConfig(config)\n } catch (error) {\n delete config.mcp[name]\n await mcp.remove(name)\n throw error\n }\n\n syncMcpTools()\n return state\n },\n\n async removeMcpServer(name) {\n const existing = config.mcp[name]\n if (!existing) throw new Error(`MCP server \"${name}\" does not exist.`)\n\n delete config.mcp[name]\n try {\n await saveConfig(config)\n } catch (error) {\n config.mcp[name] = existing\n throw error\n }\n\n await mcp.remove(name)\n syncMcpTools()\n },\n\n async setMcpEnabled(name, enabled) {\n const existing = config.mcp[name]\n if (!existing) throw new Error(`MCP server \"${name}\" does not exist.`)\n const previous = existing.enabled\n existing.enabled = enabled\n try {\n await saveConfig(config)\n await mcp.reconnect(name)\n } catch (error) {\n existing.enabled = previous\n await saveConfig(config).catch(() => undefined)\n await mcp.reconnect(name).catch(() => undefined)\n throw error\n }\n syncMcpTools()\n const state = mcp.state(name)\n if (!state) throw new Error(`MCP server \"${name}\" disappeared.`)\n return state\n },\n\n modelContext: () => {\n const exact = contextUsage?.model === modelRef\n const used = exact && contextUsage ? contextTokens(contextUsage.usage) : 0\n return { window: modelContextWindow, used, exact }\n },\n\n subscribeContext(listener) {\n contextListeners.add(listener)\n return () => contextListeners.delete(listener)\n },\n\n resetContext() {\n contextUsage = undefined\n session.context = undefined\n notifyContext()\n },\n\n undoLastCheckpoint: () =>\n undoLatestCheckpoint({ cwd: options.cwd, sessionId: session.id }),\n\n usageLine: () => formatUsageCompact(usage),\n usageReport: () => formatUsageBreakdown(usage),\n rateLimitsReport() {\n if (!latestRateLimits || latestRateLimits.model !== modelRef) return null\n const lines = formatRateLimits(latestRateLimits.limits)\n return lines.length > 0 ? `rate limits\\n${lines.join('\\n')}` : null\n },\n async providerBalance() {\n const providerId = parseModelRef(modelRef)?.provider\n if (!providerId) return null\n const provider = config.providers[providerId]\n if (!provider) return null\n const key = resolveApiKey(providerId, provider, auth)\n return key ? fetchProviderBalance(provider, key) : null\n },\n usageParts: () => usageParts(usage),\n\n async listModelItems() {\n const items: PickerItem[] = []\n for (const providerId of Object.keys(config.providers)) {\n try {\n const models = await loadModels(registry.get(providerId))\n rememberModels(providerId, models)\n for (const model of models) {\n items.push({\n key: formatModelRef(providerId, model.id),\n label: formatModelRef(providerId, model.id),\n hint: model.pricing ? `$${model.pricing.input}/$${model.pricing.output}` : undefined,\n })\n }\n } catch {\n warnings.push(`Could not list models for \"${providerId}\"`)\n }\n }\n return items\n },\n\n async listPromptItems() {\n const prompts = await listPrompts()\n return prompts.map((prompt) => ({\n key: prompt.slug,\n label: prompt.name,\n hint: prompt.description || undefined,\n }))\n },\n\n async readPrompt(slug) {\n const prompt = await getPrompt(slug)\n return prompt?.body ?? ''\n },\n\n async savePrompt(name, body) {\n await savePrompt({ name, body })\n },\n\n async deletePrompt(slug) {\n const ok = await deletePrompt(slug)\n if (!ok) throw new Error(`Prompt \"${slug}\" not found.`)\n },\n\n async loadSkill(name) {\n const meta = skills.find((s) => s.name === name)\n if (!meta) throw new Error(`Skill \"${name}\" not found.`)\n return (await loadSkill(meta)).body\n },\n\n async installSkill(source) {\n const result = await installSkill(source)\n skills = await discoverSkills(skillRoots)\n skillCatalogue = formatSkillCatalogue(skills)\n tools.unregister(['skill'])\n if (skills.length > 0) tools.register([createSkillTool(skills)])\n return result\n },\n\n async loadAttachment(requestedPath) {\n return (await loadAttachment(options.cwd, requestedPath)).block\n },\n\n async loadAutomaticAttachment(requestedPath) {\n return (await loadAutomaticAttachment(options.cwd, requestedPath))?.block ?? null\n },\n\n async loadClipboardImage() {\n return readClipboardImage()\n },\n\n async compact(history, signal) {\n return compactWithBudget(history, signal, createTurnBudget(config.budget, resolvePricing))\n },\n\n async checkerReport() {\n const providerId = parseModelRef(modelRef)?.provider\n const provider = providerId ? config.providers[providerId] : undefined\n const states = mcp.states()\n const lines = [\n `KitCode ${KITCODE_VERSION} · ${KITCODE_COMMIT.slice(0, 12)}`,\n `updates: ${config.updates.checkOnStart ? 'enabled' : 'disabled'}`,\n `runtime: Node ${process.versions.node} · ${process.platform}/${process.arch}`,\n `workspace: ${options.cwd}`,\n `config: ${location.path}`,\n `session: ${shortSessionId(session.id)} · ${session.messages.length} messages`,\n `model: ${modelRef || 'not selected'}`,\n ]\n if (providerId && provider) {\n lines.push(\n `provider: ${provider.label ?? providerId} · ${provider.type} · ${provider.baseUrl}`,\n )\n try {\n const models = await registry.get(providerId).listModels()\n rememberModels(providerId, models)\n lines.push(`provider check: ok · ${models.length} models`)\n } catch (error) {\n lines.push(`provider check: failed · ${error instanceof Error ? error.message : String(error)}`)\n }\n } else {\n lines.push('provider check: not configured')\n }\n const context = runtime.modelContext()\n lines.push(\n `context: ${context.exact ? context.used : 'unknown'} / ${context.window ?? 'unknown'}`,\n `MCP: ${states.filter((state) => state.status === 'connected').length} connected · ${states.filter((state) => state.status === 'disabled').length} disabled · ${states.filter((state) => state.status === 'error').length} failed`,\n )\n return lines.join('\\n')\n },\n\n startupUpdateCheck: () => startupUpdate,\n\n async run(history, hooks, signal) {\n syncMcpTools()\n const runProviderId = parseModelRef(modelRef)?.provider\n if (runProviderId) {\n try {\n const models = await loadModels(registry.get(runProviderId))\n rememberModels(runProviderId, models)\n } catch (error) {\n warnings.push(\n `Could not refresh models for \"${runProviderId}\": ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n let requestHistory = history\n const budget = createTurnBudget(config.budget, resolvePricing)\n const previousContext = runtime.modelContext()\n if (shouldAutoCompact(previousContext.used, previousContext.window)) {\n hooks.onEvent({ type: 'notice', level: 'info', text: 'Context is 80% full; compacting older messages…' })\n try {\n const result = await compactWithBudget(requestHistory, signal, budget)\n if (result.compacted) {\n requestHistory = result.history\n hooks.onEvent({\n type: 'notice',\n level: 'info',\n text: `Compacted older context; kept the latest conversation (${result.removedMessages} messages replaced).`,\n })\n }\n } catch (error) {\n if (signal.aborted) return history\n hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: `Automatic context compaction failed; continuing with the original context: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n }\n const requestModelRef = modelRef\n const checkpoint = beginCheckpoint({ cwd: options.cwd, sessionId: session.id })\n activeBudget = budget\n activeCheckpoint = checkpoint\n const trackedHooks: AgentHooks = {\n ...hooks,\n onEvent(event) {\n if (event.type === 'turn_start') {\n contextUsage = undefined\n notifyContext()\n }\n if (event.type === 'usage') {\n contextUsage = { model: requestModelRef, usage: event.usage }\n notifyContext()\n }\n if (event.type === 'rate_limits') {\n latestRateLimits = { model: requestModelRef, limits: event.limits }\n }\n hooks.onEvent(event)\n },\n }\n try {\n const next = await runTurn(\n agentConfigFor(mainSystemPrompt(), tools),\n requestHistory,\n trackedHooks,\n signal,\n )\n if (config.diagnostics.autoRun && !signal.aborted) {\n await runAutomaticDiagnostics({\n cwd: options.cwd,\n changedFiles: checkpoint.changedPaths(),\n configuredCommands: config.diagnostics.commands,\n permissions,\n hooks: trackedHooks,\n signal,\n })\n }\n return next\n } finally {\n try {\n await checkpoint.commit()\n } catch (error) {\n hooks.onEvent({\n type: 'notice',\n level: 'error',\n text: `Could not save the automatic undo checkpoint: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n if (activeCheckpoint === checkpoint) activeCheckpoint = undefined\n if (activeBudget === budget) {\n activeBudget = undefined\n }\n }\n },\n\n async persist(history) {\n const snapshot: SessionState = {\n ...session,\n messages: history,\n usage: usage.entries(),\n model: modelRef,\n context: contextUsage,\n }\n session = snapshot\n const save = persistQueue.catch(() => undefined).then(() => saveSession(snapshot))\n persistQueue = save\n await save\n },\n }\n\n void refreshModelContextWindow()\n\n return {\n runtime,\n history: session.messages,\n warnings,\n async shutdown() {\n try {\n await Promise.all([persistQueue, configQueue])\n } finally {\n await mcp.close()\n }\n },\n }\n}\n\nfunction preferredModel(models: ModelInfo[]): string | undefined {\n for (const preferred of PREFERRED) {\n const match = models.find((model) => model.id.endsWith(preferred))\n if (match) return match.id\n }\n return models[0]?.id\n}\n","import { randomBytes } from 'node:crypto'\nimport { readFile, readdir, rename, stat, unlink, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport { ensureDir, sessionsDir } from '../config/paths'\nimport { redactSecrets } from '../providers/errors'\nimport type { ContentBlock, Message, Usage } from '../providers/types'\nimport type { ContextUsage, SessionState, UsageEntry } from './types'\n\nconst MAX_SESSION_BYTES = 50_000_000\n\nexport interface SessionSummary {\n id: string\n title?: string\n cwd: string\n model: string\n updatedAt: string\n messageCount: number\n}\n\nexport interface DeleteAllSessionsResult {\n deleted: string[]\n failed: Array<{ id: string; error: string }>\n}\n\nexport function createSession(cwd: string, model: string): SessionState {\n const now = new Date().toISOString()\n const stamp = now.replace(/[:.]/g, '-')\n return {\n id: `${stamp}-${randomBytes(3).toString('hex')}`,\n cwd,\n createdAt: now,\n updatedAt: now,\n model,\n messages: [],\n usage: [],\n }\n}\n\nexport async function saveSession(state: SessionState): Promise<void> {\n assertSessionId(state.id)\n state.updatedAt = new Date().toISOString()\n await ensureDir(sessionsDir)\n const file = path.join(sessionsDir, `${state.id}.json`)\n const temp = `${file}.${process.pid}.${randomBytes(4).toString('hex')}.tmp`\n try {\n await writeFile(temp, JSON.stringify(state), { encoding: 'utf8', mode: 0o600 })\n await atomicRename(temp, file)\n } catch (error) {\n await unlink(temp).catch(() => undefined)\n throw error\n }\n}\n\nasync function atomicRename(from: string, to: string, retries = 5): Promise<void> {\n for (let attempt = 0; attempt < retries; attempt++) {\n try {\n await rename(from, to)\n return\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code\n if (code !== 'EPERM' && code !== 'EBUSY') throw error\n if (attempt < retries - 1) {\n await new Promise((resolve) => setTimeout(resolve, 50 * (attempt + 1)))\n }\n }\n }\n await rename(from, to)\n}\n\nexport async function loadSession(id: string): Promise<SessionState> {\n assertSessionId(id)\n const file = path.join(sessionsDir, `${id}.json`)\n let raw: string\n try {\n const info = await stat(file)\n if (info.size > MAX_SESSION_BYTES) {\n throw new Error(`Session exceeds the ${MAX_SESSION_BYTES / 1_000_000} MB load limit: ${file}`)\n }\n raw = await readFile(file, 'utf8')\n } catch (error) {\n if (error instanceof Error && error.message.startsWith('Session exceeds')) throw error\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`No session found at ${file}`)\n }\n throw new Error(`Could not read session ${file}: ${(error as Error).message}`)\n }\n const state = readState(raw)\n if (!state) throw new Error(`Session file is not readable as a session: ${file}`)\n return state\n}\n\nexport async function listSessions(limit = 20): Promise<SessionSummary[]> {\n const files = await filesByRecency()\n const summaries: SessionSummary[] = []\n for (const file of files.slice(0, limit)) {\n const state = readState(await readFile(file, 'utf8').catch(() => ''))\n if (state) {\n summaries.push({\n id: state.id,\n title: state.title,\n cwd: state.cwd,\n model: state.model,\n updatedAt: state.updatedAt,\n messageCount: state.messages.length,\n })\n }\n }\n return summaries\n}\n\nexport async function renameSession(query: string, title: string): Promise<SessionState> {\n const id = await resolveSessionId(query)\n const trimmed = title.trim().replace(/[\\r\\n\\0-\\x1f\\x7f]+/g, ' ').slice(0, 120)\n if (!trimmed) throw new Error('Give the session a non-empty title.')\n const state = await loadSession(id)\n state.title = trimmed\n await saveSession(state)\n return state\n}\n\nexport async function deleteSession(query: string): Promise<string> {\n const id = await resolveSessionId(query)\n assertSessionId(id)\n await unlink(path.join(sessionsDir, `${id}.json`)).catch((error: NodeJS.ErrnoException) => {\n if (error.code === 'ENOENT') throw new Error(`Session no longer exists: ${id}`)\n throw error\n })\n return id\n}\n\nexport async function deleteAllSessions(): Promise<DeleteAllSessionsResult> {\n let names: string[]\n try {\n names = await readdir(sessionsDir)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return { deleted: [], failed: [] }\n throw error\n }\n\n const ids = names.flatMap((name) => {\n if (!name.endsWith('.json')) return []\n const id = name.slice(0, -'.json'.length)\n try {\n assertSessionId(id)\n return [id]\n } catch {\n return []\n }\n })\n const results = await Promise.allSettled(\n ids.map((id) => unlink(path.join(sessionsDir, `${id}.json`))),\n )\n const deleted: string[] = []\n const failed: DeleteAllSessionsResult['failed'] = []\n for (const [index, result] of results.entries()) {\n const id = ids[index] as string\n if (result.status === 'fulfilled' || (result.reason as NodeJS.ErrnoException)?.code === 'ENOENT') {\n deleted.push(id)\n } else {\n failed.push({\n id,\n error: result.reason instanceof Error ? result.reason.message : String(result.reason),\n })\n }\n }\n return { deleted, failed }\n}\n\nexport async function exportSession(\n query: string,\n destination: string,\n): Promise<{ id: string; path: string }> {\n const id = await resolveSessionId(query)\n const state = await loadSession(id)\n const target = await resolveExportTarget(destination, state)\n await writeFile(target, renderSessionMarkdown(state), {\n encoding: 'utf8',\n mode: 0o600,\n flag: 'wx',\n }).catch((error: NodeJS.ErrnoException) => {\n if (error.code === 'EEXIST') {\n throw new Error(`Export already exists; choose another path: ${target}`)\n }\n throw error\n })\n return { id, path: target }\n}\n\nexport async function latestSessionFor(cwd: string): Promise<SessionState | null> {\n for (const file of await filesByRecency()) {\n const state = readState(await readFile(file, 'utf8').catch(() => ''))\n if (state?.cwd === cwd) return state\n }\n return null\n}\n\nexport function sanitizeHistory(messages: Message[]): Message[] {\n const resolved = new Set<string>()\n const out: Message[] = []\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n const content = message.content.filter(\n (block) => block.type !== 'tool_use' || resolved.has(block.id),\n )\n for (const block of message.content) {\n if (block.type === 'tool_result') resolved.add(block.toolUseId)\n }\n if (content.length === 0) continue\n out.push(content.length === message.content.length ? message : { ...message, content })\n }\n return out.reverse()\n}\n\nasync function filesByRecency(): Promise<string[]> {\n let names: string[]\n try {\n names = await readdir(sessionsDir)\n } catch {\n return []\n }\n const dated = await Promise.all(\n names\n .filter((name) => name.endsWith('.json'))\n .map(async (name) => {\n const file = path.join(sessionsDir, name)\n const info = await stat(file).catch(() => null)\n return { file, at: info?.mtimeMs ?? 0, size: info?.size ?? 0 }\n }),\n )\n return dated\n .filter((entry) => entry.size <= MAX_SESSION_BYTES)\n .sort((a, b) => b.at - a.at)\n .map((entry) => entry.file)\n}\n\nfunction readState(raw: string): SessionState | null {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return null\n }\n if (typeof parsed !== 'object' || parsed === null) return null\n const state = parsed as Partial<SessionState>\n if (typeof state.id !== 'string' || !validSessionId(state.id)) return null\n const messages = readMessages(state.messages)\n if (!messages) return null\n return {\n id: state.id,\n title: typeof state.title === 'string' ? state.title.slice(0, 120) : undefined,\n cwd: typeof state.cwd === 'string' ? state.cwd : '',\n createdAt: typeof state.createdAt === 'string' ? state.createdAt : '',\n updatedAt: typeof state.updatedAt === 'string' ? state.updatedAt : '',\n model: typeof state.model === 'string' ? state.model : '',\n messages,\n usage: readUsageEntries(state.usage),\n context: readContextUsage(state.context),\n }\n}\n\nfunction readMessages(value: unknown): Message[] | null {\n if (!Array.isArray(value)) return null\n const messages: Message[] = []\n for (const item of value) {\n if (typeof item !== 'object' || item === null) return null\n const candidate = item as { role?: unknown; content?: unknown }\n if (candidate.role !== 'user' && candidate.role !== 'assistant') return null\n if (!Array.isArray(candidate.content)) return null\n const content: ContentBlock[] = []\n for (const block of candidate.content) {\n if (!validContentBlock(block)) return null\n content.push(block)\n }\n messages.push({ role: candidate.role, content })\n }\n return messages\n}\n\nfunction validContentBlock(value: unknown): value is ContentBlock {\n if (typeof value !== 'object' || value === null) return false\n const block = value as Record<string, unknown>\n switch (block.type) {\n case 'text':\n case 'thinking':\n return typeof block.text === 'string'\n case 'tool_use':\n return typeof block.id === 'string' && typeof block.name === 'string'\n case 'tool_result':\n return (\n typeof block.toolUseId === 'string' &&\n typeof block.content === 'string' &&\n (block.isError === undefined || typeof block.isError === 'boolean')\n )\n case 'image':\n return (\n typeof block.name === 'string' &&\n typeof block.data === 'string' &&\n block.data.length <= MAX_SESSION_BYTES * 2 &&\n ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].includes(String(block.mediaType))\n )\n case 'file':\n return (\n typeof block.name === 'string' &&\n typeof block.mediaType === 'string' &&\n typeof block.text === 'string'\n )\n default:\n return false\n }\n}\n\nfunction readUsageEntries(value: unknown): UsageEntry[] {\n if (!Array.isArray(value)) return []\n return value.flatMap((item) => {\n if (typeof item !== 'object' || item === null) return []\n const candidate = item as { model?: unknown; usage?: unknown; requests?: unknown }\n const usage = readUsage(candidate.usage)\n if (\n typeof candidate.model !== 'string' ||\n !usage ||\n !Number.isInteger(candidate.requests) ||\n (candidate.requests as number) < 0\n ) {\n return []\n }\n return [{ model: candidate.model, usage, requests: candidate.requests as number, costUsd: null }]\n })\n}\n\nasync function resolveExportTarget(destination: string, state: SessionState): Promise<string> {\n const resolved = path.resolve(destination)\n const info = await stat(resolved).catch(() => null)\n if (info?.isDirectory()) {\n return path.join(resolved, exportFileName(state))\n }\n if (info) throw new Error(`Export destination is not a directory: ${resolved}`)\n const parent = await stat(path.dirname(resolved)).catch(() => null)\n if (!parent?.isDirectory()) throw new Error(`Export directory does not exist: ${path.dirname(resolved)}`)\n return resolved\n}\n\nfunction exportFileName(state: SessionState): string {\n const title = state.title\n ?.toLowerCase()\n .replace(/[^a-z0-9а-яё]+/giu, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 48)\n return `kitcode-session-${title || shortSessionId(state.id)}.md`\n}\n\nfunction renderSessionMarkdown(state: SessionState): string {\n const lines = [\n `# ${state.title || `KitCode session ${shortSessionId(state.id)}`}`,\n '',\n `- Session: ${state.id}`,\n `- Workspace: ${state.cwd}`,\n `- Model: ${state.model || 'unknown'}`,\n `- Updated: ${state.updatedAt}`,\n '',\n ]\n for (const message of state.messages) {\n const rendered = renderMessage(message.content)\n if (!rendered) continue\n lines.push(`## ${message.role === 'user' ? 'User' : 'Assistant'}`, '', rendered, '')\n }\n return `${redactSecrets(lines.join('\\n')).trimEnd()}\\n`\n}\n\nfunction renderMessage(content: ContentBlock[]): string {\n const sections: string[] = []\n for (const block of content) {\n if (block.type === 'text') sections.push(block.text)\n else if (block.type === 'image') sections.push(`[Image attached: ${block.name}]`)\n else if (block.type === 'file') sections.push(`[File attached: ${block.name}]\\n\\n${block.text}`)\n else if (block.type === 'tool_use') sections.push(`> Tool: ${block.name}`)\n else if (block.type === 'tool_result') {\n sections.push(`> Tool result${block.isError ? ' (error)' : ''}:\\n> ${block.content.replace(/\\n/g, '\\n> ')}`)\n }\n \n }\n return sections.join('\\n\\n').trim()\n}\n\nfunction readContextUsage(value: unknown): ContextUsage | undefined {\n if (typeof value !== 'object' || value === null) return undefined\n const candidate = value as { model?: unknown; usage?: unknown }\n if (typeof candidate.model !== 'string') return undefined\n const usage = readUsage(candidate.usage)\n return usage ? { model: candidate.model, usage } : undefined\n}\n\nfunction readUsage(value: unknown): Usage | undefined {\n if (typeof value !== 'object' || value === null) return undefined\n const usage = value as Partial<Record<keyof Usage, unknown>>\n const fields: Array<keyof Usage> = ['input', 'output', 'cacheWrite', 'cacheRead']\n if (\n fields.some(\n (field) =>\n typeof usage[field] !== 'number' ||\n !Number.isFinite(usage[field]) ||\n (usage[field] as number) < 0,\n )\n ) {\n return undefined\n }\n return {\n input: usage.input as number,\n output: usage.output as number,\n cacheWrite: usage.cacheWrite as number,\n cacheRead: usage.cacheRead as number,\n }\n}\n\nexport function shortSessionId(id: string): string {\n const dash = id.lastIndexOf('-')\n return dash === -1 ? id : id.slice(dash + 1)\n}\n\nexport async function resolveSessionId(query: string): Promise<string> {\n const trimmed = query.trim()\n if (trimmed === '') throw new Error('Give a session id. List them with: kitcode sessions')\n\n const summaries = await listSessions(200)\n const exact = summaries.find((entry) => entry.id === trimmed)\n if (exact) return exact.id\n\n const matches = summaries.filter((entry) => entry.id.includes(trimmed))\n if (matches.length === 1) return (matches[0] as SessionSummary).id\n if (matches.length === 0) {\n throw new Error(`No session matches \"${trimmed}\". List them with: kitcode sessions`)\n }\n throw new Error(\n `\"${trimmed}\" matches ${matches.length} sessions. Be more specific:\\n` +\n matches\n .slice(0, 5)\n .map((entry) => ` ${shortSessionId(entry.id)} ${entry.updatedAt} ${entry.cwd}`)\n .join('\\n'),\n )\n}\n\nfunction assertSessionId(id: string): void {\n if (!validSessionId(id)) {\n throw new Error(`Invalid session id: ${id}`)\n }\n}\n\nfunction validSessionId(id: string): boolean {\n return /^[A-Za-z0-9_-]{1,240}$/.test(id)\n}\n","import type {\n ChatRequest,\n ContentBlock,\n Effort,\n Message,\n Provider,\n RefusalInfo,\n StopReason,\n ToolResultBlock,\n ToolSchema,\n ToolUseBlock,\n Usage,\n} from '../providers/types'\nimport { ProviderError } from '../providers/types'\nimport type {\n FileCheckpointSink,\n PermissionMode,\n Tool,\n ToolContext,\n ToolDisplay,\n} from '../tools/types'\nimport type { AgentHooks } from './types'\nimport { sanitizeHistory } from './session'\nimport type { TurnBudget } from './budget'\n\nconst MAX_PAUSE_RESUMES = 5\nconst MAX_RETRIES = 3\nconst INITIAL_BACKOFF_MS = 1000\n\nexport const MAX_TURN_STEPS = 64\nexport const MAX_TOOL_CALLS_PER_STEP = 32\n\nexport interface ToolLookup {\n get(name: string): Tool | undefined\n schemas(): ToolSchema[]\n}\n\nexport interface PermissionGate {\n decide(tool: Tool, requested?: PermissionMode): PermissionMode\n grantForSession(name: string): void\n denyReason?(tool: Tool, requested?: PermissionMode): string | undefined\n}\n\nexport interface UsageSink {\n record(modelRef: string, usage: Usage): void\n}\n\nexport interface AgentConfig {\n provider: Provider\n modelId: string\n modelRef: string\n system: string\n tools: ToolLookup\n permissions: PermissionGate\n usage: UsageSink\n cwd: string\n maxTokens: number\n effort: Effort\n thinking: boolean\n budget?: TurnBudget\n checkpoint?: FileCheckpointSink\n}\n\ninterface StreamOutcome {\n content: ContentBlock[]\n stopReason: StopReason\n refusal?: RefusalInfo\n}\n\nexport async function runTurn(\n cfg: AgentConfig,\n history: Message[],\n hooks: AgentHooks,\n signal: AbortSignal,\n): Promise<Message[]> {\n let messages = [...history]\n let pauses = 0\n let steps = 0\n\n for (;;) {\n if (++steps > MAX_TURN_STEPS) {\n hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: `Stopped after ${MAX_TURN_STEPS} model calls without finishing, to avoid burning tokens in a loop. Ask again with a narrower request.`,\n })\n hooks.onEvent({ type: 'turn_end', stopReason: 'max_tokens' })\n return messages\n }\n\n const budgetDecision = cfg.budget?.beforeRequest({\n modelRef: cfg.modelRef,\n maxOutputTokens: cfg.maxTokens,\n estimatedInputTokens: estimateRequestTokens(cfg, messages),\n })\n if (budgetDecision && !budgetDecision.allowed) {\n hooks.onEvent({ type: 'notice', level: 'warn', text: budgetDecision.reason })\n hooks.onEvent({ type: 'turn_end', stopReason: 'max_tokens' })\n return messages\n }\n\n hooks.onEvent({ type: 'turn_start' })\n const outcome = await consumeStream(\n cfg,\n messages,\n hooks,\n signal,\n budgetDecision?.maxOutputTokens ?? cfg.maxTokens,\n )\n messages.push({ role: 'assistant', content: outcome.content })\n\n if (outcome.stopReason === 'aborted') {\n hooks.onEvent({ type: 'turn_end', stopReason: 'aborted' })\n return sanitizeHistory(messages)\n }\n\n if (outcome.stopReason === 'tool_use') {\n const callCount = outcome.content.filter((block) => block.type === 'tool_use').length\n if (callCount > MAX_TOOL_CALLS_PER_STEP) {\n hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: `The model returned ${callCount} tool calls at once; the limit is ${MAX_TOOL_CALLS_PER_STEP}. None were run. Ask it to split the work into smaller batches.`,\n })\n hooks.onEvent({ type: 'turn_end', stopReason: 'max_tokens' })\n return sanitizeHistory(messages)\n }\n const results = await runToolCalls(cfg, outcome.content, hooks, signal)\n if (results.length > 0) messages.push({ role: 'user', content: results })\n if (signal.aborted) {\n hooks.onEvent({ type: 'turn_end', stopReason: 'aborted' })\n return sanitizeHistory(messages)\n }\n continue\n }\n\n if (outcome.stopReason === 'pause_turn') {\n pauses += 1\n if (pauses <= MAX_PAUSE_RESUMES) continue\n hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: `Server-side tool loop still paused after ${MAX_PAUSE_RESUMES} resumes; stopping.`,\n })\n }\n\n if (outcome.stopReason === 'refusal') {\n hooks.onEvent({ type: 'notice', level: 'warn', text: describeRefusal(outcome.refusal) })\n }\n\n if (outcome.stopReason === 'max_tokens') {\n hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: 'Output hit maxTokens and was cut off. Raise maxTokens in config or ask it to continue.',\n })\n }\n\n hooks.onEvent({ type: 'turn_end', stopReason: outcome.stopReason })\n return messages\n }\n}\n\nasync function consumeStream(\n cfg: AgentConfig,\n messages: Message[],\n hooks: AgentHooks,\n signal: AbortSignal,\n maxTokens: number,\n): Promise<StreamOutcome> {\n const request: ChatRequest = {\n model: cfg.modelId,\n system: cfg.system,\n messages,\n tools: cfg.tools.schemas(),\n maxTokens,\n effort: cfg.effort,\n thinking: cfg.thinking,\n signal,\n }\n\n let outcome: StreamOutcome | undefined\n\n for await (const event of streamWithRetry(cfg.provider, request, cfg.modelRef, signal)) {\n switch (event.type) {\n case 'text_delta':\n hooks.onEvent({ type: 'text_delta', text: event.text })\n break\n case 'thinking_delta':\n hooks.onEvent({ type: 'thinking_delta', text: event.text })\n break\n case 'usage':\n cfg.budget?.record(cfg.modelRef, event.usage)\n cfg.usage.record(cfg.modelRef, event.usage)\n hooks.onEvent({ type: 'usage', model: cfg.modelRef, usage: event.usage })\n break\n case 'rate_limits':\n hooks.onEvent({ type: 'rate_limits', model: cfg.modelRef, limits: event.limits })\n break\n case 'tool_call':\n break\n case 'done':\n outcome = { content: event.content, stopReason: event.stopReason, refusal: event.refusal }\n break\n }\n }\n\n if (outcome) return outcome\n if (signal.aborted) return { content: [], stopReason: 'aborted' }\n throw new Error(\n `\"${cfg.provider.id}\" ended the stream without completing the turn — nothing was generated. The endpoint answered, but not with a usable ${cfg.provider.kind} response.`,\n )\n}\n\nasync function* streamWithRetry(\n provider: Provider,\n request: ChatRequest,\n modelRef: string,\n signal: AbortSignal,\n): AsyncGenerator<import('../providers/types').StreamEvent> {\n let lastError: unknown\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n if (signal.aborted) return\n try {\n for await (const event of provider.stream(request)) {\n yield event\n }\n return\n } catch (error) {\n lastError = error\n if (attempt >= MAX_RETRIES) break\n const waitMs = retryBackoffMs(error, attempt)\n if (waitMs > 0) {\n await sleep(waitMs, signal)\n continue\n }\n break\n }\n }\n if (lastError) throw lastError\n}\n\nfunction retryBackoffMs(error: unknown, attempt: number): number {\n if (!isRateLimitError(error)) return 0\n const serverWait = retryAfterFromError(error)\n if (serverWait > 0) return Math.min(serverWait, 60_000)\n return Math.min(INITIAL_BACKOFF_MS * 2 ** attempt, 30_000)\n}\n\nfunction isRateLimitError(error: unknown): boolean {\n if (!(error instanceof ProviderError)) return false\n return error.status === 429\n}\n\nfunction retryAfterFromError(error: unknown): number {\n const cause = (error as { cause?: unknown })?.cause\n const headers = (cause as { headers?: unknown })?.headers\n if (headers && typeof (headers as { get?: unknown }).get === 'function') {\n const ms = Number((headers as { get: (k: string) => string | null }).get('retry-after-ms'))\n if (Number.isFinite(ms) && ms > 0) return ms\n const raw = (headers as { get: (k: string) => string | null }).get('retry-after')\n if (raw) {\n const s = Number(raw)\n if (Number.isFinite(s) && s > 0) return s * 1000\n }\n }\n return 0\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(signal.reason ?? new Error('Aborted'))\n return\n }\n const finish = () => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }\n const onAbort = () => {\n clearTimeout(id)\n reject(signal.reason ?? new Error('Aborted'))\n }\n const id = setTimeout(finish, ms)\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n\nfunction estimateRequestTokens(cfg: AgentConfig, messages: Message[]): number {\n let characters = cfg.system.length\n try {\n characters += JSON.stringify(messages, (_key, value) =>\n typeof value === 'object' && value !== null && (value as { type?: unknown }).type === 'image'\n ? `[image:${'#'.repeat(2_000)}]`\n : value,\n ).length\n characters += JSON.stringify(cfg.tools.schemas()).length\n } catch {\n return Math.max(1, characters)\n }\n\n return Math.max(1, characters)\n}\n\nasync function runToolCalls(\n cfg: AgentConfig,\n content: ContentBlock[],\n hooks: AgentHooks,\n signal: AbortSignal,\n): Promise<ToolResultBlock[]> {\n const calls = content.filter((block): block is ToolUseBlock => block.type === 'tool_use')\n // Calls may share the permission overlay, checkpoint, filesystem, or process\n // state. Preserve call order so one prompt cannot overwrite another and hang.\n const results: ToolResultBlock[] = []\n for (const call of calls) results.push(await runOneCall(cfg, call, hooks, signal))\n return results\n}\n\nasync function runOneCall(\n cfg: AgentConfig,\n call: ToolUseBlock,\n hooks: AgentHooks,\n signal: AbortSignal,\n): Promise<ToolResultBlock> {\n const tool = cfg.tools.get(call.name)\n if (!tool) {\n return toolError(call.id, `Unknown tool \"${call.name}\". Use only the tools provided.`)\n }\n\n const summary = describeCall(tool, call.input)\n const ctx: ToolContext = {\n cwd: cfg.cwd,\n signal,\n requestPermission: (request) => hooks.requestPermission(request),\n checkpoint: cfg.checkpoint,\n onEvent: (event) => hooks.onEvent(event),\n confirm: async (question) =>\n (await hooks.requestPermission({\n toolName: tool.name,\n summary: question,\n input: call.input,\n })) !== 'deny',\n }\n\n const requestedPermission = requestedPermissionFor(tool, call.input, ctx)\n const gate = cfg.permissions.decide(tool, requestedPermission)\n if (gate === 'deny') {\n return toolError(\n call.id,\n cfg.permissions.denyReason?.(tool, requestedPermission) ??\n `Tool \"${tool.name}\" is disabled by the user's configuration. Do not retry it; find another way or ask.`,\n )\n }\n\n if (gate === 'ask') {\n const decision = await hooks.requestPermission({\n toolName: tool.name,\n summary,\n input: call.input,\n display: await previewCall(tool, call.input, ctx),\n allowAlways: canAlwaysApprove(tool),\n })\n if (decision === 'deny') {\n return toolError(call.id, 'The user declined this call. Do not retry it; ask how to proceed.')\n }\n if (decision === 'always') cfg.permissions.grantForSession(tool.name)\n }\n\n if (signal.aborted) {\n return toolError(call.id, 'Interrupted by the user before this tool ran.')\n }\n\n hooks.onEvent({ type: 'tool_start', id: call.id, name: tool.name, summary })\n\n try {\n const result = await tool.execute(call.input, ctx)\n hooks.onEvent({\n type: 'tool_end',\n id: call.id,\n isError: result.isError === true,\n content: result.content,\n display: result.display,\n })\n return {\n type: 'tool_result',\n toolUseId: call.id,\n content: result.content,\n isError: result.isError,\n }\n } catch (error) {\n const text = error instanceof Error ? error.message : String(error)\n hooks.onEvent({ type: 'tool_end', id: call.id, isError: true, content: text })\n return toolError(call.id, text)\n }\n}\n\nasync function previewCall(\n tool: Tool,\n input: unknown,\n ctx: ToolContext,\n): Promise<ToolDisplay | undefined> {\n const preview = tool.preview\n if (!preview) return undefined\n try {\n return await preview.call(tool, input, ctx)\n } catch {\n return undefined\n }\n}\n\nfunction canAlwaysApprove(tool: Tool): boolean {\n return tool.name !== 'bash' && tool.name !== 'task' && !tool.name.startsWith('mcp__')\n}\n\nfunction requestedPermissionFor(\n tool: Tool,\n input: unknown,\n ctx: ToolContext,\n): PermissionMode | undefined {\n try {\n return tool.permission?.(input, ctx)\n } catch {\n return undefined\n }\n}\n\nfunction describeCall(tool: Tool, input: unknown): string {\n try {\n return tool.summarize(input)\n } catch {\n return tool.name\n }\n}\n\nfunction describeRefusal(refusal: RefusalInfo | undefined): string {\n const parts = ['The model declined this request.']\n if (refusal?.category) parts.push(`Category: ${refusal.category}.`)\n if (refusal?.explanation) parts.push(refusal.explanation)\n return parts.join(' ')\n}\n\nfunction toolError(toolUseId: string, content: string): ToolResultBlock {\n return { type: 'tool_result', toolUseId, content, isError: true }\n}\n","import type { ModelPricing, Usage } from './types'\n\nconst CACHE_WRITE_MULTIPLIER = 1.25\nconst CACHE_READ_MULTIPLIER = 0.1\n\nconst PRICING: Record<string, ModelPricing> = {\n 'claude-opus-5': { input: 5, output: 25 },\n 'claude-opus-4-8': { input: 5, output: 25 },\n 'claude-sonnet-5': { input: 3, output: 15 },\n 'claude-haiku-4-5': { input: 1, output: 5 },\n 'claude-fable-5': { input: 10, output: 50 },\n}\n\nexport function pricingFor(model: string): ModelPricing | undefined {\n const direct = PRICING[model]\n if (direct) return direct\n const slash = model.lastIndexOf('/')\n return slash === -1 ? undefined : PRICING[model.slice(slash + 1)]\n}\n\nexport function costOf(usage: Usage, pricing?: ModelPricing): number | null {\n if (!pricing) return null\n const cacheWrite = pricing.cacheWrite ?? pricing.input * CACHE_WRITE_MULTIPLIER\n const cacheRead = pricing.cacheRead ?? pricing.input * CACHE_READ_MULTIPLIER\n const total =\n usage.input * pricing.input +\n usage.output * pricing.output +\n usage.cacheWrite * cacheWrite +\n usage.cacheRead * cacheRead\n return total / 1_000_000\n}\n","import { addUsage, emptyUsage } from '../providers/types'\nimport type { Usage } from '../providers/types'\nimport { costOf, pricingFor } from '../providers/pricing'\nimport type { PricingResolver } from './usage'\n\nconst UNKNOWN_MODEL_PRICING = { input: 3, output: 15 } as const\n\nexport interface BudgetLimits {\n maxTokensPerTurn: number\n maxCostUsdPerTurn: number\n}\n\nexport interface TurnBudget {\n beforeRequest(request: {\n modelRef: string\n maxOutputTokens: number\n estimatedInputTokens: number\n }): { allowed: true; maxOutputTokens: number } | { allowed: false; reason: string }\n record(modelRef: string, usage: Usage): void\n snapshot(): { tokens: number; costUsd: number | null }\n}\n\nexport function createTurnBudget(\n limits: BudgetLimits,\n resolvePricing: PricingResolver = pricingFor,\n): TurnBudget {\n let usage = emptyUsage()\n let costUsd: number | null = 0\n\n const snapshot = () => ({\n tokens: usage.input + usage.output + usage.cacheWrite + usage.cacheRead,\n costUsd,\n })\n\n return {\n beforeRequest(request) {\n const current = snapshot()\n if (limits.maxTokensPerTurn > 0 && current.tokens >= limits.maxTokensPerTurn) {\n return {\n allowed: false,\n reason: `Turn stopped at the token budget (${limits.maxTokensPerTurn.toLocaleString()} tokens). This is a safety limit to prevent runaway costs. To disable it, run: /budget 0`,\n }\n }\n if (current.costUsd !== null && current.costUsd >= limits.maxCostUsdPerTurn) {\n return {\n allowed: false,\n reason: `Turn stopped at the cost budget ($${limits.maxCostUsdPerTurn.toFixed(2)}). Send another message to continue.`,\n }\n }\n\n const estimatedInput = finitePositive(request.estimatedInputTokens)\n const tokenLimit = limits.maxTokensPerTurn\n let outputLimit = tokenLimit === 0\n ? finitePositive(request.maxOutputTokens)\n : Math.min(\n finitePositive(request.maxOutputTokens),\n tokenLimit - current.tokens - estimatedInput,\n )\n if (outputLimit < 1) {\n return {\n allowed: false,\n reason: `Turn stopped because the next request would exceed the token budget (${limits.maxTokensPerTurn.toLocaleString()} tokens). This is a safety limit to prevent runaway costs. To disable it, run: /budget 0`,\n }\n }\n\n const pricing = resolvePricing(request.modelRef)\n if (current.costUsd !== null) {\n const remainingUsd = limits.maxCostUsdPerTurn - current.costUsd\n // Use fallback pricing if model pricing is unknown to prevent unlimited spending\n const effectivePricing = pricing ?? UNKNOWN_MODEL_PRICING\n const inputUsd = (estimatedInput * effectivePricing.input) / 1_000_000\n const affordableOutput = Math.floor(\n ((remainingUsd - inputUsd) * 1_000_000) / effectivePricing.output,\n )\n outputLimit = Math.min(outputLimit, affordableOutput)\n if (outputLimit < 1) {\n return {\n allowed: false,\n reason: `Turn stopped because the next request would exceed the cost budget ($${limits.maxCostUsdPerTurn.toFixed(2)}). Send another message to continue.`,\n }\n }\n }\n\n return { allowed: true, maxOutputTokens: Math.floor(outputLimit) }\n },\n record(modelRef, next) {\n const normalized = normalizeUsage(next)\n usage = addUsage(usage, normalized)\n const priced = costOf(normalized, resolvePricing(modelRef) ?? UNKNOWN_MODEL_PRICING)\n costUsd = (costUsd ?? 0) + (priced ?? 0)\n },\n snapshot,\n }\n}\n\nfunction normalizeUsage(usage: Usage): Usage {\n return {\n input: finitePositive(usage.input),\n output: finitePositive(usage.output),\n cacheWrite: finitePositive(usage.cacheWrite),\n cacheRead: finitePositive(usage.cacheRead),\n }\n}\n\nfunction finitePositive(value: number): number {\n return Number.isFinite(value) && value > 0 ? value : 0\n}\n","import { createHash, randomBytes } from 'node:crypto'\nimport { createReadStream } from 'node:fs'\nimport {\n chmod,\n lstat,\n mkdir,\n readFile,\n readdir,\n rename,\n stat,\n unlink,\n writeFile,\n} from 'node:fs/promises'\nimport path from 'node:path'\nimport { checkpointsDir, ensureDir } from '../config/paths'\nimport { resolveInside } from '../tools/safepath'\n\nconst VERSION = 1\nconst MAX_FILE_BYTES = 5_000_000\nconst MAX_CHECKPOINT_BYTES = 20_000_000\nconst MAX_CHECKPOINT_JSON_BYTES = 30_000_000\nconst MAX_CHECKPOINTS_PER_SESSION = 20\nconst MAX_ENTRIES = 256\nconst CHECKPOINT_NAME = /^\\d{13}-[a-f0-9]{8}\\.json$/\nlet lastCheckpointTimestamp = 0\n\ninterface FileSnapshot {\n existed: boolean\n data?: string\n mode?: number\n}\n\ninterface Fingerprint {\n existed: boolean\n sha256?: string\n}\n\ninterface CheckpointEntry {\n path: string\n before: FileSnapshot\n after: Fingerprint\n}\n\ninterface StoredCheckpoint {\n version: typeof VERSION\n sessionId: string\n cwd: string\n createdAt: string\n entries: CheckpointEntry[]\n}\n\ninterface CapturedEntry {\n path: string\n absolutePath: string\n before: FileSnapshot\n}\n\nexport interface CheckpointCommit {\n id: string\n paths: string[]\n}\n\nexport interface UndoFailure {\n path: string\n error: string\n}\n\nexport interface UndoResult {\n found: boolean\n restored: string[]\n removed: string[]\n conflicts: string[]\n failed: UndoFailure[]\n}\n\nexport interface FileCheckpoint {\n \n capture(absolutePath: string): Promise<void>\n \n markChanged(absolutePath: string): void\n \n changedPaths(): string[]\n \n commit(): Promise<CheckpointCommit | null>\n}\n\nexport function beginCheckpoint(options: {\n cwd: string\n sessionId: string\n storageDir?: string\n}): FileCheckpoint {\n assertSessionId(options.sessionId)\n const root = workspaceRoot(options.cwd)\n const storageDir = options.storageDir ?? checkpointsDir\n const captured = new Map<string, CapturedEntry>()\n const pending = new Map<string, Promise<void>>()\n const changed = new Set<string>()\n let capturedBytes = 0\n let finished = false\n\n const locate = (file: string) => {\n const safe = resolveInside(root, file)\n if (!safe.ok || safe.relative === '') {\n throw new Error(safe.ok ? 'The workspace root cannot be checkpointed as a file.' : safe.reason)\n }\n return safe\n }\n\n return {\n async capture(absolutePath) {\n if (finished) throw new Error('This checkpoint is already closed.')\n const safe = locate(absolutePath)\n if (captured.has(safe.relative)) return\n const active = pending.get(safe.relative)\n if (active) return active\n if (captured.size + pending.size >= MAX_ENTRIES) {\n throw new Error(`Automatic undo is limited to ${MAX_ENTRIES} files per message.`)\n }\n\n const task = (async () => {\n const { snapshot, bytes } = await snapshotFile(safe.path)\n if (capturedBytes + bytes > MAX_CHECKPOINT_BYTES) {\n throw new Error(\n `Automatic undo is limited to ${MAX_CHECKPOINT_BYTES / 1_000_000} MB of original files per message.`,\n )\n }\n capturedBytes += bytes\n captured.set(safe.relative, {\n path: safe.relative,\n absolutePath: safe.path,\n before: snapshot,\n })\n })()\n pending.set(safe.relative, task)\n try {\n await task\n } finally {\n pending.delete(safe.relative)\n }\n },\n\n markChanged(absolutePath) {\n if (finished) return\n const resolved = path.resolve(absolutePath)\n let capturedEntry = [...captured.values()].find((entry) => entry.absolutePath === resolved)\n if (!capturedEntry) {\n const safe = resolveInside(root, absolutePath)\n if (safe.ok) capturedEntry = captured.get(safe.relative)\n }\n if (capturedEntry) changed.add(capturedEntry.path)\n },\n\n changedPaths() {\n return [...changed].sort()\n },\n\n async commit() {\n if (finished) return null\n finished = true\n await Promise.all(pending.values())\n\n const entries: CheckpointEntry[] = []\n for (const relativePath of [...changed].sort()) {\n const entry = captured.get(relativePath)\n if (!entry) continue\n const after = await fingerprint(entry.absolutePath)\n if (matchesSnapshot(entry.before, after)) continue\n entries.push({ path: entry.path, before: entry.before, after })\n }\n if (entries.length === 0) return null\n\n const stored: StoredCheckpoint = {\n version: VERSION,\n sessionId: options.sessionId,\n cwd: root,\n createdAt: new Date().toISOString(),\n entries,\n }\n const sessionDir = path.join(storageDir, options.sessionId)\n await ensureDir(storageDir)\n await ensureDir(sessionDir)\n lastCheckpointTimestamp = Math.max(Date.now(), lastCheckpointTimestamp + 1)\n const id = `${String(lastCheckpointTimestamp).padStart(13, '0')}-${randomBytes(4).toString('hex')}`\n await writeCheckpoint(path.join(sessionDir, `${id}.json`), stored)\n // Prune old checkpoints, but don't fail the commit if pruning fails\n pruneCheckpoints(sessionDir).catch(() => undefined)\n return { id, paths: entries.map((entry) => entry.path) }\n },\n }\n}\n\nexport async function undoLatestCheckpoint(options: {\n cwd: string\n sessionId: string\n storageDir?: string\n}): Promise<UndoResult> {\n assertSessionId(options.sessionId)\n const root = workspaceRoot(options.cwd)\n const sessionDir = path.join(options.storageDir ?? checkpointsDir, options.sessionId)\n const file = await newestCheckpoint(sessionDir)\n const empty: UndoResult = { found: false, restored: [], removed: [], conflicts: [], failed: [] }\n if (!file) return empty\n\n const checkpoint = await readCheckpoint(file)\n if (checkpoint.sessionId !== options.sessionId || checkpoint.cwd !== root) {\n throw new Error('The latest undo checkpoint belongs to a different workspace or session.')\n }\n\n const result: UndoResult = { ...empty, found: true }\n const retry: CheckpointEntry[] = []\n for (const entry of checkpoint.entries) {\n const safe = resolveInside(root, entry.path)\n if (!safe.ok || safe.relative !== entry.path) {\n result.conflicts.push(entry.path)\n continue\n }\n\n try {\n const current = await fingerprint(safe.path)\n if (!sameFingerprint(current, entry.after)) {\n result.conflicts.push(entry.path)\n continue\n }\n if (entry.before.existed) {\n await restoreFile(root, entry.path, entry.before, entry.after)\n result.restored.push(entry.path)\n } else {\n await unlink(safe.path)\n result.removed.push(entry.path)\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n result.failed.push({ path: entry.path, error: message })\n retry.push(entry)\n }\n }\n\n if (retry.length === 0) {\n await unlink(file)\n } else {\n await writeCheckpoint(file, { ...checkpoint, entries: retry })\n }\n return result\n}\n\nasync function snapshotFile(file: string): Promise<{ snapshot: FileSnapshot; bytes: number }> {\n let info\n try {\n info = await lstat(file)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { snapshot: { existed: false }, bytes: 0 }\n }\n throw error\n }\n if (!info.isFile()) throw new Error(`Cannot checkpoint a non-file path: ${file}`)\n if (info.size > MAX_FILE_BYTES) {\n throw new Error(`Cannot checkpoint ${file}: it exceeds the ${MAX_FILE_BYTES / 1_000_000} MB limit.`)\n }\n const data = await readFile(file)\n if (data.length > MAX_FILE_BYTES) {\n throw new Error(`Cannot checkpoint ${file}: it changed beyond the file-size limit while reading.`)\n }\n return {\n snapshot: { existed: true, data: data.toString('base64'), mode: info.mode & 0o777 },\n bytes: data.length,\n }\n}\n\nasync function fingerprint(file: string): Promise<Fingerprint> {\n let info\n try {\n info = await lstat(file)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return { existed: false }\n throw error\n }\n const hash = createHash('sha256')\n if (!info.isFile()) {\n hash.update(`kitcode:${info.isDirectory() ? 'directory' : 'non-file'}`)\n return { existed: true, sha256: hash.digest('hex') }\n }\n for await (const chunk of createReadStream(file)) hash.update(chunk as Buffer)\n return { existed: true, sha256: hash.digest('hex') }\n}\n\nfunction matchesSnapshot(before: FileSnapshot, after: Fingerprint): boolean {\n if (before.existed !== after.existed) return false\n if (!before.existed) return true\n const data = Buffer.from(before.data ?? '', 'base64')\n return after.sha256 === createHash('sha256').update(data).digest('hex')\n}\n\nfunction sameFingerprint(a: Fingerprint, b: Fingerprint): boolean {\n return a.existed === b.existed && (!a.existed || a.sha256 === b.sha256)\n}\n\nasync function restoreFile(\n root: string,\n relativePath: string,\n snapshot: FileSnapshot,\n expected: Fingerprint,\n): Promise<void> {\n const safe = resolveInside(root, relativePath)\n if (!safe.ok || safe.relative !== relativePath) throw new Error('The restore path changed.')\n const data = decodeSnapshot(snapshot)\n await mkdir(path.dirname(safe.path), { recursive: true })\n const rechecked = resolveInside(root, relativePath)\n if (!rechecked.ok || rechecked.path !== safe.path || rechecked.relative !== relativePath) {\n throw new Error('The restore path changed while preparing its parent directory.')\n }\n const temp = `${rechecked.path}.${process.pid}.${randomBytes(4).toString('hex')}.undo`\n try {\n await writeFile(temp, data, { mode: snapshot.mode ?? 0o600 })\n await chmod(temp, snapshot.mode ?? 0o600)\n const finalPath = resolveInside(root, relativePath)\n if (!finalPath.ok || finalPath.path !== rechecked.path || finalPath.relative !== relativePath) {\n throw new Error('The restore path changed before the file could be replaced.')\n }\n if (!sameFingerprint(await fingerprint(finalPath.path), expected)) {\n throw new Error('The file changed while the checkpoint was being restored.')\n }\n await rename(temp, rechecked.path)\n } catch (error) {\n await unlink(temp).catch(() => undefined)\n throw error\n }\n}\n\nasync function writeCheckpoint(file: string, checkpoint: StoredCheckpoint): Promise<void> {\n const body = `${JSON.stringify(checkpoint)}\\n`\n if (Buffer.byteLength(body) > MAX_CHECKPOINT_JSON_BYTES) {\n throw new Error('Undo checkpoint exceeds its storage limit.')\n }\n const temp = `${file}.${process.pid}.${randomBytes(4).toString('hex')}.tmp`\n try {\n await writeFile(temp, body, { encoding: 'utf8', mode: 0o600 })\n await chmod(temp, 0o600)\n await rename(temp, file)\n } catch (error) {\n await unlink(temp).catch(() => undefined)\n throw error\n }\n}\n\nasync function readCheckpoint(file: string): Promise<StoredCheckpoint> {\n const info = await stat(file)\n if (info.size > MAX_CHECKPOINT_JSON_BYTES) throw new Error('Undo checkpoint is too large to read.')\n let parsed: unknown\n try {\n parsed = JSON.parse(await readFile(file, 'utf8'))\n } catch (error) {\n throw new Error(`Undo checkpoint is not valid JSON: ${(error as Error).message}`)\n }\n if (!isCheckpoint(parsed)) throw new Error('Undo checkpoint has an invalid format.')\n return parsed\n}\n\nfunction isCheckpoint(value: unknown): value is StoredCheckpoint {\n if (typeof value !== 'object' || value === null) return false\n const item = value as Partial<StoredCheckpoint>\n if (\n item.version !== VERSION ||\n typeof item.sessionId !== 'string' ||\n typeof item.cwd !== 'string' ||\n typeof item.createdAt !== 'string' ||\n !Array.isArray(item.entries) ||\n item.entries.length === 0 ||\n item.entries.length > MAX_ENTRIES\n ) {\n return false\n }\n return item.entries.every((entry) => {\n if (typeof entry !== 'object' || entry === null) return false\n const candidate = entry as Partial<CheckpointEntry>\n if (\n typeof candidate.path !== 'string' ||\n candidate.path === '' ||\n path.isAbsolute(candidate.path) ||\n typeof candidate.before !== 'object' ||\n candidate.before === null ||\n typeof candidate.after !== 'object' ||\n candidate.after === null ||\n typeof candidate.before.existed !== 'boolean' ||\n typeof candidate.after.existed !== 'boolean'\n ) {\n return false\n }\n if (candidate.before.existed) {\n if (\n typeof candidate.before.data !== 'string' ||\n typeof candidate.before.mode !== 'number' ||\n !Number.isInteger(candidate.before.mode) ||\n candidate.before.mode < 0 ||\n candidate.before.mode > 0o777 ||\n !validBase64(candidate.before.data)\n ) {\n return false\n }\n if (Buffer.byteLength(candidate.before.data, 'base64') > MAX_FILE_BYTES) return false\n }\n return (\n !candidate.after.existed ||\n (typeof candidate.after.sha256 === 'string' && /^[a-f0-9]{64}$/.test(candidate.after.sha256))\n )\n })\n}\n\nfunction decodeSnapshot(snapshot: FileSnapshot): Buffer {\n if (!snapshot.existed || typeof snapshot.data !== 'string' || !validBase64(snapshot.data)) {\n throw new Error('Checkpoint does not contain restorable file data.')\n }\n const data = Buffer.from(snapshot.data, 'base64')\n if (data.length > MAX_FILE_BYTES) throw new Error('Checkpoint file data exceeds the restore limit.')\n return data\n}\n\nfunction validBase64(value: string): boolean {\n return value.length % 4 === 0 && /^[A-Za-z0-9+/]*={0,2}$/.test(value)\n}\n\nasync function newestCheckpoint(sessionDir: string): Promise<string | null> {\n let names: string[]\n try {\n names = await readdir(sessionDir)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null\n throw error\n }\n const name = names.filter((candidate) => CHECKPOINT_NAME.test(candidate)).sort().at(-1)\n return name ? path.join(sessionDir, name) : null\n}\n\nasync function pruneCheckpoints(sessionDir: string): Promise<void> {\n const names = (await readdir(sessionDir))\n .filter((candidate) => CHECKPOINT_NAME.test(candidate))\n .sort()\n .reverse()\n await Promise.all(\n names.slice(MAX_CHECKPOINTS_PER_SESSION).map((name) => unlink(path.join(sessionDir, name))),\n )\n}\n\nfunction workspaceRoot(cwd: string): string {\n const safe = resolveInside(cwd, '.')\n if (!safe.ok) throw new Error(safe.reason)\n return safe.path\n}\n\nfunction assertSessionId(id: string): void {\n if (!/^[A-Za-z0-9_-]{1,240}$/.test(id)) {\n throw new Error(`Invalid session id: ${id}`)\n }\n}\n","import { realpathSync } from 'node:fs'\nimport { basename, dirname, isAbsolute, relative, resolve, sep } from 'node:path'\n\nexport type SafePath = { ok: true; path: string; relative: string } | { ok: false; reason: string }\n\nfunction canonicalize(target: string): string {\n try {\n return realpathSync(target)\n } catch {\n let current = target\n const trailing: string[] = []\n for (let i = 0; i < 64; i++) {\n try {\n return resolve(realpathSync(current), ...trailing)\n } catch {\n const parent = dirname(current)\n if (parent === current) break\n trailing.unshift(basename(current))\n current = parent\n }\n }\n return resolve(current, ...trailing)\n }\n}\n\nexport function resolveInside(cwd: string, userPath: string): SafePath {\n const root = canonicalize(resolve(cwd))\n const target = canonicalize(resolve(root, userPath))\n const rel = relative(root, target)\n if (rel !== '' && (isAbsolute(rel) || rel.split(sep)[0] === '..')) {\n return { ok: false, reason: `Path ${userPath} resolves outside the workspace root ${root}` }\n }\n return { ok: true, path: target, relative: rel }\n}\n\nexport function patternEscapes(pattern: string): boolean {\n return isAbsolute(pattern) || pattern.split('/').includes('..') || pattern.split('\\\\').includes('..')\n}\n","import { readFile, stat } from 'node:fs/promises'\nimport path from 'node:path'\nimport { bashTool } from '../tools/bash'\nimport { brief } from '../tools/summary'\nimport type { Tool, ToolContext, ToolResult } from '../tools/types'\nimport type { PermissionGate } from './agent'\nimport type { AgentHooks } from './types'\n\nconst MAX_PACKAGE_BYTES = 1_000_000\nconst DIAGNOSTIC_TIMEOUT_MS = 300_000\n\nconst diagnosticsTool: Tool = {\n name: 'diagnostics',\n description: 'Run detected project checks after file edits.',\n inputSchema: { type: 'object' },\n defaultPermission: 'ask',\n summarize: () => 'automatic project checks',\n execute: async () => ({ content: '' }),\n}\n\nexport interface DiagnosticsSummary {\n commands: string[]\n failed: string[]\n skipped: boolean\n}\n\nexport async function detectDiagnosticCommands(\n cwd: string,\n configured: string[] = [],\n): Promise<string[]> {\n const custom = configured.map((command) => command.trim()).filter(Boolean)\n if (custom.length > 0) return custom.slice(0, 8)\n\n const commands: string[] = []\n const packageJson = await readPackageJson(path.join(cwd, 'package.json'))\n if (packageJson) {\n const manager = await packageManager(cwd, packageJson.packageManager)\n for (const name of ['lint', 'typecheck', 'check', 'test']) {\n if (typeof packageJson.scripts?.[name] === 'string') {\n commands.push(scriptCommand(manager, name))\n }\n }\n }\n\n if (await isFile(path.join(cwd, 'Cargo.toml'))) {\n commands.push('cargo check', 'cargo test')\n }\n if (await isFile(path.join(cwd, 'go.mod'))) commands.push('go test ./...')\n if (\n (await isFile(path.join(cwd, 'pyproject.toml'))) ||\n (await isFile(path.join(cwd, 'pytest.ini'))) ||\n (await isFile(path.join(cwd, 'tox.ini')))\n ) {\n commands.push('python -m pytest')\n }\n\n return [...new Set(commands)].slice(0, 8)\n}\n\nexport async function runAutomaticDiagnostics(options: {\n cwd: string\n changedFiles: string[]\n configuredCommands?: string[]\n permissions: PermissionGate\n hooks: AgentHooks\n signal: AbortSignal\n execute?: (command: string, ctx: ToolContext) => Promise<ToolResult>\n}): Promise<DiagnosticsSummary> {\n const commands = await detectDiagnosticCommands(options.cwd, options.configuredCommands)\n const summary: DiagnosticsSummary = { commands, failed: [], skipped: false }\n if (options.changedFiles.length === 0 || commands.length === 0 || options.signal.aborted) {\n summary.skipped = true\n return summary\n }\n\n const gate = options.permissions.decide(diagnosticsTool)\n if (gate === 'deny') {\n summary.skipped = true\n options.hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: 'Automatic project checks were skipped by the current permission settings.',\n })\n return summary\n }\n\n if (gate === 'ask') {\n const decision = await options.hooks.requestPermission({\n toolName: diagnosticsTool.name,\n summary: `run ${commands.length} automatic project ${commands.length === 1 ? 'check' : 'checks'}`,\n input: { commands, changedFiles: options.changedFiles },\n display: {\n kind: 'list',\n title: `After changes to ${options.changedFiles.length} ${options.changedFiles.length === 1 ? 'file' : 'files'}`,\n items: commands,\n },\n allowAlways: true,\n })\n if (options.signal.aborted) {\n summary.skipped = true\n return summary\n }\n if (decision === 'deny') {\n summary.skipped = true\n options.hooks.onEvent({\n type: 'notice',\n level: 'warn',\n text: 'Automatic project checks were skipped.',\n })\n return summary\n }\n if (decision === 'always') options.permissions.grantForSession(diagnosticsTool.name)\n }\n\n const ctx: ToolContext = {\n cwd: options.cwd,\n signal: options.signal,\n confirm: async () => true,\n requestPermission: options.hooks.requestPermission,\n }\n const execute = options.execute ?? ((command, context) =>\n bashTool.execute({ command, timeoutMs: DIAGNOSTIC_TIMEOUT_MS }, context))\n\n for (const [index, command] of commands.entries()) {\n if (options.signal.aborted) {\n summary.skipped = true\n break\n }\n const id = `diagnostics-${Date.now()}-${index}`\n const callSummary = `check · ${brief(command, 160)}`\n options.hooks.onEvent({ type: 'tool_start', id, name: diagnosticsTool.name, summary: callSummary })\n try {\n const result = await execute(command, ctx)\n if (result.isError) summary.failed.push(command)\n options.hooks.onEvent({\n type: 'tool_end',\n id,\n isError: result.isError === true,\n content: result.content,\n display: result.display,\n })\n } catch (error) {\n summary.failed.push(command)\n options.hooks.onEvent({\n type: 'tool_end',\n id,\n isError: true,\n content: error instanceof Error ? error.message : String(error),\n })\n }\n }\n return summary\n}\n\ninterface PackageJson {\n packageManager?: string\n scripts?: Record<string, unknown>\n}\n\nasync function readPackageJson(file: string): Promise<PackageJson | null> {\n try {\n const info = await stat(file)\n if (!info.isFile() || info.size > MAX_PACKAGE_BYTES) return null\n const value: unknown = JSON.parse(await readFile(file, 'utf8'))\n if (typeof value !== 'object' || value === null) return null\n const candidate = value as PackageJson\n return {\n packageManager:\n typeof candidate.packageManager === 'string' ? candidate.packageManager : undefined,\n scripts:\n typeof candidate.scripts === 'object' && candidate.scripts !== null\n ? candidate.scripts\n : undefined,\n }\n } catch {\n return null\n }\n}\n\ntype PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nasync function packageManager(cwd: string, declared?: string): Promise<PackageManager> {\n const name = declared?.split('@')[0]\n if (name === 'pnpm' || name === 'yarn' || name === 'bun' || name === 'npm') return name\n if (await isFile(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm'\n if (await isFile(path.join(cwd, 'yarn.lock'))) return 'yarn'\n if (\n (await isFile(path.join(cwd, 'bun.lock'))) ||\n (await isFile(path.join(cwd, 'bun.lockb')))\n ) {\n return 'bun'\n }\n return 'npm'\n}\n\nfunction scriptCommand(manager: PackageManager, name: string): string {\n return manager === 'yarn' ? `yarn ${name}` : `${manager} run ${name}`\n}\n\nasync function isFile(file: string): Promise<boolean> {\n try {\n return (await stat(file)).isFile()\n } catch {\n return false\n }\n}\n","import { spawn } from 'node:child_process'\nimport { brief } from './summary'\nimport type { Tool, ToolResult } from './types'\n\nconst DEFAULT_TIMEOUT = 120_000\nconst MAX_TIMEOUT = 600_000\nconst MAX_OUTPUT = 100_000\nconst MAX_COMMAND_CHARS = 20_000\n\ninterface BashInput {\n command: string\n timeoutMs?: number\n}\n\nexport const bashTool: Tool = {\n name: 'bash',\n description:\n 'Run a shell command in the workspace root. stdout and stderr are merged. Avoid commands that wait for interactive input.',\n inputSchema: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description: 'Shell command to run',\n maxLength: MAX_COMMAND_CHARS,\n },\n timeoutMs: {\n type: 'integer',\n description: `Timeout in milliseconds (default ${DEFAULT_TIMEOUT}, maximum ${MAX_TIMEOUT})`,\n minimum: 1,\n },\n },\n required: ['command'],\n additionalProperties: false,\n },\n defaultPermission: 'ask',\n summarize(input) {\n return `bash(${brief((input as BashInput).command)})`\n },\n async preview(input) {\n return { kind: 'text', text: (input as BashInput).command }\n },\n execute(input, ctx) {\n const { command, timeoutMs } = input as BashInput\n if (command.length > MAX_COMMAND_CHARS) {\n return Promise.resolve<ToolResult>({\n content: `Command exceeds the ${MAX_COMMAND_CHARS} character limit.`,\n isError: true,\n })\n }\n const requested = timeoutMs && timeoutMs > 0 ? timeoutMs : DEFAULT_TIMEOUT\n const timeout = Math.min(requested, MAX_TIMEOUT)\n if (ctx.signal.aborted) {\n return Promise.resolve<ToolResult>({ content: '[cancelled before the command started]', isError: true })\n }\n\n return new Promise<ToolResult>((settle) => {\n const child = spawn(command, {\n shell: true,\n cwd: ctx.cwd,\n detached: process.platform !== 'win32',\n stdio: ['ignore', 'pipe', 'pipe'],\n \n \n \n windowsHide: true,\n })\n\n const chunks: string[] = []\n let captured = 0\n let truncated = false\n const collect = (buf: Buffer) => {\n if (truncated) return\n \n let text: string\n try {\n text = buf.toString('utf8')\n } catch {\n text = buf.toString()\n }\n if (text.length > MAX_OUTPUT - captured) {\n chunks.push(text.slice(0, MAX_OUTPUT - captured))\n truncated = true\n return\n }\n chunks.push(text)\n captured += text.length\n }\n child.stdout.on('data', collect)\n child.stderr.on('data', collect)\n\n const killTree = () => {\n if (child.pid == null) return\n if (process.platform === 'win32') {\n try {\n spawn('taskkill', ['/pid', String(child.pid), '/t', '/f'], { stdio: 'ignore' })\n } catch {\n child.kill('SIGKILL')\n }\n return\n }\n try {\n process.kill(-child.pid, 'SIGKILL')\n } catch {\n child.kill('SIGKILL')\n }\n }\n\n let timedOut = false\n let aborted = false\n const timer = setTimeout(() => {\n timedOut = true\n killTree()\n }, timeout)\n const onAbort = () => {\n aborted = true\n killTree()\n }\n ctx.signal.addEventListener('abort', onAbort, { once: true })\n\n const finish = (result: ToolResult) => {\n clearTimeout(timer)\n ctx.signal.removeEventListener('abort', onAbort)\n settle(result)\n }\n\n child.on('error', (error) => {\n finish({ content: `Command failed to start: ${error.message}`, isError: true })\n })\n\n child.on('close', (code, signal) => {\n const output = chunks.join('')\n const notes: string[] = []\n if (truncated) notes.push(`[output truncated at ${MAX_OUTPUT} characters]`)\n if (aborted) notes.push('[command was cancelled]')\n else if (timedOut) notes.push(`[command timed out after ${timeout}ms]`)\n \n \n if (code !== 0 && !aborted && !timedOut) {\n notes.push(`[exit ${signal ? `signal ${signal}` : `code ${code}`}]`)\n }\n const body = output.trim() === '' ? '(no output)' : output.replace(/\\n+$/, '')\n finish({ content: [body, ...notes].join('\\n'), isError: aborted || timedOut || code !== 0 })\n })\n })\n },\n}\n","export function brief(value: unknown, max = 60): string {\n const text = String(value ?? '')\n .replace(/\\s+/g, ' ')\n .trim()\n return text.length > max ? `${text.slice(0, max - 1)}…` : text\n}\n","import { execFile } from 'node:child_process'\nimport { lstat, readFile, stat } from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { ContentBlock, FileBlock, ImageBlock } from '../providers/types'\nimport { resolveInside } from '../tools/safepath'\n\nconst MAX_IMAGE_BYTES = 10 * 1024 * 1024\nconst MAX_TEXT_BYTES = 256 * 1024\nconst MAX_CLIPBOARD_OUTPUT_BYTES = MAX_IMAGE_BYTES + 64 * 1024\n\nconst AUTO_PATH_NAMES = new Set(['dockerfile', 'license', 'makefile', 'readme'])\nconst SENSITIVE_AUTO_NAMES = new Set([\n '.env',\n '.netrc',\n '.npmrc',\n '.pypirc',\n '.pgpass',\n '.my.cnf',\n 'auth.json',\n 'credentials.json',\n 'id_dsa',\n 'id_ed25519',\n 'id_ecdsa',\n 'id_rsa',\n 'kitcode.json',\n 'secret.json',\n 'secrets.json',\n 'tokens.json',\n 'kubeconfig',\n 'service-account.json',\n])\nconst SENSITIVE_AUTO_EXTENSIONS = new Set(['.jks', '.key', '.keystore', '.p12', '.pem', '.pfx', '.p8', '.der'])\n\nexport interface LoadedAttachment {\n block: ImageBlock | FileBlock\n bytes: number\n path: string\n}\n\nexport type ClipboardCommandRunner = (command: string, args: string[]) => Promise<Buffer>\n\nexport async function loadAttachment(cwd: string, requestedPath: string): Promise<LoadedAttachment> {\n const resolved = resolveAttachmentPath(cwd, requestedPath)\n const linkInfo = await lstat(resolved).catch(() => null)\n if (linkInfo?.isSymbolicLink()) {\n throw new Error(`Cannot attach symbolic links: ${path.basename(resolved)}`)\n }\n const info = await stat(resolved).catch((error: NodeJS.ErrnoException) => {\n if (error.code === 'ENOENT') throw new Error(`Attachment not found: ${resolved}`)\n throw error\n })\n if (!info.isFile()) throw new Error(`Attachment is not a regular file: ${resolved}`)\n\n return loadResolvedAttachment(resolved, info.size)\n}\n\nexport async function loadAutomaticAttachment(\n cwd: string,\n requestedPath: string,\n): Promise<LoadedAttachment | null> {\n if (!looksLikeAttachmentPath(requestedPath)) return null\n const requested = resolveAttachmentPath(cwd, requestedPath)\n // Pasting a path is an implicit action. Only auto-attach files inside the\n // current workspace; /attach remains available for an intentional external file.\n const safe = resolveInside(cwd, requested)\n if (!safe.ok || safe.relative === '') return null\n const resolved = safe.path\n // Check sensitive files first — they always require explicit /attach\n if (isSensitiveAutomaticPath(resolved)) {\n throw new Error(\n `For safety, sensitive-looking files must be attached explicitly with /attach: ${path.basename(resolved)}`,\n )\n }\n const linkInfo = await lstat(resolved).catch(() => null)\n if (linkInfo?.isSymbolicLink()) return null\n const info = await stat(resolved).catch((error: NodeJS.ErrnoException) => {\n if (error.code === 'ENOENT' || error.code === 'ENOTDIR') return null\n throw error\n })\n if (!info?.isFile()) return null\n return loadResolvedAttachment(resolved, info.size)\n}\n\nexport function looksLikeAttachmentPath(value: string): boolean {\n const trimmed = value.trim()\n if (!trimmed || /[\\r\\n\\0]/.test(trimmed)) return false\n const candidate = normalizeInputPath(trimmed)\n if (/^file:\\/\\//i.test(candidate)) return true\n if (path.isAbsolute(candidate)) return true\n if (/^(?:~|\\.{1,2})[\\\\/]/.test(candidate)) return true\n if (candidate.includes('/') || candidate.includes('\\\\')) return true\n const basename = path.basename(candidate).toLowerCase()\n return path.extname(basename) !== '' || AUTO_PATH_NAMES.has(basename)\n}\n\nexport async function loadClipboardImage(\n platform: NodeJS.Platform = process.platform,\n runner: ClipboardCommandRunner = runClipboardCommand,\n): Promise<ImageBlock> {\n const commands = clipboardCommands(platform)\n if (commands.length === 0) {\n throw new Error(`Clipboard image paste is not supported on ${platform}. Use /attach <path>.`)\n }\n\n for (const command of commands) {\n try {\n const data = await runner(command.file, command.args)\n if (data.length === 0) continue\n const mediaType = detectImage(data)\n if (!mediaType) continue\n if (data.length > MAX_IMAGE_BYTES) {\n throw new Error(`Clipboard image is larger than ${formatBytes(MAX_IMAGE_BYTES)}.`)\n }\n return {\n type: 'image',\n mediaType,\n data: data.toString('base64'),\n name: clipboardImageName(mediaType),\n }\n } catch (error) {\n if (error instanceof Error && error.message.startsWith('Clipboard image is larger')) {\n throw error\n }\n }\n }\n\n const hint =\n platform === 'linux'\n ? 'Copy an image first; Linux requires wl-paste or xclip.'\n : 'Copy an image first, then press Ctrl+V or Cmd+V again.'\n throw new Error(`No supported image found in the clipboard. ${hint}`)\n}\n\nasync function loadResolvedAttachment(resolved: string, size: number): Promise<LoadedAttachment> {\n\n const name = safeName(path.basename(resolved))\n const imageLimitCandidate = size <= MAX_IMAGE_BYTES\n if (!imageLimitCandidate) {\n throw new Error(`Attachment is larger than ${formatBytes(MAX_IMAGE_BYTES)}: ${name}`)\n }\n const data = await readFile(resolved)\n const mediaType = detectImage(data)\n if (mediaType) {\n return {\n path: resolved,\n bytes: data.length,\n block: { type: 'image', mediaType, data: data.toString('base64'), name },\n }\n }\n\n if (data.length > MAX_TEXT_BYTES) {\n throw new Error(`Text attachment is larger than ${formatBytes(MAX_TEXT_BYTES)}: ${name}`)\n }\n if (data.includes(0)) throw new Error(`Unsupported binary attachment: ${name}`)\n let text: string\n try {\n text = new TextDecoder('utf-8', { fatal: true }).decode(data)\n } catch {\n throw new Error(`Attachment is neither a supported image nor UTF-8 text: ${name}`)\n }\n return {\n path: resolved,\n bytes: data.length,\n block: { type: 'file', mediaType: textMime(resolved), text, name },\n }\n}\n\nfunction resolveAttachmentPath(cwd: string, requestedPath: string): string {\n const cleaned = normalizeInputPath(requestedPath.trim())\n if (!cleaned) throw new Error('Give a file path: /attach <path>')\n if (/^file:\\/\\//i.test(cleaned)) {\n try {\n return path.normalize(fileURLToPath(cleaned))\n } catch {\n throw new Error(`Invalid local file URL: ${cleaned}`)\n }\n }\n const expanded =\n cleaned === '~'\n ? os.homedir()\n : cleaned.startsWith('~/')\n ? path.join(os.homedir(), cleaned.slice(2))\n : cleaned\n return path.isAbsolute(expanded) ? path.normalize(expanded) : path.resolve(cwd, expanded)\n}\n\nfunction isSensitiveAutomaticPath(file: string): boolean {\n const basename = path.basename(file).toLowerCase()\n return (\n basename.startsWith('.env.') ||\n SENSITIVE_AUTO_NAMES.has(basename) ||\n SENSITIVE_AUTO_EXTENSIONS.has(path.extname(basename))\n )\n}\n\nexport function attachmentLabel(block: ContentBlock): string | null {\n if (block.type === 'image') return `image: ${block.name}`\n if (block.type === 'file') return `file: ${block.name}`\n return null\n}\n\nfunction detectImage(data: Buffer): ImageBlock['mediaType'] | null {\n if (\n data.length >= 8 &&\n data.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))\n ) {\n return 'image/png'\n }\n if (data.length >= 3 && data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) {\n return 'image/jpeg'\n }\n const prefix = data.subarray(0, 6).toString('ascii')\n if (prefix === 'GIF87a' || prefix === 'GIF89a') return 'image/gif'\n if (\n data.length >= 12 &&\n data.subarray(0, 4).toString('ascii') === 'RIFF' &&\n data.subarray(8, 12).toString('ascii') === 'WEBP'\n ) {\n return 'image/webp'\n }\n return null\n}\n\nfunction clipboardImageName(mediaType: ImageBlock['mediaType']): string {\n if (mediaType === 'image/jpeg') return 'clipboard.jpg'\n if (mediaType === 'image/gif') return 'clipboard.gif'\n if (mediaType === 'image/webp') return 'clipboard.webp'\n return 'clipboard.png'\n}\n\nfunction clipboardCommands(platform: NodeJS.Platform): Array<{ file: string; args: string[] }> {\n if (platform === 'darwin') {\n return [{ file: 'osascript', args: ['-l', 'JavaScript', '-e', MACOS_CLIPBOARD_SCRIPT] }]\n }\n if (platform === 'win32') {\n return [\n {\n file: 'powershell.exe',\n args: ['-NoLogo', '-NoProfile', '-NonInteractive', '-Sta', '-Command', WINDOWS_CLIPBOARD_SCRIPT],\n },\n ]\n }\n if (platform === 'linux') {\n const types = ['image/png', 'image/jpeg', 'image/webp', 'image/gif']\n return [\n ...types.map((type) => ({ file: 'wl-paste', args: ['--no-newline', '--type', type] })),\n ...types.map((type) => ({\n file: 'xclip',\n args: ['-selection', 'clipboard', '-t', type, '-o'],\n })),\n ]\n }\n return []\n}\n\nfunction runClipboardCommand(command: string, args: string[]): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n execFile(\n command,\n args,\n {\n encoding: null,\n maxBuffer: MAX_CLIPBOARD_OUTPUT_BYTES,\n timeout: 5000,\n windowsHide: true,\n },\n (error, stdout) => {\n if (error) reject(error)\n else resolve(Buffer.isBuffer(stdout) ? stdout : Buffer.from(stdout))\n },\n )\n })\n}\n\nconst MACOS_CLIPBOARD_SCRIPT = String.raw`\nObjC.import('AppKit')\nObjC.import('Foundation')\n\nfunction present(value) {\n return value !== null && value !== undefined && ObjC.unwrap(value) !== undefined\n}\n\nfunction pngFromTiff(tiff) {\n if (!present(tiff)) return null\n const bitmap = $.NSBitmapImageRep.imageRepWithData(tiff)\n if (!present(bitmap)) return null\n return bitmap.representationUsingTypeProperties(\n $.NSBitmapImageFileTypePNG,\n $.NSDictionary.dictionary,\n )\n}\n\nconst pasteboard = $.NSPasteboard.generalPasteboard\nlet data = null\nconst directTypes = [\n $.NSPasteboardTypePNG,\n $('public.jpeg'),\n $('com.compuserve.gif'),\n $('public.webp'),\n $('org.webmproject.webp'),\n]\nfor (const type of directTypes) {\n const candidate = pasteboard.dataForType(type)\n if (present(candidate)) {\n data = candidate\n break\n }\n}\n\nif (!present(data)) data = pngFromTiff(pasteboard.dataForType($.NSPasteboardTypeTIFF))\n\nif (!present(data)) {\n const fileUrl = pasteboard.stringForType($.NSPasteboardTypeFileURL)\n if (present(fileUrl)) {\n const image = $.NSImage.alloc.initWithContentsOfURL($.NSURL.URLWithString(fileUrl))\n if (present(image)) data = pngFromTiff(image.TIFFRepresentation)\n }\n}\n\nif (!present(data)) {\n const files = pasteboard.propertyListForType($.NSFilenamesPboardType)\n if (present(files) && ObjC.unwrap(files.count) > 0) {\n const image = $.NSImage.alloc.initWithContentsOfURL(\n $.NSURL.fileURLWithPath(files.objectAtIndex(0)),\n )\n if (present(image)) {\n data = pngFromTiff(image.TIFFRepresentation)\n }\n }\n}\n\nif (!present(data)) throw new Error('no clipboard image')\n$.NSFileHandle.fileHandleWithStandardOutput.writeData(data)\n`\n\nconst WINDOWS_CLIPBOARD_SCRIPT = String.raw`\nAdd-Type -AssemblyName System.Windows.Forms\nAdd-Type -AssemblyName System.Drawing\n$image = [System.Windows.Forms.Clipboard]::GetImage()\nif ($null -eq $image) { exit 2 }\n$stream = New-Object System.IO.MemoryStream\ntry {\n $image.Save($stream, [System.Drawing.Imaging.ImageFormat]::Png)\n $bytes = $stream.ToArray()\n [Console]::OpenStandardOutput().Write($bytes, 0, $bytes.Length)\n} finally {\n $stream.Dispose()\n $image.Dispose()\n}\n`\n\nfunction textMime(file: string): string {\n const extension = path.extname(file).toLowerCase()\n const known: Record<string, string> = {\n '.json': 'application/json',\n '.md': 'text/markdown',\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'text/javascript',\n '.mjs': 'text/javascript',\n '.cjs': 'text/javascript',\n '.ts': 'text/typescript',\n '.tsx': 'text/typescript',\n '.jsx': 'text/javascript',\n '.xml': 'application/xml',\n '.yaml': 'application/yaml',\n '.yml': 'application/yaml',\n '.csv': 'text/csv',\n }\n return known[extension] ?? 'text/plain'\n}\n\nfunction normalizeInputPath(value: string): string {\n if (value.length >= 2) {\n const first = value[0]\n const last = value.at(-1)\n if ((first === '\"' && last === '\"') || (first === \"'\" && last === \"'\")) {\n return value.slice(1, -1)\n }\n }\n return value.replace(/\\\\([\\\\ \"'()\\[\\]&;#$!])/g, (_match, character: string) => character)\n}\n\nfunction safeName(value: string): string {\n return value.replace(/[\\r\\n\\0-\\x1f\\x7f]/g, '').slice(0, 200) || 'attachment'\n}\n\nfunction formatBytes(value: number): string {\n return `${Math.round(value / 1024 / 1024)} MB`\n}\n","import type {\n ContentBlock,\n Message,\n Provider,\n RateLimits,\n Usage,\n} from '../providers/types'\n\nconst KEEP_USER_TURNS = 2\n\n// Size thresholds for deciding the summarization strategy\nconst SINGLE_REQUEST_MAX_CHARS = 80_000\nconst CHUNK_TARGET_CHARS = 35_000\nconst CHUNK_OVERLAP_MESSAGES = 2\nconst CHUNK_OVERLAP_MAX_CHARS = 4_000\nconst MERGE_TARGET_CHARS = 60_000\n\n// Keep requirements more generously than generated prose and noisy tool output.\nconst MAX_USER_TEXT_CHARS = 12_000\nconst MAX_ASSISTANT_TEXT_CHARS = 6_000\nconst MAX_FILE_BLOCK_CHARS = 2_000\nconst MAX_TOOL_RESULT_CHARS = 1_200\nconst MAX_TOOL_ERROR_CHARS = 2_000\nconst MAX_TOOL_INPUT_CHARS = 800\n\n// Output token limits — tight, because a good summary is concise\nconst SINGLE_MAX_TOKENS = 768\nconst CHUNK_MAX_TOKENS = 512\nconst MERGE_MAX_TOKENS = 1_024\n\n// Concurrency for parallel chunk summarization\nconst CHUNK_CONCURRENCY = 3\n\nconst SYSTEM_SUMMARIZE =\n 'You are summarizing a coding conversation so another agent can continue the work. ' +\n 'Extract and preserve ONLY: concrete requirements, user preferences, files changed, ' +\n 'commands run and their results, errors encountered, bugs found, architectural decisions, ' +\n 'and unfinished work. Be terse and factual. Do NOT include greetings, acknowledgments, ' +\n 'chain-of-thought, or step-by-step narration. Return only the summary.'\n\nconst SYSTEM_MERGE =\n 'Merge these partial summaries of a coding conversation into one coherent summary. ' +\n 'Remove duplicates. Preserve: requirements, files changed, commands run, errors, ' +\n 'decisions, and unfinished work. Be terse. Return only the merged summary.'\n\nexport interface CompactResult {\n history: Message[]\n compacted: boolean\n removedMessages: number\n usage?: Usage\n rateLimits?: RateLimits\n}\n\nexport interface CompactBudgetEstimate {\n inputTokens: number\n maxOutputTokens: number\n}\n\nexport async function compactHistory(options: {\n provider: Provider\n model: string\n history: Message[]\n maxTokens: number\n maxTotalOutputTokens?: number\n signal: AbortSignal\n}): Promise<CompactResult> {\n const cut = compactCutIndex(options.history)\n if (cut <= 0) {\n return { history: options.history, compacted: false, removedMessages: 0 }\n }\n\n const oldMessages = options.history.slice(0, cut)\n const renderedMessages = renderMessages(oldMessages)\n const rendered = renderedMessages.join('\\n\\n')\n if (!rendered.trim()) {\n return { history: options.history, compacted: false, removedMessages: 0 }\n }\n\n let summary: string\n let usage: Usage | undefined\n let rateLimits: RateLimits | undefined\n\n if (rendered.length <= SINGLE_REQUEST_MAX_CHARS) {\n const requestMax = singleOutputLimit(options.maxTokens, options.maxTotalOutputTokens)\n const result = await summarizeText(\n options.provider,\n options.model,\n options.maxTokens,\n options.signal,\n rendered,\n SYSTEM_SUMMARIZE,\n requestMax,\n )\n summary = result.text\n usage = result.usage\n rateLimits = result.rateLimits\n } else {\n const chunks = chunkRenderedMessages(\n renderedMessages,\n CHUNK_TARGET_CHARS,\n CHUNK_OVERLAP_MESSAGES,\n CHUNK_OVERLAP_MAX_CHARS,\n )\n const limits = chunkOutputLimits(\n chunks.length,\n options.maxTokens,\n options.maxTotalOutputTokens,\n )\n const chunkResults = await summarizeSourcesParallel(\n options.provider,\n options.model,\n options.maxTokens,\n options.signal,\n chunks,\n SYSTEM_SUMMARIZE,\n limits.chunk,\n )\n const chunkUsages = chunkResults.map((result) => result.usage).filter(Boolean) as Usage[]\n usage = chunkUsages.length > 0 ? mergeUsage(chunkUsages) : undefined\n rateLimits = [...chunkResults].reverse().find((r) => r.rateLimits)?.rateLimits\n\n const mergeResult = await mergePartialSummaries(\n options.provider,\n options.model,\n options.maxTokens,\n options.signal,\n chunkResults.map((result) => result.text),\n limits.merge,\n )\n summary = mergeResult.text\n if (mergeResult.usage) {\n usage = usage ? mergeUsage([usage, mergeResult.usage]) : mergeResult.usage\n }\n if (mergeResult.rateLimits) rateLimits = mergeResult.rateLimits\n }\n\n summary = summary.trim()\n if (!summary) throw new Error('The provider returned an empty context summary.')\n\n const prefix: Message[] = [\n {\n role: 'user',\n content: [{ type: 'text', text: `[Earlier conversation summary]\\n${summary}` }],\n },\n {\n role: 'assistant',\n content: [{ type: 'text', text: 'Earlier context loaded. I will continue from this summary.' }],\n },\n ]\n return {\n history: [...prefix, ...options.history.slice(cut)],\n compacted: true,\n removedMessages: cut,\n usage,\n rateLimits,\n }\n}\n\nexport function shouldAutoCompact(used: number, window: number | null): boolean {\n return window !== null && window > 0 && used / window >= 0.8\n}\n\nexport function compactCutIndex(history: Message[]): number {\n const userTurns: number[] = []\n for (const [index, message] of history.entries()) {\n if (isConversationUser(message)) userTurns.push(index)\n }\n if (userTurns.length <= KEEP_USER_TURNS) return 0\n return userTurns[userTurns.length - KEEP_USER_TURNS] ?? 0\n}\n\nexport function estimateCompactTokens(history: Message[]): number {\n const estimate = estimateCompactBudget(history)\n return Math.max(1, estimate.inputTokens + estimate.maxOutputTokens)\n}\n\nexport function estimateCompactBudget(\n history: Message[],\n maxTokens = MERGE_MAX_TOKENS,\n): CompactBudgetEstimate {\n const cut = compactCutIndex(history)\n if (cut <= 0) return { inputTokens: 1, maxOutputTokens: 0 }\n const renderedMessages = renderMessages(history.slice(0, cut))\n const rendered = renderedMessages.join('\\n\\n')\n if (rendered.length <= SINGLE_REQUEST_MAX_CHARS) {\n return {\n inputTokens: Math.max(1, rendered.length + 1_000),\n maxOutputTokens: Math.max(1, Math.min(SINGLE_MAX_TOKENS, Math.floor(maxTokens))),\n }\n }\n const chunks = chunkRenderedMessages(\n renderedMessages,\n CHUNK_TARGET_CHARS,\n CHUNK_OVERLAP_MESSAGES,\n CHUNK_OVERLAP_MAX_CHARS,\n )\n const chunkInput = chunks.reduce((total, chunk) => total + chunk.length, 0)\n const chunkOutput = Math.max(1, Math.min(CHUNK_MAX_TOKENS, Math.floor(maxTokens)))\n const mergeOutput = Math.max(1, Math.min(MERGE_MAX_TOKENS, Math.floor(maxTokens)))\n const mergeRequests = Math.max(0, chunks.length - 1)\n const totalOutput = chunks.length * chunkOutput + mergeRequests * mergeOutput\n // Every non-final summary can become input to a later merge. Eight chars per\n // output token is intentionally conservative for budget enforcement.\n const intermediateOutput =\n chunks.length * chunkOutput + Math.max(0, mergeRequests - 1) * mergeOutput\n const requestCount = chunks.length + mergeRequests\n return {\n inputTokens: Math.max(1, chunkInput + intermediateOutput * 8 + requestCount * 1_000),\n maxOutputTokens: totalOutput,\n }\n}\n\nfunction isConversationUser(message: Message): boolean {\n if (message.role !== 'user') return false\n return message.content.some(\n (block) =>\n block.type === 'image' ||\n block.type === 'file' ||\n (block.type === 'text' && !block.text.startsWith('[Earlier conversation summary]')),\n )\n}\n\n/** Split already-rendered messages, so chunk decisions match the bytes sent. */\nfunction chunkRenderedMessages(\n messages: string[],\n targetChars: number,\n overlapMessages: number,\n overlapMaxChars: number,\n): string[] {\n const units = messages.flatMap((message) => splitLongMessage(message, targetChars))\n const chunks: string[] = []\n let current: string[] = []\n\n const sizeOf = (parts: string[]) => parts.reduce((total, part) => total + part.length, 0) +\n Math.max(0, parts.length - 1) * 2\n\n for (const unit of units) {\n if (current.length > 0 && sizeOf([...current, unit]) > targetChars) {\n chunks.push(current.join('\\n\\n'))\n const overlap: string[] = []\n let overlapChars = 0\n for (let index = current.length - 1; index >= 0 && overlap.length < overlapMessages; index -= 1) {\n const candidate = current[index] as string\n if (overlapChars + candidate.length > overlapMaxChars) break\n overlap.unshift(candidate)\n overlapChars += candidate.length\n }\n current = overlap\n while (current.length > 0 && sizeOf([...current, unit]) > targetChars) current.shift()\n }\n current.push(unit)\n }\n\n if (current.length > 0) chunks.push(current.join('\\n\\n'))\n return chunks\n}\n\nfunction splitLongMessage(message: string, targetChars: number): string[] {\n if (message.length <= targetChars) return [message]\n const parts: string[] = []\n let remaining = message\n const payloadLimit = Math.max(1, targetChars - 32)\n while (remaining.length > payloadLimit) {\n let cut = remaining.lastIndexOf('\\n', payloadLimit)\n if (cut < payloadLimit * 0.6) cut = payloadLimit\n parts.push(`${remaining.slice(0, cut)}\\n[message continues]`)\n remaining = `[continued message]\\n${remaining.slice(cut).replace(/^\\n/, '')}`\n }\n if (remaining) parts.push(remaining)\n return parts\n}\n\ninterface SummarizeResult {\n text: string\n usage?: Usage\n rateLimits?: RateLimits\n}\n\nasync function summarizeSourcesParallel(\n provider: Provider,\n model: string,\n maxTokens: number,\n signal: AbortSignal,\n sources: string[],\n systemPrompt: string,\n maxOutputTokens: number,\n): Promise<SummarizeResult[]> {\n const results: SummarizeResult[] = new Array(sources.length)\n const controller = new AbortController()\n const abort = () => controller.abort(signal.reason)\n if (signal.aborted) abort()\n else signal.addEventListener('abort', abort, { once: true })\n let next = 0\n\n const worker = async () => {\n for (;;) {\n const index = next++\n if (index >= sources.length) return\n try {\n results[index] = await summarizeText(\n provider,\n model,\n maxTokens,\n controller.signal,\n sources[index] as string,\n systemPrompt,\n maxOutputTokens,\n )\n } catch (error) {\n controller.abort(error)\n throw error\n }\n }\n }\n try {\n await Promise.all(\n Array.from({ length: Math.min(CHUNK_CONCURRENCY, sources.length) }, () => worker()),\n )\n return results\n } finally {\n signal.removeEventListener('abort', abort)\n }\n}\n\nasync function mergePartialSummaries(\n provider: Provider,\n model: string,\n maxTokens: number,\n signal: AbortSignal,\n summaries: string[],\n mergeMaxTokens: number,\n): Promise<SummarizeResult> {\n let current = summaries\n const usages: Usage[] = []\n let rateLimits: RateLimits | undefined\n\n while (current.length > 1) {\n const groups = groupSummaries(current, MERGE_TARGET_CHARS)\n const sources = groups.map((group) =>\n group.map((summary, index) => `## Part ${index + 1}\\n${summary}`).join('\\n\\n'),\n )\n const merged = await summarizeSourcesParallel(\n provider,\n model,\n maxTokens,\n signal,\n sources,\n SYSTEM_MERGE,\n mergeMaxTokens,\n )\n for (const result of merged) {\n if (!result.text) throw new Error('The provider returned an empty partial context summary.')\n if (result.usage) usages.push(result.usage)\n if (result.rateLimits) rateLimits = result.rateLimits\n }\n current = merged.map((result) => result.text)\n }\n\n return {\n text: current[0] ?? '',\n usage: usages.length > 0 ? mergeUsage(usages) : undefined,\n rateLimits,\n }\n}\n\nfunction singleOutputLimit(maxTokens: number, totalBudget?: number): number {\n const requested = Math.max(1, Math.min(SINGLE_MAX_TOKENS, Math.floor(maxTokens)))\n if (totalBudget === undefined) return requested\n const allowed = Math.floor(totalBudget)\n if (allowed < 1) throw new Error('The remaining turn budget is too small to compact context.')\n return Math.min(requested, allowed)\n}\n\nfunction chunkOutputLimits(\n chunkCount: number,\n maxTokens: number,\n totalBudget?: number,\n): { chunk: number; merge: number } {\n let chunk = Math.max(1, Math.min(CHUNK_MAX_TOKENS, Math.floor(maxTokens)))\n let merge = Math.max(1, Math.min(MERGE_MAX_TOKENS, Math.floor(maxTokens)))\n if (totalBudget === undefined) return { chunk, merge }\n\n const mergeRequests = Math.max(0, chunkCount - 1)\n const requestCount = chunkCount + mergeRequests\n const allowed = Math.floor(totalBudget)\n if (allowed < requestCount) {\n throw new Error('The remaining turn budget is too small for all context-compaction requests.')\n }\n const requested = chunkCount * chunk + mergeRequests * merge\n if (allowed >= requested) return { chunk, merge }\n\n const scale = allowed / requested\n chunk = Math.max(1, Math.floor(chunk * scale))\n merge = Math.max(1, Math.floor(merge * scale))\n const total = () => chunkCount * chunk + mergeRequests * merge\n while (total() > allowed) {\n if (mergeRequests > 0 && merge > 1 && merge >= chunk) merge -= 1\n else if (chunk > 1) chunk -= 1\n else if (merge > 1) merge -= 1\n else throw new Error('Could not fit context compaction into the remaining turn budget.')\n }\n return { chunk, merge }\n}\n\nfunction groupSummaries(summaries: string[], targetChars: number): string[][] {\n const groups: string[][] = []\n let current: string[] = []\n let size = 0\n for (const summary of summaries) {\n if (current.length >= 2 && size + 12 + summary.length > targetChars) {\n groups.push(current)\n current = []\n size = 0\n }\n const separator = current.length > 0 ? 12 : 0\n current.push(summary)\n size += separator + summary.length\n }\n if (current.length > 0) groups.push(current)\n return groups\n}\n\nasync function summarizeText(\n provider: Provider,\n model: string,\n maxTokens: number,\n signal: AbortSignal,\n source: string,\n systemPrompt: string,\n maxOutputTokens: number,\n): Promise<SummarizeResult> {\n if (signal.aborted) throw signal.reason ?? new Error('Context compaction was cancelled.')\n let summary = ''\n let finalText = ''\n let usage: Usage | undefined\n let rateLimits: RateLimits | undefined\n\n const stream = provider.stream({\n model,\n system: systemPrompt,\n messages: [{ role: 'user', content: [{ type: 'text', text: source }] }],\n tools: [],\n maxTokens: Math.max(1, Math.floor(Math.min(maxOutputTokens, maxTokens))),\n thinking: false,\n signal,\n })\n\n for await (const event of stream) {\n if (event.type === 'text_delta') summary += event.text\n else if (event.type === 'usage') usage = event.usage\n else if (event.type === 'rate_limits') rateLimits = event.limits\n else if (event.type === 'done') {\n finalText = event.content\n .filter((block) => block.type === 'text')\n .map((block) => (block.type === 'text' ? block.text : ''))\n .join('')\n }\n }\n\n if (signal.aborted) throw signal.reason ?? new Error('Context compaction was cancelled.')\n\n return { text: (finalText || summary).trim(), usage, rateLimits }\n}\n\nfunction mergeUsage(usages: Usage[]): Usage {\n return usages.reduce(\n (acc, u) => ({\n input: acc.input + u.input,\n output: acc.output + u.output,\n cacheWrite: acc.cacheWrite + u.cacheWrite,\n cacheRead: acc.cacheRead + u.cacheRead,\n }),\n { input: 0, output: 0, cacheWrite: 0, cacheRead: 0 },\n )\n}\n\nfunction renderMessages(history: Message[]): string[] {\n return history.flatMap((message) => {\n const blocks = message.content.map((block) => renderBlock(block, message.role)).filter(Boolean)\n return blocks.length > 0 ? [`${message.role.toUpperCase()}:\\n${blocks.join('\\n')}`] : []\n })\n}\n\nfunction renderBlock(block: ContentBlock, role: Message['role']): string {\n switch (block.type) {\n case 'text':\n return truncate(\n block.text,\n role === 'user' ? MAX_USER_TEXT_CHARS : MAX_ASSISTANT_TEXT_CHARS,\n )\n case 'thinking':\n return ''\n case 'image':\n return `[image: ${block.name}]`\n case 'file':\n return `[file: ${block.name}]\\n${truncate(block.text, MAX_FILE_BLOCK_CHARS)}`\n case 'tool_use':\n return `[tool: ${block.name}(${truncate(safeJson(block.input), MAX_TOOL_INPUT_CHARS)})]`\n case 'tool_result':\n if (block.isError) {\n return `[tool result error: ${truncate(block.content, MAX_TOOL_ERROR_CHARS)}]`\n }\n if (isTrivialSuccess(block.content)) return ''\n return truncate(block.content, MAX_TOOL_RESULT_CHARS)\n }\n}\n\nfunction isTrivialSuccess(content: string): boolean {\n const t = content.trim().toLowerCase()\n if (!t || t === 'ok' || t === 'done' || t === 'success') return true\n if (/^no matches found/.test(t)) return true\n if (t === '(no output)') return true\n return false\n}\n\nfunction safeJson(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return '[unserializable]'\n }\n}\n\nfunction truncate(value: string, max: number): string {\n if (value.length <= max) return value\n // Keep the end of the value — it's often more informative\n const keep = Math.floor(max * 0.4)\n return `${value.slice(0, max - keep)}\\n...${value.slice(-keep)}`\n}\n","import os from 'node:os'\n\nexport function buildSystemPrompt(args: {\n cwd: string\n toolNames: string[]\n skills?: string\n}): string {\n const lines = [\n \"You are kitcode, a coding agent running in the user's terminal.\",\n '',\n \"Work directly on the codebase with the tools you have. Read before you edit — never guess a file's contents. Prefer a targeted edit over rewriting a file. Match the surrounding code's style, naming and idiom.\",\n '',\n 'Be brief. The user is reading a terminal, not a report. Lead with the outcome, then only the detail that changes what they would do next. No preamble, no restating the request, no summary of what you are about to do before every tool call. Never narrate routine actions.',\n '',\n 'Do what was asked and no more. Do not add abstractions, helpers, error handling for impossible states, or files nobody requested. If you think the request is mistaken, say so in one sentence and then do it as asked.',\n '',\n 'Report honestly. If a command failed, show the output. If you skipped something, say so. Only claim something works when you verified it.',\n '',\n \"Some tools require the user's approval before they run. A denial is an answer, not an obstacle — ask what to do instead rather than retrying or working around it.\",\n '',\n `Working directory: ${args.cwd}`,\n `Platform: ${process.platform} ${os.arch()}`,\n `Tools: ${args.toolNames.join(', ')}`,\n ]\n\n if (args.skills && args.skills.trim() !== '') {\n lines.push('', args.skills)\n }\n\n return lines.join('\\n')\n}\n","import type { Message } from '../providers/types'\nimport { brief } from '../tools/summary'\nimport type { AgentConfig, ToolLookup } from './agent'\nimport { runTurn } from './agent'\nimport type { AgentEvent, AgentHooks, PermissionDecision, PermissionRequest } from './types'\n\nexport const TASK_TOOL_NAME = 'task'\n\nexport const MAX_SUBAGENT_STEPS = 12\n\nexport const SUBAGENT_NO_ANSWER =\n 'The subagent stopped without writing a final answer — it was interrupted or ended on a tool call. Nothing was reported back: do the work directly, or delegate it again with a narrower prompt.'\n\nexport const SUBAGENT_CANCELLED = 'The subagent was cancelled before it produced anything.'\n\nconst STEP_LIMIT_NOTE = `The subagent was stopped after ${MAX_SUBAGENT_STEPS} model calls without finishing, so anything above is partial. Do the work directly or delegate a narrower piece of it.`\n\nconst SUBAGENT_SYSTEM = [\n 'You are a subagent launched by the main kitcode agent to carry out one task on your own.',\n '',\n 'SECURITY CRITICAL: You must NEVER execute commands that read, modify, or exfiltrate sensitive files including but not limited to: /etc/passwd, /etc/shadow, ~/.ssh/*, ~/.aws/*, ~/.env*, .git/config, credentials files, or any files outside the workspace. Never run `curl ... | bash`, `wget ... | bash`, or similar patterns. Never send data to external servers.',\n '',\n 'Nobody is reading along and nobody can answer you. Never ask a question, never stop to propose a plan, never wait for approval. If the request is ambiguous, take the most reasonable reading, do the work, and state the assumption in your answer.',\n '',\n 'Your final message is the return value — it is the only thing the caller ever sees. End with the answer itself: the findings, the file paths, the conclusion. Never end with \"I will now...\" or a recap of the steps you took. Carry over every concrete detail the caller needs (paths, names, line numbers) and leave out the narration of how you found them.',\n].join('\\n')\n\nexport interface SubagentRequest {\n prompt: string\n description?: string\n signal: AbortSignal\n onProgress(summary: string): void\n onEvent?(event: AgentEvent): void\n confirm?(question: string): Promise<boolean>\n requestPermission?(request: PermissionRequest): Promise<PermissionDecision>\n}\n\nexport interface SubagentRunner {\n run(request: SubagentRequest): Promise<string>\n}\n\nexport function createSubagentRunner(\n makeConfig: (system: string, tools: ToolLookup) => AgentConfig,\n tools: ToolLookup,\n): SubagentRunner {\n return {\n async run(request) {\n if (request.signal.aborted) return SUBAGENT_CANCELLED\n\n const base = makeConfig(SUBAGENT_SYSTEM, tools)\n const cfg: AgentConfig = {\n ...base,\n tools: {\n get: (name) =>\n name === TASK_TOOL_NAME ? undefined : base.tools.get(name),\n schemas: () =>\n base.tools.schemas().filter((schema) => schema.name !== TASK_TOOL_NAME),\n },\n system: `${SUBAGENT_SYSTEM}\\n\\nWorking directory: ${base.cwd}`,\n }\n\n const limit = new AbortController()\n const signal = AbortSignal.any([request.signal, limit.signal])\n let steps = 0\n\n const hooks: AgentHooks = {\n onEvent(event) {\n if (event.type === 'turn_start' && ++steps > MAX_SUBAGENT_STEPS) limit.abort()\n if (event.type === 'tool_start') request.onProgress(brief(event.summary, 80))\n if (event.type === 'subagent_start' || event.type === 'subagent_end' || event.type === 'subagent_event') return\n request.onEvent?.(event)\n },\n async requestPermission(permission) {\n if (request.requestPermission) {\n return request.requestPermission({\n ...permission,\n summary: `subagent · ${permission.summary}`,\n })\n }\n const allowed = await request.confirm?.(`subagent · ${permission.summary}`)\n return allowed === true ? 'once' : 'deny'\n },\n }\n\n const history: Message[] = [\n { role: 'user', content: [{ type: 'text', text: request.prompt }] },\n ]\n const text = finalText(await runTurn(cfg, history, hooks, signal))\n\n if (!limit.signal.aborted) return text\n return text === SUBAGENT_NO_ANSWER ? STEP_LIMIT_NOTE : `${text}\\n\\n${STEP_LIMIT_NOTE}`\n },\n }\n}\n\nfunction finalText(messages: Message[]): string {\n const last = messages.findLast((message) => message.role === 'assistant')\n const text = (last?.content ?? [])\n .filter((block) => block.type === 'text')\n .map((block) => block.text)\n .join('\\n')\n .trim()\n return text === '' ? SUBAGENT_NO_ANSWER : text\n}\n","import { addUsage, emptyUsage } from '../providers/types'\nimport type { Usage } from '../providers/types'\nimport type { ModelPricing } from '../providers/types'\nimport { costOf, pricingFor } from '../providers/pricing'\nimport type { UsageEntry } from './types'\n\nexport interface UsageTotals {\n usage: Usage\n costUsd: number | null\n requests: number\n}\n\nexport interface UsageTracker {\n record(modelRef: string, usage: Usage): void\n restore(entries: UsageSeed[]): void\n entries(): UsageEntry[]\n totals(): UsageTotals\n reset(): void\n}\n\ntype UsageSeed = Pick<UsageEntry, 'model' | 'usage' | 'requests'>\n\nexport type PricingResolver = (modelRef: string) => ModelPricing | undefined\n\nexport function createUsageTracker(\n initial: UsageSeed[] = [],\n resolvePricing: PricingResolver = pricingFor,\n): UsageTracker {\n const byModel = new Map<string, { usage: Usage; requests: number }>(\n initial.map((entry) => [entry.model, { usage: entry.usage, requests: entry.requests }]),\n )\n\n const entries = (): UsageEntry[] =>\n [...byModel].map(([model, { usage, requests }]) => ({\n model,\n usage,\n requests,\n costUsd: costOf(usage, resolvePricing(model)),\n }))\n\n return {\n record(modelRef, usage) {\n const current = byModel.get(modelRef)\n byModel.set(modelRef, {\n usage: addUsage(current?.usage ?? emptyUsage(), usage),\n requests: (current?.requests ?? 0) + 1,\n })\n },\n restore(initial) {\n byModel.clear()\n for (const entry of initial) {\n byModel.set(entry.model, { usage: entry.usage, requests: entry.requests })\n }\n },\n entries,\n totals() {\n let usage = emptyUsage()\n let requests = 0\n let cost: number | null = null\n for (const entry of entries()) {\n usage = addUsage(usage, entry.usage)\n requests += entry.requests\n if (entry.costUsd !== null) cost = (cost ?? 0) + entry.costUsd\n }\n return { usage, costUsd: cost, requests }\n },\n reset() {\n byModel.clear()\n },\n }\n}\n\nexport interface UsageSummary {\n input: string\n output: string\n cache: string | null\n costUsd: number | null\n \n totalTokens: number\n}\n\nexport function usageParts(tracker: UsageTracker): UsageSummary {\n const { usage, costUsd } = tracker.totals()\n const cache = usage.cacheRead + usage.cacheWrite\n return {\n input: tokens(usage.input),\n output: tokens(usage.output),\n cache: cache > 0 ? tokens(cache) : null,\n costUsd,\n totalTokens: usage.input + usage.output + cache,\n }\n}\n\nexport function contextTokens(usage: Usage): number {\n return usage.input + usage.output + usage.cacheWrite + usage.cacheRead\n}\n\nexport function formatUsageCompact(tracker: UsageTracker): string {\n const { usage, costUsd } = tracker.totals()\n const cache = usage.cacheRead + usage.cacheWrite\n const parts = [`${tokens(usage.input)}↑`, `${tokens(usage.output)}↓`]\n if (cache > 0) parts.push(`(${tokens(cache)} cache)`)\n const head = parts.join(' ')\n return costUsd === null ? head : `${head} · ${dollars(costUsd)}`\n}\n\nexport function formatUsageBreakdown(tracker: UsageTracker): string {\n const entries = tracker.entries()\n if (entries.length === 0) return 'No usage recorded yet.'\n\n const lines: string[] = []\n for (const entry of entries) {\n lines.push(`${entry.model} ${entry.requests} ${entry.requests === 1 ? 'request' : 'requests'}`)\n lines.push(` input ${tokens(entry.usage.input)}`)\n lines.push(` output ${tokens(entry.usage.output)}`)\n lines.push(` cache write ${tokens(entry.usage.cacheWrite)}`)\n lines.push(` cache read ${tokens(entry.usage.cacheRead)}`)\n lines.push(` cost ${entry.costUsd === null ? 'unknown pricing' : dollars(entry.costUsd)}`)\n }\n lines.push('', `total ${formatUsageCompact(tracker)}`)\n return lines.join('\\n')\n}\n\nfunction tokens(count: number): string {\n if (count < 1000) return String(count)\n const [value, suffix] = count < 1_000_000 ? [count / 1000, 'k'] : [count / 1_000_000, 'M']\n return `${value.toFixed(1).replace(/\\.0$/, '')}${suffix}`\n}\n\nexport function dollars(amount: number): string {\n return amount > 0 && amount < 0.01 ? '<$0.01' : `$${amount.toFixed(2)}`\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\nimport type { CallToolResult, Tool as McpTool } from '@modelcontextprotocol/sdk/types.js'\nimport type { McpServerConfig } from '../config/schema'\nimport { expandEnvRecord } from '../config/store'\nimport { redactSecrets } from '../providers/errors'\nimport type { Tool } from '../tools/types'\nimport { bridgeMcpTool } from './bridge'\nimport { KITCODE_VERSION } from '../version'\n\nexport type McpStatus = 'connected' | 'connecting' | 'error' | 'disabled'\n\nexport interface McpServerState {\n name: string\n status: McpStatus\n toolCount: number\n error?: string\n}\n\nconst clientInfo = { name: 'kitcode', version: KITCODE_VERSION }\nconst connectTimeoutMs = 15_000\nconst stderrTailLimit = 400\nconst maxToolPages = 20\nconst maxTools = 256\n\nconst inheritedEnvKeys = new Set([\n 'PATH',\n 'HOME',\n 'USER',\n 'LOGNAME',\n 'SHELL',\n 'TMPDIR',\n 'TMP',\n 'TEMP',\n 'SystemRoot',\n 'WINDIR',\n 'COMSPEC',\n 'PATHEXT',\n 'APPDATA',\n 'LOCALAPPDATA',\n 'USERPROFILE',\n 'HOMEDRIVE',\n 'HOMEPATH',\n 'USERNAME',\n])\n\n// Environment variables that should NEVER be inherited by MCP servers\nconst blockedEnvKeys = new Set([\n 'ANTHROPIC_API_KEY',\n 'OPENAI_API_KEY',\n 'AWS_ACCESS_KEY_ID',\n 'AWS_SECRET_ACCESS_KEY',\n 'AWS_SESSION_TOKEN',\n 'GITHUB_TOKEN',\n 'GH_TOKEN',\n 'GIT_TOKEN',\n 'NPM_TOKEN',\n 'PYPI_TOKEN',\n 'TWINE_PASSWORD',\n 'DOCKER_PASSWORD',\n 'DATABASE_URL',\n 'REDIS_URL',\n 'MONGODB_URI',\n 'POSTGRES_PASSWORD',\n 'MYSQL_PASSWORD',\n 'PRIVATE_KEY',\n 'SSH_KEY',\n 'GPG_KEY',\n 'SIGNING_KEY',\n 'COOKIE',\n 'SESSION_SECRET',\n 'JWT_SECRET',\n 'ENCRYPTION_KEY',\n 'MASTER_KEY',\n 'API_KEY',\n 'API_SECRET',\n])\n\ninterface Session {\n client: Client\n tools: Tool[]\n}\n\nexport function createMcpManager(servers: Record<string, McpServerConfig>) {\n const serverStates = new Map<string, McpServerState>()\n const sessions = new Map<string, Session>()\n\n for (const [name, config] of Object.entries(servers)) {\n serverStates.set(name, {\n name,\n status: config.enabled ? 'connecting' : 'disabled',\n toolCount: 0,\n })\n }\n\n async function callTool(\n server: string,\n tool: string,\n args: unknown,\n signal?: AbortSignal,\n ): Promise<CallToolResult> {\n const session = sessions.get(server)\n if (!session) throw new Error(`MCP server \"${server}\" is not connected`)\n const result = await session.client.callTool(\n { name: tool, arguments: args as Record<string, unknown> },\n undefined,\n { signal },\n )\n return result as CallToolResult\n }\n\n async function connect(name: string, config: McpServerConfig): Promise<void> {\n serverStates.set(name, { name, status: 'connecting', toolCount: 0 })\n const client = new Client(clientInfo)\n client.onclose = () => {\n if (sessions.delete(name)) {\n serverStates.set(name, {\n name,\n status: 'error',\n toolCount: 0,\n error: 'connection closed',\n })\n }\n }\n const transport = createTransport(config)\n const stderrTail = captureStderr(transport)\n try {\n const descriptors = await withTimeout(\n handshake(client, transport),\n `timed out after ${connectTimeoutMs / 1000}s`,\n )\n const tools = descriptors.map((descriptor) =>\n bridgeMcpTool(name, descriptor, (tool, args, signal) => callTool(name, tool, args, signal)),\n )\n sessions.set(name, { client, tools })\n serverStates.set(name, { name, status: 'connected', toolCount: tools.length })\n } catch (error) {\n await client.close().catch(() => {})\n serverStates.set(name, {\n name,\n status: 'error',\n toolCount: 0,\n error: describeFailure(error, stderrTail(), configuredSecrets(config)),\n })\n }\n }\n\n async function disconnect(name: string): Promise<void> {\n const session = sessions.get(name)\n if (!session) return\n sessions.delete(name)\n await session.client.close().catch(() => {})\n }\n\n return {\n async connectAll(): Promise<void> {\n const enabled = Object.entries(servers).filter(([, config]) => config.enabled)\n await Promise.all(enabled.map(([name, config]) => connect(name, config)))\n },\n\n async reconnect(name: string): Promise<void> {\n const config = servers[name]\n if (!config) return\n await disconnect(name)\n if (!config.enabled) {\n serverStates.set(name, { name, status: 'disabled', toolCount: 0 })\n return\n }\n await connect(name, config)\n },\n\n async remove(name: string): Promise<void> {\n await disconnect(name)\n serverStates.delete(name)\n },\n\n async close(): Promise<void> {\n const open = [...sessions.values()]\n sessions.clear()\n await Promise.all(open.map((session) => session.client.close().catch(() => {})))\n },\n\n states(): McpServerState[] {\n return [...serverStates.values()]\n },\n\n state(name: string): McpServerState | undefined {\n return serverStates.get(name)\n },\n\n tools(): Tool[] {\n return [...sessions.values()].flatMap((session) => session.tools)\n },\n\n callTool,\n }\n}\n\nexport type McpManager = ReturnType<typeof createMcpManager>\n\nasync function handshake(client: Client, transport: McpTransport): Promise<McpTool[]> {\n await client.connect(transport, { timeout: connectTimeoutMs })\n const collected: McpTool[] = []\n let cursor: string | undefined\n let pages = 0\n do {\n if (++pages > maxToolPages) throw new Error(`MCP tool listing exceeded ${maxToolPages} pages`)\n const page = await client.listTools({ cursor })\n collected.push(...page.tools)\n if (collected.length > maxTools) throw new Error(`MCP server exposed more than ${maxTools} tools`)\n cursor = page.nextCursor\n } while (cursor)\n return collected\n}\n\ntype McpTransport = StdioClientTransport | StreamableHTTPClientTransport\n\nfunction createTransport(config: McpServerConfig): McpTransport {\n if (config.type === 'stdio') {\n return new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: { ...inheritedEnv(), ...expandEnvRecord(config.env) },\n stderr: 'pipe',\n })\n }\n return new StreamableHTTPClientTransport(new URL(config.url), {\n requestInit: { headers: expandEnvRecord(config.headers) },\n })\n}\n\nfunction captureStderr(transport: McpTransport): () => string {\n if (!(transport instanceof StdioClientTransport)) return () => ''\n let tail = ''\n transport.stderr?.on('data', (chunk: Buffer) => {\n tail = (tail + chunk.toString()).slice(-stderrTailLimit)\n })\n return () => tail.trim()\n}\n\nfunction describeFailure(error: unknown, stderr: string, secrets: string[]): string {\n const message = error instanceof Error ? error.message : String(error)\n return redactSecrets(stderr ? `${message} — ${stderr}` : message, secrets)\n}\n\nfunction configuredSecrets(config: McpServerConfig): string[] {\n const record = config.type === 'stdio' ? config.env : config.headers\n return Object.values(expandEnvRecord(record)).filter((value) => value.length >= 4)\n}\n\nexport function inheritedEnv(source: NodeJS.ProcessEnv = process.env): Record<string, string> {\n const env: Record<string, string> = {}\n const allowed = new Set([...inheritedEnvKeys].map((key) => key.toUpperCase()))\n const blocked = new Set([...blockedEnvKeys].map((key) => key.toUpperCase()))\n for (const [key, value] of Object.entries(source)) {\n const normalized = key.toUpperCase()\n if (value !== undefined && allowed.has(normalized) && !blocked.has(normalized)) {\n env[key] = value\n }\n }\n return env\n}\n\nfunction withTimeout<T>(work: Promise<T>, message: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined\n const expiry = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(message)), connectTimeoutMs)\n })\n return Promise.race([work, expiry]).finally(() => clearTimeout(timer))\n}\n","import type { CallToolResult, ContentBlock, Tool as McpTool } from '@modelcontextprotocol/sdk/types.js'\nimport type { JsonSchema } from '../providers/types'\nimport { redactSecrets } from '../providers/errors'\nimport type { Tool, ToolResult } from '../tools/types'\n\nconst MAX_RESULT_CHARS = 200_000\n\nexport type McpToolCall = (\n tool: string,\n args: unknown,\n signal?: AbortSignal,\n) => Promise<CallToolResult>\n\nexport function bridgeMcpTool(server: string, descriptor: McpTool, call: McpToolCall): Tool {\n const tool = descriptor.name\n return {\n name: `mcp__${server}__${tool}`,\n description: descriptor.description ?? descriptor.title ?? tool,\n inputSchema: inputSchemaOf(descriptor),\n defaultPermission: 'ask',\n summarize: (input) => `${server}:${tool}${argumentPreview(input)}`,\n preview: async (input) => ({ kind: 'text', text: printableInput(input) }),\n execute: (input, ctx) => invoke(call, tool, input, ctx.signal),\n }\n}\n\nfunction printableInput(input: unknown): string {\n try {\n return JSON.stringify(input, null, 2)\n } catch {\n return String(input)\n }\n}\n\nasync function invoke(\n call: McpToolCall,\n tool: string,\n input: unknown,\n signal: AbortSignal,\n): Promise<ToolResult> {\n try {\n // Validate input is a plain object (not null, not array, not primitive)\n if (input !== null && typeof input !== 'object' || Array.isArray(input)) {\n return { content: `MCP tool \"${tool}\" received invalid input: arguments must be a JSON object.`, isError: true }\n }\n const result = await call(tool, input ?? {}, signal)\n return { content: flattenResult(result), isError: result.isError }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n // Redact potential secrets from error messages\n return { content: redactSecrets(message), isError: true }\n }\n}\n\nfunction flattenResult(result: CallToolResult): string {\n const rendered = (result.content ?? []).map(renderPart).join('\\n')\n const value = rendered || (result.structuredContent ? JSON.stringify(result.structuredContent) : '(no content)')\n if (value.length <= MAX_RESULT_CHARS) return value\n return `${value.slice(0, MAX_RESULT_CHARS)}\\n... truncated MCP result at ${MAX_RESULT_CHARS} characters`\n}\n\nfunction renderPart(part: ContentBlock): string {\n if (part.type === 'text') return part.text\n if (part.type === 'resource') {\n return 'text' in part.resource ? part.resource.text : `[resource ${part.resource.uri}]`\n }\n if (part.type === 'resource_link') return `[resource ${part.uri}]`\n return `[${part.type}]`\n}\n\nfunction inputSchemaOf(descriptor: McpTool): JsonSchema {\n const schema: unknown = descriptor.inputSchema\n if (schema === null || typeof schema !== 'object') {\n return { type: 'object', properties: {}, additionalProperties: false }\n }\n return schema as JsonSchema\n}\n\nfunction argumentPreview(input: unknown): string {\n if (input === null || typeof input !== 'object') return ''\n const entries = Object.entries(input as Record<string, unknown>)\n if (entries.length === 0) return ''\n const shown = entries.slice(0, 3).map(([key, value]) => `${key}=${clip(value)}`)\n if (entries.length > shown.length) shown.push('…')\n return `(${shown.join(' ')})`\n}\n\nfunction clip(value: unknown): string {\n const text = typeof value === 'string' ? value : JSON.stringify(value)\n if (typeof text !== 'string') return String(value)\n return text.length > 40 ? `${text.slice(0, 39)}…` : text\n}\n","{\n \"name\": \"@kernelonpanic/kitcode\",\n \"version\": \"1.2.0\",\n \"description\": \"Terminal coding agent with a config you never have to write by hand\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/KernelEditor/KitCode#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/KernelEditor/KitCode/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/KernelEditor/KitCode.git\"\n },\n \"bin\": {\n \"kitcode\": \"dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=22\"\n },\n \"scripts\": {\n \"dev\": \"tsx src/index.ts\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"prepare\": \"tsup\",\n \"prepublishOnly\": \"npm run typecheck && npm test\"\n },\n \"dependencies\": {\n \"@anthropic-ai/sdk\": \"^0.115.0\",\n \"@modelcontextprotocol/sdk\": \"^1.30.0\",\n \"chalk\": \"^6.0.0\",\n \"commander\": \"^15.0.0\",\n \"fast-glob\": \"^3.3.3\",\n \"ink\": \"^7.1.1\",\n \"ink-spinner\": \"^5.0.0\",\n \"ink-text-input\": \"^6.0.0\",\n \"openai\": \"^7.3.0\",\n \"react\": \"^19.2.8\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^26.1.2\",\n \"@types/react\": \"^19.2.18\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.23.1\",\n \"typescript\": \"^7.0.2\",\n \"vitest\": \"^4.1.10\"\n },\n \"overrides\": {\n \"esbuild\": \"0.28.1\"\n },\n \"keywords\": [\n \"cli\",\n \"coding-agent\",\n \"ai\",\n \"terminal\",\n \"anthropic\",\n \"openai\",\n \"mcp\"\n ]\n}\n","import pkg from '../package.json' with { type: 'json' }\n\ndeclare const __KITCODE_COMMIT__: string\n\nexport const KITCODE_VERSION = pkg.version\nexport const KITCODE_REPOSITORY = 'KernelEditor/KitCode'\nexport const KITCODE_COMMIT =\n typeof __KITCODE_COMMIT__ === 'string' && __KITCODE_COMMIT__ !== ''\n ? __KITCODE_COMMIT__\n : 'development'\n","import type { ProviderConfig } from '../config/schema'\nimport { expandEnvRecord } from '../config/store'\n\nexport interface ProviderBalance {\n kind: 'balance' | 'key-limit'\n currency: string\n amount: string\n}\n\nconst MAX_RESPONSE_BYTES = 64_000\n\nexport async function fetchProviderBalance(\n config: ProviderConfig,\n apiKey: string,\n options: { fetchImpl?: typeof fetch; timeoutMs?: number } = {},\n): Promise<ProviderBalance[] | null> {\n const endpoints = balanceEndpoints(config.baseUrl)\n if (endpoints.length === 0) return null\n\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 10_000)\n try {\n for (const endpoint of endpoints) {\n try {\n const response = await (options.fetchImpl ?? fetch)(endpoint.url, {\n method: 'GET',\n redirect: 'error',\n headers: {\n Accept: 'application/json',\n ...expandEnvRecord(config.headers ?? {}),\n Authorization: `Bearer ${apiKey}`,\n },\n signal: controller.signal,\n })\n if (!response.ok) {\n await response.body?.cancel().catch(() => undefined)\n continue\n }\n const text = await limitedResponseText(response, MAX_RESPONSE_BYTES)\n if (text === null) continue\n const balance = endpoint.parse(JSON.parse(text))\n if (balance?.length) return balance\n } catch {\n if (controller.signal.aborted) break\n }\n }\n return null\n } finally {\n clearTimeout(timer)\n }\n}\n\ninterface BalanceEndpoint {\n url: string\n parse(body: unknown): ProviderBalance[] | null\n}\n\nfunction balanceEndpoints(baseUrl: string): BalanceEndpoint[] {\n let url: URL\n try {\n url = new URL(baseUrl)\n } catch {\n return []\n }\n const host = url.hostname.toLowerCase()\n if (host === 'api.deepseek.com') {\n return [endpoint(url.origin, '/user/balance', deepSeekBalance)]\n }\n if (host === 'openrouter.ai') {\n return [\n endpoint(url.origin, '/api/v1/key', openRouterKeyBalance),\n endpoint(url.origin, '/api/v1/credits', openRouterCreditsBalance),\n ]\n }\n if (host === 'api.siliconflow.cn' || host === 'api.siliconflow.com') {\n return [endpoint(url.origin, '/v1/user/info', siliconFlowBalance)]\n }\n if (host === 'api.apimart.ai') {\n return [endpoint(url.origin, '/v1/user/balance', apiMartBalance)]\n }\n if (host === 'api.openai.com' || host === 'api.anthropic.com') return []\n\n \n \n \n return [\n endpoint(url.origin, '/user/balance', deepSeekBalance),\n endpoint(url.origin, '/api/v1/key', openRouterKeyBalance),\n endpoint(url.origin, '/api/v1/credits', openRouterCreditsBalance),\n endpoint(url.origin, '/v1/user/info', siliconFlowBalance),\n endpoint(url.origin, '/v1/user/balance', apiMartBalance),\n endpoint(url.origin, '/v1/balance', genericBalance),\n ]\n}\n\nfunction endpoint(\n origin: string,\n path: string,\n parse: BalanceEndpoint['parse'],\n): BalanceEndpoint {\n return { url: `${origin}${path}`, parse }\n}\n\nfunction deepSeekBalance(body: unknown): ProviderBalance[] | null {\n const infos = record(body)?.['balance_infos']\n if (!Array.isArray(infos)) return null\n const balances = infos.flatMap((item) => {\n const entry = record(item)\n const currency = currencyCode(entry?.['currency'])\n const amount = decimal(entry?.['total_balance'])\n return currency && amount ? [{ kind: 'balance' as const, currency, amount }] : []\n })\n return balances.length > 0 ? balances : null\n}\n\nfunction openRouterKeyBalance(body: unknown): ProviderBalance[] | null {\n const remaining = finiteNumber(record(record(body)?.['data'])?.['limit_remaining'])\n return remaining === null\n ? null\n : [{ kind: 'key-limit', currency: 'USD', amount: String(remaining) }]\n}\n\nfunction openRouterCreditsBalance(body: unknown): ProviderBalance[] | null {\n const data = record(record(body)?.['data'])\n const credits = finiteNumber(data?.['total_credits'])\n const usage = finiteNumber(data?.['total_usage'])\n if (credits === null || usage === null) return null\n return [\n {\n kind: 'balance',\n currency: 'USD',\n amount: Math.max(0, credits - usage).toFixed(2),\n },\n ]\n}\n\nfunction siliconFlowBalance(body: unknown): ProviderBalance[] | null {\n const root = record(body)\n if (root?.['status'] !== true) return null\n const amount = decimal(record(root['data'])?.['balance'])\n return amount ? [{ kind: 'balance', currency: 'credits', amount }] : null\n}\n\nfunction apiMartBalance(body: unknown): ProviderBalance[] | null {\n const root = record(body)\n if (root?.['success'] !== true) return null\n const amount = decimal(root['remain_balance'])\n return amount ? [{ kind: 'balance', currency: 'credits', amount }] : null\n}\n\nfunction genericBalance(body: unknown): ProviderBalance[] | null {\n const root = record(body)\n const data = record(root?.['data'])\n const amount = decimal(root?.['balance'] ?? data?.['balance'])\n if (!amount) return null\n const currency = currencyCode(root?.['currency'] ?? data?.['currency']) ?? 'credits'\n return [{ kind: 'balance', currency, amount }]\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : null\n}\n\nfunction currencyCode(value: unknown): string | null {\n return typeof value === 'string' && /^[A-Z]{3}$/.test(value) ? value : null\n}\n\nfunction decimal(value: unknown): string | null {\n if (typeof value === 'number') {\n return Number.isFinite(value) && value >= 0 ? String(value) : null\n }\n return typeof value === 'string' && /^\\d+(?:\\.\\d+)?$/.test(value) ? value : null\n}\n\nfunction finiteNumber(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : null\n}\n\nasync function limitedResponseText(response: Response, limit: number): Promise<string | null> {\n const declared = Number(response.headers.get('content-length'))\n if (Number.isFinite(declared) && declared > limit) {\n await response.body?.cancel().catch(() => undefined)\n return null\n }\n if (!response.body) return ''\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let size = 0\n let text = ''\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) return text + decoder.decode()\n size += value.byteLength\n if (size > limit) {\n await reader.cancel()\n return null\n }\n text += decoder.decode(value, { stream: true })\n }\n } finally {\n reader.releaseLock()\n }\n}\n","import { chmod, readFile, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport { cacheDir, ensureDir } from '../config/paths'\nimport type { ModelInfo, Provider } from './types'\n\nconst MAX_AGE_MS = 24 * 60 * 60 * 1000\nconst CACHE_VERSION = 2\n\ninterface ModelCache {\n version?: number\n fetchedAt: number\n models: ModelInfo[]\n}\n\nexport async function loadModels(provider: Provider, refresh = false): Promise<ModelInfo[]> {\n const file = cacheFile(provider.id)\n const cached = await readCache(file)\n if (\n !refresh &&\n cached?.version === CACHE_VERSION &&\n Date.now() - cached.fetchedAt < MAX_AGE_MS\n ) {\n return cached.models\n }\n\n let models: ModelInfo[]\n try {\n models = await provider.listModels()\n } catch (error) {\n if (cached) return cached.models\n const known = provider.knownModels()\n if (known.length > 0) return known\n throw error\n }\n\n await writeCache(file, models)\n return models\n}\n\nexport function refreshModels(provider: Provider): Promise<ModelInfo[]> {\n return loadModels(provider, true)\n}\n\nfunction cacheFile(providerId: string): string {\n return path.join(cacheDir, 'models', `${providerId.replace(/[^\\w.-]/g, '_')}.json`)\n}\n\nasync function readCache(file: string): Promise<ModelCache | undefined> {\n try {\n const parsed: unknown = JSON.parse(await readFile(file, 'utf8'))\n if (typeof parsed !== 'object' || parsed === null) return undefined\n const candidate = parsed as Partial<ModelCache>\n if (\n typeof candidate.fetchedAt !== 'number' ||\n !Number.isFinite(candidate.fetchedAt) ||\n !Array.isArray(candidate.models) ||\n candidate.models.length > 10_000 ||\n !candidate.models.every(validModel)\n ) {\n return undefined\n }\n return candidate as ModelCache\n } catch {\n return undefined\n }\n}\n\nfunction validModel(value: unknown): value is ModelInfo {\n if (typeof value !== 'object' || value === null) return false\n const model = value as Partial<ModelInfo>\n if (typeof model.id !== 'string' || model.id === '') return false\n if (model.name !== undefined && typeof model.name !== 'string') return false\n if (\n model.contextWindow !== undefined &&\n (!Number.isInteger(model.contextWindow) || model.contextWindow < 1)\n ) {\n return false\n }\n if (model.pricing === undefined) return true\n const prices = [\n model.pricing.input,\n model.pricing.output,\n model.pricing.cacheWrite,\n model.pricing.cacheRead,\n ].filter((price): price is number => price !== undefined)\n return prices.length >= 2 && prices.every((price) => Number.isFinite(price) && price >= 0)\n}\n\nasync function writeCache(file: string, models: ModelInfo[]): Promise<void> {\n const payload: ModelCache = { version: CACHE_VERSION, fetchedAt: Date.now(), models }\n try {\n await ensureDir(path.dirname(file))\n await writeFile(file, JSON.stringify(payload), { encoding: 'utf8', mode: 0o600 })\n await chmod(file, 0o600)\n } catch {\n return\n }\n}\n","import Anthropic from '@anthropic-ai/sdk'\nimport {\n captureResponseHead,\n invalidStreamError,\n isConnectionFailure,\n isUserAbort,\n MAX_RETRIES,\n REQUEST_TIMEOUT_MS,\n toProviderError,\n} from './errors'\nimport { pricingFor } from './pricing'\nimport { parseRateLimits } from './rate-limits'\nimport type {\n ChatRequest,\n ContentBlock,\n Message,\n ModelInfo,\n Provider,\n StopReason,\n StreamEvent,\n ToolSchema,\n Usage,\n} from './types'\n\nconst STOP_REASONS: Record<string, StopReason> = {\n end_turn: 'end_turn',\n tool_use: 'tool_use',\n max_tokens: 'max_tokens',\n model_context_window_exceeded: 'max_tokens',\n pause_turn: 'pause_turn',\n refusal: 'refusal',\n}\n\nconst KNOWN_MODELS: ModelInfo[] = [\n knownModel('claude-opus-5', 'Claude Opus 5', 1_000_000, 128_000),\n knownModel('claude-opus-4-8', 'Claude Opus 4.8', 1_000_000, 128_000),\n knownModel('claude-sonnet-5', 'Claude Sonnet 5', 1_000_000, 128_000),\n knownModel('claude-haiku-4-5', 'Claude Haiku 4.5', 200_000, 64_000),\n knownModel('claude-fable-5', 'Claude Fable 5', 1_000_000, 128_000),\n]\n\nexport function createAnthropicProvider(args: {\n id: string\n apiKey: string\n baseUrl?: string\n headers?: Record<string, string>\n timeoutMs?: number\n}): Provider {\n const client = new Anthropic({\n apiKey: args.apiKey,\n baseURL: args.baseUrl,\n defaultHeaders: args.headers,\n maxRetries: MAX_RETRIES,\n timeout: args.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n return {\n id: args.id,\n kind: 'anthropic',\n stream: (req) => streamTurn(client, args.id, req),\n listModels: () => listModels(client, args.id),\n knownModels: () => KNOWN_MODELS,\n }\n}\n\nasync function* streamTurn(\n client: Anthropic,\n providerId: string,\n req: ChatRequest,\n): AsyncGenerator<StreamEvent> {\n const params: Anthropic.MessageStreamParams = {\n model: req.model,\n max_tokens: req.maxTokens,\n system: [{ type: 'text', text: req.system, cache_control: { type: 'ephemeral' } }],\n messages: toMessageParams(req.messages),\n tools: toToolParams(req.tools),\n }\n if (req.thinking) params.thinking = { type: 'adaptive', display: 'summarized' }\n if (req.effort) params.output_config = { effort: req.effort }\n\n let thinking = ''\n let text = ''\n let events = 0\n let final: Anthropic.Message\n const capture = captureResponseHead()\n const stream = client\n .withOptions({ fetch: capture.fetch })\n .messages.stream(params, { signal: req.signal })\n\n try {\n for await (const event of stream) {\n events += 1\n if (event.type !== 'content_block_delta') continue\n if (event.delta.type === 'text_delta') {\n text += event.delta.text\n yield { type: 'text_delta', text: event.delta.text }\n } else if (event.delta.type === 'thinking_delta') {\n thinking += event.delta.thinking\n yield { type: 'thinking_delta', text: event.delta.thinking }\n }\n }\n final = await stream.finalMessage()\n } catch (error) {\n if (isUserAbort(error, req.signal)) {\n const partial = stream.currentMessage\n if (partial) yield { type: 'usage', usage: toUsage(partial.usage) }\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n yield { type: 'done', stopReason: 'aborted', content: partialContent(thinking, text) }\n return\n }\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n if (events === 0 && capture.succeeded() && !isConnectionFailure(error)) {\n throw await invalidStreamError(providerId, capture, error)\n }\n throw toProviderError(error, providerId)\n }\n\n const stopReason = STOP_REASONS[final.stop_reason ?? ''] ?? 'end_turn'\n const content = toContentBlocks(final.content)\n\n for (const block of content) {\n if (block.type === 'tool_use') {\n yield { type: 'tool_call', id: block.id, name: block.name, input: block.input }\n }\n }\n yield { type: 'usage', usage: toUsage(final.usage) }\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n yield {\n type: 'done',\n stopReason,\n content,\n ...(stopReason === 'refusal' ? { refusal: toRefusal(final.stop_details) } : {}),\n }\n}\n\nasync function listModels(client: Anthropic, providerId: string): Promise<ModelInfo[]> {\n try {\n const models: ModelInfo[] = []\n for await (const model of client.models.list({ limit: 100 })) {\n models.push({\n id: model.id,\n name: model.display_name,\n contextWindow: model.max_input_tokens ?? undefined,\n maxOutput: model.max_tokens ?? undefined,\n pricing: pricingFor(model.id),\n })\n }\n return models\n } catch (error) {\n throw toProviderError(error, providerId)\n }\n}\n\nfunction toMessageParams(messages: Message[]): Anthropic.MessageParam[] {\n const params: Anthropic.MessageParam[] = []\n for (const message of messages) {\n const content = message.content.flatMap(toBlockParams)\n if (content.length > 0) params.push({ role: message.role, content })\n }\n return params\n}\n\nfunction toBlockParams(block: ContentBlock): Anthropic.ContentBlockParam[] {\n switch (block.type) {\n case 'text':\n return [{ type: 'text', text: block.text }]\n case 'thinking':\n return block.raw ? [block.raw as Anthropic.ContentBlockParam] : []\n case 'tool_use':\n return [{ type: 'tool_use', id: block.id, name: block.name, input: block.input }]\n case 'tool_result':\n return [\n {\n type: 'tool_result',\n tool_use_id: block.toolUseId,\n content: block.content,\n is_error: block.isError,\n },\n ]\n case 'image':\n return [\n {\n type: 'image',\n source: { type: 'base64', media_type: block.mediaType, data: block.data },\n },\n ]\n case 'file':\n return [{ type: 'text', text: `[Attached file: ${block.name}]\\n${block.text}` }]\n }\n}\n\nfunction toToolParams(tools: ToolSchema[]): Anthropic.Tool[] {\n return tools.map((tool, index) => {\n const param: Anthropic.Tool = {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema as Anthropic.Tool['input_schema'],\n }\n if (index === tools.length - 1) param.cache_control = { type: 'ephemeral' }\n return param\n })\n}\n\nfunction toContentBlocks(blocks: Anthropic.ContentBlock[]): ContentBlock[] {\n const content: ContentBlock[] = []\n for (const block of blocks) {\n if (block.type === 'text') content.push({ type: 'text', text: block.text })\n else if (block.type === 'thinking')\n content.push({ type: 'thinking', text: block.thinking, raw: block })\n else if (block.type === 'redacted_thinking')\n content.push({ type: 'thinking', text: '', raw: block })\n else if (block.type === 'tool_use')\n content.push({ type: 'tool_use', id: block.id, name: block.name, input: block.input })\n }\n return content\n}\n\nfunction partialContent(thinking: string, text: string): ContentBlock[] {\n const content: ContentBlock[] = []\n if (thinking) content.push({ type: 'thinking', text: thinking })\n if (text) content.push({ type: 'text', text })\n return content\n}\n\nfunction toUsage(usage: Anthropic.Usage): Usage {\n return {\n input: usage.input_tokens ?? 0,\n output: usage.output_tokens ?? 0,\n cacheWrite: usage.cache_creation_input_tokens ?? 0,\n cacheRead: usage.cache_read_input_tokens ?? 0,\n }\n}\n\nfunction toRefusal(details: Anthropic.RefusalStopDetails | null) {\n return { category: details?.category ?? null, explanation: details?.explanation ?? null }\n}\n\nfunction knownModel(id: string, name: string, contextWindow: number, maxOutput: number): ModelInfo {\n return { id, name, contextWindow, maxOutput, pricing: pricingFor(id) }\n}\n","import type { RateLimitBucket, RateLimits } from './types'\n\ntype HeaderNames = {\n limit?: string[]\n remaining?: string[]\n reset?: string[]\n}\n\nconst SCHEMES: Record<keyof RateLimits, HeaderNames> = {\n requests: {\n limit: [\n 'x-ratelimit-limit-requests',\n 'anthropic-ratelimit-requests-limit',\n 'ratelimit-limit',\n 'x-ratelimit-limit',\n ],\n remaining: [\n 'x-ratelimit-remaining-requests',\n 'anthropic-ratelimit-requests-remaining',\n 'ratelimit-remaining',\n 'x-ratelimit-remaining',\n ],\n reset: [\n 'x-ratelimit-reset-requests',\n 'anthropic-ratelimit-requests-reset',\n 'ratelimit-reset',\n 'x-ratelimit-reset',\n ],\n },\n tokens: {\n limit: ['x-ratelimit-limit-tokens', 'anthropic-ratelimit-tokens-limit'],\n remaining: ['x-ratelimit-remaining-tokens', 'anthropic-ratelimit-tokens-remaining'],\n reset: ['x-ratelimit-reset-tokens', 'anthropic-ratelimit-tokens-reset'],\n },\n inputTokens: {\n limit: ['anthropic-ratelimit-input-tokens-limit'],\n remaining: ['anthropic-ratelimit-input-tokens-remaining'],\n reset: ['anthropic-ratelimit-input-tokens-reset'],\n },\n outputTokens: {\n limit: ['anthropic-ratelimit-output-tokens-limit'],\n remaining: ['anthropic-ratelimit-output-tokens-remaining'],\n reset: ['anthropic-ratelimit-output-tokens-reset'],\n },\n}\n\nexport function parseRateLimits(headers: Headers | null): RateLimits | null {\n if (!headers) return null\n const limits: RateLimits = {}\n for (const [name, scheme] of Object.entries(SCHEMES) as Array<\n [keyof RateLimits, HeaderNames]\n >) {\n const bucket = readBucket(headers, scheme)\n if (bucket) limits[name] = bucket\n }\n return Object.keys(limits).length > 0 ? limits : null\n}\n\nfunction readBucket(headers: Headers, names: HeaderNames): RateLimitBucket | null {\n const limit = readNumber(headers, names.limit)\n const remaining = readNumber(headers, names.remaining)\n const reset = readReset(headers, names.reset)\n if (limit === undefined && remaining === undefined && reset === undefined) return null\n return {\n ...(limit === undefined ? {} : { limit }),\n ...(remaining === undefined ? {} : { remaining }),\n ...(reset === undefined ? {} : { reset }),\n }\n}\n\nfunction first(headers: Headers, names: string[] | undefined): string | undefined {\n for (const name of names ?? []) {\n const value = headers.get(name)?.trim()\n if (value) return value\n }\n return undefined\n}\n\nfunction readNumber(headers: Headers, names: string[] | undefined): number | undefined {\n const value = first(headers, names)\n if (!value || !/^\\d+(?:\\.\\d+)?$/.test(value)) return undefined\n const parsed = Number(value)\n return Number.isFinite(parsed) && parsed >= 0 && parsed <= 1e15 ? parsed : undefined\n}\n\nfunction readReset(headers: Headers, names: string[] | undefined): string | undefined {\n const value = first(headers, names)\n if (!value || value.length > 80 || /[\\r\\n\\0-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/.test(value)) {\n return undefined\n }\n return value\n}\n\nexport function formatRateLimits(limits: RateLimits): string[] {\n const labels: Array<[keyof RateLimits, string]> = [\n ['requests', 'requests'],\n ['tokens', 'tokens'],\n ['inputTokens', 'input tokens'],\n ['outputTokens', 'output tokens'],\n ]\n return labels.flatMap(([key, label]) => {\n const bucket = limits[key]\n if (!bucket) return []\n const amount =\n bucket.remaining !== undefined && bucket.limit !== undefined\n ? `${formatNumber(bucket.remaining)} / ${formatNumber(bucket.limit)} left`\n : bucket.remaining !== undefined\n ? `${formatNumber(bucket.remaining)} left`\n : bucket.limit !== undefined\n ? `limit ${formatNumber(bucket.limit)}`\n : ''\n const reset = bucket.reset ? `reset ${bucket.reset}` : ''\n const details = [amount, reset].filter(Boolean).join(' · ')\n return [`${label}${details ? ` ${details}` : ''}`]\n })\n}\n\nfunction formatNumber(value: number): string {\n return Number.isInteger(value) ? value.toLocaleString('en-US') : String(value)\n}\n","import OpenAI from 'openai'\nimport {\n captureResponseHead,\n invalidStreamError,\n isUserAbort,\n MAX_RETRIES,\n REQUEST_TIMEOUT_MS,\n toProviderError,\n} from './errors'\nimport { modelInfoFromRaw } from './model-info'\nimport { pricingFor } from './pricing'\nimport { parseRateLimits } from './rate-limits'\nimport { emptyUsage } from './types'\nimport type {\n ChatRequest,\n ContentBlock,\n Message,\n ModelInfo,\n Provider,\n StopReason,\n StreamEvent,\n ToolSchema,\n ToolUseBlock,\n Usage,\n} from './types'\n\nconst FINISH_REASONS: Record<string, StopReason> = {\n tool_calls: 'tool_use',\n stop: 'end_turn',\n length: 'max_tokens',\n content_filter: 'refusal',\n}\n\ninterface PartialCall {\n id: string\n name: string\n args: string\n}\n\ntype ReasoningDelta = { reasoning_content?: string | null; reasoning?: string | null }\n\ntype ToolCallDelta = OpenAI.Chat.ChatCompletionChunk.Choice.Delta.ToolCall\n\nexport function createOpenAiProvider(args: {\n id: string\n apiKey: string\n baseUrl: string\n headers?: Record<string, string>\n timeoutMs?: number\n}): Provider {\n const client = new OpenAI({\n baseURL: args.baseUrl,\n apiKey: args.apiKey,\n defaultHeaders: args.headers,\n maxRetries: MAX_RETRIES,\n timeout: args.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n return {\n id: args.id,\n kind: 'openai',\n stream: (req) => streamTurn(client, args.id, req),\n listModels: () => listModels(client, args.id),\n knownModels: () => [],\n }\n}\n\nasync function* streamTurn(\n client: OpenAI,\n providerId: string,\n req: ChatRequest,\n): AsyncGenerator<StreamEvent> {\n let text = ''\n let thinking = ''\n let finishReason: string | null = null\n let aborted = false\n let usage = emptyUsage()\n let sawUsage = false\n let recognised = 0\n const calls = new Map<number, PartialCall>()\n const capture = captureResponseHead()\n\n try {\n const stream = await client.withOptions({ fetch: capture.fetch }).chat.completions.create(\n {\n model: req.model,\n max_tokens: req.maxTokens,\n messages: toChatMessages(req.system, req.messages),\n ...(req.tools.length > 0 ? { tools: toChatTools(req.tools) } : {}),\n stream: true,\n stream_options: { include_usage: true },\n },\n { signal: req.signal },\n )\n\n for await (const chunk of stream) {\n if (chunk.usage) {\n usage = toUsage(chunk.usage)\n sawUsage = true\n }\n if (!Array.isArray(chunk.choices)) continue\n recognised += 1\n const choice = chunk.choices[0]\n if (!choice) continue\n if (choice.finish_reason) finishReason = choice.finish_reason\n const delta = choice.delta as typeof choice.delta & ReasoningDelta\n const reasoning = delta.reasoning_content ?? delta.reasoning\n if (reasoning) {\n thinking += reasoning\n yield { type: 'thinking_delta', text: reasoning }\n }\n if (delta.content) {\n text += delta.content\n yield { type: 'text_delta', text: delta.content }\n }\n for (const call of delta.tool_calls ?? []) accumulate(calls, call)\n }\n } catch (error) {\n if (!isUserAbort(error, req.signal)) {\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n throw toProviderError(error, providerId)\n }\n aborted = true\n }\n\n const content = toContentBlocks(thinking, text, calls)\n if (aborted || req.signal?.aborted) {\n if (sawUsage) yield { type: 'usage', usage }\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n yield { type: 'done', stopReason: 'aborted', content }\n return\n }\n\n if (recognised === 0) throw await invalidStreamError(providerId, capture)\n\n for (const block of content) {\n if (block.type === 'tool_use') {\n yield { type: 'tool_call', id: block.id, name: block.name, input: block.input }\n }\n }\n if (sawUsage) yield { type: 'usage', usage }\n const limits = parseRateLimits(capture.headers())\n if (limits) yield { type: 'rate_limits', limits }\n yield { type: 'done', stopReason: resolveStop(finishReason, calls.size > 0), content }\n}\n\nfunction resolveStop(finishReason: string | null, hasCalls: boolean): StopReason {\n const mapped = FINISH_REASONS[finishReason ?? '']\n if (mapped === 'max_tokens' || mapped === 'refusal') return mapped\n if (hasCalls) return 'tool_use'\n return mapped ?? 'end_turn'\n}\n\nasync function listModels(client: OpenAI, providerId: string): Promise<ModelInfo[]> {\n try {\n const models: ModelInfo[] = []\n for await (const model of client.models.list()) {\n const metadata = modelInfoFromRaw(model) ?? { id: model.id }\n models.push({ ...metadata, pricing: metadata.pricing ?? pricingFor(model.id) })\n }\n return models\n } catch (error) {\n throw toProviderError(error, providerId)\n }\n}\n\nfunction accumulate(calls: Map<number, PartialCall>, delta: ToolCallDelta): void {\n const call = calls.get(delta.index) ?? { id: '', name: '', args: '' }\n if (delta.id) call.id += delta.id\n if (delta.function?.name) call.name += delta.function.name\n if (delta.function?.arguments) call.args += delta.function.arguments\n calls.set(delta.index, call)\n}\n\nfunction toContentBlocks(\n thinking: string,\n text: string,\n calls: Map<number, PartialCall>,\n): ContentBlock[] {\n const content: ContentBlock[] = []\n if (thinking) content.push({ type: 'thinking', text: thinking })\n if (text) content.push({ type: 'text', text })\n const sorted = [...calls.entries()].sort((a, b) => a[0] - b[0])\n const tmpId = (position: number) => `call_${position}`\n for (const [position, [, call]] of sorted.entries()) {\n content.push({\n type: 'tool_use',\n id: call.id || tmpId(position),\n name: call.name,\n input: parseArguments(call.args),\n })\n }\n return content\n}\n\nfunction parseArguments(args: string): Record<string, unknown> {\n if (!args) return {}\n try {\n return JSON.parse(args) as Record<string, unknown>\n } catch {\n return {}\n }\n}\n\nfunction toChatMessages(\n system: string,\n messages: Message[],\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n const out: OpenAI.Chat.ChatCompletionMessageParam[] = [{ role: 'system', content: system }]\n for (const message of messages) {\n if (message.role === 'assistant') out.push(...toAssistantMessage(message.content))\n else out.push(...toUserMessages(message.content))\n }\n return out\n}\n\nfunction toUserMessages(content: ContentBlock[]): OpenAI.Chat.ChatCompletionMessageParam[] {\n const out: OpenAI.Chat.ChatCompletionMessageParam[] = []\n for (const block of content) {\n if (block.type === 'tool_result') {\n out.push({ role: 'tool', tool_call_id: block.toolUseId, content: block.content })\n }\n }\n const parts: OpenAI.Chat.ChatCompletionContentPart[] = []\n for (const block of content) {\n if (block.type === 'text') parts.push({ type: 'text', text: block.text })\n if (block.type === 'file') {\n parts.push({ type: 'text', text: `[Attached file: ${block.name}]\\n${block.text}` })\n }\n if (block.type === 'image') {\n parts.push({\n type: 'image_url',\n image_url: { url: `data:${block.mediaType};base64,${block.data}` },\n })\n }\n }\n if (parts.length === 1 && parts[0]?.type === 'text') {\n out.push({ role: 'user', content: parts[0].text })\n } else if (parts.length > 0) {\n out.push({ role: 'user', content: parts })\n }\n return out\n}\n\nfunction toAssistantMessage(content: ContentBlock[]): OpenAI.Chat.ChatCompletionMessageParam[] {\n const toolCalls = content\n .filter((block): block is ToolUseBlock => block.type === 'tool_use')\n .map((block) => ({\n id: block.id,\n type: 'function' as const,\n function: { name: block.name, arguments: JSON.stringify(block.input ?? {}) },\n }))\n const text = joinText(content)\n if (!text && toolCalls.length === 0) return []\n const message: OpenAI.Chat.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n content: text || null,\n }\n if (toolCalls.length > 0) message.tool_calls = toolCalls\n return [message]\n}\n\nfunction joinText(content: ContentBlock[]): string {\n return content.map((block) => (block.type === 'text' ? block.text : '')).join('')\n}\n\nfunction toChatTools(tools: ToolSchema[]): OpenAI.Chat.ChatCompletionFunctionTool[] {\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }))\n}\n\nfunction toUsage(usage: NonNullable<OpenAI.Chat.ChatCompletionChunk['usage']>): Usage {\n return normalizeOpenAiUsage(usage)\n}\n\nexport function normalizeOpenAiUsage(usage: {\n prompt_tokens?: number | null\n completion_tokens?: number | null\n prompt_tokens_details?: { cached_tokens?: number | null } | null\n}): Usage {\n \n \n \n const cacheRead = usage.prompt_tokens_details?.cached_tokens ?? 0\n return {\n input: Math.max(0, (usage.prompt_tokens ?? 0) - cacheRead),\n output: usage.completion_tokens ?? 0,\n cacheWrite: 0,\n cacheRead,\n }\n}\n","import { parseModelRef } from '../config/schema'\nimport type { AuthFile, Config, ProviderConfig } from '../config/schema'\nimport { resolveApiKey } from '../config/store'\nimport { createAnthropicProvider } from './anthropic'\nimport { createOpenAiProvider } from './openai-compat'\nimport type { Provider } from './types'\n\nexport interface ResolvedModel {\n provider: Provider\n modelId: string\n}\n\nexport interface ProviderRegistry {\n get(id: string): Provider\n resolve(ref: string): ResolvedModel\n}\n\nexport function createRegistry(config: Config, auth: AuthFile): ProviderRegistry {\n const built = new Map<string, Provider>()\n\n function get(id: string): Provider {\n const cached = built.get(id)\n if (cached) return cached\n\n const entry = config.providers[id]\n if (!entry) throw new Error(unknownProviderMessage(id, Object.keys(config.providers)))\n\n const provider = build(id, entry, apiKey(id, entry, auth))\n built.set(id, provider)\n return provider\n }\n\n return {\n get,\n resolve(ref) {\n const parsed = parseModelRef(ref)\n if (!parsed) {\n throw new Error(\n `Model \"${ref}\" is not a \"<provider>/<model>\" reference, e.g. \"anthropic/claude-opus-5\".`,\n )\n }\n return { provider: get(parsed.provider), modelId: parsed.model }\n },\n }\n}\n\nfunction build(id: string, entry: ProviderConfig, key: string): Provider {\n const args = { id, apiKey: key, baseUrl: entry.baseUrl, headers: entry.headers }\n return entry.type === 'anthropic' ? createAnthropicProvider(args) : createOpenAiProvider(args)\n}\n\nfunction apiKey(id: string, entry: ProviderConfig, auth: AuthFile): string {\n const key = resolveApiKey(id, entry, auth)\n if (key) return key\n throw new Error(\n `No API key for provider \"${id}\"${entry.keyEnv ? ` (env ${entry.keyEnv} is unset)` : ''}. ` +\n `Add one with: kitcode add ${entry.baseUrl}`,\n )\n}\n\nfunction unknownProviderMessage(id: string, known: string[]): string {\n const configured = known.length > 0 ? known.join(', ') : 'none'\n return (\n `Unknown provider \"${id}\". Configured providers: ${configured}. ` +\n `Add it with: kitcode add <url>`\n )\n}\n","import type { PermissionMode, Tool } from './types'\n\nexport type AgentMode = 'normal' | 'accept' | 'plan'\n\nexport const MODES: AgentMode[] = ['normal', 'accept', 'plan']\n\nexport interface PermissionEngine {\n resolve(tool: Tool, requested?: PermissionMode): PermissionMode\n decide(tool: Tool, requested?: PermissionMode): PermissionMode\n grantForSession(toolName: string): void\n bypass: {\n enable(): void\n disable(): void\n isEnabled(): boolean\n }\n denyReason(tool: Tool, requested?: PermissionMode): string | undefined\n mode: {\n get(): AgentMode\n set(mode: AgentMode): void\n cycle(): AgentMode\n }\n}\n\nexport const PLAN_REFUSAL =\n 'Plan mode is on: this tool changes state and is unavailable. Investigate with read-only tools and reply with a plan instead. Do not retry.'\n\nexport function createPermissionEngine(\n configPermissions: Record<string, PermissionMode>,\n): PermissionEngine {\n const sessionGrants = new Set<string>()\n let bypassEnabled = false\n let current: AgentMode = 'normal'\n\n const resolve = (tool: Tool, requested?: PermissionMode): PermissionMode =>\n configPermissions[tool.name] ?? requested ?? tool.defaultPermission\n\n return {\n resolve,\n decide(tool, requested) {\n const configured = resolve(tool, requested)\n if (configured === 'deny') return 'deny'\n if (current === 'plan' && configured !== 'allow') return 'deny'\n if (configured === 'allow') return 'allow'\n if (bypassEnabled) return 'allow'\n if (current === 'accept' && isFileEdit(tool)) return 'allow'\n if (sessionGrants.has(tool.name)) return 'allow'\n return 'ask'\n },\n grantForSession(toolName) {\n sessionGrants.add(toolName)\n },\n denyReason(tool, requested) {\n const configured = resolve(tool, requested)\n if (configured === 'deny' || configured === 'allow') return undefined\n return current === 'plan' ? PLAN_REFUSAL : undefined\n },\n bypass: {\n enable() {\n bypassEnabled = true\n },\n disable() {\n bypassEnabled = false\n },\n isEnabled() {\n return bypassEnabled\n },\n },\n mode: {\n get: () => current,\n set(mode) {\n current = mode\n },\n cycle() {\n current = MODES[(MODES.indexOf(current) + 1) % MODES.length] ?? 'normal'\n return current\n },\n },\n }\n}\n\nfunction isFileEdit(tool: Tool): boolean {\n return tool.name === 'write' || tool.name === 'edit'\n}\n","import { lstat, readFile, stat, writeFile } from 'node:fs/promises'\nimport { resolveInside } from './safepath'\nimport { brief } from './summary'\nimport type { Tool } from './types'\n\ninterface EditInput {\n path: string\n oldString: string\n newString: string\n replaceAll?: boolean\n}\n\nconst MAX_FILE_BYTES = 5_000_000\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (needle === '') return 0\n let count = 0\n let from = 0\n for (;;) {\n const at = haystack.indexOf(needle, from)\n if (at === -1) return count\n count += 1\n from = at + needle.length\n }\n}\n\nexport const editTool: Tool = {\n name: 'edit',\n description:\n 'Replace an exact string in a file. oldString must match the file byte for byte, including indentation, and must be unique unless replaceAll is true.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path, relative to the workspace root' },\n oldString: {\n type: 'string',\n description: 'Text to replace, with enough context to be unique',\n maxLength: MAX_FILE_BYTES,\n },\n newString: { type: 'string', description: 'Replacement text', maxLength: MAX_FILE_BYTES },\n replaceAll: { type: 'boolean', description: 'Replace every occurrence instead of requiring a unique match' },\n },\n required: ['path', 'oldString', 'newString'],\n additionalProperties: false,\n },\n defaultPermission: 'ask',\n summarize(input) {\n return `edit(${brief((input as EditInput).path)})`\n },\n async preview(input, ctx) {\n const { path, oldString, newString, replaceAll = false } = input as EditInput\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { kind: 'text', text: safe.reason }\n const info = await stat(safe.path).catch(() => null)\n if (info && info.size > MAX_FILE_BYTES) {\n return { kind: 'text', text: `Cannot preview ${path}: the file is too large.` }\n }\n const beforeBuffer = await readFile(safe.path).catch(() => null)\n if (!beforeBuffer) return { kind: 'text', text: `Cannot read ${path}.` }\n if (beforeBuffer.subarray(0, 8192).includes(0)) {\n return { kind: 'text', text: `Cannot preview binary file ${path}` }\n }\n const before = beforeBuffer.toString('utf8')\n const after = replacement(before, oldString, newString, replaceAll)\n return after === null\n ? { kind: 'text', text: `Cannot preview edit: oldString is not a valid match in ${path}.` }\n : { kind: 'diff', path, before, after }\n },\n async execute(input, ctx) {\n const { path, oldString, newString, replaceAll = false } = input as EditInput\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { content: safe.reason, isError: true }\n\n const linkInfo = await lstat(safe.path).catch(() => null)\n if (linkInfo?.isSymbolicLink()) {\n return { content: `Cannot edit ${path}: the path is a symbolic link. Remove the symlink first.`, isError: true }\n }\n\n const info = await stat(safe.path).catch(() => null)\n if (info && info.size > MAX_FILE_BYTES) {\n return {\n content: `Cannot edit ${path}: the file exceeds the ${MAX_FILE_BYTES / 1_000_000} MB limit.`,\n isError: true,\n }\n }\n const beforeBuffer = await readFile(safe.path).catch(() => null)\n if (beforeBuffer === null) return { content: `Cannot read ${path}.`, isError: true }\n if (beforeBuffer.subarray(0, 8192).includes(0)) {\n return { content: `Cannot edit ${path}: it is a binary file, not text.`, isError: true }\n }\n const before = beforeBuffer.toString('utf8')\n\n const count = countOccurrences(before, oldString)\n if (count === 0) {\n return {\n content: `oldString was not found in ${path}. Read the file again and match the text exactly, including whitespace.`,\n isError: true,\n }\n }\n if (count > 1 && !replaceAll) {\n return {\n content: `oldString matches ${count} places in ${path}. Add more surrounding context to identify a single one, or set replaceAll to true.`,\n isError: true,\n }\n }\n\n const after = replacement(before, oldString, newString, replaceAll)\n if (after === null) return { content: `Could not prepare edit for ${path}.`, isError: true }\n if (Buffer.byteLength(after, 'utf8') > MAX_FILE_BYTES) {\n return {\n content: `Cannot edit ${path}: the result exceeds the ${MAX_FILE_BYTES / 1_000_000} MB limit.`,\n isError: true,\n }\n }\n\n try {\n await ctx.checkpoint?.capture(safe.path)\n } catch (error) {\n return { content: `Checkpoint capture failed: ${(error as Error).message}`, isError: true }\n }\n try {\n await writeFile(safe.path, after, 'utf8')\n ctx.checkpoint?.markChanged(safe.path)\n } catch (error) {\n return { content: `Failed to write ${path}: ${(error as Error).message}`, isError: true }\n }\n\n return {\n content: `Edited ${path} (${count} ${count === 1 ? 'replacement' : 'replacements'})`,\n display: { kind: 'diff', path, before, after },\n }\n },\n}\n\nfunction replacement(\n before: string,\n oldString: string,\n newString: string,\n replaceAll: boolean,\n): string | null {\n const count = countOccurrences(before, oldString)\n if (count === 0 || (count > 1 && !replaceAll)) return null\n if (replaceAll) return before.split(oldString).join(newString)\n const at = before.indexOf(oldString)\n return before.slice(0, at) + newString + before.slice(at + oldString.length)\n}\n","import { join } from 'node:path'\nimport fg from 'fast-glob'\nimport { patternEscapes, resolveInside } from './safepath'\nimport { brief } from './summary'\nimport type { Tool } from './types'\n\nconst MAX_RESULTS = 500\n\nexport const IGNORED_DIRECTORIES = ['**/node_modules/**', '**/.git/**', '**/dist/**']\n\ninterface GlobInput {\n pattern: string\n path?: string\n}\n\nexport const globTool: Tool = {\n name: 'glob',\n description:\n 'Find files by glob pattern, most recently modified first. Supports patterns like \"src/**/*.ts\". Hidden files, node_modules, .git and dist are skipped.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Glob pattern, e.g. **/*.test.ts' },\n path: { type: 'string', description: 'Directory to search in, relative to the workspace root' },\n },\n required: ['pattern'],\n additionalProperties: false,\n },\n defaultPermission: 'allow',\n summarize(input) {\n return `glob(${brief((input as GlobInput).pattern)})`\n },\n async execute(input, ctx) {\n const { pattern, path = '.' } = input as GlobInput\n if (patternEscapes(pattern)) {\n return { content: `Pattern ${pattern} must be relative to the workspace root.`, isError: true }\n }\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { content: safe.reason, isError: true }\n\n const entries = await fg(pattern, {\n cwd: safe.path,\n dot: false,\n onlyFiles: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n ignore: IGNORED_DIRECTORIES,\n stats: true,\n })\n if (entries.length === 0) return { content: `No files matched ${pattern}` }\n\n entries.sort((a, b) => (b.stats?.mtimeMs ?? 0) - (a.stats?.mtimeMs ?? 0))\n const paths = entries.slice(0, MAX_RESULTS).map((entry) => join(safe.relative, entry.path))\n if (entries.length > MAX_RESULTS) {\n paths.push(`... truncated: ${entries.length - MAX_RESULTS} more files matched.`)\n }\n return { content: paths.join('\\n') }\n },\n}\n","import { readFile, stat } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport fg from 'fast-glob'\nimport { IGNORED_DIRECTORIES } from './glob'\nimport { patternEscapes, resolveInside } from './safepath'\nimport { brief } from './summary'\nimport type { Tool } from './types'\nimport { isSensitivePath, mentionsSensitivePattern } from './sensitive'\nimport { createRegexMatcher } from './regex'\n\nconst MAX_MATCHES = 200\nconst MAX_FILE_BYTES = 1_000_000\nconst MAX_LINE_WIDTH = 300\nconst MAX_PATTERN_CHARS = 2_000\nconst MAX_FILES = 5_000\nconst MAX_TOTAL_BYTES = 50_000_000\n\ninterface GrepInput {\n pattern: string\n path?: string\n glob?: string\n maxMatches?: number\n}\n\nexport const grepTool: Tool = {\n name: 'grep',\n description:\n 'Search file contents with a JavaScript regular expression. Returns matching lines as path:line: text, most recently modified files first.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'JavaScript regular expression',\n maxLength: MAX_PATTERN_CHARS,\n },\n path: { type: 'string', description: 'Directory to search in, relative to the workspace root' },\n glob: { type: 'string', description: 'Glob limiting which files are searched, e.g. **/*.ts' },\n maxMatches: { type: 'integer', description: `Maximum matches to return (default ${MAX_MATCHES})`, minimum: 1 },\n },\n required: ['pattern'],\n additionalProperties: false,\n },\n defaultPermission: 'allow',\n permission(input, ctx) {\n const { path, glob } = (input as Partial<GrepInput> | null) ?? {}\n if (isSensitivePath(path) || mentionsSensitivePattern(glob)) return 'ask'\n const safe = ctx && path ? resolveInside(ctx.cwd, path) : undefined\n return safe?.ok && isSensitivePath(safe.relative) ? 'ask' : undefined\n },\n summarize(input) {\n return `grep(${brief((input as GrepInput).pattern)})`\n },\n async execute(input, ctx) {\n const { pattern, path = '.', glob = '**/*', maxMatches } = input as GrepInput\n if (pattern.length > MAX_PATTERN_CHARS) {\n return {\n content: `Regular expression is limited to ${MAX_PATTERN_CHARS} characters.`,\n isError: true,\n }\n }\n try {\n new RegExp(pattern)\n } catch (error) {\n return { content: `Invalid regular expression: ${(error as Error).message}`, isError: true }\n }\n\n if (patternEscapes(glob)) {\n return { content: `Glob ${glob} must be relative to the workspace root.`, isError: true }\n }\n\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { content: safe.reason, isError: true }\n\n const target = await stat(safe.path).catch(() => null)\n if (!target) return { content: `Path not found: ${path}`, isError: true }\n\n const discovered = target.isDirectory()\n ? (\n await fg(glob, {\n cwd: safe.path,\n dot: false,\n onlyFiles: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n ignore: IGNORED_DIRECTORIES,\n stats: true,\n })\n )\n .sort((a, b) => (b.stats?.mtimeMs ?? 0) - (a.stats?.mtimeMs ?? 0))\n .map((entry) => ({\n absolute: join(safe.path, entry.path),\n relative: join(safe.relative, entry.path),\n size: entry.stats?.size ?? 0,\n }))\n : [{ absolute: safe.path, relative: safe.relative, size: target.size }]\n const files = discovered.slice(0, MAX_FILES)\n const filesCapped = discovered.length > MAX_FILES\n\n const limit = Math.min(maxMatches ?? MAX_MATCHES, MAX_MATCHES)\n const hits: string[] = []\n let matchCapped = false\n let scanCapped = false\n let scannedBytes = 0\n const matcher = createRegexMatcher(pattern)\n\n try {\n for (const file of files) {\n if (ctx.signal.aborted) throw new Error('Search interrupted by the user.')\n if (file.size > MAX_FILE_BYTES) continue\n if (scannedBytes + file.size > MAX_TOTAL_BYTES) {\n scanCapped = true\n break\n }\n scannedBytes += file.size\n const buffer = await readFile(file.absolute).catch(() => null)\n if (!buffer || buffer.subarray(0, 4096).includes(0)) continue\n\n const lines = buffer.toString('utf8').split('\\n')\n const remaining = limit - hits.length\n const indexes = await matcher.match(lines, remaining + 1, ctx.signal)\n if (indexes.length > remaining) matchCapped = true\n for (const index of indexes.slice(0, remaining)) {\n const text = (lines[index] ?? '').trim()\n hits.push(\n `${file.relative}:${index + 1}: ${text.length > MAX_LINE_WIDTH ? `${text.slice(0, MAX_LINE_WIDTH)}…` : text}`,\n )\n }\n if (matchCapped) break\n }\n } catch (error) {\n return { content: (error as Error).message, isError: true }\n } finally {\n await matcher.close()\n }\n\n if (hits.length === 0) return { content: `No matches for ${pattern}` }\n if (matchCapped || scanCapped || filesCapped) {\n hits.push(\n matchCapped\n ? `... stopped at ${limit} matches. Narrow the pattern or glob for the rest.`\n : scanCapped\n ? `... stopped after scanning ${MAX_TOTAL_BYTES / 1_000_000} MB. Narrow the path or glob for the rest.`\n : `... searched the first ${MAX_FILES} files. Narrow the path or glob for the rest.`,\n )\n }\n return { content: hits.join('\\n') }\n },\n}\n","import path from 'node:path'\n\nconst sensitiveNames = new Set([\n '.npmrc',\n '.pypirc',\n '.git-credentials',\n '.netrc',\n '.pgpass',\n '.my.cnf',\n '.docker/config.json',\n 'auth.json',\n 'credentials',\n 'credentials.json',\n 'id_rsa',\n 'id_ed25519',\n 'id_dsa',\n 'id_ecdsa',\n 'kubeconfig',\n 'known_hosts',\n 'secret.json',\n 'secrets.json',\n 'tokens.json',\n 'service-account.json',\n])\n\nconst sensitiveExtensions = new Set(['.pem', '.key', '.p12', '.pfx', '.jks', '.keystore', '.p8', '.der'])\n\nexport function isSensitivePath(value: unknown): boolean {\n if (typeof value !== 'string') return false\n const normalized = value.replaceAll('\\\\', '/').toLowerCase()\n const name = path.posix.basename(normalized)\n if (name === '.env' || name.startsWith('.env.')) return true\n if (sensitiveNames.has(name) || sensitiveExtensions.has(path.posix.extname(name))) return true\n return normalized.split('/').some((part) => part === '.ssh' || part === '.aws')\n}\n\nexport function mentionsSensitivePattern(value: unknown): boolean {\n if (typeof value !== 'string') return false\n const lower = value.toLowerCase()\n return (\n isSensitivePath(lower) ||\n lower.includes('.env') ||\n lower.includes('.npmrc') ||\n lower.includes('.netrc') ||\n lower.includes('.pgpass') ||\n lower.includes('auth.json') ||\n lower.includes('credentials') ||\n lower.includes('kubeconfig') ||\n lower.includes('secret') ||\n lower.includes('tokens.json') ||\n /\\.(?:pem|key|p12|pfx|jks|keystore|p8|der)(?:$|[^a-z0-9])/.test(lower)\n )\n}\n","import { Worker } from 'node:worker_threads'\n\nconst MATCH_TIMEOUT_MS = 300\n\nconst WORKER_SOURCE = String.raw`\n const { parentPort } = require('node:worker_threads')\n\n parentPort.on('message', ({ id, pattern, lines, maxMatches }) => {\n try {\n const regex = new RegExp(pattern)\n const indexes = []\n for (let index = 0; index < lines.length; index += 1) {\n const matched = regex.test(lines[index])\n regex.lastIndex = 0\n if (matched) indexes.push(index)\n if (indexes.length >= maxMatches) break\n }\n parentPort.postMessage({ id, indexes })\n } catch (error) {\n parentPort.postMessage({ id, error: error instanceof Error ? error.message : String(error) })\n }\n })\n`\n\ninterface WorkerReply {\n id: number\n indexes?: number[]\n error?: string\n}\n\nexport interface RegexMatcher {\n match(lines: string[], maxMatches: number, signal: AbortSignal): Promise<number[]>\n close(): Promise<void>\n}\n\nexport function createRegexMatcher(pattern: string): RegexMatcher {\n let worker = newWorker()\n let nextId = 0\n let closed = false\n\n return {\n match(lines, maxMatches, signal) {\n if (closed) return Promise.reject(new Error('Regular-expression worker is closed.'))\n if (signal.aborted) return Promise.reject(new Error('Search interrupted by the user.'))\n\n const id = ++nextId\n return new Promise<number[]>((resolve, reject) => {\n let settled = false\n const finish = (error?: Error, indexes?: number[]) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n worker.thread.off('message', onMessage)\n worker.thread.off('error', onError)\n if (error) reject(error)\n else resolve(indexes ?? [])\n }\n const onMessage = (reply: WorkerReply) => {\n if (reply.id !== id) return\n finish(reply.error ? new Error(reply.error) : undefined, reply.indexes)\n }\n const onError = (error: Error) => finish(error)\n const onAbort = () => {\n \n \n void worker.thread.terminate()\n worker = newWorker()\n finish(new Error('Search interrupted by the user.'))\n }\n const timer = setTimeout(() => {\n void worker.thread.terminate()\n worker = newWorker()\n finish(\n new Error(\n `Regular expression exceeded the ${MATCH_TIMEOUT_MS} ms per-file time limit. Narrow or simplify it.`,\n ),\n )\n }, MATCH_TIMEOUT_MS)\n\n signal.addEventListener('abort', onAbort, { once: true })\n worker.thread.on('message', onMessage)\n worker.thread.on('error', onError)\n worker.thread.postMessage({ id, pattern, lines, maxMatches })\n })\n },\n async close() {\n if (closed) return\n closed = true\n await worker.thread.terminate()\n },\n }\n}\n\ninterface WorkerHandle {\n thread: Worker\n}\n\nfunction newWorker(): WorkerHandle {\n const thread = new Worker(WORKER_SOURCE, { eval: true })\n \n \n thread.on('error', () => undefined)\n return { thread }\n}\n","import { readFile, stat } from 'node:fs/promises'\nimport { resolveInside } from './safepath'\nimport { brief } from './summary'\nimport type { Tool } from './types'\nimport { isSensitivePath } from './sensitive'\n\nconst MAX_LINES = 2000\nconst MAX_CHARS = 200_000\nconst MAX_FILE_BYTES = 5_000_000\n\ninterface ReadInput {\n path: string\n offset?: number\n limit?: number\n}\n\nexport const readTool: Tool = {\n name: 'read',\n description:\n 'Read a text file from the workspace. Returns numbered lines. Use offset and limit to page through large files.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path, relative to the workspace root' },\n offset: { type: 'integer', description: '1-based line to start 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 defaultPermission: 'allow',\n permission(input, ctx) {\n const target = (input as Partial<ReadInput> | null)?.path\n if (isSensitivePath(target)) return 'ask'\n const safe = ctx && target ? resolveInside(ctx.cwd, target) : undefined\n return safe?.ok && isSensitivePath(safe.relative) ? 'ask' : undefined\n },\n summarize(input) {\n return `read(${brief((input as ReadInput).path)})`\n },\n async execute(input, ctx) {\n const { path, offset = 1, limit } = input as ReadInput\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { content: safe.reason, isError: true }\n\n const info = await stat(safe.path).catch(() => null)\n if (!info) return { content: `File not found: ${path}`, isError: true }\n if (info.isDirectory()) {\n return { content: `${path} is a directory, not a file. Use glob to list its contents.`, isError: true }\n }\n if (info.size > MAX_FILE_BYTES) {\n return {\n content: `${path} is ${(info.size / 1_000_000).toFixed(1)} MB; read is limited to ${MAX_FILE_BYTES / 1_000_000} MB per file. Use grep or another targeted tool instead.`,\n isError: true,\n }\n }\n\n const buffer = await readFile(safe.path)\n if (buffer.subarray(0, 4096).includes(0)) {\n return { content: `${path} looks like a binary file and cannot be read as text.`, isError: true }\n }\n\n const lines = buffer.toString('utf8').split('\\n')\n if (lines.at(-1) === '') lines.pop()\n if (lines.length === 0) return { content: `${path} is empty.` }\n\n const start = Math.max(1, offset) - 1\n if (start >= lines.length) {\n return { content: `${path} has ${lines.length} lines, so offset ${offset} is past the end.`, isError: true }\n }\n\n const window = lines.slice(start, start + Math.min(limit ?? MAX_LINES, MAX_LINES))\n const rendered: string[] = []\n let chars = 0\n for (const [index, line] of window.entries()) {\n const numbered = `${start + index + 1}\\t${line}`\n if (chars + numbered.length > MAX_CHARS) break\n chars += numbered.length + 1\n rendered.push(numbered)\n }\n\n const remaining = lines.length - (start + rendered.length)\n if (remaining > 0) {\n rendered.push(\n `... truncated: ${remaining} more lines. Continue with offset ${start + rendered.length + 1}.`,\n )\n }\n return { content: rendered.join('\\n') }\n },\n}\n","import type { AgentEvent, PermissionDecision, PermissionRequest } from '../core/types'\nimport type { JsonSchema, ToolSchema } from '../providers/types'\n\nexport type PermissionMode = 'allow' | 'ask' | 'deny'\n\nexport interface FileCheckpointSink {\n capture(absolutePath: string): Promise<void>\n markChanged(absolutePath: string): void\n}\n\nexport interface ToolContext {\n cwd: string\n signal: AbortSignal\n confirm(question: string): Promise<boolean>\n requestPermission?(request: PermissionRequest): Promise<PermissionDecision>\n checkpoint?: FileCheckpointSink\n onEvent?(event: AgentEvent): void\n}\n\nexport type ToolDisplay =\n | { kind: 'text'; text: string }\n | { kind: 'diff'; path: string; before: string; after: string }\n | { kind: 'list'; title: string; items: string[] }\n\nexport interface ToolResult {\n content: string\n isError?: boolean\n display?: ToolDisplay\n}\n\nexport interface Tool {\n name: string\n description: string\n inputSchema: JsonSchema\n defaultPermission: PermissionMode\n permission?(input: unknown, ctx?: ToolContext): PermissionMode | undefined\n summarize(input: unknown): string\n preview?(input: unknown, ctx: ToolContext): Promise<ToolDisplay | undefined>\n execute(input: unknown, ctx: ToolContext): Promise<ToolResult>\n}\n\nexport function toToolSchema(tool: Tool): ToolSchema {\n return { name: tool.name, description: tool.description, inputSchema: tool.inputSchema }\n}\n","import { lstat, mkdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { dirname } from 'node:path'\nimport { resolveInside } from './safepath'\nimport { brief } from './summary'\nimport type { Tool } from './types'\n\ninterface WriteInput {\n path: string\n content: string\n}\n\nconst MAX_FILE_BYTES = 5_000_000\n\nexport const writeTool: Tool = {\n name: 'write',\n description:\n 'Write a file, replacing it if it already exists. Missing parent directories are created. Prefer edit for changing part of an existing file.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path, relative to the workspace root' },\n content: { type: 'string', description: 'Full file contents', maxLength: MAX_FILE_BYTES },\n },\n required: ['path', 'content'],\n additionalProperties: false,\n },\n defaultPermission: 'ask',\n summarize(input) {\n return `write(${brief((input as WriteInput).path)})`\n },\n async preview(input, ctx) {\n const { path, content } = input as WriteInput\n if (Buffer.byteLength(content, 'utf8') > MAX_FILE_BYTES) {\n return { kind: 'text', text: `Write is limited to ${MAX_FILE_BYTES / 1_000_000} MB.` }\n }\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { kind: 'text', text: safe.reason }\n const beforeInfo = await stat(safe.path).catch(() => null)\n if (beforeInfo && beforeInfo.size > MAX_FILE_BYTES) {\n return { kind: 'text', text: `Cannot preview ${path}: the existing file is too large.` }\n }\n const beforeBuffer = await readFile(safe.path).catch(() => null)\n if (beforeBuffer?.subarray(0, 8192).includes(0)) {\n return { kind: 'text', text: `Cannot preview binary file ${path}` }\n }\n return {\n kind: 'diff',\n path,\n before: beforeBuffer?.toString('utf8') ?? '',\n after: content,\n }\n },\n async execute(input, ctx) {\n const { path, content } = input as WriteInput\n if (Buffer.byteLength(content, 'utf8') > MAX_FILE_BYTES) {\n return {\n content: `Cannot write ${path}: content exceeds the ${MAX_FILE_BYTES / 1_000_000} MB limit.`,\n isError: true,\n }\n }\n const safe = resolveInside(ctx.cwd, path)\n if (!safe.ok) return { content: safe.reason, isError: true }\n\n const linkInfo = await lstat(safe.path).catch(() => null)\n if (linkInfo?.isSymbolicLink()) {\n return { content: `Cannot write ${path}: the path is a symbolic link. Remove the symlink first.`, isError: true }\n }\n\n const beforeInfo = await stat(safe.path).catch(() => null)\n if (beforeInfo && beforeInfo.size > MAX_FILE_BYTES) {\n return {\n content: `Cannot replace ${path}: the existing file exceeds the ${MAX_FILE_BYTES / 1_000_000} MB limit.`,\n isError: true,\n }\n }\n const beforeBuffer = await readFile(safe.path).catch(() => null)\n if (beforeBuffer instanceof Buffer && beforeBuffer.subarray(0, 8192).includes(0)) {\n return { content: `Cannot write ${path}: the existing file is binary, not text.`, isError: true }\n }\n let before = ''\n if (beforeBuffer) before = beforeBuffer.toString('utf8')\n try {\n await mkdir(dirname(safe.path), { recursive: true })\n await ctx.checkpoint?.capture(safe.path)\n await writeFile(safe.path, content, 'utf8')\n ctx.checkpoint?.markChanged(safe.path)\n } catch (error) {\n return { content: `Failed to write ${path}: ${(error as Error).message}`, isError: true }\n }\n\n const lines = content === '' ? 0 : content.replace(/\\n$/, '').split('\\n').length\n return {\n content: `${before === '' ? 'Created' : 'Updated'} ${path} (${lines} ${lines === 1 ? 'line' : 'lines'})`,\n display: { kind: 'diff', path, before, after: content },\n }\n },\n}\n","import type { ToolSchema } from '../providers/types'\nimport { bashTool } from './bash'\nimport { editTool } from './edit'\nimport { globTool } from './glob'\nimport { grepTool } from './grep'\nimport { readTool } from './read'\nimport { toToolSchema } from './types'\nimport type { Tool } from './types'\nimport { writeTool } from './write'\n\nexport interface ToolRegistry {\n get(name: string): Tool | undefined\n list(): Tool[]\n schemas(): ToolSchema[]\n register(tools: Tool[]): void\n unregister(names: Iterable<string>): void\n}\n\nexport function builtinTools(): Tool[] {\n return [readTool, writeTool, editTool, bashTool, globTool, grepTool]\n}\n\nexport function createToolRegistry(tools: Tool[]): ToolRegistry {\n const byName = new Map<string, Tool>()\n\n const register = (incoming: Tool[]) => {\n for (const tool of incoming) {\n if (!byName.has(tool.name)) byName.set(tool.name, tool)\n }\n }\n register(tools)\n\n return {\n get: (name) => byName.get(name),\n list: () => [...byName.values()],\n schemas: () => [...byName.values()].map(toToolSchema),\n register,\n unregister(names) {\n for (const name of names) byName.delete(name)\n },\n }\n}\n","import { chmod, readFile, readdir, unlink, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport { ensureDir, promptsDir } from '../config/paths'\n\nexport interface SavedPrompt {\n slug: string\n name: string\n description: string\n created: string\n body: string\n}\n\nexport async function savePrompt(input: {\n name: string\n description?: string\n body: string\n}): Promise<SavedPrompt> {\n const slug = slugify(input.name)\n if (!slug) throw new Error(`Prompt name has no letters or digits to name a file after: ${input.name}`)\n const prompt: SavedPrompt = {\n slug,\n name: input.name,\n description: input.description ?? '',\n created: new Date().toISOString(),\n body: input.body.trim(),\n }\n await ensureDir(promptsDir)\n const file = path.join(promptsDir, `${slug}.md`)\n await writeFile(file, serialize(prompt), {\n encoding: 'utf8',\n mode: 0o600,\n })\n await chmod(file, 0o600)\n return prompt\n}\n\nexport async function getPrompt(slug: string): Promise<SavedPrompt | null> {\n assertSlug(slug)\n try {\n return parse(slug, await readFile(path.join(promptsDir, `${slug}.md`), 'utf8'))\n } catch (error) {\n if (isMissing(error)) return null\n throw error\n }\n}\n\nexport async function listPrompts(): Promise<SavedPrompt[]> {\n let names: string[]\n try {\n names = await readdir(promptsDir)\n } catch (error) {\n if (!isMissing(error)) throw error\n return []\n }\n const prompts = await Promise.all(\n names\n .filter((name) => name.endsWith('.md'))\n .map(async (name) =>\n parse(name.slice(0, -3), await readFile(path.join(promptsDir, name), 'utf8')),\n ),\n )\n return prompts.sort((a, b) => a.name.localeCompare(b.name))\n}\n\nexport async function deletePrompt(slug: string): Promise<boolean> {\n assertSlug(slug)\n try {\n await unlink(path.join(promptsDir, `${slug}.md`))\n return true\n } catch (error) {\n if (isMissing(error)) return false\n throw error\n }\n}\n\nexport async function promptExists(slug: string): Promise<boolean> {\n assertSlug(slug)\n try {\n await readFile(path.join(promptsDir, `${slug}.md`), 'utf8')\n return true\n } catch (error) {\n if (isMissing(error)) return false\n throw error\n }\n}\n\nexport async function searchPrompts(query: string): Promise<SavedPrompt[]> {\n const needle = query.trim().toLowerCase()\n const prompts = await listPrompts()\n if (!needle) return prompts\n return prompts.filter(\n (prompt) =>\n prompt.name.toLowerCase().includes(needle) ||\n prompt.description.toLowerCase().includes(needle),\n )\n}\n\nfunction isMissing(error: unknown): boolean {\n return (error as NodeJS.ErrnoException).code === 'ENOENT'\n}\n\nfunction slugify(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\nfunction assertSlug(slug: string): void {\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug)) {\n throw new Error(`Invalid prompt id: ${slug}`)\n }\n}\n\nfunction serialize(prompt: SavedPrompt): string {\n const field = (key: string, value: string) => `${key}: ${value.replace(/\\s+/g, ' ').trim()}`\n return [\n '---',\n field('name', prompt.name),\n field('description', prompt.description),\n field('created', prompt.created),\n '---',\n '',\n prompt.body,\n '',\n ].join('\\n')\n}\n\nfunction parse(slug: string, text: string): SavedPrompt {\n const lines = text.split('\\n')\n const meta: Record<string, string> = {}\n let bodyStart = 0\n if (lines[0]?.trim() === '---') {\n let i = 1\n for (; i < lines.length && lines[i].trim() !== '---'; i++) {\n const colon = lines[i].indexOf(':')\n if (colon <= 0) continue\n const key = lines[i].slice(0, colon).trim()\n if (key === 'name' || key === 'description' || key === 'created') {\n meta[key] = lines[i].slice(colon + 1).trim()\n }\n }\n bodyStart = Math.min(i + 1, lines.length)\n }\n return {\n slug,\n name: meta.name || slug,\n description: meta.description ?? '',\n created: meta.created ?? '',\n body: lines.slice(bodyStart).join('\\n').trim(),\n }\n}\n","import { open, readFile, readdir, stat } from 'node:fs/promises'\nimport path from 'node:path'\n\nexport interface SkillMeta {\n name: string\n description: string\n dir: string\n file: string\n}\n\nexport interface Skill extends SkillMeta {\n body: string\n}\n\nconst SKILL_FILE = 'SKILL.md'\nconst FRONTMATTER_BYTES = 8192\nconst MAX_SKILL_BYTES = 5_000_000\nconst MAX_SKILLS_PER_ROOT = 500\n\nexport async function discoverSkills(dirs: string[]): Promise<SkillMeta[]> {\n const byName = new Map<string, SkillMeta>()\n for (const root of dirs) {\n const entries = await readdir(root).catch(() => [])\n const found = await Promise.all(\n entries.slice(0, MAX_SKILLS_PER_ROOT).map((entry) => readMeta(path.join(root, entry))),\n )\n for (const meta of found) {\n if (meta && !byName.has(meta.name)) byName.set(meta.name, meta)\n }\n }\n return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name))\n}\n\nexport async function loadSkill(meta: SkillMeta): Promise<Skill> {\n const info = await stat(meta.file)\n if (info.size > MAX_SKILL_BYTES) {\n throw new Error(`Skill file exceeds the ${MAX_SKILL_BYTES / 1_000_000} MB limit: ${meta.file}`)\n }\n const { body } = parseFrontmatter(await readFile(meta.file, 'utf8'))\n return { ...meta, body }\n}\n\nexport function formatSkillCatalogue(skills: SkillMeta[]): string {\n if (skills.length === 0) return ''\n const lines = skills.map((skill) => `- ${skill.name}${skill.description ? ` — ${skill.description}` : ''}`)\n return ['Skills available (use the skill tool to read one in full before doing that kind of work):', ...lines].join(\n '\\n',\n )\n}\n\nasync function readMeta(dir: string): Promise<SkillMeta | null> {\n const file = path.join(dir, SKILL_FILE)\n const head = await readFrontmatterBytes(file)\n if (head === null) return null\n const { fields } = parseFrontmatter(head)\n return { name: fields.name || path.basename(dir), description: fields.description ?? '', dir, file }\n}\n\nasync function readFrontmatterBytes(file: string): Promise<string | null> {\n const handle = await open(file, 'r').catch(() => null)\n if (!handle) return null\n try {\n const buffer = Buffer.alloc(FRONTMATTER_BYTES)\n const { bytesRead } = await handle.read(buffer, 0, FRONTMATTER_BYTES, 0)\n return buffer.subarray(0, bytesRead).toString('utf8')\n } catch {\n return null\n } finally {\n await handle.close().catch(() => {})\n }\n}\n\nfunction parseFrontmatter(text: string): { fields: Record<string, string>; body: string } {\n const lines = text.split('\\n')\n const fields: Record<string, string> = {}\n let bodyStart = 0\n if (lines[0]?.trim() === '---') {\n let i = 1\n for (; i < lines.length && lines[i].trim() !== '---'; i++) {\n const colon = lines[i].indexOf(':')\n if (colon <= 0) continue\n const key = lines[i].slice(0, colon).trim()\n if (key === 'name' || key === 'description') fields[key] = lines[i].slice(colon + 1).trim()\n }\n bodyStart = Math.min(i + 1, lines.length)\n }\n return { fields, body: lines.slice(bodyStart).join('\\n').trim() }\n}\n","import { randomUUID } from 'node:crypto'\nimport { execFileSync } from 'node:child_process'\nimport {\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n realpathSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { chmod, mkdir } from 'node:fs/promises'\nimport path from 'node:path'\nimport { ensureDir, skillsDir } from '../config/paths'\n\nconst TMP_DIR = path.join(skillsDir, '.tmp')\nconst MAX_SKILL_BYTES = 5_000_000\n\nexport interface SkillInstallResult {\n name: string\n dir: string\n source: string\n}\n\nexport async function installSkill(source: string): Promise<SkillInstallResult> {\n await ensureDir(skillsDir)\n\n if (isGitHubUrl(source)) {\n return installFromGitHub(source)\n }\n\n if (isNpmPackage(source)) {\n return installFromNpm(source)\n }\n\n return installFromLocal(source)\n}\n\nfunction isGitHubUrl(input: string): boolean {\n try {\n const url = new URL(input)\n return (\n url.protocol === 'https:' &&\n (url.hostname === 'github.com' || url.hostname === 'www.github.com')\n )\n } catch {\n return false\n }\n}\n\nfunction isNpmPackage(input: string): boolean {\n return npmSkillName(input) !== null\n}\n\nasync function installFromGitHub(url: string): Promise<SkillInstallResult> {\n const { owner, repo, subdir, branch } = parseGitHubUrl(url)\n const name = safeSkillName(subdir ? path.posix.basename(subdir) : repo)\n const skillDir = safeChildPath(skillsDir, name)\n const tmpDir = safeChildPath(TMP_DIR, `${name}-${randomUUID()}`)\n\n try {\n mkdirSync(tmpDir, { recursive: true })\n\n const cloneUrl = `https://github.com/${owner}/${repo}.git`\n const gitArgs = ['clone', '--depth', '1']\n if (branch) gitArgs.push('--branch', branch)\n gitArgs.push(cloneUrl, tmpDir)\n\n execFileSync('git', gitArgs, { stdio: 'ignore' })\n\n const skillFile = subdir\n ? safeChildPath(tmpDir, ...subdir.split('/'), 'SKILL.md')\n : safeChildPath(tmpDir, 'SKILL.md')\n const body = readSkillFile(skillFile, tmpDir, subdir || repo)\n removeExistingSkillDir(skillDir)\n await writeSkillFile(skillDir, body)\n\n return { name, dir: skillDir, source: url }\n } finally {\n rmSync(tmpDir, { recursive: true, force: true })\n }\n}\n\nasync function installFromNpm(packageName: string): Promise<SkillInstallResult> {\n const parsedName = npmSkillName(packageName)\n if (!parsedName) throw new Error(`Invalid npm package name: ${packageName}`)\n const name = safeSkillName(parsedName)\n const skillDir = safeChildPath(skillsDir, name)\n const tmpDir = safeChildPath(TMP_DIR, `${name}-${randomUUID()}`)\n\n try {\n mkdirSync(tmpDir, { recursive: true })\n\n \n execFileSync('npm', ['pack', packageName, '--prefix', tmpDir], {\n stdio: 'ignore',\n })\n\n const files = readdirSync(tmpDir)\n const tarball = files.find((f) => f.endsWith('.tgz'))\n if (!tarball) {\n throw new Error(`Could not download npm package \"${packageName}\"`)\n }\n\n const tarballPath = path.join(tmpDir, tarball)\n validateTarball(tarballPath)\n const extractDir = path.join(tmpDir, 'extracted')\n mkdirSync(extractDir, { recursive: true })\n\n try {\n execFileSync('tar', ['-xzf', tarballPath, '-C', extractDir], { stdio: 'ignore' })\n } catch {\n \n const packageDir = path.join(tmpDir, 'node_modules', packageName)\n if (existsSync(packageDir)) {\n const skillFile = path.join(packageDir, 'SKILL.md')\n if (existsSync(skillFile)) {\n const body = readSkillFile(skillFile, packageDir, packageName)\n await writeSkillFile(skillDir, body)\n return { name, dir: skillDir, source: packageName }\n }\n }\n throw new Error('Could not extract the npm package. Is `tar` available?')\n }\n\n \n const extractedFiles = readdirSync(extractDir)\n const packageRoot = extractedFiles.find((f) => f === 'package')\n if (!packageRoot) throw new Error('Could not find package root in extracted files')\n\n const skillFile = path.join(extractDir, 'package', 'SKILL.md')\n if (!existsSync(skillFile)) {\n throw new Error(`No SKILL.md found in npm package \"${packageName}\"`)\n }\n\n const body = readSkillFile(skillFile, extractDir, packageName)\n await writeSkillFile(skillDir, body)\n\n return { name, dir: skillDir, source: packageName }\n } finally {\n rmSync(tmpDir, { recursive: true, force: true })\n }\n}\n\nfunction npmSkillName(input: string): string | null {\n if (input.includes('\\\\') || input.startsWith('.')) return null\n const scoped = input.match(/^@[\\w.-]+\\/([\\w.-]+)(?:@[\\w.*+-]+)?$/)\n if (scoped) return scoped[1] ?? null\n const unscoped = input.match(/^([\\w.-]+)(?:@[\\w.*+-]+)?$/)\n return unscoped?.[1] ?? null\n}\n\nfunction validateTarball(file: string): void {\n const info = lstatSync(file, { throwIfNoEntry: false })\n if (!info?.isFile() || info.size > 20_000_000) {\n throw new Error('The npm skill archive is missing or exceeds the 20 MB safety limit.')\n }\n const listing = execFileSync('tar', ['-tzf', file], {\n encoding: 'utf8',\n maxBuffer: 2_000_000,\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n const entries = listing.split(/\\r?\\n/).filter(Boolean)\n if (entries.length === 0 || entries.length > 10_000) {\n throw new Error('The npm skill archive has an invalid number of entries.')\n }\n for (const entry of entries) {\n const normalized = entry.replace(/^\\.\\//, '')\n if (\n normalized.includes('\\\\') ||\n path.posix.isAbsolute(normalized) ||\n normalized.split('/').some((segment) => segment === '..')\n ) {\n throw new Error(`Unsafe path in npm skill archive: ${entry}`)\n }\n }\n}\n\nasync function installFromLocal(srcPath: string): Promise<SkillInstallResult> {\n const resolved = path.resolve(srcPath)\n\n let skillDir: string\n let skillFile: string\n\n const directSkill = path.join(resolved, 'SKILL.md')\n if (existsSync(directSkill)) {\n skillDir = resolved\n skillFile = directSkill\n } else if (resolved.endsWith('SKILL.md') && existsSync(resolved)) {\n skillDir = path.dirname(resolved)\n skillFile = resolved\n } else {\n throw new Error(`No SKILL.md found at \"${srcPath}\"`)\n }\n\n const name = path.basename(skillDir)\n const destDir = safeChildPath(skillsDir, safeSkillName(name))\n const body = readSkillFile(skillFile, skillDir, srcPath)\n\n await writeSkillFile(destDir, body)\n\n return { name, dir: destDir, source: resolved }\n}\n\nasync function writeSkillFile(dir: string, body: string): Promise<void> {\n assertInside(skillsDir, dir)\n const existingDir = lstatSync(dir, { throwIfNoEntry: false })\n if (existingDir?.isSymbolicLink()) {\n throw new Error(`Refusing to replace symlinked skill directory: ${dir}`)\n }\n await mkdir(dir, { recursive: true, mode: 0o700 })\n const file = path.join(dir, 'SKILL.md')\n const existingFile = lstatSync(file, { throwIfNoEntry: false })\n if (existingFile?.isSymbolicLink()) {\n throw new Error(`Refusing to replace symlinked skill file: ${file}`)\n }\n writeFileSync(file, body, { encoding: 'utf8', mode: 0o600 })\n await chmod(file, 0o600)\n}\n\nexport function parseGitHubUrl(url: string): {\n owner: string\n repo: string\n subdir?: string\n branch?: string\n} {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n throw new Error(`Cannot parse GitHub URL: ${url}`)\n }\n if (\n parsed.protocol !== 'https:' ||\n (parsed.hostname !== 'github.com' && parsed.hostname !== 'www.github.com') ||\n parsed.username ||\n parsed.password\n ) {\n throw new Error('GitHub skills must use an https://github.com URL without credentials.')\n }\n\n let segments: string[]\n try {\n segments = parsed.pathname\n .split('/')\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment))\n } catch {\n throw new Error(`Cannot parse GitHub URL: ${url}`)\n }\n if (segments.length < 2) throw new Error(`Cannot parse GitHub URL: ${url}`)\n\n const owner = safeGitHubSegment(segments[0] as string, 'owner')\n const repo = safeSkillName((segments[1] as string).replace(/\\.git$/i, ''))\n if (segments.length === 2) return { owner, repo }\n if (segments[2] !== 'tree' || segments.length < 4) {\n throw new Error(`Unsupported GitHub skill URL: ${url}`)\n }\n\n const branch = safeGitHubSegment(segments[3] as string, 'branch')\n const subdirSegments = segments.slice(4).map((segment) => safeGitHubSegment(segment, 'path'))\n return {\n owner,\n repo,\n branch,\n subdir: subdirSegments.length > 0 ? subdirSegments.join('/') : undefined,\n }\n}\n\nfunction safeGitHubSegment(value: string, kind: string): string {\n if (\n value === '' ||\n value === '.' ||\n value === '..' ||\n value.length > 255 ||\n /[\\0-\\x1f\\x7f/\\\\:*?\"<>|#%]/.test(value)\n ) {\n throw new Error(`Unsafe GitHub ${kind}: ${value || '(empty)'}`)\n }\n return value\n}\n\nfunction safeSkillName(value: string): string {\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(value) || value === '.' || value === '..') {\n throw new Error(`Unsafe skill name: ${value || '(empty)'}`)\n }\n return value\n}\n\nfunction safeChildPath(root: string, ...segments: string[]): string {\n const target = path.resolve(root, ...segments)\n assertInside(root, target)\n return target\n}\n\nfunction assertInside(root: string, target: string): void {\n const relative = path.relative(path.resolve(root), path.resolve(target))\n if (\n relative === '' ||\n (!path.isAbsolute(relative) && relative !== '..' && !relative.startsWith(`..${path.sep}`))\n ) {\n return\n }\n throw new Error(`Path escapes the skills directory: ${target}`)\n}\n\nfunction readSkillFile(file: string, allowedRoot: string, source: string): string {\n const info = lstatSync(file, { throwIfNoEntry: false })\n if (!info?.isFile() || info.isSymbolicLink()) {\n throw new Error(`No regular SKILL.md found in \"${source}\"`)\n }\n if (info.size > MAX_SKILL_BYTES) {\n throw new Error(`SKILL.md in \"${source}\" exceeds the ${MAX_SKILL_BYTES / 1_000_000} MB limit`)\n }\n const root = realpathSync(allowedRoot)\n const resolved = realpathSync(file)\n assertInside(root, resolved)\n return readFileSync(resolved, 'utf8')\n}\n\nfunction removeExistingSkillDir(dir: string): void {\n const info = lstatSync(dir, { throwIfNoEntry: false })\n if (!info) return\n if (info.isSymbolicLink()) {\n throw new Error(`Refusing to remove symlinked skill directory: ${dir}`)\n }\n rmSync(dir, { recursive: true, force: true })\n}\n","import type { SkillMeta } from '../skills/library'\nimport { loadSkill } from '../skills/library'\nimport { brief } from './summary'\nimport type { Tool } from './types'\n\nconst MAX_BODY_CHARS = 64_000\n\ninterface SkillInput {\n name: string\n}\n\nexport function createSkillTool(skills: SkillMeta[]): Tool {\n const byName = new Map(skills.map((skill) => [skill.name, skill]))\n\n return {\n name: 'skill',\n description:\n 'Load the full instructions for one of the skills listed in the system prompt, then follow them. Call this before starting a task that a skill covers.',\n inputSchema: {\n type: 'object',\n properties: { name: { type: 'string', description: 'Name of the skill to load' } },\n required: ['name'],\n additionalProperties: false,\n },\n defaultPermission: 'allow',\n summarize(input) {\n return `skill(${brief((input as SkillInput).name)})`\n },\n async execute(input) {\n const name = String((input as SkillInput).name ?? '').trim()\n const meta = byName.get(name)\n if (!meta) return { content: unknownSkill(name, [...byName.keys()]), isError: true }\n\n let body: string\n try {\n body = (await loadSkill(meta)).body\n } catch (error) {\n return { content: `Could not read skill ${name} from ${meta.file}: ${error}`, isError: true }\n }\n\n const content =\n body.length > MAX_BODY_CHARS\n ? `${body.slice(0, MAX_BODY_CHARS)}\\n\\n... truncated: skill ${name} is ${body.length} characters, only the first ${MAX_BODY_CHARS} are shown. Read ${meta.file} directly for the rest.`\n : body\n return { content, display: { kind: 'text', text: `skill ${name}` } }\n },\n }\n}\n\nfunction unknownSkill(name: string, available: string[]): string {\n if (available.length === 0) return `No skills are installed, so \"${name}\" cannot be loaded.`\n return `No skill named \"${name}\". Available skills: ${available.join(', ')}.`\n}\n","import { randomBytes } from 'node:crypto'\nimport { TASK_TOOL_NAME } from '../core/subagent'\nimport type { SubagentRunner } from '../core/subagent'\nimport { brief } from './summary'\nimport type { Tool, ToolResult } from './types'\n\nconst MAX_PROGRESS_LINES = 10\n\nexport const MAX_SUBAGENTS_PER_TURN = 3\n\nconst DESCRIPTION = [\n 'Hand one self-contained sub-task to a subagent that works in its own fresh context and reports back a single summary.',\n 'Use it when the task is genuinely independent and its intermediate output would be long or noisy: a wide search across the repository, reading many files to answer one question, tracing where something is used.',\n 'Do not use it for work that is a couple of tool calls, and do not use it when you already have what you need — call the tools yourself instead.',\n 'The subagent shares this filesystem and working directory but has NO memory of this conversation and cannot ask you anything, so \"prompt\" must stand alone: the goal, the constraints, and exactly what to report back.',\n 'It runs to completion and you receive only its final message.',\n].join(' ')\n\nexport function createTaskTool(runner: SubagentRunner, maxSubagents = MAX_SUBAGENTS_PER_TURN): Tool {\n const spawnsPerTurn = new WeakMap<AbortSignal, number>()\n\n return {\n name: TASK_TOOL_NAME,\n description: DESCRIPTION,\n inputSchema: {\n type: 'object',\n properties: {\n description: { type: 'string', description: '3-6 word label for this task' },\n prompt: { type: 'string', description: 'Self-contained instruction for the subagent' },\n },\n required: ['description', 'prompt'],\n additionalProperties: false,\n },\n defaultPermission: 'ask',\n summarize(input) {\n return `task(${brief(field(input, 'description'))})`\n },\n async execute(input, ctx): Promise<ToolResult> {\n const instruction = field(input, 'prompt').trim()\n if (instruction === '') {\n return { content: 'task needs a prompt: the full instruction for the subagent.', isError: true }\n }\n\n const spawned = (spawnsPerTurn.get(ctx.signal) ?? 0) + 1\n spawnsPerTurn.set(ctx.signal, spawned)\n if (spawned > maxSubagents) {\n return {\n content: `Already delegated ${maxSubagents} subagents while answering this message, which is the limit. Do the remaining work yourself with the tools you have.`,\n isError: true,\n }\n }\n\n const progress: string[] = []\n const subagentId = `sa${randomBytes(4).toString('hex')}`\n const description = field(input, 'description') || 'subagent'\n ctx.onEvent?.({ type: 'subagent_start', id: subagentId, description })\n try {\n const content = await runner.run({\n prompt: instruction,\n description,\n signal: ctx.signal,\n onProgress: (line) => progress.push(line),\n onEvent: (event) => ctx.onEvent?.({ type: 'subagent_event', id: subagentId, event }),\n confirm: ctx.confirm,\n requestPermission: ctx.requestPermission,\n })\n ctx.onEvent?.({ type: 'subagent_end', id: subagentId, result: content })\n if (progress.length === 0) return { content }\n return {\n content,\n display: {\n kind: 'list',\n title: `task ${brief(field(input, 'description'), 40)}`,\n items: progress.slice(-MAX_PROGRESS_LINES),\n },\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error)\n ctx.onEvent?.({ type: 'subagent_end', id: subagentId, result: `The subagent failed: ${reason}` })\n return { content: `The subagent failed: ${reason}`, isError: true }\n }\n },\n }\n}\n\nfunction field(input: unknown, key: 'description' | 'prompt'): string {\n const value = (input as Record<string, unknown> | null | undefined)?.[key]\n return typeof value === 'string' ? value : ''\n}\n","import { KITCODE_COMMIT, KITCODE_REPOSITORY, KITCODE_VERSION } from '../version'\n\nconst UPDATE_URL = `https://api.github.com/repos/${KITCODE_REPOSITORY}/commits/main`\nconst TIMEOUT_MS = 4_000\nconst MAX_RESPONSE_BYTES = 128_000\n\nexport type UpdateCheck =\n | { status: 'current'; current: string; latest: string }\n | { status: 'available'; current: string; latest: string; url: string }\n | { status: 'unknown'; reason: string }\n\nexport async function checkForUpdates(\n fetcher: typeof fetch = fetch,\n currentCommit = KITCODE_COMMIT,\n): Promise<UpdateCheck> {\n if (currentCommit === 'development') {\n return { status: 'unknown', reason: 'development build has no embedded commit' }\n }\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS)\n try {\n const response = await fetcher(UPDATE_URL, {\n headers: {\n accept: 'application/vnd.github+json',\n 'user-agent': `KitCode/${KITCODE_VERSION}`,\n 'x-github-api-version': '2022-11-28',\n },\n redirect: 'error',\n signal: controller.signal,\n })\n if (!response.ok) {\n await response.body?.cancel().catch(() => undefined)\n return { status: 'unknown', reason: `GitHub returned ${response.status}` }\n }\n const payload = (await readJsonBounded(response)) as { sha?: unknown; html_url?: unknown } | null\n if (!payload) return { status: 'unknown', reason: 'GitHub response was too large or invalid' }\n if (typeof payload.sha !== 'string' || !/^[0-9a-f]{40}$/i.test(payload.sha)) {\n return { status: 'unknown', reason: 'GitHub response did not contain a commit' }\n }\n const current = currentCommit.toLowerCase()\n const latest = payload.sha.toLowerCase()\n if (latest.startsWith(current) || current.startsWith(latest)) {\n return { status: 'current', current, latest }\n }\n const url =\n typeof payload.html_url === 'string' && payload.html_url.startsWith('https://github.com/')\n ? payload.html_url\n : `https://github.com/${KITCODE_REPOSITORY}/commits/main`\n return { status: 'available', current, latest, url }\n } catch (error) {\n return {\n status: 'unknown',\n reason:\n error instanceof Error && error.name === 'AbortError'\n ? 'GitHub check timed out'\n : 'GitHub check failed',\n }\n } finally {\n clearTimeout(timer)\n }\n}\n\nasync function readJsonBounded(response: Response): Promise<unknown | null> {\n const declared = Number(response.headers.get('content-length'))\n if (Number.isFinite(declared) && declared > MAX_RESPONSE_BYTES) {\n await response.body?.cancel().catch(() => undefined)\n return null\n }\n if (!response.body) return null\n const reader = response.body.getReader()\n const chunks: Uint8Array[] = []\n let bytes = 0\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n bytes += value.byteLength\n if (bytes > MAX_RESPONSE_BYTES) {\n await reader.cancel()\n return null\n }\n chunks.push(value)\n }\n } finally {\n reader.releaseLock()\n }\n const combined = new Uint8Array(bytes)\n let offset = 0\n for (const chunk of chunks) {\n combined.set(chunk, offset)\n offset += chunk.byteLength\n }\n try {\n return JSON.parse(new TextDecoder().decode(combined))\n } catch {\n return null\n }\n}\n","import { authPath, projectConfigPath } from '../config/paths'\nimport {\n configLocation,\n initProjectConfig,\n loadProjectConfig,\n loadRuntimeConfig,\n saveConfig,\n} from '../config/store'\nimport { trustWorkspace } from '../config/trust'\n\nexport async function showConfig(options: { local?: boolean } = {}): Promise<void> {\n const cwd = process.cwd()\n\n if (options.local) {\n const current = (await loadRuntimeConfig(cwd)).config\n await initProjectConfig(cwd)\n await trustWorkspace(cwd)\n await loadProjectConfig(cwd)\n await saveConfig(current)\n console.log(`moved config to ${projectConfigPath(cwd)}`)\n }\n\n if (!options.local) await loadRuntimeConfig(cwd)\n\n const location = await configLocation()\n console.log(`config: ${location.path} (${location.scope})`)\n console.log(`keys: ${authPath} (never written into a project)`)\n}\n","import { emitKeypressEvents } from 'node:readline'\n\nconst MAX_KEY_CHARS = 16_384\n\nexport async function readApiKey(options: {\n keyEnv?: string\n keyStdin?: boolean\n}): Promise<string> {\n if (options.keyEnv && options.keyStdin) {\n throw new Error('Use either --key-env or --key-stdin, not both.')\n }\n\n if (options.keyEnv) {\n const key = process.env[options.keyEnv]?.trim()\n if (!key) throw new Error(`Environment variable ${options.keyEnv} is empty or unset.`)\n return validateKey(key)\n }\n\n if (options.keyStdin) {\n const key = (await readStdin()).trim()\n if (!key) throw new Error('No API key was received on stdin.')\n return validateKey(key)\n }\n\n return promptSecret('API key: ')\n}\n\nasync function readStdin(): Promise<string> {\n process.stdin.setEncoding('utf8')\n let value = ''\n for await (const chunk of process.stdin) {\n value += chunk\n if (value.length > MAX_KEY_CHARS) throw new Error('API key input is unexpectedly large.')\n }\n return value\n}\n\nfunction promptSecret(prompt: string): Promise<string> {\n const input = process.stdin\n const output = process.stderr\n if (!input.isTTY || typeof input.setRawMode !== 'function') {\n throw new Error('No interactive terminal. Pass the key through --key-env or --key-stdin.')\n }\n\n emitKeypressEvents(input)\n const wasRaw = input.isRaw\n const wasPaused = input.isPaused()\n output.write(prompt)\n input.setRawMode(true)\n input.resume()\n\n return new Promise<string>((resolve, reject) => {\n let value = ''\n const finish = (error?: Error) => {\n input.off('keypress', onKeypress)\n input.setRawMode(wasRaw)\n if (wasPaused) input.pause()\n output.write('\\n')\n if (error) reject(error)\n else if (value.trim() === '') reject(new Error('API key cannot be empty.'))\n else {\n try {\n resolve(validateKey(value.trim()))\n } catch (validationError) {\n reject(validationError as Error)\n }\n }\n }\n const onKeypress = (\n character: string,\n key: { name?: string; ctrl?: boolean; meta?: boolean },\n ) => {\n if (key.ctrl && key.name === 'c') return finish(new Error('Cancelled.'))\n if (key.name === 'return' || key.name === 'enter') return finish()\n if (key.name === 'backspace' || key.name === 'delete') {\n value = value.slice(0, -1)\n return\n }\n if (character && !key.ctrl && !key.meta && value.length < MAX_KEY_CHARS) value += character\n }\n input.on('keypress', onKeypress)\n })\n}\n\nfunction validateKey(value: string): string {\n if (value.length > MAX_KEY_CHARS) throw new Error('API key input is unexpectedly large.')\n if (/\\r|\\n/.test(value)) throw new Error('API key must be a single line.')\n return value\n}\n","import { render } from 'ink'\nimport { App } from '../ui/App'\nimport type { AgentMode } from '../tools/permissions'\nimport { boot } from './runtime'\n\nfunction clearTerminal(): void {\n if (process.stdout.isTTY) process.stdout.write('\\x1b[2J\\x1b[3J\\x1b[H')\n}\n\nexport async function startTui(options: {\n continueSession?: boolean\n resumeId?: string\n cwd?: string\n modelRef?: string\n mode?: AgentMode\n}): Promise<void> {\n const { runtime, history, warnings, shutdown } = await boot({\n cwd: options.cwd ?? process.cwd(),\n continueSession: options.continueSession,\n resumeId: options.resumeId,\n modelRef: options.modelRef,\n mode: options.mode,\n })\n\n clearTerminal()\n\n const instance = render(<App runtime={runtime} initialHistory={history} warnings={warnings} />, {\n \n \n \n incrementalRendering: true,\n maxFps: 30,\n })\n try {\n await instance.waitUntilExit()\n } finally {\n await shutdown()\n }\n}\n","import { Box, Text, useApp, useInput, useWindowSize } from 'ink'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { AgentEvent, AgentHooks, PermissionDecision, PermissionRequest } from '../core/types'\nimport { attachmentLabel, looksLikeAttachmentPath } from '../core/attachments'\nimport { parseMcpAddArgs } from '../mcp/add'\nimport type { McpAddError } from '../mcp/add'\nimport type { McpServerState } from '../mcp/client'\nimport type { ContentBlock, Effort, Message } from '../providers/types'\nimport { COMMANDS, closestCommand } from './commands'\nimport TextInput from 'ink-text-input'\nimport { useTheme } from './theme'\nimport { Confirm } from './components/Confirm'\nimport { LanguagePicker } from './components/LanguagePicker'\nimport { Onboarding } from './components/Onboarding'\nimport { PermissionPrompt } from './components/PermissionPrompt'\nimport { Picker } from './components/Picker'\nimport { PromptInput } from './components/PromptInput'\nimport { StatusBar } from './components/StatusBar'\nimport { TerminalViewport } from './components/TerminalViewport'\nimport { Transcript } from './components/Transcript'\nimport { appendInputHistory } from './history'\nimport { LANGS, StringsContext, stringsFor } from './i18n'\nimport type { Lang, Strings } from './i18n'\nimport { useTerminalInput } from './input'\nimport type { Runtime } from './runtime'\nimport { PRESETS, ThemeContext, makeTheme, resolveAccent } from './theme'\nimport { formatDuration } from './time'\nimport { applyEvents, emptyTranscript, fromHistory, pushNotice, pushUser } from './transcript'\nimport type { PickerItem } from './types'\n\nconst EFFORTS: Effort[] = ['low', 'medium', 'high', 'xhigh', 'max']\nconst STREAM_FRAME_MS = 50\nconst MAX_ATTACHMENTS = 8\n\ntype QueuedItem =\n | { kind: 'command'; line: string }\n | { kind: 'message'; text: string; content: ContentBlock[] }\n\ntype Overlay =\n | { kind: 'none' }\n | { kind: 'permission'; request: PermissionRequest; resolve: (d: PermissionDecision) => void }\n | { kind: 'picker'; title: string; items: PickerItem[]; select: (key: string) => void }\n | {\n kind: 'confirm'\n title: string\n body?: string\n danger?: boolean\n resolve: (yes: boolean) => void\n }\n | {\n kind: 'textinput'\n title: string\n mask?: boolean\n resolve: (value: string | null) => void\n cancel?: () => void\n }\n\nexport function App({\n runtime,\n initialHistory,\n warnings = [],\n}: {\n runtime: Runtime\n initialHistory: Message[]\n warnings?: string[]\n}) {\n const { exit } = useApp()\n const { rows } = useWindowSize()\n const [transcript, setTranscript] = useState(() =>\n warnings.reduce((state, text) => pushNotice(state, 'warn', text), fromHistory(initialHistory)),\n )\n const [transcriptRevision, setTranscriptRevision] = useState(0)\n const [input, setInput] = useState('')\n const [promptHistory, setPromptHistory] = useState(() =>\n inputHistoryFromMessages(initialHistory),\n )\n const [busy, setBusy] = useState(false)\n const busyRef = useRef(false)\n const [pendingCount, setPendingCount] = useState(0)\n const queueRef = useRef<QueuedItem[]>([])\n const slashQueueRef = useRef<Promise<void>>(Promise.resolve())\n const slashPendingRef = useRef(0)\n const drainQueueRef = useRef<() => void>(() => undefined)\n const [attachments, setAttachments] = useState<ContentBlock[]>([])\n const attachmentsRef = useRef<ContentBlock[]>([])\n const automaticAttachmentTask = useRef<Promise<boolean> | null>(null)\n const clipboardPasteTask = useRef<Promise<void> | null>(null)\n const [overlay, setOverlay] = useState<Overlay>({ kind: 'none' })\n const [accent, setAccent] = useState(runtime.getAccent())\n const [lang, setLang] = useState<Lang | undefined>(runtime.getLang())\n const [setup, setSetup] = useState(runtime.needsSetup())\n const [, forceRender] = useState(0)\n const history = useRef<Message[]>(initialHistory)\n const abort = useRef<AbortController | null>(null)\n const sessionStart = useRef(Date.now())\n const turns = useRef(0)\n const [turnStart, setTurnStart] = useState<number | null>(null)\n const [, tick] = useState(0)\n const [context, setContext] = useState(() => runtime.modelContext())\n const transcriptEvents = useRef<AgentEvent[]>([])\n const transcriptTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const replaceAttachments = useCallback((next: ContentBlock[]) => {\n attachmentsRef.current = next\n setAttachments(next)\n }, [])\n\n const appendAttachment = useCallback((block: ContentBlock): boolean => {\n if (attachmentsRef.current.length >= MAX_ATTACHMENTS) return false\n const next = [...attachmentsRef.current, block]\n attachmentsRef.current = next\n setAttachments(next)\n return true\n }, [])\n\n const flushTranscriptEvents = useCallback(() => {\n if (transcriptTimer.current !== null) {\n clearTimeout(transcriptTimer.current)\n transcriptTimer.current = null\n }\n const events = transcriptEvents.current\n if (events.length === 0) return\n transcriptEvents.current = []\n setTranscript((state) => applyEvents(state, events))\n }, [])\n\n const queueTranscriptEvent = useCallback(\n (event: AgentEvent) => {\n transcriptEvents.current.push(event)\n if (event.type !== 'text_delta' && event.type !== 'thinking_delta') {\n flushTranscriptEvents()\n return\n }\n transcriptTimer.current ??= setTimeout(flushTranscriptEvents, STREAM_FRAME_MS)\n },\n [flushTranscriptEvents],\n )\n\n useEffect(\n () => () => {\n if (transcriptTimer.current !== null) clearTimeout(transcriptTimer.current)\n transcriptEvents.current = []\n },\n [],\n )\n\n useEffect(\n () => runtime.subscribeContext(() => setContext(runtime.modelContext())),\n [runtime],\n )\n\n useEffect(() => {\n if (turnStart === null) return\n const timer = setInterval(() => tick((n) => n + 1), 1000)\n return () => clearInterval(timer)\n }, [turnStart])\n\n const theme = useMemo(() => makeTheme(accent), [accent])\n const strings = useMemo(() => stringsFor(lang), [lang])\n\n const notice = useCallback(\n (level: 'info' | 'warn' | 'error', text: string) => {\n flushTranscriptEvents()\n setTranscript((state) => pushNotice(state, level, text))\n },\n [flushTranscriptEvents],\n )\n\n useEffect(() => {\n const check = runtime.startupUpdateCheck()\n if (!check) return\n let active = true\n void check.then((result) => {\n if (active && result.status === 'available') {\n notice('info', strings.updateAvailable(result.latest.slice(0, 12), result.url))\n }\n })\n return () => {\n active = false\n }\n }, [notice, runtime, strings])\n\n const ask = useCallback(\n (title: string, body?: string, danger?: boolean) =>\n new Promise<boolean>((resolve) => {\n setOverlay({ kind: 'confirm', title, body, danger, resolve })\n }),\n [],\n )\n\n const pick = useCallback(\n (title: string, items: PickerItem[]) =>\n new Promise<string | null>((resolve) => {\n if (items.length === 0) {\n resolve(null)\n return\n }\n setOverlay({ kind: 'picker', title, items, select: resolve })\n }),\n [],\n )\n\n const promptInput = useCallback(\n (title: string, mask?: boolean) =>\n new Promise<string | null>((resolve) => {\n setOverlay({ kind: 'textinput', title, mask, resolve, cancel: () => resolve(null) })\n }),\n [],\n )\n\n const runAgent = useCallback(async () => {\n if (busyRef.current) return\n const controller = new AbortController()\n abort.current = controller\n busyRef.current = true\n setBusy(true)\n setTurnStart(Date.now())\n turns.current += 1\n const hooks: AgentHooks = {\n onEvent: queueTranscriptEvent,\n requestPermission: (request) =>\n new Promise<PermissionDecision>((resolve) => {\n let settled = false\n const finish = (decision: PermissionDecision) => {\n if (settled) return\n settled = true\n controller.signal.removeEventListener('abort', cancel)\n resolve(decision)\n }\n const cancel = () => {\n setOverlay((current) =>\n current.kind === 'permission' && current.resolve === finish\n ? { kind: 'none' }\n : current,\n )\n finish('deny')\n }\n if (controller.signal.aborted) {\n finish('deny')\n return\n }\n controller.signal.addEventListener('abort', cancel, { once: true })\n setOverlay({ kind: 'permission', request, resolve: finish })\n }),\n }\n try {\n history.current = await runtime.run(history.current, hooks, controller.signal)\n void runtime\n .persist(history.current)\n .catch((error) => notice('error', error instanceof Error ? error.message : String(error)))\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n } finally {\n flushTranscriptEvents()\n abort.current = null\n busyRef.current = false\n setBusy(false)\n setTurnStart(null)\n drainQueueRef.current()\n }\n }, [flushTranscriptEvents, notice, queueTranscriptEvent, runtime])\n\n const applyAccent = useCallback(\n async (value: string) => {\n await runtime.setAccent(value)\n setAccent(value)\n notice('info', strings.accentSet(value, resolveAccent(value)))\n },\n [notice, runtime, strings],\n )\n\n const handleSlash = useCallback(\n async (line: string) => {\n const body = line.slice(1).trim()\n const firstSpace = body.search(/\\s/)\n const command = (firstSpace === -1 ? body : body.slice(0, firstSpace)).toLowerCase()\n const rawRest = firstSpace === -1 ? '' : body.slice(firstSpace).trim()\n const rest = rawRest ? rawRest.split(/\\s+/) : []\n setInput('')\n\n switch (command) {\n case 'help':\n notice(\n 'info',\n COMMANDS.map(\n (c) => `/${c.name}${c.args ? ` ${c.args}` : ''} — ${strings.cmd[c.name] ?? ''}`,\n )\n .concat(strings.escHelp)\n .join('\\n'),\n )\n return\n\n case 'exit':\n case 'quit':\n exit()\n return\n\n case 'clear':\n await runtime.newSession()\n history.current = []\n replaceAttachments([])\n setPromptHistory([])\n setTranscript(emptyTranscript())\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n void runtime\n .persist([])\n .catch((error) =>\n notice('error', error instanceof Error ? error.message : String(error)),\n )\n return\n\n case 'resume': {\n const items = await runtime.listSessionItems()\n if (items.length === 0) {\n notice('info', strings.sessionsEmpty)\n return\n }\n const choice = await pick(strings.titleSessions, items)\n if (!choice) return\n try {\n const restored = await runtime.resumeSession(choice)\n history.current = restored\n setPromptHistory(inputHistoryFromMessages(restored))\n setTranscript(\n pushNotice(\n fromHistory(restored),\n 'info',\n strings.resumed(choice.slice(-6), restored.length),\n ),\n )\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n forceRender((n) => n + 1)\n return\n }\n\n case 'sessions': {\n const items = await runtime.listSessionItems()\n if (items.length === 0) {\n notice('info', strings.sessionsEmpty)\n return\n }\n\n let action: string | undefined = rest[0]?.toLowerCase()\n if (action === 'list') {\n notice(\n 'info',\n items.map((item) => `${item.label}${item.hint ? ` — ${item.hint}` : ''}`).join('\\n'),\n )\n return\n }\n\n if (action === 'delete' && rest.length === 2 && rest[1]?.toLowerCase() === 'all') {\n if (!(await ask(strings.sessionDeleteAllAsk, strings.sessionDeleteAllAskBody, true))) {\n return\n }\n if (\n !(await ask(\n strings.sessionDeleteAllFinalAsk,\n strings.sessionDeleteAllFinalBody,\n true,\n ))\n ) {\n return\n }\n try {\n const result = await runtime.deleteAllSessions()\n history.current = []\n replaceAttachments([])\n setPromptHistory([])\n const message =\n result.failed.length === 0\n ? strings.sessionsDeletedAll(result.deleted)\n : [\n strings.sessionsDeleteAllFailed(result.deleted, result.failed.length),\n ...result.failed.slice(0, 5).map((failure) => `${failure.id}: ${failure.error}`),\n ].join('\\n')\n setTranscript(\n pushNotice(\n emptyTranscript(),\n result.failed.length === 0 ? 'info' : 'error',\n message,\n ),\n )\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n forceRender((n) => n + 1)\n return\n }\n\n let id = action ? rest[1] : undefined\n if (!id) id = (await pick(strings.titleSessions, items)) ?? undefined\n if (!id) return\n const matches = items.filter((item) => item.key === id || item.key.includes(id as string))\n if (matches.length !== 1) {\n notice('warn', `No saved session matches \"${id}\".`)\n return\n }\n id = matches[0]?.key ?? id\n\n if (!action) {\n action =\n (await pick(strings.titleSessionAction, [\n { key: 'resume', label: strings.sessionActionResume },\n { key: 'rename', label: strings.sessionActionRename },\n { key: 'delete', label: strings.sessionActionDelete },\n { key: 'export', label: strings.sessionActionExport },\n ])) ?? undefined\n }\n if (!action) return\n\n try {\n if (action === 'resume') {\n const restored = await runtime.resumeSession(id)\n history.current = restored\n replaceAttachments([])\n setPromptHistory(inputHistoryFromMessages(restored))\n setTranscript(\n pushNotice(fromHistory(restored), 'info', strings.resumed(id.slice(-6), restored.length)),\n )\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n } else if (action === 'rename') {\n const title = rest.slice(2).join(' ').trim()\n if (!title) {\n setInput(`/sessions rename ${id} `)\n notice('info', strings.sessionRenameUsage)\n return\n }\n notice('info', strings.sessionRenamed(await runtime.renameSession(id, title)))\n } else if (action === 'delete') {\n if (!(await ask(`${strings.sessionActionDelete}: ${id.slice(-6)}?`, strings.sessionDeleteAsk, true))) {\n return\n }\n const result = await runtime.deleteSession(id)\n const deletedMessage = strings.sessionDeleted(result.id.slice(-6))\n if (result.wasActive) {\n history.current = []\n replaceAttachments([])\n setPromptHistory([])\n setTranscript(pushNotice(emptyTranscript(), 'info', deletedMessage))\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n void runtime.persist([]).catch((error) =>\n notice('error', error instanceof Error ? error.message : String(error)),\n )\n } else {\n notice('info', deletedMessage)\n }\n } else if (action === 'export') {\n const destination = unquoteArg(rest.slice(2).join(' ').trim()) || undefined\n notice('info', strings.sessionExported(await runtime.exportSession(id, destination)))\n } else {\n notice('warn', 'Usage: /sessions [list|rename|delete [all]|export]')\n return\n }\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n forceRender((n) => n + 1)\n return\n }\n\n case 'undo': {\n try {\n const result = await runtime.undoLastCheckpoint()\n if (!result.found) {\n notice('info', strings.undoNothing)\n return\n }\n const lines = [strings.undoResult(result.restored.length, result.removed.length)]\n if (result.conflicts.length > 0) {\n lines.push(strings.undoConflicts(result.conflicts))\n }\n if (result.failed.length > 0) {\n lines.push(\n strings.undoFailed(\n result.failed.map((failure) => `${failure.path}: ${failure.error}`),\n ),\n )\n }\n notice(\n result.conflicts.length > 0 || result.failed.length > 0 ? 'warn' : 'info',\n lines.join('\\n'),\n )\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n\n case 'config':\n notice('info', strings.configAt(runtime.configPath()))\n return\n\n case 'login':\n setSetup(true)\n return\n\n case 'logout': {\n const providers = runtime.listProviderItems()\n if (providers.length === 0) {\n notice('warn', strings.logoutNothing)\n return\n }\n let providerId: string | undefined = rest[0]\n if (!providerId) {\n providerId =\n providers.length === 1\n ? providers[0]?.key\n : ((await pick(strings.titleLogout, providers)) ?? undefined)\n }\n if (!providerId) return\n if (!providers.some((provider) => provider.key === providerId)) {\n notice('warn', `Provider \"${providerId}\" is not configured.`)\n return\n }\n if (!(await ask(strings.logoutAsk(providerId), strings.logoutAskBody, true))) return\n try {\n const result = await runtime.logout(providerId)\n const message = `${strings.loggedOut(result.removed)}${result.nextModel ? `\\n${strings.modelSet(result.nextModel)}` : ''}`\n if (result.wasActive) {\n await runtime.newSession()\n history.current = []\n replaceAttachments([])\n setPromptHistory([])\n setTranscript(pushNotice(emptyTranscript(), 'info', message))\n setTranscriptRevision((revision) => revision + 1)\n sessionStart.current = Date.now()\n turns.current = 0\n void runtime.persist([]).catch((error) =>\n notice('error', error instanceof Error ? error.message : String(error)),\n )\n } else {\n notice('info', message)\n }\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n setSetup(runtime.needsSetup())\n forceRender((n) => n + 1)\n return\n }\n\n case 'key': {\n const providers = runtime.listProviderItems()\n if (providers.length === 0) {\n notice('warn', strings.logoutNothing)\n return\n }\n let providerId: string | undefined = rest[0]\n if (!providerId) {\n providerId =\n providers.length === 1\n ? providers[0]?.key\n : ((await pick(strings.titleKeyChange, providers)) ?? undefined)\n }\n if (!providerId) return\n if (!providers.some((provider) => provider.key === providerId)) {\n notice('warn', `Provider \"${providerId}\" is not configured.`)\n return\n }\n if (!(await ask(strings.keyChangeAsk(providerId), strings.keyChangeAskBody, true))) return\n const newKey = await promptInput(strings.apiKey, true)\n if (!newKey || newKey.trim() === '') {\n notice('warn', 'Empty key — nothing changed.')\n return\n }\n try {\n await runtime.changeProviderKey(providerId, newKey.trim())\n notice('info', strings.keyChanged(providerId))\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n\n case 'lang': {\n const choice = await pick(\n strings.titleLang,\n LANGS.map((entry) => ({ key: entry.key, label: entry.label })),\n )\n if (!choice) return\n await runtime.setLang(choice as Lang)\n setLang(choice as Lang)\n return\n }\n\n case 'skills': {\n const action = rest[0]?.toLowerCase()\n\n if (action === 'install') {\n const source = rest.slice(1).join(' ').trim()\n if (!source) {\n notice('warn', strings.skillsInstallUsage)\n return\n }\n notice('info', strings.skillsInstalling(source))\n try {\n const result = await runtime.installSkill(source)\n notice('info', strings.skillsInstalled(result.name, result.source))\n \n forceRender((n) => n + 1)\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n\n const skills = runtime.listSkills()\n if (skills.length === 0) {\n notice('info', strings.skillsEmpty)\n return\n }\n const items: PickerItem[] = skills.map((skill) => ({\n key: skill.name,\n label: skill.name,\n hint: skill.description || undefined,\n }))\n const choice = await pick(strings.titleSkills, items)\n if (!choice) return\n try {\n const body = await runtime.loadSkill(choice)\n \n setTranscript((state) => pushUser(state, `skill: ${choice}\\n${body}`))\n history.current = [...history.current, { role: 'user', content: [{ type: 'text', text: body }] }]\n void runAgent()\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n\n case 'usage': {\n const balance = await runtime.providerBalance()\n const providerBalances = balance?.filter((item) => item.kind === 'balance') ?? []\n const keyLimits = balance?.filter((item) => item.kind === 'key-limit') ?? []\n const balanceLines = [\n providerBalances.length > 0\n ? strings.providerBalance(formatBalances(providerBalances))\n : null,\n keyLimits.length > 0\n ? strings.providerKeyRemaining(formatBalances(keyLimits))\n : null,\n ]\n notice(\n 'info',\n [\n runtime.usageReport(),\n runtime.rateLimitsReport(),\n ...balanceLines,\n strings.sessionSummary(\n formatDuration(Date.now() - sessionStart.current),\n turns.current,\n ),\n ]\n .filter((line): line is string => line !== null)\n .join('\\n'),\n )\n return\n }\n\n case 'provider': {\n const items = runtime.listProviderItems()\n if (items.length === 0) {\n notice('warn', strings.providersEmpty)\n return\n }\n const choice = await pick(strings.titleProvider, items)\n if (!choice) return\n try {\n const ref = await runtime.useProvider(choice)\n notice('info', strings.providerSet(choice, ref))\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n forceRender((n) => n + 1)\n return\n }\n\n case 'mcp': {\n const action = rest[0]?.toLowerCase()\n if (action === 'add') {\n const parsed = parseMcpAddArgs(rest.slice(1))\n if (!parsed.ok) {\n const problem = mcpAddProblem(strings, parsed.error)\n notice(\n 'warn',\n parsed.error === 'usage' ? problem : `${problem}\\n${strings.mcpAddUsage}`,\n )\n return\n }\n if (runtime.mcpServers().some((state) => state.name === parsed.name)) {\n notice('warn', strings.mcpExists(parsed.name))\n return\n }\n\n notice('info', strings.mcpConnecting(parsed.name))\n try {\n const state = await runtime.addMcpServer(parsed.name, parsed.config)\n notice('info', strings.mcpAdded(state.name, state.toolCount))\n } catch (error) {\n notice(\n 'error',\n strings.mcpAddFailed(\n parsed.name,\n error instanceof Error ? error.message : String(error),\n ),\n )\n }\n forceRender((n) => n + 1)\n return\n }\n\n if (action === 'delete') {\n const states = runtime.mcpServers()\n let name: string | undefined = rest[1]\n if (!name) {\n if (states.length === 0) {\n notice('info', strings.mcpEmpty)\n return\n }\n name =\n (await pick(\n strings.titleMcpDelete,\n states.map((state) => ({\n key: state.name,\n label: state.name,\n hint: `${strings.mcpState[state.status] ?? state.status} · ${strings.mcpTools(state.toolCount)}`,\n })),\n )) ?? undefined\n if (!name) return\n }\n if (!states.some((state) => state.name === name)) {\n notice('warn', strings.mcpNotFound(name))\n return\n }\n\n try {\n await runtime.removeMcpServer(name)\n notice('info', strings.mcpDeleted(name))\n } catch (error) {\n notice(\n 'error',\n strings.mcpDeleteFailed(\n name,\n error instanceof Error ? error.message : String(error),\n ),\n )\n }\n forceRender((n) => n + 1)\n return\n }\n\n if (action === 'enable' || action === 'disable') {\n const states = runtime.mcpServers()\n const enabling = action === 'enable'\n const candidates = states.filter((state) =>\n enabling ? state.status === 'disabled' : state.status !== 'disabled',\n )\n let name: string | undefined = rest[1]\n if (!name) {\n if (candidates.length === 0) {\n notice('info', strings.mcpEmpty)\n return\n }\n name =\n (await pick(\n enabling ? strings.titleMcpEnable : strings.titleMcpDisable,\n candidates.map((state) => ({\n key: state.name,\n label: state.name,\n hint: strings.mcpState[state.status] ?? state.status,\n })),\n )) ?? undefined\n }\n if (!name) return\n if (!states.some((state) => state.name === name)) {\n notice('warn', strings.mcpNotFound(name))\n return\n }\n try {\n const state = await runtime.setMcpEnabled(name, enabling)\n if (enabling && state.status === 'error') {\n notice('error', strings.mcpToggleFailed(name, state.error ?? 'connection failed'))\n } else {\n notice(\n 'info',\n enabling ? strings.mcpEnabled(name, state.toolCount) : strings.mcpDisabled(name),\n )\n }\n } catch (error) {\n notice(\n 'error',\n strings.mcpToggleFailed(\n name,\n error instanceof Error ? error.message : String(error),\n ),\n )\n }\n forceRender((n) => n + 1)\n return\n }\n\n if (action && action !== 'list') {\n notice('warn', strings.mcpAddUsage)\n return\n }\n\n const { connected, failed } = runtime.mcpSummary()\n const states = runtime.mcpServers()\n const lines = states.map((state) => mcpStateLine(strings, state))\n notice(\n failed > 0 ? 'warn' : 'info',\n [\n strings.mcpStatus(connected, failed),\n ...(lines.length > 0 ? lines : [strings.mcpEmpty]),\n strings.mcpAddUsage,\n ].join('\\n'),\n )\n return\n }\n\n case 'attach': {\n if (rawRest.toLowerCase() === 'clear') {\n replaceAttachments([])\n notice('info', strings.attachmentsCleared)\n return\n }\n if (rawRest.toLowerCase() === 'clipboard') {\n if (attachmentsRef.current.length >= MAX_ATTACHMENTS) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return\n }\n if (clipboardPasteTask.current) return\n const task = runtime\n .loadClipboardImage()\n .then((block) => {\n if (appendAttachment(block)) {\n notice(\n 'info',\n strings.attachmentAdded(attachmentLabel(block) ?? 'clipboard image'),\n )\n }\n })\n .catch((error) =>\n notice('error', error instanceof Error ? error.message : String(error)),\n )\n clipboardPasteTask.current = task\n try {\n await task\n } finally {\n if (clipboardPasteTask.current === task) clipboardPasteTask.current = null\n }\n return\n }\n if (!rawRest) {\n notice('info', strings.attachUsage)\n return\n }\n if (attachmentsRef.current.length >= MAX_ATTACHMENTS) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return\n }\n try {\n const block = await runtime.loadAttachment(rawRest)\n if (appendAttachment(block)) {\n notice('info', strings.attachmentAdded(attachmentLabel(block) ?? 'attachment'))\n }\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n\n case 'compact': {\n const controller = new AbortController()\n abort.current = controller\n busyRef.current = true\n setBusy(true)\n setTurnStart(Date.now())\n notice('info', strings.compactStarting)\n try {\n const result = await runtime.compact(history.current, controller.signal)\n if (!result.compacted) {\n notice('info', strings.compactNothing)\n } else {\n history.current = result.history\n setPromptHistory(inputHistoryFromMessages(result.history))\n setTranscript(\n pushNotice(fromHistory(result.history), 'info', strings.compactDone(result.removedMessages)),\n )\n setTranscriptRevision((revision) => revision + 1)\n await runtime.persist(result.history)\n }\n } catch (error) {\n if (!controller.signal.aborted) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n } finally {\n abort.current = null\n busyRef.current = false\n setBusy(false)\n setTurnStart(null)\n }\n forceRender((n) => n + 1)\n return\n }\n\n case 'subagents': {\n const agents = runtime.activeAgentsList()\n if (agents.length === 0) {\n notice('info', strings.subagentsStatus(0))\n return\n }\n const lines = agents.map((a, i) => {\n const label = a.description || `subagent ${i + 1}`\n const progress = a.progress.length > 0 ? ` · ${a.progress[a.progress.length - 1]}` : ''\n return `${label}${progress}`\n })\n notice('info', lines.join('\\n'))\n return\n }\n\n case 'checker':\n try {\n notice('info', await runtime.checkerReport())\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n\n case 'theme': {\n const requested = rest[0]\n if (requested) {\n await applyAccent(requested)\n return\n }\n const choice = await pick(\n strings.titleAccent,\n Object.entries(PRESETS).map(([name, hex]) => ({ key: name, label: name, hint: hex })),\n )\n if (choice) await applyAccent(choice)\n return\n }\n\n case 'thinking': {\n const next = !runtime.getThinking()\n await runtime.setThinking(next)\n notice('info', strings.reasoning(next))\n forceRender((n) => n + 1)\n return\n }\n\n case 'effort': {\n const choice = await pick(\n strings.titleEffort,\n EFFORTS.map((effort) => ({ key: effort, label: effort })),\n )\n if (!choice) return\n await runtime.setEffort(choice as Effort)\n notice('info', strings.effortSet(choice))\n forceRender((n) => n + 1)\n return\n }\n\n case 'budget': {\n const current = runtime.getMaxTokensPerTurn()\n if (rest[0]) {\n const tokens = Number(rest[0])\n if (tokens === 0) {\n await runtime.setMaxTokensPerTurn(0)\n notice('info', strings.budgetUnlimited)\n forceRender((n) => n + 1)\n } else if (!Number.isInteger(tokens) || tokens < 1_000 || tokens > 10_000_000) {\n notice('warn', strings.budgetInvalid)\n } else {\n await runtime.setMaxTokensPerTurn(tokens)\n notice('info', strings.budgetSet(tokens))\n forceRender((n) => n + 1)\n }\n } else {\n notice('info', current === 0 ? strings.budgetUnlimited : strings.budgetCurrent(current))\n }\n return\n }\n\n case 'model': {\n const items = await runtime.listModelItems()\n if (items.length === 0) {\n notice('warn', strings.noModels)\n return\n }\n const choice = await pick(strings.titleModel, items)\n if (!choice) return\n await runtime.setModelRef(choice)\n notice('info', strings.modelSet(choice))\n forceRender((n) => n + 1)\n return\n }\n\n case 'bypass': {\n if (runtime.isBypassEnabled()) {\n runtime.setBypass(false)\n notice('info', strings.bypassOff)\n forceRender((n) => n + 1)\n return\n }\n if (!(await ask(strings.bypassAsk1, strings.bypassAsk1Body, true))) {\n notice('info', strings.bypassCancelled)\n return\n }\n if (!(await ask(strings.bypassAsk2, strings.bypassAsk2Body, true))) {\n notice('info', strings.bypassCancelled)\n return\n }\n runtime.setBypass(true)\n notice('warn', strings.bypassOn)\n forceRender((n) => n + 1)\n return\n }\n\n case 'prompt': {\n const sub = rest[0]?.toLowerCase()\n\n if (sub === 'save') {\n const name = rest.slice(1).join(' ').trim()\n if (name) {\n \n const body = lastUserText(history.current)\n if (!body) {\n notice('warn', strings.promptNothing)\n return\n }\n await runtime.savePrompt(name, body)\n notice('info', strings.promptSaved(name))\n return\n }\n \n const recent = recentUserMessages(history.current, 20)\n if (recent.length > 0) {\n const items: PickerItem[] = recent.map((text, i) => ({\n key: `__recent_${i}__`,\n label: text.length > 60 ? `${text.slice(0, 60)}…` : text,\n hint: text.length > 60 ? undefined : undefined,\n }))\n items.push({ key: '__custom__', label: '— type a custom prompt —' })\n const choice = await pick(strings.titlePrompts, items)\n if (!choice) return\n if (choice === '__custom__') {\n setInput('/prompt save ')\n return\n }\n const index = parseInt(choice.replace('__recent_', '').replace('__', ''), 10)\n const body = recent[index] ?? ''\n if (!body) {\n notice('warn', strings.promptNothing)\n return\n }\n if (!(await ask(strings.promptSaveAsk, strings.promptSaveAskBody))) return\n \n const defaultName = body.split(/\\s+/).slice(0, 4).join('-').replace(/[^a-z0-9-]/gi, '').toLowerCase()\n const nameInput = `${defaultName || 'prompt'}`\n \n await runtime.savePrompt(nameInput, body)\n notice('info', `${strings.promptSaved(nameInput)}\\nRename the file if you want a different name.`)\n return\n }\n notice('warn', strings.promptNothing)\n return\n }\n\n if (sub === 'delete') {\n const name = rest.slice(1).join(' ').trim()\n if (name) {\n try {\n await runtime.deletePrompt(name)\n notice('info', strings.promptDeleted(name))\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n const items = await runtime.listPromptItems()\n if (items.length === 0) {\n notice('info', strings.promptsEmpty)\n return\n }\n const choice = await pick(strings.titlePrompts, items)\n if (!choice) return\n if (!(await ask(strings.promptDeleteUsage.replace('Usage: ', '').replace('<name>', choice || '') + '?', strings.sessionDeleteAsk, true))) return\n try {\n await runtime.deletePrompt(choice)\n notice('info', strings.promptDeleted(choice))\n } catch (error) {\n notice('error', error instanceof Error ? error.message : String(error))\n }\n return\n }\n\n \n const items = await runtime.listPromptItems()\n if (items.length === 0) {\n notice('info', strings.promptsEmpty)\n return\n }\n const choice = await pick(strings.titlePrompts, items)\n if (!choice) return\n setInput(await runtime.readPrompt(choice))\n return\n }\n\n default: {\n const guess = closestCommand(command)\n notice(\n 'warn',\n guess ? strings.didYouMean(command, guess.name) : strings.unknownCommand(command),\n )\n }\n }\n },\n [applyAccent, appendAttachment, ask, exit, notice, pick, replaceAttachments, runtime, strings],\n )\n\n const runSlash = useCallback(\n (line: string) => {\n slashPendingRef.current += 1\n const task = slashQueueRef.current.catch(() => undefined).then(() => handleSlash(line))\n slashQueueRef.current = task\n void task.catch((error) =>\n notice('error', error instanceof Error ? error.message : String(error)),\n )\n const finished = () => {\n slashPendingRef.current = Math.max(0, slashPendingRef.current - 1)\n drainQueueRef.current()\n }\n void task.then(finished, finished)\n },\n [handleSlash, notice],\n )\n\n const enqueueNext = useCallback(\n (item: QueuedItem) => {\n if (item.kind === 'command') {\n runSlash(item.line)\n return\n }\n setTranscript((state) => pushUser(state, userDisplay(item.text, item.content)))\n history.current = [...history.current, { role: 'user', content: item.content }]\n void runAgent()\n },\n [runAgent, runSlash],\n )\n\n const drainQueue = useCallback(() => {\n if (busyRef.current || slashPendingRef.current > 0) return\n const [next, ...remaining] = queueRef.current\n if (!next) {\n setPendingCount(0)\n return\n }\n queueRef.current = remaining\n setPendingCount(remaining.length)\n queueMicrotask(() => enqueueNext(next))\n }, [enqueueNext])\n drainQueueRef.current = drainQueue\n\n const tryQueueAutomaticAttachment = useCallback(\n (requestedPath: string): Promise<boolean> => {\n if (!looksLikeAttachmentPath(requestedPath)) return Promise.resolve(false)\n if (automaticAttachmentTask.current) {\n return automaticAttachmentTask.current.then(() => false)\n }\n if (attachmentsRef.current.length >= MAX_ATTACHMENTS) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return Promise.resolve(true)\n }\n\n const task = runtime\n .loadAutomaticAttachment(requestedPath)\n .then((block) => {\n if (!block) return false\n if (!appendAttachment(block)) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return true\n }\n notice('info', strings.attachmentAdded(attachmentLabel(block) ?? 'attachment'))\n return true\n })\n .catch((error) => {\n notice('error', error instanceof Error ? error.message : String(error))\n return true\n })\n automaticAttachmentTask.current = task\n void task.finally(() => {\n if (automaticAttachmentTask.current === task) automaticAttachmentTask.current = null\n })\n return task\n },\n [appendAttachment, notice, runtime, strings],\n )\n\n const pasteClipboardImage = useCallback(() => {\n if (clipboardPasteTask.current) return\n if (attachmentsRef.current.length >= MAX_ATTACHMENTS) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return\n }\n const task = runtime\n .loadClipboardImage()\n .then((block) => {\n if (!appendAttachment(block)) {\n notice('warn', `At most ${MAX_ATTACHMENTS} attachments can be queued for one message.`)\n return\n }\n notice('info', strings.attachmentAdded(attachmentLabel(block) ?? 'clipboard image'))\n })\n .catch((error) => notice('error', error instanceof Error ? error.message : String(error)))\n clipboardPasteTask.current = task\n void task.finally(() => {\n if (clipboardPasteTask.current === task) clipboardPasteTask.current = null\n })\n }, [appendAttachment, notice, runtime, strings])\n\n const submit = useCallback(\n async (raw: string) => {\n const pendingAttachments = [automaticAttachmentTask.current, clipboardPasteTask.current].filter(\n (task): task is Promise<boolean> | Promise<void> => task !== null,\n )\n const detachedInput = pendingAttachments.length > 0\n if (detachedInput) {\n \n \n setInput('')\n await Promise.all(pendingAttachments)\n }\n const text = raw.trim()\n const submitSlash = () => {\n \n \n if (!detachedInput) setInput('')\n if (busyRef.current || slashPendingRef.current > 0) {\n queueRef.current = [...queueRef.current, { kind: 'command', line: text }]\n setPendingCount(queueRef.current.length)\n return\n }\n runSlash(text)\n }\n\n if (isKnownSlashCommand(text)) {\n submitSlash()\n return\n }\n if (text && looksLikeAttachmentPath(text) && (await tryQueueAutomaticAttachment(text))) {\n if (!detachedInput) setInput('')\n return\n }\n if (text.startsWith('/')) {\n submitSlash()\n return\n }\n const queuedAttachments = attachmentsRef.current\n if (!text && queuedAttachments.length === 0) return\n if (text) setPromptHistory((state) => appendInputHistory(state, text))\n if (!detachedInput) setInput('')\n const content: ContentBlock[] = [\n ...(text ? ([{ type: 'text', text }] as ContentBlock[]) : []),\n ...queuedAttachments,\n ]\n replaceAttachments([])\n const item: QueuedItem = { kind: 'message', text, content }\n if (busyRef.current || slashPendingRef.current > 0) {\n queueRef.current = [...queueRef.current, item]\n setPendingCount(queueRef.current.length)\n return\n }\n setTranscript((state) => pushUser(state, userDisplay(text, content)))\n history.current = [...history.current, { role: 'user', content }]\n void runAgent()\n },\n [replaceAttachments, runAgent, runSlash, tryQueueAutomaticAttachment],\n )\n\n useTerminalInput((_char, key) => {\n if (key.tab && key.shift) {\n const next = runtime.cycleMode()\n notice('info', strings.modeChanged(strings.modeLabel[next] ?? next))\n forceRender((n) => n + 1)\n return\n }\n if (!key.escape) return\n if (busy && abort.current) {\n abort.current.abort()\n queueRef.current = []\n setPendingCount(0)\n notice('warn', strings.cancelled)\n return\n }\n if (overlay.kind === 'permission') {\n overlay.resolve('deny')\n setOverlay({ kind: 'none' })\n return\n }\n if (overlay.kind === 'confirm') {\n overlay.resolve(false)\n setOverlay({ kind: 'none' })\n return\n }\n if (overlay.kind === 'picker') {\n overlay.select('')\n setOverlay({ kind: 'none' })\n return\n }\n setInput('')\n })\n\n const shell = (children: React.ReactNode) => (\n <ThemeContext.Provider value={theme}>\n <StringsContext.Provider value={strings}>{children}</StringsContext.Provider>\n </ThemeContext.Provider>\n )\n\n if (lang === undefined) {\n return shell(\n <LanguagePicker\n onPick={(chosen) => {\n setLang(chosen)\n void runtime.setLang(chosen)\n }}\n />,\n )\n }\n\n if (setup) {\n return shell(\n <Onboarding\n onSubmit={async (url, key) => {\n const summary = await runtime.addProvider(url, key)\n setSetup(false)\n notice('info', `${summary}\\n${strings.configAt(runtime.configPath())}`)\n return summary\n }}\n />,\n )\n }\n\n return shell(\n <TerminalViewport rows={rows}>\n <Transcript\n key={transcriptRevision}\n bubbles={transcript.bubbles}\n workspace={runtime.cwd}\n />\n\n {overlay.kind === 'permission' && (\n <PermissionPrompt\n request={overlay.request}\n onDecide={(decision) => {\n overlay.resolve(decision)\n setOverlay({ kind: 'none' })\n }}\n />\n )}\n\n {overlay.kind === 'picker' && (\n <Picker\n title={overlay.title}\n items={overlay.items}\n onSelect={(key) => {\n overlay.select(key)\n setOverlay({ kind: 'none' })\n }}\n onCancel={() => {\n overlay.select('')\n setOverlay({ kind: 'none' })\n }}\n />\n )}\n\n {overlay.kind === 'confirm' && (\n <Confirm\n title={overlay.title}\n body={overlay.body}\n danger={overlay.danger}\n onAnswer={(yes) => {\n overlay.resolve(yes)\n setOverlay({ kind: 'none' })\n }}\n />\n )}\n\n {overlay.kind === 'textinput' && (\n <TextInputOverlay\n title={overlay.title}\n mask={overlay.mask}\n onAnswer={(value) => {\n overlay.resolve(value)\n setOverlay({ kind: 'none' })\n }}\n onCancel={() => {\n overlay.cancel?.()\n setOverlay({ kind: 'none' })\n }}\n />\n )}\n\n {overlay.kind === 'none' && (\n <PromptInput\n value={input}\n onChange={setInput}\n onSubmit={submit}\n onPastePath={tryQueueAutomaticAttachment}\n onPasteImage={pasteClipboardImage}\n disabled={busy}\n pending={pendingCount}\n hint={busy ? strings.escCancel : undefined}\n history={promptHistory}\n attachments={attachments.flatMap((block) => {\n const label = attachmentLabel(block)\n return label ? [label] : []\n })}\n />\n )}\n\n <StatusBar\n status={{\n modelRef: runtime.getModelRef() || strings.noModel,\n effort: runtime.getEffort(),\n thinking: runtime.getThinking(),\n usage: runtime.usageParts(),\n mcp: runtime.mcpSummary(),\n mode: runtime.getMode(),\n bypass: runtime.isBypassEnabled(),\n busy,\n sessionMs: Date.now() - sessionStart.current,\n turnMs: turnStart === null ? null : Date.now() - turnStart,\n activeAgents: runtime.activeAgentsCount(),\n context,\n }}\n />\n </TerminalViewport>,\n )\n}\n\nfunction TextInputOverlay({\n title,\n mask,\n onAnswer,\n onCancel,\n}: {\n title: string\n mask?: boolean\n onAnswer: (value: string | null) => void\n onCancel: () => void\n}) {\n const [value, setValue] = useState('')\n const theme = useTheme()\n\n const submit = useCallback(() => {\n onAnswer(value || null)\n }, [value, onAnswer])\n\n useInput((_input, key) => {\n if (key.escape) onCancel()\n })\n\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>{title}</Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={submit}\n mask={mask ? '•' : undefined}\n />\n <Box marginTop={1}>\n <Text dimColor color={theme.accent}>enter submit · esc cancel</Text>\n </Box>\n </Box>\n )\n}\n\nfunction isKnownSlashCommand(line: string): boolean {\n if (!line.startsWith('/')) return false\n const [name = ''] = line.slice(1).trim().toLowerCase().split(/\\s+/)\n return name === 'quit' || COMMANDS.some((command) => command.name === name)\n}\n\nfunction mcpAddProblem(strings: Strings, error: McpAddError): string {\n switch (error) {\n case 'invalid-name':\n return strings.mcpAddInvalidName\n case 'invalid-url':\n return strings.mcpAddInvalidUrl\n case 'http-args':\n return strings.mcpAddHttpArgs\n case 'usage':\n return strings.mcpAddUsage\n }\n}\n\nfunction mcpStateLine(strings: Strings, state: McpServerState): string {\n const mark = state.status === 'connected' ? '●' : state.status === 'error' ? '✗' : '○'\n const status = strings.mcpState[state.status] ?? state.status\n const tools = state.status === 'connected' ? ` · ${strings.mcpTools(state.toolCount)}` : ''\n const error = state.error ? ` · ${state.error}` : ''\n return `${mark} ${state.name} — ${status}${tools}${error}`\n}\n\nfunction formatBalances(\n balances: Array<{ amount: string; currency: string }>,\n): string {\n return balances.map((item) => `${item.amount} ${item.currency}`).join(' · ')\n}\n\nfunction lastUserText(messages: Message[]): string {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index]\n if (message?.role !== 'user') continue\n const text = userText(message)\n if (text) return text\n }\n return ''\n}\n\nfunction recentUserMessages(messages: Message[], max: number): string[] {\n const results: string[] = []\n for (let index = messages.length - 1; index >= 0 && results.length < max; index -= 1) {\n const message = messages[index]\n if (message?.role !== 'user') continue\n const text = userText(message)\n if (text) results.unshift(text)\n }\n return results\n}\n\nfunction inputHistoryFromMessages(messages: Message[]): string[] {\n return messages.reduce<string[]>((items, message) => {\n if (message.role !== 'user') return items\n return appendInputHistory(items, userText(message))\n }, [])\n}\n\nfunction userText(message: Message): string {\n return message.content\n .filter((block) => block.type === 'text')\n .map((block) => (block.type === 'text' ? block.text : ''))\n .join('\\n')\n .trim()\n}\n\nfunction userDisplay(text: string, content: ContentBlock[]): string {\n const labels = content.flatMap((block) => {\n const label = attachmentLabel(block)\n return label ? [`📎 ${label}`] : []\n })\n return [text, ...labels].filter(Boolean).join('\\n')\n}\n\nfunction unquoteArg(value: string): string {\n if (value.length < 2) return value\n const first = value[0]\n const last = value.at(-1)\n return (first === '\"' && last === '\"') || (first === \"'\" && last === \"'\")\n ? value.slice(1, -1)\n : value\n}\n","import type { McpServerConfig } from '../config/schema'\nimport { mcpServerSchema } from '../config/schema'\n\nexport type McpAddError = 'usage' | 'invalid-name' | 'invalid-url' | 'http-args'\n\nexport type McpAddParseResult =\n | { ok: true; name: string; config: McpServerConfig }\n | { ok: false; error: McpAddError }\n\nconst SERVER_NAME = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/\n\nexport function parseMcpAddArgs(args: string[]): McpAddParseResult {\n const [name, first, ...remaining] = args\n if (!name || !first) return { ok: false, error: 'usage' }\n if (!SERVER_NAME.test(name)) return { ok: false, error: 'invalid-name' }\n\n if (first === 'http') {\n const [url, ...extra] = remaining\n if (!url) return { ok: false, error: 'usage' }\n if (extra.length > 0) return { ok: false, error: 'http-args' }\n return httpServer(name, url)\n }\n\n if (first === 'stdio' || first === '--') {\n const [command, ...commandArgs] = remaining\n if (!command) return { ok: false, error: 'usage' }\n return stdioServer(name, command, commandArgs)\n }\n\n if (/^https?:\\/\\//.test(first)) {\n if (remaining.length > 0) return { ok: false, error: 'http-args' }\n return httpServer(name, first)\n }\n\n return stdioServer(name, first, remaining)\n}\n\nfunction httpServer(name: string, url: string): McpAddParseResult {\n const parsed = mcpServerSchema.safeParse({ type: 'http', url })\n return parsed.success\n ? { ok: true, name, config: parsed.data }\n : { ok: false, error: 'invalid-url' }\n}\n\nfunction stdioServer(name: string, command: string, args: string[]): McpAddParseResult {\n const parsed = mcpServerSchema.safeParse({ type: 'stdio', command, args })\n return parsed.success\n ? { ok: true, name, config: parsed.data }\n : { ok: false, error: 'usage' }\n}\n","export interface SlashCommand {\n name: string\n args?: string\n}\n\nexport const COMMANDS: SlashCommand[] = [\n { name: 'model' },\n { name: 'login' },\n { name: 'provider' },\n { name: 'logout', args: '[provider]' },\n { name: 'key', args: '[provider]' },\n { name: 'effort' },\n { name: 'thinking' },\n { name: 'budget', args: '[tokens]' },\n { name: 'theme', args: '[color]' },\n { name: 'lang' },\n { name: 'prompt', args: '[save <name>|delete <name>]' },\n { name: 'skills', args: '[install <source>]' },\n { name: 'bypass' },\n { name: 'usage' },\n { name: 'mcp', args: '[add|list|delete|enable|disable]' },\n { name: 'attach', args: '<path|clipboard|clear>' },\n { name: 'compact' },\n { name: 'checker' },\n { name: 'sessions', args: '[list|rename|delete [all]|export]' },\n { name: 'config' },\n { name: 'resume' },\n { name: 'undo' },\n { name: 'clear' },\n { name: 'help' },\n { name: 'exit' },\n { name: 'subagents' },\n]\n\nconst SUBCOMMANDS: SlashCommand[] = [\n { name: 'mcp add', args: '<name> <url|-- command>' },\n { name: 'mcp list' },\n { name: 'mcp delete', args: '[name]' },\n { name: 'mcp enable', args: '[name]' },\n { name: 'mcp disable', args: '[name]' },\n { name: 'sessions list' },\n { name: 'sessions rename', args: '[id] <title>' },\n { name: 'sessions delete', args: '[id]' },\n { name: 'sessions delete all' },\n { name: 'sessions export', args: '[id] [path]' },\n]\n\nexport function matchCommands(line: string): SlashCommand[] {\n if (!line.startsWith('/')) return []\n const token = line.slice(1)\n if (token.includes(' ')) {\n const needle = token.toLowerCase()\n return SUBCOMMANDS.filter((command) => command.name.startsWith(needle))\n }\n if (token === '') return COMMANDS\n\n const needle = token.toLowerCase()\n const starts = COMMANDS.filter((command) => command.name.startsWith(needle))\n if (starts.length > 0) return starts\n\n const contains = COMMANDS.filter((command) => command.name.includes(needle))\n if (contains.length > 0) return contains\n\n return COMMANDS.filter((command) => isSubsequence(needle, command.name))\n}\n\nexport function closestCommand(name: string): SlashCommand | undefined {\n const needle = name.toLowerCase()\n let best: SlashCommand | undefined\n let bestScore = Number.POSITIVE_INFINITY\n\n for (const command of COMMANDS) {\n const score = editDistance(needle, command.name)\n if (score < bestScore) {\n bestScore = score\n best = command\n }\n }\n\n return bestScore <= Math.max(2, Math.floor(needle.length / 2)) ? best : undefined\n}\n\nfunction isSubsequence(needle: string, haystack: string): boolean {\n let index = 0\n for (const character of haystack) {\n if (character === needle[index]) index += 1\n if (index === needle.length) return true\n }\n return needle.length === 0\n}\n\nfunction editDistance(a: string, b: string): number {\n let previous = Array.from({ length: b.length + 1 }, (_, index) => index)\n\n for (let i = 1; i <= a.length; i += 1) {\n const current = [i]\n for (let j = 1; j <= b.length; j += 1) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n current[j] = Math.min(\n (current[j - 1] ?? 0) + 1,\n (previous[j] ?? 0) + 1,\n (previous[j - 1] ?? 0) + cost,\n )\n }\n previous = current\n }\n\n return previous[b.length] ?? 0\n}\n","import { createContext, useContext } from 'react'\n\nexport const PRESETS: Record<string, string> = {\n purple: '#a78bfa',\n violet: '#8b5cf6',\n blue: '#60a5fa',\n cyan: '#22d3ee',\n green: '#4ade80',\n orange: '#fb923c',\n pink: '#f472b6',\n red: '#f87171',\n yellow: '#fbbf24',\n white: '#e5e7eb',\n}\n\nexport const DEFAULT_ACCENT = PRESETS.purple as string\n\nexport interface Theme {\n accent: string\n ok: string\n warn: string\n error: string\n}\n\nexport function resolveAccent(value: string | undefined): string {\n if (!value) return DEFAULT_ACCENT\n const preset = PRESETS[value.toLowerCase()]\n if (preset) return preset\n return /^#[0-9a-f]{6}$/i.test(value) ? value : DEFAULT_ACCENT\n}\n\nexport function makeTheme(accent: string | undefined): Theme {\n return {\n accent: resolveAccent(accent),\n ok: PRESETS.green as string,\n warn: PRESETS.yellow as string,\n error: PRESETS.red as string,\n }\n}\n\nexport const ThemeContext = createContext<Theme>(makeTheme(undefined))\n\nexport function useTheme(): Theme {\n return useContext(ThemeContext)\n}\n","import { Box, Text } from 'ink'\nimport { useTerminalInput } from '../input'\nimport { normalizeHotkey } from '../layout'\nimport { useStrings } from '../i18n'\nimport { useTheme } from '../theme'\nimport { sanitizeTerminalText } from '../sanitize'\nimport type { ConfirmProps } from '../types'\n\nexport function Confirm({ title, body, danger, onAnswer }: ConfirmProps) {\n const theme = useTheme()\n const strings = useStrings()\n useTerminalInput((char, key) => {\n const c = normalizeHotkey(char)\n if (c === 'y') onAnswer(true)\n else if (c === 'n' || key.escape || key.return) onAnswer(false)\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={danger ? theme.error : theme.warn}\n paddingX={1}\n >\n <Text bold color={danger ? theme.error : theme.warn}>\n {sanitizeTerminalText(title)}\n </Text>\n {body && <Text dimColor>{sanitizeTerminalText(body)}</Text>}\n <Text>\n <Text bold>y</Text> {strings.yes} · <Text bold>n</Text> {strings.noDefault}\n </Text>\n </Box>\n )\n}\n","import { useInput, usePaste } from 'ink'\nimport type { Key } from 'ink'\nimport { useRef } from 'react'\n\nexport type TerminalInputHandler = (input: string, key: Key) => void\n\nexport function useTerminalInput(\n handler: TerminalInputHandler,\n options: { isActive?: boolean } = {},\n): void {\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n\n useInput((input, key) => {\n \n if (key.eventType === 'release') return\n handlerRef.current(input, key)\n }, options)\n}\n\nexport function useTerminalPaste(\n handler: (text: string) => void,\n options: { isActive?: boolean } = {},\n): void {\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n\n usePaste((text) => handlerRef.current(text), options)\n}\n","\n\nconst RU_TO_EN: Record<string, string> = {\n н: 'y',\n ф: 'a',\n т: 'n',\n}\n\nexport function normalizeHotkey(char: string | undefined): string {\n if (!char) return ''\n const lower = char.toLowerCase()\n return RU_TO_EN[lower] ?? lower\n}\n","import { createContext, useContext } from 'react'\n\nexport type Lang = 'en' | 'ru'\n\nexport const LANGS: { key: Lang; label: string }[] = [\n { key: 'en', label: 'English' },\n { key: 'ru', label: 'Русский' },\n]\n\nexport interface Strings {\n hint: string\n noProvider: string\n\n onboardIntro: string\n onboardExamples: string\n baseUrl: string\n apiKey: string\n detecting: string\n\n placeholder: string\n working: string\n suggestHelp: string\n more: (count: number) => string\n\n allowOnce: string\n always: string\n deny: string\n yes: string\n noDefault: string\n\n noMatches: string\n pickerHelp: (shown: number, total: number) => string\n\n noModel: string\n busy: string\n sessionFor: (elapsed: string) => string\n workingFor: (elapsed: string) => string\n titleProvider: string\n titleLogout: string\n titleKeyChange: string\n titleSessions: string\n titleSessionAction: string\n resumed: (id: string, count: number) => string\n sessionsEmpty: string\n providerSet: (id: string, model: string) => string\n providersEmpty: string\n sessionSummary: (elapsed: string, turns: number) => string\n providerBalance: (balances: string) => string\n providerKeyRemaining: (balances: string) => string\n noThink: string\n mcpFailed: (count: number) => string\n\n escCancel: string\n escHelp: string\n cancelled: string\n queued: (count: number) => string\n configAt: (path: string) => string\n skillsEmpty: string\n skillsInstallUsage: string\n skillsInstalling: (source: string) => string\n skillsInstalled: (name: string, source: string) => string\n mcpStatus: (connected: number, failed: number) => string\n mcpEmpty: string\n mcpAddUsage: string\n mcpAddInvalidName: string\n mcpAddInvalidUrl: string\n mcpAddHttpArgs: string\n mcpExists: (name: string) => string\n mcpConnecting: (name: string) => string\n mcpAdded: (name: string, tools: number) => string\n mcpAddFailed: (name: string, error: string) => string\n mcpDeleted: (name: string) => string\n mcpDeleteFailed: (name: string, error: string) => string\n mcpNotFound: (name: string) => string\n mcpTools: (count: number) => string\n mcpEnabled: (name: string, tools: number) => string\n mcpDisabled: (name: string) => string\n mcpToggleFailed: (name: string, error: string) => string\n mcpState: Record<string, string>\n activeAgents: (count: number) => string\n subagentsStatus: (count: number) => string\n attachUsage: string\n attachmentAdded: (name: string) => string\n attachmentsCleared: string\n compactNothing: string\n compactStarting: string\n compactDone: (count: number) => string\n sessionRenameUsage: string\n sessionRenamed: (title: string) => string\n sessionDeleteAsk: string\n sessionDeleted: (id: string) => string\n sessionDeleteAllAsk: string\n sessionDeleteAllAskBody: string\n sessionDeleteAllFinalAsk: string\n sessionDeleteAllFinalBody: string\n sessionsDeletedAll: (count: number) => string\n sessionsDeleteAllFailed: (deleted: number, failed: number) => string\n sessionExported: (path: string) => string\n sessionActionResume: string\n sessionActionRename: string\n sessionActionDelete: string\n sessionActionExport: string\n updateAvailable: (version: string, url: string) => string\n accentSet: (name: string, hex: string) => string\n reasoning: (on: boolean) => string\n effortSet: (value: string) => string\n budgetCurrent: (tokens: number) => string\n budgetSet: (tokens: number) => string\n budgetUnlimited: string\n budgetInvalid: string\n modelSet: (value: string) => string\n noModels: string\n bypassOff: string\n bypassAsk1: string\n bypassAsk1Body: string\n bypassAsk2: string\n bypassAsk2Body: string\n bypassCancelled: string\n bypassOn: string\n logoutAsk: (provider: string) => string\n logoutAskBody: string\n loggedOut: (provider: string) => string\n logoutNothing: string\n keyChangeAsk: (provider: string) => string\n keyChangeAskBody: string\n keyChanged: (provider: string) => string\n promptUsage: string\n promptNothing: string\n promptSaved: (name: string) => string\n promptDeleteUsage: string\n promptDeleted: (name: string) => string\n promptNotFound: (name: string) => string\n promptSaveAsk: string\n promptSaveAskBody: string\n promptsEmpty: string\n unknownCommand: (name: string) => string\n didYouMean: (typed: string, guess: string) => string\n undoNothing: string\n undoResult: (restored: number, removed: number) => string\n undoConflicts: (paths: string[]) => string\n undoFailed: (failures: string[]) => string\n\n titleAccent: string\n titleEffort: string\n titleModel: string\n titlePrompts: string\n titleSkills: string\n titleLang: string\n titleMcpDelete: string\n titleMcpEnable: string\n titleMcpDisable: string\n modeLabel: Record<string, string>\n modeChanged: (label: string) => string\n\n cmd: Record<string, string>\n}\n\nconst en: Strings = {\n hint: 'type / for commands',\n noProvider: \"no provider yet — let's add one\",\n\n onboardIntro: 'Paste any OpenAI-compatible or Anthropic base URL, then its API key.',\n onboardExamples: 'e.g. https://openrouter.ai/api/v1 · https://api.anthropic.com',\n baseUrl: 'base url › ',\n apiKey: 'api key › ',\n detecting: 'detecting provider…',\n\n placeholder: 'ask, or / for commands',\n working: 'working…',\n suggestHelp: '↑↓ move · tab complete · enter run',\n more: (count) => `… ${count} more`,\n\n allowOnce: 'allow once',\n always: 'always',\n deny: 'deny',\n yes: 'yes',\n noDefault: 'no (default)',\n\n noMatches: 'no matches',\n pickerHelp: (shown, total) => `${shown} of ${total} · ↑↓ move · enter pick · esc cancel`,\n\n noModel: 'no model',\n busy: 'working',\n sessionFor: (elapsed) => `up ${elapsed}`,\n workingFor: (elapsed) => `working ${elapsed}`,\n titleProvider: 'Provider',\n titleLogout: 'Sign out of a provider',\n titleKeyChange: 'Change API key for a provider',\n titleSessions: 'Resume a session',\n titleSessionAction: 'Session action',\n resumed: (id, count) => `Resumed ${id} — ${count} messages restored`,\n sessionsEmpty: 'No saved sessions yet.',\n providerSet: (id, model) => `Provider: ${id} · model ${model}`,\n providersEmpty: 'No providers configured. Use /login to add one.',\n sessionSummary: (elapsed, turns) => `session ${elapsed} · ${turns} turns`,\n providerBalance: (balances) => `provider balance: ${balances}`,\n providerKeyRemaining: (balances) => `API key limit remaining: ${balances}`,\n noThink: 'no-think',\n mcpFailed: (count) => `mcp:${count} failed`,\n\n escCancel: 'esc to cancel',\n escHelp: 'esc — cancel the running turn',\n cancelled: 'Cancelled.',\n queued: (count) => `queued: ${count}`,\n configAt: (path) => `config: ${path}`,\n skillsEmpty:\n 'No skills installed. Drop a folder with a SKILL.md into ~/.kitcode/skills or ./.kitcode/skills',\n skillsInstallUsage: 'Usage: /skills install <github-url|npm-package|local-path>',\n skillsInstalling: (source) => `Installing skill from \"${source}\"…`,\n skillsInstalled: (name, source) => `Skill \"${name}\" installed from \"${source}\"`,\n mcpStatus: (connected, failed) => `MCP: ${connected} connected, ${failed} failed`,\n mcpEmpty: 'No MCP servers configured.',\n mcpAddUsage:\n 'List: /mcp list · Enable/disable: /mcp enable|disable [name] · Delete: /mcp delete [name]\\nRemote: /mcp add <name> <https://url>\\nLocal: /mcp add <name> -- <command> [args]',\n mcpAddInvalidName: 'MCP name may contain only letters, numbers, _ and - (up to 64 chars).',\n mcpAddInvalidUrl: 'MCP URL must use HTTPS (HTTP is allowed only for localhost).',\n mcpAddHttpArgs: 'An HTTP MCP accepts one URL and no command arguments.',\n mcpExists: (name) => `MCP server \"${name}\" already exists.`,\n mcpConnecting: (name) => `Connecting MCP \"${name}\"…`,\n mcpAdded: (name, tools) => `MCP \"${name}\" connected and saved · ${tools} tools`,\n mcpAddFailed: (name, error) => `Could not add MCP \"${name}\": ${error}`,\n mcpDeleted: (name) => `MCP \"${name}\" disconnected and removed.`,\n mcpDeleteFailed: (name, error) => `Could not remove MCP \"${name}\": ${error}`,\n mcpNotFound: (name) => `MCP server \"${name}\" was not found.`,\n mcpTools: (count) => `${count} tools`,\n mcpEnabled: (name, tools) => `MCP \"${name}\" enabled · ${tools} tools`,\n mcpDisabled: (name) => `MCP \"${name}\" disabled.`,\n mcpToggleFailed: (name, error) => `Could not change MCP \"${name}\": ${error}`,\n mcpState: {\n connected: 'connected',\n connecting: 'connecting',\n error: 'error',\n disabled: 'disabled',\n },\n activeAgents: (count) => `agents: ${count}`,\n subagentsStatus: (count) =>\n count > 0 ? `Active sub-agents: ${count}` : 'No active sub-agents.',\n attachUsage:\n 'Usage: /attach <image-or-text-file> · /attach clipboard · /attach clear',\n attachmentAdded: (name) => `Attached for the next message: ${name}`,\n attachmentsCleared: 'Pending attachments cleared.',\n compactNothing: 'Not enough older conversation to compact yet.',\n compactStarting: 'Compacting context…',\n compactDone: (count) => `Context compacted · ${count} older messages replaced with a summary.`,\n sessionRenameUsage: 'Type the title after the command: /sessions rename <id> <title>',\n sessionRenamed: (title) => `Session renamed to \"${title}\".`,\n sessionDeleteAsk: 'The saved chat file will be deleted. This cannot be undone.',\n sessionDeleted: (id) => `Session ${id} deleted.`,\n sessionDeleteAllAsk: 'Delete every saved chat?',\n sessionDeleteAllAskBody:\n 'All KitCode sessions from every workspace will be permanently deleted.',\n sessionDeleteAllFinalAsk: 'Final confirmation: delete all chats?',\n sessionDeleteAllFinalBody:\n 'This cannot be undone. Press y only if you want to erase the complete session history.',\n sessionsDeletedAll: (count) => `All saved chats deleted · ${count} sessions removed.`,\n sessionsDeleteAllFailed: (deleted, failed) =>\n `Session cleanup was incomplete · ${deleted} removed, ${failed} failed.`,\n sessionExported: (path) => `Session exported to ${path}`,\n sessionActionResume: 'resume',\n sessionActionRename: 'rename',\n sessionActionDelete: 'delete',\n sessionActionExport: 'export Markdown',\n updateAvailable: (version, url) => `A newer KitCode build is available (${version}): ${url}`,\n accentSet: (name, hex) => `Accent: ${name} (${hex})`,\n reasoning: (on) => `Reasoning ${on ? 'on' : 'off'}`,\n effortSet: (value) => `Effort: ${value}`,\n budgetCurrent: (tokens) => `Token budget: ${tokens.toLocaleString()} per turn`,\n budgetSet: (tokens) => `Token budget set to ${tokens.toLocaleString()} per turn`,\n budgetUnlimited: 'Token budget: unlimited (0). Set /budget <tokens> to restore a limit.',\n budgetInvalid: 'Invalid budget: must be between 1,000 and 10,000,000',\n modelSet: (value) => `Model: ${value}`,\n noModels: 'No models available. Use /login to add a provider.',\n bypassOff: 'Approval prompts are back on.',\n bypassAsk1: 'Disable approval prompts for this session?',\n bypassAsk1Body: 'The agent will write files and run shell commands without asking.',\n bypassAsk2: 'Confirm once more.',\n bypassAsk2Body: 'This lasts until you quit. Tools set to \"deny\" in config stay blocked.',\n bypassCancelled: 'Bypass cancelled.',\n bypassOn: 'Bypass on — approvals disabled for this session.',\n logoutAsk: (provider) => `Sign out of \"${provider}\"?`,\n logoutAskBody: 'Its API key is removed from auth.json and the provider is dropped from the config.',\n loggedOut: (provider) => `Signed out of \"${provider}\".`,\n logoutNothing: 'No provider is signed in.',\n keyChangeAsk: (provider) => `Change API key for \"${provider}\"?`,\n keyChangeAskBody: 'The new key replaces the old one. Models are re-fetched automatically.',\n keyChanged: (provider) => `API key updated for \"${provider}\".`,\n promptUsage: 'Usage: /prompt save <name>',\n promptNothing: 'Nothing to save yet — send a message first.',\n promptSaved: (name) => `Saved prompt \"${name}\"`,\n promptDeleteUsage: 'Usage: /prompt delete <name>',\n promptDeleted: (name) => `Deleted prompt \"${name}\"`,\n promptNotFound: (name) => `Prompt \"${name}\" not found.`,\n promptSaveAsk: 'Save this as a prompt?',\n promptSaveAskBody: 'The text will be saved to a file and can be loaded later with /prompt.',\n promptsEmpty: 'No saved prompts. Use /prompt save <name>.',\n unknownCommand: (name) => `Unknown command /${name}. Try /help`,\n didYouMean: (typed, guess) => `Unknown command /${typed}. Did you mean /${guess}?`,\n undoNothing: 'Nothing to undo in this session.',\n undoResult: (restored, removed) =>\n `Undo complete: ${restored} restored, ${removed} newly created removed.`,\n undoConflicts: (paths) =>\n `Kept newer changes in: ${paths.join(', ')}`,\n undoFailed: (failures) => `Could not restore: ${failures.join('; ')}`,\n\n titleAccent: 'Accent colour',\n titleEffort: 'Reasoning depth',\n titleModel: 'Model',\n titlePrompts: 'Saved prompts',\n titleSkills: 'Skill',\n titleLang: 'Language',\n titleMcpDelete: 'Remove an MCP server',\n titleMcpEnable: 'Enable an MCP server',\n titleMcpDisable: 'Disable an MCP server',\n modeLabel: { normal: 'normal', accept: 'auto-accept edits', plan: 'plan only' },\n modeChanged: (label) => `Mode: ${label} (shift+tab to cycle)`,\n\n cmd: {\n model: 'switch model',\n login: 'add a provider (url + key)',\n provider: 'switch between configured providers',\n logout: 'choose a provider to sign out from',\n key: 'change API key for a provider',\n effort: 'set reasoning depth',\n thinking: 'toggle reasoning',\n budget: 'set token budget per turn',\n theme: 'change the accent colour',\n lang: 'change the interface language',\n prompt: 'insert or save a prompt',\n 'prompt save': 'save the current or recent text as a prompt',\n 'prompt delete': 'delete a saved prompt',\n skills: 'list installed skills',\n bypass: 'disable approval prompts (asks twice)',\n usage: 'token and cost breakdown',\n mcp: 'show or add MCP servers',\n 'mcp add': 'connect and save an MCP server',\n 'mcp list': 'list MCP servers and connection status',\n 'mcp delete': 'disconnect and remove an MCP server',\n 'mcp enable': 'enable and connect an MCP server',\n 'mcp disable': 'disconnect without removing an MCP server',\n attach: 'attach an image or text file to the next message',\n compact: 'summarize older context and keep recent turns',\n checker: 'check local setup without spending model tokens',\n sessions: 'search and manage saved sessions',\n 'sessions list': 'list saved sessions',\n 'sessions rename': 'rename a saved session',\n 'sessions delete': 'delete a saved session',\n 'sessions delete all': 'permanently delete every saved chat',\n 'sessions export': 'export a session to Markdown',\n config: 'show where the config lives',\n resume: 'reopen a past chat',\n undo: 'undo file edits from the latest message',\n clear: 'start a fresh session',\n help: 'list commands',\n exit: 'quit',\n subagents: 'show active sub-agents and what they are doing',\n },\n}\n\nconst ru: Strings = {\n hint: 'нажми / для команд',\n noProvider: 'провайдер ещё не добавлен',\n\n onboardIntro: 'Вставь базовый URL любого OpenAI-совместимого или Anthropic API, затем ключ.',\n onboardExamples: 'например https://openrouter.ai/api/v1 · https://api.anthropic.com',\n baseUrl: 'базовый url › ',\n apiKey: 'api-ключ › ',\n detecting: 'определяю провайдера…',\n\n placeholder: 'спроси, или / для команд',\n working: 'работаю…',\n suggestHelp: '↑↓ выбор · tab — дополнить · enter — выполнить',\n more: (count) => `… ещё ${count}`,\n\n allowOnce: 'разрешить один раз',\n always: 'всегда',\n deny: 'отклонить',\n yes: 'да',\n noDefault: 'нет (по умолчанию)',\n\n noMatches: 'ничего не найдено',\n pickerHelp: (shown, total) => `${shown} из ${total} · ↑↓ выбор · enter — ок · esc — отмена`,\n\n noModel: 'нет модели',\n busy: 'работаю',\n sessionFor: (elapsed) => `в работе ${elapsed}`,\n workingFor: (elapsed) => `думает ${elapsed}`,\n titleProvider: 'Провайдер',\n titleLogout: 'Выбрать API для выхода',\n titleKeyChange: 'Сменить ключ провайдера',\n titleSessions: 'Восстановить сессию',\n titleSessionAction: 'Действие с сессией',\n resumed: (id, count) => `Сессия ${id} восстановлена — сообщений: ${count}`,\n sessionsEmpty: 'Сохранённых сессий пока нет.',\n providerSet: (id, model) => `Провайдер: ${id} · модель ${model}`,\n providersEmpty: 'Провайдеров нет. Добавь через /login.',\n sessionSummary: (elapsed, turns) => `сессия ${elapsed} · ходов: ${turns}`,\n providerBalance: (balances) => `баланс провайдера: ${balances}`,\n providerKeyRemaining: (balances) => `остаток лимита API-ключа: ${balances}`,\n noThink: 'без размышлений',\n mcpFailed: (count) => `mcp: ${count} с ошибкой`,\n\n escCancel: 'esc — отменить',\n escHelp: 'esc — отменить текущий ход',\n cancelled: 'Отменено.',\n queued: (count) => `в очереди: ${count}`,\n configAt: (path) => `конфиг: ${path}`,\n skillsEmpty:\n 'Скиллов нет. Положи папку с файлом SKILL.md в ~/.kitcode/skills или ./.kitcode/skills',\n skillsInstallUsage: 'Использование: /skills install <github-url|npm-пакет|локальный-путь>',\n skillsInstalling: (source) => `Устанавливаю скилл из \"${source}\"…`,\n skillsInstalled: (name, source) => `Скилл «${name}» установлен из \"${source}\"`,\n mcpStatus: (connected, failed) => `MCP: подключено ${connected}, с ошибкой ${failed}`,\n mcpEmpty: 'MCP-серверы пока не добавлены.',\n mcpAddUsage:\n 'Список: /mcp list · Вкл/выкл: /mcp enable|disable [имя] · Удалить: /mcp delete [имя]\\nУдалённый: /mcp add <имя> <https://url>\\nЛокальный: /mcp add <имя> -- <команда> [аргументы]',\n mcpAddInvalidName: 'Имя MCP: только буквы, цифры, _ и - (до 64 символов).',\n mcpAddInvalidUrl: 'URL MCP должен использовать HTTPS (HTTP разрешён только для localhost).',\n mcpAddHttpArgs: 'Для HTTP MCP укажи один URL без аргументов команды.',\n mcpExists: (name) => `MCP-сервер «${name}» уже существует.`,\n mcpConnecting: (name) => `Подключаю MCP «${name}»…`,\n mcpAdded: (name, tools) => `MCP «${name}» подключён и сохранён · инструментов: ${tools}`,\n mcpAddFailed: (name, error) => `Не удалось добавить MCP «${name}»: ${error}`,\n mcpDeleted: (name) => `MCP «${name}» отключён и удалён.`,\n mcpDeleteFailed: (name, error) => `Не удалось удалить MCP «${name}»: ${error}`,\n mcpNotFound: (name) => `MCP-сервер «${name}» не найден.`,\n mcpTools: (count) => `инструментов: ${count}`,\n mcpEnabled: (name, tools) => `MCP «${name}» включён · инструментов: ${tools}`,\n mcpDisabled: (name) => `MCP «${name}» выключен.`,\n mcpToggleFailed: (name, error) => `Не удалось изменить MCP «${name}»: ${error}`,\n mcpState: {\n connected: 'подключён',\n connecting: 'подключается',\n error: 'ошибка',\n disabled: 'отключён',\n },\n activeAgents: (count) => `агентов: ${count}`,\n subagentsStatus: (count) =>\n count > 0 ? `Активных суб-агентов: ${count}` : 'Нет активных суб-агентов.',\n attachUsage:\n 'Использование: /attach <картинка-или-текстовый-файл> · /attach clipboard · /attach clear',\n attachmentAdded: (name) => `Прикреплено к следующему сообщению: ${name}`,\n attachmentsCleared: 'Ожидающие вложения убраны.',\n compactNothing: 'Пока недостаточно старых сообщений для сжатия контекста.',\n compactStarting: 'Сжатие контекста…',\n compactDone: (count) => `Контекст сжат · старых сообщений заменено сводкой: ${count}.`,\n sessionRenameUsage: 'Допиши название: /sessions rename <id> <название>',\n sessionRenamed: (title) => `Сессия переименована в «${title}».`,\n sessionDeleteAsk: 'Файл сохранённого чата будет удалён без возможности восстановления.',\n sessionDeleted: (id) => `Сессия ${id} удалена.`,\n sessionDeleteAllAsk: 'Удалить вообще все сохранённые чаты?',\n sessionDeleteAllAskBody:\n 'Будут навсегда удалены все сессии KitCode из всех рабочих папок.',\n sessionDeleteAllFinalAsk: 'Последнее подтверждение: точно удалить все чаты?',\n sessionDeleteAllFinalBody:\n 'Это нельзя отменить. Нажимай y только если хочешь стереть всю историю сессий.',\n sessionsDeletedAll: (count) => `Все сохранённые чаты удалены · сессий: ${count}.`,\n sessionsDeleteAllFailed: (deleted, failed) =>\n `Удаление завершено не полностью · удалено: ${deleted}, ошибок: ${failed}.`,\n sessionExported: (path) => `Сессия экспортирована: ${path}`,\n sessionActionResume: 'открыть',\n sessionActionRename: 'переименовать',\n sessionActionDelete: 'удалить',\n sessionActionExport: 'экспортировать Markdown',\n updateAvailable: (version, url) => `Доступна новая версия KitCode (${version}): ${url}`,\n accentSet: (name, hex) => `Цвет: ${name} (${hex})`,\n reasoning: (on) => `Размышления ${on ? 'включены' : 'выключены'}`,\n effortSet: (value) => `Глубина: ${value}`,\n budgetCurrent: (tokens) => `Лимит токенов: ${tokens.toLocaleString()} за ход`,\n budgetSet: (tokens) => `Лимит токенов установлен: ${tokens.toLocaleString()} за ход`,\n budgetUnlimited: 'Лимит токенов: безлимитный (0). Введи /budget <число> чтобы вернуть лимит.',\n budgetInvalid: 'Неверный лимит: от 1 000 до 10 000 000',\n modelSet: (value) => `Модель: ${value}`,\n noModels: 'Моделей нет. Добавь провайдера через /login.',\n bypassOff: 'Подтверждения снова включены.',\n bypassAsk1: 'Отключить подтверждения на эту сессию?',\n bypassAsk1Body: 'Агент будет писать файлы и запускать команды без спроса.',\n bypassAsk2: 'Подтверди ещё раз.',\n bypassAsk2Body: 'Действует до выхода. Инструменты с «deny» в конфиге останутся заблокированы.',\n bypassCancelled: 'Отменено.',\n bypassOn: 'Байпас включён — подтверждения отключены до конца сессии.',\n logoutAsk: (provider) => `Выйти из «${provider}»?`,\n logoutAskBody: 'Ключ будет удалён из auth.json, а провайдер — из конфига.',\n loggedOut: (provider) => `Выполнен выход из «${provider}».`,\n logoutNothing: 'Ни один провайдер не подключён.',\n keyChangeAsk: (provider) => `Сменить ключ для «${provider}»?`,\n keyChangeAskBody: 'Новый ключ заменит старый. Модели обновятся автоматически.',\n keyChanged: (provider) => `Ключ обновлён для «${provider}».`,\n promptUsage: 'Использование: /prompt save <имя>',\n promptNothing: 'Пока нечего сохранять — сначала отправь сообщение.',\n promptSaved: (name) => `Промт «${name}» сохранён`,\n promptDeleteUsage: 'Использование: /prompt delete <имя>',\n promptDeleted: (name) => `Промт «${name}» удалён`,\n promptNotFound: (name) => `Промт «${name}» не найден.`,\n promptSaveAsk: 'Сохранить как промт?',\n promptSaveAskBody: 'Текст будет сохранён в файл и его можно будет загрузить позже через /prompt.',\n promptsEmpty: 'Сохранённых промтов нет. Используй /prompt save <имя>.',\n unknownCommand: (name) => `Неизвестная команда /${name}. Попробуй /help`,\n didYouMean: (typed, guess) => `Неизвестная команда /${typed}. Может быть /${guess}?`,\n undoNothing: 'В этой сессии пока нечего откатывать.',\n undoResult: (restored, removed) =>\n `Откат завершён: восстановлено ${restored}, удалено новых файлов ${removed}.`,\n undoConflicts: (paths) =>\n `Более свежие изменения сохранены в: ${paths.join(', ')}`,\n undoFailed: (failures) => `Не удалось восстановить: ${failures.join('; ')}`,\n\n titleAccent: 'Цвет акцента',\n titleEffort: 'Глубина размышлений',\n titleModel: 'Модель',\n titlePrompts: 'Сохранённые промты',\n titleSkills: 'Скиллы',\n titleLang: 'Язык',\n titleMcpDelete: 'Удалить MCP-сервер',\n titleMcpEnable: 'Включить MCP-сервер',\n titleMcpDisable: 'Выключить MCP-сервер',\n modeLabel: { normal: 'обычный', accept: 'правки без спроса', plan: 'только план' },\n modeChanged: (label) => `Режим: ${label} (shift+tab — переключить)`,\n\n cmd: {\n model: 'сменить модель',\n login: 'добавить провайдера (url + ключ)',\n provider: 'переключиться между провайдерами',\n logout: 'выбрать провайдера и удалить его ключ',\n key: 'сменить ключ провайдера',\n effort: 'глубина размышлений',\n thinking: 'включить/выключить размышления',\n budget: 'лимит токенов за ход (0 = безлимит)',\n theme: 'сменить цвет акцента',\n lang: 'сменить язык интерфейса',\n prompt: 'вставить или сохранить промт',\n skills: 'список установленных скиллов',\n bypass: 'отключить подтверждения (спросит дважды)',\n usage: 'токены и стоимость',\n mcp: 'показать или добавить MCP-сервер',\n 'mcp add': 'подключить и сохранить MCP-сервер',\n 'mcp list': 'список MCP-серверов и их статус',\n 'mcp delete': 'отключить и удалить MCP-сервер',\n 'mcp enable': 'включить и подключить MCP-сервер',\n 'mcp disable': 'отключить MCP без удаления',\n attach: 'прикрепить картинку или текстовый файл к сообщению',\n compact: 'сжать старый контекст, сохранив последние ходы',\n checker: 'проверить настройку без траты токенов модели',\n sessions: 'поиск и управление сохранёнными сессиями',\n 'sessions list': 'список сохранённых сессий',\n 'sessions rename': 'переименовать сессию',\n 'sessions delete': 'удалить сессию',\n 'sessions delete all': 'навсегда удалить все сохранённые чаты',\n 'sessions export': 'экспортировать сессию в Markdown',\n config: 'где лежит конфиг',\n resume: 'открыть прошлый чат',\n undo: 'откатить правки файлов из последнего сообщения',\n clear: 'начать новую сессию',\n help: 'список команд',\n exit: 'выход',\n subagents: 'показать активных суб-агентов и чем заняты',\n },\n}\n\nconst DICTIONARIES: Record<Lang, Strings> = { en, ru }\n\nexport function stringsFor(lang: Lang | undefined): Strings {\n return DICTIONARIES[lang ?? 'en']\n}\n\nexport const StringsContext = createContext<Strings>(en)\n\nexport function useStrings(): Strings {\n return useContext(StringsContext)\n}\n","import { Box, Text } from 'ink'\nimport { useState } from 'react'\nimport { LANGS } from '../i18n'\nimport type { Lang } from '../i18n'\nimport { useTheme } from '../theme'\nimport { useTerminalInput } from '../input'\nimport { Logo } from './Logo'\n\nexport function LanguagePicker({ onPick }: { onPick(lang: Lang): void }) {\n const theme = useTheme()\n const [cursor, setCursor] = useState(0)\n\n useTerminalInput((char, key) => {\n if (key.upArrow) return setCursor((index) => Math.max(0, index - 1))\n if (key.downArrow) return setCursor((index) => Math.min(LANGS.length - 1, index + 1))\n if (key.return) return onPick(LANGS[cursor]?.key ?? 'en')\n const digit = Number.parseInt(char, 10)\n if (digit >= 1 && digit <= LANGS.length) onPick(LANGS[digit - 1]?.key ?? 'en')\n })\n\n return (\n <Box flexDirection=\"column\">\n <Logo subtitle=\"language · язык\" />\n {LANGS.map((lang, index) => (\n <Text\n key={lang.key}\n color={index === cursor ? theme.accent : undefined}\n inverse={index === cursor}\n >\n {index + 1}. {lang.label}\n </Text>\n ))}\n <Text dimColor>↑↓ · enter</Text>\n </Box>\n )\n}\n","import { Box, Text, useWindowSize } from 'ink'\r\nimport { useStrings } from '../i18n'\r\nimport { useTheme } from '../theme'\r\nimport { formatWorkspacePath } from '../workspace'\r\nimport { KITCODE_VERSION } from '../../version'\r\n\r\nconst CAT = [' ╱\\\\_╱\\\\ ', ' ( o.o )', ' > ^ < ']\r\n\r\nexport function Logo({ subtitle, workspace }: { subtitle?: string; workspace?: string }) {\r\n const theme = useTheme()\r\n const strings = useStrings()\r\n const { columns } = useWindowSize()\r\n const location = workspace\r\n ? formatWorkspacePath(workspace, Math.max(6, Math.min(72, columns - 15)))\r\n : ''\r\n\r\n return (\r\n <Box width=\"100%\" marginBottom={1}>\r\n <Box flexDirection=\"column\" flexShrink={0}>\r\n {CAT.map((line) => (\r\n <Text key={line} color={theme.accent}>\r\n {line}\r\n </Text>\r\n ))}\r\n </Box>\r\n <Box flexDirection=\"column\" marginLeft={2} flexGrow={1} flexShrink={1} minWidth={0}>\r\n <Box>\r\n <Text color={theme.accent} bold>\r\n kitcode\r\n </Text>\r\n <Text dimColor> v{KITCODE_VERSION}</Text>\r\n </Box>\r\n <Text dimColor wrap=\"truncate-end\">{subtitle ?? strings.hint}</Text>\r\n {location && (\r\n <Box width=\"100%\">\r\n <Text color={theme.accent}>⌂ </Text>\r\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\r\n <Text dimColor wrap=\"truncate-start\">{location}</Text>\r\n </Box>\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n )\r\n}\r\n","import { homedir } from 'node:os'\nimport { sanitizeTerminalText } from './sanitize'\n\nexport function formatWorkspacePath(\n value: string,\n maxWidth: number,\n home = homedir(),\n): string {\n const width = Math.max(1, Math.floor(maxWidth))\n const safe = oneLine(value)\n if (!safe) return ''\n\n const safeHome = oneLine(home).replace(/[\\\\/]+$/, '')\n const display = isInsideHome(safe, safeHome) ? `~${safe.slice(safeHome.length)}` : safe\n if (characters(display).length <= width) return display\n if (width === 1) return '…'\n\n const separator = display.includes('\\\\') && !display.includes('/') ? '\\\\' : '/'\n const parts = display.split(/[\\\\/]+/).filter(Boolean)\n if (parts.length === 0) return tail(display, width)\n\n const prefix = `…${separator}`\n const available = width - characters(prefix).length\n if (available <= 0) return tail(prefix, width)\n\n let result = parts.at(-1) ?? ''\n if (characters(result).length > available) return `${prefix}${tail(result, available)}`\n\n for (let index = parts.length - 2; index >= 0; index -= 1) {\n const candidate = `${parts[index]}${separator}${result}`\n if (characters(prefix + candidate).length > width) break\n result = candidate\n }\n return `${prefix}${result}`\n}\n\nfunction oneLine(value: string): string {\n return sanitizeTerminalText(value).replace(/[\\t\\r\\n]+/g, ' ').trim()\n}\n\nfunction isInsideHome(value: string, home: string): boolean {\n if (!home) return false\n return value === home || value.startsWith(`${home}/`) || value.startsWith(`${home}\\\\`)\n}\n\nfunction characters(value: string): string[] {\n return [...value]\n}\n\nfunction tail(value: string, width: number): string {\n return characters(value).slice(-width).join('')\n}\n","import { Box, Text } from 'ink'\nimport Spinner from 'ink-spinner'\nimport TextInput from 'ink-text-input'\nimport { useState } from 'react'\nimport { useStrings } from '../i18n'\nimport { useTheme } from '../theme'\nimport { sanitizeTerminalText } from '../sanitize'\nimport { Logo } from './Logo'\n\ntype Step = 'url' | 'key' | 'working'\n\nexport function Onboarding({ onSubmit }: { onSubmit(url: string, key: string): Promise<string> }) {\n const theme = useTheme()\n const strings = useStrings()\n const [step, setStep] = useState<Step>('url')\n const [url, setUrl] = useState('')\n const [key, setKey] = useState('')\n const [error, setError] = useState('')\n\n const submitKey = async (value: string) => {\n if (value.trim() === '') return\n setStep('working')\n setError('')\n try {\n await onSubmit(url.trim(), value.trim())\n } catch (cause) {\n setError(sanitizeTerminalText(cause instanceof Error ? cause.message : String(cause)))\n setKey('')\n setStep('key')\n }\n }\n\n return (\n <Box flexDirection=\"column\">\n <Logo subtitle={strings.noProvider} />\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text dimColor>{strings.onboardIntro}</Text>\n <Text dimColor>{strings.onboardExamples}</Text>\n </Box>\n\n {error !== '' && (\n <Box marginBottom={1}>\n <Text color={theme.error}>{error}</Text>\n </Box>\n )}\n\n {step === 'url' && (\n <Box>\n <Text color={theme.accent}>{strings.baseUrl}</Text>\n <TextInput\n value={url}\n onChange={setUrl}\n onSubmit={(value) => value.trim() !== '' && setStep('key')}\n placeholder=\"https://…\"\n />\n </Box>\n )}\n\n {step === 'key' && (\n <Box flexDirection=\"column\">\n <Text dimColor>{sanitizeTerminalText(url)}</Text>\n <Box>\n <Text color={theme.accent}>{strings.apiKey}</Text>\n <TextInput value={key} onChange={setKey} onSubmit={submitKey} mask=\"•\" />\n </Box>\n </Box>\n )}\n\n {step === 'working' && (\n <Text color={theme.accent}>\n <Spinner type=\"dots\" /> {strings.detecting}\n </Text>\n )}\n </Box>\n )\n}\n","import { Box, Text } from 'ink'\nimport { normalizeHotkey } from '../layout'\nimport { useTerminalInput } from '../input'\nimport { useStrings } from '../i18n'\nimport { useTheme } from '../theme'\nimport type { PermissionPromptProps } from '../types'\nimport { sanitizeTerminalText } from '../sanitize'\nimport { Diff } from './Diff'\n\nconst MAX_PREVIEW_CHARS = 20_000\n\nexport function PermissionPrompt({ request, onDecide }: PermissionPromptProps) {\n const theme = useTheme()\n const strings = useStrings()\n useTerminalInput((char, key) => {\n const c = normalizeHotkey(char)\n if (c === 'y') onDecide('once')\n else if (c === 'a' && request.allowAlways !== false) onDecide('always')\n else if (c === 'n' || key.escape || key.return) onDecide('deny')\n })\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.warn} paddingX={1}>\n <Text bold color={theme.warn}>\n {sanitizeTerminalText(request.summary)}\n </Text>\n\n {request.display?.kind === 'diff' && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>{sanitizeTerminalText(request.display.path)}</Text>\n <Diff before={request.display.before} after={request.display.after} />\n </Box>\n )}\n\n {request.display?.kind === 'text' && (\n <Text dimColor>{previewText(request.display.text)}</Text>\n )}\n\n {request.display?.kind === 'list' && (\n <Box flexDirection=\"column\">\n <Text dimColor>{sanitizeTerminalText(request.display.title)}</Text>\n {request.display.items.slice(0, 100).map((item, index) => (\n <Text key={index} dimColor>• {previewText(item, 1_000)}</Text>\n ))}\n </Box>\n )}\n\n {!request.display && <Text dimColor>{printInput(request.input)}</Text>}\n\n <Box marginTop={1}>\n <Text>\n <Text bold>y</Text> {strings.allowOnce} ·{' '}\n {request.allowAlways !== false && (\n <><Text bold>a</Text> {strings.always} ({sanitizeTerminalText(request.toolName)}) · </>\n )}\n <Text bold>n</Text> {strings.deny}\n </Text>\n </Box>\n </Box>\n )\n}\n\nfunction printInput(input: unknown): string {\n try {\n return previewText(JSON.stringify(input, null, 2))\n } catch {\n return previewText(input)\n }\n}\n\nfunction previewText(value: unknown, limit = MAX_PREVIEW_CHARS): string {\n const safe = sanitizeTerminalText(value)\n return safe.length > limit ? `${safe.slice(0, limit)}\\n... preview truncated` : safe\n}\n","import { Box, Text } from 'ink'\nimport { canRenderDiff, diffLines, MAX_RENDER_DIFF_CHARS, type DiffLine, truncate } from '../diff'\nimport { sanitizeTerminalText } from '../sanitize'\n\nexport function Diff({ before, after }: { before: string; after: string }) {\n if (!canRenderDiff(before, after)) {\n return (\n <Text dimColor>\n Diff preview omitted: it exceeds {MAX_RENDER_DIFF_CHARS.toLocaleString()} characters.\n </Text>\n )\n }\n const { hunk, hidden } = diffLines(sanitizeTerminalText(before), sanitizeTerminalText(after))\n return <DiffHunk lines={hunk} hidden={hidden} />\n}\n\nexport function DiffHunk({ lines, hidden }: { lines: DiffLine[]; hidden: number }) {\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, index) => (\n <Text\n key={index}\n color={line.kind === 'add' ? 'green' : line.kind === 'del' ? 'red' : 'gray'}\n dimColor={line.kind === 'ctx'}\n >\n {line.kind === 'add' ? '+ ' : line.kind === 'del' ? '- ' : ' '}\n {truncate(sanitizeTerminalText(line.text), 110)}\n </Text>\n ))}\n {hidden > 0 && <Text dimColor> … {hidden} more lines</Text>}\n </Box>\n )\n}\n","export interface DiffLine {\n kind: 'add' | 'del' | 'ctx'\n text: string\n}\n\nexport interface DiffResult {\n hunk: DiffLine[]\n hidden: number\n \n added: number\n \n removed: number\n}\n\nexport const MAX_RENDER_DIFF_CHARS = 500_000\n\nexport function canRenderDiff(before: string, after: string): boolean {\n return before.length + after.length <= MAX_RENDER_DIFF_CHARS\n}\n\nexport function diffLines(\n before: string,\n after: string,\n maxLines = 20,\n): DiffResult {\n const { added, removed, hunk } = diffBody(before, after)\n if (hunk.length <= maxLines) return { hunk, hidden: 0, added, removed }\n return { hunk: hunk.slice(0, maxLines), hidden: hunk.length - maxLines, added, removed }\n}\n\nexport function diffCounts(\n before: string,\n after: string,\n): { added: number; removed: number } {\n return diffBody(before, after)\n}\n\nfunction diffBody(\n before: string,\n after: string,\n): { added: number; removed: number; hunk: DiffLine[] } {\n const a = before === '' ? [] : before.split('\\n')\n const b = after === '' ? [] : after.split('\\n')\n\n let start = 0\n while (start < a.length && start < b.length && a[start] === b[start]) start += 1\n\n let endA = a.length\n let endB = b.length\n while (endA > start && endB > start && a[endA - 1] === b[endB - 1]) {\n endA -= 1\n endB -= 1\n }\n\n const hunk: DiffLine[] = []\n let added = 0\n let removed = 0\n for (let i = Math.max(0, start - 2); i < start; i += 1) {\n hunk.push({ kind: 'ctx', text: a[i] ?? '' })\n }\n for (let i = start; i < endA; i += 1) {\n hunk.push({ kind: 'del', text: a[i] ?? '' })\n removed += 1\n }\n for (let i = start; i < endB; i += 1) {\n hunk.push({ kind: 'add', text: b[i] ?? '' })\n added += 1\n }\n for (let i = endA; i < Math.min(a.length, endA + 2); i += 1) {\n hunk.push({ kind: 'ctx', text: a[i] ?? '' })\n }\n return { added, removed, hunk }\n}\n\nexport function truncate(text: string, width: number): string {\n return text.length <= width ? text : `${text.slice(0, width - 1)}…`\n}\n","import { Box, Text } from 'ink'\nimport { useMemo, useState } from 'react'\nimport { truncate } from '../diff'\nimport { useStrings } from '../i18n'\nimport { useTerminalInput } from '../input'\nimport { useTheme } from '../theme'\nimport { sanitizeTerminalText } from '../sanitize'\nimport type { PickerProps } from '../types'\n\nconst WINDOW = 10\n\nexport function Picker({ title, items, onSelect, onCancel }: PickerProps) {\n const theme = useTheme()\n const strings = useStrings()\n const [query, setQuery] = useState('')\n const [cursor, setCursor] = useState(0)\n\n const matches = useMemo(() => {\n const needle = query.toLowerCase()\n if (needle === '') return items\n return items.filter((item) =>\n `${item.label} ${item.hint ?? ''}`.toLowerCase().includes(needle),\n )\n }, [items, query])\n\n const active = Math.min(cursor, Math.max(0, matches.length - 1))\n\n useTerminalInput((char, key) => {\n if (key.escape) return onCancel()\n if (key.return) {\n const chosen = matches[active]\n return chosen ? onSelect(chosen.key) : onCancel()\n }\n if (key.upArrow) return setCursor(Math.max(0, active - 1))\n if (key.downArrow) return setCursor(Math.min(matches.length - 1, active + 1))\n if (key.backspace || key.delete) {\n setCursor(0)\n return setQuery((q) => q.slice(0, -1))\n }\n if (char && !key.ctrl && !key.meta) {\n setCursor(0)\n setQuery((q) => sanitizeTerminalText(q + char))\n }\n })\n\n const start = Math.max(0, Math.min(active - WINDOW + 2, matches.length - WINDOW))\n const visible = matches.slice(start, start + WINDOW)\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.accent} paddingX={1}>\n <Text bold color={theme.accent}>\n {sanitizeTerminalText(title)}\n {query !== '' && <Text dimColor> / {sanitizeTerminalText(query)}</Text>}\n </Text>\n\n {matches.length === 0 ? (\n <Text dimColor>{strings.noMatches}</Text>\n ) : (\n visible.map((item, index) => {\n const selected = start + index === active\n return (\n <Text key={item.key} color={selected ? theme.accent : undefined} inverse={selected}>\n {truncate(sanitizeTerminalText(item.label), 70)}\n {item.hint && (\n <Text dimColor> {truncate(sanitizeTerminalText(item.hint), 34)}</Text>\n )}\n </Text>\n )\n })\n )}\n\n <Text dimColor>\n {strings.pickerHelp(matches.length, items.length)}\n </Text>\n </Box>\n )\n}\n","import { Box, Text } from 'ink'\nimport type { Key } from 'ink'\nimport { memo, useEffect, useRef, useState } from 'react'\nimport { looksLikeAttachmentPath } from '../../core/attachments'\nimport { matchCommands } from '../commands'\nimport { moveInputHistory } from '../history'\nimport { useStrings } from '../i18n'\nimport { useTerminalInput, useTerminalPaste } from '../input'\nimport { useTheme } from '../theme'\nimport { sanitizeTerminalText } from '../sanitize'\nimport type { PromptInputProps } from '../types'\n\nconst WINDOW = 6\n\nexport const PromptInput = memo(function PromptInput({\n value,\n onChange,\n onSubmit,\n onPastePath,\n onPasteImage,\n disabled,\n pending,\n hint,\n history,\n attachments = [],\n}: PromptInputProps) {\n const theme = useTheme()\n const strings = useStrings()\n const safeValue = sanitizeTerminalText(value)\n const [selectionCursor, setSelectionCursor] = useState(0)\n const [inputCursor, setInputCursor] = useState(() => characters(safeValue).length)\n const [historyIndex, setHistoryIndex] = useState<number | null>(null)\n const historyDraft = useRef('')\n const pendingValue = useRef<string | null>(null)\n const valueRef = useRef(safeValue)\n const cursorRef = useRef(inputCursor)\n valueRef.current = safeValue\n cursorRef.current = inputCursor\n\n const suggestions = matchCommands(safeValue)\n const open = suggestions.length > 0\n const active = Math.min(selectionCursor, Math.max(0, suggestions.length - 1))\n\n useEffect(() => {\n setSelectionCursor(0)\n }, [safeValue])\n\n useEffect(() => {\n const length = characters(safeValue).length\n if (pendingValue.current === safeValue) {\n pendingValue.current = null\n setInputCursor((cursor) => clamp(cursor, 0, length))\n return\n }\n \n \n setInputCursor(length)\n }, [safeValue])\n\n const change = (next: string, cursor = characters(next).length) => {\n next = sanitizeTerminalText(next)\n const nextCursor = clamp(cursor, 0, characters(next).length)\n pendingValue.current = next\n valueRef.current = next\n cursorRef.current = nextCursor\n setInputCursor(nextCursor)\n setHistoryIndex(null)\n historyDraft.current = next\n onChange(next)\n }\n\n const submit = (next: string) => {\n setHistoryIndex(null)\n historyDraft.current = ''\n onSubmit(next)\n }\n\n const insertPastedText = (pasted: string) => {\n const inserted = characters(sanitizeTerminalText(pasted))\n if (inserted.length === 0) return\n const valueCharacters = characters(valueRef.current)\n const cursor = clamp(cursorRef.current, 0, valueCharacters.length)\n valueCharacters.splice(cursor, 0, ...inserted)\n change(valueCharacters.join(''), cursor + inserted.length)\n }\n\n useTerminalPaste((pasted) => {\n const safePaste = sanitizeTerminalText(pasted)\n if (onPastePath && looksLikeAttachmentPath(safePaste)) {\n void onPastePath(safePaste).then((consumed) => {\n if (!consumed) insertPastedText(safePaste)\n })\n return\n }\n insertPastedText(safePaste)\n })\n\n useTerminalInput((input, key) => {\n if (\n onPasteImage &&\n (key.ctrl || key.meta || key.super) &&\n (input.toLowerCase() === 'v' || input === '\\u0016')\n ) {\n onPasteImage()\n return\n }\n if (open && key.upArrow) {\n setSelectionCursor(Math.max(0, active - 1))\n return\n }\n if (open && key.downArrow) {\n setSelectionCursor(Math.min(suggestions.length - 1, active + 1))\n return\n }\n if (open && key.tab && !key.shift) {\n const chosen = suggestions[active]\n if (chosen) change(`/${chosen.name} `)\n return\n }\n if (open && key.return) {\n const chosen = suggestions[active]\n if (chosen) submit(`/${chosen.name}`)\n return\n }\n\n if (!open && (key.upArrow || key.downArrow)) {\n const moved = moveInputHistory(\n history,\n historyIndex,\n safeValue,\n historyDraft.current,\n key.upArrow ? 'previous' : 'next',\n )\n historyDraft.current = moved.draft\n setHistoryIndex(moved.index)\n setInputCursor(characters(moved.value).length)\n if (moved.value !== safeValue) {\n pendingValue.current = moved.value\n onChange(moved.value)\n }\n return\n }\n\n if (key.tab || key.upArrow || key.downArrow || key.escape || key.pageUp || key.pageDown) {\n return\n }\n if (key.return) {\n submit(safeValue)\n return\n }\n\n const valueCharacters = characters(safeValue)\n const cursor = clamp(inputCursor, 0, valueCharacters.length)\n if (key.leftArrow || key.rightArrow || key.home || key.end) {\n setInputCursor(nextCursor(cursor, valueCharacters.length, key))\n return\n }\n if (key.backspace) {\n if (cursor > 0) {\n valueCharacters.splice(cursor - 1, 1)\n change(valueCharacters.join(''), cursor - 1)\n }\n return\n }\n if (key.delete) {\n if (cursor < valueCharacters.length) {\n valueCharacters.splice(cursor, 1)\n change(valueCharacters.join(''), cursor)\n }\n return\n }\n if (input === '' || key.ctrl || key.meta) return\n\n const inserted = characters(sanitizeTerminalText(input))\n if (inserted.length === 0) return\n valueCharacters.splice(cursor, 0, ...inserted)\n change(valueCharacters.join(''), cursor + inserted.length)\n })\n\n const start = Math.max(0, Math.min(active - WINDOW + 2, suggestions.length - WINDOW))\n const visible = suggestions.slice(start, start + WINDOW)\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box\n width=\"100%\"\n borderStyle=\"round\"\n borderColor={disabled ? theme.warn : theme.accent}\n borderDimColor={disabled}\n paddingX={1}\n >\n <Text color={disabled ? 'gray' : theme.accent}>› </Text>\n {}\n <EditableText value={safeValue} cursor={inputCursor} placeholder={strings.placeholder} />\n {pending && pending > 0 ? <Text dimColor> · {strings.queued(pending)}</Text> : null}\n </Box>\n\n {attachments.length > 0 && (\n <Text dimColor>\n {' '}📎 {attachments.map(sanitizeTerminalText).join(' · ')}\n </Text>\n )}\n\n {disabled && hint && <Text dimColor> {sanitizeTerminalText(hint)}</Text>}\n\n {open && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {visible.map((command, index) => {\n const selected = start + index === active\n return (\n <Text key={command.name} color={selected ? theme.accent : undefined} dimColor={!selected}>\n {selected ? '❯ ' : ' '}/{command.name}\n {command.args ? ` ${command.args}` : ''}\n <Text dimColor> — {strings.cmd[command.name] ?? ''}</Text>\n </Text>\n )\n })}\n {suggestions.length > visible.length && (\n <Text dimColor>{strings.more(suggestions.length - visible.length)}</Text>\n )}\n <Text dimColor>{strings.suggestHelp}</Text>\n </Box>\n )}\n </Box>\n )\n})\n\nfunction EditableText({\n value,\n cursor,\n placeholder,\n}: {\n value: string\n cursor: number\n placeholder: string\n}) {\n const valueCharacters = characters(value)\n const at = clamp(cursor, 0, valueCharacters.length)\n if (valueCharacters.length === 0) {\n const placeholderCharacters = characters(sanitizeTerminalText(placeholder))\n return (\n <Text>\n <Text inverse>{placeholderCharacters[0] ?? ' '}</Text>\n <Text color=\"gray\">{placeholderCharacters.slice(1).join('')}</Text>\n </Text>\n )\n }\n\n return (\n <Text>\n {valueCharacters.slice(0, at).join('')}\n <Text inverse>{valueCharacters[at] ?? ' '}</Text>\n {valueCharacters.slice(at + 1).join('')}\n </Text>\n )\n}\n\nfunction nextCursor(cursor: number, length: number, key: Key): number {\n if (key.home) return 0\n if (key.end) return length\n if (key.leftArrow) return Math.max(0, cursor - 1)\n if (key.rightArrow) return Math.min(length, cursor + 1)\n return cursor\n}\n\nfunction characters(value: string): string[] {\n return [...value]\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, max))\n}\n","export interface HistoryMove {\n index: number | null\n value: string\n draft: string\n}\n\nexport function moveInputHistory(\n history: string[],\n index: number | null,\n value: string,\n draft: string,\n direction: 'previous' | 'next',\n): HistoryMove {\n if (history.length === 0) return { index, value, draft }\n\n if (direction === 'previous') {\n const nextIndex = index === null ? history.length - 1 : Math.max(0, index - 1)\n return {\n index: nextIndex,\n value: history[nextIndex] ?? value,\n draft: index === null ? value : draft,\n }\n }\n\n if (index === null) return { index, value, draft }\n if (index < history.length - 1) {\n const nextIndex = index + 1\n return { index: nextIndex, value: history[nextIndex] ?? value, draft }\n }\n return { index: null, value: draft, draft }\n}\n\nexport function appendInputHistory(history: string[], value: string, limit = 100): string[] {\n const text = value.trim()\n if (!text || history.at(-1) === text) return history\n return [...history, text].slice(-limit)\n}\n","import { Box, Text } from 'ink'\nimport { Fragment } from 'react'\nimport type { ReactNode } from 'react'\nimport { dollars } from '../../core/usage'\nimport type { Effort } from '../../providers/types'\nimport { useStrings } from '../i18n'\nimport { useTheme } from '../theme'\nimport { formatDuration } from '../time'\nimport { sanitizeTerminalText } from '../sanitize'\nimport type { StatusBarProps } from '../types'\n\nconst BAR_WIDTH = 12\n\nexport function StatusBar({ status }: StatusBarProps) {\n const theme = useTheme()\n const strings = useStrings()\n\n const primary: ReactNode[] = []\n const details: ReactNode[] = []\n\n primary.push(<ModelBadge key=\"model\" ref={status.modelRef} />)\n primary.push(<EffortLabel key=\"effort\" effort={status.effort} />)\n if (!status.thinking) {\n details.push(\n <Text key=\"think\" color={theme.warn}>\n {strings.noThink}\n </Text>,\n )\n }\n if (status.mode !== 'normal') {\n const modeColor = status.mode === 'accept' ? 'yellow' : status.mode === 'plan' ? 'blue' : theme.accent\n details.push(\n <Text key=\"mode\" color={modeColor}>\n {strings.modeLabel[status.mode] ?? status.mode}\n </Text>,\n )\n }\n\n if (status.usage) {\n const u = status.usage\n details.push(\n <Text key=\"usage\">\n <Text color=\"white\" bold>{u.input}</Text>\n <Text dimColor> ↑ </Text>\n <Text color={theme.ok}>{u.output}</Text>\n <Text dimColor> ↓</Text>\n {u.cache && (\n <>\n <Text dimColor> (</Text>\n <Text color=\"gray\">{u.cache} cache</Text>\n <Text dimColor>)</Text>\n </>\n )}\n {u.costUsd !== null && u.costUsd > 0 && (\n <>\n <Text dimColor> · </Text>\n <Text color={theme.warn} bold>\n {dollars(u.costUsd)}\n </Text>\n </>\n )}\n </Text>,\n )\n }\n\n details.push(\n <Text\n key=\"elapsed\"\n color={status.turnMs !== null ? theme.accent : undefined}\n bold={status.turnMs !== null}\n >\n {status.turnMs === null\n ? strings.sessionFor(formatDuration(status.sessionMs))\n : `${strings.working} ${formatDuration(status.turnMs)}`}\n </Text>,\n )\n\n if (status.bypass) {\n details.push(\n <Text key=\"bypass\" color=\"black\" backgroundColor={theme.warn} bold>\n {' '}BYPASS{' '}\n </Text>,\n )\n }\n\n return (\n <Box\n width=\"100%\"\n marginTop={1}\n paddingX={1}\n borderStyle=\"single\"\n borderTop\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderColor={theme.accent}\n borderDimColor\n alignItems=\"flex-start\"\n flexDirection=\"column\"\n >\n <Box width=\"100%\" alignItems=\"flex-start\">\n <Box flexGrow={1} flexShrink={1} flexWrap=\"wrap\">\n <Segments items={primary} />\n </Box>\n <Box\n flexShrink={0}\n marginLeft={2}\n flexDirection=\"column\"\n alignItems=\"flex-end\"\n >\n <ContextMeter context={status.context} />\n {(status.mcp.connected > 0 || status.mcp.failed > 0) && (\n <Text>\n {status.mcp.connected > 0 && (\n <Text color={theme.ok}>mcp:{status.mcp.connected}</Text>\n )}\n {status.mcp.connected > 0 && status.mcp.failed > 0 && (\n <Text dimColor> · </Text>\n )}\n {status.mcp.failed > 0 && (\n <Text color={theme.error}>{strings.mcpFailed(status.mcp.failed)}</Text>\n )}\n </Text>\n )}\n {status.activeAgents > 0 && (\n <Text color={theme.accent}>{strings.activeAgents(status.activeAgents)}</Text>\n )}\n </Box>\n </Box>\n {details.length > 0 && (\n <Box flexWrap=\"wrap\">\n {details.map((item, index) => (\n <Fragment key={index}>\n {index > 0 && <Text dimColor> · </Text>}\n {item}\n </Fragment>\n ))}\n </Box>\n )}\n </Box>\n )\n}\n\nfunction Segments({ items }: { items: ReactNode[] }) {\n return items.flatMap((item, index) => {\n const elements: ReactNode[] = []\n if (index > 0) {\n elements.push(\n <Box key={`sep-${index}`} marginTop={1}>\n <Text dimColor>{' · '}</Text>\n </Box>,\n )\n }\n elements.push(<Fragment key={`item-${index}`}>{item}</Fragment>)\n return elements\n })\n}\n\nfunction shortModel(ref: string): string {\n const safe = sanitizeTerminalText(ref)\n const slash = safe.lastIndexOf('/')\n return slash === -1 ? safe : safe.slice(slash + 1)\n}\n\nfunction ModelBadge({ ref: modelRef }: { ref: string }) {\n const theme = useTheme()\n const name = shortModel(modelRef)\n return (\n <Box borderColor={theme.accent} borderStyle=\"round\" paddingX={1}>\n <Text color={theme.accent} bold>{name}</Text>\n </Box>\n )\n}\n\nconst EFFORT_STYLES: Record<\n Effort,\n { label: string; color?: string; bold?: boolean; dim?: boolean }\n> = {\n max: { label: 'max', color: 'red', bold: true },\n xhigh: { label: 'xhigh', color: 'yellow', bold: true },\n high: { label: 'high', color: 'cyan' },\n medium: { label: 'medium', color: 'blue' },\n low: { label: 'low', color: 'gray', dim: true },\n}\n\nfunction EffortLabel({ effort }: { effort: Effort }) {\n const style = EFFORT_STYLES[effort]\n return (\n <Box borderColor={style.color ?? 'gray'} borderStyle=\"round\" paddingX={1}>\n <Text\n color={style.color}\n bold={style.bold}\n dimColor={style.dim}\n >\n {style.label}\n </Text>\n </Box>\n )\n}\n\nfunction tokens(count: number): string {\n if (count < 1000) return String(count)\n const [value, suffix] = count < 1_000_000 ? [count / 1000, 'k'] : [count / 1_000_000, 'M']\n return `${value.toFixed(1).replace(/\\.0$/, '')}${suffix}`\n}\n\nfunction ContextMeter({\n context,\n}: {\n context: { window: number | null; used: number; exact: boolean }\n}) {\n const theme = useTheme()\n const { window: win, used, exact } = context\n if (!exact || win === null || win <= 0) {\n return (\n <Text>\n <Text dimColor>ctx </Text>\n <Text color=\"gray\">{exact ? tokens(used) : '?'}</Text>\n {win && win > 0 && <Text dimColor>/{tokens(win)}</Text>}\n </Text>\n )\n }\n const pct = Math.min(Math.max(used / win, 0), 1)\n const filled = Math.max(0, Math.min(BAR_WIDTH, Math.round(BAR_WIDTH * pct)))\n\n const color = pct < 0.6 ? theme.ok : pct < 0.85 ? theme.warn : theme.error\n const percent = Math.round(pct * 100)\n\n return (\n <Text>\n <Text dimColor>ctx </Text>\n <Text color={color} bold>\n {`${percent}%`.padStart(4)}\n </Text>\n <Text color={color}> ▐{'█'.repeat(filled)}</Text>\n <Text color=\"gray\" dimColor>{'░'.repeat(BAR_WIDTH - filled)}</Text>\n <Text color={color}>▌</Text>\n <Text dimColor> {tokens(used)}/{tokens(win)}</Text>\n </Text>\n )\n}\n","export function formatDuration(ms: number): string {\n const total = Math.max(0, Math.round(ms / 1000))\n if (total < 60) return `${total}s`\n\n const minutes = Math.floor(total / 60)\n const seconds = total % 60\n if (minutes < 60) return `${minutes}m${String(seconds).padStart(2, '0')}s`\n\n const hours = Math.floor(minutes / 60)\n return `${hours}h${String(minutes % 60).padStart(2, '0')}m`\n}\n","import { Box } from 'ink'\nimport type { ReactNode } from 'react'\n\nexport function interactiveViewportRows(rows: number): number {\n if (!Number.isFinite(rows)) return 23\n return Math.max(1, Math.floor(rows) - 1)\n}\n\n/**\n * Keep Ink's changing output below the terminal's full height. Fullscreen\n * frames may be cleared on redraw by terminals on both Windows and Unix,\n * which resets the user's scrollback position while a response is streaming.\n */\nexport function TerminalViewport({ children, rows }: { children: ReactNode; rows: number }) {\n return (\n <Box\n flexDirection=\"column\"\n maxHeight={interactiveViewportRows(rows)}\n overflowY=\"hidden\"\n >\n {children}\n </Box>\n )\n}\n","import { Box, Static, Text } from 'ink'\nimport { memo, useMemo, useRef } from 'react'\nimport type { ReactNode } from 'react'\nimport Spinner from 'ink-spinner'\nimport { diffLines, truncate } from '../diff'\nimport { Markdown } from '../markdown'\nimport { useTheme } from '../theme'\nimport type { Bubble, TranscriptProps } from '../types'\nimport { DiffHunk } from './Diff'\nimport { Logo } from './Logo'\n\nconst HEADER = { kind: 'header' } as const\ntype StaticTranscriptItem = typeof HEADER | Bubble\n\nexport function firstMutableBubbleIndex(bubbles: Bubble[]): number {\n return bubbles.findIndex(\n (bubble) =>\n (bubble.kind === 'assistant' && bubble.streaming) ||\n (bubble.kind === 'tool' && bubble.state === 'running') ||\n (bubble.kind === 'subagent' && bubble.state === 'running'),\n )\n}\n\nexport const Transcript = memo(function Transcript({ bubbles, workspace }: TranscriptProps) {\n // A Static item cannot be updated after Ink writes it to scrollback. Keep the\n // whole suffix starting at the first mutable bubble live: several tools or\n // subagents may be running concurrently.\n const liveAt = firstMutableBubbleIndex(bubbles)\n const stableCount = liveAt === -1 ? bubbles.length : liveAt\n const stableRef = useRef<Bubble[]>([])\n if (stableRef.current.length < stableCount) {\n stableRef.current = [\n ...stableRef.current,\n ...bubbles.slice(stableRef.current.length, stableCount),\n ]\n } else if (stableRef.current.length > stableCount) {\n stableRef.current = bubbles.slice(0, stableCount)\n }\n const live = liveAt === -1 ? [] : bubbles.slice(liveAt)\n const staticItems: StaticTranscriptItem[] = [HEADER, ...stableRef.current]\n\n return (\n <Box flexDirection=\"column\" marginBottom={1} flexShrink={1} overflowY=\"hidden\">\n <Static items={staticItems}>\n {(item) =>\n item.kind === 'header' ? (\n <Logo key=\"kitcode-header\" workspace={workspace} />\n ) : (\n <BubbleView key={item.id} bubble={item} />\n )\n }\n </Static>\n\n <Box\n flexDirection=\"column\"\n flexShrink={1}\n overflowY=\"hidden\"\n justifyContent=\"flex-end\"\n >\n {live.map((bubble) => (\n <BubbleView key={bubble.id} bubble={bubble} />\n ))}\n </Box>\n </Box>\n )\n})\n\nconst BubbleView = memo(function BubbleView({ bubble }: { bubble: Bubble }) {\n const theme = useTheme()\n\n if (bubble.kind === 'user') {\n return (\n <Box marginTop={1}>\n <Text color={theme.accent} bold>\n › {bubble.text}\n </Text>\n </Box>\n )\n }\n\n if (bubble.kind === 'notice') {\n const color =\n bubble.level === 'error' ? theme.error : bubble.level === 'warn' ? theme.warn : theme.accent\n return (\n <Box marginTop={1}>\n <Text color={color}>{bubble.text}</Text>\n </Box>\n )\n }\n\n if (bubble.kind === 'assistant') {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {bubble.thinking.trim() !== '' && (\n <Text dimColor italic>\n {bubble.thinking.trim()}\n </Text>\n )}\n {bubble.streaming ? <Text>{bubble.text}</Text> : <Markdown>{bubble.text}</Markdown>}\n {bubble.streaming && bubble.text === '' && (\n <Text dimColor>\n <Spinner type=\"dots\" /> thinking\n </Text>\n )}\n </Box>\n )\n }\n\n if (bubble.kind === 'subagent') {\n return <SubagentView bubble={bubble} />\n }\n\n return <ToolView bubble={bubble} />\n})\n\nfunction ToolView({ bubble }: { bubble: Extract<Bubble, { kind: 'tool' }> }) {\n const theme = useTheme()\n const mark = bubble.state === 'running' ? '◌' : bubble.state === 'ok' ? '●' : '✗'\n const color =\n bubble.state === 'error' ? theme.error : bubble.state === 'ok' ? theme.ok : theme.warn\n const display = bubble.display\n const diff = useMemo(\n () => (display?.kind === 'diff' ? diffLines(display.before, display.after) : null),\n [display],\n )\n if (!diff) return <NonDiffToolView bubble={bubble} mark={mark} color={color} />\n const hasChanges = diff.added > 0 || diff.removed > 0\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={color}>\n {mark} {bubble.summary}\n {hasChanges && (\n <>\n {diff.added > 0 && <Text color={theme.ok} bold>{` +${diff.added}`}</Text>}\n {diff.removed > 0 && <Text color={theme.error} bold>{` -${diff.removed}`}</Text>}\n </>\n )}\n </Text>\n <Box marginLeft={2}>\n <DiffHunk lines={diff.hunk} hidden={diff.hidden} />\n </Box>\n </Box>\n )\n}\n\nfunction NonDiffToolView({\n bubble,\n mark,\n color,\n}: {\n bubble: Extract<Bubble, { kind: 'tool' }>\n mark: string\n color: string\n}) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={color}>\n {mark} {bubble.summary}\n </Text>\n {bubble.state !== 'running' &&\n bubble.content.trim() !== '' && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {previewLines(bubble.content).map((line, index) => (\n <Text key={index} dimColor>\n {truncate(line, 110)}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n )\n}\n\nfunction previewLines(content: string): string[] {\n const lines = content.split('\\n').filter((line) => line.trim() !== '')\n if (lines.length <= 6) return lines\n return [...lines.slice(0, 6), `… ${lines.length - 6} more lines`]\n}\n\nfunction SubagentView({ bubble }: { bubble: Extract<Bubble, { kind: 'subagent' }> }) {\n const theme = useTheme()\n const mark = bubble.state === 'running' ? '◌' : '●'\n const color = bubble.state === 'running' ? theme.warn : theme.ok\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={color} bold>\n {mark} subagent: {bubble.description}\n </Text>\n <Box marginLeft={2} flexDirection=\"column\">\n {bubble.bubbles.map((inner, index) => (\n <BubbleView key={index} bubble={inner} />\n ))}\n {bubble.state === 'done' && bubble.result && (\n <Box marginTop={1}>\n <Text dimColor>── result ──</Text>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n","import { Box, Text } from 'ink'\nimport { useMemo } from 'react'\nimport type { ReactNode } from 'react'\nimport { useTheme } from './theme'\n\ninterface MdNode {\n type: 'heading' | 'paragraph' | 'blockquote' | 'ul' | 'ol' | 'table' | 'code' | 'hr'\n level?: number\n items?: MdNode[]\n text?: string\n lang?: string\n headers?: string[]\n rows?: string[][]\n colAligns?: ('left' | 'center' | 'right')[]\n nested?: boolean\n}\n\nexport function Markdown({ children }: { children: string }): ReactNode {\n const blocks = useMemo(() => extractBlocks(children), [children])\n return (\n <Box flexDirection=\"column\">\n {blocks.map((block, i) => (\n <BlockView key={i} block={block} />\n ))}\n </Box>\n )\n}\n\nfunction BlockView({ block }: { block: MdNode }): ReactNode {\n switch (block.type) {\n case 'heading': {\n const sizes = [22, 20, 18, 16, 14, 13]\n const size = sizes[(block.level ?? 1) - 1] ?? 14\n return (\n <Box marginTop={block.level === 1 ? 1 : 0}>\n <Text bold>{truncateBySize(block.text ?? '', size)}</Text>\n </Box>\n )\n }\n case 'blockquote':\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n {(block.text ?? '').split('\\n').map((line, i) => (\n <Box key={i}>\n <Text dimColor>│ </Text>\n <Text dimColor>{line}</Text>\n </Box>\n ))}\n </Box>\n )\n case 'ul':\n return (\n <Box flexDirection=\"column\">\n {(block.items ?? []).map((item, i) => (\n <Box key={i}>\n <Text dimColor>• </Text>\n <Box marginLeft={2}>\n <BlockView block={item} />\n </Box>\n </Box>\n ))}\n </Box>\n )\n case 'ol':\n return (\n <Box flexDirection=\"column\">\n {(block.items ?? []).map((item, i) => (\n <Box key={i}>\n <Text dimColor>{`${i + 1}. `}</Text>\n <Box marginLeft={2}>\n <BlockView block={item} />\n </Box>\n </Box>\n ))}\n </Box>\n )\n case 'paragraph':\n default:\n return <Text>{inline(block.text ?? '')}</Text>\n case 'table':\n return <TableView block={block} />\n case 'code':\n return <CodeBlock lang={block.lang} code={block.text ?? ''} />\n case 'hr':\n return (\n <Box marginTop={1} marginBottom={1}>\n <Text dimColor>{'─'.repeat(60)}</Text>\n </Box>\n )\n }\n}\n\nfunction CodeBlock({ lang, code }: { lang?: string; code: string }) {\n const theme = useTheme()\n const lines = code.split('\\n')\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {lang && (\n <Text dimColor color={theme.accent}>\n {lang}\n </Text>\n )}\n <Box borderColor=\"gray\" borderStyle=\"round\" paddingX={1}>\n <Box flexDirection=\"column\">\n {lines.map((line, i) => (\n <Text key={i} color=\"cyan\">\n {line}\n </Text>\n ))}\n </Box>\n </Box>\n </Box>\n )\n}\n\nfunction TableView({ block }: { block: MdNode }) {\n const headers = block.headers ?? []\n const rows = block.rows ?? []\n\n // Guard against malformed table data\n if (headers.length === 0 && rows.length === 0) {\n return <Text dimColor>(empty table)</Text>\n }\n\n const colCount = Math.max(headers.length, ...rows.map((r) => r?.length ?? 0))\n if (colCount === 0) {\n return <Text dimColor>(empty table)</Text>\n }\n const colWidths = new Array(colCount).fill(0)\n\n const allRows = [headers, ...rows]\n for (const row of allRows) {\n for (let i = 0; i < colCount; i++) {\n const cell = row[i] ?? ''\n colWidths[i] = Math.max(colWidths[i], [...cell].length)\n }\n }\n\n // Build separator: ───┼───┼───\n const separator = colWidths.map((w) => '─'.repeat(w)).join('┼')\n\n const lines: ReactNode[] = []\n allRows.forEach((row, rowIdx) => {\n const cells = []\n for (let i = 0; i < colCount; i++) {\n const cell = row[i] ?? ''\n const align = block.colAligns?.[i] ?? 'left'\n const visualWidth = [...cell].length\n const padWidth = colWidths[i] + (cell.length - visualWidth)\n let padded: string\n if (align === 'right') {\n padded = cell.padStart(padWidth)\n } else if (align === 'center') {\n const totalPad = padWidth - visualWidth\n const left = Math.floor(totalPad / 2)\n padded = ' '.repeat(left) + cell + ' '.repeat(totalPad - left)\n } else {\n padded = cell.padEnd(padWidth)\n }\n cells.push(padded)\n }\n lines.push(\n <Text key={`row-${rowIdx}`} bold={rowIdx === 0}>\n {cells.join(' │ ')}\n </Text>,\n )\n if (rowIdx === 0) {\n lines.push(<Text key={`sep-${rowIdx}`} dimColor>{separator}</Text>)\n }\n })\n\n return <Box flexDirection=\"column\">{lines}</Box>\n}\n\n// Maximum characters per font size level (1-6)\nconst CHARS_PER_FONT_LEVEL = 3\n\nfunction truncateBySize(text: string, size: number): string {\n const maxLen = size * CHARS_PER_FONT_LEVEL\n return text.length > maxLen ? text.slice(0, maxLen) + '…' : text\n}\n\nconst HEADING_RE = /^(#{1,6})\\s+(.*)$/\nconst UL_RE = /^([-*+])\\s+(.*)$/\nconst OL_RE = /^(\\d+)\\.\\s+(.*)$/\nconst QUOTE_RE = /^>\\s?(.*)$/\nconst TASK_RE = /^[-*+]\\s+\\[([ xX])\\]\\s+(.*)$/\nconst INDENT_RE = /^(\\s*)(.*)$/\nconst HR_RE = /^([-*_])\\1{2,}$/\nconst FENCE_RE = /^(`{3,}|~{3,})(\\w*)\\s*$/\n\nexport function extractBlocks(src: string): MdNode[] {\n const lines = src.replace(/\\r\\n/g, '\\n').split('\\n')\n const blocks: MdNode[] = []\n let paragraph: string[] = []\n let list: { ordered: boolean; items: MdNode[]; indent: number } | null = null\n let quote: string[] = []\n let code: { fence: string; lang: string; lines: string[] } | null = null\n let table: { headers: string[]; rows: string[][]; colAligns: ('left' | 'center' | 'right')[] } | null = null\n\n const flushParagraph = () => {\n if (paragraph.length) {\n blocks.push({ type: 'paragraph', text: paragraph.join(' ').trim() })\n paragraph = []\n }\n }\n const flushList = () => {\n if (list && list.items.length) {\n blocks.push({ type: list.ordered ? 'ol' : 'ul', items: list.items })\n list = null\n }\n }\n const flushQuote = () => {\n if (quote.length) {\n blocks.push({ type: 'blockquote', text: quote.join('\\n') })\n quote = []\n }\n }\n const flushCode = () => {\n if (code) {\n blocks.push({ type: 'code', lang: code.lang, text: code.lines.join('\\n') })\n code = null\n }\n }\n const flushAll = () => {\n flushParagraph()\n flushList()\n flushQuote()\n flushCode()\n }\n\n const flushTable = () => {\n if (table && table.headers.length > 0) {\n blocks.push({\n type: 'table',\n headers: table.headers,\n rows: table.rows,\n colAligns: table.colAligns,\n })\n }\n table = null\n }\n\n const parseListItem = (text: string, indent: number): MdNode => {\n const task = text.match(TASK_RE)\n if (task) {\n const done = task[1].toLowerCase() === 'x'\n return {\n type: 'paragraph',\n text: `${done ? '☑' : '☐'} ${task[2]}`,\n }\n }\n return { type: 'paragraph', text }\n }\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const trimmed = line.trim()\n\n if (code) {\n const endMatch = trimmed.match(FENCE_RE)\n if (endMatch && endMatch[1][0] === code.fence[0] && endMatch[1].length >= code.fence.length) {\n flushCode()\n continue\n }\n code.lines.push(line)\n continue\n }\n\n const fenceMatch = trimmed.match(FENCE_RE)\n if (fenceMatch) {\n flushAll()\n flushTable()\n code = { fence: fenceMatch[1], lang: fenceMatch[2], lines: [] }\n continue\n }\n\n if (trimmed === '') {\n flushTable()\n flushAll()\n continue\n }\n\n const hrMatch = trimmed.match(HR_RE)\n if (hrMatch) {\n flushTable()\n flushAll()\n blocks.push({ type: 'hr' })\n continue\n }\n\n const heading = trimmed.match(HEADING_RE)\n if (heading) {\n flushTable()\n flushAll()\n blocks.push({ type: 'heading', level: heading[1].length, text: heading[2].trim() })\n continue\n }\n\n const quoteMatch = trimmed.match(QUOTE_RE)\n if (quoteMatch) {\n flushTable()\n flushParagraph()\n flushList()\n flushCode()\n quote.push(quoteMatch[1])\n continue\n }\n\n const indentMatch = line.match(INDENT_RE)\n const indent = indentMatch?.[1].length ?? 0\n\n const taskMatch = trimmed.match(TASK_RE)\n if (taskMatch) {\n flushTable()\n flushParagraph()\n flushQuote()\n flushCode()\n if (!list || list.ordered || indent !== list.indent) {\n flushList()\n list = { ordered: false, items: [], indent }\n }\n list.items.push(parseListItem(trimmed, indent))\n continue\n }\n\n const ulMatch = trimmed.match(UL_RE)\n if (ulMatch) {\n flushTable()\n flushParagraph()\n flushQuote()\n flushCode()\n if (!list || list.ordered || indent !== list.indent) {\n flushList()\n list = { ordered: false, items: [], indent }\n }\n list.items.push(parseListItem(ulMatch[2], indent))\n continue\n }\n\n const olMatch = trimmed.match(OL_RE)\n if (olMatch) {\n flushTable()\n flushParagraph()\n flushQuote()\n flushCode()\n if (!list || !list.ordered || indent !== list.indent) {\n flushList()\n list = { ordered: true, items: [], indent }\n }\n list.items.push(parseListItem(olMatch[2], indent))\n continue\n }\n\n // Table separator row: must contain at least one | and have 2+ columns of :--- format\n const sepMatch = trimmed.match(/^\\|?\\s*(\\s*:?-+:?\\s*\\|)+\\s*:?-+:?\\s*\\|?$/)\n if (sepMatch) {\n const cells = trimmed.split('|').map((c) => c.trim()).filter((c) => c.length > 0)\n if (cells.length >= 2 && cells.every((c) => /^:?-+:?$/.test(c))) {\n if (table) {\n table.colAligns = cells.map((c) => {\n if (c.startsWith(':') && c.endsWith(':')) return 'center'\n if (c.endsWith(':')) return 'right'\n return 'left'\n })\n continue\n }\n }\n }\n\n // Table row: must have at least one | with non-empty content on both sides\n // This prevents matching code like `if (x || y)` or paths with |\n const rowMatch = trimmed.match(/^\\|?.+\\|.+\\|?$/)\n if (rowMatch) {\n const cells = trimmed.split('|').map((c) => c.trim()).filter((c, idx, arr) => {\n if (idx === 0 && c === '') return false\n if (idx === arr.length - 1 && c === '') return false\n return true\n })\n // Reject Windows paths like C:\\path|other or \\\\server\\share|file and single-cell rows\n const isWindowsPath =\n cells.length === 2 &&\n (/^[A-Za-z]:\\\\/.test(cells[0]) || /^\\\\\\\\/.test(cells[0]))\n if (cells.length >= 2 && cells.every((c) => c.length > 0) && !isWindowsPath) {\n if (table) {\n table.rows.push(cells)\n } else {\n flushAll()\n table = { headers: cells, rows: [], colAligns: [] }\n }\n continue\n }\n }\n\n // ASCII table separator: line of ─ or - (for tables without pipe borders)\n // Only match if it looks like a table separator (multiple dashes with optional spaces)\n const asciiSepMatch = trimmed.match(/^[\\s\\-─┄┈━┅]{3,}$/)\n if (asciiSepMatch) {\n if (table && table.headers.length > 0 && table.colAligns.length === 0) {\n // Infer left alignment for all columns\n table.colAligns = table.headers.map(() => 'left')\n continue\n }\n // Check if previous paragraph looks like table headers (2+ space-separated tokens)\n // Must check BEFORE flushAll() clears paragraph\n if (paragraph.length === 1) {\n const prevLine = paragraph[0].trim()\n const tokens = prevLine.split(/\\s{2,}/).map((c) => c.trim()).filter((c) => c.length > 0)\n if (tokens.length >= 2 && tokens.length <= 10) {\n // Looks like ASCII table headers — convert paragraph to table\n paragraph = []\n flushList()\n flushQuote()\n flushCode()\n table = { headers: tokens, rows: [], colAligns: tokens.map(() => 'left') }\n continue\n }\n }\n }\n\n // ASCII table row without pipes: space-separated columns\n // Only match if we already have a table context (headers parsed)\n // Split by 2+ spaces to avoid splitting paths and code\n if (table && table.headers.length > 0 && !trimmed.includes('|')) {\n const tokens = trimmed.split(/\\s{2,}/).map((c) => c.trim()).filter((c) => c.length > 0)\n // Must have similar number of columns as headers (allow some flexibility)\n if (tokens.length >= 2 && tokens.length <= table.headers.length + 2) {\n // Don't match if it looks like code or a path\n const looksLikeCode = tokens.some((t) => t.startsWith('//') || t.startsWith('#') || t.startsWith('/*'))\n const looksLikePath = tokens.length === 2 && (/^[A-Za-z]:\\\\/.test(tokens[0]) || /^\\\\\\\\/.test(tokens[0]))\n if (!looksLikeCode && !looksLikePath) {\n table.rows.push(tokens)\n continue\n }\n }\n }\n\n flushTable()\n flushList()\n flushQuote()\n flushCode()\n paragraph.push(trimmed)\n }\n\n flushTable()\n flushAll()\n return blocks\n}\n\n// Maximum nesting depth for inline formatting to prevent stack overflow\nconst MAX_INLINE_DEPTH = 10\n\nfunction inline(text: string, depth = 0): ReactNode {\n if (depth > MAX_INLINE_DEPTH) {\n return text\n }\n\n const nodes: ReactNode[] = []\n let rest = text\n let key = 0\n\n const matchers: Array<{ re: RegExp; handler: (m: RegExpMatchArray) => ReactNode }> = [\n {\n re: /(!\\[)([^\\]]*)\\]\\(([^)]+)\\)/,\n handler: (m) => (\n <Text key={key++} color=\"cyan\" bold>\n [img: {m[2]}]\n </Text>\n ),\n },\n {\n re: /(\\[)([^\\]]*)\\]\\(([^)]+)\\)/,\n handler: (m) => (\n <>\n <Text key={key++} color=\"cyan\" underline>\n {inline(m[2] as string, depth + 1)}\n </Text>\n <Text key={key++} dimColor color=\"gray\">\n ({m[3]})\n </Text>\n </>\n ),\n },\n {\n re: /(`+)([^`]+?)\\1/,\n handler: (m) => (\n <Text key={key++} bold color=\"cyan\">\n {m[2]}\n </Text>\n ),\n },\n {\n re: /(\\*\\*)(.+?)\\1/,\n handler: (m) => (\n <Text key={key++} bold>\n {inline(m[2], depth + 1)}\n </Text>\n ),\n },\n {\n re: /(__)(.+?)\\1/,\n handler: (m) => (\n <Text key={key++} bold>\n {inline(m[2], depth + 1)}\n </Text>\n ),\n },\n {\n re: /(~~)(.+?)\\1/,\n handler: (m) => (\n <Text key={key++} strikethrough>\n {m[2]}\n </Text>\n ),\n },\n {\n re: /(\\*)(.+?)\\1/,\n handler: (m) => (\n <Text key={key++} italic>\n {inline(m[2], depth + 1)}\n </Text>\n ),\n },\n ]\n\n while (rest.length > 0) {\n let best: { match: RegExpMatchArray; handler: (m: RegExpMatchArray) => ReactNode } | null = null\n\n for (const { re, handler } of matchers) {\n const m = rest.match(re)\n if (m && (best === null || (m.index ?? 0) < (best.match.index ?? 0))) {\n best = { match: m, handler }\n }\n }\n\n if (!best) {\n nodes.push(rest)\n break\n }\n\n const idx = best.match.index ?? 0\n if (idx > 0) nodes.push(rest.slice(0, idx))\n nodes.push(best.handler(best.match))\n rest = rest.slice(idx + best.match[0].length)\n }\n\n return nodes.length === 1 ? nodes[0] : nodes\n}\n","import type { AgentEvent } from '../core/types'\nimport type { Message } from '../providers/types'\nimport { attachmentLabel } from '../core/attachments'\nimport type { ToolDisplay } from '../tools/types'\nimport type { Bubble } from './types'\nimport { canRenderDiff, MAX_RENDER_DIFF_CHARS } from './diff'\nimport { sanitizeTerminalText } from './sanitize'\n\nexport interface TranscriptState {\n bubbles: Bubble[]\n seq: number\n}\n\nexport function emptyTranscript(): TranscriptState {\n return { bubbles: [], seq: 0 }\n}\n\nexport function pushUser(state: TranscriptState, text: string): TranscriptState {\n const id = `u${state.seq}`\n return {\n bubbles: [...state.bubbles, { kind: 'user', id, text: sanitizeTerminalText(text) }],\n seq: state.seq + 1,\n }\n}\n\nexport function pushNotice(\n state: TranscriptState,\n level: 'info' | 'warn' | 'error',\n text: string,\n): TranscriptState {\n const id = `n${state.seq}`\n return {\n bubbles: [...state.bubbles, { kind: 'notice', id, level, text: sanitizeTerminalText(text) }],\n seq: state.seq + 1,\n }\n}\n\nexport function applyEvent(state: TranscriptState, event: AgentEvent): TranscriptState {\n switch (event.type) {\n case 'text_delta':\n return appendToAssistant(state, (bubble) => ({\n ...bubble,\n text: bubble.text + sanitizeTerminalText(event.text),\n }))\n\n case 'thinking_delta':\n return appendToAssistant(state, (bubble) => ({\n ...bubble,\n thinking: bubble.thinking + sanitizeTerminalText(event.text),\n }))\n\n case 'tool_start':\n return {\n bubbles: [\n ...closeAssistant(state.bubbles),\n {\n kind: 'tool',\n id: event.id,\n name: sanitizeTerminalText(event.name),\n summary: sanitizeTerminalText(event.summary),\n state: 'running',\n content: '',\n },\n ],\n seq: state.seq + 1,\n }\n\n case 'tool_end':\n return {\n ...state,\n bubbles: state.bubbles.map((bubble) =>\n bubble.kind === 'tool' && bubble.id === event.id\n ? {\n ...bubble,\n state: event.isError ? 'error' : 'ok',\n content: sanitizeTerminalText(event.content),\n display: sanitizeDisplay(event.display),\n }\n : bubble,\n ),\n }\n\n case 'subagent_start':\n return {\n bubbles: [\n ...closeAssistant(state.bubbles),\n {\n kind: 'subagent',\n id: event.id,\n description: sanitizeTerminalText(event.description),\n state: 'running',\n seq: 0,\n bubbles: [],\n },\n ],\n seq: state.seq + 1,\n }\n\n case 'subagent_end':\n return {\n ...state,\n bubbles: state.bubbles.map((bubble) =>\n bubble.kind === 'subagent' && bubble.id === event.id\n ? { ...bubble, state: 'done', result: sanitizeTerminalText(event.result) }\n : bubble,\n ),\n }\n\n case 'subagent_event': {\n const idx = state.bubbles.findLastIndex(\n (b) => b.kind === 'subagent' && b.id === event.id,\n )\n if (idx === -1) return state\n const sub = state.bubbles[idx] as Extract<typeof state.bubbles[number], { kind: 'subagent' }>\n const innerState: TranscriptState = { bubbles: sub.bubbles, seq: sub.seq }\n const updated = applyEvent(innerState, event.event)\n return {\n ...state,\n bubbles: state.bubbles.map((bubble, i) =>\n i === idx\n ? { ...sub, seq: updated.seq, bubbles: updated.bubbles }\n : bubble,\n ),\n }\n }\n\n case 'notice':\n return pushNotice(state, event.level, event.text)\n\n case 'turn_end':\n return { ...state, bubbles: closeAssistant(state.bubbles) }\n\n case 'turn_start':\n case 'usage':\n case 'rate_limits':\n return state\n }\n}\n\nexport function applyEvents(state: TranscriptState, events: AgentEvent[]): TranscriptState {\n return coalesceDeltas(events).reduce(applyEvent, state)\n}\n\nfunction coalesceDeltas(events: AgentEvent[]): AgentEvent[] {\n const out: AgentEvent[] = []\n for (const event of events) {\n const previous = out.at(-1)\n if (event.type === 'text_delta' && previous?.type === 'text_delta') {\n out[out.length - 1] = { type: 'text_delta', text: previous.text + event.text }\n } else if (event.type === 'thinking_delta' && previous?.type === 'thinking_delta') {\n out[out.length - 1] = { type: 'thinking_delta', text: previous.text + event.text }\n } else {\n out.push(event)\n }\n }\n return out\n}\n\nfunction appendToAssistant(\n state: TranscriptState,\n update: (bubble: Extract<Bubble, { kind: 'assistant' }>) => Bubble,\n): TranscriptState {\n const last = state.bubbles.at(-1)\n if (last?.kind === 'assistant' && last.streaming) {\n return { ...state, bubbles: [...state.bubbles.slice(0, -1), update(last)] }\n }\n const fresh: Extract<Bubble, { kind: 'assistant' }> = {\n kind: 'assistant',\n id: `a${state.seq}`,\n text: '',\n thinking: '',\n streaming: true,\n }\n return { bubbles: [...state.bubbles, update(fresh)], seq: state.seq + 1 }\n}\n\nfunction closeAssistant(bubbles: Bubble[]): Bubble[] {\n if (!bubbles.some((bubble) => bubble.kind === 'assistant' && bubble.streaming)) return bubbles\n return bubbles.map((bubble) =>\n bubble.kind === 'assistant' && bubble.streaming ? { ...bubble, streaming: false } : bubble,\n )\n}\n\nexport function fromHistory(messages: Message[]): TranscriptState {\n let state = emptyTranscript()\n\n for (const message of messages) {\n if (message.role === 'user') {\n const displayed = message.content\n .flatMap((block) => {\n if (block.type === 'text') return [block.text]\n const label = attachmentLabel(block)\n return label ? [`📎 ${label}`] : []\n })\n .map((value) => sanitizeTerminalText(value).trim())\n .filter(Boolean)\n .join('\\n')\n if (displayed) state = pushUser(state, displayed)\n }\n for (const block of message.content) {\n if (block.type === 'text') {\n if (message.role === 'user') continue\n const text = sanitizeTerminalText(block.text).trim()\n if (text === '') continue\n state =\n {\n bubbles: [\n ...state.bubbles,\n { kind: 'assistant', id: `a${state.seq}`, text, thinking: '', streaming: false },\n ],\n seq: state.seq + 1,\n }\n } else if (block.type === 'tool_use') {\n state = {\n bubbles: [\n ...state.bubbles,\n {\n kind: 'tool',\n id: block.id,\n name: sanitizeTerminalText(block.name),\n summary: sanitizeTerminalText(block.name),\n state: 'ok',\n content: '',\n },\n ],\n seq: state.seq + 1,\n }\n } else if (block.type === 'tool_result') {\n state = {\n ...state,\n bubbles: state.bubbles.map((bubble) =>\n bubble.kind === 'tool' && bubble.id === block.toolUseId\n ? {\n ...bubble,\n state: block.isError ? 'error' : 'ok',\n content: sanitizeTerminalText(block.content),\n }\n : bubble,\n ),\n }\n } else if ((block.type === 'image' || block.type === 'file') && message.role === 'assistant') {\n const label = attachmentLabel(block)\n if (label) {\n state = {\n bubbles: [\n ...state.bubbles,\n {\n kind: 'assistant',\n id: `a${state.seq}`,\n text: `📎 ${sanitizeTerminalText(label)}`,\n thinking: '',\n streaming: false,\n },\n ],\n seq: state.seq + 1,\n }\n }\n }\n }\n }\n\n return state\n}\n\nfunction sanitizeDisplay(display: ToolDisplay | undefined): ToolDisplay | undefined {\n if (!display) return undefined\n if (display.kind === 'text') return { ...display, text: sanitizeTerminalText(display.text) }\n if (display.kind === 'list') {\n return {\n ...display,\n title: sanitizeTerminalText(display.title),\n items: display.items.map(sanitizeTerminalText),\n }\n }\n if (!canRenderDiff(display.before, display.after)) {\n return {\n kind: 'text',\n text: `Diff for ${sanitizeTerminalText(display.path)} omitted from the transcript because it exceeds ${MAX_RENDER_DIFF_CHARS.toLocaleString()} characters.`,\n }\n }\n return {\n ...display,\n path: sanitizeTerminalText(display.path),\n before: sanitizeTerminalText(display.before),\n after: sanitizeTerminalText(display.after),\n }\n}\n"],"mappings":"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","names":["resolve","apiKey","snippet","randomUUID","chmod","mkdir","readFile","rename","rm","writeFile","path","path","path","resolve","chmod","record","readFile","path","mkdir","randomUUID","writeFile","rename","rm","relative","path","mkdir","readFile","rename","stat","writeFile","path","path","writeFile","rename","resolve","stat","readFile","field","MAX_RETRIES","resolve","characters","randomBytes","chmod","mkdir","readFile","readdir","rename","stat","unlink","writeFile","path","assertSessionId","active","path","randomBytes","unlink","readFile","mkdir","writeFile","chmod","rename","stat","readdir","readFile","stat","path","path","isFile","stat","readFile","lstat","readFile","stat","os","path","lstat","path","stat","basename","readFile","os","resolve","first","finalText","os","initial","withTimeout","describeFailure","open","tail","record","apiKey","endpoint","path","parse","chmod","readFile","writeFile","path","path","readFile","price","writeFile","chmod","Anthropic","Anthropic","limits","OpenAI","OpenAI","streamTurn","listModels","toUsage","limits","toContentBlocks","resolve","lstat","readFile","stat","writeFile","MAX_FILE_BYTES","path","stat","readFile","lstat","writeFile","path","readFile","stat","join","fg","path","resolve","MAX_FILE_BYTES","path","stat","fg","join","readFile","readFile","stat","MAX_FILE_BYTES","path","stat","readFile","lstat","mkdir","readFile","stat","writeFile","dirname","MAX_FILE_BYTES","path","stat","readFile","lstat","mkdir","dirname","writeFile","chmod","readFile","readdir","unlink","writeFile","path","path","writeFile","chmod","readFile","readdir","prompts","unlink","field","readFile","readdir","stat","path","randomUUID","existsSync","realpathSync","chmod","mkdir","path","path","MAX_SKILL_BYTES","randomUUID","existsSync","skillFile","body","mkdir","chmod","relative","realpathSync","randomBytes","randomBytes","MAX_RESPONSE_BYTES","PREFERRED","workspaceRoot","path","mkdir","tokens","prompts","resolve","Box","Text","useInput","useWindowSize","useEffect","useMemo","useRef","useState","first","needle","TextInput","createContext","useContext","path","tokens","Box","Text","Box","Text","oneLine","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","Box","Text","useState","jsx","jsxs","useState","Box","Text","Box","Text","Box","Text","truncate","jsx","jsxs","Text","Box","truncate","jsx","jsxs","Box","Text","Box","Text","useState","jsx","jsxs","useState","active","Box","Text","truncate","Box","Text","useRef","useState","jsx","jsxs","WINDOW","PromptInput","useState","characters","useRef","open","active","nextCursor","Box","Text","Box","Text","Fragment","Fragment","jsx","jsxs","Text","Box","tokens","Box","jsx","Box","Text","memo","useMemo","useRef","Spinner","Box","Text","useMemo","Fragment","jsx","jsxs","useMemo","Box","Text","tokens","Fragment","jsx","jsxs","memo","Transcript","useRef","Box","BubbleView","Text","Spinner","useMemo","truncate","jsx","jsxs","useWindowSize","useState","useRef","useEffect","useMemo","active","ask","resolve","body","line","states","tokens","items","choice","useInput","Box","Text","TextInput","first","jsx","MODES","resolve"]}
|