reasonix 0.0.6 → 0.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/client.ts","../../src/retry.ts","../../src/harvest.ts","../../src/consistency.ts","../../src/memory.ts","../../src/repair/scavenge.ts","../../src/repair/storm.ts","../../src/repair/truncation.ts","../../src/repair/flatten.ts","../../src/repair/index.ts","../../src/session.ts","../../src/telemetry.ts","../../src/tools.ts","../../src/loop.ts","../../src/env.ts","../../src/config.ts","../../src/index.ts","../../src/cli/commands/chat.tsx","../../src/cli/ui/App.tsx","../../src/cli/ui/EventLog.tsx","../../src/cli/ui/markdown.tsx","../../src/cli/ui/PromptInput.tsx","../../src/cli/ui/StatsPanel.tsx","../../src/cli/ui/slash.ts","../../src/cli/ui/Setup.tsx","../../src/cli/commands/run.ts","../../src/cli/commands/stats.ts","../../src/cli/commands/version.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { VERSION } from \"../index.js\";\nimport { chatCommand } from \"./commands/chat.js\";\nimport { runCommand } from \"./commands/run.js\";\nimport { statsCommand } from \"./commands/stats.js\";\nimport { versionCommand } from \"./commands/version.js\";\n\nconst DEFAULT_SYSTEM =\n \"You are Reasonix, a helpful DeepSeek-powered assistant. Be concise and accurate. Use tools when available.\";\n\nconst program = new Command();\nprogram\n .name(\"reasonix\")\n .description(\"DeepSeek-native agent framework — built for cache hits and cheap tokens.\")\n .version(VERSION);\n\nprogram\n .command(\"chat\")\n .description(\"Interactive Ink TUI with live cache/cost panel.\")\n .option(\"-m, --model <id>\", \"DeepSeek model id\", \"deepseek-chat\")\n .option(\"-s, --system <prompt>\", \"System prompt (pinned in the immutable prefix)\", DEFAULT_SYSTEM)\n .option(\"--transcript <path>\", \"Write a JSONL transcript to this path\")\n .option(\n \"--harvest\",\n \"Extract typed plan state from R1 reasoning (Pillar 2, adds a cheap V3 call per turn)\",\n )\n .option(\n \"--branch <n>\",\n \"Self-consistency: run N parallel samples per turn and pick the most confident (disables streaming; enables harvest)\",\n (v) => Number.parseInt(v, 10),\n )\n .option(\n \"--session <name>\",\n \"Use a named session (default: 'default'). Resume the same session next time.\",\n )\n .option(\"--no-session\", \"Disable session persistence for this run (ephemeral chat)\")\n .action(async (opts) => {\n // Default behavior: every chat is auto-saved to a session named 'default'\n // and auto-resumed next launch. Pass --no-session to opt out, or\n // --session <name> to use a different session.\n let session: string | undefined;\n if (opts.session === false) {\n session = undefined; // --no-session\n } else if (typeof opts.session === \"string\" && opts.session.length > 0) {\n session = opts.session;\n } else {\n session = \"default\";\n }\n await chatCommand({\n model: opts.model,\n system: opts.system,\n transcript: opts.transcript,\n harvest: !!opts.harvest,\n branch: Number.isFinite(opts.branch) && opts.branch > 1 ? opts.branch : undefined,\n session,\n });\n });\n\nprogram\n .command(\"run <task>\")\n .description(\"Run a single task non-interactively, streaming output.\")\n .option(\"-m, --model <id>\", \"DeepSeek model id\", \"deepseek-chat\")\n .option(\"-s, --system <prompt>\", \"System prompt\", DEFAULT_SYSTEM)\n .action(async (task: string, opts) => {\n await runCommand({ task, model: opts.model, system: opts.system });\n });\n\nprogram\n .command(\"stats <transcript>\")\n .description(\"Summarize a JSONL transcript produced by `reasonix chat --transcript`.\")\n .action((transcript: string) => {\n statsCommand({ transcript });\n });\n\nprogram.command(\"version\").description(\"Print Reasonix version.\").action(versionCommand);\n\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(err);\n process.exit(1);\n});\n","import { type EventSourceMessage, createParser } from \"eventsource-parser\";\nimport { type RetryOptions, fetchWithRetry } from \"./retry.js\";\nimport type { ChatMessage, ChatRequestOptions, RawUsage, ToolCall, ToolSpec } from \"./types.js\";\n\nexport class Usage {\n constructor(\n public promptTokens = 0,\n public completionTokens = 0,\n public totalTokens = 0,\n public promptCacheHitTokens = 0,\n public promptCacheMissTokens = 0,\n ) {}\n\n get cacheHitRatio(): number {\n const denom = this.promptCacheHitTokens + this.promptCacheMissTokens;\n return denom > 0 ? this.promptCacheHitTokens / denom : 0;\n }\n\n static fromApi(raw: RawUsage | undefined | null): Usage {\n const u = raw ?? {};\n return new Usage(\n u.prompt_tokens ?? 0,\n u.completion_tokens ?? 0,\n u.total_tokens ?? 0,\n u.prompt_cache_hit_tokens ?? 0,\n u.prompt_cache_miss_tokens ?? 0,\n );\n }\n}\n\nexport interface ChatResponse {\n content: string;\n reasoningContent: string | null;\n toolCalls: ToolCall[];\n usage: Usage;\n raw: unknown;\n}\n\nexport interface StreamChunk {\n contentDelta?: string;\n reasoningDelta?: string;\n toolCallDelta?: { index: number; id?: string; name?: string; argumentsDelta?: string };\n usage?: Usage;\n finishReason?: string;\n raw: any;\n}\n\nexport interface DeepSeekClientOptions {\n apiKey?: string;\n baseUrl?: string;\n timeoutMs?: number;\n fetch?: typeof fetch;\n /** Retry configuration. Pass `{ maxAttempts: 1 }` to disable retries. */\n retry?: RetryOptions;\n}\n\nexport class DeepSeekClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly timeoutMs: number;\n readonly retry: RetryOptions;\n private readonly _fetch: typeof fetch;\n\n constructor(opts: DeepSeekClientOptions = {}) {\n const apiKey = opts.apiKey ?? process.env.DEEPSEEK_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"DEEPSEEK_API_KEY is not set. Put it in .env or pass apiKey to DeepSeekClient.\",\n );\n }\n this.apiKey = apiKey;\n this.baseUrl = (\n opts.baseUrl ??\n process.env.DEEPSEEK_BASE_URL ??\n \"https://api.deepseek.com\"\n ).replace(/\\/+$/, \"\");\n this.timeoutMs = opts.timeoutMs ?? 120_000;\n this._fetch = opts.fetch ?? globalThis.fetch.bind(globalThis);\n this.retry = opts.retry ?? {};\n }\n\n private buildPayload(opts: ChatRequestOptions, stream: boolean) {\n const payload: Record<string, unknown> = {\n model: opts.model,\n messages: opts.messages,\n stream,\n };\n if (opts.tools?.length) payload.tools = opts.tools;\n if (opts.temperature !== undefined) payload.temperature = opts.temperature;\n if (opts.maxTokens !== undefined) payload.max_tokens = opts.maxTokens;\n if (opts.responseFormat) payload.response_format = opts.responseFormat;\n return payload;\n }\n\n async chat(opts: ChatRequestOptions): Promise<ChatResponse> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n const signal = opts.signal ?? ctrl.signal;\n\n try {\n const resp = await fetchWithRetry(\n this._fetch,\n `${this.baseUrl}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(this.buildPayload(opts, false)),\n signal,\n },\n { ...this.retry, signal },\n );\n if (!resp.ok) {\n throw new Error(`DeepSeek ${resp.status}: ${await resp.text()}`);\n }\n const data: any = await resp.json();\n const choice = data.choices?.[0]?.message ?? {};\n return {\n content: choice.content ?? \"\",\n reasoningContent: choice.reasoning_content ?? null,\n toolCalls: choice.tool_calls ?? [],\n usage: Usage.fromApi(data.usage),\n raw: data,\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n async *stream(opts: ChatRequestOptions): AsyncGenerator<StreamChunk> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n const signal = opts.signal ?? ctrl.signal;\n\n let resp: Response;\n try {\n // Only the initial fetch is retried. Once the server has started sending\n // the stream body we do NOT retry — a mid-stream retry would re-bill and\n // desync the session context.\n resp = await fetchWithRetry(\n this._fetch,\n `${this.baseUrl}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n },\n body: JSON.stringify(this.buildPayload(opts, true)),\n signal,\n },\n { ...this.retry, signal },\n );\n } catch (err) {\n clearTimeout(timer);\n throw err;\n }\n if (!resp.ok || !resp.body) {\n clearTimeout(timer);\n throw new Error(`DeepSeek ${resp.status}: ${await resp.text().catch(() => \"\")}`);\n }\n\n const queue: StreamChunk[] = [];\n let done = false;\n const parser = createParser({\n onEvent: (ev: EventSourceMessage) => {\n if (!ev.data || ev.data === \"[DONE]\") {\n done = true;\n return;\n }\n try {\n const json = JSON.parse(ev.data);\n const delta = json.choices?.[0]?.delta ?? {};\n const finishReason = json.choices?.[0]?.finish_reason ?? undefined;\n const chunk: StreamChunk = { raw: json, finishReason };\n if (typeof delta.content === \"string\" && delta.content.length > 0) {\n chunk.contentDelta = delta.content;\n }\n if (typeof delta.reasoning_content === \"string\" && delta.reasoning_content.length > 0) {\n chunk.reasoningDelta = delta.reasoning_content;\n }\n if (Array.isArray(delta.tool_calls) && delta.tool_calls.length > 0) {\n const tc = delta.tool_calls[0];\n chunk.toolCallDelta = {\n index: tc.index ?? 0,\n id: tc.id,\n name: tc.function?.name,\n argumentsDelta: tc.function?.arguments,\n };\n }\n if (json.usage) {\n chunk.usage = Usage.fromApi(json.usage);\n }\n queue.push(chunk);\n } catch {\n /* skip malformed sse frame */\n }\n },\n });\n\n const reader = resp.body.getReader();\n const decoder = new TextDecoder();\n try {\n while (true) {\n if (queue.length > 0) {\n yield queue.shift()!;\n continue;\n }\n if (done) break;\n const { value, done: streamDone } = await reader.read();\n if (streamDone) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n while (queue.length > 0) yield queue.shift()!;\n } finally {\n clearTimeout(timer);\n reader.releaseLock();\n }\n }\n}\n\nexport type { ChatMessage, ToolCall, ToolSpec };\n","/**\n * Retry layer for DeepSeek API calls.\n *\n * Wraps a `fetch` function so that transient failures (rate limiting, server\n * overload, network blips) don't kill an agent session. We explicitly DO NOT\n * retry:\n * - 4xx client errors other than 408 / 429 (bad key, bad request, ...)\n * - aborted requests (user cancelled)\n * - mid-stream body read errors (retrying costs money AND would desync)\n *\n * Retrying is controlled by attempt count + exponential backoff with jitter.\n * If the server sends a `Retry-After` header we honor it (capped by\n * `maxBackoffMs` so a misconfigured upstream can't park us forever).\n */\n\nexport interface RetryOptions {\n /** Maximum total attempts (including the first). Default 4. */\n maxAttempts?: number;\n /** Initial backoff in ms. Doubles each retry, with jitter. Default 500. */\n initialBackoffMs?: number;\n /** Upper bound on any single backoff delay. Default 10000 (10s). */\n maxBackoffMs?: number;\n /** HTTP statuses to treat as retryable. Default [408, 429, 500, 502, 503, 504]. */\n retryableStatuses?: readonly number[];\n /** Abort signal; we do NOT retry once aborted. */\n signal?: AbortSignal;\n /** Telemetry hook — called before each wait. */\n onRetry?: (info: RetryInfo) => void;\n}\n\nexport interface RetryInfo {\n attempt: number;\n reason: string;\n waitMs: number;\n}\n\nconst DEFAULT_RETRYABLE_STATUSES = [408, 429, 500, 502, 503, 504] as const;\n\nexport async function fetchWithRetry(\n fetchFn: typeof fetch,\n url: string,\n init: RequestInit,\n opts: RetryOptions = {},\n): Promise<Response> {\n const maxAttempts = opts.maxAttempts ?? 4;\n const initial = opts.initialBackoffMs ?? 500;\n const cap = opts.maxBackoffMs ?? 10_000;\n const retryable = new Set(opts.retryableStatuses ?? DEFAULT_RETRYABLE_STATUSES);\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (opts.signal?.aborted) throw new Error(\"aborted\");\n\n try {\n const resp = await fetchFn(url, init);\n\n // Success or non-retryable failure: return as-is.\n if (resp.ok || !retryable.has(resp.status)) return resp;\n\n // Retryable but out of attempts: return the last response so the caller\n // can surface the status to the user.\n if (attempt === maxAttempts - 1) return resp;\n\n // Drain the body so the connection can be reused on the next attempt.\n await resp.text().catch(() => undefined);\n\n const waitMs = computeWait(attempt, initial, cap, resp.headers.get(\"Retry-After\"));\n opts.onRetry?.({ attempt: attempt + 1, reason: `http ${resp.status}`, waitMs });\n await sleep(waitMs, opts.signal);\n } catch (err) {\n lastError = err;\n // Respect explicit aborts — do not retry.\n if (isAbortError(err) || opts.signal?.aborted) throw err;\n if (attempt === maxAttempts - 1) throw err;\n\n const waitMs = computeWait(attempt, initial, cap, null);\n opts.onRetry?.({\n attempt: attempt + 1,\n reason: `network: ${messageOf(err)}`,\n waitMs,\n });\n await sleep(waitMs, opts.signal);\n }\n }\n\n throw lastError ?? new Error(\"fetchWithRetry: loop exited unexpectedly\");\n}\n\nfunction computeWait(\n attempt: number,\n initial: number,\n cap: number,\n retryAfter: string | null,\n): number {\n if (retryAfter) {\n const seconds = Number.parseFloat(retryAfter);\n if (Number.isFinite(seconds) && seconds > 0) {\n return Math.min(seconds * 1000, cap);\n }\n }\n const exp = initial * 2 ** attempt;\n // Jitter range [75%, 125%] to spread retries out when many clients hit 429 together.\n const jitter = exp * (0.75 + Math.random() * 0.5);\n return Math.min(Math.max(jitter, 0), cap);\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n if (signal) {\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n };\n if (signal.aborted) onAbort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n const name = (err as { name?: unknown }).name;\n return name === \"AbortError\";\n}\n\nfunction messageOf(err: unknown): string {\n if (err instanceof Error) return err.message;\n try {\n return String(err);\n } catch {\n return \"unknown error\";\n }\n}\n","/**\n * Pillar 2 — R1 Thought Harvesting.\n *\n * Takes the `reasoning_content` emitted by a thinking model (deepseek-reasoner\n * / R1) and extracts a structured plan state by making a cheap secondary call\n * to V3 in JSON mode. The typed state is intended for the orchestrator to\n * branch on — e.g. trigger self-consistency sampling when `uncertainties.length\n * > 2`, or surface the subgoals to the user.\n *\n * Opt-in: loops disable harvesting by default. Failures (bad JSON, API error,\n * empty reasoning) return an empty TypedPlanState — the main turn is never\n * aborted because of a harvest hiccup.\n */\n\nimport type { DeepSeekClient } from \"./client.js\";\n\nexport interface TypedPlanState {\n subgoals: string[];\n hypotheses: string[];\n uncertainties: string[];\n rejectedPaths: string[];\n}\n\nexport interface HarvestOptions {\n /** Model used for the extraction call. Defaults to the cheap chat model. */\n model?: string;\n /** Cap on how many items land in each array. Default 5. */\n maxItems?: number;\n /** Per-item character cap. Default 80. */\n maxItemLen?: number;\n /** Abort the extraction if R1 reasoning is shorter than this. Default 40. */\n minReasoningLen?: number;\n}\n\nexport function emptyPlanState(): TypedPlanState {\n return { subgoals: [], hypotheses: [], uncertainties: [], rejectedPaths: [] };\n}\n\nexport function isPlanStateEmpty(s: TypedPlanState | null | undefined): boolean {\n if (!s) return true;\n return (\n s.subgoals.length === 0 &&\n s.hypotheses.length === 0 &&\n s.uncertainties.length === 0 &&\n s.rejectedPaths.length === 0\n );\n}\n\nconst SYSTEM_PROMPT = `You extract a typed plan state from a reasoning trace produced by another LLM.\nOutput ONLY a JSON object. No markdown, no prose, no backticks.\n\nSchema:\n{\n \"subgoals\": string[], // concrete intermediate objectives the trace identifies\n \"hypotheses\": string[], // candidate approaches or assumptions being weighed\n \"uncertainties\": string[], // facts the trace flags as unclear / to verify\n \"rejectedPaths\": string[] // approaches the trace considered and then abandoned\n}\n\nConstraints:\n- Every field must be present. Use [] if not applicable.\n- Each array has at most {maxItems} items.\n- Each item is plain text, at most {maxItemLen} characters, no markdown.\n- Write in the same language as the trace (Chinese in → Chinese out, etc.).\n- Do not quote back the trace; write short, specific phrases.`;\n\nexport async function harvest(\n reasoningContent: string | null | undefined,\n client?: DeepSeekClient,\n options: HarvestOptions = {},\n): Promise<TypedPlanState> {\n if (!client || !reasoningContent) return emptyPlanState();\n const minLen = options.minReasoningLen ?? 40;\n const trimmed = reasoningContent.trim();\n if (trimmed.length < minLen) return emptyPlanState();\n\n const model = options.model ?? \"deepseek-chat\";\n const maxItems = options.maxItems ?? 5;\n const maxItemLen = options.maxItemLen ?? 80;\n const system = SYSTEM_PROMPT.replace(\"{maxItems}\", String(maxItems)).replace(\n \"{maxItemLen}\",\n String(maxItemLen),\n );\n\n try {\n const resp = await client.chat({\n model,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: trimmed },\n ],\n responseFormat: { type: \"json_object\" },\n temperature: 0,\n maxTokens: 600,\n });\n return parsePlanState(resp.content, maxItems, maxItemLen);\n } catch {\n return emptyPlanState();\n }\n}\n\nfunction parsePlanState(raw: string, maxItems: number, maxItemLen: number): TypedPlanState {\n const text = (raw ?? \"\").trim();\n if (!text) return emptyPlanState();\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n // Occasionally a model wraps JSON in fences despite instructions.\n const match = text.match(/\\{[\\s\\S]*\\}/);\n if (!match) return emptyPlanState();\n try {\n parsed = JSON.parse(match[0]);\n } catch {\n return emptyPlanState();\n }\n }\n if (!parsed || typeof parsed !== \"object\") return emptyPlanState();\n const obj = parsed as Record<string, unknown>;\n return {\n subgoals: sanitizeArray(obj.subgoals, maxItems, maxItemLen),\n hypotheses: sanitizeArray(obj.hypotheses, maxItems, maxItemLen),\n uncertainties: sanitizeArray(obj.uncertainties, maxItems, maxItemLen),\n rejectedPaths: sanitizeArray(obj.rejectedPaths ?? obj.rejected_paths, maxItems, maxItemLen),\n };\n}\n\nfunction sanitizeArray(raw: unknown, maxItems: number, maxItemLen: number): string[] {\n if (!Array.isArray(raw)) return [];\n const out: string[] = [];\n for (const item of raw) {\n if (out.length >= maxItems) break;\n if (typeof item !== \"string\") continue;\n const cleaned = item.trim().replace(/\\s+/g, \" \");\n if (!cleaned) continue;\n out.push(cleaned.length <= maxItemLen ? cleaned : `${cleaned.slice(0, maxItemLen - 1)}…`);\n }\n return out;\n}\n","/**\n * Self-consistency branching.\n *\n * When enabled, the loop fans out into N parallel samples per turn (varied\n * temperatures), runs Pillar 2 harvest on each, and selects the sample with\n * the fewest flagged uncertainties (ties broken by answer length — a crude\n * Occam prior).\n *\n * The unique opportunity here: because DeepSeek is ~20× cheaper than Claude,\n * running N=3–5 samples per turn is still cheaper than a single Claude call,\n * while the majority-confidence selection tends to dominate single-sample\n * answers on fuzzy multi-step reasoning tasks.\n */\n\nimport type { ChatResponse, DeepSeekClient } from \"./client.js\";\nimport { type HarvestOptions, type TypedPlanState, harvest } from \"./harvest.js\";\nimport type { ChatRequestOptions } from \"./types.js\";\n\nexport interface BranchSample {\n index: number;\n temperature: number;\n response: ChatResponse;\n planState: TypedPlanState;\n}\n\nexport type BranchSelector = (samples: BranchSample[]) => BranchSample;\n\nexport interface BranchOptions {\n /** Number of parallel samples. 1 disables branching. Default 1. */\n budget?: number;\n /** Temperatures for each branch. Default spreads across [0, 1]. */\n temperatures?: readonly number[];\n /** Harvest options; the selector needs harvest to score samples. */\n harvestOptions?: HarvestOptions;\n /** Custom selector. Default: min uncertainties, tie-break shortest answer. */\n selector?: BranchSelector;\n /**\n * Fires as each sample finishes (main call + harvest both complete).\n * Useful for progress UI. Not awaited; exceptions are swallowed.\n */\n onSampleDone?: (sample: BranchSample) => void;\n}\n\nexport interface BranchResult {\n chosen: BranchSample;\n samples: BranchSample[];\n}\n\n/** Default: fewest uncertainties wins, ties broken by shorter answer content. */\nexport const defaultSelector: BranchSelector = (samples) => {\n if (samples.length === 0) throw new Error(\"defaultSelector: samples is empty\");\n return samples.slice().sort((a, b) => {\n const uDiff = a.planState.uncertainties.length - b.planState.uncertainties.length;\n if (uDiff !== 0) return uDiff;\n const aLen = a.response.content?.length ?? 0;\n const bLen = b.response.content?.length ?? 0;\n return aLen - bLen;\n })[0]!;\n};\n\nexport async function runBranches(\n client: DeepSeekClient,\n request: ChatRequestOptions,\n opts: BranchOptions = {},\n): Promise<BranchResult> {\n const budget = Math.max(1, opts.budget ?? 1);\n const temperatures = resolveTemperatures(budget, opts.temperatures);\n const selector = opts.selector ?? defaultSelector;\n\n const samples = await Promise.all(\n temperatures.map(async (temperature, index): Promise<BranchSample> => {\n const response = await client.chat({ ...request, temperature });\n const planState = await harvest(response.reasoningContent, client, opts.harvestOptions);\n const sample: BranchSample = { index, temperature, response, planState };\n try {\n opts.onSampleDone?.(sample);\n } catch {\n /* callback errors must not poison the await */\n }\n return sample;\n }),\n );\n\n return { chosen: selector(samples), samples };\n}\n\n/** Sum usage across branch samples for telemetry purposes. */\nexport function aggregateBranchUsage(samples: readonly BranchSample[]) {\n let promptTokens = 0;\n let completionTokens = 0;\n let totalTokens = 0;\n let promptCacheHitTokens = 0;\n let promptCacheMissTokens = 0;\n for (const s of samples) {\n promptTokens += s.response.usage.promptTokens;\n completionTokens += s.response.usage.completionTokens;\n totalTokens += s.response.usage.totalTokens;\n promptCacheHitTokens += s.response.usage.promptCacheHitTokens;\n promptCacheMissTokens += s.response.usage.promptCacheMissTokens;\n }\n return {\n promptTokens,\n completionTokens,\n totalTokens,\n promptCacheHitTokens,\n promptCacheMissTokens,\n };\n}\n\nfunction resolveTemperatures(budget: number, custom?: readonly number[]): number[] {\n if (custom && custom.length >= budget) return [...custom.slice(0, budget)];\n // Spread evenly across [0, 1] to encourage reasoning-path diversity.\n if (budget === 1) return [0];\n const out: number[] = [];\n for (let i = 0; i < budget; i++) {\n out.push(Number((i / (budget - 1)).toFixed(2)));\n }\n return out;\n}\n","import { createHash } from \"node:crypto\";\nimport type { ChatMessage, ToolSpec } from \"./types.js\";\n\nexport interface ImmutablePrefixOptions {\n system: string;\n toolSpecs?: readonly ToolSpec[];\n fewShots?: readonly ChatMessage[];\n}\n\nexport class ImmutablePrefix {\n readonly system: string;\n readonly toolSpecs: readonly ToolSpec[];\n readonly fewShots: readonly ChatMessage[];\n\n constructor(opts: ImmutablePrefixOptions) {\n this.system = opts.system;\n this.toolSpecs = Object.freeze([...(opts.toolSpecs ?? [])]);\n this.fewShots = Object.freeze([...(opts.fewShots ?? [])]);\n }\n\n toMessages(): ChatMessage[] {\n return [{ role: \"system\", content: this.system }, ...this.fewShots.map((m) => ({ ...m }))];\n }\n\n tools(): ToolSpec[] {\n return this.toolSpecs.map((t) => structuredClone(t) as ToolSpec);\n }\n\n get fingerprint(): string {\n const blob = JSON.stringify({\n system: this.system,\n tools: this.toolSpecs,\n shots: this.fewShots,\n });\n return createHash(\"sha256\").update(blob).digest(\"hex\").slice(0, 16);\n }\n}\n\nexport class AppendOnlyLog {\n private _entries: ChatMessage[] = [];\n\n append(message: ChatMessage): void {\n if (!message || typeof message !== \"object\" || !(\"role\" in message)) {\n throw new Error(`invalid log entry: ${JSON.stringify(message)}`);\n }\n this._entries.push(message);\n }\n\n extend(messages: ChatMessage[]): void {\n for (const m of messages) this.append(m);\n }\n\n get entries(): readonly ChatMessage[] {\n return this._entries;\n }\n\n toMessages(): ChatMessage[] {\n return this._entries.map((e) => ({ ...e }));\n }\n\n get length(): number {\n return this._entries.length;\n }\n}\n\nexport class VolatileScratch {\n reasoning: string | null = null;\n planState: Record<string, unknown> | null = null;\n notes: string[] = [];\n\n reset(): void {\n this.reasoning = null;\n this.planState = null;\n this.notes = [];\n }\n}\n","/**\n * Scavenge tool calls leaked into reasoning_content.\n *\n * R1 sometimes emits tool-call JSON inside <think>…</think> and then forgets\n * to surface it in `tool_calls`. This pass extracts plausible calls and\n * proposes them to the loop, which decides whether to merge them with the\n * declared calls.\n */\n\nimport type { ToolCall } from \"../types.js\";\n\nexport interface ScavengeOptions {\n /** Names of tools the model may legitimately call. Other names are ignored. */\n allowedNames: ReadonlySet<string>;\n /** Maximum number of calls to scavenge per pass (defence against runaway). */\n maxCalls?: number;\n}\n\nexport interface ScavengeResult {\n calls: ToolCall[];\n notes: string[];\n}\n\nexport function scavengeToolCalls(\n reasoningContent: string | null | undefined,\n opts: ScavengeOptions,\n): ScavengeResult {\n if (!reasoningContent) return { calls: [], notes: [] };\n const max = opts.maxCalls ?? 4;\n const notes: string[] = [];\n const out: ToolCall[] = [];\n\n for (const candidate of iterateJsonObjects(reasoningContent)) {\n if (out.length >= max) break;\n const call = coerceToToolCall(candidate, opts.allowedNames);\n if (call) {\n out.push(call);\n notes.push(`scavenged call: ${call.function.name}`);\n }\n }\n return { calls: out, notes };\n}\n\n/** Yield every top-level JSON object substring in `text`. */\nfunction* iterateJsonObjects(text: string): Generator<string> {\n for (let i = 0; i < text.length; i++) {\n if (text[i] !== \"{\") continue;\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let j = i; j < text.length; j++) {\n const c = text[j]!;\n if (escaped) {\n escaped = false;\n continue;\n }\n if (inString) {\n if (c === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (c === '\"') inString = false;\n continue;\n }\n if (c === '\"') inString = true;\n else if (c === \"{\") depth++;\n else if (c === \"}\") {\n depth--;\n if (depth === 0) {\n yield text.slice(i, j + 1);\n i = j;\n break;\n }\n }\n }\n }\n}\n\nfunction coerceToToolCall(\n candidateJson: string,\n allowedNames: ReadonlySet<string>,\n): ToolCall | null {\n let parsed: any;\n try {\n parsed = JSON.parse(candidateJson);\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== \"object\") return null;\n\n // Pattern 1: { name, arguments }\n if (typeof parsed.name === \"string\" && allowedNames.has(parsed.name)) {\n const args = parsed.arguments;\n return {\n function: {\n name: parsed.name,\n arguments: typeof args === \"string\" ? args : JSON.stringify(args ?? {}),\n },\n };\n }\n\n // Pattern 2: OpenAI-style { type: \"function\", function: { name, arguments } }\n if (\n parsed.type === \"function\" &&\n parsed.function &&\n typeof parsed.function.name === \"string\" &&\n allowedNames.has(parsed.function.name)\n ) {\n const args = parsed.function.arguments;\n return {\n type: \"function\",\n function: {\n name: parsed.function.name,\n arguments: typeof args === \"string\" ? args : JSON.stringify(args ?? {}),\n },\n };\n }\n\n // Pattern 3: { tool_name, tool_args } (R1 free-form variant)\n if (typeof parsed.tool_name === \"string\" && allowedNames.has(parsed.tool_name)) {\n return {\n function: {\n name: parsed.tool_name,\n arguments: JSON.stringify(parsed.tool_args ?? {}),\n },\n };\n }\n\n return null;\n}\n","import type { ToolCall } from \"../types.js\";\n\n/**\n * Call-storm breaker.\n *\n * Detects (tool, args) tuples repeating within a sliding window and suppresses\n * the offending call. Surfaces a synthetic tool_result advising the model to\n * change strategy on its next turn.\n */\nexport class StormBreaker {\n private readonly windowSize: number;\n private readonly threshold: number;\n private readonly recent: Array<readonly [string, string]> = [];\n\n constructor(windowSize = 6, threshold = 3) {\n this.windowSize = windowSize;\n this.threshold = threshold;\n }\n\n inspect(call: ToolCall): { suppress: boolean; reason?: string } {\n const sig = signature(call);\n if (!sig) return { suppress: false };\n const count = this.recent.reduce(\n (n, [name, args]) => (name === sig[0] && args === sig[1] ? n + 1 : n),\n 0,\n );\n if (count >= this.threshold - 1) {\n return {\n suppress: true,\n reason: `call-storm suppressed: ${sig[0]} called with identical args ${count + 1} times within window=${this.windowSize}`,\n };\n }\n this.recent.push(sig);\n while (this.recent.length > this.windowSize) this.recent.shift();\n return { suppress: false };\n }\n\n reset(): void {\n this.recent.length = 0;\n }\n}\n\nfunction signature(call: ToolCall): readonly [string, string] | null {\n const name = call.function?.name;\n if (!name) return null;\n return [name, call.function?.arguments ?? \"\"] as const;\n}\n","/**\n * Truncation recovery for tool-call argument JSON cut off mid-structure\n * (typically when the model hits max_tokens before finishing the JSON object).\n *\n * Strategy is purely local: balance braces, close strings, fill missing values\n * with `null`. We deliberately do NOT make a continuation API call here — that\n * decision belongs to the loop, which knows about budgets.\n */\n\nexport interface TruncationRepairResult {\n repaired: string;\n changed: boolean;\n notes: string[];\n}\n\nexport function repairTruncatedJson(input: string): TruncationRepairResult {\n const notes: string[] = [];\n if (!input || !input.trim()) {\n return { repaired: \"{}\", changed: input !== \"{}\", notes: [\"empty input → {}\"] };\n }\n // Fast path: already parseable.\n try {\n JSON.parse(input);\n return { repaired: input, changed: false, notes: [] };\n } catch {\n /* fall through */\n }\n\n const stack: (\"{\" | \"[\" | '\"')[] = [];\n let escaped = false;\n let inString = false;\n let lastSignificant = -1;\n\n for (let i = 0; i < input.length; i++) {\n const c = input[i]!;\n if (!/\\s/.test(c)) lastSignificant = i;\n if (escaped) {\n escaped = false;\n continue;\n }\n if (inString) {\n if (c === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (c === '\"') {\n inString = false;\n stack.pop();\n }\n continue;\n }\n if (c === '\"') {\n inString = true;\n stack.push('\"');\n continue;\n }\n if (c === \"{\" || c === \"[\") stack.push(c);\n else if (c === \"}\" || c === \"]\") stack.pop();\n }\n\n let s = input.slice(0, lastSignificant + 1);\n\n // Trim a trailing comma which would block re-parse.\n if (/,$/.test(s)) {\n s = s.replace(/,$/, \"\");\n notes.push(\"trimmed trailing comma\");\n }\n\n // If we ended on a key without a value: \"foo\": → \"foo\": null\n if (/\"\\s*:\\s*$/.test(s)) {\n s += \" null\";\n notes.push(\"filled dangling key with null\");\n }\n\n // If we ended inside a string, close it.\n if (inString) {\n s += '\"';\n stack.pop();\n notes.push(\"closed unterminated string\");\n }\n\n // Pop remaining open structures in reverse order.\n while (stack.length > 0) {\n const top = stack.pop();\n if (top === \"{\") s += \"}\";\n else if (top === \"[\") s += \"]\";\n else if (top === '\"') s += '\"';\n }\n\n try {\n JSON.parse(s);\n return { repaired: s, changed: true, notes };\n } catch (err) {\n notes.push(`fallback to {}: ${(err as Error).message}`);\n return { repaired: \"{}\", changed: true, notes };\n }\n}\n","/**\n * Schema flattening for DeepSeek tool calls.\n *\n * DeepSeek loses arguments on schemas that are deep (>2 levels of nesting) or\n * wide (>10 leaf parameters). This module transforms such schemas into a\n * dot-notation flat schema and re-nests the model's arguments before dispatch.\n *\n * Example:\n * { user: { profile: { name, age } } } ⇄ \"user.profile.name\", \"user.profile.age\"\n */\n\nimport type { JSONSchema } from \"../types.js\";\n\nexport interface FlattenDecision {\n shouldFlatten: boolean;\n leafCount: number;\n maxDepth: number;\n}\n\nexport function analyzeSchema(schema: JSONSchema | undefined): FlattenDecision {\n if (!schema) return { shouldFlatten: false, leafCount: 0, maxDepth: 0 };\n let leafCount = 0;\n let maxDepth = 0;\n walk(schema, 0, (depth, isLeaf) => {\n if (isLeaf) leafCount++;\n if (depth > maxDepth) maxDepth = depth;\n });\n return {\n shouldFlatten: leafCount > 10 || maxDepth > 2,\n leafCount,\n maxDepth,\n };\n}\n\nexport function flattenSchema(schema: JSONSchema): JSONSchema {\n const flatProps: Record<string, JSONSchema> = {};\n const required: string[] = [];\n collect(\"\", schema, flatProps, required, true);\n return {\n type: \"object\",\n properties: flatProps,\n required,\n };\n}\n\nexport function nestArguments(flatArgs: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(flatArgs)) {\n setByPath(out, key.split(\".\"), value);\n }\n return out;\n}\n\nfunction walk(\n schema: JSONSchema,\n depth: number,\n visit: (depth: number, isLeaf: boolean) => void,\n): void {\n if (schema.type === \"object\" && schema.properties) {\n for (const child of Object.values(schema.properties)) {\n walk(child, depth + 1, visit);\n }\n return;\n }\n if (schema.type === \"array\" && schema.items) {\n walk(schema.items, depth + 1, visit);\n return;\n }\n visit(depth, true);\n}\n\nfunction collect(\n prefix: string,\n schema: JSONSchema,\n out: Record<string, JSONSchema>,\n required: string[],\n isRootRequired: boolean,\n): void {\n if (schema.type === \"object\" && schema.properties) {\n const requiredSet = new Set(schema.required ?? []);\n for (const [key, child] of Object.entries(schema.properties)) {\n const nextPrefix = prefix ? `${prefix}.${key}` : key;\n const childRequired = isRootRequired && requiredSet.has(key);\n collect(nextPrefix, child, out, required, childRequired);\n }\n return;\n }\n // Treat anything non-object (including arrays) as a leaf for flattening purposes.\n out[prefix] = schema;\n if (isRootRequired) required.push(prefix);\n}\n\nfunction setByPath(target: Record<string, unknown>, path: string[], value: unknown): void {\n let cur: any = target;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i]!;\n if (typeof cur[key] !== \"object\" || cur[key] === null) cur[key] = {};\n cur = cur[key];\n }\n cur[path[path.length - 1]!] = value;\n}\n","/**\n * Pillar 3 — Tool-Call Repair pipeline.\n *\n * Order of passes per turn:\n * 1. scavenge — recover tool calls leaked into <think>\n * 2. truncation — close any half-emitted argument JSON\n * 3. storm breaker — drop call-storm repeats\n *\n * Schema flattening is applied during loop construction (it changes what we\n * advertise to the model), not per-turn.\n */\n\nimport type { ToolCall } from \"../types.js\";\nimport { scavengeToolCalls } from \"./scavenge.js\";\nimport { StormBreaker } from \"./storm.js\";\nimport { repairTruncatedJson } from \"./truncation.js\";\n\nexport { analyzeSchema, flattenSchema, nestArguments } from \"./flatten.js\";\nexport type { FlattenDecision } from \"./flatten.js\";\nexport { repairTruncatedJson } from \"./truncation.js\";\nexport type { TruncationRepairResult } from \"./truncation.js\";\nexport { scavengeToolCalls } from \"./scavenge.js\";\nexport type { ScavengeOptions, ScavengeResult } from \"./scavenge.js\";\nexport { StormBreaker } from \"./storm.js\";\n\nexport interface RepairReport {\n scavenged: number;\n truncationsFixed: number;\n stormsBroken: number;\n notes: string[];\n}\n\nexport interface ToolCallRepairOptions {\n allowedToolNames: ReadonlySet<string>;\n stormWindow?: number;\n stormThreshold?: number;\n maxScavenge?: number;\n}\n\nexport class ToolCallRepair {\n private readonly storm: StormBreaker;\n private readonly opts: ToolCallRepairOptions;\n\n constructor(opts: ToolCallRepairOptions) {\n this.opts = opts;\n this.storm = new StormBreaker(opts.stormWindow ?? 6, opts.stormThreshold ?? 3);\n }\n\n process(\n declaredCalls: ToolCall[],\n reasoningContent: string | null,\n ): { calls: ToolCall[]; report: RepairReport } {\n const report: RepairReport = {\n scavenged: 0,\n truncationsFixed: 0,\n stormsBroken: 0,\n notes: [],\n };\n\n // 1. Scavenge — only add calls whose (name,args) signature is novel.\n const scavenged = scavengeToolCalls(reasoningContent, {\n allowedNames: this.opts.allowedToolNames,\n maxCalls: this.opts.maxScavenge ?? 4,\n });\n const seenSignatures = new Set(declaredCalls.map(signature));\n const merged = [...declaredCalls];\n for (const sc of scavenged.calls) {\n if (!seenSignatures.has(signature(sc))) {\n merged.push(sc);\n report.scavenged++;\n seenSignatures.add(signature(sc));\n }\n }\n report.notes.push(...scavenged.notes);\n\n // 2. Truncation repair on argument JSON.\n for (const call of merged) {\n const args = call.function?.arguments ?? \"\";\n const r = repairTruncatedJson(args);\n if (r.changed) {\n call.function.arguments = r.repaired;\n report.truncationsFixed++;\n report.notes.push(...r.notes.map((n) => `[${call.function.name}] ${n}`));\n }\n }\n\n // 3. Storm breaker.\n const filtered: ToolCall[] = [];\n for (const call of merged) {\n const verdict = this.storm.inspect(call);\n if (verdict.suppress) {\n report.stormsBroken++;\n if (verdict.reason) report.notes.push(verdict.reason);\n continue;\n }\n filtered.push(call);\n }\n\n return { calls: filtered, report };\n }\n}\n\nfunction signature(call: ToolCall): string {\n return `${call.function?.name ?? \"\"}::${call.function?.arguments ?? \"\"}`;\n}\n","/**\n * Session persistence.\n *\n * Every turn's log entries (user / assistant / tool messages) are appended to\n * a JSONL file under `~/.reasonix/sessions/<name>.jsonl`. Next time the user\n * starts the CLI with the same session name, the loop pre-loads the file\n * into its AppendOnlyLog so the new turn has full prior context.\n *\n * Design notes:\n * - JSONL rather than JSON so concurrent writes don't corrupt.\n * - 0600 permissions on Unix (chmod no-ops on Windows).\n * - Name sanitization keeps paths safe: only [\\w-] and CJK letters pass;\n * anything else is replaced with underscore, max 64 chars.\n * - The loop's stats/session aren't persisted — only the message log.\n * Cost accounting resets each run (by design — old costs are sunk).\n */\n\nimport {\n appendFileSync,\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n statSync,\n unlinkSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { ChatMessage } from \"./types.js\";\n\nexport interface SessionInfo {\n name: string;\n path: string;\n size: number;\n messageCount: number;\n mtime: Date;\n}\n\nexport function sessionsDir(): string {\n return join(homedir(), \".reasonix\", \"sessions\");\n}\n\nexport function sessionPath(name: string): string {\n return join(sessionsDir(), `${sanitizeName(name)}.jsonl`);\n}\n\nexport function sanitizeName(name: string): string {\n const cleaned = name.replace(/[^\\w\\-\\u4e00-\\u9fa5]/g, \"_\").slice(0, 64);\n return cleaned || \"default\";\n}\n\nexport function loadSessionMessages(name: string): ChatMessage[] {\n const path = sessionPath(name);\n if (!existsSync(path)) return [];\n try {\n const raw = readFileSync(path, \"utf8\");\n const out: ChatMessage[] = [];\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const msg = JSON.parse(trimmed) as ChatMessage;\n if (msg && typeof msg === \"object\" && \"role\" in msg) out.push(msg);\n } catch {\n /* skip malformed line */\n }\n }\n return out;\n } catch {\n return [];\n }\n}\n\nexport function appendSessionMessage(name: string, message: ChatMessage): void {\n const path = sessionPath(name);\n mkdirSync(dirname(path), { recursive: true });\n appendFileSync(path, `${JSON.stringify(message)}\\n`, \"utf8\");\n try {\n chmodSync(path, 0o600);\n } catch {\n /* chmod not supported on this platform */\n }\n}\n\nexport function listSessions(): SessionInfo[] {\n const dir = sessionsDir();\n if (!existsSync(dir)) return [];\n try {\n const files = readdirSync(dir).filter((f) => f.endsWith(\".jsonl\"));\n return files\n .map((file) => {\n const path = join(dir, file);\n const stat = statSync(path);\n const name = file.replace(/\\.jsonl$/, \"\");\n const messageCount = countLines(path);\n return { name, path, size: stat.size, messageCount, mtime: stat.mtime };\n })\n .sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n } catch {\n return [];\n }\n}\n\nexport function deleteSession(name: string): boolean {\n const path = sessionPath(name);\n try {\n unlinkSync(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction countLines(path: string): number {\n try {\n const raw = readFileSync(path, \"utf8\");\n return raw.split(/\\r?\\n/).filter((l) => l.trim()).length;\n } catch {\n return 0;\n }\n}\n","import type { Usage } from \"./client.js\";\n\n/** USD per 1M tokens. Update as DeepSeek pricing changes. */\nexport const DEEPSEEK_PRICING: Record<\n string,\n { inputCacheHit: number; inputCacheMiss: number; output: number }\n> = {\n \"deepseek-chat\": { inputCacheHit: 0.07, inputCacheMiss: 0.27, output: 1.1 },\n \"deepseek-reasoner\": { inputCacheHit: 0.14, inputCacheMiss: 0.55, output: 2.19 },\n};\n\n/** Reference Claude Sonnet 4.6 pricing (USD per 1M tokens). */\nexport const CLAUDE_SONNET_PRICING = { input: 3.0, output: 15.0 };\n\nexport function costUsd(model: string, usage: Usage): number {\n const p = DEEPSEEK_PRICING[model];\n if (!p) return 0;\n return (\n (usage.promptCacheHitTokens * p.inputCacheHit +\n usage.promptCacheMissTokens * p.inputCacheMiss +\n usage.completionTokens * p.output) /\n 1_000_000\n );\n}\n\nexport function claudeEquivalentCost(usage: Usage): number {\n return (\n (usage.promptTokens * CLAUDE_SONNET_PRICING.input +\n usage.completionTokens * CLAUDE_SONNET_PRICING.output) /\n 1_000_000\n );\n}\n\nexport interface TurnStats {\n turn: number;\n model: string;\n usage: Usage;\n cost: number;\n cacheHitRatio: number;\n}\n\nexport interface SessionSummary {\n turns: number;\n totalCostUsd: number;\n claudeEquivalentUsd: number;\n savingsVsClaudePct: number;\n cacheHitRatio: number;\n}\n\nexport class SessionStats {\n readonly turns: TurnStats[] = [];\n\n record(turn: number, model: string, usage: Usage): TurnStats {\n const cost = costUsd(model, usage);\n const stats: TurnStats = {\n turn,\n model,\n usage,\n cost,\n cacheHitRatio: usage.cacheHitRatio,\n };\n this.turns.push(stats);\n return stats;\n }\n\n get totalCost(): number {\n return this.turns.reduce((sum, t) => sum + t.cost, 0);\n }\n\n get totalClaudeEquivalent(): number {\n return this.turns.reduce((sum, t) => sum + claudeEquivalentCost(t.usage), 0);\n }\n\n get savingsVsClaude(): number {\n const c = this.totalClaudeEquivalent;\n return c > 0 ? 1 - this.totalCost / c : 0;\n }\n\n get aggregateCacheHitRatio(): number {\n let hit = 0;\n let miss = 0;\n for (const t of this.turns) {\n hit += t.usage.promptCacheHitTokens;\n miss += t.usage.promptCacheMissTokens;\n }\n const denom = hit + miss;\n return denom > 0 ? hit / denom : 0;\n }\n\n summary(): SessionSummary {\n return {\n turns: this.turns.length,\n totalCostUsd: round(this.totalCost, 6),\n claudeEquivalentUsd: round(this.totalClaudeEquivalent, 6),\n savingsVsClaudePct: round(this.savingsVsClaude * 100, 2),\n cacheHitRatio: round(this.aggregateCacheHitRatio, 4),\n };\n }\n}\n\nfunction round(n: number, digits: number): number {\n const f = 10 ** digits;\n return Math.round(n * f) / f;\n}\n","import { analyzeSchema, flattenSchema, nestArguments } from \"./repair/flatten.js\";\nimport type { JSONSchema, ToolSpec } from \"./types.js\";\n\nexport interface ToolDefinition<A = any, R = any> {\n name: string;\n description?: string;\n parameters?: JSONSchema;\n fn: (args: A) => R | Promise<R>;\n}\n\ninterface InternalTool extends ToolDefinition {\n /**\n * Pillar 3 — flatten metadata. Set when the registered schema is deep\n * (>2 levels) or wide (>10 leaf params), conditions on which DeepSeek\n * V3/R1 are known to drop arguments. We advertise the flattened schema\n * to the model, then re-nest the model's args before calling fn.\n */\n flatSchema?: JSONSchema;\n}\n\nexport interface ToolRegistryOptions {\n /**\n * Auto-flatten schemas that exceed depth/width thresholds before sending\n * them to the model. Re-nests arguments transparently on dispatch.\n * Default: true. Pass false to opt out.\n */\n autoFlatten?: boolean;\n}\n\nexport class ToolRegistry {\n private readonly _tools = new Map<string, InternalTool>();\n private readonly _autoFlatten: boolean;\n\n constructor(opts: ToolRegistryOptions = {}) {\n this._autoFlatten = opts.autoFlatten !== false;\n }\n\n register<A, R>(def: ToolDefinition<A, R>): this {\n if (!def.name) throw new Error(\"tool requires a name\");\n const internal: InternalTool = { ...(def as ToolDefinition) };\n if (this._autoFlatten && def.parameters) {\n const decision = analyzeSchema(def.parameters);\n if (decision.shouldFlatten) {\n internal.flatSchema = flattenSchema(def.parameters);\n }\n }\n this._tools.set(def.name, internal);\n return this;\n }\n\n has(name: string): boolean {\n return this._tools.has(name);\n }\n\n get(name: string): ToolDefinition | undefined {\n return this._tools.get(name);\n }\n\n get size(): number {\n return this._tools.size;\n }\n\n /** True if a registered tool's schema was flattened for the model. */\n wasFlattened(name: string): boolean {\n return Boolean(this._tools.get(name)?.flatSchema);\n }\n\n specs(): ToolSpec[] {\n return [...this._tools.values()].map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description ?? \"\",\n parameters: t.flatSchema ?? t.parameters ?? { type: \"object\", properties: {} },\n },\n }));\n }\n\n async dispatch(name: string, argumentsRaw: string | Record<string, unknown>): Promise<string> {\n const tool = this._tools.get(name);\n if (!tool) {\n return JSON.stringify({ error: `unknown tool: ${name}` });\n }\n let args: Record<string, unknown>;\n try {\n args =\n typeof argumentsRaw === \"string\"\n ? argumentsRaw.trim()\n ? (JSON.parse(argumentsRaw) ?? {})\n : {}\n : (argumentsRaw ?? {});\n } catch (err) {\n return JSON.stringify({\n error: `invalid tool arguments JSON: ${(err as Error).message}`,\n });\n }\n\n // Re-nest dot-notation args back to the original shape, but only when\n // (a) we flattened this tool's schema, AND\n // (b) the incoming args actually use dot keys.\n // The second condition handles the case where a model ignores the flat\n // spec and emits nested args anyway — we shouldn't double-process them.\n if (tool.flatSchema && args && typeof args === \"object\" && hasDotKey(args)) {\n args = nestArguments(args);\n }\n\n try {\n const result = await tool.fn(args);\n return typeof result === \"string\" ? result : JSON.stringify(result);\n } catch (err) {\n return JSON.stringify({\n error: `${(err as Error).name}: ${(err as Error).message}`,\n });\n }\n }\n}\n\nfunction hasDotKey(obj: Record<string, unknown>): boolean {\n for (const k of Object.keys(obj)) {\n if (k.includes(\".\")) return true;\n }\n return false;\n}\n","import { type DeepSeekClient, Usage } from \"./client.js\";\nimport {\n type BranchOptions,\n type BranchSample,\n aggregateBranchUsage,\n runBranches,\n} from \"./consistency.js\";\nimport { type HarvestOptions, type TypedPlanState, emptyPlanState, harvest } from \"./harvest.js\";\nimport { AppendOnlyLog, type ImmutablePrefix, VolatileScratch } from \"./memory.js\";\nimport { type RepairReport, ToolCallRepair } from \"./repair/index.js\";\nimport { appendSessionMessage, loadSessionMessages } from \"./session.js\";\nimport { SessionStats, type TurnStats } from \"./telemetry.js\";\nimport { ToolRegistry } from \"./tools.js\";\nimport type { ChatMessage, ToolCall } from \"./types.js\";\n\nexport type EventRole =\n | \"assistant_delta\"\n | \"assistant_final\"\n | \"tool\"\n | \"done\"\n | \"error\"\n | \"branch_start\"\n | \"branch_progress\"\n | \"branch_done\";\n\nexport interface BranchSummary {\n budget: number;\n chosenIndex: number;\n uncertainties: number[]; // per-sample uncertainty counts\n temperatures: number[];\n}\n\nexport interface BranchProgress {\n completed: number;\n total: number;\n latestIndex: number;\n latestTemperature: number;\n latestUncertainties: number;\n}\n\nexport interface LoopEvent {\n turn: number;\n role: EventRole;\n content: string;\n reasoningDelta?: string;\n toolName?: string;\n stats?: TurnStats;\n planState?: TypedPlanState;\n repair?: RepairReport;\n branch?: BranchSummary;\n branchProgress?: BranchProgress;\n error?: string;\n}\n\nexport interface CacheFirstLoopOptions {\n client: DeepSeekClient;\n prefix: ImmutablePrefix;\n tools?: ToolRegistry;\n model?: string;\n maxToolIters?: number;\n stream?: boolean;\n /**\n * Pillar 2 — structured harvesting of R1 reasoning into a typed plan state.\n * Pass `true` for defaults or an options object. Off by default (adds a\n * cheap but non-zero V3 call per turn).\n */\n harvest?: boolean | HarvestOptions;\n /**\n * Self-consistency branching. Pass a number for just a budget (e.g. 3) or\n * a full `BranchOptions` object. Disables streaming for the branched turn\n * because all samples must complete before selection. Auto-enables harvest\n * since the default selector scores samples by plan-state uncertainty.\n */\n branch?: number | BranchOptions;\n /**\n * Session name. When set, the loop pre-loads the session's prior messages\n * into its log on construction, and appends every new log entry to\n * `~/.reasonix/sessions/<name>.jsonl` so the next run can resume.\n */\n session?: string;\n}\n\n/**\n * Pillar 1 — Cache-First Loop.\n *\n * - prefix is immutable (cache target)\n * - log is append-only (preserves prior-turn prefix)\n * - scratch is per-turn volatile (never sent upstream)\n *\n * Yields a stream of events so a TUI can render progressively.\n */\nexport interface ReconfigurableOptions {\n model?: string;\n harvest?: boolean | HarvestOptions;\n branch?: number | BranchOptions;\n stream?: boolean;\n}\n\nexport class CacheFirstLoop {\n readonly client: DeepSeekClient;\n readonly prefix: ImmutablePrefix;\n readonly tools: ToolRegistry;\n readonly maxToolIters: number;\n readonly log = new AppendOnlyLog();\n readonly scratch = new VolatileScratch();\n readonly stats = new SessionStats();\n readonly repair: ToolCallRepair;\n\n // Mutable via configure() — slash commands in the TUI / library callers tweak\n // these mid-session so users don't have to restart to try harvest or branch.\n model: string;\n stream: boolean;\n harvestEnabled: boolean;\n harvestOptions: HarvestOptions;\n branchEnabled: boolean;\n branchOptions: BranchOptions;\n sessionName: string | null;\n\n /** Number of messages that were pre-loaded from the session file. */\n readonly resumedMessageCount: number;\n\n private _turn = 0;\n private _streamPreference: boolean;\n\n constructor(opts: CacheFirstLoopOptions) {\n this.client = opts.client;\n this.prefix = opts.prefix;\n this.tools = opts.tools ?? new ToolRegistry();\n this.model = opts.model ?? \"deepseek-chat\";\n this.maxToolIters = opts.maxToolIters ?? 8;\n\n // Resolve branch config first (since it forces harvest on).\n if (typeof opts.branch === \"number\") {\n this.branchOptions = { budget: opts.branch };\n } else if (opts.branch && typeof opts.branch === \"object\") {\n this.branchOptions = opts.branch;\n } else {\n this.branchOptions = {};\n }\n this.branchEnabled = (this.branchOptions.budget ?? 1) > 1;\n\n // Branching requires harvest for its default selector to work.\n const harvestForced = this.branchEnabled;\n this.harvestEnabled =\n harvestForced ||\n opts.harvest === true ||\n (typeof opts.harvest === \"object\" && opts.harvest !== null);\n this.harvestOptions =\n typeof opts.harvest === \"object\" && opts.harvest !== null\n ? opts.harvest\n : (this.branchOptions.harvestOptions ?? {});\n\n // Streaming is incompatible with branching (need all samples to select).\n this._streamPreference = opts.stream ?? true;\n this.stream = this.branchEnabled ? false : this._streamPreference;\n\n const allowedNames = new Set([...this.prefix.toolSpecs.map((s) => s.function.name)]);\n this.repair = new ToolCallRepair({ allowedToolNames: allowedNames });\n\n // Session resume: pre-load prior messages into the log if a session name\n // is provided. New messages appended to the log are also persisted.\n this.sessionName = opts.session ?? null;\n if (this.sessionName) {\n const prior = loadSessionMessages(this.sessionName);\n for (const msg of prior) this.log.append(msg);\n this.resumedMessageCount = prior.length;\n } else {\n this.resumedMessageCount = 0;\n }\n }\n\n private appendAndPersist(message: ChatMessage): void {\n this.log.append(message);\n if (this.sessionName) {\n try {\n appendSessionMessage(this.sessionName, message);\n } catch {\n /* disk full or permission denied shouldn't kill the chat */\n }\n }\n }\n\n /**\n * Reconfigure model/harvest/branch/stream mid-session. The loop's log,\n * scratch, and stats are preserved — only the per-turn behavior changes.\n * Used by the TUI's slash commands and by library callers who want to\n * flip a knob between turns.\n */\n configure(opts: ReconfigurableOptions): void {\n if (opts.model !== undefined) this.model = opts.model;\n if (opts.stream !== undefined) this._streamPreference = opts.stream;\n\n if (opts.branch !== undefined) {\n if (typeof opts.branch === \"number\") {\n this.branchOptions = { budget: opts.branch };\n } else if (opts.branch && typeof opts.branch === \"object\") {\n this.branchOptions = opts.branch;\n } else {\n this.branchOptions = {};\n }\n this.branchEnabled = (this.branchOptions.budget ?? 1) > 1;\n }\n\n if (opts.harvest !== undefined) {\n const want =\n opts.harvest === true || (typeof opts.harvest === \"object\" && opts.harvest !== null);\n this.harvestEnabled = want || this.branchEnabled;\n if (typeof opts.harvest === \"object\" && opts.harvest !== null) {\n this.harvestOptions = opts.harvest;\n }\n } else if (this.branchEnabled) {\n // branch turned on without explicit harvest → force it on\n this.harvestEnabled = true;\n }\n\n // Branching always forces non-streaming; otherwise honor preference.\n this.stream = this.branchEnabled ? false : this._streamPreference;\n }\n\n private buildMessages(pendingUser: string | null): ChatMessage[] {\n const msgs: ChatMessage[] = [...this.prefix.toMessages(), ...this.log.toMessages()];\n if (pendingUser !== null) msgs.push({ role: \"user\", content: pendingUser });\n return msgs;\n }\n\n async *step(userInput: string): AsyncGenerator<LoopEvent> {\n this._turn++;\n this.scratch.reset();\n let pendingUser: string | null = userInput;\n const toolSpecs = this.prefix.tools();\n\n for (let iter = 0; iter < this.maxToolIters; iter++) {\n const messages = this.buildMessages(pendingUser);\n\n let assistantContent = \"\";\n let reasoningContent = \"\";\n let toolCalls: ToolCall[] = [];\n let usage: TurnStats[\"usage\"] | null = null;\n\n let branchSummary: BranchSummary | undefined;\n let preHarvestedPlanState: TypedPlanState | undefined;\n\n try {\n if (this.branchEnabled) {\n const budget = this.branchOptions.budget ?? 1;\n yield {\n turn: this._turn,\n role: \"branch_start\",\n content: \"\",\n branchProgress: {\n completed: 0,\n total: budget,\n latestIndex: -1,\n latestTemperature: -1,\n latestUncertainties: -1,\n },\n };\n\n // Queue samples as they complete so we can yield progress events\n // in resolution order (not launch order).\n const queue: BranchSample[] = [];\n let waiter: ((s: BranchSample) => void) | null = null;\n\n const onSampleDone = (sample: BranchSample) => {\n if (waiter) {\n const w = waiter;\n waiter = null;\n w(sample);\n } else {\n queue.push(sample);\n }\n };\n\n const branchPromise = runBranches(\n this.client,\n {\n model: this.model,\n messages,\n tools: toolSpecs.length ? toolSpecs : undefined,\n },\n {\n ...this.branchOptions,\n harvestOptions: this.harvestOptions,\n onSampleDone,\n },\n );\n\n for (let k = 0; k < budget; k++) {\n const sample: BranchSample =\n queue.shift() ??\n (await new Promise<BranchSample>((resolve) => {\n waiter = resolve;\n }));\n yield {\n turn: this._turn,\n role: \"branch_progress\",\n content: \"\",\n branchProgress: {\n completed: k + 1,\n total: budget,\n latestIndex: sample.index,\n latestTemperature: sample.temperature,\n latestUncertainties: sample.planState.uncertainties.length,\n },\n };\n }\n\n const result = await branchPromise;\n assistantContent = result.chosen.response.content;\n reasoningContent = result.chosen.response.reasoningContent ?? \"\";\n toolCalls = result.chosen.response.toolCalls;\n\n // Cost accounting: sum usage across ALL samples, not just the winner.\n // (We paid for all three.) Harvest-call tokens are not tracked; they\n // amount to rounding error compared to the main R1 calls.\n const agg = aggregateBranchUsage(result.samples);\n usage = new Usage(\n agg.promptTokens,\n agg.completionTokens,\n agg.totalTokens,\n agg.promptCacheHitTokens,\n agg.promptCacheMissTokens,\n );\n preHarvestedPlanState = result.chosen.planState;\n branchSummary = summarizeBranch(result.chosen, result.samples);\n yield {\n turn: this._turn,\n role: \"branch_done\",\n content: \"\",\n branch: branchSummary,\n };\n } else if (this.stream) {\n const callBuf: Map<number, ToolCall> = new Map();\n for await (const chunk of this.client.stream({\n model: this.model,\n messages,\n tools: toolSpecs.length ? toolSpecs : undefined,\n })) {\n if (chunk.contentDelta) {\n assistantContent += chunk.contentDelta;\n yield {\n turn: this._turn,\n role: \"assistant_delta\",\n content: chunk.contentDelta,\n };\n }\n if (chunk.reasoningDelta) {\n reasoningContent += chunk.reasoningDelta;\n yield {\n turn: this._turn,\n role: \"assistant_delta\",\n content: \"\",\n reasoningDelta: chunk.reasoningDelta,\n };\n }\n if (chunk.toolCallDelta) {\n const d = chunk.toolCallDelta;\n const cur = callBuf.get(d.index) ?? {\n id: d.id,\n type: \"function\" as const,\n function: { name: \"\", arguments: \"\" },\n };\n if (d.id) cur.id = d.id;\n if (d.name) cur.function.name = (cur.function.name ?? \"\") + d.name;\n if (d.argumentsDelta)\n cur.function.arguments = (cur.function.arguments ?? \"\") + d.argumentsDelta;\n callBuf.set(d.index, cur);\n }\n if (chunk.usage) usage = chunk.usage;\n }\n toolCalls = [...callBuf.values()];\n } else {\n const resp = await this.client.chat({\n model: this.model,\n messages,\n tools: toolSpecs.length ? toolSpecs : undefined,\n });\n assistantContent = resp.content;\n reasoningContent = resp.reasoningContent ?? \"\";\n toolCalls = resp.toolCalls;\n usage = resp.usage;\n }\n } catch (err) {\n yield {\n turn: this._turn,\n role: \"error\",\n content: \"\",\n error: (err as Error).message,\n };\n return;\n }\n\n const turnStats = this.stats.record(this._turn, this.model, usage ?? new Usage());\n\n // Commit the user turn to the log only on success of the first round-trip.\n if (pendingUser !== null) {\n this.appendAndPersist({ role: \"user\", content: pendingUser });\n pendingUser = null;\n }\n\n this.scratch.reasoning = reasoningContent || null;\n const planState = preHarvestedPlanState\n ? preHarvestedPlanState\n : this.harvestEnabled\n ? await harvest(reasoningContent || null, this.client, this.harvestOptions)\n : emptyPlanState();\n\n const { calls: repairedCalls, report } = this.repair.process(\n toolCalls,\n reasoningContent || null,\n );\n\n this.appendAndPersist(this.assistantMessage(assistantContent, repairedCalls));\n\n yield {\n turn: this._turn,\n role: \"assistant_final\",\n content: assistantContent,\n stats: turnStats,\n planState,\n repair: report,\n branch: branchSummary,\n };\n\n if (repairedCalls.length === 0) {\n yield { turn: this._turn, role: \"done\", content: assistantContent };\n return;\n }\n\n for (const call of repairedCalls) {\n const name = call.function?.name ?? \"\";\n const args = call.function?.arguments ?? \"{}\";\n const result = await this.tools.dispatch(name, args);\n this.appendAndPersist({\n role: \"tool\",\n tool_call_id: call.id ?? \"\",\n name,\n content: result,\n });\n yield { turn: this._turn, role: \"tool\", content: result, toolName: name };\n }\n }\n\n yield { turn: this._turn, role: \"done\", content: \"[max_tool_iters reached]\" };\n }\n\n async run(userInput: string, onEvent?: (ev: LoopEvent) => void): Promise<string> {\n let final = \"\";\n for await (const ev of this.step(userInput)) {\n onEvent?.(ev);\n if (ev.role === \"assistant_final\") final = ev.content;\n if (ev.role === \"done\") break;\n }\n return final;\n }\n\n private assistantMessage(content: string, toolCalls: ToolCall[]): ChatMessage {\n const msg: ChatMessage = { role: \"assistant\", content };\n if (toolCalls.length > 0) msg.tool_calls = toolCalls;\n return msg;\n }\n}\n\nfunction summarizeBranch(chosen: BranchSample, samples: BranchSample[]): BranchSummary {\n return {\n budget: samples.length,\n chosenIndex: chosen.index,\n uncertainties: samples.map((s) => s.planState.uncertainties.length),\n temperatures: samples.map((s) => s.temperature),\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n/**\n * Minimal `.env` loader; no dependency on dotenv.\n *\n * Reads KEY=VALUE lines and populates `process.env` for keys not already set.\n * Silently no-ops if the file is missing. Safe to call from library entry\n * points, CLI commands, examples, and benchmark runners.\n */\nexport function loadDotenv(path = \".env\"): void {\n let raw: string;\n try {\n raw = readFileSync(resolve(process.cwd(), path), \"utf8\");\n } catch {\n return;\n }\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq === -1) continue;\n const key = trimmed.slice(0, eq).trim();\n let value = trimmed.slice(eq + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (process.env[key] === undefined) process.env[key] = value;\n }\n}\n","/**\n * User-level config storage for the Reasonix CLI.\n *\n * Lookup order for the API key:\n * 1. `DEEPSEEK_API_KEY` env var (highest priority — for CI / power users)\n * 2. `~/.reasonix/config.json` (set by the first-run setup flow)\n *\n * The library itself never touches the config file — it only reads\n * `DEEPSEEK_API_KEY` from the environment. The CLI is responsible for\n * pulling from the config file and exposing it via env var to the loop.\n */\n\nimport { chmodSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport interface ReasonixConfig {\n apiKey?: string;\n baseUrl?: string;\n}\n\nexport function defaultConfigPath(): string {\n return join(homedir(), \".reasonix\", \"config.json\");\n}\n\nexport function readConfig(path: string = defaultConfigPath()): ReasonixConfig {\n try {\n const raw = readFileSync(path, \"utf8\");\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") return parsed as ReasonixConfig;\n } catch {\n /* missing or malformed → empty config */\n }\n return {};\n}\n\nexport function writeConfig(cfg: ReasonixConfig, path: string = defaultConfigPath()): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(cfg, null, 2), \"utf8\");\n // Restrict permissions on Unix; chmod is a no-op on Windows but won't throw.\n try {\n chmodSync(path, 0o600);\n } catch {\n /* ignore on platforms without chmod */\n }\n}\n\n/** Resolve the API key from env var first, then the config file. */\nexport function loadApiKey(path: string = defaultConfigPath()): string | undefined {\n if (process.env.DEEPSEEK_API_KEY) return process.env.DEEPSEEK_API_KEY;\n return readConfig(path).apiKey;\n}\n\nexport function saveApiKey(key: string, path: string = defaultConfigPath()): void {\n const cfg = readConfig(path);\n cfg.apiKey = key.trim();\n writeConfig(cfg, path);\n}\n\nexport function isPlausibleKey(key: string): boolean {\n const trimmed = key.trim();\n return /^sk-[A-Za-z0-9_-]{16,}$/.test(trimmed);\n}\n\n/** Mask a key for display: `sk-abcd...wxyz`. */\nexport function redactKey(key: string): string {\n if (!key) return \"\";\n if (key.length <= 12) return \"****\";\n return `${key.slice(0, 6)}…${key.slice(-4)}`;\n}\n","/** Reasonix — DeepSeek-native agent framework. Library entry point. */\n\nexport { DeepSeekClient, Usage } from \"./client.js\";\nexport type { ChatResponse, StreamChunk, DeepSeekClientOptions } from \"./client.js\";\n\nexport { CacheFirstLoop } from \"./loop.js\";\nexport type {\n CacheFirstLoopOptions,\n LoopEvent,\n EventRole,\n BranchSummary,\n BranchProgress,\n ReconfigurableOptions,\n} from \"./loop.js\";\n\nexport { runBranches, defaultSelector, aggregateBranchUsage } from \"./consistency.js\";\nexport type {\n BranchOptions,\n BranchSample,\n BranchResult,\n BranchSelector,\n} from \"./consistency.js\";\n\nexport { ImmutablePrefix, AppendOnlyLog, VolatileScratch } from \"./memory.js\";\nexport type { ImmutablePrefixOptions } from \"./memory.js\";\n\nexport { ToolRegistry } from \"./tools.js\";\nexport type { ToolDefinition } from \"./tools.js\";\n\nexport { SessionStats, costUsd, claudeEquivalentCost } from \"./telemetry.js\";\nexport type { TurnStats, SessionSummary } from \"./telemetry.js\";\n\nexport {\n ToolCallRepair,\n scavengeToolCalls,\n repairTruncatedJson,\n StormBreaker,\n analyzeSchema,\n flattenSchema,\n nestArguments,\n} from \"./repair/index.js\";\nexport type {\n RepairReport,\n ToolCallRepairOptions,\n ScavengeOptions,\n ScavengeResult,\n TruncationRepairResult,\n FlattenDecision,\n} from \"./repair/index.js\";\n\nexport { harvest, emptyPlanState, isPlanStateEmpty } from \"./harvest.js\";\nexport type { TypedPlanState, HarvestOptions } from \"./harvest.js\";\n\nexport {\n appendSessionMessage,\n deleteSession,\n listSessions,\n loadSessionMessages,\n sanitizeName as sanitizeSessionName,\n sessionPath,\n sessionsDir,\n} from \"./session.js\";\nexport type { SessionInfo } from \"./session.js\";\n\nexport { loadDotenv } from \"./env.js\";\n\nexport { fetchWithRetry } from \"./retry.js\";\nexport type { RetryOptions, RetryInfo } from \"./retry.js\";\n\nexport {\n defaultConfigPath,\n isPlausibleKey,\n loadApiKey,\n readConfig,\n redactKey,\n saveApiKey,\n writeConfig,\n} from \"./config.js\";\nexport type { ReasonixConfig } from \"./config.js\";\n\nexport type {\n ChatMessage,\n ToolCall,\n ToolSpec,\n ToolFunctionSpec,\n Role,\n JSONSchema,\n} from \"./types.js\";\n\nexport const VERSION = \"0.0.1\";\n","import { render } from \"ink\";\nimport React, { useState } from \"react\";\nimport { loadApiKey } from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { App } from \"../ui/App.js\";\nimport { Setup } from \"../ui/Setup.js\";\n\nexport interface ChatOptions {\n model: string;\n system: string;\n transcript?: string;\n harvest?: boolean;\n branch?: number;\n session?: string;\n}\n\ninterface RootProps extends ChatOptions {\n initialKey: string | undefined;\n}\n\nfunction Root({ initialKey, ...appProps }: RootProps) {\n const [key, setKey] = useState<string | undefined>(initialKey);\n if (!key) {\n return (\n <Setup\n onReady={(k) => {\n process.env.DEEPSEEK_API_KEY = k;\n setKey(k);\n }}\n />\n );\n }\n // Ensure the loop's DeepSeekClient picks up the key when it lazy-instantiates.\n process.env.DEEPSEEK_API_KEY = key;\n return (\n <App\n model={appProps.model}\n system={appProps.system}\n transcript={appProps.transcript}\n harvest={appProps.harvest}\n branch={appProps.branch}\n session={appProps.session}\n />\n );\n}\n\nexport async function chatCommand(opts: ChatOptions): Promise<void> {\n loadDotenv();\n const initialKey = loadApiKey();\n const { waitUntilExit } = render(<Root initialKey={initialKey} {...opts} />, {\n exitOnCtrlC: true,\n });\n await waitUntilExit();\n}\n","import { type WriteStream, createWriteStream } from \"node:fs\";\nimport { Box, Static, Text, useApp } from \"ink\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\nimport type { LoopEvent } from \"../../loop.js\";\nimport type { SessionSummary } from \"../../telemetry.js\";\nimport { type DisplayEvent, EventRow } from \"./EventLog.js\";\nimport { PromptInput } from \"./PromptInput.js\";\nimport { StatsPanel } from \"./StatsPanel.js\";\nimport { handleSlash, parseSlash } from \"./slash.js\";\n\nexport interface AppProps {\n model: string;\n system: string;\n transcript?: string;\n harvest?: boolean;\n branch?: number;\n session?: string;\n}\n\n/**\n * Throttle interval in ms. We flush streaming deltas at most this often to\n * avoid re-rendering the whole UI on every single token from DeepSeek.\n * 60ms ≈ 16Hz, fast enough to feel live, slow enough to not thrash Ink.\n */\nconst FLUSH_INTERVAL_MS = 60;\n\ninterface StreamingState {\n id: string;\n text: string;\n reasoning: string;\n}\n\nexport function App({ model, system, transcript, harvest, branch, session }: AppProps) {\n const { exit } = useApp();\n const [historical, setHistorical] = useState<DisplayEvent[]>([]);\n const [streaming, setStreaming] = useState<DisplayEvent | null>(null);\n const [input, setInput] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [summary, setSummary] = useState<SessionSummary>({\n turns: 0,\n totalCostUsd: 0,\n claudeEquivalentUsd: 0,\n savingsVsClaudePct: 0,\n cacheHitRatio: 0,\n });\n\n const transcriptRef = useRef<WriteStream | null>(null);\n if (transcript && !transcriptRef.current) {\n transcriptRef.current = createWriteStream(transcript, { flags: \"a\" });\n }\n useEffect(() => {\n return () => {\n transcriptRef.current?.end();\n };\n }, []);\n\n const loopRef = useRef<CacheFirstLoop | null>(null);\n const loop = useMemo(() => {\n if (loopRef.current) return loopRef.current;\n const client = new DeepSeekClient();\n const prefix = new ImmutablePrefix({ system });\n const l = new CacheFirstLoop({ client, prefix, model, harvest, branch, session });\n loopRef.current = l;\n return l;\n }, [model, system, harvest, branch, session]);\n\n // Surface a one-time banner about session state on first mount.\n const sessionBannerShown = useRef(false);\n useEffect(() => {\n if (sessionBannerShown.current) return;\n sessionBannerShown.current = true;\n if (!session) {\n setHistorical((prev) => [\n ...prev,\n {\n id: `sys-session-${Date.now()}`,\n role: \"info\",\n text: \"▸ ephemeral chat (no session persistence) — drop --no-session to enable\",\n },\n ]);\n } else if (loop.resumedMessageCount > 0) {\n setHistorical((prev) => [\n ...prev,\n {\n id: `sys-resume-${Date.now()}`,\n role: \"info\",\n text: `▸ resumed session \"${session}\" with ${loop.resumedMessageCount} prior messages · /forget to start over · /sessions to list`,\n },\n ]);\n } else {\n setHistorical((prev) => [\n ...prev,\n {\n id: `sys-newsession-${Date.now()}`,\n role: \"info\",\n text: `▸ session \"${session}\" (new) — auto-saved as you chat · /forget to delete · /sessions to list`,\n },\n ]);\n }\n }, [session, loop]);\n\n const prefixHash = loop.prefix.fingerprint;\n\n const writeTranscript = useCallback((ev: LoopEvent) => {\n transcriptRef.current?.write(\n `${JSON.stringify({\n ts: new Date().toISOString(),\n turn: ev.turn,\n role: ev.role,\n content: ev.content,\n tool: ev.toolName,\n })}\\n`,\n );\n }, []);\n\n const handleSubmit = useCallback(\n async (raw: string) => {\n const text = raw.trim();\n if (!text || busy) return;\n setInput(\"\");\n const slash = parseSlash(text);\n if (slash) {\n const result = handleSlash(slash.cmd, slash.args, loop);\n if (result.exit) {\n transcriptRef.current?.end();\n exit();\n return;\n }\n if (result.clear) {\n setHistorical([]);\n return;\n }\n if (result.info) {\n setHistorical((prev) => [\n ...prev,\n {\n id: `sys-${Date.now()}`,\n role: \"info\",\n text: result.info!,\n },\n ]);\n }\n return;\n }\n\n // User message is immutable — push to Static immediately.\n setHistorical((prev) => [...prev, { id: `u-${Date.now()}`, role: \"user\", text }]);\n\n const assistantId = `a-${Date.now()}`;\n // Refs are the source of truth for accumulated streaming text; the React\n // state copy below is only for rendering and gets updated on flush.\n const streamRef: StreamingState = { id: assistantId, text: \"\", reasoning: \"\" };\n const contentBuf = { current: \"\" };\n const reasoningBuf = { current: \"\" };\n\n setStreaming({ id: assistantId, role: \"assistant\", text: \"\", streaming: true });\n setBusy(true);\n\n const flush = () => {\n if (!contentBuf.current && !reasoningBuf.current) return;\n streamRef.text += contentBuf.current;\n streamRef.reasoning += reasoningBuf.current;\n contentBuf.current = \"\";\n reasoningBuf.current = \"\";\n setStreaming({\n id: assistantId,\n role: \"assistant\",\n text: streamRef.text,\n reasoning: streamRef.reasoning || undefined,\n streaming: true,\n });\n };\n const timer = setInterval(flush, FLUSH_INTERVAL_MS);\n\n try {\n for await (const ev of loop.step(text)) {\n writeTranscript(ev);\n if (ev.role === \"assistant_delta\") {\n if (ev.content) contentBuf.current += ev.content;\n if (ev.reasoningDelta) reasoningBuf.current += ev.reasoningDelta;\n } else if (ev.role === \"branch_start\") {\n setStreaming({\n id: assistantId,\n role: \"assistant\",\n text: \"\",\n streaming: true,\n branchProgress: ev.branchProgress,\n });\n } else if (ev.role === \"branch_progress\") {\n // Live-update the streaming slot with per-sample completion info.\n setStreaming({\n id: assistantId,\n role: \"assistant\",\n text: \"\",\n streaming: true,\n branchProgress: ev.branchProgress,\n });\n } else if (ev.role === \"branch_done\") {\n // Intermediate: branching finished but assistant_final not yet emitted.\n // Keep streaming state alive; actual render happens on assistant_final.\n } else if (ev.role === \"assistant_final\") {\n flush();\n const repairNote = ev.repair ? describeRepair(ev.repair) : \"\";\n setStreaming(null);\n setHistorical((prev) => [\n ...prev,\n {\n id: assistantId,\n role: \"assistant\",\n text: ev.content || streamRef.text,\n reasoning: streamRef.reasoning || undefined,\n planState: ev.planState,\n branch: ev.branch,\n stats: ev.stats,\n repair: repairNote || undefined,\n streaming: false,\n },\n ]);\n } else if (ev.role === \"tool\") {\n flush();\n setHistorical((prev) => [\n ...prev,\n {\n id: `t-${Date.now()}-${Math.random()}`,\n role: \"tool\",\n text: ev.content,\n toolName: ev.toolName,\n },\n ]);\n } else if (ev.role === \"error\") {\n setHistorical((prev) => [\n ...prev,\n { id: `e-${Date.now()}`, role: \"error\", text: ev.error ?? ev.content },\n ]);\n }\n }\n flush();\n } finally {\n clearInterval(timer);\n setStreaming(null);\n setSummary(loop.stats.summary());\n setBusy(false);\n }\n },\n [busy, exit, loop, writeTranscript],\n );\n\n return (\n <Box flexDirection=\"column\">\n <StatsPanel\n summary={summary}\n model={loop.model}\n prefixHash={prefixHash}\n harvestOn={loop.harvestEnabled}\n branchBudget={loop.branchOptions.budget}\n />\n <Static items={historical}>{(item) => <EventRow key={item.id} event={item} />}</Static>\n {streaming ? (\n <Box marginY={1}>\n <EventRow event={streaming} />\n </Box>\n ) : null}\n <PromptInput value={input} onChange={setInput} onSubmit={handleSubmit} disabled={busy} />\n <CommandStrip />\n </Box>\n );\n}\n\nfunction CommandStrip() {\n return (\n <Box paddingX={2}>\n <Text dimColor>\n /help · /preset {\"<fast|smart|max>\"} · /sessions · /model · /harvest · /branch · /clear ·\n /exit\n </Text>\n </Box>\n );\n}\n\nfunction describeRepair(repair: {\n scavenged: number;\n truncationsFixed: number;\n stormsBroken: number;\n}): string {\n const parts: string[] = [];\n if (repair.scavenged) parts.push(`scavenged ${repair.scavenged}`);\n if (repair.truncationsFixed) parts.push(`repaired ${repair.truncationsFixed} truncation`);\n if (repair.stormsBroken) parts.push(`broke ${repair.stormsBroken} storm`);\n return parts.length ? `[repair] ${parts.join(\", \")}` : \"\";\n}\n","import { Box, Text } from \"ink\";\nimport React, { useEffect, useState } from \"react\";\nimport { type TypedPlanState, isPlanStateEmpty } from \"../../harvest.js\";\nimport type { BranchProgress, BranchSummary } from \"../../loop.js\";\nimport type { TurnStats } from \"../../telemetry.js\";\nimport { Markdown } from \"./markdown.js\";\n\nexport type DisplayRole = \"user\" | \"assistant\" | \"tool\" | \"system\" | \"error\" | \"info\";\n\nexport interface DisplayEvent {\n id: string;\n role: DisplayRole;\n text: string;\n reasoning?: string;\n planState?: TypedPlanState;\n branch?: BranchSummary;\n branchProgress?: BranchProgress;\n toolName?: string;\n stats?: TurnStats;\n repair?: string;\n streaming?: boolean;\n}\n\nexport const EventRow = React.memo(function EventRow({ event }: { event: DisplayEvent }) {\n if (event.role === \"user\") {\n return (\n <Box>\n <Text bold color=\"cyan\">\n you ›{\" \"}\n </Text>\n <Text>{event.text}</Text>\n </Box>\n );\n }\n if (event.role === \"assistant\") {\n if (event.streaming) return <StreamingAssistant event={event} />;\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text bold color=\"green\">\n assistant\n </Text>\n </Box>\n {event.branch ? <BranchBlock branch={event.branch} /> : null}\n {event.reasoning ? <ReasoningBlock reasoning={event.reasoning} /> : null}\n {!isPlanStateEmpty(event.planState) ? (\n <PlanStateBlock planState={event.planState!} />\n ) : null}\n {event.text ? <Markdown text={event.text} /> : <Text dimColor>(no content)</Text>}\n {event.stats ? <StatsLine stats={event.stats} /> : null}\n {event.repair ? <Text color=\"magenta\">{event.repair}</Text> : null}\n </Box>\n );\n }\n if (event.role === \"tool\") {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"yellow\">{`tool<${event.toolName ?? \"?\"}> →`}</Text>\n <Text dimColor> {truncate(event.text, 400)}</Text>\n </Box>\n );\n }\n if (event.role === \"error\") {\n return (\n <Box marginTop={1}>\n <Text color=\"red\" bold>\n error{\" \"}\n </Text>\n <Text color=\"red\">{event.text}</Text>\n </Box>\n );\n }\n if (event.role === \"info\") {\n return (\n <Box>\n <Text dimColor>{event.text}</Text>\n </Box>\n );\n }\n return (\n <Box>\n <Text>{event.text}</Text>\n </Box>\n );\n});\n\nfunction BranchBlock({ branch }: { branch: BranchSummary }) {\n const per = branch.uncertainties\n .map((u, i) => {\n const marker = i === branch.chosenIndex ? \"▸\" : \" \";\n const t = (branch.temperatures[i] ?? 0).toFixed(1);\n return `${marker} #${i} T=${t} u=${u}`;\n })\n .join(\" \");\n return (\n <Box>\n <Text color=\"blue\">\n {\"🔀 branched \"}\n <Text bold>{branch.budget}</Text>\n {` samples → picked #${branch.chosenIndex} `}\n <Text dimColor>{per}</Text>\n </Text>\n </Box>\n );\n}\n\nfunction PlanStateBlock({ planState }: { planState: TypedPlanState }) {\n const lines: Array<[string, string[]]> = [];\n if (planState.subgoals.length) lines.push([\"subgoals\", planState.subgoals]);\n if (planState.hypotheses.length) lines.push([\"hypotheses\", planState.hypotheses]);\n if (planState.uncertainties.length) lines.push([\"uncertainties\", planState.uncertainties]);\n if (planState.rejectedPaths.length) lines.push([\"rejected\", planState.rejectedPaths]);\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n {lines.map(([label, items]) => (\n <Text key={label} color=\"magenta\">\n {\"‹ \"}\n <Text bold>{label}</Text>\n {` (${items.length}): ${items.join(\" · \")}`}\n </Text>\n ))}\n </Box>\n );\n}\n\nfunction ReasoningBlock({ reasoning }: { reasoning: string }) {\n const max = 220;\n const flat = reasoning.replace(/\\s+/g, \" \").trim();\n const preview =\n flat.length <= max ? flat : `${flat.slice(0, max)}… (+${flat.length - max} chars)`;\n return (\n <Box marginBottom={1}>\n <Text dimColor italic>\n {\"↳ thinking: \"}\n {preview}\n </Text>\n </Box>\n );\n}\n\n/**\n * Compact progress view rendered while a turn is still streaming. We keep\n * this to a fixed ~3-line footprint so the dynamic region never scrolls past\n * the terminal viewport and leaves artifacts in scrollback.\n */\nfunction Elapsed() {\n const [s, setS] = useState(0);\n useEffect(() => {\n const start = Date.now();\n const id = setInterval(() => setS(Math.floor((Date.now() - start) / 1000)), 1000);\n return () => clearInterval(id);\n }, []);\n const mm = String(Math.floor(s / 60)).padStart(2, \"0\");\n const ss = String(s % 60).padStart(2, \"0\");\n return <Text dimColor>{`${mm}:${ss}`}</Text>;\n}\n\nfunction StreamingAssistant({ event }: { event: DisplayEvent }) {\n if (event.branchProgress) {\n const p = event.branchProgress;\n // completed=0 means we've just started; no sample has finished yet.\n if (p.completed === 0) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text bold color=\"green\">\n assistant{\" \"}\n </Text>\n <Text color=\"blue\">\n 🔀 launching {p.total} parallel samples (R1 thinking in parallel)…{\" \"}\n </Text>\n <Elapsed />\n </Box>\n <Text dimColor>{\" \"}spread across T=0.0/0.5/1.0 · typical wait 30-90s for reasoner</Text>\n </Box>\n );\n }\n const pct = Math.round((p.completed / p.total) * 100);\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text bold color=\"green\">\n assistant{\" \"}\n </Text>\n <Text color=\"blue\">\n 🔀 branching {p.completed}/{p.total} ({pct}%){\" \"}\n </Text>\n <Elapsed />\n </Box>\n <Text dimColor>\n {\" latest #\"}\n {p.latestIndex}\n {\" T=\"}\n {p.latestTemperature.toFixed(1)}\n {\" u=\"}\n {p.latestUncertainties}\n {p.completed < p.total ? \" · waiting for other samples…\" : \" · selecting winner…\"}\n </Text>\n </Box>\n );\n }\n\n const tail = lastLine(event.text, 140);\n const reasoningTail = event.reasoning ? lastLine(event.reasoning, 120) : \"\";\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text bold color=\"green\">\n assistant{\" \"}\n </Text>\n <Text dimColor>\n (streaming · {event.text.length}\n {event.reasoning ? ` + think ${event.reasoning.length}` : \"\"} chars){\" \"}\n </Text>\n <Elapsed />\n </Box>\n {reasoningTail ? (\n <Text dimColor italic>\n ↳ thinking: {reasoningTail}\n </Text>\n ) : null}\n {tail ? (\n <Text dimColor>▸ {tail}</Text>\n ) : (\n <Text dimColor italic>\n {\" (waiting for first token…)\"}\n </Text>\n )}\n </Box>\n );\n}\n\nfunction lastLine(s: string, maxChars: number): string {\n const flat = s.replace(/\\s+/g, \" \").trim();\n if (!flat) return \"\";\n return flat.length <= maxChars ? flat : `…${flat.slice(-maxChars)}`;\n}\n\nfunction StatsLine({ stats }: { stats: TurnStats }) {\n const hit = (stats.cacheHitRatio * 100).toFixed(1);\n return (\n <Text dimColor>\n {\" ↳ cache \"}\n {hit}\n {\"% · tokens \"}\n {stats.usage.promptTokens}\n {\"→\"}\n {stats.usage.completionTokens}\n {\" · $\"}\n {stats.cost.toFixed(6)}\n </Text>\n );\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max)}… (+${s.length - max} chars)`;\n}\n","/**\n * Minimal Markdown → Ink renderer for chat output.\n *\n * Handles the subset that actually shows up in LLM answers:\n * - ATX headers (# ##)\n * - Unordered / ordered lists\n * - Fenced code blocks (```lang)\n * - Inline **bold**, *italic*, `code`\n * - Paragraphs separated by blank lines\n * - LaTeX delimiters are stripped (\\( \\), \\[ \\], \\boxed{X})\n *\n * The goal is not TeX-perfect math — it's \"stop showing raw backslashes to\n * the user.\" When the model insists on LaTeX, we strip the scaffolding and\n * show the expression verbatim; terminals don't do math fonts anyway.\n */\n\nimport { Box, Text } from \"ink\";\nimport React from \"react\";\n\nconst SUPERSCRIPT: Record<string, string> = {\n \"0\": \"⁰\",\n \"1\": \"¹\",\n \"2\": \"²\",\n \"3\": \"³\",\n \"4\": \"⁴\",\n \"5\": \"⁵\",\n \"6\": \"⁶\",\n \"7\": \"⁷\",\n \"8\": \"⁸\",\n \"9\": \"⁹\",\n \"+\": \"⁺\",\n \"-\": \"⁻\",\n n: \"ⁿ\",\n};\nconst SUBSCRIPT: Record<string, string> = {\n \"0\": \"₀\",\n \"1\": \"₁\",\n \"2\": \"₂\",\n \"3\": \"₃\",\n \"4\": \"₄\",\n \"5\": \"₅\",\n \"6\": \"₆\",\n \"7\": \"₇\",\n \"8\": \"₈\",\n \"9\": \"₉\",\n \"+\": \"₊\",\n \"-\": \"₋\",\n};\n\nfunction toSuperscript(s: string): string {\n let out = \"\";\n for (const c of s) out += SUPERSCRIPT[c] ?? c;\n return out;\n}\nfunction toSubscript(s: string): string {\n let out = \"\";\n for (const c of s) out += SUBSCRIPT[c] ?? c;\n return out;\n}\n\nexport function stripMath(s: string): string {\n return (\n s\n // Delimiters\n .replace(/\\\\\\(\\s*/g, \"\")\n .replace(/\\s*\\\\\\)/g, \"\")\n .replace(/\\\\\\[\\s*/g, \"\\n\")\n .replace(/\\s*\\\\\\]/g, \"\\n\")\n // Fractions — \\frac, \\dfrac, \\tfrac. Allow whitespace and one nesting\n // level inside braces (e.g. \\frac{\\sqrt{2}}{3}). Trim captured groups\n // so '\\frac{ a }{ b }' renders as '(a)/(b)'.\n .replace(\n /\\\\[dt]?frac\\s*\\{((?:[^{}]|\\{[^{}]*\\})+)\\}\\s*\\{((?:[^{}]|\\{[^{}]*\\})+)\\}/g,\n (_m, num: string, den: string) => `(${num.trim()})/(${den.trim()})`,\n )\n .replace(\n /\\\\binom\\s*\\{([^{}]+)\\}\\s*\\{([^{}]+)\\}/g,\n (_m, n: string, k: string) => `C(${n.trim()},${k.trim()})`,\n )\n .replace(/\\\\sqrt\\s*\\{([^{}]+)\\}/g, (_m, g: string) => `√(${g.trim()})`)\n .replace(/\\\\boxed\\s*\\{([^{}]+)\\}/g, (_m, g: string) => `【${g.trim()}】`)\n .replace(/\\\\text\\s*\\{([^{}]+)\\}/g, (_m, g: string) => g.trim())\n .replace(/\\\\overline\\s*\\{([^{}]+)\\}/g, (_m, g: string) => `${g.trim()}̄`)\n .replace(/\\\\hat\\s*\\{([^{}]+)\\}/g, (_m, g: string) => `${g.trim()}̂`)\n .replace(/\\\\vec\\s*\\{([^{}]+)\\}/g, (_m, g: string) => `→${g.trim()}`)\n // Operators & symbols\n .replace(/\\\\cdot/g, \"·\")\n .replace(/\\\\times/g, \"×\")\n .replace(/\\\\div/g, \"÷\")\n .replace(/\\\\pm/g, \"±\")\n .replace(/\\\\mp/g, \"∓\")\n .replace(/\\\\leq/g, \"≤\")\n .replace(/\\\\geq/g, \"≥\")\n .replace(/\\\\neq/g, \"≠\")\n .replace(/\\\\approx/g, \"≈\")\n .replace(/\\\\in\\b/g, \"∈\")\n .replace(/\\\\notin\\b/g, \"∉\")\n .replace(/\\\\infty/g, \"∞\")\n .replace(/\\\\sum\\b/g, \"Σ\")\n .replace(/\\\\prod\\b/g, \"Π\")\n .replace(/\\\\int\\b/g, \"∫\")\n // Greek letters\n .replace(/\\\\alpha/g, \"α\")\n .replace(/\\\\beta/g, \"β\")\n .replace(/\\\\gamma/g, \"γ\")\n .replace(/\\\\delta/g, \"δ\")\n .replace(/\\\\theta/g, \"θ\")\n .replace(/\\\\lambda/g, \"λ\")\n .replace(/\\\\mu/g, \"μ\")\n .replace(/\\\\pi/g, \"π\")\n .replace(/\\\\sigma/g, \"σ\")\n .replace(/\\\\phi/g, \"φ\")\n .replace(/\\\\omega/g, \"ω\")\n // Arrows / logic\n .replace(/\\\\implies\\b/g, \"⇒\")\n .replace(/\\\\iff\\b/g, \"⇔\")\n .replace(/\\\\to\\b/g, \"→\")\n .replace(/\\\\rightarrow/g, \"→\")\n .replace(/\\\\Rightarrow/g, \"⇒\")\n .replace(/\\\\leftarrow/g, \"←\")\n .replace(/\\\\Leftarrow/g, \"⇐\")\n .replace(/\\\\ldots/g, \"…\")\n .replace(/\\\\cdots/g, \"⋯\")\n // Spacing commands\n .replace(/\\\\quad/g, \" \")\n .replace(/\\\\qquad/g, \" \")\n .replace(/\\\\,/g, \" \")\n .replace(/\\\\;/g, \" \")\n .replace(/\\\\!/g, \"\")\n .replace(/\\\\\\\\/g, \"\\n\")\n // Superscripts / subscripts — single token or {braced group of [\\w+-]}\n .replace(/\\^\\{([\\w+-]+)\\}/g, (_m, g: string) => toSuperscript(g))\n .replace(/\\^([0-9+\\-n])/g, (_m, g: string) => toSuperscript(g))\n .replace(/_\\{([\\w+-]+)\\}/g, (_m, g: string) => toSubscript(g))\n .replace(/_([0-9+\\-])/g, (_m, g: string) => toSubscript(g))\n // Catch-all fallbacks for any LaTeX command we didn't explicitly handle.\n // Belt-and-braces: even if the model invents a new \\weirdcommand{x}{y},\n // we'd rather show '(x)/(y)' or 'x' than a raw backslash.\n .replace(/\\\\[a-zA-Z]+\\s*\\{([^{}]+)\\}\\s*\\{([^{}]+)\\}/g, \"($1)/($2)\")\n .replace(/\\\\[a-zA-Z]+\\s*\\{([^{}]+)\\}/g, \"$1\")\n .replace(/\\\\[a-zA-Z]+/g, \"\")\n // Collapse multiple whitespace introduced by the stripping above.\n .replace(/[ \\t]{2,}/g, \" \")\n );\n}\n\n/** Split a single line into styled segments for bold / italic / inline code. */\nconst INLINE_RE = /(\\*\\*([^*\\n]+?)\\*\\*|`([^`\\n]+?)`|(?<![*\\w])\\*([^*\\n]+?)\\*(?!\\w))/g;\n\nfunction InlineMd({ text }: { text: string }) {\n const parts: React.ReactNode[] = [];\n let last = 0;\n let idx = 0;\n for (const m of text.matchAll(INLINE_RE)) {\n const start = m.index ?? 0;\n if (start > last) {\n parts.push(<Text key={`t${idx++}`}>{text.slice(last, start)}</Text>);\n }\n if (m[2] !== undefined) {\n parts.push(\n <Text key={`b${idx++}`} bold>\n {m[2]}\n </Text>,\n );\n } else if (m[3] !== undefined) {\n parts.push(\n <Text key={`c${idx++}`} color=\"yellow\">\n {m[3]}\n </Text>,\n );\n } else if (m[4] !== undefined) {\n parts.push(\n <Text key={`i${idx++}`} italic>\n {m[4]}\n </Text>,\n );\n }\n last = start + m[0].length;\n }\n if (last < text.length) {\n parts.push(<Text key={`t${idx++}`}>{text.slice(last)}</Text>);\n }\n return <Text>{parts}</Text>;\n}\n\ninterface ParagraphBlock {\n kind: \"paragraph\";\n text: string;\n}\ninterface HeadingBlock {\n kind: \"heading\";\n level: number;\n text: string;\n}\ninterface BulletBlock {\n kind: \"bullet\";\n items: string[];\n ordered: boolean;\n start: number;\n}\ninterface CodeBlock {\n kind: \"code\";\n lang: string;\n text: string;\n}\ninterface HrBlock {\n kind: \"hr\";\n}\n\ntype Block = ParagraphBlock | HeadingBlock | BulletBlock | CodeBlock | HrBlock;\n\nfunction parseBlocks(raw: string): Block[] {\n const lines = raw.split(/\\r?\\n/);\n const out: Block[] = [];\n let para: string[] = [];\n let inCode = false;\n let codeLang = \"\";\n let codeBuf: string[] = [];\n let listBuf: BulletBlock | null = null;\n\n const flushPara = () => {\n if (para.length) {\n out.push({ kind: \"paragraph\", text: para.join(\" \") });\n para = [];\n }\n };\n const flushList = () => {\n if (listBuf) {\n out.push(listBuf);\n listBuf = null;\n }\n };\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\s+$/g, \"\");\n\n const fence = line.match(/^```(\\w*)/);\n if (fence) {\n if (inCode) {\n out.push({ kind: \"code\", lang: codeLang, text: codeBuf.join(\"\\n\") });\n codeBuf = [];\n codeLang = \"\";\n inCode = false;\n } else {\n flushPara();\n flushList();\n inCode = true;\n codeLang = fence[1] ?? \"\";\n }\n continue;\n }\n if (inCode) {\n codeBuf.push(rawLine);\n continue;\n }\n\n if (line.trim() === \"\") {\n flushPara();\n flushList();\n continue;\n }\n\n if (/^[-*_]{3,}\\s*$/.test(line)) {\n flushPara();\n flushList();\n out.push({ kind: \"hr\" });\n continue;\n }\n\n const hm = line.match(/^(#{1,6})\\s+(.+)$/);\n if (hm) {\n flushPara();\n flushList();\n out.push({ kind: \"heading\", level: hm[1]!.length, text: hm[2]!.trim() });\n continue;\n }\n\n const bm = line.match(/^\\s*[-*+]\\s+(.+)$/);\n if (bm) {\n flushPara();\n if (!listBuf || listBuf.ordered) {\n flushList();\n listBuf = { kind: \"bullet\", items: [], ordered: false, start: 1 };\n }\n listBuf.items.push(bm[1]!);\n continue;\n }\n\n const om = line.match(/^\\s*(\\d+)\\.\\s+(.+)$/);\n if (om) {\n flushPara();\n if (!listBuf || !listBuf.ordered) {\n flushList();\n listBuf = { kind: \"bullet\", items: [], ordered: true, start: Number(om[1]) };\n }\n listBuf.items.push(om[2]!);\n continue;\n }\n\n flushList();\n para.push(line);\n }\n\n if (inCode && codeBuf.length) {\n out.push({ kind: \"code\", lang: codeLang, text: codeBuf.join(\"\\n\") });\n }\n flushPara();\n flushList();\n return out;\n}\n\nfunction BlockView({ block }: { block: Block }) {\n switch (block.kind) {\n case \"heading\":\n return (\n <Text bold color=\"cyan\">\n <InlineMd text={block.text} />\n </Text>\n );\n case \"paragraph\":\n return <InlineMd text={block.text} />;\n case \"bullet\":\n return (\n <Box flexDirection=\"column\">\n {block.items.map((item, i) => (\n <Box key={`${i}-${item.slice(0, 24)}`}>\n <Text color=\"cyan\">{block.ordered ? ` ${block.start + i}. ` : \" • \"}</Text>\n <InlineMd text={item} />\n </Box>\n ))}\n </Box>\n );\n case \"code\":\n return (\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text color=\"yellow\">{block.text}</Text>\n </Box>\n );\n case \"hr\":\n return <Text dimColor>{\"────────────────────────\"}</Text>;\n }\n}\n\nexport function Markdown({ text }: { text: string }) {\n const cleaned = stripMath(text);\n const blocks = React.useMemo(() => parseBlocks(cleaned), [cleaned]);\n return (\n <Box flexDirection=\"column\" gap={1}>\n {blocks.map((b, i) => (\n <BlockView key={`${i}-${b.kind}`} block={b} />\n ))}\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport React from \"react\";\n\nexport interface PromptInputProps {\n value: string;\n onChange: (v: string) => void;\n onSubmit: (v: string) => void;\n disabled?: boolean;\n placeholder?: string;\n}\n\n/**\n * Keep `<TextInput>` mounted at all times and use its `focus` prop to gate\n * input. Conditionally rendering it (mount / unmount between turns) loses\n * the stdin raw-mode claim on some terminals, which silently drops\n * keystrokes after the first turn finishes.\n */\nexport function PromptInput({\n value,\n onChange,\n onSubmit,\n disabled,\n placeholder,\n}: PromptInputProps) {\n const effectivePlaceholder = disabled\n ? (placeholder ?? \"…waiting for response…\")\n : (placeholder ?? \"type a message, or /command\");\n return (\n <Box borderStyle=\"round\" borderColor={disabled ? \"gray\" : \"cyan\"} paddingX={1}>\n <Text bold color={disabled ? \"gray\" : \"cyan\"}>\n you ›{\" \"}\n </Text>\n <TextInput\n value={value}\n onChange={onChange}\n onSubmit={onSubmit}\n focus={!disabled}\n placeholder={effectivePlaceholder}\n />\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport type { SessionSummary } from \"../../telemetry.js\";\n\nexport interface StatsPanelProps {\n summary: SessionSummary;\n model: string;\n prefixHash: string;\n harvestOn?: boolean;\n branchBudget?: number;\n}\n\nexport function StatsPanel({\n summary,\n model,\n prefixHash,\n harvestOn,\n branchBudget,\n}: StatsPanelProps) {\n const hitPct = (summary.cacheHitRatio * 100).toFixed(1);\n const hitColor =\n summary.cacheHitRatio >= 0.7 ? \"green\" : summary.cacheHitRatio >= 0.4 ? \"yellow\" : \"red\";\n const branchOn = (branchBudget ?? 1) > 1;\n return (\n <Box borderStyle=\"round\" borderColor=\"cyan\" flexDirection=\"column\" paddingX={1}>\n <Box justifyContent=\"space-between\">\n <Text>\n <Text color=\"cyan\" bold>\n Reasonix\n </Text>\n <Text dimColor> · model </Text>\n <Text color=\"yellow\">{model}</Text>\n <Text dimColor> · prefix </Text>\n <Text dimColor>{prefixHash}</Text>\n {harvestOn ? <Text color=\"magenta\"> · harvest</Text> : null}\n {branchOn ? <Text color=\"blue\"> · branch{branchBudget}</Text> : null}\n </Text>\n <Text dimColor>turns {summary.turns} · type /help</Text>\n </Box>\n <Box marginTop={1} gap={3}>\n <Text>\n <Text dimColor>cache hit </Text>\n <Text color={hitColor} bold>\n {hitPct}%\n </Text>\n </Text>\n <Text>\n <Text dimColor>cost </Text>\n <Text color=\"green\">${summary.totalCostUsd.toFixed(6)}</Text>\n </Text>\n <Text>\n <Text dimColor>vs Claude </Text>\n <Text>${summary.claudeEquivalentUsd.toFixed(6)}</Text>\n </Text>\n <Text>\n <Text dimColor>saving </Text>\n <Text color=\"green\" bold>\n {summary.savingsVsClaudePct.toFixed(1)}%\n </Text>\n </Text>\n </Box>\n </Box>\n );\n}\n","import type { CacheFirstLoop } from \"../../loop.js\";\nimport { deleteSession, listSessions } from \"../../session.js\";\n\nexport interface SlashResult {\n /** Text to display back to the user as a system/info line. */\n info?: string;\n /** Exit the app. */\n exit?: boolean;\n /** Clear the visible history. */\n clear?: boolean;\n /** Unknown command — display usage hint. */\n unknown?: boolean;\n}\n\nexport function parseSlash(text: string): { cmd: string; args: string[] } | null {\n if (!text.startsWith(\"/\")) return null;\n const parts = text.slice(1).trim().split(/\\s+/);\n const cmd = parts[0]?.toLowerCase() ?? \"\";\n if (!cmd) return null;\n return { cmd, args: parts.slice(1) };\n}\n\nexport function handleSlash(cmd: string, args: string[], loop: CacheFirstLoop): SlashResult {\n switch (cmd) {\n case \"exit\":\n case \"quit\":\n return { exit: true };\n\n case \"clear\":\n return { clear: true };\n\n case \"help\":\n case \"?\":\n return {\n info: [\n \"Commands:\",\n \" /help this message\",\n \" /status show current settings\",\n \" /preset <fast|smart|max> one-tap presets — see below\",\n \" /model <id> deepseek-chat or deepseek-reasoner\",\n \" /harvest [on|off] Pillar 2: structured plan-state extraction\",\n \" /branch <N|off> run N parallel samples (N>=2), pick most confident\",\n \" /sessions list saved sessions (current is marked with ▸)\",\n \" /forget delete the current session from disk\",\n \" /clear clear displayed history (log + session kept)\",\n \" /exit quit\",\n \"\",\n \"Presets:\",\n \" fast deepseek-chat no harvest no branch ~1¢/100turns ← default\",\n \" smart reasoner harvest ~10x cost, slower\",\n \" max reasoner harvest branch 3 ~30x cost, slowest\",\n \"\",\n \"Sessions (auto-enabled by default, named 'default'):\",\n \" reasonix chat --session <name> use a different named session\",\n \" reasonix chat --no-session disable persistence for this run\",\n ].join(\"\\n\"),\n };\n\n case \"sessions\": {\n const items = listSessions();\n if (items.length === 0) {\n return {\n info: \"no saved sessions yet — chat normally and your messages will be saved automatically\",\n };\n }\n const lines = [\"Saved sessions:\"];\n for (const s of items) {\n const sizeKb = (s.size / 1024).toFixed(1);\n const when = s.mtime.toISOString().replace(\"T\", \" \").slice(0, 16);\n const marker = s.name === loop.sessionName ? \"▸\" : \" \";\n lines.push(\n ` ${marker} ${s.name.padEnd(22)} ${String(s.messageCount).padStart(5)} msgs ${sizeKb.padStart(7)} KB ${when}`,\n );\n }\n lines.push(\"\");\n lines.push(\"Resume with: reasonix chat --session <name>\");\n return { info: lines.join(\"\\n\") };\n }\n\n case \"forget\": {\n if (!loop.sessionName) {\n return { info: \"not in a session — nothing to forget\" };\n }\n const name = loop.sessionName;\n const ok = deleteSession(name);\n return {\n info: ok\n ? `▸ deleted session \"${name}\" — current screen still shows the conversation, but next launch starts fresh`\n : `could not delete session \"${name}\" (already gone?)`,\n };\n }\n\n case \"status\": {\n const branchBudget = loop.branchOptions.budget ?? 1;\n return {\n info:\n `model=${loop.model} ` +\n `harvest=${loop.harvestEnabled ? \"on\" : \"off\"} ` +\n `branch=${branchBudget > 1 ? branchBudget : \"off\"} ` +\n `stream=${loop.stream ? \"on\" : \"off\"}`,\n };\n }\n\n case \"model\": {\n const id = args[0];\n if (!id) return { info: \"usage: /model <id> (try deepseek-chat or deepseek-reasoner)\" };\n loop.configure({ model: id });\n return { info: `model → ${id}` };\n }\n\n case \"harvest\": {\n const arg = (args[0] ?? \"\").toLowerCase();\n const on = arg === \"\" ? !loop.harvestEnabled : arg === \"on\" || arg === \"true\" || arg === \"1\";\n loop.configure({ harvest: on });\n return { info: `harvest → ${loop.harvestEnabled ? \"on\" : \"off\"}` };\n }\n\n case \"preset\": {\n const name = (args[0] ?? \"\").toLowerCase();\n if (name === \"fast\" || name === \"default\") {\n loop.configure({ model: \"deepseek-chat\", harvest: false, branch: 1 });\n return { info: \"preset → fast (deepseek-chat, no harvest, no branch)\" };\n }\n if (name === \"smart\") {\n loop.configure({ model: \"deepseek-reasoner\", harvest: true, branch: 1 });\n return { info: \"preset → smart (reasoner + harvest, ~10x cost vs fast)\" };\n }\n if (name === \"max\" || name === \"best\") {\n loop.configure({ model: \"deepseek-reasoner\", harvest: true, branch: 3 });\n return {\n info: \"preset → max (reasoner + harvest + branch3, ~30x cost vs fast, slowest)\",\n };\n }\n return { info: \"usage: /preset <fast|smart|max>\" };\n }\n\n case \"branch\": {\n const raw = (args[0] ?? \"\").toLowerCase();\n if (raw === \"\" || raw === \"off\" || raw === \"0\" || raw === \"1\") {\n loop.configure({ branch: 1 });\n return { info: \"branch → off\" };\n }\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 2) {\n return { info: \"usage: /branch <N> (N>=2, or 'off')\" };\n }\n if (n > 8) {\n return { info: \"branch budget capped at 8 to prevent runaway cost\" };\n }\n loop.configure({ branch: n });\n return { info: `branch → ${n} (harvest auto-enabled; streaming disabled)` };\n }\n\n default:\n return { unknown: true, info: `unknown command: /${cmd} (try /help)` };\n }\n}\n","import { Box, Text, useApp } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport React, { useState } from \"react\";\nimport { defaultConfigPath, isPlausibleKey, redactKey, saveApiKey } from \"../../config.js\";\n\nexport interface SetupProps {\n onReady: (apiKey: string) => void;\n}\n\nexport function Setup({ onReady }: SetupProps) {\n const [value, setValue] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const { exit } = useApp();\n\n const handleSubmit = (raw: string) => {\n const trimmed = raw.trim();\n if (trimmed === \"/exit\" || trimmed === \"/quit\") {\n exit();\n return;\n }\n if (!isPlausibleKey(trimmed)) {\n setError(\"Doesn't look like a DeepSeek key. They start with 'sk-' and are 30+ chars.\");\n setValue(\"\");\n return;\n }\n try {\n saveApiKey(trimmed);\n } catch (err) {\n setError(`Could not save key: ${(err as Error).message}`);\n return;\n }\n onReady(trimmed);\n };\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">\n Welcome to Reasonix.\n </Text>\n <Box marginTop={1}>\n <Text>Paste your DeepSeek API key to get started.</Text>\n </Box>\n <Text dimColor>Get one (free credit on signup): https://platform.deepseek.com/api_keys</Text>\n <Text dimColor>Saved locally to {defaultConfigPath()}</Text>\n <Box marginTop={1}>\n <Text bold color=\"cyan\">\n {\"key › \"}\n </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={handleSubmit}\n mask=\"•\"\n placeholder=\"sk-...\"\n />\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color=\"red\">{error}</Text>\n </Box>\n ) : value ? (\n <Box marginTop={1}>\n <Text dimColor>preview: {redactKey(value)}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dimColor>(Type /exit to abort.)</Text>\n </Box>\n </Box>\n );\n}\n","import { stdin, stdout } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { defaultConfigPath, isPlausibleKey, loadApiKey, saveApiKey } from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\n\nexport interface RunOptions {\n task: string;\n model: string;\n system: string;\n}\n\nasync function ensureApiKey(): Promise<string> {\n const existing = loadApiKey();\n if (existing) return existing;\n\n if (!stdin.isTTY) {\n process.stderr.write(\n \"DEEPSEEK_API_KEY is not set and stdin is not a TTY (cannot prompt).\\n\" +\n \"Set the env var, or run `reasonix chat` once interactively to save a key.\\n\",\n );\n process.exit(1);\n }\n\n process.stdout.write(\n \"DeepSeek API key not configured.\\nGet one at https://platform.deepseek.com/api_keys\\n\",\n );\n const rl = createInterface({ input: stdin, output: stdout });\n try {\n while (true) {\n const answer = (await rl.question(\"API key › \")).trim();\n if (!answer) continue;\n if (!isPlausibleKey(answer)) {\n process.stdout.write(\"Invalid format. Keys start with 'sk-' and are 30+ chars.\\n\");\n continue;\n }\n saveApiKey(answer);\n process.stdout.write(`Saved to ${defaultConfigPath()}\\n\\n`);\n return answer;\n }\n } finally {\n rl.close();\n }\n}\n\nexport async function runCommand(opts: RunOptions): Promise<void> {\n loadDotenv();\n const apiKey = await ensureApiKey();\n process.env.DEEPSEEK_API_KEY = apiKey;\n\n const client = new DeepSeekClient();\n const prefix = new ImmutablePrefix({ system: opts.system });\n const loop = new CacheFirstLoop({ client, prefix, model: opts.model });\n\n for await (const ev of loop.step(opts.task)) {\n if (ev.role === \"assistant_delta\" && ev.content) process.stdout.write(ev.content);\n if (ev.role === \"tool\") process.stdout.write(`\\n[tool ${ev.toolName}] ${ev.content}\\n`);\n if (ev.role === \"error\") process.stderr.write(`\\n[error] ${ev.error}\\n`);\n if (ev.role === \"done\") process.stdout.write(\"\\n\");\n }\n const s = loop.stats.summary();\n process.stdout.write(\n `\\n— turns:${s.turns} cache:${(s.cacheHitRatio * 100).toFixed(1)}% ` +\n `cost:$${s.totalCostUsd.toFixed(6)} save-vs-claude:${s.savingsVsClaudePct.toFixed(1)}%\\n`,\n );\n}\n","import { existsSync, readFileSync } from \"node:fs\";\n\nexport interface StatsOptions {\n transcript: string;\n}\n\nexport function statsCommand(opts: StatsOptions): void {\n if (!existsSync(opts.transcript)) {\n console.error(`no such transcript: ${opts.transcript}`);\n process.exit(1);\n }\n const lines = readFileSync(opts.transcript, \"utf8\").split(/\\r?\\n/).filter(Boolean);\n let assistantTurns = 0;\n let toolCalls = 0;\n let lastTurn = 0;\n for (const line of lines) {\n try {\n const rec = JSON.parse(line);\n if (rec.role === \"assistant_final\") assistantTurns++;\n if (rec.role === \"tool\") toolCalls++;\n if (typeof rec.turn === \"number\") lastTurn = Math.max(lastTurn, rec.turn);\n } catch {\n /* skip */\n }\n }\n console.log(`transcript: ${opts.transcript}`);\n console.log(`assistant turns: ${assistantTurns}`);\n console.log(`tool invocations: ${toolCalls}`);\n console.log(`last turn index: ${lastTurn}`);\n}\n","import { VERSION } from \"../../index.js\";\n\nexport function versionCommand(): void {\n console.log(`reasonix ${VERSION}`);\n}\n"],"mappings":"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","names":["resolve","signature","resolve","readFileSync","chmodSync","mkdirSync","readFileSync","homedir","dirname","join","React","useState","Box","Text","React","useEffect","useState","Box","Text","React","React","EventRow","Box","Text","Box","Text","React","Box","Text","React","harvest","useState","useEffect","React","Box","Text","Box","Text","useApp","TextInput","React","useState","useState","useApp","React","Box","Text","TextInput","useState","React","existsSync","readFileSync"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/client.ts","../../src/retry.ts","../../src/harvest.ts","../../src/consistency.ts","../../src/memory.ts","../../src/repair/scavenge.ts","../../src/repair/storm.ts","../../src/repair/truncation.ts","../../src/repair/flatten.ts","../../src/repair/index.ts","../../src/session.ts","../../src/telemetry.ts","../../src/tools.ts","../../src/loop.ts","../../src/env.ts","../../src/transcript.ts","../../src/replay.ts","../../src/diff.ts","../../src/config.ts","../../src/index.ts","../../src/cli/commands/chat.tsx","../../src/cli/ui/App.tsx","../../src/cli/ui/EventLog.tsx","../../src/cli/ui/markdown.tsx","../../src/cli/ui/PromptInput.tsx","../../src/cli/ui/StatsPanel.tsx","../../src/cli/ui/slash.ts","../../src/cli/ui/Setup.tsx","../../src/cli/commands/diff.ts","../../src/cli/commands/replay.ts","../../src/cli/commands/run.ts","../../src/cli/commands/stats.ts","../../src/cli/commands/version.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { VERSION } from \"../index.js\";\nimport { chatCommand } from \"./commands/chat.js\";\nimport { diffCommand } from \"./commands/diff.js\";\nimport { replayCommand } from \"./commands/replay.js\";\nimport { runCommand } from \"./commands/run.js\";\nimport { statsCommand } from \"./commands/stats.js\";\nimport { versionCommand } from \"./commands/version.js\";\n\nconst DEFAULT_SYSTEM =\n \"You are Reasonix, a helpful DeepSeek-powered assistant. Be concise and accurate. Use tools when available.\";\n\nconst program = new Command();\nprogram\n .name(\"reasonix\")\n .description(\"DeepSeek-native agent framework — built for cache hits and cheap tokens.\")\n .version(VERSION);\n\nprogram\n .command(\"chat\")\n .description(\"Interactive Ink TUI with live cache/cost panel.\")\n .option(\"-m, --model <id>\", \"DeepSeek model id\", \"deepseek-chat\")\n .option(\"-s, --system <prompt>\", \"System prompt (pinned in the immutable prefix)\", DEFAULT_SYSTEM)\n .option(\"--transcript <path>\", \"Write a JSONL transcript to this path\")\n .option(\n \"--harvest\",\n \"Extract typed plan state from R1 reasoning (Pillar 2, adds a cheap V3 call per turn)\",\n )\n .option(\n \"--branch <n>\",\n \"Self-consistency: run N parallel samples per turn and pick the most confident (disables streaming; enables harvest)\",\n (v) => Number.parseInt(v, 10),\n )\n .option(\n \"--session <name>\",\n \"Use a named session (default: 'default'). Resume the same session next time.\",\n )\n .option(\"--no-session\", \"Disable session persistence for this run (ephemeral chat)\")\n .action(async (opts) => {\n // Default behavior: every chat is auto-saved to a session named 'default'\n // and auto-resumed next launch. Pass --no-session to opt out, or\n // --session <name> to use a different session.\n let session: string | undefined;\n if (opts.session === false) {\n session = undefined; // --no-session\n } else if (typeof opts.session === \"string\" && opts.session.length > 0) {\n session = opts.session;\n } else {\n session = \"default\";\n }\n await chatCommand({\n model: opts.model,\n system: opts.system,\n transcript: opts.transcript,\n harvest: !!opts.harvest,\n branch: Number.isFinite(opts.branch) && opts.branch > 1 ? opts.branch : undefined,\n session,\n });\n });\n\nprogram\n .command(\"run <task>\")\n .description(\"Run a single task non-interactively, streaming output.\")\n .option(\"-m, --model <id>\", \"DeepSeek model id\", \"deepseek-chat\")\n .option(\"-s, --system <prompt>\", \"System prompt\", DEFAULT_SYSTEM)\n .action(async (task: string, opts) => {\n await runCommand({ task, model: opts.model, system: opts.system });\n });\n\nprogram\n .command(\"stats <transcript>\")\n .description(\"Summarize a JSONL transcript produced by `reasonix chat --transcript`.\")\n .action((transcript: string) => {\n statsCommand({ transcript });\n });\n\nprogram\n .command(\"replay <transcript>\")\n .description(\n \"Pretty-print a transcript + rebuild its session summary (cost, cache, prefix stability). No API calls.\",\n )\n .option(\"--head <n>\", \"Show only the first N records\", (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", \"Show only the last N records\", (v) => Number.parseInt(v, 10))\n .action((transcript: string, opts) => {\n replayCommand({\n path: transcript,\n head: Number.isFinite(opts.head) ? opts.head : undefined,\n tail: Number.isFinite(opts.tail) ? opts.tail : undefined,\n });\n });\n\nprogram\n .command(\"diff <a> <b>\")\n .description(\"Compare two transcripts: aggregate deltas + first divergence.\")\n .option(\"--md <path>\", \"Also write a markdown report (blog-ready) to this path\")\n .option(\"--label-a <label>\", \"Display label for transcript A (default: filename)\")\n .option(\"--label-b <label>\", \"Display label for transcript B (default: filename)\")\n .action((a: string, b: string, opts) => {\n diffCommand({ a, b, mdPath: opts.md, labelA: opts.labelA, labelB: opts.labelB });\n });\n\nprogram.command(\"version\").description(\"Print Reasonix version.\").action(versionCommand);\n\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(err);\n process.exit(1);\n});\n","import { type EventSourceMessage, createParser } from \"eventsource-parser\";\nimport { type RetryOptions, fetchWithRetry } from \"./retry.js\";\nimport type { ChatMessage, ChatRequestOptions, RawUsage, ToolCall, ToolSpec } from \"./types.js\";\n\nexport class Usage {\n constructor(\n public promptTokens = 0,\n public completionTokens = 0,\n public totalTokens = 0,\n public promptCacheHitTokens = 0,\n public promptCacheMissTokens = 0,\n ) {}\n\n get cacheHitRatio(): number {\n const denom = this.promptCacheHitTokens + this.promptCacheMissTokens;\n return denom > 0 ? this.promptCacheHitTokens / denom : 0;\n }\n\n static fromApi(raw: RawUsage | undefined | null): Usage {\n const u = raw ?? {};\n return new Usage(\n u.prompt_tokens ?? 0,\n u.completion_tokens ?? 0,\n u.total_tokens ?? 0,\n u.prompt_cache_hit_tokens ?? 0,\n u.prompt_cache_miss_tokens ?? 0,\n );\n }\n}\n\nexport interface ChatResponse {\n content: string;\n reasoningContent: string | null;\n toolCalls: ToolCall[];\n usage: Usage;\n raw: unknown;\n}\n\nexport interface StreamChunk {\n contentDelta?: string;\n reasoningDelta?: string;\n toolCallDelta?: { index: number; id?: string; name?: string; argumentsDelta?: string };\n usage?: Usage;\n finishReason?: string;\n raw: any;\n}\n\nexport interface DeepSeekClientOptions {\n apiKey?: string;\n baseUrl?: string;\n timeoutMs?: number;\n fetch?: typeof fetch;\n /** Retry configuration. Pass `{ maxAttempts: 1 }` to disable retries. */\n retry?: RetryOptions;\n}\n\nexport class DeepSeekClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly timeoutMs: number;\n readonly retry: RetryOptions;\n private readonly _fetch: typeof fetch;\n\n constructor(opts: DeepSeekClientOptions = {}) {\n const apiKey = opts.apiKey ?? process.env.DEEPSEEK_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"DEEPSEEK_API_KEY is not set. Put it in .env or pass apiKey to DeepSeekClient.\",\n );\n }\n this.apiKey = apiKey;\n this.baseUrl = (\n opts.baseUrl ??\n process.env.DEEPSEEK_BASE_URL ??\n \"https://api.deepseek.com\"\n ).replace(/\\/+$/, \"\");\n this.timeoutMs = opts.timeoutMs ?? 120_000;\n this._fetch = opts.fetch ?? globalThis.fetch.bind(globalThis);\n this.retry = opts.retry ?? {};\n }\n\n private buildPayload(opts: ChatRequestOptions, stream: boolean) {\n const payload: Record<string, unknown> = {\n model: opts.model,\n messages: opts.messages,\n stream,\n };\n if (opts.tools?.length) payload.tools = opts.tools;\n if (opts.temperature !== undefined) payload.temperature = opts.temperature;\n if (opts.maxTokens !== undefined) payload.max_tokens = opts.maxTokens;\n if (opts.responseFormat) payload.response_format = opts.responseFormat;\n return payload;\n }\n\n async chat(opts: ChatRequestOptions): Promise<ChatResponse> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n const signal = opts.signal ?? ctrl.signal;\n\n try {\n const resp = await fetchWithRetry(\n this._fetch,\n `${this.baseUrl}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(this.buildPayload(opts, false)),\n signal,\n },\n { ...this.retry, signal },\n );\n if (!resp.ok) {\n throw new Error(`DeepSeek ${resp.status}: ${await resp.text()}`);\n }\n const data: any = await resp.json();\n const choice = data.choices?.[0]?.message ?? {};\n return {\n content: choice.content ?? \"\",\n reasoningContent: choice.reasoning_content ?? null,\n toolCalls: choice.tool_calls ?? [],\n usage: Usage.fromApi(data.usage),\n raw: data,\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n async *stream(opts: ChatRequestOptions): AsyncGenerator<StreamChunk> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n const signal = opts.signal ?? ctrl.signal;\n\n let resp: Response;\n try {\n // Only the initial fetch is retried. Once the server has started sending\n // the stream body we do NOT retry — a mid-stream retry would re-bill and\n // desync the session context.\n resp = await fetchWithRetry(\n this._fetch,\n `${this.baseUrl}/chat/completions`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n },\n body: JSON.stringify(this.buildPayload(opts, true)),\n signal,\n },\n { ...this.retry, signal },\n );\n } catch (err) {\n clearTimeout(timer);\n throw err;\n }\n if (!resp.ok || !resp.body) {\n clearTimeout(timer);\n throw new Error(`DeepSeek ${resp.status}: ${await resp.text().catch(() => \"\")}`);\n }\n\n const queue: StreamChunk[] = [];\n let done = false;\n const parser = createParser({\n onEvent: (ev: EventSourceMessage) => {\n if (!ev.data || ev.data === \"[DONE]\") {\n done = true;\n return;\n }\n try {\n const json = JSON.parse(ev.data);\n const delta = json.choices?.[0]?.delta ?? {};\n const finishReason = json.choices?.[0]?.finish_reason ?? undefined;\n const chunk: StreamChunk = { raw: json, finishReason };\n if (typeof delta.content === \"string\" && delta.content.length > 0) {\n chunk.contentDelta = delta.content;\n }\n if (typeof delta.reasoning_content === \"string\" && delta.reasoning_content.length > 0) {\n chunk.reasoningDelta = delta.reasoning_content;\n }\n if (Array.isArray(delta.tool_calls) && delta.tool_calls.length > 0) {\n const tc = delta.tool_calls[0];\n chunk.toolCallDelta = {\n index: tc.index ?? 0,\n id: tc.id,\n name: tc.function?.name,\n argumentsDelta: tc.function?.arguments,\n };\n }\n if (json.usage) {\n chunk.usage = Usage.fromApi(json.usage);\n }\n queue.push(chunk);\n } catch {\n /* skip malformed sse frame */\n }\n },\n });\n\n const reader = resp.body.getReader();\n const decoder = new TextDecoder();\n try {\n while (true) {\n if (queue.length > 0) {\n yield queue.shift()!;\n continue;\n }\n if (done) break;\n const { value, done: streamDone } = await reader.read();\n if (streamDone) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n while (queue.length > 0) yield queue.shift()!;\n } finally {\n clearTimeout(timer);\n reader.releaseLock();\n }\n }\n}\n\nexport type { ChatMessage, ToolCall, ToolSpec };\n","/**\n * Retry layer for DeepSeek API calls.\n *\n * Wraps a `fetch` function so that transient failures (rate limiting, server\n * overload, network blips) don't kill an agent session. We explicitly DO NOT\n * retry:\n * - 4xx client errors other than 408 / 429 (bad key, bad request, ...)\n * - aborted requests (user cancelled)\n * - mid-stream body read errors (retrying costs money AND would desync)\n *\n * Retrying is controlled by attempt count + exponential backoff with jitter.\n * If the server sends a `Retry-After` header we honor it (capped by\n * `maxBackoffMs` so a misconfigured upstream can't park us forever).\n */\n\nexport interface RetryOptions {\n /** Maximum total attempts (including the first). Default 4. */\n maxAttempts?: number;\n /** Initial backoff in ms. Doubles each retry, with jitter. Default 500. */\n initialBackoffMs?: number;\n /** Upper bound on any single backoff delay. Default 10000 (10s). */\n maxBackoffMs?: number;\n /** HTTP statuses to treat as retryable. Default [408, 429, 500, 502, 503, 504]. */\n retryableStatuses?: readonly number[];\n /** Abort signal; we do NOT retry once aborted. */\n signal?: AbortSignal;\n /** Telemetry hook — called before each wait. */\n onRetry?: (info: RetryInfo) => void;\n}\n\nexport interface RetryInfo {\n attempt: number;\n reason: string;\n waitMs: number;\n}\n\nconst DEFAULT_RETRYABLE_STATUSES = [408, 429, 500, 502, 503, 504] as const;\n\nexport async function fetchWithRetry(\n fetchFn: typeof fetch,\n url: string,\n init: RequestInit,\n opts: RetryOptions = {},\n): Promise<Response> {\n const maxAttempts = opts.maxAttempts ?? 4;\n const initial = opts.initialBackoffMs ?? 500;\n const cap = opts.maxBackoffMs ?? 10_000;\n const retryable = new Set(opts.retryableStatuses ?? DEFAULT_RETRYABLE_STATUSES);\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (opts.signal?.aborted) throw new Error(\"aborted\");\n\n try {\n const resp = await fetchFn(url, init);\n\n // Success or non-retryable failure: return as-is.\n if (resp.ok || !retryable.has(resp.status)) return resp;\n\n // Retryable but out of attempts: return the last response so the caller\n // can surface the status to the user.\n if (attempt === maxAttempts - 1) return resp;\n\n // Drain the body so the connection can be reused on the next attempt.\n await resp.text().catch(() => undefined);\n\n const waitMs = computeWait(attempt, initial, cap, resp.headers.get(\"Retry-After\"));\n opts.onRetry?.({ attempt: attempt + 1, reason: `http ${resp.status}`, waitMs });\n await sleep(waitMs, opts.signal);\n } catch (err) {\n lastError = err;\n // Respect explicit aborts — do not retry.\n if (isAbortError(err) || opts.signal?.aborted) throw err;\n if (attempt === maxAttempts - 1) throw err;\n\n const waitMs = computeWait(attempt, initial, cap, null);\n opts.onRetry?.({\n attempt: attempt + 1,\n reason: `network: ${messageOf(err)}`,\n waitMs,\n });\n await sleep(waitMs, opts.signal);\n }\n }\n\n throw lastError ?? new Error(\"fetchWithRetry: loop exited unexpectedly\");\n}\n\nfunction computeWait(\n attempt: number,\n initial: number,\n cap: number,\n retryAfter: string | null,\n): number {\n if (retryAfter) {\n const seconds = Number.parseFloat(retryAfter);\n if (Number.isFinite(seconds) && seconds > 0) {\n return Math.min(seconds * 1000, cap);\n }\n }\n const exp = initial * 2 ** attempt;\n // Jitter range [75%, 125%] to spread retries out when many clients hit 429 together.\n const jitter = exp * (0.75 + Math.random() * 0.5);\n return Math.min(Math.max(jitter, 0), cap);\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n if (signal) {\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n };\n if (signal.aborted) onAbort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n const name = (err as { name?: unknown }).name;\n return name === \"AbortError\";\n}\n\nfunction messageOf(err: unknown): string {\n if (err instanceof Error) return err.message;\n try {\n return String(err);\n } catch {\n return \"unknown error\";\n }\n}\n","/**\n * Pillar 2 — R1 Thought Harvesting.\n *\n * Takes the `reasoning_content` emitted by a thinking model (deepseek-reasoner\n * / R1) and extracts a structured plan state by making a cheap secondary call\n * to V3 in JSON mode. The typed state is intended for the orchestrator to\n * branch on — e.g. trigger self-consistency sampling when `uncertainties.length\n * > 2`, or surface the subgoals to the user.\n *\n * Opt-in: loops disable harvesting by default. Failures (bad JSON, API error,\n * empty reasoning) return an empty TypedPlanState — the main turn is never\n * aborted because of a harvest hiccup.\n */\n\nimport type { DeepSeekClient } from \"./client.js\";\n\nexport interface TypedPlanState {\n subgoals: string[];\n hypotheses: string[];\n uncertainties: string[];\n rejectedPaths: string[];\n}\n\nexport interface HarvestOptions {\n /** Model used for the extraction call. Defaults to the cheap chat model. */\n model?: string;\n /** Cap on how many items land in each array. Default 5. */\n maxItems?: number;\n /** Per-item character cap. Default 80. */\n maxItemLen?: number;\n /** Abort the extraction if R1 reasoning is shorter than this. Default 40. */\n minReasoningLen?: number;\n}\n\nexport function emptyPlanState(): TypedPlanState {\n return { subgoals: [], hypotheses: [], uncertainties: [], rejectedPaths: [] };\n}\n\nexport function isPlanStateEmpty(s: TypedPlanState | null | undefined): boolean {\n if (!s) return true;\n return (\n s.subgoals.length === 0 &&\n s.hypotheses.length === 0 &&\n s.uncertainties.length === 0 &&\n s.rejectedPaths.length === 0\n );\n}\n\nconst SYSTEM_PROMPT = `You extract a typed plan state from a reasoning trace produced by another LLM.\nOutput ONLY a JSON object. No markdown, no prose, no backticks.\n\nSchema:\n{\n \"subgoals\": string[], // concrete intermediate objectives the trace identifies\n \"hypotheses\": string[], // candidate approaches or assumptions being weighed\n \"uncertainties\": string[], // facts the trace flags as unclear / to verify\n \"rejectedPaths\": string[] // approaches the trace considered and then abandoned\n}\n\nConstraints:\n- Every field must be present. Use [] if not applicable.\n- Each array has at most {maxItems} items.\n- Each item is plain text, at most {maxItemLen} characters, no markdown.\n- Write in the same language as the trace (Chinese in → Chinese out, etc.).\n- Do not quote back the trace; write short, specific phrases.`;\n\nexport async function harvest(\n reasoningContent: string | null | undefined,\n client?: DeepSeekClient,\n options: HarvestOptions = {},\n): Promise<TypedPlanState> {\n if (!client || !reasoningContent) return emptyPlanState();\n const minLen = options.minReasoningLen ?? 40;\n const trimmed = reasoningContent.trim();\n if (trimmed.length < minLen) return emptyPlanState();\n\n const model = options.model ?? \"deepseek-chat\";\n const maxItems = options.maxItems ?? 5;\n const maxItemLen = options.maxItemLen ?? 80;\n const system = SYSTEM_PROMPT.replace(\"{maxItems}\", String(maxItems)).replace(\n \"{maxItemLen}\",\n String(maxItemLen),\n );\n\n try {\n const resp = await client.chat({\n model,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: trimmed },\n ],\n responseFormat: { type: \"json_object\" },\n temperature: 0,\n maxTokens: 600,\n });\n return parsePlanState(resp.content, maxItems, maxItemLen);\n } catch {\n return emptyPlanState();\n }\n}\n\nfunction parsePlanState(raw: string, maxItems: number, maxItemLen: number): TypedPlanState {\n const text = (raw ?? \"\").trim();\n if (!text) return emptyPlanState();\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n // Occasionally a model wraps JSON in fences despite instructions.\n const match = text.match(/\\{[\\s\\S]*\\}/);\n if (!match) return emptyPlanState();\n try {\n parsed = JSON.parse(match[0]);\n } catch {\n return emptyPlanState();\n }\n }\n if (!parsed || typeof parsed !== \"object\") return emptyPlanState();\n const obj = parsed as Record<string, unknown>;\n return {\n subgoals: sanitizeArray(obj.subgoals, maxItems, maxItemLen),\n hypotheses: sanitizeArray(obj.hypotheses, maxItems, maxItemLen),\n uncertainties: sanitizeArray(obj.uncertainties, maxItems, maxItemLen),\n rejectedPaths: sanitizeArray(obj.rejectedPaths ?? obj.rejected_paths, maxItems, maxItemLen),\n };\n}\n\nfunction sanitizeArray(raw: unknown, maxItems: number, maxItemLen: number): string[] {\n if (!Array.isArray(raw)) return [];\n const out: string[] = [];\n for (const item of raw) {\n if (out.length >= maxItems) break;\n if (typeof item !== \"string\") continue;\n const cleaned = item.trim().replace(/\\s+/g, \" \");\n if (!cleaned) continue;\n out.push(cleaned.length <= maxItemLen ? cleaned : `${cleaned.slice(0, maxItemLen - 1)}…`);\n }\n return out;\n}\n","/**\n * Self-consistency branching.\n *\n * When enabled, the loop fans out into N parallel samples per turn (varied\n * temperatures), runs Pillar 2 harvest on each, and selects the sample with\n * the fewest flagged uncertainties (ties broken by answer length — a crude\n * Occam prior).\n *\n * The unique opportunity here: because DeepSeek is ~20× cheaper than Claude,\n * running N=3–5 samples per turn is still cheaper than a single Claude call,\n * while the majority-confidence selection tends to dominate single-sample\n * answers on fuzzy multi-step reasoning tasks.\n */\n\nimport type { ChatResponse, DeepSeekClient } from \"./client.js\";\nimport { type HarvestOptions, type TypedPlanState, harvest } from \"./harvest.js\";\nimport type { ChatRequestOptions } from \"./types.js\";\n\nexport interface BranchSample {\n index: number;\n temperature: number;\n response: ChatResponse;\n planState: TypedPlanState;\n}\n\nexport type BranchSelector = (samples: BranchSample[]) => BranchSample;\n\nexport interface BranchOptions {\n /** Number of parallel samples. 1 disables branching. Default 1. */\n budget?: number;\n /** Temperatures for each branch. Default spreads across [0, 1]. */\n temperatures?: readonly number[];\n /** Harvest options; the selector needs harvest to score samples. */\n harvestOptions?: HarvestOptions;\n /** Custom selector. Default: min uncertainties, tie-break shortest answer. */\n selector?: BranchSelector;\n /**\n * Fires as each sample finishes (main call + harvest both complete).\n * Useful for progress UI. Not awaited; exceptions are swallowed.\n */\n onSampleDone?: (sample: BranchSample) => void;\n}\n\nexport interface BranchResult {\n chosen: BranchSample;\n samples: BranchSample[];\n}\n\n/** Default: fewest uncertainties wins, ties broken by shorter answer content. */\nexport const defaultSelector: BranchSelector = (samples) => {\n if (samples.length === 0) throw new Error(\"defaultSelector: samples is empty\");\n return samples.slice().sort((a, b) => {\n const uDiff = a.planState.uncertainties.length - b.planState.uncertainties.length;\n if (uDiff !== 0) return uDiff;\n const aLen = a.response.content?.length ?? 0;\n const bLen = b.response.content?.length ?? 0;\n return aLen - bLen;\n })[0]!;\n};\n\nexport async function runBranches(\n client: DeepSeekClient,\n request: ChatRequestOptions,\n opts: BranchOptions = {},\n): Promise<BranchResult> {\n const budget = Math.max(1, opts.budget ?? 1);\n const temperatures = resolveTemperatures(budget, opts.temperatures);\n const selector = opts.selector ?? defaultSelector;\n\n const samples = await Promise.all(\n temperatures.map(async (temperature, index): Promise<BranchSample> => {\n const response = await client.chat({ ...request, temperature });\n const planState = await harvest(response.reasoningContent, client, opts.harvestOptions);\n const sample: BranchSample = { index, temperature, response, planState };\n try {\n opts.onSampleDone?.(sample);\n } catch {\n /* callback errors must not poison the await */\n }\n return sample;\n }),\n );\n\n return { chosen: selector(samples), samples };\n}\n\n/** Sum usage across branch samples for telemetry purposes. */\nexport function aggregateBranchUsage(samples: readonly BranchSample[]) {\n let promptTokens = 0;\n let completionTokens = 0;\n let totalTokens = 0;\n let promptCacheHitTokens = 0;\n let promptCacheMissTokens = 0;\n for (const s of samples) {\n promptTokens += s.response.usage.promptTokens;\n completionTokens += s.response.usage.completionTokens;\n totalTokens += s.response.usage.totalTokens;\n promptCacheHitTokens += s.response.usage.promptCacheHitTokens;\n promptCacheMissTokens += s.response.usage.promptCacheMissTokens;\n }\n return {\n promptTokens,\n completionTokens,\n totalTokens,\n promptCacheHitTokens,\n promptCacheMissTokens,\n };\n}\n\nfunction resolveTemperatures(budget: number, custom?: readonly number[]): number[] {\n if (custom && custom.length >= budget) return [...custom.slice(0, budget)];\n // Spread evenly across [0, 1] to encourage reasoning-path diversity.\n if (budget === 1) return [0];\n const out: number[] = [];\n for (let i = 0; i < budget; i++) {\n out.push(Number((i / (budget - 1)).toFixed(2)));\n }\n return out;\n}\n","import { createHash } from \"node:crypto\";\nimport type { ChatMessage, ToolSpec } from \"./types.js\";\n\nexport interface ImmutablePrefixOptions {\n system: string;\n toolSpecs?: readonly ToolSpec[];\n fewShots?: readonly ChatMessage[];\n}\n\nexport class ImmutablePrefix {\n readonly system: string;\n readonly toolSpecs: readonly ToolSpec[];\n readonly fewShots: readonly ChatMessage[];\n\n constructor(opts: ImmutablePrefixOptions) {\n this.system = opts.system;\n this.toolSpecs = Object.freeze([...(opts.toolSpecs ?? [])]);\n this.fewShots = Object.freeze([...(opts.fewShots ?? [])]);\n }\n\n toMessages(): ChatMessage[] {\n return [{ role: \"system\", content: this.system }, ...this.fewShots.map((m) => ({ ...m }))];\n }\n\n tools(): ToolSpec[] {\n return this.toolSpecs.map((t) => structuredClone(t) as ToolSpec);\n }\n\n get fingerprint(): string {\n const blob = JSON.stringify({\n system: this.system,\n tools: this.toolSpecs,\n shots: this.fewShots,\n });\n return createHash(\"sha256\").update(blob).digest(\"hex\").slice(0, 16);\n }\n}\n\nexport class AppendOnlyLog {\n private _entries: ChatMessage[] = [];\n\n append(message: ChatMessage): void {\n if (!message || typeof message !== \"object\" || !(\"role\" in message)) {\n throw new Error(`invalid log entry: ${JSON.stringify(message)}`);\n }\n this._entries.push(message);\n }\n\n extend(messages: ChatMessage[]): void {\n for (const m of messages) this.append(m);\n }\n\n get entries(): readonly ChatMessage[] {\n return this._entries;\n }\n\n toMessages(): ChatMessage[] {\n return this._entries.map((e) => ({ ...e }));\n }\n\n get length(): number {\n return this._entries.length;\n }\n}\n\nexport class VolatileScratch {\n reasoning: string | null = null;\n planState: Record<string, unknown> | null = null;\n notes: string[] = [];\n\n reset(): void {\n this.reasoning = null;\n this.planState = null;\n this.notes = [];\n }\n}\n","/**\n * Scavenge tool calls leaked into reasoning_content.\n *\n * R1 sometimes emits tool-call JSON inside <think>…</think> and then forgets\n * to surface it in `tool_calls`. This pass extracts plausible calls and\n * proposes them to the loop, which decides whether to merge them with the\n * declared calls.\n */\n\nimport type { ToolCall } from \"../types.js\";\n\nexport interface ScavengeOptions {\n /** Names of tools the model may legitimately call. Other names are ignored. */\n allowedNames: ReadonlySet<string>;\n /** Maximum number of calls to scavenge per pass (defence against runaway). */\n maxCalls?: number;\n}\n\nexport interface ScavengeResult {\n calls: ToolCall[];\n notes: string[];\n}\n\nexport function scavengeToolCalls(\n reasoningContent: string | null | undefined,\n opts: ScavengeOptions,\n): ScavengeResult {\n if (!reasoningContent) return { calls: [], notes: [] };\n const max = opts.maxCalls ?? 4;\n const notes: string[] = [];\n const out: ToolCall[] = [];\n\n for (const candidate of iterateJsonObjects(reasoningContent)) {\n if (out.length >= max) break;\n const call = coerceToToolCall(candidate, opts.allowedNames);\n if (call) {\n out.push(call);\n notes.push(`scavenged call: ${call.function.name}`);\n }\n }\n return { calls: out, notes };\n}\n\n/** Yield every top-level JSON object substring in `text`. */\nfunction* iterateJsonObjects(text: string): Generator<string> {\n for (let i = 0; i < text.length; i++) {\n if (text[i] !== \"{\") continue;\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let j = i; j < text.length; j++) {\n const c = text[j]!;\n if (escaped) {\n escaped = false;\n continue;\n }\n if (inString) {\n if (c === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (c === '\"') inString = false;\n continue;\n }\n if (c === '\"') inString = true;\n else if (c === \"{\") depth++;\n else if (c === \"}\") {\n depth--;\n if (depth === 0) {\n yield text.slice(i, j + 1);\n i = j;\n break;\n }\n }\n }\n }\n}\n\nfunction coerceToToolCall(\n candidateJson: string,\n allowedNames: ReadonlySet<string>,\n): ToolCall | null {\n let parsed: any;\n try {\n parsed = JSON.parse(candidateJson);\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== \"object\") return null;\n\n // Pattern 1: { name, arguments }\n if (typeof parsed.name === \"string\" && allowedNames.has(parsed.name)) {\n const args = parsed.arguments;\n return {\n function: {\n name: parsed.name,\n arguments: typeof args === \"string\" ? args : JSON.stringify(args ?? {}),\n },\n };\n }\n\n // Pattern 2: OpenAI-style { type: \"function\", function: { name, arguments } }\n if (\n parsed.type === \"function\" &&\n parsed.function &&\n typeof parsed.function.name === \"string\" &&\n allowedNames.has(parsed.function.name)\n ) {\n const args = parsed.function.arguments;\n return {\n type: \"function\",\n function: {\n name: parsed.function.name,\n arguments: typeof args === \"string\" ? args : JSON.stringify(args ?? {}),\n },\n };\n }\n\n // Pattern 3: { tool_name, tool_args } (R1 free-form variant)\n if (typeof parsed.tool_name === \"string\" && allowedNames.has(parsed.tool_name)) {\n return {\n function: {\n name: parsed.tool_name,\n arguments: JSON.stringify(parsed.tool_args ?? {}),\n },\n };\n }\n\n return null;\n}\n","import type { ToolCall } from \"../types.js\";\n\n/**\n * Call-storm breaker.\n *\n * Detects (tool, args) tuples repeating within a sliding window and suppresses\n * the offending call. Surfaces a synthetic tool_result advising the model to\n * change strategy on its next turn.\n */\nexport class StormBreaker {\n private readonly windowSize: number;\n private readonly threshold: number;\n private readonly recent: Array<readonly [string, string]> = [];\n\n constructor(windowSize = 6, threshold = 3) {\n this.windowSize = windowSize;\n this.threshold = threshold;\n }\n\n inspect(call: ToolCall): { suppress: boolean; reason?: string } {\n const sig = signature(call);\n if (!sig) return { suppress: false };\n const count = this.recent.reduce(\n (n, [name, args]) => (name === sig[0] && args === sig[1] ? n + 1 : n),\n 0,\n );\n if (count >= this.threshold - 1) {\n return {\n suppress: true,\n reason: `call-storm suppressed: ${sig[0]} called with identical args ${count + 1} times within window=${this.windowSize}`,\n };\n }\n this.recent.push(sig);\n while (this.recent.length > this.windowSize) this.recent.shift();\n return { suppress: false };\n }\n\n reset(): void {\n this.recent.length = 0;\n }\n}\n\nfunction signature(call: ToolCall): readonly [string, string] | null {\n const name = call.function?.name;\n if (!name) return null;\n return [name, call.function?.arguments ?? \"\"] as const;\n}\n","/**\n * Truncation recovery for tool-call argument JSON cut off mid-structure\n * (typically when the model hits max_tokens before finishing the JSON object).\n *\n * Strategy is purely local: balance braces, close strings, fill missing values\n * with `null`. We deliberately do NOT make a continuation API call here — that\n * decision belongs to the loop, which knows about budgets.\n */\n\nexport interface TruncationRepairResult {\n repaired: string;\n changed: boolean;\n notes: string[];\n}\n\nexport function repairTruncatedJson(input: string): TruncationRepairResult {\n const notes: string[] = [];\n if (!input || !input.trim()) {\n return { repaired: \"{}\", changed: input !== \"{}\", notes: [\"empty input → {}\"] };\n }\n // Fast path: already parseable.\n try {\n JSON.parse(input);\n return { repaired: input, changed: false, notes: [] };\n } catch {\n /* fall through */\n }\n\n const stack: (\"{\" | \"[\" | '\"')[] = [];\n let escaped = false;\n let inString = false;\n let lastSignificant = -1;\n\n for (let i = 0; i < input.length; i++) {\n const c = input[i]!;\n if (!/\\s/.test(c)) lastSignificant = i;\n if (escaped) {\n escaped = false;\n continue;\n }\n if (inString) {\n if (c === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (c === '\"') {\n inString = false;\n stack.pop();\n }\n continue;\n }\n if (c === '\"') {\n inString = true;\n stack.push('\"');\n continue;\n }\n if (c === \"{\" || c === \"[\") stack.push(c);\n else if (c === \"}\" || c === \"]\") stack.pop();\n }\n\n let s = input.slice(0, lastSignificant + 1);\n\n // Trim a trailing comma which would block re-parse.\n if (/,$/.test(s)) {\n s = s.replace(/,$/, \"\");\n notes.push(\"trimmed trailing comma\");\n }\n\n // If we ended on a key without a value: \"foo\": → \"foo\": null\n if (/\"\\s*:\\s*$/.test(s)) {\n s += \" null\";\n notes.push(\"filled dangling key with null\");\n }\n\n // If we ended inside a string, close it.\n if (inString) {\n s += '\"';\n stack.pop();\n notes.push(\"closed unterminated string\");\n }\n\n // Pop remaining open structures in reverse order.\n while (stack.length > 0) {\n const top = stack.pop();\n if (top === \"{\") s += \"}\";\n else if (top === \"[\") s += \"]\";\n else if (top === '\"') s += '\"';\n }\n\n try {\n JSON.parse(s);\n return { repaired: s, changed: true, notes };\n } catch (err) {\n notes.push(`fallback to {}: ${(err as Error).message}`);\n return { repaired: \"{}\", changed: true, notes };\n }\n}\n","/**\n * Schema flattening for DeepSeek tool calls.\n *\n * DeepSeek loses arguments on schemas that are deep (>2 levels of nesting) or\n * wide (>10 leaf parameters). This module transforms such schemas into a\n * dot-notation flat schema and re-nests the model's arguments before dispatch.\n *\n * Example:\n * { user: { profile: { name, age } } } ⇄ \"user.profile.name\", \"user.profile.age\"\n */\n\nimport type { JSONSchema } from \"../types.js\";\n\nexport interface FlattenDecision {\n shouldFlatten: boolean;\n leafCount: number;\n maxDepth: number;\n}\n\nexport function analyzeSchema(schema: JSONSchema | undefined): FlattenDecision {\n if (!schema) return { shouldFlatten: false, leafCount: 0, maxDepth: 0 };\n let leafCount = 0;\n let maxDepth = 0;\n walk(schema, 0, (depth, isLeaf) => {\n if (isLeaf) leafCount++;\n if (depth > maxDepth) maxDepth = depth;\n });\n return {\n shouldFlatten: leafCount > 10 || maxDepth > 2,\n leafCount,\n maxDepth,\n };\n}\n\nexport function flattenSchema(schema: JSONSchema): JSONSchema {\n const flatProps: Record<string, JSONSchema> = {};\n const required: string[] = [];\n collect(\"\", schema, flatProps, required, true);\n return {\n type: \"object\",\n properties: flatProps,\n required,\n };\n}\n\nexport function nestArguments(flatArgs: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(flatArgs)) {\n setByPath(out, key.split(\".\"), value);\n }\n return out;\n}\n\nfunction walk(\n schema: JSONSchema,\n depth: number,\n visit: (depth: number, isLeaf: boolean) => void,\n): void {\n if (schema.type === \"object\" && schema.properties) {\n for (const child of Object.values(schema.properties)) {\n walk(child, depth + 1, visit);\n }\n return;\n }\n if (schema.type === \"array\" && schema.items) {\n walk(schema.items, depth + 1, visit);\n return;\n }\n visit(depth, true);\n}\n\nfunction collect(\n prefix: string,\n schema: JSONSchema,\n out: Record<string, JSONSchema>,\n required: string[],\n isRootRequired: boolean,\n): void {\n if (schema.type === \"object\" && schema.properties) {\n const requiredSet = new Set(schema.required ?? []);\n for (const [key, child] of Object.entries(schema.properties)) {\n const nextPrefix = prefix ? `${prefix}.${key}` : key;\n const childRequired = isRootRequired && requiredSet.has(key);\n collect(nextPrefix, child, out, required, childRequired);\n }\n return;\n }\n // Treat anything non-object (including arrays) as a leaf for flattening purposes.\n out[prefix] = schema;\n if (isRootRequired) required.push(prefix);\n}\n\nfunction setByPath(target: Record<string, unknown>, path: string[], value: unknown): void {\n let cur: any = target;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i]!;\n if (typeof cur[key] !== \"object\" || cur[key] === null) cur[key] = {};\n cur = cur[key];\n }\n cur[path[path.length - 1]!] = value;\n}\n","/**\n * Pillar 3 — Tool-Call Repair pipeline.\n *\n * Order of passes per turn:\n * 1. scavenge — recover tool calls leaked into <think>\n * 2. truncation — close any half-emitted argument JSON\n * 3. storm breaker — drop call-storm repeats\n *\n * Schema flattening is applied during loop construction (it changes what we\n * advertise to the model), not per-turn.\n */\n\nimport type { ToolCall } from \"../types.js\";\nimport { scavengeToolCalls } from \"./scavenge.js\";\nimport { StormBreaker } from \"./storm.js\";\nimport { repairTruncatedJson } from \"./truncation.js\";\n\nexport { analyzeSchema, flattenSchema, nestArguments } from \"./flatten.js\";\nexport type { FlattenDecision } from \"./flatten.js\";\nexport { repairTruncatedJson } from \"./truncation.js\";\nexport type { TruncationRepairResult } from \"./truncation.js\";\nexport { scavengeToolCalls } from \"./scavenge.js\";\nexport type { ScavengeOptions, ScavengeResult } from \"./scavenge.js\";\nexport { StormBreaker } from \"./storm.js\";\n\nexport interface RepairReport {\n scavenged: number;\n truncationsFixed: number;\n stormsBroken: number;\n notes: string[];\n}\n\nexport interface ToolCallRepairOptions {\n allowedToolNames: ReadonlySet<string>;\n stormWindow?: number;\n stormThreshold?: number;\n maxScavenge?: number;\n}\n\nexport class ToolCallRepair {\n private readonly storm: StormBreaker;\n private readonly opts: ToolCallRepairOptions;\n\n constructor(opts: ToolCallRepairOptions) {\n this.opts = opts;\n this.storm = new StormBreaker(opts.stormWindow ?? 6, opts.stormThreshold ?? 3);\n }\n\n process(\n declaredCalls: ToolCall[],\n reasoningContent: string | null,\n ): { calls: ToolCall[]; report: RepairReport } {\n const report: RepairReport = {\n scavenged: 0,\n truncationsFixed: 0,\n stormsBroken: 0,\n notes: [],\n };\n\n // 1. Scavenge — only add calls whose (name,args) signature is novel.\n const scavenged = scavengeToolCalls(reasoningContent, {\n allowedNames: this.opts.allowedToolNames,\n maxCalls: this.opts.maxScavenge ?? 4,\n });\n const seenSignatures = new Set(declaredCalls.map(signature));\n const merged = [...declaredCalls];\n for (const sc of scavenged.calls) {\n if (!seenSignatures.has(signature(sc))) {\n merged.push(sc);\n report.scavenged++;\n seenSignatures.add(signature(sc));\n }\n }\n report.notes.push(...scavenged.notes);\n\n // 2. Truncation repair on argument JSON.\n for (const call of merged) {\n const args = call.function?.arguments ?? \"\";\n const r = repairTruncatedJson(args);\n if (r.changed) {\n call.function.arguments = r.repaired;\n report.truncationsFixed++;\n report.notes.push(...r.notes.map((n) => `[${call.function.name}] ${n}`));\n }\n }\n\n // 3. Storm breaker.\n const filtered: ToolCall[] = [];\n for (const call of merged) {\n const verdict = this.storm.inspect(call);\n if (verdict.suppress) {\n report.stormsBroken++;\n if (verdict.reason) report.notes.push(verdict.reason);\n continue;\n }\n filtered.push(call);\n }\n\n return { calls: filtered, report };\n }\n}\n\nfunction signature(call: ToolCall): string {\n return `${call.function?.name ?? \"\"}::${call.function?.arguments ?? \"\"}`;\n}\n","/**\n * Session persistence.\n *\n * Every turn's log entries (user / assistant / tool messages) are appended to\n * a JSONL file under `~/.reasonix/sessions/<name>.jsonl`. Next time the user\n * starts the CLI with the same session name, the loop pre-loads the file\n * into its AppendOnlyLog so the new turn has full prior context.\n *\n * Design notes:\n * - JSONL rather than JSON so concurrent writes don't corrupt.\n * - 0600 permissions on Unix (chmod no-ops on Windows).\n * - Name sanitization keeps paths safe: only [\\w-] and CJK letters pass;\n * anything else is replaced with underscore, max 64 chars.\n * - The loop's stats/session aren't persisted — only the message log.\n * Cost accounting resets each run (by design — old costs are sunk).\n */\n\nimport {\n appendFileSync,\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n statSync,\n unlinkSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { ChatMessage } from \"./types.js\";\n\nexport interface SessionInfo {\n name: string;\n path: string;\n size: number;\n messageCount: number;\n mtime: Date;\n}\n\nexport function sessionsDir(): string {\n return join(homedir(), \".reasonix\", \"sessions\");\n}\n\nexport function sessionPath(name: string): string {\n return join(sessionsDir(), `${sanitizeName(name)}.jsonl`);\n}\n\nexport function sanitizeName(name: string): string {\n const cleaned = name.replace(/[^\\w\\-\\u4e00-\\u9fa5]/g, \"_\").slice(0, 64);\n return cleaned || \"default\";\n}\n\nexport function loadSessionMessages(name: string): ChatMessage[] {\n const path = sessionPath(name);\n if (!existsSync(path)) return [];\n try {\n const raw = readFileSync(path, \"utf8\");\n const out: ChatMessage[] = [];\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const msg = JSON.parse(trimmed) as ChatMessage;\n if (msg && typeof msg === \"object\" && \"role\" in msg) out.push(msg);\n } catch {\n /* skip malformed line */\n }\n }\n return out;\n } catch {\n return [];\n }\n}\n\nexport function appendSessionMessage(name: string, message: ChatMessage): void {\n const path = sessionPath(name);\n mkdirSync(dirname(path), { recursive: true });\n appendFileSync(path, `${JSON.stringify(message)}\\n`, \"utf8\");\n try {\n chmodSync(path, 0o600);\n } catch {\n /* chmod not supported on this platform */\n }\n}\n\nexport function listSessions(): SessionInfo[] {\n const dir = sessionsDir();\n if (!existsSync(dir)) return [];\n try {\n const files = readdirSync(dir).filter((f) => f.endsWith(\".jsonl\"));\n return files\n .map((file) => {\n const path = join(dir, file);\n const stat = statSync(path);\n const name = file.replace(/\\.jsonl$/, \"\");\n const messageCount = countLines(path);\n return { name, path, size: stat.size, messageCount, mtime: stat.mtime };\n })\n .sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n } catch {\n return [];\n }\n}\n\nexport function deleteSession(name: string): boolean {\n const path = sessionPath(name);\n try {\n unlinkSync(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction countLines(path: string): number {\n try {\n const raw = readFileSync(path, \"utf8\");\n return raw.split(/\\r?\\n/).filter((l) => l.trim()).length;\n } catch {\n return 0;\n }\n}\n","import type { Usage } from \"./client.js\";\n\n/** USD per 1M tokens. Update as DeepSeek pricing changes. */\nexport const DEEPSEEK_PRICING: Record<\n string,\n { inputCacheHit: number; inputCacheMiss: number; output: number }\n> = {\n \"deepseek-chat\": { inputCacheHit: 0.07, inputCacheMiss: 0.27, output: 1.1 },\n \"deepseek-reasoner\": { inputCacheHit: 0.14, inputCacheMiss: 0.55, output: 2.19 },\n};\n\n/** Reference Claude Sonnet 4.6 pricing (USD per 1M tokens). */\nexport const CLAUDE_SONNET_PRICING = { input: 3.0, output: 15.0 };\n\nexport function costUsd(model: string, usage: Usage): number {\n const p = DEEPSEEK_PRICING[model];\n if (!p) return 0;\n return (\n (usage.promptCacheHitTokens * p.inputCacheHit +\n usage.promptCacheMissTokens * p.inputCacheMiss +\n usage.completionTokens * p.output) /\n 1_000_000\n );\n}\n\nexport function claudeEquivalentCost(usage: Usage): number {\n return (\n (usage.promptTokens * CLAUDE_SONNET_PRICING.input +\n usage.completionTokens * CLAUDE_SONNET_PRICING.output) /\n 1_000_000\n );\n}\n\nexport interface TurnStats {\n turn: number;\n model: string;\n usage: Usage;\n cost: number;\n cacheHitRatio: number;\n}\n\nexport interface SessionSummary {\n turns: number;\n totalCostUsd: number;\n claudeEquivalentUsd: number;\n savingsVsClaudePct: number;\n cacheHitRatio: number;\n}\n\nexport class SessionStats {\n readonly turns: TurnStats[] = [];\n\n record(turn: number, model: string, usage: Usage): TurnStats {\n const cost = costUsd(model, usage);\n const stats: TurnStats = {\n turn,\n model,\n usage,\n cost,\n cacheHitRatio: usage.cacheHitRatio,\n };\n this.turns.push(stats);\n return stats;\n }\n\n get totalCost(): number {\n return this.turns.reduce((sum, t) => sum + t.cost, 0);\n }\n\n get totalClaudeEquivalent(): number {\n return this.turns.reduce((sum, t) => sum + claudeEquivalentCost(t.usage), 0);\n }\n\n get savingsVsClaude(): number {\n const c = this.totalClaudeEquivalent;\n return c > 0 ? 1 - this.totalCost / c : 0;\n }\n\n get aggregateCacheHitRatio(): number {\n let hit = 0;\n let miss = 0;\n for (const t of this.turns) {\n hit += t.usage.promptCacheHitTokens;\n miss += t.usage.promptCacheMissTokens;\n }\n const denom = hit + miss;\n return denom > 0 ? hit / denom : 0;\n }\n\n summary(): SessionSummary {\n return {\n turns: this.turns.length,\n totalCostUsd: round(this.totalCost, 6),\n claudeEquivalentUsd: round(this.totalClaudeEquivalent, 6),\n savingsVsClaudePct: round(this.savingsVsClaude * 100, 2),\n cacheHitRatio: round(this.aggregateCacheHitRatio, 4),\n };\n }\n}\n\nfunction round(n: number, digits: number): number {\n const f = 10 ** digits;\n return Math.round(n * f) / f;\n}\n","import { analyzeSchema, flattenSchema, nestArguments } from \"./repair/flatten.js\";\nimport type { JSONSchema, ToolSpec } from \"./types.js\";\n\nexport interface ToolDefinition<A = any, R = any> {\n name: string;\n description?: string;\n parameters?: JSONSchema;\n fn: (args: A) => R | Promise<R>;\n}\n\ninterface InternalTool extends ToolDefinition {\n /**\n * Pillar 3 — flatten metadata. Set when the registered schema is deep\n * (>2 levels) or wide (>10 leaf params), conditions on which DeepSeek\n * V3/R1 are known to drop arguments. We advertise the flattened schema\n * to the model, then re-nest the model's args before calling fn.\n */\n flatSchema?: JSONSchema;\n}\n\nexport interface ToolRegistryOptions {\n /**\n * Auto-flatten schemas that exceed depth/width thresholds before sending\n * them to the model. Re-nests arguments transparently on dispatch.\n * Default: true. Pass false to opt out.\n */\n autoFlatten?: boolean;\n}\n\nexport class ToolRegistry {\n private readonly _tools = new Map<string, InternalTool>();\n private readonly _autoFlatten: boolean;\n\n constructor(opts: ToolRegistryOptions = {}) {\n this._autoFlatten = opts.autoFlatten !== false;\n }\n\n register<A, R>(def: ToolDefinition<A, R>): this {\n if (!def.name) throw new Error(\"tool requires a name\");\n const internal: InternalTool = { ...(def as ToolDefinition) };\n if (this._autoFlatten && def.parameters) {\n const decision = analyzeSchema(def.parameters);\n if (decision.shouldFlatten) {\n internal.flatSchema = flattenSchema(def.parameters);\n }\n }\n this._tools.set(def.name, internal);\n return this;\n }\n\n has(name: string): boolean {\n return this._tools.has(name);\n }\n\n get(name: string): ToolDefinition | undefined {\n return this._tools.get(name);\n }\n\n get size(): number {\n return this._tools.size;\n }\n\n /** True if a registered tool's schema was flattened for the model. */\n wasFlattened(name: string): boolean {\n return Boolean(this._tools.get(name)?.flatSchema);\n }\n\n specs(): ToolSpec[] {\n return [...this._tools.values()].map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description ?? \"\",\n parameters: t.flatSchema ?? t.parameters ?? { type: \"object\", properties: {} },\n },\n }));\n }\n\n async dispatch(name: string, argumentsRaw: string | Record<string, unknown>): Promise<string> {\n const tool = this._tools.get(name);\n if (!tool) {\n return JSON.stringify({ error: `unknown tool: ${name}` });\n }\n let args: Record<string, unknown>;\n try {\n args =\n typeof argumentsRaw === \"string\"\n ? argumentsRaw.trim()\n ? (JSON.parse(argumentsRaw) ?? {})\n : {}\n : (argumentsRaw ?? {});\n } catch (err) {\n return JSON.stringify({\n error: `invalid tool arguments JSON: ${(err as Error).message}`,\n });\n }\n\n // Re-nest dot-notation args back to the original shape, but only when\n // (a) we flattened this tool's schema, AND\n // (b) the incoming args actually use dot keys.\n // The second condition handles the case where a model ignores the flat\n // spec and emits nested args anyway — we shouldn't double-process them.\n if (tool.flatSchema && args && typeof args === \"object\" && hasDotKey(args)) {\n args = nestArguments(args);\n }\n\n try {\n const result = await tool.fn(args);\n return typeof result === \"string\" ? result : JSON.stringify(result);\n } catch (err) {\n return JSON.stringify({\n error: `${(err as Error).name}: ${(err as Error).message}`,\n });\n }\n }\n}\n\nfunction hasDotKey(obj: Record<string, unknown>): boolean {\n for (const k of Object.keys(obj)) {\n if (k.includes(\".\")) return true;\n }\n return false;\n}\n","import { type DeepSeekClient, Usage } from \"./client.js\";\nimport {\n type BranchOptions,\n type BranchSample,\n aggregateBranchUsage,\n runBranches,\n} from \"./consistency.js\";\nimport { type HarvestOptions, type TypedPlanState, emptyPlanState, harvest } from \"./harvest.js\";\nimport { AppendOnlyLog, type ImmutablePrefix, VolatileScratch } from \"./memory.js\";\nimport { type RepairReport, ToolCallRepair } from \"./repair/index.js\";\nimport { appendSessionMessage, loadSessionMessages } from \"./session.js\";\nimport { SessionStats, type TurnStats } from \"./telemetry.js\";\nimport { ToolRegistry } from \"./tools.js\";\nimport type { ChatMessage, ToolCall } from \"./types.js\";\n\nexport type EventRole =\n | \"assistant_delta\"\n | \"assistant_final\"\n | \"tool\"\n | \"done\"\n | \"error\"\n | \"branch_start\"\n | \"branch_progress\"\n | \"branch_done\";\n\nexport interface BranchSummary {\n budget: number;\n chosenIndex: number;\n uncertainties: number[]; // per-sample uncertainty counts\n temperatures: number[];\n}\n\nexport interface BranchProgress {\n completed: number;\n total: number;\n latestIndex: number;\n latestTemperature: number;\n latestUncertainties: number;\n}\n\nexport interface LoopEvent {\n turn: number;\n role: EventRole;\n content: string;\n reasoningDelta?: string;\n toolName?: string;\n /**\n * Raw JSON-string arguments the model sent for a tool call (role === \"tool\").\n * Populated so transcripts can persist *why* a tool was called, not just\n * what it returned. Needed by `reasonix diff` to explain divergences.\n */\n toolArgs?: string;\n stats?: TurnStats;\n planState?: TypedPlanState;\n repair?: RepairReport;\n branch?: BranchSummary;\n branchProgress?: BranchProgress;\n error?: string;\n}\n\nexport interface CacheFirstLoopOptions {\n client: DeepSeekClient;\n prefix: ImmutablePrefix;\n tools?: ToolRegistry;\n model?: string;\n maxToolIters?: number;\n stream?: boolean;\n /**\n * Pillar 2 — structured harvesting of R1 reasoning into a typed plan state.\n * Pass `true` for defaults or an options object. Off by default (adds a\n * cheap but non-zero V3 call per turn).\n */\n harvest?: boolean | HarvestOptions;\n /**\n * Self-consistency branching. Pass a number for just a budget (e.g. 3) or\n * a full `BranchOptions` object. Disables streaming for the branched turn\n * because all samples must complete before selection. Auto-enables harvest\n * since the default selector scores samples by plan-state uncertainty.\n */\n branch?: number | BranchOptions;\n /**\n * Session name. When set, the loop pre-loads the session's prior messages\n * into its log on construction, and appends every new log entry to\n * `~/.reasonix/sessions/<name>.jsonl` so the next run can resume.\n */\n session?: string;\n}\n\n/**\n * Pillar 1 — Cache-First Loop.\n *\n * - prefix is immutable (cache target)\n * - log is append-only (preserves prior-turn prefix)\n * - scratch is per-turn volatile (never sent upstream)\n *\n * Yields a stream of events so a TUI can render progressively.\n */\nexport interface ReconfigurableOptions {\n model?: string;\n harvest?: boolean | HarvestOptions;\n branch?: number | BranchOptions;\n stream?: boolean;\n}\n\nexport class CacheFirstLoop {\n readonly client: DeepSeekClient;\n readonly prefix: ImmutablePrefix;\n readonly tools: ToolRegistry;\n readonly maxToolIters: number;\n readonly log = new AppendOnlyLog();\n readonly scratch = new VolatileScratch();\n readonly stats = new SessionStats();\n readonly repair: ToolCallRepair;\n\n // Mutable via configure() — slash commands in the TUI / library callers tweak\n // these mid-session so users don't have to restart to try harvest or branch.\n model: string;\n stream: boolean;\n harvestEnabled: boolean;\n harvestOptions: HarvestOptions;\n branchEnabled: boolean;\n branchOptions: BranchOptions;\n sessionName: string | null;\n\n /** Number of messages that were pre-loaded from the session file. */\n readonly resumedMessageCount: number;\n\n private _turn = 0;\n private _streamPreference: boolean;\n\n constructor(opts: CacheFirstLoopOptions) {\n this.client = opts.client;\n this.prefix = opts.prefix;\n this.tools = opts.tools ?? new ToolRegistry();\n this.model = opts.model ?? \"deepseek-chat\";\n this.maxToolIters = opts.maxToolIters ?? 8;\n\n // Resolve branch config first (since it forces harvest on).\n if (typeof opts.branch === \"number\") {\n this.branchOptions = { budget: opts.branch };\n } else if (opts.branch && typeof opts.branch === \"object\") {\n this.branchOptions = opts.branch;\n } else {\n this.branchOptions = {};\n }\n this.branchEnabled = (this.branchOptions.budget ?? 1) > 1;\n\n // Branching requires harvest for its default selector to work.\n const harvestForced = this.branchEnabled;\n this.harvestEnabled =\n harvestForced ||\n opts.harvest === true ||\n (typeof opts.harvest === \"object\" && opts.harvest !== null);\n this.harvestOptions =\n typeof opts.harvest === \"object\" && opts.harvest !== null\n ? opts.harvest\n : (this.branchOptions.harvestOptions ?? {});\n\n // Streaming is incompatible with branching (need all samples to select).\n this._streamPreference = opts.stream ?? true;\n this.stream = this.branchEnabled ? false : this._streamPreference;\n\n const allowedNames = new Set([...this.prefix.toolSpecs.map((s) => s.function.name)]);\n this.repair = new ToolCallRepair({ allowedToolNames: allowedNames });\n\n // Session resume: pre-load prior messages into the log if a session name\n // is provided. New messages appended to the log are also persisted.\n this.sessionName = opts.session ?? null;\n if (this.sessionName) {\n const prior = loadSessionMessages(this.sessionName);\n for (const msg of prior) this.log.append(msg);\n this.resumedMessageCount = prior.length;\n } else {\n this.resumedMessageCount = 0;\n }\n }\n\n private appendAndPersist(message: ChatMessage): void {\n this.log.append(message);\n if (this.sessionName) {\n try {\n appendSessionMessage(this.sessionName, message);\n } catch {\n /* disk full or permission denied shouldn't kill the chat */\n }\n }\n }\n\n /**\n * Reconfigure model/harvest/branch/stream mid-session. The loop's log,\n * scratch, and stats are preserved — only the per-turn behavior changes.\n * Used by the TUI's slash commands and by library callers who want to\n * flip a knob between turns.\n */\n configure(opts: ReconfigurableOptions): void {\n if (opts.model !== undefined) this.model = opts.model;\n if (opts.stream !== undefined) this._streamPreference = opts.stream;\n\n if (opts.branch !== undefined) {\n if (typeof opts.branch === \"number\") {\n this.branchOptions = { budget: opts.branch };\n } else if (opts.branch && typeof opts.branch === \"object\") {\n this.branchOptions = opts.branch;\n } else {\n this.branchOptions = {};\n }\n this.branchEnabled = (this.branchOptions.budget ?? 1) > 1;\n }\n\n if (opts.harvest !== undefined) {\n const want =\n opts.harvest === true || (typeof opts.harvest === \"object\" && opts.harvest !== null);\n this.harvestEnabled = want || this.branchEnabled;\n if (typeof opts.harvest === \"object\" && opts.harvest !== null) {\n this.harvestOptions = opts.harvest;\n }\n } else if (this.branchEnabled) {\n // branch turned on without explicit harvest → force it on\n this.harvestEnabled = true;\n }\n\n // Branching always forces non-streaming; otherwise honor preference.\n this.stream = this.branchEnabled ? false : this._streamPreference;\n }\n\n private buildMessages(pendingUser: string | null): ChatMessage[] {\n const msgs: ChatMessage[] = [...this.prefix.toMessages(), ...this.log.toMessages()];\n if (pendingUser !== null) msgs.push({ role: \"user\", content: pendingUser });\n return msgs;\n }\n\n async *step(userInput: string): AsyncGenerator<LoopEvent> {\n this._turn++;\n this.scratch.reset();\n let pendingUser: string | null = userInput;\n const toolSpecs = this.prefix.tools();\n\n for (let iter = 0; iter < this.maxToolIters; iter++) {\n const messages = this.buildMessages(pendingUser);\n\n let assistantContent = \"\";\n let reasoningContent = \"\";\n let toolCalls: ToolCall[] = [];\n let usage: TurnStats[\"usage\"] | null = null;\n\n let branchSummary: BranchSummary | undefined;\n let preHarvestedPlanState: TypedPlanState | undefined;\n\n try {\n if (this.branchEnabled) {\n const budget = this.branchOptions.budget ?? 1;\n yield {\n turn: this._turn,\n role: \"branch_start\",\n content: \"\",\n branchProgress: {\n completed: 0,\n total: budget,\n latestIndex: -1,\n latestTemperature: -1,\n latestUncertainties: -1,\n },\n };\n\n // Queue samples as they complete so we can yield progress events\n // in resolution order (not launch order).\n const queue: BranchSample[] = [];\n let waiter: ((s: BranchSample) => void) | null = null;\n\n const onSampleDone = (sample: BranchSample) => {\n if (waiter) {\n const w = waiter;\n waiter = null;\n w(sample);\n } else {\n queue.push(sample);\n }\n };\n\n const branchPromise = runBranches(\n this.client,\n {\n model: this.model,\n messages,\n tools: toolSpecs.length ? toolSpecs : undefined,\n },\n {\n ...this.branchOptions,\n harvestOptions: this.harvestOptions,\n onSampleDone,\n },\n );\n\n for (let k = 0; k < budget; k++) {\n const sample: BranchSample =\n queue.shift() ??\n (await new Promise<BranchSample>((resolve) => {\n waiter = resolve;\n }));\n yield {\n turn: this._turn,\n role: \"branch_progress\",\n content: \"\",\n branchProgress: {\n completed: k + 1,\n total: budget,\n latestIndex: sample.index,\n latestTemperature: sample.temperature,\n latestUncertainties: sample.planState.uncertainties.length,\n },\n };\n }\n\n const result = await branchPromise;\n assistantContent = result.chosen.response.content;\n reasoningContent = result.chosen.response.reasoningContent ?? \"\";\n toolCalls = result.chosen.response.toolCalls;\n\n // Cost accounting: sum usage across ALL samples, not just the winner.\n // (We paid for all three.) Harvest-call tokens are not tracked; they\n // amount to rounding error compared to the main R1 calls.\n const agg = aggregateBranchUsage(result.samples);\n usage = new Usage(\n agg.promptTokens,\n agg.completionTokens,\n agg.totalTokens,\n agg.promptCacheHitTokens,\n agg.promptCacheMissTokens,\n );\n preHarvestedPlanState = result.chosen.planState;\n branchSummary = summarizeBranch(result.chosen, result.samples);\n yield {\n turn: this._turn,\n role: \"branch_done\",\n content: \"\",\n branch: branchSummary,\n };\n } else if (this.stream) {\n const callBuf: Map<number, ToolCall> = new Map();\n for await (const chunk of this.client.stream({\n model: this.model,\n messages,\n tools: toolSpecs.length ? toolSpecs : undefined,\n })) {\n if (chunk.contentDelta) {\n assistantContent += chunk.contentDelta;\n yield {\n turn: this._turn,\n role: \"assistant_delta\",\n content: chunk.contentDelta,\n };\n }\n if (chunk.reasoningDelta) {\n reasoningContent += chunk.reasoningDelta;\n yield {\n turn: this._turn,\n role: \"assistant_delta\",\n content: \"\",\n reasoningDelta: chunk.reasoningDelta,\n };\n }\n if (chunk.toolCallDelta) {\n const d = chunk.toolCallDelta;\n const cur = callBuf.get(d.index) ?? {\n id: d.id,\n type: \"function\" as const,\n function: { name: \"\", arguments: \"\" },\n };\n if (d.id) cur.id = d.id;\n if (d.name) cur.function.name = (cur.function.name ?? \"\") + d.name;\n if (d.argumentsDelta)\n cur.function.arguments = (cur.function.arguments ?? \"\") + d.argumentsDelta;\n callBuf.set(d.index, cur);\n }\n if (chunk.usage) usage = chunk.usage;\n }\n toolCalls = [...callBuf.values()];\n } else {\n const resp = await this.client.chat({\n model: this.model,\n messages,\n tools: toolSpecs.length ? toolSpecs : undefined,\n });\n assistantContent = resp.content;\n reasoningContent = resp.reasoningContent ?? \"\";\n toolCalls = resp.toolCalls;\n usage = resp.usage;\n }\n } catch (err) {\n yield {\n turn: this._turn,\n role: \"error\",\n content: \"\",\n error: (err as Error).message,\n };\n return;\n }\n\n const turnStats = this.stats.record(this._turn, this.model, usage ?? new Usage());\n\n // Commit the user turn to the log only on success of the first round-trip.\n if (pendingUser !== null) {\n this.appendAndPersist({ role: \"user\", content: pendingUser });\n pendingUser = null;\n }\n\n this.scratch.reasoning = reasoningContent || null;\n const planState = preHarvestedPlanState\n ? preHarvestedPlanState\n : this.harvestEnabled\n ? await harvest(reasoningContent || null, this.client, this.harvestOptions)\n : emptyPlanState();\n\n const { calls: repairedCalls, report } = this.repair.process(\n toolCalls,\n reasoningContent || null,\n );\n\n this.appendAndPersist(this.assistantMessage(assistantContent, repairedCalls));\n\n yield {\n turn: this._turn,\n role: \"assistant_final\",\n content: assistantContent,\n stats: turnStats,\n planState,\n repair: report,\n branch: branchSummary,\n };\n\n if (repairedCalls.length === 0) {\n yield { turn: this._turn, role: \"done\", content: assistantContent };\n return;\n }\n\n for (const call of repairedCalls) {\n const name = call.function?.name ?? \"\";\n const args = call.function?.arguments ?? \"{}\";\n const result = await this.tools.dispatch(name, args);\n this.appendAndPersist({\n role: \"tool\",\n tool_call_id: call.id ?? \"\",\n name,\n content: result,\n });\n yield {\n turn: this._turn,\n role: \"tool\",\n content: result,\n toolName: name,\n toolArgs: args,\n };\n }\n }\n\n yield { turn: this._turn, role: \"done\", content: \"[max_tool_iters reached]\" };\n }\n\n async run(userInput: string, onEvent?: (ev: LoopEvent) => void): Promise<string> {\n let final = \"\";\n for await (const ev of this.step(userInput)) {\n onEvent?.(ev);\n if (ev.role === \"assistant_final\") final = ev.content;\n if (ev.role === \"done\") break;\n }\n return final;\n }\n\n private assistantMessage(content: string, toolCalls: ToolCall[]): ChatMessage {\n const msg: ChatMessage = { role: \"assistant\", content };\n if (toolCalls.length > 0) msg.tool_calls = toolCalls;\n return msg;\n }\n}\n\nfunction summarizeBranch(chosen: BranchSample, samples: BranchSample[]): BranchSummary {\n return {\n budget: samples.length,\n chosenIndex: chosen.index,\n uncertainties: samples.map((s) => s.planState.uncertainties.length),\n temperatures: samples.map((s) => s.temperature),\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n/**\n * Minimal `.env` loader; no dependency on dotenv.\n *\n * Reads KEY=VALUE lines and populates `process.env` for keys not already set.\n * Silently no-ops if the file is missing. Safe to call from library entry\n * points, CLI commands, examples, and benchmark runners.\n */\nexport function loadDotenv(path = \".env\"): void {\n let raw: string;\n try {\n raw = readFileSync(resolve(process.cwd(), path), \"utf8\");\n } catch {\n return;\n }\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq === -1) continue;\n const key = trimmed.slice(0, eq).trim();\n let value = trimmed.slice(eq + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (process.env[key] === undefined) process.env[key] = value;\n }\n}\n","/**\n * Transcript format — the canonical \"audit log\" of a Reasonix session.\n *\n * Design split:\n * - Session file (`~/.reasonix/sessions/<name>.jsonl`) stores only the\n * `ChatMessage`s the model needs to resume. See session.ts.\n * - Transcript file (this module) stores every LoopEvent with usage, cost,\n * model, and prefix fingerprint attached where available — enough for\n * replay and diff to reconstruct economics.\n *\n * The two are different contracts: sessions are the user's *memory*;\n * transcripts are the *receipts*. Don't conflate them.\n *\n * Backward compatibility: all fields beyond {ts, turn, role, content} are\n * optional on read. A v0.1 transcript (pre-usage) still parses and renders\n * — it just shows cost/cache as n/a.\n */\n\nimport { type WriteStream, createWriteStream, readFileSync } from \"node:fs\";\nimport type { LoopEvent } from \"./loop.js\";\nimport type { RawUsage } from \"./types.js\";\n\nexport interface TranscriptRecord {\n /** ISO-8601 timestamp at emit time. */\n ts: string;\n /** 1-based turn number within the session. */\n turn: number;\n /** LoopEvent role — \"assistant_delta\" | \"assistant_final\" | \"tool\" | \"done\" | ... */\n role: string;\n /** For assistant events, the final (or delta) text; for tool events, the tool result. */\n content: string;\n /** Tool name (role === \"tool\"). */\n tool?: string;\n /** JSON-string args the model sent for a tool call (role === \"tool\"). Persisted so diff can explain *why* two runs made different calls. */\n args?: string;\n /** DeepSeek token-usage snapshot (role === \"assistant_final\"). */\n usage?: RawUsage;\n /** USD cost of this turn (role === \"assistant_final\"). */\n cost?: number;\n /** Model id that produced this turn. */\n model?: string;\n /**\n * The ImmutablePrefix fingerprint at this turn. Lets diff prove two runs\n * share a prefix — i.e. any cache-hit delta is attributable to log\n * stability, not to a different system prompt.\n */\n prefixHash?: string;\n /** Optional error message (role === \"error\"). */\n error?: string;\n}\n\nexport interface TranscriptMeta {\n /**\n * Optional metadata written as the first line of a transcript. Lets\n * downstream tooling know what it's reading without guessing.\n * Recognized by a special role \"_meta\".\n */\n version: 1;\n source: string; // e.g. \"reasonix chat\", \"bench/baseline\", \"bench/reasonix\"\n model?: string;\n task?: string;\n mode?: string;\n repeat?: number;\n startedAt: string;\n}\n\ninterface MetaLine {\n role: \"_meta\";\n meta: TranscriptMeta;\n}\n\nexport interface ReadTranscriptResult {\n meta: TranscriptMeta | null;\n records: TranscriptRecord[];\n}\n\n/**\n * Build a TranscriptRecord from a LoopEvent. Extra fields (model,\n * prefixHash) that the LoopEvent doesn't carry are passed in separately\n * because they're session-level, not event-level.\n */\nexport function recordFromLoopEvent(\n ev: LoopEvent,\n extra: { model: string; prefixHash: string },\n): TranscriptRecord {\n const rec: TranscriptRecord = {\n ts: new Date().toISOString(),\n turn: ev.turn,\n role: ev.role,\n content: ev.content,\n };\n if (ev.toolName !== undefined) rec.tool = ev.toolName;\n if (ev.toolArgs !== undefined) rec.args = ev.toolArgs;\n if (ev.error !== undefined) rec.error = ev.error;\n if (ev.stats) {\n rec.usage = {\n prompt_tokens: ev.stats.usage.promptTokens,\n completion_tokens: ev.stats.usage.completionTokens,\n total_tokens: ev.stats.usage.totalTokens,\n prompt_cache_hit_tokens: ev.stats.usage.promptCacheHitTokens,\n prompt_cache_miss_tokens: ev.stats.usage.promptCacheMissTokens,\n };\n rec.cost = ev.stats.cost;\n rec.model = ev.stats.model;\n rec.prefixHash = extra.prefixHash;\n } else if (ev.role === \"assistant_final\") {\n // assistant_final without stats (shouldn't happen in the live loop but\n // might in test fixtures) — still persist model + prefix for continuity.\n rec.model = extra.model;\n rec.prefixHash = extra.prefixHash;\n }\n return rec;\n}\n\n/**\n * Append a record to an open write stream. Caller owns the stream lifecycle.\n */\nexport function writeRecord(stream: WriteStream, record: TranscriptRecord): void {\n stream.write(`${JSON.stringify(record)}\\n`);\n}\n\n/**\n * Write a _meta line to an open write stream. Call exactly once, at the top.\n */\nexport function writeMeta(stream: WriteStream, meta: TranscriptMeta): void {\n const line: MetaLine = { role: \"_meta\", meta };\n stream.write(`${JSON.stringify(line)}\\n`);\n}\n\n/**\n * Convenience: open a stream, write meta, return stream.\n */\nexport function openTranscriptFile(path: string, meta: TranscriptMeta): WriteStream {\n const stream = createWriteStream(path, { flags: \"a\" });\n writeMeta(stream, meta);\n return stream;\n}\n\n/**\n * Parse a transcript file. Returns meta (if the first line is a _meta record)\n * and the full record list.\n *\n * Robustness contract:\n * - Empty lines are skipped.\n * - Malformed JSON lines are skipped silently (do not crash on partial\n * files — live chats may be mid-write).\n * - Records missing optional fields still parse — they're just rendered\n * with n/a where the optional value would go.\n */\nexport function readTranscript(path: string): ReadTranscriptResult {\n const raw = readFileSync(path, \"utf8\");\n return parseTranscript(raw);\n}\n\nexport function parseTranscript(raw: string): ReadTranscriptResult {\n const out: ReadTranscriptResult = { meta: null, records: [] };\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n let obj: unknown;\n try {\n obj = JSON.parse(trimmed);\n } catch {\n continue;\n }\n if (!obj || typeof obj !== \"object\") continue;\n const rec = obj as Record<string, unknown>;\n if (rec.role === \"_meta\" && rec.meta && typeof rec.meta === \"object\") {\n out.meta = rec.meta as TranscriptMeta;\n continue;\n }\n if (\n typeof rec.ts === \"string\" &&\n typeof rec.turn === \"number\" &&\n typeof rec.role === \"string\" &&\n typeof rec.content === \"string\"\n ) {\n out.records.push(rec as unknown as TranscriptRecord);\n }\n }\n return out;\n}\n","/**\n * Replay — reconstruct session economics from a transcript file.\n *\n * Given a transcript written by App.tsx or the bench runner, rebuild a\n * SessionSummary-compatible aggregate (turn count, total cost, cache-hit\n * ratio, vs-Claude estimate) without replaying the LLM calls.\n *\n * The whole point is offline auditing: a reader should be able to reproduce\n * the headline numbers from a transcript alone, without an API key.\n */\n\nimport { Usage } from \"./client.js\";\nimport { type SessionSummary, type TurnStats, claudeEquivalentCost, costUsd } from \"./telemetry.js\";\nimport { type ReadTranscriptResult, type TranscriptRecord, readTranscript } from \"./transcript.js\";\n\nexport interface ReplayStats extends SessionSummary {\n /** Per-turn stats, in turn order. Only assistant_final records contribute. */\n perTurn: TurnStats[];\n /** Unique models that appeared in the transcript's assistant_final records. */\n models: string[];\n /** Unique prefix hashes that appeared. Length > 1 means the prefix churned (cache-hostile). */\n prefixHashes: string[];\n /** Count of user-role records (user turns issued). */\n userTurns: number;\n /** Count of tool-role records (tool calls executed). */\n toolCalls: number;\n}\n\n/**\n * Parse a transcript file and compute replay stats. Throws only on I/O\n * errors; malformed lines inside the file are skipped silently.\n */\nexport function replayFromFile(path: string): { parsed: ReadTranscriptResult; stats: ReplayStats } {\n const parsed = readTranscript(path);\n return { parsed, stats: computeReplayStats(parsed.records) };\n}\n\nexport function computeReplayStats(records: TranscriptRecord[]): ReplayStats {\n const turns: TurnStats[] = [];\n const models = new Set<string>();\n const prefixHashes = new Set<string>();\n let userTurns = 0;\n let toolCalls = 0;\n\n for (const rec of records) {\n if (rec.role === \"user\") userTurns++;\n else if (rec.role === \"tool\") toolCalls++;\n else if (rec.role === \"assistant_final\") {\n if (rec.model) models.add(rec.model);\n if (rec.prefixHash) prefixHashes.add(rec.prefixHash);\n if (rec.usage && rec.model) {\n const u = new Usage(\n rec.usage.prompt_tokens ?? 0,\n rec.usage.completion_tokens ?? 0,\n rec.usage.total_tokens ?? 0,\n rec.usage.prompt_cache_hit_tokens ?? 0,\n rec.usage.prompt_cache_miss_tokens ?? 0,\n );\n turns.push({\n turn: rec.turn,\n model: rec.model,\n usage: u,\n // `rec.cost` wins when present — honors whatever the writer computed\n // even if pricing tables have since changed. Only recompute when\n // the transcript didn't record it (old format).\n cost: rec.cost ?? costUsd(rec.model, u),\n cacheHitRatio: u.cacheHitRatio,\n });\n }\n }\n }\n\n return {\n perTurn: turns,\n models: [...models],\n prefixHashes: [...prefixHashes],\n userTurns,\n toolCalls,\n ...summarizeTurns(turns),\n };\n}\n\nfunction summarizeTurns(turns: TurnStats[]): SessionSummary {\n const totalCost = turns.reduce((s, t) => s + t.cost, 0);\n const totalClaude = turns.reduce((s, t) => s + claudeEquivalentCost(t.usage), 0);\n let hit = 0;\n let miss = 0;\n for (const t of turns) {\n hit += t.usage.promptCacheHitTokens;\n miss += t.usage.promptCacheMissTokens;\n }\n const cacheHitRatio = hit + miss > 0 ? hit / (hit + miss) : 0;\n const savingsVsClaude = totalClaude > 0 ? 1 - totalCost / totalClaude : 0;\n return {\n turns: turns.length,\n totalCostUsd: round(totalCost, 6),\n claudeEquivalentUsd: round(totalClaude, 6),\n savingsVsClaudePct: round(savingsVsClaude * 100, 2),\n cacheHitRatio: round(cacheHitRatio, 4),\n };\n}\n\nfunction round(n: number, digits: number): number {\n const f = 10 ** digits;\n return Math.round(n * f) / f;\n}\n","/**\n * Diff — compare two transcripts and produce a summary + divergence report.\n *\n * Two transcripts are \"comparable\" when they stem from the same task (or\n * the same user prompt). Alignment is by turn number: assistant_final #N\n * in A pairs with assistant_final #N in B. If one side ran more turns, the\n * extras are labeled \"only in A\" / \"only in B\".\n *\n * What we compute:\n * - Aggregate deltas: turns, tool calls, cache hit, cost, token counts\n * - First divergence: the lowest turn where A and B's tool calls or\n * assistant text differ meaningfully\n * - Prefix-stability story: how many unique prefix hashes each side used\n *\n * Non-goals (deliberately):\n * - LLM-judge quality comparison\n * - Per-token delta rendering — not useful at the fidelity we're at\n * - Embedding similarity — Levenshtein ratio is cheap and good enough\n */\n\nimport { type ReplayStats, computeReplayStats } from \"./replay.js\";\nimport type { ReadTranscriptResult, TranscriptRecord } from \"./transcript.js\";\n\nexport interface DiffSide {\n label: string;\n meta: ReadTranscriptResult[\"meta\"];\n records: TranscriptRecord[];\n stats: ReplayStats;\n}\n\nexport interface TurnPair {\n turn: number;\n aAssistant?: TranscriptRecord;\n bAssistant?: TranscriptRecord;\n aTools: TranscriptRecord[];\n bTools: TranscriptRecord[];\n /**\n * Classification of the pair:\n * \"match\" — both sides present, text & tool calls within threshold\n * \"diverge\" — both sides present, but text or tool calls differ\n * \"only_in_a\" — assistant_final in A but not B\n * \"only_in_b\" — assistant_final in B but not A\n */\n kind: \"match\" | \"diverge\" | \"only_in_a\" | \"only_in_b\";\n /** When kind === \"diverge\", a short one-liner pointing at what differs. */\n divergenceNote?: string;\n}\n\nexport interface DiffReport {\n a: DiffSide;\n b: DiffSide;\n pairs: TurnPair[];\n firstDivergenceTurn: number | null;\n}\n\nexport function diffTranscripts(\n a: { label: string; parsed: ReadTranscriptResult },\n b: { label: string; parsed: ReadTranscriptResult },\n): DiffReport {\n const aSide: DiffSide = {\n label: a.label,\n meta: a.parsed.meta,\n records: a.parsed.records,\n stats: computeReplayStats(a.parsed.records),\n };\n const bSide: DiffSide = {\n label: b.label,\n meta: b.parsed.meta,\n records: b.parsed.records,\n stats: computeReplayStats(b.parsed.records),\n };\n\n const aByTurn = groupByTurn(a.parsed.records);\n const bByTurn = groupByTurn(b.parsed.records);\n const turns = [...new Set([...aByTurn.keys(), ...bByTurn.keys()])].sort((x, y) => x - y);\n\n const pairs: TurnPair[] = [];\n let firstDivergenceTurn: number | null = null;\n for (const turn of turns) {\n const aGroup = aByTurn.get(turn) ?? { assistant: undefined, tools: [] };\n const bGroup = bByTurn.get(turn) ?? { assistant: undefined, tools: [] };\n const aAssistant = aGroup.assistant;\n const bAssistant = bGroup.assistant;\n const aTools = aGroup.tools;\n const bTools = bGroup.tools;\n\n let kind: TurnPair[\"kind\"];\n let divergenceNote: string | undefined;\n if (!aAssistant && bAssistant) kind = \"only_in_b\";\n else if (aAssistant && !bAssistant) kind = \"only_in_a\";\n else if (!aAssistant && !bAssistant)\n kind = \"diverge\"; // tool-only turn (rare)\n else {\n divergenceNote = classifyDivergence(aAssistant!, bAssistant!, aTools, bTools);\n kind = divergenceNote ? \"diverge\" : \"match\";\n }\n\n if (kind !== \"match\" && firstDivergenceTurn === null) firstDivergenceTurn = turn;\n pairs.push({ turn, aAssistant, bAssistant, aTools, bTools, kind, divergenceNote });\n }\n\n return { a: aSide, b: bSide, pairs, firstDivergenceTurn };\n}\n\n// ---------- divergence classification ----------\n\n/**\n * Return a short reason string if two sides meaningfully disagree, or\n * undefined if they're close enough to call a match.\n *\n * Ranking of divergence signals (cheapest first):\n * 1. Different set of tool names → clearest diff\n * 2. Different tool args for the same tool → second-clearest\n * 3. Text similarity below threshold → fuzziest\n */\nfunction classifyDivergence(\n a: TranscriptRecord,\n b: TranscriptRecord,\n aTools: TranscriptRecord[],\n bTools: TranscriptRecord[],\n): string | undefined {\n const aNames = aTools.map((t) => t.tool ?? \"\").sort();\n const bNames = bTools.map((t) => t.tool ?? \"\").sort();\n if (aNames.join(\",\") !== bNames.join(\",\")) {\n return `tool calls differ: A=[${aNames.join(\",\") || \"—\"}] B=[${bNames.join(\",\") || \"—\"}]`;\n }\n // Same tool names — did they pass different args?\n for (let i = 0; i < aTools.length; i++) {\n const at = aTools[i]!;\n const bt = bTools[i]!;\n if (at.tool !== bt.tool) continue;\n if ((at.args ?? \"\") !== (bt.args ?? \"\")) {\n return `\"${at.tool}\" args differ`;\n }\n }\n const simRatio = similarity(a.content, b.content);\n if (simRatio < 0.75) return `text similarity ${(simRatio * 100).toFixed(0)}%`;\n return undefined;\n}\n\n/**\n * Normalized Levenshtein similarity ratio in [0, 1]. 1 = identical.\n * Early-exits for long strings (> 2000 chars) with a cheap token-overlap\n * estimate to keep diff fast on chatty transcripts.\n */\nexport function similarity(a: string, b: string): number {\n if (a === b) return 1;\n if (!a && !b) return 1;\n if (!a || !b) return 0;\n const maxLen = Math.max(a.length, b.length);\n if (maxLen > 2000) return tokenOverlap(a, b);\n const dist = levenshtein(a, b);\n return 1 - dist / maxLen;\n}\n\nfunction tokenOverlap(a: string, b: string): number {\n const ta = new Set(a.toLowerCase().split(/\\s+/).filter(Boolean));\n const tb = new Set(b.toLowerCase().split(/\\s+/).filter(Boolean));\n if (ta.size === 0 && tb.size === 0) return 1;\n let shared = 0;\n for (const t of ta) if (tb.has(t)) shared++;\n return (2 * shared) / (ta.size + tb.size);\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (m === 0) return n;\n if (n === 0) return m;\n let prev = new Array(n + 1);\n let curr = new Array(n + 1);\n for (let j = 0; j <= n; j++) prev[j] = j;\n for (let i = 1; i <= m; i++) {\n curr[0] = i;\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);\n }\n [prev, curr] = [curr, prev];\n }\n return prev[n];\n}\n\n// ---------- grouping ----------\n\ninterface TurnGroup {\n assistant?: TranscriptRecord;\n tools: TranscriptRecord[];\n}\n\nfunction groupByTurn(records: TranscriptRecord[]): Map<number, TurnGroup> {\n const out = new Map<number, TurnGroup>();\n for (const rec of records) {\n if (rec.role === \"user\") continue; // user msg is input to the turn, not its output\n const g = out.get(rec.turn) ?? { tools: [] };\n if (rec.role === \"assistant_final\") g.assistant = rec;\n else if (rec.role === \"tool\") g.tools.push(rec);\n out.set(rec.turn, g);\n }\n return out;\n}\n\n// ---------- rendering ----------\n\nexport interface RenderOptions {\n /** Monochrome output (for file redirection or piping). Defaults to true. */\n monochrome?: boolean;\n}\n\nexport function renderSummaryTable(report: DiffReport, _opts: RenderOptions = {}): string {\n const a = report.a;\n const b = report.b;\n const lines: string[] = [];\n lines.push(\"Comparing:\");\n lines.push(` A ${a.label}`);\n lines.push(` B ${b.label}`);\n lines.push(\"\");\n lines.push(row([\"\", \"A\", \"B\", \"Δ\"], [20, 14, 14, 14]));\n lines.push(\n row([\"─\".repeat(20), \"─\".repeat(14), \"─\".repeat(14), \"─\".repeat(14)], [20, 14, 14, 14]),\n );\n lines.push(statRow(\"model calls\", a.stats.turns, b.stats.turns));\n lines.push(statRow(\"user turns\", a.stats.userTurns, b.stats.userTurns));\n lines.push(statRow(\"tool calls\", a.stats.toolCalls, b.stats.toolCalls));\n lines.push(\n row(\n [\n \"cache hit\",\n `${pct(a.stats.cacheHitRatio)}`,\n `${pct(b.stats.cacheHitRatio)}`,\n signPct(b.stats.cacheHitRatio - a.stats.cacheHitRatio),\n ],\n [20, 14, 14, 14],\n ),\n );\n lines.push(\n row(\n [\n \"cost (USD)\",\n `$${a.stats.totalCostUsd.toFixed(6)}`,\n `$${b.stats.totalCostUsd.toFixed(6)}`,\n costDelta(a.stats.totalCostUsd, b.stats.totalCostUsd),\n ],\n [20, 14, 14, 14],\n ),\n );\n lines.push(statRow(\"prefix hashes\", a.stats.prefixHashes.length, b.stats.prefixHashes.length));\n lines.push(\"\");\n\n // Prefix stability story — the headline finding when comparing bench modes.\n const aPrefixStable = a.stats.prefixHashes.length <= 1;\n const bPrefixStable = b.stats.prefixHashes.length <= 1;\n if (aPrefixStable !== bPrefixStable) {\n const stable = aPrefixStable ? \"A\" : \"B\";\n const churn = aPrefixStable ? \"B\" : \"A\";\n const churnCount = aPrefixStable ? b.stats.prefixHashes.length : a.stats.prefixHashes.length;\n lines.push(\n `prefix stability: ${stable} stayed byte-stable across ${Math.max(\n a.stats.turns,\n b.stats.turns,\n )} turns; ${churn} churned ${churnCount} distinct prefixes.`,\n );\n lines.push(\"\");\n } else if (a.stats.prefixHashes[0] && a.stats.prefixHashes[0] === b.stats.prefixHashes[0]) {\n lines.push(\n `prefix: A and B share the same prefix hash (${a.stats.prefixHashes[0].slice(0, 12)}…) — cache delta is attributable to log stability, not prompt change.`,\n );\n lines.push(\"\");\n }\n\n if (report.firstDivergenceTurn !== null) {\n const p = report.pairs.find((p) => p.turn === report.firstDivergenceTurn);\n lines.push(\n `first divergence: turn ${report.firstDivergenceTurn} — ${p?.divergenceNote ?? \"?\"}`,\n );\n if (p?.aAssistant) lines.push(` A → ${truncate(p.aAssistant.content, 100)}`);\n if (p?.bAssistant) lines.push(` B → ${truncate(p.bAssistant.content, 100)}`);\n } else {\n lines.push(\"no material divergence detected (texts within similarity threshold).\");\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function renderMarkdown(report: DiffReport): string {\n const a = report.a;\n const b = report.b;\n const out: string[] = [];\n out.push(`# Transcript diff: ${a.label} vs ${b.label}`);\n out.push(\"\");\n if (a.meta || b.meta) {\n out.push(\"## Meta\");\n out.push(\"\");\n out.push(`| | ${a.label} | ${b.label} |`);\n out.push(\"|---|---|---|\");\n out.push(`| source | ${a.meta?.source ?? \"—\"} | ${b.meta?.source ?? \"—\"} |`);\n out.push(`| model | ${a.meta?.model ?? \"—\"} | ${b.meta?.model ?? \"—\"} |`);\n out.push(`| task | ${a.meta?.task ?? \"—\"} | ${b.meta?.task ?? \"—\"} |`);\n out.push(`| startedAt | ${a.meta?.startedAt ?? \"—\"} | ${b.meta?.startedAt ?? \"—\"} |`);\n out.push(\"\");\n }\n\n out.push(\"## Summary\");\n out.push(\"\");\n out.push(`| metric | ${a.label} | ${b.label} | delta |`);\n out.push(\"|---|---:|---:|---:|\");\n out.push(\n `| model calls | ${a.stats.turns} | ${b.stats.turns} | ${signed(b.stats.turns - a.stats.turns)} |`,\n );\n out.push(\n `| user turns | ${a.stats.userTurns} | ${b.stats.userTurns} | ${signed(b.stats.userTurns - a.stats.userTurns)} |`,\n );\n out.push(\n `| tool calls | ${a.stats.toolCalls} | ${b.stats.toolCalls} | ${signed(b.stats.toolCalls - a.stats.toolCalls)} |`,\n );\n out.push(\n `| cache hit | ${pct(a.stats.cacheHitRatio)} | ${pct(b.stats.cacheHitRatio)} | **${signPct(b.stats.cacheHitRatio - a.stats.cacheHitRatio)}** |`,\n );\n out.push(\n `| cost (USD) | $${a.stats.totalCostUsd.toFixed(6)} | $${b.stats.totalCostUsd.toFixed(6)} | ${costDelta(a.stats.totalCostUsd, b.stats.totalCostUsd)} |`,\n );\n out.push(\n `| prefix hashes | ${a.stats.prefixHashes.length} | ${b.stats.prefixHashes.length} | — |`,\n );\n out.push(\"\");\n\n out.push(\"## Turn-by-turn\");\n out.push(\"\");\n out.push(`| turn | kind | ${a.label} tool calls | ${b.label} tool calls | note |`);\n out.push(\"|---:|:---:|---|---|---|\");\n for (const p of report.pairs) {\n const aTools =\n p.aTools\n .map((t) => t.tool)\n .filter(Boolean)\n .join(\", \") || \"—\";\n const bTools =\n p.bTools\n .map((t) => t.tool)\n .filter(Boolean)\n .join(\", \") || \"—\";\n out.push(`| ${p.turn} | ${p.kind} | ${aTools} | ${bTools} | ${p.divergenceNote ?? \"\"} |`);\n }\n out.push(\"\");\n\n if (report.firstDivergenceTurn !== null) {\n const p = report.pairs.find((x) => x.turn === report.firstDivergenceTurn);\n out.push(`## First divergence (turn ${report.firstDivergenceTurn})`);\n out.push(\"\");\n out.push(p?.divergenceNote ?? \"\");\n out.push(\"\");\n if (p?.aAssistant) {\n out.push(`**${a.label}:**`);\n out.push(\"\");\n out.push(\"```\");\n out.push(p.aAssistant.content);\n out.push(\"```\");\n out.push(\"\");\n }\n if (p?.bAssistant) {\n out.push(`**${b.label}:**`);\n out.push(\"\");\n out.push(\"```\");\n out.push(p.bAssistant.content);\n out.push(\"```\");\n out.push(\"\");\n }\n }\n return out.join(\"\\n\");\n}\n\n// ---------- formatting helpers ----------\n\nfunction row(cols: string[], widths: number[]): string {\n return cols.map((c, i) => padRight(c, widths[i] ?? c.length)).join(\" \");\n}\n\nfunction statRow(label: string, av: number, bv: number): string {\n return row([label, `${av}`, `${bv}`, signed(bv - av)], [20, 14, 14, 14]);\n}\n\nfunction padRight(s: string, w: number): string {\n return s.length >= w ? s : s + \" \".repeat(w - s.length);\n}\n\nfunction signed(n: number): string {\n if (n === 0) return \"0\";\n return `${n > 0 ? \"+\" : \"\"}${n}`;\n}\n\nfunction signPct(diff: number): string {\n if (diff === 0) return \"0pp\";\n const s = (diff * 100).toFixed(1);\n return `${diff > 0 ? \"+\" : \"\"}${s}pp`;\n}\n\nfunction pct(x: number): string {\n return `${(x * 100).toFixed(1)}%`;\n}\n\nfunction costDelta(a: number, b: number): string {\n if (a === 0 && b === 0) return \"—\";\n if (a === 0) return \"new\";\n const pctChange = ((b - a) / a) * 100;\n return `${pctChange > 0 ? \"+\" : \"\"}${pctChange.toFixed(1)}%`;\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length > n ? `${s.slice(0, n)}…` : s;\n}\n","/**\n * User-level config storage for the Reasonix CLI.\n *\n * Lookup order for the API key:\n * 1. `DEEPSEEK_API_KEY` env var (highest priority — for CI / power users)\n * 2. `~/.reasonix/config.json` (set by the first-run setup flow)\n *\n * The library itself never touches the config file — it only reads\n * `DEEPSEEK_API_KEY` from the environment. The CLI is responsible for\n * pulling from the config file and exposing it via env var to the loop.\n */\n\nimport { chmodSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport interface ReasonixConfig {\n apiKey?: string;\n baseUrl?: string;\n}\n\nexport function defaultConfigPath(): string {\n return join(homedir(), \".reasonix\", \"config.json\");\n}\n\nexport function readConfig(path: string = defaultConfigPath()): ReasonixConfig {\n try {\n const raw = readFileSync(path, \"utf8\");\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") return parsed as ReasonixConfig;\n } catch {\n /* missing or malformed → empty config */\n }\n return {};\n}\n\nexport function writeConfig(cfg: ReasonixConfig, path: string = defaultConfigPath()): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(cfg, null, 2), \"utf8\");\n // Restrict permissions on Unix; chmod is a no-op on Windows but won't throw.\n try {\n chmodSync(path, 0o600);\n } catch {\n /* ignore on platforms without chmod */\n }\n}\n\n/** Resolve the API key from env var first, then the config file. */\nexport function loadApiKey(path: string = defaultConfigPath()): string | undefined {\n if (process.env.DEEPSEEK_API_KEY) return process.env.DEEPSEEK_API_KEY;\n return readConfig(path).apiKey;\n}\n\nexport function saveApiKey(key: string, path: string = defaultConfigPath()): void {\n const cfg = readConfig(path);\n cfg.apiKey = key.trim();\n writeConfig(cfg, path);\n}\n\nexport function isPlausibleKey(key: string): boolean {\n const trimmed = key.trim();\n return /^sk-[A-Za-z0-9_-]{16,}$/.test(trimmed);\n}\n\n/** Mask a key for display: `sk-abcd...wxyz`. */\nexport function redactKey(key: string): string {\n if (!key) return \"\";\n if (key.length <= 12) return \"****\";\n return `${key.slice(0, 6)}…${key.slice(-4)}`;\n}\n","/** Reasonix — DeepSeek-native agent framework. Library entry point. */\n\nexport { DeepSeekClient, Usage } from \"./client.js\";\nexport type { ChatResponse, StreamChunk, DeepSeekClientOptions } from \"./client.js\";\n\nexport { CacheFirstLoop } from \"./loop.js\";\nexport type {\n CacheFirstLoopOptions,\n LoopEvent,\n EventRole,\n BranchSummary,\n BranchProgress,\n ReconfigurableOptions,\n} from \"./loop.js\";\n\nexport { runBranches, defaultSelector, aggregateBranchUsage } from \"./consistency.js\";\nexport type {\n BranchOptions,\n BranchSample,\n BranchResult,\n BranchSelector,\n} from \"./consistency.js\";\n\nexport { ImmutablePrefix, AppendOnlyLog, VolatileScratch } from \"./memory.js\";\nexport type { ImmutablePrefixOptions } from \"./memory.js\";\n\nexport { ToolRegistry } from \"./tools.js\";\nexport type { ToolDefinition } from \"./tools.js\";\n\nexport { SessionStats, costUsd, claudeEquivalentCost } from \"./telemetry.js\";\nexport type { TurnStats, SessionSummary } from \"./telemetry.js\";\n\nexport {\n ToolCallRepair,\n scavengeToolCalls,\n repairTruncatedJson,\n StormBreaker,\n analyzeSchema,\n flattenSchema,\n nestArguments,\n} from \"./repair/index.js\";\nexport type {\n RepairReport,\n ToolCallRepairOptions,\n ScavengeOptions,\n ScavengeResult,\n TruncationRepairResult,\n FlattenDecision,\n} from \"./repair/index.js\";\n\nexport { harvest, emptyPlanState, isPlanStateEmpty } from \"./harvest.js\";\nexport type { TypedPlanState, HarvestOptions } from \"./harvest.js\";\n\nexport {\n appendSessionMessage,\n deleteSession,\n listSessions,\n loadSessionMessages,\n sanitizeName as sanitizeSessionName,\n sessionPath,\n sessionsDir,\n} from \"./session.js\";\nexport type { SessionInfo } from \"./session.js\";\n\nexport { loadDotenv } from \"./env.js\";\n\nexport {\n openTranscriptFile,\n parseTranscript,\n readTranscript,\n recordFromLoopEvent,\n writeMeta,\n writeRecord,\n} from \"./transcript.js\";\nexport type { TranscriptRecord, TranscriptMeta, ReadTranscriptResult } from \"./transcript.js\";\n\nexport { computeReplayStats, replayFromFile } from \"./replay.js\";\nexport type { ReplayStats } from \"./replay.js\";\n\nexport {\n diffTranscripts,\n renderMarkdown as renderDiffMarkdown,\n renderSummaryTable as renderDiffSummary,\n similarity,\n} from \"./diff.js\";\nexport type { DiffReport, DiffSide, TurnPair, RenderOptions as DiffRenderOptions } from \"./diff.js\";\n\nexport { fetchWithRetry } from \"./retry.js\";\nexport type { RetryOptions, RetryInfo } from \"./retry.js\";\n\nexport {\n defaultConfigPath,\n isPlausibleKey,\n loadApiKey,\n readConfig,\n redactKey,\n saveApiKey,\n writeConfig,\n} from \"./config.js\";\nexport type { ReasonixConfig } from \"./config.js\";\n\nexport type {\n ChatMessage,\n ToolCall,\n ToolSpec,\n ToolFunctionSpec,\n Role,\n JSONSchema,\n} from \"./types.js\";\n\nexport const VERSION = \"0.2.0\";\n","import { render } from \"ink\";\nimport React, { useState } from \"react\";\nimport { loadApiKey } from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { App } from \"../ui/App.js\";\nimport { Setup } from \"../ui/Setup.js\";\n\nexport interface ChatOptions {\n model: string;\n system: string;\n transcript?: string;\n harvest?: boolean;\n branch?: number;\n session?: string;\n}\n\ninterface RootProps extends ChatOptions {\n initialKey: string | undefined;\n}\n\nfunction Root({ initialKey, ...appProps }: RootProps) {\n const [key, setKey] = useState<string | undefined>(initialKey);\n if (!key) {\n return (\n <Setup\n onReady={(k) => {\n process.env.DEEPSEEK_API_KEY = k;\n setKey(k);\n }}\n />\n );\n }\n // Ensure the loop's DeepSeekClient picks up the key when it lazy-instantiates.\n process.env.DEEPSEEK_API_KEY = key;\n return (\n <App\n model={appProps.model}\n system={appProps.system}\n transcript={appProps.transcript}\n harvest={appProps.harvest}\n branch={appProps.branch}\n session={appProps.session}\n />\n );\n}\n\nexport async function chatCommand(opts: ChatOptions): Promise<void> {\n loadDotenv();\n const initialKey = loadApiKey();\n const { waitUntilExit } = render(<Root initialKey={initialKey} {...opts} />, {\n exitOnCtrlC: true,\n });\n await waitUntilExit();\n}\n","import type { WriteStream } from \"node:fs\";\nimport { Box, Static, Text, useApp } from \"ink\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\nimport type { LoopEvent } from \"../../loop.js\";\nimport type { SessionSummary } from \"../../telemetry.js\";\nimport { openTranscriptFile, recordFromLoopEvent, writeRecord } from \"../../transcript.js\";\nimport { type DisplayEvent, EventRow } from \"./EventLog.js\";\nimport { PromptInput } from \"./PromptInput.js\";\nimport { StatsPanel } from \"./StatsPanel.js\";\nimport { handleSlash, parseSlash } from \"./slash.js\";\n\nexport interface AppProps {\n model: string;\n system: string;\n transcript?: string;\n harvest?: boolean;\n branch?: number;\n session?: string;\n}\n\n/**\n * Throttle interval in ms. We flush streaming deltas at most this often to\n * avoid re-rendering the whole UI on every single token from DeepSeek.\n * 60ms ≈ 16Hz, fast enough to feel live, slow enough to not thrash Ink.\n */\nconst FLUSH_INTERVAL_MS = 60;\n\ninterface StreamingState {\n id: string;\n text: string;\n reasoning: string;\n}\n\nexport function App({ model, system, transcript, harvest, branch, session }: AppProps) {\n const { exit } = useApp();\n const [historical, setHistorical] = useState<DisplayEvent[]>([]);\n const [streaming, setStreaming] = useState<DisplayEvent | null>(null);\n const [input, setInput] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [summary, setSummary] = useState<SessionSummary>({\n turns: 0,\n totalCostUsd: 0,\n claudeEquivalentUsd: 0,\n savingsVsClaudePct: 0,\n cacheHitRatio: 0,\n });\n\n const transcriptRef = useRef<WriteStream | null>(null);\n if (transcript && !transcriptRef.current) {\n transcriptRef.current = openTranscriptFile(transcript, {\n version: 1,\n source: \"reasonix chat\",\n model,\n startedAt: new Date().toISOString(),\n });\n }\n useEffect(() => {\n return () => {\n transcriptRef.current?.end();\n };\n }, []);\n\n const loopRef = useRef<CacheFirstLoop | null>(null);\n const loop = useMemo(() => {\n if (loopRef.current) return loopRef.current;\n const client = new DeepSeekClient();\n const prefix = new ImmutablePrefix({ system });\n const l = new CacheFirstLoop({ client, prefix, model, harvest, branch, session });\n loopRef.current = l;\n return l;\n }, [model, system, harvest, branch, session]);\n\n // Surface a one-time banner about session state on first mount.\n const sessionBannerShown = useRef(false);\n useEffect(() => {\n if (sessionBannerShown.current) return;\n sessionBannerShown.current = true;\n if (!session) {\n setHistorical((prev) => [\n ...prev,\n {\n id: `sys-session-${Date.now()}`,\n role: \"info\",\n text: \"▸ ephemeral chat (no session persistence) — drop --no-session to enable\",\n },\n ]);\n } else if (loop.resumedMessageCount > 0) {\n setHistorical((prev) => [\n ...prev,\n {\n id: `sys-resume-${Date.now()}`,\n role: \"info\",\n text: `▸ resumed session \"${session}\" with ${loop.resumedMessageCount} prior messages · /forget to start over · /sessions to list`,\n },\n ]);\n } else {\n setHistorical((prev) => [\n ...prev,\n {\n id: `sys-newsession-${Date.now()}`,\n role: \"info\",\n text: `▸ session \"${session}\" (new) — auto-saved as you chat · /forget to delete · /sessions to list`,\n },\n ]);\n }\n }, [session, loop]);\n\n const prefixHash = loop.prefix.fingerprint;\n\n const writeTranscript = useCallback(\n (ev: LoopEvent) => {\n const stream = transcriptRef.current;\n if (!stream) return;\n writeRecord(stream, recordFromLoopEvent(ev, { model, prefixHash }));\n },\n [model, prefixHash],\n );\n\n const handleSubmit = useCallback(\n async (raw: string) => {\n const text = raw.trim();\n if (!text || busy) return;\n setInput(\"\");\n const slash = parseSlash(text);\n if (slash) {\n const result = handleSlash(slash.cmd, slash.args, loop);\n if (result.exit) {\n transcriptRef.current?.end();\n exit();\n return;\n }\n if (result.clear) {\n setHistorical([]);\n return;\n }\n if (result.info) {\n setHistorical((prev) => [\n ...prev,\n {\n id: `sys-${Date.now()}`,\n role: \"info\",\n text: result.info!,\n },\n ]);\n }\n return;\n }\n\n // User message is immutable — push to Static immediately.\n setHistorical((prev) => [...prev, { id: `u-${Date.now()}`, role: \"user\", text }]);\n\n const assistantId = `a-${Date.now()}`;\n // Refs are the source of truth for accumulated streaming text; the React\n // state copy below is only for rendering and gets updated on flush.\n const streamRef: StreamingState = { id: assistantId, text: \"\", reasoning: \"\" };\n const contentBuf = { current: \"\" };\n const reasoningBuf = { current: \"\" };\n\n setStreaming({ id: assistantId, role: \"assistant\", text: \"\", streaming: true });\n setBusy(true);\n\n const flush = () => {\n if (!contentBuf.current && !reasoningBuf.current) return;\n streamRef.text += contentBuf.current;\n streamRef.reasoning += reasoningBuf.current;\n contentBuf.current = \"\";\n reasoningBuf.current = \"\";\n setStreaming({\n id: assistantId,\n role: \"assistant\",\n text: streamRef.text,\n reasoning: streamRef.reasoning || undefined,\n streaming: true,\n });\n };\n const timer = setInterval(flush, FLUSH_INTERVAL_MS);\n\n try {\n for await (const ev of loop.step(text)) {\n writeTranscript(ev);\n if (ev.role === \"assistant_delta\") {\n if (ev.content) contentBuf.current += ev.content;\n if (ev.reasoningDelta) reasoningBuf.current += ev.reasoningDelta;\n } else if (ev.role === \"branch_start\") {\n setStreaming({\n id: assistantId,\n role: \"assistant\",\n text: \"\",\n streaming: true,\n branchProgress: ev.branchProgress,\n });\n } else if (ev.role === \"branch_progress\") {\n // Live-update the streaming slot with per-sample completion info.\n setStreaming({\n id: assistantId,\n role: \"assistant\",\n text: \"\",\n streaming: true,\n branchProgress: ev.branchProgress,\n });\n } else if (ev.role === \"branch_done\") {\n // Intermediate: branching finished but assistant_final not yet emitted.\n // Keep streaming state alive; actual render happens on assistant_final.\n } else if (ev.role === \"assistant_final\") {\n flush();\n const repairNote = ev.repair ? describeRepair(ev.repair) : \"\";\n setStreaming(null);\n setHistorical((prev) => [\n ...prev,\n {\n id: assistantId,\n role: \"assistant\",\n text: ev.content || streamRef.text,\n reasoning: streamRef.reasoning || undefined,\n planState: ev.planState,\n branch: ev.branch,\n stats: ev.stats,\n repair: repairNote || undefined,\n streaming: false,\n },\n ]);\n } else if (ev.role === \"tool\") {\n flush();\n setHistorical((prev) => [\n ...prev,\n {\n id: `t-${Date.now()}-${Math.random()}`,\n role: \"tool\",\n text: ev.content,\n toolName: ev.toolName,\n },\n ]);\n } else if (ev.role === \"error\") {\n setHistorical((prev) => [\n ...prev,\n { id: `e-${Date.now()}`, role: \"error\", text: ev.error ?? ev.content },\n ]);\n }\n }\n flush();\n } finally {\n clearInterval(timer);\n setStreaming(null);\n setSummary(loop.stats.summary());\n setBusy(false);\n }\n },\n [busy, exit, loop, writeTranscript],\n );\n\n return (\n <Box flexDirection=\"column\">\n <StatsPanel\n summary={summary}\n model={loop.model}\n prefixHash={prefixHash}\n harvestOn={loop.harvestEnabled}\n branchBudget={loop.branchOptions.budget}\n />\n <Static items={historical}>{(item) => <EventRow key={item.id} event={item} />}</Static>\n {streaming ? (\n <Box marginY={1}>\n <EventRow event={streaming} />\n </Box>\n ) : null}\n <PromptInput value={input} onChange={setInput} onSubmit={handleSubmit} disabled={busy} />\n <CommandStrip />\n </Box>\n );\n}\n\nfunction CommandStrip() {\n return (\n <Box paddingX={2}>\n <Text dimColor>\n /help · /preset {\"<fast|smart|max>\"} · /sessions · /model · /harvest · /branch · /clear ·\n /exit\n </Text>\n </Box>\n );\n}\n\nfunction describeRepair(repair: {\n scavenged: number;\n truncationsFixed: number;\n stormsBroken: number;\n}): string {\n const parts: string[] = [];\n if (repair.scavenged) parts.push(`scavenged ${repair.scavenged}`);\n if (repair.truncationsFixed) parts.push(`repaired ${repair.truncationsFixed} truncation`);\n if (repair.stormsBroken) parts.push(`broke ${repair.stormsBroken} storm`);\n return parts.length ? `[repair] ${parts.join(\", \")}` : \"\";\n}\n","import { Box, Text } from \"ink\";\nimport React, { useEffect, useState } from \"react\";\nimport { type TypedPlanState, isPlanStateEmpty } from \"../../harvest.js\";\nimport type { BranchProgress, BranchSummary } from \"../../loop.js\";\nimport type { TurnStats } from \"../../telemetry.js\";\nimport { Markdown } from \"./markdown.js\";\n\nexport type DisplayRole = \"user\" | \"assistant\" | \"tool\" | \"system\" | \"error\" | \"info\";\n\nexport interface DisplayEvent {\n id: string;\n role: DisplayRole;\n text: string;\n reasoning?: string;\n planState?: TypedPlanState;\n branch?: BranchSummary;\n branchProgress?: BranchProgress;\n toolName?: string;\n stats?: TurnStats;\n repair?: string;\n streaming?: boolean;\n}\n\nexport const EventRow = React.memo(function EventRow({ event }: { event: DisplayEvent }) {\n if (event.role === \"user\") {\n return (\n <Box>\n <Text bold color=\"cyan\">\n you ›{\" \"}\n </Text>\n <Text>{event.text}</Text>\n </Box>\n );\n }\n if (event.role === \"assistant\") {\n if (event.streaming) return <StreamingAssistant event={event} />;\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text bold color=\"green\">\n assistant\n </Text>\n </Box>\n {event.branch ? <BranchBlock branch={event.branch} /> : null}\n {event.reasoning ? <ReasoningBlock reasoning={event.reasoning} /> : null}\n {!isPlanStateEmpty(event.planState) ? (\n <PlanStateBlock planState={event.planState!} />\n ) : null}\n {event.text ? <Markdown text={event.text} /> : <Text dimColor>(no content)</Text>}\n {event.stats ? <StatsLine stats={event.stats} /> : null}\n {event.repair ? <Text color=\"magenta\">{event.repair}</Text> : null}\n </Box>\n );\n }\n if (event.role === \"tool\") {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"yellow\">{`tool<${event.toolName ?? \"?\"}> →`}</Text>\n <Text dimColor> {truncate(event.text, 400)}</Text>\n </Box>\n );\n }\n if (event.role === \"error\") {\n return (\n <Box marginTop={1}>\n <Text color=\"red\" bold>\n error{\" \"}\n </Text>\n <Text color=\"red\">{event.text}</Text>\n </Box>\n );\n }\n if (event.role === \"info\") {\n return (\n <Box>\n <Text dimColor>{event.text}</Text>\n </Box>\n );\n }\n return (\n <Box>\n <Text>{event.text}</Text>\n </Box>\n );\n});\n\nfunction BranchBlock({ branch }: { branch: BranchSummary }) {\n const per = branch.uncertainties\n .map((u, i) => {\n const marker = i === branch.chosenIndex ? \"▸\" : \" \";\n const t = (branch.temperatures[i] ?? 0).toFixed(1);\n return `${marker} #${i} T=${t} u=${u}`;\n })\n .join(\" \");\n return (\n <Box>\n <Text color=\"blue\">\n {\"🔀 branched \"}\n <Text bold>{branch.budget}</Text>\n {` samples → picked #${branch.chosenIndex} `}\n <Text dimColor>{per}</Text>\n </Text>\n </Box>\n );\n}\n\nfunction PlanStateBlock({ planState }: { planState: TypedPlanState }) {\n const lines: Array<[string, string[]]> = [];\n if (planState.subgoals.length) lines.push([\"subgoals\", planState.subgoals]);\n if (planState.hypotheses.length) lines.push([\"hypotheses\", planState.hypotheses]);\n if (planState.uncertainties.length) lines.push([\"uncertainties\", planState.uncertainties]);\n if (planState.rejectedPaths.length) lines.push([\"rejected\", planState.rejectedPaths]);\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n {lines.map(([label, items]) => (\n <Text key={label} color=\"magenta\">\n {\"‹ \"}\n <Text bold>{label}</Text>\n {` (${items.length}): ${items.join(\" · \")}`}\n </Text>\n ))}\n </Box>\n );\n}\n\nfunction ReasoningBlock({ reasoning }: { reasoning: string }) {\n const max = 220;\n const flat = reasoning.replace(/\\s+/g, \" \").trim();\n const preview =\n flat.length <= max ? flat : `${flat.slice(0, max)}… (+${flat.length - max} chars)`;\n return (\n <Box marginBottom={1}>\n <Text dimColor italic>\n {\"↳ thinking: \"}\n {preview}\n </Text>\n </Box>\n );\n}\n\n/**\n * Compact progress view rendered while a turn is still streaming. We keep\n * this to a fixed ~3-line footprint so the dynamic region never scrolls past\n * the terminal viewport and leaves artifacts in scrollback.\n */\nfunction Elapsed() {\n const [s, setS] = useState(0);\n useEffect(() => {\n const start = Date.now();\n const id = setInterval(() => setS(Math.floor((Date.now() - start) / 1000)), 1000);\n return () => clearInterval(id);\n }, []);\n const mm = String(Math.floor(s / 60)).padStart(2, \"0\");\n const ss = String(s % 60).padStart(2, \"0\");\n return <Text dimColor>{`${mm}:${ss}`}</Text>;\n}\n\nfunction StreamingAssistant({ event }: { event: DisplayEvent }) {\n if (event.branchProgress) {\n const p = event.branchProgress;\n // completed=0 means we've just started; no sample has finished yet.\n if (p.completed === 0) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text bold color=\"green\">\n assistant{\" \"}\n </Text>\n <Text color=\"blue\">\n 🔀 launching {p.total} parallel samples (R1 thinking in parallel)…{\" \"}\n </Text>\n <Elapsed />\n </Box>\n <Text dimColor>{\" \"}spread across T=0.0/0.5/1.0 · typical wait 30-90s for reasoner</Text>\n </Box>\n );\n }\n const pct = Math.round((p.completed / p.total) * 100);\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text bold color=\"green\">\n assistant{\" \"}\n </Text>\n <Text color=\"blue\">\n 🔀 branching {p.completed}/{p.total} ({pct}%){\" \"}\n </Text>\n <Elapsed />\n </Box>\n <Text dimColor>\n {\" latest #\"}\n {p.latestIndex}\n {\" T=\"}\n {p.latestTemperature.toFixed(1)}\n {\" u=\"}\n {p.latestUncertainties}\n {p.completed < p.total ? \" · waiting for other samples…\" : \" · selecting winner…\"}\n </Text>\n </Box>\n );\n }\n\n const tail = lastLine(event.text, 140);\n const reasoningTail = event.reasoning ? lastLine(event.reasoning, 120) : \"\";\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text bold color=\"green\">\n assistant{\" \"}\n </Text>\n <Text dimColor>\n (streaming · {event.text.length}\n {event.reasoning ? ` + think ${event.reasoning.length}` : \"\"} chars){\" \"}\n </Text>\n <Elapsed />\n </Box>\n {reasoningTail ? (\n <Text dimColor italic>\n ↳ thinking: {reasoningTail}\n </Text>\n ) : null}\n {tail ? (\n <Text dimColor>▸ {tail}</Text>\n ) : (\n <Text dimColor italic>\n {\" (waiting for first token…)\"}\n </Text>\n )}\n </Box>\n );\n}\n\nfunction lastLine(s: string, maxChars: number): string {\n const flat = s.replace(/\\s+/g, \" \").trim();\n if (!flat) return \"\";\n return flat.length <= maxChars ? flat : `…${flat.slice(-maxChars)}`;\n}\n\nfunction StatsLine({ stats }: { stats: TurnStats }) {\n const hit = (stats.cacheHitRatio * 100).toFixed(1);\n return (\n <Text dimColor>\n {\" ↳ cache \"}\n {hit}\n {\"% · tokens \"}\n {stats.usage.promptTokens}\n {\"→\"}\n {stats.usage.completionTokens}\n {\" · $\"}\n {stats.cost.toFixed(6)}\n </Text>\n );\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max)}… (+${s.length - max} chars)`;\n}\n","/**\n * Minimal Markdown → Ink renderer for chat output.\n *\n * Handles the subset that actually shows up in LLM answers:\n * - ATX headers (# ##)\n * - Unordered / ordered lists\n * - Fenced code blocks (```lang)\n * - Inline **bold**, *italic*, `code`\n * - Paragraphs separated by blank lines\n * - LaTeX delimiters are stripped (\\( \\), \\[ \\], \\boxed{X})\n *\n * The goal is not TeX-perfect math — it's \"stop showing raw backslashes to\n * the user.\" When the model insists on LaTeX, we strip the scaffolding and\n * show the expression verbatim; terminals don't do math fonts anyway.\n */\n\nimport { Box, Text } from \"ink\";\nimport React from \"react\";\n\nconst SUPERSCRIPT: Record<string, string> = {\n \"0\": \"⁰\",\n \"1\": \"¹\",\n \"2\": \"²\",\n \"3\": \"³\",\n \"4\": \"⁴\",\n \"5\": \"⁵\",\n \"6\": \"⁶\",\n \"7\": \"⁷\",\n \"8\": \"⁸\",\n \"9\": \"⁹\",\n \"+\": \"⁺\",\n \"-\": \"⁻\",\n n: \"ⁿ\",\n};\nconst SUBSCRIPT: Record<string, string> = {\n \"0\": \"₀\",\n \"1\": \"₁\",\n \"2\": \"₂\",\n \"3\": \"₃\",\n \"4\": \"₄\",\n \"5\": \"₅\",\n \"6\": \"₆\",\n \"7\": \"₇\",\n \"8\": \"₈\",\n \"9\": \"₉\",\n \"+\": \"₊\",\n \"-\": \"₋\",\n};\n\nfunction toSuperscript(s: string): string {\n let out = \"\";\n for (const c of s) out += SUPERSCRIPT[c] ?? c;\n return out;\n}\nfunction toSubscript(s: string): string {\n let out = \"\";\n for (const c of s) out += SUBSCRIPT[c] ?? c;\n return out;\n}\n\nexport function stripMath(s: string): string {\n return (\n s\n // Delimiters\n .replace(/\\\\\\(\\s*/g, \"\")\n .replace(/\\s*\\\\\\)/g, \"\")\n .replace(/\\\\\\[\\s*/g, \"\\n\")\n .replace(/\\s*\\\\\\]/g, \"\\n\")\n // Fractions — \\frac, \\dfrac, \\tfrac. Allow whitespace and one nesting\n // level inside braces (e.g. \\frac{\\sqrt{2}}{3}). Trim captured groups\n // so '\\frac{ a }{ b }' renders as '(a)/(b)'.\n .replace(\n /\\\\[dt]?frac\\s*\\{((?:[^{}]|\\{[^{}]*\\})+)\\}\\s*\\{((?:[^{}]|\\{[^{}]*\\})+)\\}/g,\n (_m, num: string, den: string) => `(${num.trim()})/(${den.trim()})`,\n )\n .replace(\n /\\\\binom\\s*\\{([^{}]+)\\}\\s*\\{([^{}]+)\\}/g,\n (_m, n: string, k: string) => `C(${n.trim()},${k.trim()})`,\n )\n .replace(/\\\\sqrt\\s*\\{([^{}]+)\\}/g, (_m, g: string) => `√(${g.trim()})`)\n .replace(/\\\\boxed\\s*\\{([^{}]+)\\}/g, (_m, g: string) => `【${g.trim()}】`)\n .replace(/\\\\text\\s*\\{([^{}]+)\\}/g, (_m, g: string) => g.trim())\n .replace(/\\\\overline\\s*\\{([^{}]+)\\}/g, (_m, g: string) => `${g.trim()}̄`)\n .replace(/\\\\hat\\s*\\{([^{}]+)\\}/g, (_m, g: string) => `${g.trim()}̂`)\n .replace(/\\\\vec\\s*\\{([^{}]+)\\}/g, (_m, g: string) => `→${g.trim()}`)\n // Operators & symbols\n .replace(/\\\\cdot/g, \"·\")\n .replace(/\\\\times/g, \"×\")\n .replace(/\\\\div/g, \"÷\")\n .replace(/\\\\pm/g, \"±\")\n .replace(/\\\\mp/g, \"∓\")\n .replace(/\\\\leq/g, \"≤\")\n .replace(/\\\\geq/g, \"≥\")\n .replace(/\\\\neq/g, \"≠\")\n .replace(/\\\\approx/g, \"≈\")\n .replace(/\\\\in\\b/g, \"∈\")\n .replace(/\\\\notin\\b/g, \"∉\")\n .replace(/\\\\infty/g, \"∞\")\n .replace(/\\\\sum\\b/g, \"Σ\")\n .replace(/\\\\prod\\b/g, \"Π\")\n .replace(/\\\\int\\b/g, \"∫\")\n // Greek letters\n .replace(/\\\\alpha/g, \"α\")\n .replace(/\\\\beta/g, \"β\")\n .replace(/\\\\gamma/g, \"γ\")\n .replace(/\\\\delta/g, \"δ\")\n .replace(/\\\\theta/g, \"θ\")\n .replace(/\\\\lambda/g, \"λ\")\n .replace(/\\\\mu/g, \"μ\")\n .replace(/\\\\pi/g, \"π\")\n .replace(/\\\\sigma/g, \"σ\")\n .replace(/\\\\phi/g, \"φ\")\n .replace(/\\\\omega/g, \"ω\")\n // Arrows / logic\n .replace(/\\\\implies\\b/g, \"⇒\")\n .replace(/\\\\iff\\b/g, \"⇔\")\n .replace(/\\\\to\\b/g, \"→\")\n .replace(/\\\\rightarrow/g, \"→\")\n .replace(/\\\\Rightarrow/g, \"⇒\")\n .replace(/\\\\leftarrow/g, \"←\")\n .replace(/\\\\Leftarrow/g, \"⇐\")\n .replace(/\\\\ldots/g, \"…\")\n .replace(/\\\\cdots/g, \"⋯\")\n // Spacing commands\n .replace(/\\\\quad/g, \" \")\n .replace(/\\\\qquad/g, \" \")\n .replace(/\\\\,/g, \" \")\n .replace(/\\\\;/g, \" \")\n .replace(/\\\\!/g, \"\")\n .replace(/\\\\\\\\/g, \"\\n\")\n // Superscripts / subscripts — single token or {braced group of [\\w+-]}\n .replace(/\\^\\{([\\w+-]+)\\}/g, (_m, g: string) => toSuperscript(g))\n .replace(/\\^([0-9+\\-n])/g, (_m, g: string) => toSuperscript(g))\n .replace(/_\\{([\\w+-]+)\\}/g, (_m, g: string) => toSubscript(g))\n .replace(/_([0-9+\\-])/g, (_m, g: string) => toSubscript(g))\n // Catch-all fallbacks for any LaTeX command we didn't explicitly handle.\n // Belt-and-braces: even if the model invents a new \\weirdcommand{x}{y},\n // we'd rather show '(x)/(y)' or 'x' than a raw backslash.\n .replace(/\\\\[a-zA-Z]+\\s*\\{([^{}]+)\\}\\s*\\{([^{}]+)\\}/g, \"($1)/($2)\")\n .replace(/\\\\[a-zA-Z]+\\s*\\{([^{}]+)\\}/g, \"$1\")\n .replace(/\\\\[a-zA-Z]+/g, \"\")\n // Collapse multiple whitespace introduced by the stripping above.\n .replace(/[ \\t]{2,}/g, \" \")\n );\n}\n\n/** Split a single line into styled segments for bold / italic / inline code. */\nconst INLINE_RE = /(\\*\\*([^*\\n]+?)\\*\\*|`([^`\\n]+?)`|(?<![*\\w])\\*([^*\\n]+?)\\*(?!\\w))/g;\n\nfunction InlineMd({ text }: { text: string }) {\n const parts: React.ReactNode[] = [];\n let last = 0;\n let idx = 0;\n for (const m of text.matchAll(INLINE_RE)) {\n const start = m.index ?? 0;\n if (start > last) {\n parts.push(<Text key={`t${idx++}`}>{text.slice(last, start)}</Text>);\n }\n if (m[2] !== undefined) {\n parts.push(\n <Text key={`b${idx++}`} bold>\n {m[2]}\n </Text>,\n );\n } else if (m[3] !== undefined) {\n parts.push(\n <Text key={`c${idx++}`} color=\"yellow\">\n {m[3]}\n </Text>,\n );\n } else if (m[4] !== undefined) {\n parts.push(\n <Text key={`i${idx++}`} italic>\n {m[4]}\n </Text>,\n );\n }\n last = start + m[0].length;\n }\n if (last < text.length) {\n parts.push(<Text key={`t${idx++}`}>{text.slice(last)}</Text>);\n }\n return <Text>{parts}</Text>;\n}\n\ninterface ParagraphBlock {\n kind: \"paragraph\";\n text: string;\n}\ninterface HeadingBlock {\n kind: \"heading\";\n level: number;\n text: string;\n}\ninterface BulletBlock {\n kind: \"bullet\";\n items: string[];\n ordered: boolean;\n start: number;\n}\ninterface CodeBlock {\n kind: \"code\";\n lang: string;\n text: string;\n}\ninterface HrBlock {\n kind: \"hr\";\n}\n\ntype Block = ParagraphBlock | HeadingBlock | BulletBlock | CodeBlock | HrBlock;\n\nfunction parseBlocks(raw: string): Block[] {\n const lines = raw.split(/\\r?\\n/);\n const out: Block[] = [];\n let para: string[] = [];\n let inCode = false;\n let codeLang = \"\";\n let codeBuf: string[] = [];\n let listBuf: BulletBlock | null = null;\n\n const flushPara = () => {\n if (para.length) {\n out.push({ kind: \"paragraph\", text: para.join(\" \") });\n para = [];\n }\n };\n const flushList = () => {\n if (listBuf) {\n out.push(listBuf);\n listBuf = null;\n }\n };\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\s+$/g, \"\");\n\n const fence = line.match(/^```(\\w*)/);\n if (fence) {\n if (inCode) {\n out.push({ kind: \"code\", lang: codeLang, text: codeBuf.join(\"\\n\") });\n codeBuf = [];\n codeLang = \"\";\n inCode = false;\n } else {\n flushPara();\n flushList();\n inCode = true;\n codeLang = fence[1] ?? \"\";\n }\n continue;\n }\n if (inCode) {\n codeBuf.push(rawLine);\n continue;\n }\n\n if (line.trim() === \"\") {\n flushPara();\n flushList();\n continue;\n }\n\n if (/^[-*_]{3,}\\s*$/.test(line)) {\n flushPara();\n flushList();\n out.push({ kind: \"hr\" });\n continue;\n }\n\n const hm = line.match(/^(#{1,6})\\s+(.+)$/);\n if (hm) {\n flushPara();\n flushList();\n out.push({ kind: \"heading\", level: hm[1]!.length, text: hm[2]!.trim() });\n continue;\n }\n\n const bm = line.match(/^\\s*[-*+]\\s+(.+)$/);\n if (bm) {\n flushPara();\n if (!listBuf || listBuf.ordered) {\n flushList();\n listBuf = { kind: \"bullet\", items: [], ordered: false, start: 1 };\n }\n listBuf.items.push(bm[1]!);\n continue;\n }\n\n const om = line.match(/^\\s*(\\d+)\\.\\s+(.+)$/);\n if (om) {\n flushPara();\n if (!listBuf || !listBuf.ordered) {\n flushList();\n listBuf = { kind: \"bullet\", items: [], ordered: true, start: Number(om[1]) };\n }\n listBuf.items.push(om[2]!);\n continue;\n }\n\n flushList();\n para.push(line);\n }\n\n if (inCode && codeBuf.length) {\n out.push({ kind: \"code\", lang: codeLang, text: codeBuf.join(\"\\n\") });\n }\n flushPara();\n flushList();\n return out;\n}\n\nfunction BlockView({ block }: { block: Block }) {\n switch (block.kind) {\n case \"heading\":\n return (\n <Text bold color=\"cyan\">\n <InlineMd text={block.text} />\n </Text>\n );\n case \"paragraph\":\n return <InlineMd text={block.text} />;\n case \"bullet\":\n return (\n <Box flexDirection=\"column\">\n {block.items.map((item, i) => (\n <Box key={`${i}-${item.slice(0, 24)}`}>\n <Text color=\"cyan\">{block.ordered ? ` ${block.start + i}. ` : \" • \"}</Text>\n <InlineMd text={item} />\n </Box>\n ))}\n </Box>\n );\n case \"code\":\n return (\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text color=\"yellow\">{block.text}</Text>\n </Box>\n );\n case \"hr\":\n return <Text dimColor>{\"────────────────────────\"}</Text>;\n }\n}\n\nexport function Markdown({ text }: { text: string }) {\n const cleaned = stripMath(text);\n const blocks = React.useMemo(() => parseBlocks(cleaned), [cleaned]);\n return (\n <Box flexDirection=\"column\" gap={1}>\n {blocks.map((b, i) => (\n <BlockView key={`${i}-${b.kind}`} block={b} />\n ))}\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport React from \"react\";\n\nexport interface PromptInputProps {\n value: string;\n onChange: (v: string) => void;\n onSubmit: (v: string) => void;\n disabled?: boolean;\n placeholder?: string;\n}\n\n/**\n * Keep `<TextInput>` mounted at all times and use its `focus` prop to gate\n * input. Conditionally rendering it (mount / unmount between turns) loses\n * the stdin raw-mode claim on some terminals, which silently drops\n * keystrokes after the first turn finishes.\n */\nexport function PromptInput({\n value,\n onChange,\n onSubmit,\n disabled,\n placeholder,\n}: PromptInputProps) {\n const effectivePlaceholder = disabled\n ? (placeholder ?? \"…waiting for response…\")\n : (placeholder ?? \"type a message, or /command\");\n return (\n <Box borderStyle=\"round\" borderColor={disabled ? \"gray\" : \"cyan\"} paddingX={1}>\n <Text bold color={disabled ? \"gray\" : \"cyan\"}>\n you ›{\" \"}\n </Text>\n <TextInput\n value={value}\n onChange={onChange}\n onSubmit={onSubmit}\n focus={!disabled}\n placeholder={effectivePlaceholder}\n />\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport type { SessionSummary } from \"../../telemetry.js\";\n\nexport interface StatsPanelProps {\n summary: SessionSummary;\n model: string;\n prefixHash: string;\n harvestOn?: boolean;\n branchBudget?: number;\n}\n\nexport function StatsPanel({\n summary,\n model,\n prefixHash,\n harvestOn,\n branchBudget,\n}: StatsPanelProps) {\n const hitPct = (summary.cacheHitRatio * 100).toFixed(1);\n const hitColor =\n summary.cacheHitRatio >= 0.7 ? \"green\" : summary.cacheHitRatio >= 0.4 ? \"yellow\" : \"red\";\n const branchOn = (branchBudget ?? 1) > 1;\n return (\n <Box borderStyle=\"round\" borderColor=\"cyan\" flexDirection=\"column\" paddingX={1}>\n <Box justifyContent=\"space-between\">\n <Text>\n <Text color=\"cyan\" bold>\n Reasonix\n </Text>\n <Text dimColor> · model </Text>\n <Text color=\"yellow\">{model}</Text>\n <Text dimColor> · prefix </Text>\n <Text dimColor>{prefixHash}</Text>\n {harvestOn ? <Text color=\"magenta\"> · harvest</Text> : null}\n {branchOn ? <Text color=\"blue\"> · branch{branchBudget}</Text> : null}\n </Text>\n <Text dimColor>turns {summary.turns} · type /help</Text>\n </Box>\n <Box marginTop={1} gap={3}>\n <Text>\n <Text dimColor>cache hit </Text>\n <Text color={hitColor} bold>\n {hitPct}%\n </Text>\n </Text>\n <Text>\n <Text dimColor>cost </Text>\n <Text color=\"green\">${summary.totalCostUsd.toFixed(6)}</Text>\n </Text>\n <Text>\n <Text dimColor>vs Claude </Text>\n <Text>${summary.claudeEquivalentUsd.toFixed(6)}</Text>\n </Text>\n <Text>\n <Text dimColor>saving </Text>\n <Text color=\"green\" bold>\n {summary.savingsVsClaudePct.toFixed(1)}%\n </Text>\n </Text>\n </Box>\n </Box>\n );\n}\n","import type { CacheFirstLoop } from \"../../loop.js\";\nimport { deleteSession, listSessions } from \"../../session.js\";\n\nexport interface SlashResult {\n /** Text to display back to the user as a system/info line. */\n info?: string;\n /** Exit the app. */\n exit?: boolean;\n /** Clear the visible history. */\n clear?: boolean;\n /** Unknown command — display usage hint. */\n unknown?: boolean;\n}\n\nexport function parseSlash(text: string): { cmd: string; args: string[] } | null {\n if (!text.startsWith(\"/\")) return null;\n const parts = text.slice(1).trim().split(/\\s+/);\n const cmd = parts[0]?.toLowerCase() ?? \"\";\n if (!cmd) return null;\n return { cmd, args: parts.slice(1) };\n}\n\nexport function handleSlash(cmd: string, args: string[], loop: CacheFirstLoop): SlashResult {\n switch (cmd) {\n case \"exit\":\n case \"quit\":\n return { exit: true };\n\n case \"clear\":\n return { clear: true };\n\n case \"help\":\n case \"?\":\n return {\n info: [\n \"Commands:\",\n \" /help this message\",\n \" /status show current settings\",\n \" /preset <fast|smart|max> one-tap presets — see below\",\n \" /model <id> deepseek-chat or deepseek-reasoner\",\n \" /harvest [on|off] Pillar 2: structured plan-state extraction\",\n \" /branch <N|off> run N parallel samples (N>=2), pick most confident\",\n \" /sessions list saved sessions (current is marked with ▸)\",\n \" /forget delete the current session from disk\",\n \" /clear clear displayed history (log + session kept)\",\n \" /exit quit\",\n \"\",\n \"Presets:\",\n \" fast deepseek-chat no harvest no branch ~1¢/100turns ← default\",\n \" smart reasoner harvest ~10x cost, slower\",\n \" max reasoner harvest branch 3 ~30x cost, slowest\",\n \"\",\n \"Sessions (auto-enabled by default, named 'default'):\",\n \" reasonix chat --session <name> use a different named session\",\n \" reasonix chat --no-session disable persistence for this run\",\n ].join(\"\\n\"),\n };\n\n case \"sessions\": {\n const items = listSessions();\n if (items.length === 0) {\n return {\n info: \"no saved sessions yet — chat normally and your messages will be saved automatically\",\n };\n }\n const lines = [\"Saved sessions:\"];\n for (const s of items) {\n const sizeKb = (s.size / 1024).toFixed(1);\n const when = s.mtime.toISOString().replace(\"T\", \" \").slice(0, 16);\n const marker = s.name === loop.sessionName ? \"▸\" : \" \";\n lines.push(\n ` ${marker} ${s.name.padEnd(22)} ${String(s.messageCount).padStart(5)} msgs ${sizeKb.padStart(7)} KB ${when}`,\n );\n }\n lines.push(\"\");\n lines.push(\"Resume with: reasonix chat --session <name>\");\n return { info: lines.join(\"\\n\") };\n }\n\n case \"forget\": {\n if (!loop.sessionName) {\n return { info: \"not in a session — nothing to forget\" };\n }\n const name = loop.sessionName;\n const ok = deleteSession(name);\n return {\n info: ok\n ? `▸ deleted session \"${name}\" — current screen still shows the conversation, but next launch starts fresh`\n : `could not delete session \"${name}\" (already gone?)`,\n };\n }\n\n case \"status\": {\n const branchBudget = loop.branchOptions.budget ?? 1;\n return {\n info:\n `model=${loop.model} ` +\n `harvest=${loop.harvestEnabled ? \"on\" : \"off\"} ` +\n `branch=${branchBudget > 1 ? branchBudget : \"off\"} ` +\n `stream=${loop.stream ? \"on\" : \"off\"}`,\n };\n }\n\n case \"model\": {\n const id = args[0];\n if (!id) return { info: \"usage: /model <id> (try deepseek-chat or deepseek-reasoner)\" };\n loop.configure({ model: id });\n return { info: `model → ${id}` };\n }\n\n case \"harvest\": {\n const arg = (args[0] ?? \"\").toLowerCase();\n const on = arg === \"\" ? !loop.harvestEnabled : arg === \"on\" || arg === \"true\" || arg === \"1\";\n loop.configure({ harvest: on });\n return { info: `harvest → ${loop.harvestEnabled ? \"on\" : \"off\"}` };\n }\n\n case \"preset\": {\n const name = (args[0] ?? \"\").toLowerCase();\n if (name === \"fast\" || name === \"default\") {\n loop.configure({ model: \"deepseek-chat\", harvest: false, branch: 1 });\n return { info: \"preset → fast (deepseek-chat, no harvest, no branch)\" };\n }\n if (name === \"smart\") {\n loop.configure({ model: \"deepseek-reasoner\", harvest: true, branch: 1 });\n return { info: \"preset → smart (reasoner + harvest, ~10x cost vs fast)\" };\n }\n if (name === \"max\" || name === \"best\") {\n loop.configure({ model: \"deepseek-reasoner\", harvest: true, branch: 3 });\n return {\n info: \"preset → max (reasoner + harvest + branch3, ~30x cost vs fast, slowest)\",\n };\n }\n return { info: \"usage: /preset <fast|smart|max>\" };\n }\n\n case \"branch\": {\n const raw = (args[0] ?? \"\").toLowerCase();\n if (raw === \"\" || raw === \"off\" || raw === \"0\" || raw === \"1\") {\n loop.configure({ branch: 1 });\n return { info: \"branch → off\" };\n }\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 2) {\n return { info: \"usage: /branch <N> (N>=2, or 'off')\" };\n }\n if (n > 8) {\n return { info: \"branch budget capped at 8 to prevent runaway cost\" };\n }\n loop.configure({ branch: n });\n return { info: `branch → ${n} (harvest auto-enabled; streaming disabled)` };\n }\n\n default:\n return { unknown: true, info: `unknown command: /${cmd} (try /help)` };\n }\n}\n","import { Box, Text, useApp } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport React, { useState } from \"react\";\nimport { defaultConfigPath, isPlausibleKey, redactKey, saveApiKey } from \"../../config.js\";\n\nexport interface SetupProps {\n onReady: (apiKey: string) => void;\n}\n\nexport function Setup({ onReady }: SetupProps) {\n const [value, setValue] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const { exit } = useApp();\n\n const handleSubmit = (raw: string) => {\n const trimmed = raw.trim();\n if (trimmed === \"/exit\" || trimmed === \"/quit\") {\n exit();\n return;\n }\n if (!isPlausibleKey(trimmed)) {\n setError(\"Doesn't look like a DeepSeek key. They start with 'sk-' and are 30+ chars.\");\n setValue(\"\");\n return;\n }\n try {\n saveApiKey(trimmed);\n } catch (err) {\n setError(`Could not save key: ${(err as Error).message}`);\n return;\n }\n onReady(trimmed);\n };\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">\n Welcome to Reasonix.\n </Text>\n <Box marginTop={1}>\n <Text>Paste your DeepSeek API key to get started.</Text>\n </Box>\n <Text dimColor>Get one (free credit on signup): https://platform.deepseek.com/api_keys</Text>\n <Text dimColor>Saved locally to {defaultConfigPath()}</Text>\n <Box marginTop={1}>\n <Text bold color=\"cyan\">\n {\"key › \"}\n </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={handleSubmit}\n mask=\"•\"\n placeholder=\"sk-...\"\n />\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color=\"red\">{error}</Text>\n </Box>\n ) : value ? (\n <Box marginTop={1}>\n <Text dimColor>preview: {redactKey(value)}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dimColor>(Type /exit to abort.)</Text>\n </Box>\n </Box>\n );\n}\n","import { writeFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport { diffTranscripts, renderMarkdown, renderSummaryTable } from \"../../diff.js\";\nimport { readTranscript } from \"../../transcript.js\";\n\nexport interface DiffOptions {\n a: string;\n b: string;\n mdPath?: string;\n labelA?: string;\n labelB?: string;\n}\n\nexport function diffCommand(opts: DiffOptions): void {\n const aParsed = readTranscript(opts.a);\n const bParsed = readTranscript(opts.b);\n\n const report = diffTranscripts(\n { label: opts.labelA ?? basename(opts.a), parsed: aParsed },\n { label: opts.labelB ?? basename(opts.b), parsed: bParsed },\n );\n\n // Always print the stdout table — it's the primary consumer surface.\n console.log(renderSummaryTable(report));\n\n if (opts.mdPath) {\n const md = renderMarkdown(report);\n writeFileSync(opts.mdPath, md, \"utf8\");\n console.log(`\\nmarkdown report written to ${opts.mdPath}`);\n }\n}\n","import { replayFromFile } from \"../../replay.js\";\nimport type { TranscriptRecord } from \"../../transcript.js\";\n\nexport interface ReplayOptions {\n path: string;\n head?: number;\n tail?: number;\n}\n\n/**\n * Non-TUI transcript replay — pretty-prints the records + a summary to stdout.\n * The full Ink TUI replay ships later; this command is enough for `less` +\n * scroll workflows and is what CI / blog tooling will use.\n */\nexport function replayCommand(opts: ReplayOptions): void {\n const { parsed, stats } = replayFromFile(opts.path);\n\n // Header: meta line if present\n if (parsed.meta) {\n const m = parsed.meta;\n const bits: string[] = [`source=${m.source}`];\n if (m.model) bits.push(`model=${m.model}`);\n if (m.task) bits.push(`task=${m.task}`);\n if (m.mode) bits.push(`mode=${m.mode}`);\n if (m.repeat !== undefined) bits.push(`repeat=${m.repeat}`);\n bits.push(`started=${m.startedAt}`);\n console.log(`[meta] ${bits.join(\" \")}`);\n console.log(\"\");\n }\n\n const records = sliceRecords(parsed.records, opts);\n for (const rec of records) {\n renderRecord(rec);\n }\n\n console.log(\"\");\n console.log(\"── summary ─────────────────────────────────────────\");\n console.log(`model calls: ${stats.turns}`);\n console.log(`user turns: ${stats.userTurns}`);\n console.log(`tool calls: ${stats.toolCalls}`);\n console.log(`cache hit: ${(stats.cacheHitRatio * 100).toFixed(1)}%`);\n console.log(`cost: $${stats.totalCostUsd.toFixed(6)}`);\n console.log(`claude equivalent: $${stats.claudeEquivalentUsd.toFixed(6)}`);\n console.log(`savings vs claude: ${stats.savingsVsClaudePct.toFixed(1)}%`);\n console.log(`models: ${stats.models.join(\", \") || \"—\"}`);\n console.log(`prefix hashes: ${stats.prefixHashes.length} distinct`);\n if (stats.prefixHashes.length === 1) {\n console.log(` (byte-stable prefix: ${stats.prefixHashes[0]?.slice(0, 16)}…)`);\n } else if (stats.prefixHashes.length > 1) {\n console.log(\" (prefix churned — cache-hostile session)\");\n }\n}\n\nfunction sliceRecords(records: TranscriptRecord[], opts: ReplayOptions): TranscriptRecord[] {\n if (opts.head !== undefined && opts.head > 0) return records.slice(0, opts.head);\n if (opts.tail !== undefined && opts.tail > 0) return records.slice(-opts.tail);\n return records;\n}\n\nfunction renderRecord(rec: TranscriptRecord): void {\n const turn = `[t${rec.turn}]`;\n if (rec.role === \"user\") {\n console.log(`${turn} USER: ${oneLine(rec.content)}`);\n } else if (rec.role === \"assistant_final\") {\n const cost = rec.cost !== undefined ? ` $${rec.cost.toFixed(6)}` : \"\";\n const cache =\n rec.usage &&\n (rec.usage.prompt_cache_hit_tokens !== undefined ||\n rec.usage.prompt_cache_miss_tokens !== undefined)\n ? (() => {\n const hit = rec.usage!.prompt_cache_hit_tokens ?? 0;\n const miss = rec.usage!.prompt_cache_miss_tokens ?? 0;\n const total = hit + miss;\n return total > 0 ? ` cache=${((hit / total) * 100).toFixed(1)}%` : \"\";\n })()\n : \"\";\n console.log(`${turn} AGENT:${cost}${cache} ${oneLine(rec.content)}`);\n } else if (rec.role === \"tool\") {\n const args = rec.args ? ` args=${oneLine(rec.args, 80)}` : \"\";\n console.log(`${turn} TOOL ${rec.tool ?? \"?\"}:${args} → ${oneLine(rec.content, 120)}`);\n } else if (rec.role === \"error\") {\n console.log(`${turn} ERROR: ${rec.error ?? rec.content}`);\n } else if (rec.role === \"done\") {\n // Suppress — visually noisy, not informative in replay.\n } else {\n console.log(`${turn} ${rec.role}: ${oneLine(rec.content)}`);\n }\n}\n\nfunction oneLine(s: string, max = 200): string {\n const collapsed = s.replace(/\\s+/g, \" \").trim();\n return collapsed.length > max ? `${collapsed.slice(0, max)}…` : collapsed;\n}\n","import { stdin, stdout } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { defaultConfigPath, isPlausibleKey, loadApiKey, saveApiKey } from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\n\nexport interface RunOptions {\n task: string;\n model: string;\n system: string;\n}\n\nasync function ensureApiKey(): Promise<string> {\n const existing = loadApiKey();\n if (existing) return existing;\n\n if (!stdin.isTTY) {\n process.stderr.write(\n \"DEEPSEEK_API_KEY is not set and stdin is not a TTY (cannot prompt).\\n\" +\n \"Set the env var, or run `reasonix chat` once interactively to save a key.\\n\",\n );\n process.exit(1);\n }\n\n process.stdout.write(\n \"DeepSeek API key not configured.\\nGet one at https://platform.deepseek.com/api_keys\\n\",\n );\n const rl = createInterface({ input: stdin, output: stdout });\n try {\n while (true) {\n const answer = (await rl.question(\"API key › \")).trim();\n if (!answer) continue;\n if (!isPlausibleKey(answer)) {\n process.stdout.write(\"Invalid format. Keys start with 'sk-' and are 30+ chars.\\n\");\n continue;\n }\n saveApiKey(answer);\n process.stdout.write(`Saved to ${defaultConfigPath()}\\n\\n`);\n return answer;\n }\n } finally {\n rl.close();\n }\n}\n\nexport async function runCommand(opts: RunOptions): Promise<void> {\n loadDotenv();\n const apiKey = await ensureApiKey();\n process.env.DEEPSEEK_API_KEY = apiKey;\n\n const client = new DeepSeekClient();\n const prefix = new ImmutablePrefix({ system: opts.system });\n const loop = new CacheFirstLoop({ client, prefix, model: opts.model });\n\n for await (const ev of loop.step(opts.task)) {\n if (ev.role === \"assistant_delta\" && ev.content) process.stdout.write(ev.content);\n if (ev.role === \"tool\") process.stdout.write(`\\n[tool ${ev.toolName}] ${ev.content}\\n`);\n if (ev.role === \"error\") process.stderr.write(`\\n[error] ${ev.error}\\n`);\n if (ev.role === \"done\") process.stdout.write(\"\\n\");\n }\n const s = loop.stats.summary();\n process.stdout.write(\n `\\n— turns:${s.turns} cache:${(s.cacheHitRatio * 100).toFixed(1)}% ` +\n `cost:$${s.totalCostUsd.toFixed(6)} save-vs-claude:${s.savingsVsClaudePct.toFixed(1)}%\\n`,\n );\n}\n","import { existsSync, readFileSync } from \"node:fs\";\n\nexport interface StatsOptions {\n transcript: string;\n}\n\nexport function statsCommand(opts: StatsOptions): void {\n if (!existsSync(opts.transcript)) {\n console.error(`no such transcript: ${opts.transcript}`);\n process.exit(1);\n }\n const lines = readFileSync(opts.transcript, \"utf8\").split(/\\r?\\n/).filter(Boolean);\n let assistantTurns = 0;\n let toolCalls = 0;\n let lastTurn = 0;\n for (const line of lines) {\n try {\n const rec = JSON.parse(line);\n if (rec.role === \"assistant_final\") assistantTurns++;\n if (rec.role === \"tool\") toolCalls++;\n if (typeof rec.turn === \"number\") lastTurn = Math.max(lastTurn, rec.turn);\n } catch {\n /* skip */\n }\n }\n console.log(`transcript: ${opts.transcript}`);\n console.log(`assistant turns: ${assistantTurns}`);\n console.log(`tool invocations: ${toolCalls}`);\n console.log(`last turn index: ${lastTurn}`);\n}\n","import { VERSION } from \"../../index.js\";\n\nexport function versionCommand(): void {\n console.log(`reasonix ${VERSION}`);\n}\n"],"mappings":"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","names":["resolve","signature","resolve","readFileSync","readFileSync","round","p","chmodSync","mkdirSync","readFileSync","homedir","dirname","join","React","useState","Box","Text","React","useEffect","useState","Box","Text","React","React","EventRow","Box","Text","truncate","pct","Box","Text","React","Box","Text","React","harvest","useState","useEffect","React","Box","Text","Box","Text","useApp","TextInput","React","useState","useState","useApp","React","Box","Text","TextInput","useState","React","writeFileSync","writeFileSync","existsSync","readFileSync"]}