reasonix 0.33.0 → 0.33.2

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.
Files changed (31) hide show
  1. package/dist/cli/{chat-EIFLHBZ6.js → chat-ZMSAXE77.js} +6 -5
  2. package/dist/cli/{chunk-Q5GRLZJF.js → chunk-63KAV5DX.js} +8 -1
  3. package/dist/cli/{chunk-Q5GRLZJF.js.map → chunk-63KAV5DX.js.map} +1 -1
  4. package/dist/cli/chunk-DAEAAVDF.js +199 -0
  5. package/dist/cli/chunk-DAEAAVDF.js.map +1 -0
  6. package/dist/cli/{chunk-Q6YFXW7H.js → chunk-G7M3QWEN.js} +27 -213
  7. package/dist/cli/chunk-G7M3QWEN.js.map +1 -0
  8. package/dist/cli/{chunk-LVQX5KGF.js → chunk-OW7IHE6M.js} +45 -18
  9. package/dist/cli/chunk-OW7IHE6M.js.map +1 -0
  10. package/dist/cli/{chunk-D5DKXIP5.js → chunk-WVJL7ZO2.js} +15 -24
  11. package/dist/cli/chunk-WVJL7ZO2.js.map +1 -0
  12. package/dist/cli/{code-F4KJOE3K.js → code-R4TXQQEE.js} +6 -5
  13. package/dist/cli/{code-F4KJOE3K.js.map → code-R4TXQQEE.js.map} +1 -1
  14. package/dist/cli/{doctor-3TGB2NZN.js → doctor-V5HLCMSQ.js} +3 -2
  15. package/dist/cli/index.js +10 -9
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/{replay-TMJASRC4.js → replay-Q43DSMG6.js} +2 -2
  18. package/dist/cli/{run-JMEOTQCG.js → run-HK3FP266.js} +3 -2
  19. package/dist/cli/{run-JMEOTQCG.js.map → run-HK3FP266.js.map} +1 -1
  20. package/dist/cli/{sessions-MOJAALJI.js → sessions-3XU2GGHX.js} +3 -2
  21. package/dist/cli/{sessions-MOJAALJI.js.map → sessions-3XU2GGHX.js.map} +1 -1
  22. package/dist/cli/{version-3MYFE4G6.js → version-5SGI2SEE.js} +3 -2
  23. package/dist/cli/{version-3MYFE4G6.js.map → version-5SGI2SEE.js.map} +1 -1
  24. package/dist/index.js.map +1 -1
  25. package/package.json +1 -1
  26. package/dist/cli/chunk-D5DKXIP5.js.map +0 -1
  27. package/dist/cli/chunk-LVQX5KGF.js.map +0 -1
  28. package/dist/cli/chunk-Q6YFXW7H.js.map +0 -1
  29. /package/dist/cli/{chat-EIFLHBZ6.js.map → chat-ZMSAXE77.js.map} +0 -0
  30. /package/dist/cli/{doctor-3TGB2NZN.js.map → doctor-V5HLCMSQ.js.map} +0 -0
  31. /package/dist/cli/{replay-TMJASRC4.js.map → replay-Q43DSMG6.js.map} +0 -0
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ resolveDataPath
4
+ } from "./chunk-DAEAAVDF.js";
2
5
  import {
3
6
  DeepSeekClient
4
7
  } from "./chunk-KMWKGPFZ.js";
@@ -27,7 +30,7 @@ import {
27
30
  // src/cli/commands/doctor.ts
28
31
  import { existsSync, readFileSync, statSync } from "fs";
29
32
  import { homedir } from "os";
30
- import { dirname, join, resolve } from "path";
33
+ import { join, resolve } from "path";
31
34
  async function runDoctorChecks(projectRoot) {
32
35
  return Promise.all([
33
36
  checkApiKey(),
@@ -161,28 +164,16 @@ async function checkApiReach() {
161
164
  }
162
165
  }
163
166
  async function checkTokenizer() {
164
- const candidates = [
165
- join(
166
- dirname(new URL(import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, "$1")),
167
- "..",
168
- "..",
169
- "..",
170
- "data",
171
- "deepseek-tokenizer.json.gz"
172
- ),
173
- join(process.cwd(), "data", "deepseek-tokenizer.json.gz")
174
- ];
175
- for (const p of candidates) {
176
- if (existsSync(p)) {
177
- try {
178
- const stat = statSync(p);
179
- return {
180
- label: "tokenizer ",
181
- level: "ok",
182
- detail: `${p} (${fmtBytes(stat.size)})`
183
- };
184
- } catch {
185
- }
167
+ const path = resolveDataPath();
168
+ if (existsSync(path)) {
169
+ try {
170
+ const stat = statSync(path);
171
+ return {
172
+ label: "tokenizer ",
173
+ level: "ok",
174
+ detail: `${path} (${fmtBytes(stat.size)})`
175
+ };
176
+ } catch {
186
177
  }
187
178
  }
188
179
  return {
@@ -365,4 +356,4 @@ export {
365
356
  runDoctorChecks,
366
357
  doctorCommand
367
358
  };
368
- //# sourceMappingURL=chunk-D5DKXIP5.js.map
359
+ //# sourceMappingURL=chunk-WVJL7ZO2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/doctor.ts"],"sourcesContent":["/** Plain-text (not Ink) — must work when everything else is broken. fail → exit 1; warn → exit 0. */\n\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { DeepSeekClient } from \"../../client.js\";\nimport { defaultConfigPath, readConfig, resolveSemanticEmbeddingConfig } from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { loadHooks } from \"../../hooks.js\";\nimport { indexExists } from \"../../index/semantic/builder.js\";\nimport { checkOllamaStatus } from \"../../index/semantic/ollama-launcher.js\";\nimport { listSessions } from \"../../memory/session.js\";\nimport { resolveDataPath } from \"../../tokenizer.js\";\nimport { VERSION } from \"../../version.js\";\n\nexport type DoctorLevel = \"ok\" | \"warn\" | \"fail\";\n\nexport interface DoctorCheck {\n label: string;\n level: DoctorLevel;\n detail: string;\n}\n\ntype Level = DoctorLevel;\ntype Check = DoctorCheck;\n\nexport async function runDoctorChecks(projectRoot: string): Promise<DoctorCheck[]> {\n return Promise.all([\n checkApiKey(),\n checkConfig(),\n checkApiReach(),\n checkTokenizer(),\n checkSessions(),\n checkHooks(projectRoot),\n checkOllama(projectRoot),\n checkProject(projectRoot),\n ]);\n}\n\nconst TTY = process.stdout.isTTY && process.env.TERM !== \"dumb\";\n\nfunction color(text: string, code: string): string {\n if (!TTY) return text;\n return `\\x1b[${code}m${text}\\x1b[0m`;\n}\n\nfunction badge(level: Level): string {\n if (level === \"ok\") return color(\"✓\", \"32\");\n if (level === \"warn\") return color(\"⚠\", \"33\");\n return color(\"✗\", \"31\");\n}\n\nfunction tail4(s: string): string {\n return s.length <= 4 ? s : `…${s.slice(-4)}`;\n}\n\nfunction fmtBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / 1024 / 1024).toFixed(1)} MB`;\n}\n\nasync function checkApiKey(): Promise<Check> {\n const fromEnv = process.env.DEEPSEEK_API_KEY;\n if (fromEnv) {\n return {\n label: \"api key \",\n level: \"ok\",\n detail: `set via env DEEPSEEK_API_KEY (${tail4(fromEnv)})`,\n };\n }\n try {\n const cfg = readConfig();\n if (cfg.apiKey) {\n return {\n label: \"api key \",\n level: \"ok\",\n detail: `from ${defaultConfigPath()} (${tail4(cfg.apiKey)})`,\n };\n }\n } catch {\n /* fall through */\n }\n return {\n label: \"api key \",\n level: \"fail\",\n detail:\n \"not set — `reasonix setup` to save one, or export DEEPSEEK_API_KEY. Get a key at https://platform.deepseek.com/api_keys\",\n };\n}\n\nasync function checkConfig(): Promise<Check> {\n const path = defaultConfigPath();\n if (!existsSync(path)) {\n return {\n label: \"config \",\n level: \"warn\",\n detail: \"missing — running with library defaults. `reasonix setup` writes one.\",\n };\n }\n try {\n const cfg = readConfig(path);\n const parts: string[] = [];\n if (cfg.preset) parts.push(`preset=${cfg.preset}`);\n if (cfg.editMode) parts.push(`editMode=${cfg.editMode}`);\n if (cfg.mcp && cfg.mcp.length > 0) parts.push(`mcp=${cfg.mcp.length}`);\n return {\n label: \"config \",\n level: \"ok\",\n detail: `${path}${parts.length ? ` (${parts.join(\", \")})` : \"\"}`,\n };\n } catch (err) {\n return {\n label: \"config \",\n level: \"fail\",\n detail: `${path} unreadable — ${(err as Error).message}`,\n };\n }\n}\n\nasync function checkApiReach(): Promise<Check> {\n const key = process.env.DEEPSEEK_API_KEY ?? readConfig().apiKey;\n if (!key) {\n return {\n label: \"api reach \",\n level: \"warn\",\n detail: \"skipped — no api key to test with\",\n };\n }\n try {\n const client = new DeepSeekClient({ apiKey: key });\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), 8_000);\n let balance: Awaited<ReturnType<DeepSeekClient[\"getBalance\"]>>;\n try {\n balance = await client.getBalance({ signal: ctl.signal });\n } finally {\n clearTimeout(timer);\n }\n if (!balance) {\n return {\n label: \"api reach \",\n level: \"fail\",\n detail: \"/user/balance returned null — auth failed or network blocked\",\n };\n }\n if (!balance.is_available) {\n const info = balance.balance_infos[0];\n return {\n label: \"api reach \",\n level: \"warn\",\n detail: `account flagged not-available${info ? ` (${info.total_balance} ${info.currency})` : \"\"} — top up or check your dashboard`,\n };\n }\n const info = balance.balance_infos[0];\n return {\n label: \"api reach \",\n level: \"ok\",\n detail: info\n ? `/user/balance ok — ${info.total_balance} ${info.currency}`\n : \"/user/balance ok\",\n };\n } catch (err) {\n return {\n label: \"api reach \",\n level: \"fail\",\n detail: `${(err as Error).message}`,\n };\n }\n}\n\nasync function checkTokenizer(): Promise<Check> {\n // Reuse the runtime's resolver so the doctor never disagrees with what\n // the tokenizer actually loads — three candidates including a global\n // npm install probe via createRequire.\n const path = resolveDataPath();\n if (existsSync(path)) {\n try {\n const stat = statSync(path);\n return {\n label: \"tokenizer \",\n level: \"ok\",\n detail: `${path} (${fmtBytes(stat.size)})`,\n };\n } catch {\n /* fall through to warn */\n }\n }\n return {\n label: \"tokenizer \",\n level: \"warn\",\n detail:\n \"data/deepseek-tokenizer.json.gz not found — token counts will fall back to char heuristics\",\n };\n}\n\nasync function checkSessions(): Promise<Check> {\n try {\n const list = listSessions();\n if (list.length === 0) {\n return {\n label: \"sessions \",\n level: \"ok\",\n detail: \"0 saved\",\n };\n }\n const totalBytes = list.reduce((s, e) => s + e.size, 0);\n const oldest = list[list.length - 1]!;\n const ageDays = Math.floor((Date.now() - oldest.mtime.getTime()) / (24 * 60 * 60 * 1000));\n const stale = list.filter(\n (e) => Date.now() - e.mtime.getTime() >= 90 * 24 * 60 * 60 * 1000,\n ).length;\n const detail = `${list.length} saved · ${fmtBytes(totalBytes)} · oldest ${ageDays}d`;\n if (stale > 0) {\n return {\n label: \"sessions \",\n level: \"warn\",\n detail: `${detail} · ${stale} idle ≥90d (run \\`reasonix prune-sessions\\`)`,\n };\n }\n return { label: \"sessions \", level: \"ok\", detail };\n } catch (err) {\n return {\n label: \"sessions \",\n level: \"warn\",\n detail: `cannot list — ${(err as Error).message}`,\n };\n }\n}\n\nasync function checkHooks(projectRoot: string): Promise<Check> {\n try {\n const all = loadHooks({ projectRoot });\n const global = all.filter((h) => h.scope === \"global\").length;\n const project = all.filter((h) => h.scope === \"project\").length;\n return {\n label: \"hooks \",\n level: \"ok\",\n detail: `${global} global, ${project} project`,\n };\n } catch (err) {\n return {\n label: \"hooks \",\n level: \"warn\",\n detail: `couldn't parse settings.json — ${(err as Error).message}`,\n };\n }\n}\n\nasync function checkOllama(projectRoot: string): Promise<Check> {\n let exists = false;\n try {\n exists = await indexExists(projectRoot);\n } catch {\n /* treat as no index */\n }\n if (!exists) {\n return {\n label: \"semantic \",\n level: \"ok\",\n detail: \"not in use (no semantic index built; `reasonix index` to enable)\",\n };\n }\n const meta = readSemanticMeta(projectRoot);\n if (meta?.provider === \"openai-compat\") {\n const resolved = resolveSemanticEmbeddingConfig();\n if (resolved.provider !== \"openai-compat\") {\n return {\n label: \"semantic \",\n level: \"warn\",\n detail: `index uses openai-compat/${meta.model} but current config resolves to ${resolved.provider}/${resolved.model} — rebuild before searching`,\n };\n }\n return {\n label: \"semantic \",\n level: \"ok\",\n detail: `openai-compat · ${resolved.baseUrl} · model ${resolved.model} · api key configured`,\n };\n }\n try {\n const model = meta?.model || process.env.REASONIX_EMBED_MODEL || \"nomic-embed-text\";\n const status = await checkOllamaStatus(model);\n if (!status.binaryFound) {\n return {\n label: \"semantic \",\n level: \"warn\",\n detail:\n \"ollama binary not on PATH — semantic_search will fail; install from https://ollama.com\",\n };\n }\n if (!status.daemonRunning) {\n return {\n label: \"semantic \",\n level: \"warn\",\n detail:\n \"ollama daemon not running — `ollama serve` (or call /semantic in TUI to auto-start)\",\n };\n }\n if (!status.modelPulled) {\n return {\n label: \"semantic \",\n level: \"warn\",\n detail: `model ${status.modelName} not pulled — \\`ollama pull ${status.modelName}\\``,\n };\n }\n return {\n label: \"semantic \",\n level: \"ok\",\n detail: `ollama daemon up · model ${status.modelName} ready`,\n };\n } catch (err) {\n return {\n label: \"semantic \",\n level: \"warn\",\n detail: `probe failed — ${(err as Error).message}`,\n };\n }\n}\n\nfunction readSemanticMeta(\n projectRoot: string,\n): { provider: \"ollama\" | \"openai-compat\"; model: string } | null {\n try {\n const raw = readFileSync(join(projectRoot, \".reasonix\", \"semantic\", \"index.meta.json\"), \"utf8\");\n const parsed = JSON.parse(raw) as { provider?: string; model?: string };\n return {\n provider: parsed.provider === \"openai-compat\" ? \"openai-compat\" : \"ollama\",\n model: typeof parsed.model === \"string\" ? parsed.model : \"\",\n };\n } catch {\n return null;\n }\n}\n\nasync function checkProject(projectRoot: string): Promise<Check> {\n // Heuristic: a \"real\" project has either .git, REASONIX.md, or\n // package.json. Lacking all three, `reasonix code` still works but\n // @-mentions and the project-memory pin won't surface much.\n const markers = [\".git\", \"REASONIX.md\", \"package.json\", \"pyproject.toml\", \"Cargo.toml\", \"go.mod\"];\n const found = markers.filter((m) => existsSync(join(projectRoot, m)));\n if (found.length === 0) {\n return {\n label: \"project \",\n level: \"warn\",\n detail: `${projectRoot} has none of: ${markers.slice(0, 3).join(\", \")} … — \\`reasonix code\\` will still run, but @-mentions and project memory have nothing to anchor`,\n };\n }\n return {\n label: \"project \",\n level: \"ok\",\n detail: `${projectRoot} (${found.join(\", \")})`,\n };\n}\n\nexport async function doctorCommand(): Promise<void> {\n loadDotenv();\n\n const projectRoot = resolve(process.cwd());\n console.log(`${color(`reasonix ${VERSION} · doctor`, \"1\")} (cwd: ${projectRoot})`);\n console.log(` home: ${homedir()}`);\n console.log(\"\");\n\n // Run independent checks in parallel — saves ~5s when api-reach has\n // to time out. Each handler swallows its own throws into a `fail`\n // result so a thrown promise can't kill the whole report.\n const checks = await runDoctorChecks(projectRoot);\n\n for (const c of checks) {\n console.log(` ${badge(c.level)} ${c.label} ${c.detail}`);\n }\n\n const ok = checks.filter((c) => c.level === \"ok\").length;\n const warn = checks.filter((c) => c.level === \"warn\").length;\n const fail = checks.filter((c) => c.level === \"fail\").length;\n console.log(\"\");\n const summary = `${ok} ok · ${warn} warn · ${fail} fail`;\n if (fail > 0) {\n console.log(color(summary, \"31\"));\n process.exit(1);\n } else if (warn > 0) {\n console.log(color(summary, \"33\"));\n } else {\n console.log(color(summary, \"32\"));\n }\n}\n"],"mappings":"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","names":["info"]}
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-J5VLP23S.js";
5
5
  import {
6
6
  chatCommand
7
- } from "./chunk-LVQX5KGF.js";
7
+ } from "./chunk-OW7IHE6M.js";
8
8
  import "./chunk-BQNUJJN7.js";
9
9
  import "./chunk-RFX7TYVV.js";
10
- import "./chunk-Q5GRLZJF.js";
10
+ import "./chunk-63KAV5DX.js";
11
11
  import {
12
12
  markPhase
13
13
  } from "./chunk-CPOV2O73.js";
@@ -18,7 +18,7 @@ import {
18
18
  registerMemoryTools,
19
19
  registerPlanTool,
20
20
  registerTodoTool
21
- } from "./chunk-Q6YFXW7H.js";
21
+ } from "./chunk-G7M3QWEN.js";
22
22
  import "./chunk-I6YIAK6C.js";
23
23
  import "./chunk-XJLZ4HKU.js";
24
24
  import "./chunk-XHQIK7B6.js";
@@ -26,7 +26,8 @@ import "./chunk-6TMHAK5D.js";
26
26
  import "./chunk-SDE5U32Z.js";
27
27
  import "./chunk-ZPTSJGX5.js";
28
28
  import "./chunk-MHDNZXJJ.js";
29
- import "./chunk-D5DKXIP5.js";
29
+ import "./chunk-WVJL7ZO2.js";
30
+ import "./chunk-DAEAAVDF.js";
30
31
  import "./chunk-KMWKGPFZ.js";
31
32
  import "./chunk-3Q3C4W66.js";
32
33
  import "./chunk-4DCHFFEY.js";
@@ -148,4 +149,4 @@ async function codeCommand(opts = {}) {
148
149
  export {
149
150
  codeCommand
150
151
  };
151
- //# sourceMappingURL=code-F4KJOE3K.js.map
152
+ //# sourceMappingURL=code-R4TXQQEE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/code.tsx"],"sourcesContent":["/**\n * `reasonix code [dir]` — opinionated wrapper around `reasonix chat` for\n * code-editing workflows.\n *\n * What it does differently from plain chat:\n * - Registers native filesystem tools rooted at the given directory\n * (CWD by default). No subprocess, no `npx install` step, R1-\n * friendly schemas. Replaced the old `@modelcontextprotocol/server-filesystem`\n * subprocess in 0.4.9 because its `edit_file` argv shape was the\n * biggest driver of R1 DSML hallucinations.\n * - Uses a coding-focused system prompt (src/code/prompt.ts) that\n * teaches the model to propose edits as SEARCH/REPLACE blocks.\n * - Defaults to the `smart` preset (reasoner + harvest) because\n * coding tasks pay back R1 thinking.\n * - Scopes its session to the directory so projects don't share\n * conversation history.\n * - Hooks `codeMode` into the TUI so assistant replies get parsed\n * for SEARCH/REPLACE blocks and applied on disk after each turn.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { basename, resolve } from \"node:path\";\nimport { loadEditMode, loadProjectShellAllowed, readConfig } from \"../../config.js\";\nimport { bootstrapSemanticSearchInCodeMode } from \"../../index/semantic/tool.js\";\nimport { sanitizeName } from \"../../memory/session.js\";\nimport { ToolRegistry } from \"../../tools.js\";\nimport { registerChoiceTool } from \"../../tools/choice.js\";\nimport { registerFilesystemTools } from \"../../tools/filesystem.js\";\nimport { JobRegistry } from \"../../tools/jobs.js\";\nimport { registerMemoryTools } from \"../../tools/memory.js\";\nimport { registerPlanTool } from \"../../tools/plan.js\";\nimport { registerShellTools } from \"../../tools/shell.js\";\nimport { registerTodoTool } from \"../../tools/todo.js\";\nimport { markPhase } from \"../startup-profile.js\";\nimport { chatCommand } from \"./chat.js\";\n\nexport interface CodeOptions {\n /** Directory to root the filesystem tools at. Defaults to process.cwd(). */\n dir?: string;\n /** Override the default `smart` model. */\n model?: string;\n /** Disable session persistence. */\n noSession?: boolean;\n /** Transcript file for replay/diff. */\n transcript?: string;\n /** Skip the session picker — always resume prior messages. */\n forceResume?: boolean;\n /** Skip the session picker — always wipe prior messages and start fresh. */\n forceNew?: boolean;\n /**\n * Soft USD spend cap. Off by default. Same semantics as `chat`:\n * warns at 80%, refuses next turn at 100%. Mid-session adjustable\n * via `/budget <usd>` slash command.\n */\n budgetUsd?: number;\n /** Suppress the auto-launched embedded web dashboard. */\n noDashboard?: boolean;\n /** Inline string appended to the code system prompt after the generated base prompt. */\n systemAppend?: string;\n /** Path to a UTF-8 text file whose contents are appended to the code system prompt. */\n systemAppendFile?: string;\n /** Default true. Pass false (CLI: `--no-alt-screen`) to keep chat output in shell scrollback. */\n altScreen?: boolean;\n}\n\nexport async function codeCommand(opts: CodeOptions = {}): Promise<void> {\n markPhase(\"code_command_enter\");\n const { codeSystemPrompt } = await import(\"../../code/prompt.js\");\n const rootDir = resolve(opts.dir ?? process.cwd());\n // Per-directory session so switching projects doesn't mix histories.\n // `code-<sanitized-basename>` fits the session name rules without\n // truncating most project names.\n const session = opts.noSession ? undefined : `code-${sanitizeName(basename(rootDir))}`;\n\n // Native filesystem tools. No subprocess, ~50-200 ms faster per call\n // than the MCP server was, and `edit_file` takes a flat SEARCH/REPLACE\n // shape instead of the `string=\"false\"` JSON-in-string array that\n // triggered R1's DSML hallucinations all through 0.4.x.\n const tools = new ToolRegistry();\n // Background-process registry shared between the shell tools and the\n // TUI's /jobs + /kill slashes + exit cleanup. One per `reasonix code`\n // run — orphan prevention on SIGINT / process exit kills everything\n // it owns, so dev servers don't outlive the Reasonix process.\n const jobs = new JobRegistry();\n // Bundled re-registration so `/cwd <path>` can swap every rootDir-\n // dependent tool atomically. ToolRegistry.register is keyed by name\n // and overwrites in-place, so re-calling these against the existing\n // registry replaces the closures cleanly without disturbing tool\n // specs (names/descriptions/params don't reference rootDir, so the\n // prefix cache survives).\n const registerRootedTools = (root: string): void => {\n registerFilesystemTools(tools, { rootDir: root });\n registerShellTools(tools, {\n rootDir: root,\n // Per-project \"always allow\" list persisted from prior ShellConfirm\n // choices; merged on top of the built-in allowlist in shell.ts.\n // GETTER form — re-read every dispatch so a prefix the user adds\n // via ShellConfirm mid-session takes effect on the next shell call\n // instead of waiting for `/new` or a relaunch.\n extraAllowed: () => loadProjectShellAllowed(root),\n // `yolo` edit-mode disables shell confirmations entirely. Re-read\n // from config on each dispatch so /mode yolo (or Shift+Tab cycling\n // through to it) flips the gate live without forcing a relaunch.\n allowAll: () => loadEditMode() === \"yolo\",\n jobs,\n });\n // `remember` / `forget` / `recall_memory` — cross-session user memory.\n // Project scope hashes off rootDir so switching projects gets a fresh\n // per-project memory store; the global scope is shared across runs.\n registerMemoryTools(tools, { projectRoot: root });\n };\n // Async tail to `registerRootedTools`. Kept separate because the FS /\n // shell / memory re-registration above is sync and must happen before\n // the next tool dispatch, while semantic-index probing reads disk and\n // can race ahead in the background. On `/cwd`, App.tsx fires this\n // after the sync swap and surfaces the result via postInfo.\n const reBootstrapSemantic = async (root: string): Promise<{ enabled: boolean }> => {\n const result = await bootstrapSemanticSearchInCodeMode(tools, root);\n if (!result.enabled) tools.unregister(\"semantic_search\");\n return result;\n };\n registerRootedTools(rootDir);\n // `submit_plan` is always in the spec list so the prefix cache stays\n // stable across plan-mode toggles (Pillar 1). The tool itself is a\n // no-op outside plan mode and throws `PlanProposedError` when the\n // user has `/plan`-enabled the session.\n registerPlanTool(tools);\n // `ask_choice` — branching primitive. Independent of plan mode: the\n // model uses it to put a 2–4 way choice in front of the user\n // (strategy, style, library pick) without trying to squeeze the\n // menu into a submit_plan body. Keeping it always-registered\n // preserves the prefix cache across plan-mode toggles.\n registerChoiceTool(tools);\n // `todo_write` — lightweight in-session task tracker, no approval gate.\n // Independent of plan mode (readOnly=true so it stays callable in /plan).\n registerTodoTool(tools);\n // `run_skill` is intentionally NOT registered here — App.tsx wires it\n // up with the subagent runner attached, so `runAs: subagent` skills\n // can spawn isolated child loops. Doing it here would mean the App's\n // re-registration would shadow the no-runner version, which works\n // (last write wins) but obscures the wiring.\n\n // Bootstrap semantic_search. Silent: registers the tool when an\n // on-disk index already exists, skips entirely otherwise. Setup\n // happens via the explicit `reasonix index` command — never\n // by surprise on launch.\n markPhase(\"semantic_bootstrap_start\");\n const semantic = await reBootstrapSemantic(rootDir);\n markPhase(\n semantic.enabled ? \"semantic_bootstrap_done_enabled\" : \"semantic_bootstrap_done_skipped\",\n );\n\n process.stderr.write(\n `▸ reasonix code: rooted at ${rootDir}, session \"${session ?? \"(ephemeral)\"}\" · ${tools.size} native tool(s)${\n semantic.enabled ? \" · semantic_search on\" : \"\"\n }\\n`,\n );\n\n // Belt-and-suspenders cleanup: even though spawn(detached:false)\n // should tie child processes to the parent's lifetime, Windows cmd.exe\n // wrappers occasionally leak. We DON'T install SIGINT/SIGTERM\n // handlers here — that overrode Node's default \"exit on Ctrl+C\" with\n // a silent no-op, which made Ctrl+C feel broken in the TUI. App.tsx\n // owns the SIGINT path now (it shows the quit-armed banner and calls\n // exit() on confirmation); this 'exit' hook just guarantees the job\n // registry is drained on the way out, regardless of which exit path\n // fired.\n process.once(\"exit\", () => {\n void jobs.shutdown();\n });\n\n let systemAppendFileContents: string | undefined;\n if (opts.systemAppend !== undefined && opts.systemAppend.trim().length === 0) {\n process.stderr.write(\"--system-append is empty — no prompt text will be appended\\n\");\n }\n if (opts.systemAppendFile) {\n const filePath = resolve(opts.systemAppendFile);\n try {\n systemAppendFileContents = readFileSync(filePath, \"utf8\");\n } catch (err) {\n const e = err as NodeJS.ErrnoException;\n process.stderr.write(\n `Error: cannot read --system-append-file \"${filePath}\": ${e.code ? `[${e.code}] ` : \"\"}${e.message}\\n`,\n );\n process.exit(1);\n }\n }\n\n await chatCommand({\n model: opts.model ?? \"deepseek-v4-flash\",\n budgetUsd: opts.budgetUsd,\n system: codeSystemPrompt(rootDir, {\n hasSemanticSearch: semantic.enabled,\n systemAppend: opts.systemAppend,\n systemAppendFile: systemAppendFileContents,\n }),\n transcript: opts.transcript,\n session,\n seedTools: tools,\n codeMode: {\n rootDir,\n jobs,\n reregisterTools: registerRootedTools,\n reBootstrapSemantic,\n },\n mcp: readConfig().mcp,\n forceResume: opts.forceResume,\n forceNew: opts.forceNew,\n noDashboard: opts.noDashboard,\n altScreen: opts.altScreen,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,SAAS,oBAAoB;AAC7B,SAAS,UAAU,eAAe;AA4ClC,eAAsB,YAAY,OAAoB,CAAC,GAAkB;AACvE,YAAU,oBAAoB;AAC9B,QAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,sBAAsB;AAChE,QAAM,UAAU,QAAQ,KAAK,OAAO,QAAQ,IAAI,CAAC;AAIjD,QAAM,UAAU,KAAK,YAAY,SAAY,QAAQ,aAAa,SAAS,OAAO,CAAC,CAAC;AAMpF,QAAM,QAAQ,IAAI,aAAa;AAK/B,QAAM,OAAO,IAAI,YAAY;AAO7B,QAAM,sBAAsB,CAAC,SAAuB;AAClD,4BAAwB,OAAO,EAAE,SAAS,KAAK,CAAC;AAChD,uBAAmB,OAAO;AAAA,MACxB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMT,cAAc,MAAM,wBAAwB,IAAI;AAAA;AAAA;AAAA;AAAA,MAIhD,UAAU,MAAM,aAAa,MAAM;AAAA,MACnC;AAAA,IACF,CAAC;AAID,wBAAoB,OAAO,EAAE,aAAa,KAAK,CAAC;AAAA,EAClD;AAMA,QAAM,sBAAsB,OAAO,SAAgD;AACjF,UAAM,SAAS,MAAM,kCAAkC,OAAO,IAAI;AAClE,QAAI,CAAC,OAAO,QAAS,OAAM,WAAW,iBAAiB;AACvD,WAAO;AAAA,EACT;AACA,sBAAoB,OAAO;AAK3B,mBAAiB,KAAK;AAMtB,qBAAmB,KAAK;AAGxB,mBAAiB,KAAK;AAWtB,YAAU,0BAA0B;AACpC,QAAM,WAAW,MAAM,oBAAoB,OAAO;AAClD;AAAA,IACE,SAAS,UAAU,oCAAoC;AAAA,EACzD;AAEA,UAAQ,OAAO;AAAA,IACb,mCAA8B,OAAO,cAAc,WAAW,aAAa,UAAO,MAAM,IAAI,kBAC1F,SAAS,UAAU,6BAA0B,EAC/C;AAAA;AAAA,EACF;AAWA,UAAQ,KAAK,QAAQ,MAAM;AACzB,SAAK,KAAK,SAAS;AAAA,EACrB,CAAC;AAED,MAAI;AACJ,MAAI,KAAK,iBAAiB,UAAa,KAAK,aAAa,KAAK,EAAE,WAAW,GAAG;AAC5E,YAAQ,OAAO,MAAM,mEAA8D;AAAA,EACrF;AACA,MAAI,KAAK,kBAAkB;AACzB,UAAM,WAAW,QAAQ,KAAK,gBAAgB;AAC9C,QAAI;AACF,iCAA2B,aAAa,UAAU,MAAM;AAAA,IAC1D,SAAS,KAAK;AACZ,YAAM,IAAI;AACV,cAAQ,OAAO;AAAA,QACb,4CAA4C,QAAQ,MAAM,EAAE,OAAO,IAAI,EAAE,IAAI,OAAO,EAAE,GAAG,EAAE,OAAO;AAAA;AAAA,MACpG;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,OAAO,KAAK,SAAS;AAAA,IACrB,WAAW,KAAK;AAAA,IAChB,QAAQ,iBAAiB,SAAS;AAAA,MAChC,mBAAmB,SAAS;AAAA,MAC5B,cAAc,KAAK;AAAA,MACnB,kBAAkB;AAAA,IACpB,CAAC;AAAA,IACD,YAAY,KAAK;AAAA,IACjB;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IACF;AAAA,IACA,KAAK,WAAW,EAAE;AAAA,IAClB,aAAa,KAAK;AAAA,IAClB,UAAU,KAAK;AAAA,IACf,aAAa,KAAK;AAAA,IAClB,WAAW,KAAK;AAAA,EAClB,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/code.tsx"],"sourcesContent":["/**\n * `reasonix code [dir]` — opinionated wrapper around `reasonix chat` for\n * code-editing workflows.\n *\n * What it does differently from plain chat:\n * - Registers native filesystem tools rooted at the given directory\n * (CWD by default). No subprocess, no `npx install` step, R1-\n * friendly schemas. Replaced the old `@modelcontextprotocol/server-filesystem`\n * subprocess in 0.4.9 because its `edit_file` argv shape was the\n * biggest driver of R1 DSML hallucinations.\n * - Uses a coding-focused system prompt (src/code/prompt.ts) that\n * teaches the model to propose edits as SEARCH/REPLACE blocks.\n * - Defaults to the `smart` preset (reasoner + harvest) because\n * coding tasks pay back R1 thinking.\n * - Scopes its session to the directory so projects don't share\n * conversation history.\n * - Hooks `codeMode` into the TUI so assistant replies get parsed\n * for SEARCH/REPLACE blocks and applied on disk after each turn.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { basename, resolve } from \"node:path\";\nimport { loadEditMode, loadProjectShellAllowed, readConfig } from \"../../config.js\";\nimport { bootstrapSemanticSearchInCodeMode } from \"../../index/semantic/tool.js\";\nimport { sanitizeName } from \"../../memory/session.js\";\nimport { ToolRegistry } from \"../../tools.js\";\nimport { registerChoiceTool } from \"../../tools/choice.js\";\nimport { registerFilesystemTools } from \"../../tools/filesystem.js\";\nimport { JobRegistry } from \"../../tools/jobs.js\";\nimport { registerMemoryTools } from \"../../tools/memory.js\";\nimport { registerPlanTool } from \"../../tools/plan.js\";\nimport { registerShellTools } from \"../../tools/shell.js\";\nimport { registerTodoTool } from \"../../tools/todo.js\";\nimport { markPhase } from \"../startup-profile.js\";\nimport { chatCommand } from \"./chat.js\";\n\nexport interface CodeOptions {\n /** Directory to root the filesystem tools at. Defaults to process.cwd(). */\n dir?: string;\n /** Override the default `smart` model. */\n model?: string;\n /** Disable session persistence. */\n noSession?: boolean;\n /** Transcript file for replay/diff. */\n transcript?: string;\n /** Skip the session picker — always resume prior messages. */\n forceResume?: boolean;\n /** Skip the session picker — always wipe prior messages and start fresh. */\n forceNew?: boolean;\n /**\n * Soft USD spend cap. Off by default. Same semantics as `chat`:\n * warns at 80%, refuses next turn at 100%. Mid-session adjustable\n * via `/budget <usd>` slash command.\n */\n budgetUsd?: number;\n /** Suppress the auto-launched embedded web dashboard. */\n noDashboard?: boolean;\n /** Inline string appended to the code system prompt after the generated base prompt. */\n systemAppend?: string;\n /** Path to a UTF-8 text file whose contents are appended to the code system prompt. */\n systemAppendFile?: string;\n /** Default true. Pass false (CLI: `--no-alt-screen`) to keep chat output in shell scrollback. */\n altScreen?: boolean;\n}\n\nexport async function codeCommand(opts: CodeOptions = {}): Promise<void> {\n markPhase(\"code_command_enter\");\n const { codeSystemPrompt } = await import(\"../../code/prompt.js\");\n const rootDir = resolve(opts.dir ?? process.cwd());\n // Per-directory session so switching projects doesn't mix histories.\n // `code-<sanitized-basename>` fits the session name rules without\n // truncating most project names.\n const session = opts.noSession ? undefined : `code-${sanitizeName(basename(rootDir))}`;\n\n // Native filesystem tools. No subprocess, ~50-200 ms faster per call\n // than the MCP server was, and `edit_file` takes a flat SEARCH/REPLACE\n // shape instead of the `string=\"false\"` JSON-in-string array that\n // triggered R1's DSML hallucinations all through 0.4.x.\n const tools = new ToolRegistry();\n // Background-process registry shared between the shell tools and the\n // TUI's /jobs + /kill slashes + exit cleanup. One per `reasonix code`\n // run — orphan prevention on SIGINT / process exit kills everything\n // it owns, so dev servers don't outlive the Reasonix process.\n const jobs = new JobRegistry();\n // Bundled re-registration so `/cwd <path>` can swap every rootDir-\n // dependent tool atomically. ToolRegistry.register is keyed by name\n // and overwrites in-place, so re-calling these against the existing\n // registry replaces the closures cleanly without disturbing tool\n // specs (names/descriptions/params don't reference rootDir, so the\n // prefix cache survives).\n const registerRootedTools = (root: string): void => {\n registerFilesystemTools(tools, { rootDir: root });\n registerShellTools(tools, {\n rootDir: root,\n // Per-project \"always allow\" list persisted from prior ShellConfirm\n // choices; merged on top of the built-in allowlist in shell.ts.\n // GETTER form — re-read every dispatch so a prefix the user adds\n // via ShellConfirm mid-session takes effect on the next shell call\n // instead of waiting for `/new` or a relaunch.\n extraAllowed: () => loadProjectShellAllowed(root),\n // `yolo` edit-mode disables shell confirmations entirely. Re-read\n // from config on each dispatch so /mode yolo (or Shift+Tab cycling\n // through to it) flips the gate live without forcing a relaunch.\n allowAll: () => loadEditMode() === \"yolo\",\n jobs,\n });\n // `remember` / `forget` / `recall_memory` — cross-session user memory.\n // Project scope hashes off rootDir so switching projects gets a fresh\n // per-project memory store; the global scope is shared across runs.\n registerMemoryTools(tools, { projectRoot: root });\n };\n // Async tail to `registerRootedTools`. Kept separate because the FS /\n // shell / memory re-registration above is sync and must happen before\n // the next tool dispatch, while semantic-index probing reads disk and\n // can race ahead in the background. On `/cwd`, App.tsx fires this\n // after the sync swap and surfaces the result via postInfo.\n const reBootstrapSemantic = async (root: string): Promise<{ enabled: boolean }> => {\n const result = await bootstrapSemanticSearchInCodeMode(tools, root);\n if (!result.enabled) tools.unregister(\"semantic_search\");\n return result;\n };\n registerRootedTools(rootDir);\n // `submit_plan` is always in the spec list so the prefix cache stays\n // stable across plan-mode toggles (Pillar 1). The tool itself is a\n // no-op outside plan mode and throws `PlanProposedError` when the\n // user has `/plan`-enabled the session.\n registerPlanTool(tools);\n // `ask_choice` — branching primitive. Independent of plan mode: the\n // model uses it to put a 2–4 way choice in front of the user\n // (strategy, style, library pick) without trying to squeeze the\n // menu into a submit_plan body. Keeping it always-registered\n // preserves the prefix cache across plan-mode toggles.\n registerChoiceTool(tools);\n // `todo_write` — lightweight in-session task tracker, no approval gate.\n // Independent of plan mode (readOnly=true so it stays callable in /plan).\n registerTodoTool(tools);\n // `run_skill` is intentionally NOT registered here — App.tsx wires it\n // up with the subagent runner attached, so `runAs: subagent` skills\n // can spawn isolated child loops. Doing it here would mean the App's\n // re-registration would shadow the no-runner version, which works\n // (last write wins) but obscures the wiring.\n\n // Bootstrap semantic_search. Silent: registers the tool when an\n // on-disk index already exists, skips entirely otherwise. Setup\n // happens via the explicit `reasonix index` command — never\n // by surprise on launch.\n markPhase(\"semantic_bootstrap_start\");\n const semantic = await reBootstrapSemantic(rootDir);\n markPhase(\n semantic.enabled ? \"semantic_bootstrap_done_enabled\" : \"semantic_bootstrap_done_skipped\",\n );\n\n process.stderr.write(\n `▸ reasonix code: rooted at ${rootDir}, session \"${session ?? \"(ephemeral)\"}\" · ${tools.size} native tool(s)${\n semantic.enabled ? \" · semantic_search on\" : \"\"\n }\\n`,\n );\n\n // Belt-and-suspenders cleanup: even though spawn(detached:false)\n // should tie child processes to the parent's lifetime, Windows cmd.exe\n // wrappers occasionally leak. We DON'T install SIGINT/SIGTERM\n // handlers here — that overrode Node's default \"exit on Ctrl+C\" with\n // a silent no-op, which made Ctrl+C feel broken in the TUI. App.tsx\n // owns the SIGINT path now (it shows the quit-armed banner and calls\n // exit() on confirmation); this 'exit' hook just guarantees the job\n // registry is drained on the way out, regardless of which exit path\n // fired.\n process.once(\"exit\", () => {\n void jobs.shutdown();\n });\n\n let systemAppendFileContents: string | undefined;\n if (opts.systemAppend !== undefined && opts.systemAppend.trim().length === 0) {\n process.stderr.write(\"--system-append is empty — no prompt text will be appended\\n\");\n }\n if (opts.systemAppendFile) {\n const filePath = resolve(opts.systemAppendFile);\n try {\n systemAppendFileContents = readFileSync(filePath, \"utf8\");\n } catch (err) {\n const e = err as NodeJS.ErrnoException;\n process.stderr.write(\n `Error: cannot read --system-append-file \"${filePath}\": ${e.code ? `[${e.code}] ` : \"\"}${e.message}\\n`,\n );\n process.exit(1);\n }\n }\n\n await chatCommand({\n model: opts.model ?? \"deepseek-v4-flash\",\n budgetUsd: opts.budgetUsd,\n system: codeSystemPrompt(rootDir, {\n hasSemanticSearch: semantic.enabled,\n systemAppend: opts.systemAppend,\n systemAppendFile: systemAppendFileContents,\n }),\n transcript: opts.transcript,\n session,\n seedTools: tools,\n codeMode: {\n rootDir,\n jobs,\n reregisterTools: registerRootedTools,\n reBootstrapSemantic,\n },\n mcp: readConfig().mcp,\n forceResume: opts.forceResume,\n forceNew: opts.forceNew,\n noDashboard: opts.noDashboard,\n altScreen: opts.altScreen,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,SAAS,oBAAoB;AAC7B,SAAS,UAAU,eAAe;AA4ClC,eAAsB,YAAY,OAAoB,CAAC,GAAkB;AACvE,YAAU,oBAAoB;AAC9B,QAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,sBAAsB;AAChE,QAAM,UAAU,QAAQ,KAAK,OAAO,QAAQ,IAAI,CAAC;AAIjD,QAAM,UAAU,KAAK,YAAY,SAAY,QAAQ,aAAa,SAAS,OAAO,CAAC,CAAC;AAMpF,QAAM,QAAQ,IAAI,aAAa;AAK/B,QAAM,OAAO,IAAI,YAAY;AAO7B,QAAM,sBAAsB,CAAC,SAAuB;AAClD,4BAAwB,OAAO,EAAE,SAAS,KAAK,CAAC;AAChD,uBAAmB,OAAO;AAAA,MACxB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMT,cAAc,MAAM,wBAAwB,IAAI;AAAA;AAAA;AAAA;AAAA,MAIhD,UAAU,MAAM,aAAa,MAAM;AAAA,MACnC;AAAA,IACF,CAAC;AAID,wBAAoB,OAAO,EAAE,aAAa,KAAK,CAAC;AAAA,EAClD;AAMA,QAAM,sBAAsB,OAAO,SAAgD;AACjF,UAAM,SAAS,MAAM,kCAAkC,OAAO,IAAI;AAClE,QAAI,CAAC,OAAO,QAAS,OAAM,WAAW,iBAAiB;AACvD,WAAO;AAAA,EACT;AACA,sBAAoB,OAAO;AAK3B,mBAAiB,KAAK;AAMtB,qBAAmB,KAAK;AAGxB,mBAAiB,KAAK;AAWtB,YAAU,0BAA0B;AACpC,QAAM,WAAW,MAAM,oBAAoB,OAAO;AAClD;AAAA,IACE,SAAS,UAAU,oCAAoC;AAAA,EACzD;AAEA,UAAQ,OAAO;AAAA,IACb,mCAA8B,OAAO,cAAc,WAAW,aAAa,UAAO,MAAM,IAAI,kBAC1F,SAAS,UAAU,6BAA0B,EAC/C;AAAA;AAAA,EACF;AAWA,UAAQ,KAAK,QAAQ,MAAM;AACzB,SAAK,KAAK,SAAS;AAAA,EACrB,CAAC;AAED,MAAI;AACJ,MAAI,KAAK,iBAAiB,UAAa,KAAK,aAAa,KAAK,EAAE,WAAW,GAAG;AAC5E,YAAQ,OAAO,MAAM,mEAA8D;AAAA,EACrF;AACA,MAAI,KAAK,kBAAkB;AACzB,UAAM,WAAW,QAAQ,KAAK,gBAAgB;AAC9C,QAAI;AACF,iCAA2B,aAAa,UAAU,MAAM;AAAA,IAC1D,SAAS,KAAK;AACZ,YAAM,IAAI;AACV,cAAQ,OAAO;AAAA,QACb,4CAA4C,QAAQ,MAAM,EAAE,OAAO,IAAI,EAAE,IAAI,OAAO,EAAE,GAAG,EAAE,OAAO;AAAA;AAAA,MACpG;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,OAAO,KAAK,SAAS;AAAA,IACrB,WAAW,KAAK;AAAA,IAChB,QAAQ,iBAAiB,SAAS;AAAA,MAChC,mBAAmB,SAAS;AAAA,MAC5B,cAAc,KAAK;AAAA,MACnB,kBAAkB;AAAA,IACpB,CAAC;AAAA,IACD,YAAY,KAAK;AAAA,IACjB;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IACF;AAAA,IACA,KAAK,WAAW,EAAE;AAAA,IAClB,aAAa,KAAK;AAAA,IAClB,UAAU,KAAK;AAAA,IACf,aAAa,KAAK;AAAA,IAClB,WAAW,KAAK;AAAA,EAClB,CAAC;AACH;","names":[]}
@@ -2,7 +2,8 @@
2
2
  import {
3
3
  doctorCommand,
4
4
  runDoctorChecks
5
- } from "./chunk-D5DKXIP5.js";
5
+ } from "./chunk-WVJL7ZO2.js";
6
+ import "./chunk-DAEAAVDF.js";
6
7
  import "./chunk-KMWKGPFZ.js";
7
8
  import "./chunk-3Q3C4W66.js";
8
9
  import "./chunk-RZILUXUC.js";
@@ -16,4 +17,4 @@ export {
16
17
  doctorCommand,
17
18
  runDoctorChecks
18
19
  };
19
- //# sourceMappingURL=doctor-3TGB2NZN.js.map
20
+ //# sourceMappingURL=doctor-V5HLCMSQ.js.map
package/dist/cli/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  markPhase
4
4
  } from "./chunk-CPOV2O73.js";
5
- import "./chunk-Q6YFXW7H.js";
5
+ import "./chunk-G7M3QWEN.js";
6
6
  import "./chunk-I6YIAK6C.js";
7
7
  import "./chunk-XJLZ4HKU.js";
8
8
  import "./chunk-XHQIK7B6.js";
@@ -12,6 +12,7 @@ import {
12
12
  import {
13
13
  resolvePreset
14
14
  } from "./chunk-MHDNZXJJ.js";
15
+ import "./chunk-DAEAAVDF.js";
15
16
  import "./chunk-KMWKGPFZ.js";
16
17
  import "./chunk-3Q3C4W66.js";
17
18
  import "./chunk-W4LDFAZ6.js";
@@ -128,7 +129,7 @@ program.action(async (opts) => {
128
129
  (msg) => process.stderr.write(`${msg}
129
130
  `)
130
131
  );
131
- const { chatCommand } = await import("./chat-EIFLHBZ6.js");
132
+ const { chatCommand } = await import("./chat-ZMSAXE77.js");
132
133
  await chatCommand({
133
134
  model: defaults.model,
134
135
  system: applyMemoryStack(DEFAULT_SYSTEM, process.cwd()),
@@ -142,7 +143,7 @@ program.command("setup").description(t("cli.setup")).action(async () => {
142
143
  await setupCommand({});
143
144
  });
144
145
  program.command("code [dir]").description(t("cli.code")).option("-m, --model <id>", t("ui.modelOverride")).option("--no-session", t("ui.noSession")).option("-r, --resume", t("ui.resumeHint")).option("-n, --new", t("ui.newHint")).option("--transcript <path>", t("ui.transcriptHint")).option("--budget <usd>", t("ui.budgetHint"), (v) => Number.parseFloat(v)).option("--no-dashboard", t("ui.noDashboard")).option("--no-alt-screen", "keep chat output in shell scrollback (legacy mode, ghost-prone)").option("--system-append <prompt>", t("ui.systemAppendHint")).option("--system-append-file <path>", t("ui.systemAppendFileHint")).action(async (dir, opts) => {
145
- const { codeCommand } = await import("./code-F4KJOE3K.js");
146
+ const { codeCommand } = await import("./code-R4TXQQEE.js");
146
147
  await codeCommand({
147
148
  dir,
148
149
  model: opts.model,
@@ -177,7 +178,7 @@ program.command("chat").description(t("cli.chat")).option("-m, --model <id>", t(
177
178
  (msg) => process.stderr.write(`${msg}
178
179
  `)
179
180
  );
180
- const { chatCommand } = await import("./chat-EIFLHBZ6.js");
181
+ const { chatCommand } = await import("./chat-ZMSAXE77.js");
181
182
  await chatCommand({
182
183
  model: defaults.model,
183
184
  system: applyMemoryStack(opts.system, process.cwd()),
@@ -204,7 +205,7 @@ program.command("run <task>").description(t("cli.run")).option("-m, --model <id>
204
205
  preset: opts.preset,
205
206
  noConfig: opts.config === false
206
207
  });
207
- const { runCommand } = await import("./run-JMEOTQCG.js");
208
+ const { runCommand } = await import("./run-HK3FP266.js");
208
209
  await runCommand({
209
210
  task,
210
211
  model: defaults.model,
@@ -220,7 +221,7 @@ program.command("stats [transcript]").description(t("cli.stats")).action(async (
220
221
  statsCommand({ transcript });
221
222
  });
222
223
  program.command("doctor").description(t("cli.doctor")).action(async () => {
223
- const { doctorCommand } = await import("./doctor-3TGB2NZN.js");
224
+ const { doctorCommand } = await import("./doctor-V5HLCMSQ.js");
224
225
  await doctorCommand();
225
226
  });
226
227
  program.command("commit").description(t("cli.commit")).option("-m, --model <id>", t("ui.modelOverrideFlash")).option("-y, --yes", t("ui.skipConfirmHint")).action(async (opts) => {
@@ -228,7 +229,7 @@ program.command("commit").description(t("cli.commit")).option("-m, --model <id>"
228
229
  await commitCommand({ model: opts.model, yes: !!opts.yes });
229
230
  });
230
231
  program.command("sessions [name]").description(t("cli.sessions")).option("-v, --verbose", t("ui.verboseHint")).action(async (name, opts) => {
231
- const { sessionsCommand } = await import("./sessions-MOJAALJI.js");
232
+ const { sessionsCommand } = await import("./sessions-3XU2GGHX.js");
232
233
  sessionsCommand({ name, verbose: !!opts.verbose });
233
234
  });
234
235
  program.command("prune-sessions").description(t("cli.pruneSessions")).option("--days <n>", t("ui.pruneDaysHint"), (v) => Number.parseInt(v, 10)).option("--dry-run", t("ui.pruneDryRunHint")).action(async (opts) => {
@@ -247,7 +248,7 @@ program.command("events <name>").description(t("cli.events")).option("--type <ty
247
248
  });
248
249
  });
249
250
  program.command("replay <transcript>").description(t("cli.replay")).option("--print", t("ui.printHint")).option("--head <n>", t("ui.headHint"), (v) => Number.parseInt(v, 10)).option("--tail <n>", t("ui.tailHint"), (v) => Number.parseInt(v, 10)).action(async (transcript, opts) => {
250
- const { replayCommand } = await import("./replay-TMJASRC4.js");
251
+ const { replayCommand } = await import("./replay-Q43DSMG6.js");
251
252
  await replayCommand({
252
253
  path: transcript,
253
254
  print: !!opts.print,
@@ -334,7 +335,7 @@ mcp.command("inspect <spec>").description(t("ui.mcpInspectDescription")).option(
334
335
  }
335
336
  });
336
337
  program.command("version").description(t("cli.version")).action(async () => {
337
- const { versionCommand } = await import("./version-3MYFE4G6.js");
338
+ const { versionCommand } = await import("./version-5SGI2SEE.js");
338
339
  versionCommand();
339
340
  });
340
341
  program.command("update").description(t("cli.update")).option("--dry-run", t("ui.dryRunHint")).action(async (opts) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/resolve.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { readConfig } from \"../config.js\";\nimport { t } from \"../i18n/index.js\";\nimport { VERSION } from \"../index.js\";\nimport { listSessions } from \"../memory/session.js\";\nimport { applyMemoryStack } from \"../memory/user.js\";\nimport { ESCALATION_CONTRACT } from \"../prompt-fragments.js\";\nimport { resolveContinueFlag, resolveDefaults } from \"./resolve.js\";\nimport { markPhase } from \"./startup-profile.js\";\n\nmarkPhase(\"cli_module_loaded\");\n\nconst DEFAULT_SYSTEM = `You are Reasonix, a helpful DeepSeek-powered assistant. Be concise and accurate. Use tools when available.\n\n# Cite or shut up — non-negotiable\n\nEvery factual claim about a codebase must be backed by evidence. Reasonix VALIDATES your citations — broken paths render in **red strikethrough with ❌** in front of the user.\n\n**Positive claims** — append a markdown link:\n- ✅ \\`The MCP client supports listResources [listResources](src/mcp/client.ts:142).\\`\n- ❌ \\`The MCP client supports listResources.\\` ← unverifiable, do not write.\n\n**Negative claims** (\"X is missing\", \"Y isn't implemented\", \"lacks Z\") are the #1 hallucination shape. STOP before writing them. If you have a search tool, call it first; if the search returns nothing, cite the search itself as evidence (\\`No matches for \"foo\" in src/\\`). If you have no tool, qualify hard: \"I haven't verified — this is a guess.\"\n\nAsserting absence without checking is how evaluative answers go wrong. Treat the urge to write \"missing\" as a red flag in your own reasoning.\n\n# Don't invent what changes — search instead\n\nYour training data has a cutoff. When an answer's correctness depends on something that changes over time (the user is asking what's happening, not what's true) and a search tool is available, search first. Inventing currently-correct values from training memory is the most common way these answers go wrong, and the user usually can't tell until much later.\n\nThe signal isn't a topic list — it's: \"if I'm wrong about this, is it because reality moved on?\". If yes, ground the answer in fresh evidence; if no (definitions, mechanisms, well-established APIs), answer from memory.\n\n${ESCALATION_CONTRACT}`;\n\n/** Lenient: malformed → undefined (no cap) so a bad flag doesn't abort launch. */\nfunction parseBudgetFlag(raw: number | undefined): number | undefined {\n if (raw === undefined) return undefined;\n if (!Number.isFinite(raw) || raw <= 0) {\n process.stderr.write(\n `▲ ignoring --budget=${raw} (must be a positive number) — running with no cap\\n`,\n );\n return undefined;\n }\n return raw;\n}\n\nconst program = new Command();\nprogram\n .name(\"reasonix\")\n .description(t(\"cli.description\"))\n .version(VERSION)\n .option(\"-c, --continue\", t(\"cli.continue\"));\n\n// `reasonix` with no subcommand → launch the friendliest flow.\n// First run (no config yet) → interactive setup wizard.\n// Otherwise → chat with saved defaults. This is the \"one command to\n// rule them all\" entry for non-power-users: they don't need to learn\n// `chat` / `setup` / `--mcp` — just type `reasonix`.\nprogram.action(async (opts: { continue?: boolean }) => {\n const cfg = readConfig();\n if (!cfg.setupCompleted) {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({});\n return;\n }\n const defaults = resolveDefaults({});\n const continueOpts = resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(DEFAULT_SYSTEM, process.cwd()),\n session: continueOpts.session,\n mcp: defaults.mcp,\n forceResume: continueOpts.forceResume,\n });\n});\n\nprogram\n .command(\"setup\")\n .description(t(\"cli.setup\"))\n .action(async () => {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({});\n });\n\nprogram\n .command(\"code [dir]\")\n .description(t(\"cli.code\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverride\"))\n .option(\"--no-session\", t(\"ui.noSession\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .option(\"--system-append <prompt>\", t(\"ui.systemAppendHint\"))\n .option(\"--system-append-file <path>\", t(\"ui.systemAppendFileHint\"))\n .action(async (dir: string | undefined, opts) => {\n const { codeCommand } = await import(\"./commands/code.js\");\n await codeCommand({\n dir,\n model: opts.model,\n noSession: opts.session === false,\n transcript: opts.transcript,\n forceResume: !!opts.resume,\n forceNew: !!opts.new,\n budgetUsd: parseBudgetFlag(opts.budget),\n noDashboard: opts.dashboard === false,\n systemAppend: opts.systemAppend,\n systemAppendFile: opts.systemAppendFile,\n altScreen: opts.altScreen !== false,\n });\n });\n\nprogram\n .command(\"chat\")\n .description(t(\"cli.chat\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"), DEFAULT_SYSTEM)\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--preset <name>\", t(\"ui.presetHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--session <name>\", t(\"ui.sessionNameHint\"))\n .option(\"--no-session\", t(\"ui.ephemeralHint\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-c, --continue\", t(\"cli.continue\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHint\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHint\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .action(async (opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n session: opts.session,\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n // `-c` is \"newest-touched session\" + auto-resume; `-r` is \"this\n // session's prior messages, even if you also passed --session\".\n // When both are set we prefer the explicit `--session` + `-r`\n // (more specific input wins). `-c` only kicks in if `-r` wasn't.\n const continueOpts = opts.resume\n ? { session: defaults.session, forceResume: true }\n : resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(opts.system, process.cwd()),\n transcript: opts.transcript,\n budgetUsd: parseBudgetFlag(opts.budget),\n session: continueOpts.session,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n forceResume: continueOpts.forceResume,\n forceNew: !!opts.new,\n noDashboard: opts.dashboard === false,\n altScreen: opts.altScreen !== false,\n });\n });\n\nprogram\n .command(\"run <task>\")\n .description(t(\"cli.run\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"), DEFAULT_SYSTEM)\n .option(\"--preset <name>\", t(\"ui.presetHintShort\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHintShort\"), (v) => Number.parseFloat(v))\n .option(\"--transcript <path>\", t(\"ui.transcriptHintShort\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHintShort\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHintShort\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .action(async (task: string, opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n const { runCommand } = await import(\"./commands/run.js\");\n await runCommand({\n task,\n model: defaults.model,\n system: applyMemoryStack(opts.system, process.cwd()),\n budgetUsd: parseBudgetFlag(opts.budget),\n transcript: opts.transcript,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n });\n });\n\nprogram\n .command(\"stats [transcript]\")\n .description(t(\"cli.stats\"))\n .action(async (transcript: string | undefined) => {\n const { statsCommand } = await import(\"./commands/stats.js\");\n statsCommand({ transcript });\n });\n\nprogram\n .command(\"doctor\")\n .description(t(\"cli.doctor\"))\n .action(async () => {\n const { doctorCommand } = await import(\"./commands/doctor.js\");\n await doctorCommand();\n });\n\nprogram\n .command(\"commit\")\n .description(t(\"cli.commit\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverrideFlash\"))\n .option(\"-y, --yes\", t(\"ui.skipConfirmHint\"))\n .action(async (opts) => {\n const { commitCommand } = await import(\"./commands/commit.js\");\n await commitCommand({ model: opts.model, yes: !!opts.yes });\n });\n\nprogram\n .command(\"sessions [name]\")\n .description(t(\"cli.sessions\"))\n .option(\"-v, --verbose\", t(\"ui.verboseHint\"))\n .action(async (name: string | undefined, opts) => {\n const { sessionsCommand } = await import(\"./commands/sessions.js\");\n sessionsCommand({ name, verbose: !!opts.verbose });\n });\n\nprogram\n .command(\"prune-sessions\")\n .description(t(\"cli.pruneSessions\"))\n .option(\"--days <n>\", t(\"ui.pruneDaysHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--dry-run\", t(\"ui.pruneDryRunHint\"))\n .action(async (opts) => {\n const { pruneSessionsCommand } = await import(\"./commands/prune-sessions.js\");\n pruneSessionsCommand({ days: opts.days, dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"events <name>\")\n .description(t(\"cli.events\"))\n .option(\"--type <type>\", t(\"ui.eventTypeHint\"))\n .option(\"--since <id>\", t(\"ui.eventSinceHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.eventTailHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--json\", t(\"ui.jsonHint\"))\n .option(\"--projection\", t(\"ui.projectionHint\"))\n .action(async (name: string, opts) => {\n const { eventsCommand } = await import(\"./commands/events.js\");\n eventsCommand({\n name,\n type: opts.type,\n since: Number.isFinite(opts.since) ? opts.since : undefined,\n tail: Number.isFinite(opts.tail) ? opts.tail : undefined,\n json: !!opts.json,\n projection: !!opts.projection,\n });\n });\n\nprogram\n .command(\"replay <transcript>\")\n .description(t(\"cli.replay\"))\n .option(\"--print\", t(\"ui.printHint\"))\n .option(\"--head <n>\", t(\"ui.headHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.tailHint\"), (v) => Number.parseInt(v, 10))\n .action(async (transcript: string, opts) => {\n const { replayCommand } = await import(\"./commands/replay.js\");\n await replayCommand({\n path: transcript,\n print: !!opts.print,\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(t(\"cli.diff\"))\n .option(\"--md <path>\", t(\"ui.mdReportHint\"))\n .option(\"--print\", t(\"ui.printHintTable\"))\n .option(\"--tui\", t(\"ui.tuiHint\"))\n .option(\"--label-a <label>\", t(\"ui.labelAHint\"))\n .option(\"--label-b <label>\", t(\"ui.labelBHint\"))\n .action(async (a: string, b: string, opts) => {\n const { diffCommand } = await import(\"./commands/diff.js\");\n await diffCommand({\n a,\n b,\n mdPath: opts.md,\n labelA: opts.labelA,\n labelB: opts.labelB,\n print: !!opts.print,\n tui: !!opts.tui,\n });\n });\n\nconst mcp = program.command(\"mcp\").description(t(\"cli.mcp\"));\n\nmcp\n .command(\"list\")\n .description(t(\"ui.mcpListDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--local\", t(\"ui.mcpLocalHint\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--pages <n>\", t(\"ui.mcpPagesHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--all\", t(\"ui.mcpAllHint\"))\n .action(async (opts) => {\n try {\n const { mcpListCommand } = await import(\"./commands/mcp.js\");\n await mcpListCommand({\n json: !!opts.json,\n local: !!opts.local,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n pages: typeof opts.pages === \"number\" && opts.pages > 0 ? opts.pages : undefined,\n all: !!opts.all,\n });\n } catch (err) {\n process.stderr.write(`mcp list failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"search <query>\")\n .description(t(\"ui.mcpSearchDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (query: string, opts) => {\n try {\n const { mcpSearchCommand } = await import(\"./commands/mcp.js\");\n await mcpSearchCommand(query, {\n json: !!opts.json,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp search failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"install <name>\")\n .description(t(\"ui.mcpInstallDescription\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (name: string, opts) => {\n try {\n const { mcpInstallCommand } = await import(\"./commands/mcp.js\");\n await mcpInstallCommand(name, {\n refresh: !!opts.refresh,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp install failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"browse\")\n .description(t(\"ui.mcpBrowseDescription\"))\n .action(async () => {\n try {\n const { mcpBrowseCommand } = await import(\"./commands/mcp-browse.js\");\n await mcpBrowseCommand();\n } catch (err) {\n process.stderr.write(`mcp browse failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"inspect <spec>\")\n .description(t(\"ui.mcpInspectDescription\"))\n .option(\"--json\", t(\"ui.jsonHintReport\"))\n .action(async (spec: string, opts) => {\n const { formatMcpInspectFailure, mcpInspectCommand } = await import(\n \"./commands/mcp-inspect.js\"\n );\n try {\n await mcpInspectCommand({ spec, json: !!opts.json });\n } catch (err) {\n process.stderr.write(`mcp inspect failed: ${formatMcpInspectFailure(err)}\\n`);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"version\")\n .description(t(\"cli.version\"))\n .action(async () => {\n const { versionCommand } = await import(\"./commands/version.js\");\n versionCommand();\n });\n\nprogram\n .command(\"update\")\n .description(t(\"cli.update\"))\n .option(\"--dry-run\", t(\"ui.dryRunHint\"))\n .action(async (opts: { dryRun?: boolean }) => {\n const { updateCommand } = await import(\"./commands/update.js\");\n await updateCommand({ dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"index\")\n .description(t(\"cli.index\"))\n .option(\"--rebuild\", t(\"ui.rebuildHint\"))\n .option(\"--model <name>\", t(\"ui.embedModelHint\"))\n .option(\"--dir <path>\", t(\"ui.projectDirHint\"))\n .option(\"--ollama-url <url>\", t(\"ui.ollamaUrlHint\"))\n .option(\"-y, --yes\", t(\"ui.skipPromptsHint\"))\n .action(\n async (opts: {\n rebuild?: boolean;\n model?: string;\n dir?: string;\n ollamaUrl?: string;\n yes?: boolean;\n }) => {\n const { indexCommand } = await import(\"./commands/index.js\");\n await indexCommand(opts);\n },\n );\n\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(err);\n process.exit(1);\n});\n","/** Precedence: per-setting flag > --preset > config.preset > \"auto\" defaults. */\n\nimport { type PresetName, type ReasonixConfig, readConfig } from \"../config.js\";\nimport { resolvePreset } from \"./ui/presets.js\";\n\nexport interface ResolvedDefaults {\n model: string;\n reasoningEffort: \"high\" | \"max\";\n mcp: string[];\n session: string | undefined;\n}\n\nexport interface RawCliFlags {\n model?: string;\n mcp?: string[];\n /** Commander's `--no-session` surfaces as `false`; `--session X` as a string. */\n session?: string | false;\n /** `--preset <name>`. */\n preset?: string;\n /** When true, ignore config entirely (power-user escape hatch). */\n noConfig?: boolean;\n}\n\nexport function resolveDefaults(flags: RawCliFlags): ResolvedDefaults {\n const cfg: ReasonixConfig = flags.noConfig ? {} : readConfig();\n const preset = pickPreset(flags.preset, cfg.preset);\n const presetSettings = resolvePreset(preset);\n\n const model = flags.model ?? presetSettings.model;\n const reasoningEffort = presetSettings.reasoningEffort;\n\n // `--mcp` accumulator is [] when absent. Treat empty from flags as\n // \"user didn't pass\" → fall through to config. Users who explicitly\n // want zero MCP servers can pass `--no-config` or edit the file.\n const mcp = flags.mcp && flags.mcp.length > 0 ? flags.mcp : (cfg.mcp ?? []);\n\n const session = resolveSession(flags.session, cfg.session);\n\n return { model, reasoningEffort, mcp, session };\n}\n\nfunction pickPreset(\n flagPreset: string | undefined,\n configPreset: PresetName | undefined,\n): PresetName {\n if (flagPreset && isPresetName(flagPreset)) return flagPreset;\n if (configPreset) return configPreset;\n return \"auto\";\n}\n\nfunction isPresetName(s: string): s is PresetName {\n return (\n s === \"auto\" ||\n s === \"flash\" ||\n s === \"pro\" ||\n // Legacy names — kept callable so old `--preset smart` invocations\n // and stale config.json entries don't error out.\n s === \"fast\" ||\n s === \"smart\" ||\n s === \"max\"\n );\n}\n\nfunction resolveSession(\n flag: string | false | undefined,\n configSession: string | null | undefined,\n): string | undefined {\n if (flag === false) return undefined; // --no-session\n if (typeof flag === \"string\" && flag.length > 0) return flag;\n if (configSession === null) return undefined; // config opted out\n if (typeof configSession === \"string\" && configSession.length > 0) return configSession;\n return \"default\";\n}\n\nexport function resolveContinueFlag(\n flag: boolean | undefined,\n fallbackSession: string | undefined,\n getLatestSession: () => { name: string } | undefined,\n warn: (msg: string) => void = () => {},\n): { session: string | undefined; forceResume: boolean } {\n if (!flag) return { session: fallbackSession, forceResume: false };\n const latest = getLatestSession();\n if (!latest) {\n warn(\"▸ -c/--continue: no saved sessions yet — starting a fresh one.\");\n return { session: fallbackSession, forceResume: false };\n }\n return { session: latest.name, forceResume: true };\n}\n"],"mappings":"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","names":["mcp"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/resolve.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { readConfig } from \"../config.js\";\nimport { t } from \"../i18n/index.js\";\nimport { VERSION } from \"../index.js\";\nimport { listSessions } from \"../memory/session.js\";\nimport { applyMemoryStack } from \"../memory/user.js\";\nimport { ESCALATION_CONTRACT } from \"../prompt-fragments.js\";\nimport { resolveContinueFlag, resolveDefaults } from \"./resolve.js\";\nimport { markPhase } from \"./startup-profile.js\";\n\nmarkPhase(\"cli_module_loaded\");\n\nconst DEFAULT_SYSTEM = `You are Reasonix, a helpful DeepSeek-powered assistant. Be concise and accurate. Use tools when available.\n\n# Cite or shut up — non-negotiable\n\nEvery factual claim about a codebase must be backed by evidence. Reasonix VALIDATES your citations — broken paths render in **red strikethrough with ❌** in front of the user.\n\n**Positive claims** — append a markdown link:\n- ✅ \\`The MCP client supports listResources [listResources](src/mcp/client.ts:142).\\`\n- ❌ \\`The MCP client supports listResources.\\` ← unverifiable, do not write.\n\n**Negative claims** (\"X is missing\", \"Y isn't implemented\", \"lacks Z\") are the #1 hallucination shape. STOP before writing them. If you have a search tool, call it first; if the search returns nothing, cite the search itself as evidence (\\`No matches for \"foo\" in src/\\`). If you have no tool, qualify hard: \"I haven't verified — this is a guess.\"\n\nAsserting absence without checking is how evaluative answers go wrong. Treat the urge to write \"missing\" as a red flag in your own reasoning.\n\n# Don't invent what changes — search instead\n\nYour training data has a cutoff. When an answer's correctness depends on something that changes over time (the user is asking what's happening, not what's true) and a search tool is available, search first. Inventing currently-correct values from training memory is the most common way these answers go wrong, and the user usually can't tell until much later.\n\nThe signal isn't a topic list — it's: \"if I'm wrong about this, is it because reality moved on?\". If yes, ground the answer in fresh evidence; if no (definitions, mechanisms, well-established APIs), answer from memory.\n\n${ESCALATION_CONTRACT}`;\n\n/** Lenient: malformed → undefined (no cap) so a bad flag doesn't abort launch. */\nfunction parseBudgetFlag(raw: number | undefined): number | undefined {\n if (raw === undefined) return undefined;\n if (!Number.isFinite(raw) || raw <= 0) {\n process.stderr.write(\n `▲ ignoring --budget=${raw} (must be a positive number) — running with no cap\\n`,\n );\n return undefined;\n }\n return raw;\n}\n\nconst program = new Command();\nprogram\n .name(\"reasonix\")\n .description(t(\"cli.description\"))\n .version(VERSION)\n .option(\"-c, --continue\", t(\"cli.continue\"));\n\n// `reasonix` with no subcommand → launch the friendliest flow.\n// First run (no config yet) → interactive setup wizard.\n// Otherwise → chat with saved defaults. This is the \"one command to\n// rule them all\" entry for non-power-users: they don't need to learn\n// `chat` / `setup` / `--mcp` — just type `reasonix`.\nprogram.action(async (opts: { continue?: boolean }) => {\n const cfg = readConfig();\n if (!cfg.setupCompleted) {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({});\n return;\n }\n const defaults = resolveDefaults({});\n const continueOpts = resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(DEFAULT_SYSTEM, process.cwd()),\n session: continueOpts.session,\n mcp: defaults.mcp,\n forceResume: continueOpts.forceResume,\n });\n});\n\nprogram\n .command(\"setup\")\n .description(t(\"cli.setup\"))\n .action(async () => {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({});\n });\n\nprogram\n .command(\"code [dir]\")\n .description(t(\"cli.code\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverride\"))\n .option(\"--no-session\", t(\"ui.noSession\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .option(\"--system-append <prompt>\", t(\"ui.systemAppendHint\"))\n .option(\"--system-append-file <path>\", t(\"ui.systemAppendFileHint\"))\n .action(async (dir: string | undefined, opts) => {\n const { codeCommand } = await import(\"./commands/code.js\");\n await codeCommand({\n dir,\n model: opts.model,\n noSession: opts.session === false,\n transcript: opts.transcript,\n forceResume: !!opts.resume,\n forceNew: !!opts.new,\n budgetUsd: parseBudgetFlag(opts.budget),\n noDashboard: opts.dashboard === false,\n systemAppend: opts.systemAppend,\n systemAppendFile: opts.systemAppendFile,\n altScreen: opts.altScreen !== false,\n });\n });\n\nprogram\n .command(\"chat\")\n .description(t(\"cli.chat\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"), DEFAULT_SYSTEM)\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--preset <name>\", t(\"ui.presetHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--session <name>\", t(\"ui.sessionNameHint\"))\n .option(\"--no-session\", t(\"ui.ephemeralHint\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-c, --continue\", t(\"cli.continue\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHint\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHint\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .action(async (opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n session: opts.session,\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n // `-c` is \"newest-touched session\" + auto-resume; `-r` is \"this\n // session's prior messages, even if you also passed --session\".\n // When both are set we prefer the explicit `--session` + `-r`\n // (more specific input wins). `-c` only kicks in if `-r` wasn't.\n const continueOpts = opts.resume\n ? { session: defaults.session, forceResume: true }\n : resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(opts.system, process.cwd()),\n transcript: opts.transcript,\n budgetUsd: parseBudgetFlag(opts.budget),\n session: continueOpts.session,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n forceResume: continueOpts.forceResume,\n forceNew: !!opts.new,\n noDashboard: opts.dashboard === false,\n altScreen: opts.altScreen !== false,\n });\n });\n\nprogram\n .command(\"run <task>\")\n .description(t(\"cli.run\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"), DEFAULT_SYSTEM)\n .option(\"--preset <name>\", t(\"ui.presetHintShort\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHintShort\"), (v) => Number.parseFloat(v))\n .option(\"--transcript <path>\", t(\"ui.transcriptHintShort\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHintShort\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHintShort\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .action(async (task: string, opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n const { runCommand } = await import(\"./commands/run.js\");\n await runCommand({\n task,\n model: defaults.model,\n system: applyMemoryStack(opts.system, process.cwd()),\n budgetUsd: parseBudgetFlag(opts.budget),\n transcript: opts.transcript,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n });\n });\n\nprogram\n .command(\"stats [transcript]\")\n .description(t(\"cli.stats\"))\n .action(async (transcript: string | undefined) => {\n const { statsCommand } = await import(\"./commands/stats.js\");\n statsCommand({ transcript });\n });\n\nprogram\n .command(\"doctor\")\n .description(t(\"cli.doctor\"))\n .action(async () => {\n const { doctorCommand } = await import(\"./commands/doctor.js\");\n await doctorCommand();\n });\n\nprogram\n .command(\"commit\")\n .description(t(\"cli.commit\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverrideFlash\"))\n .option(\"-y, --yes\", t(\"ui.skipConfirmHint\"))\n .action(async (opts) => {\n const { commitCommand } = await import(\"./commands/commit.js\");\n await commitCommand({ model: opts.model, yes: !!opts.yes });\n });\n\nprogram\n .command(\"sessions [name]\")\n .description(t(\"cli.sessions\"))\n .option(\"-v, --verbose\", t(\"ui.verboseHint\"))\n .action(async (name: string | undefined, opts) => {\n const { sessionsCommand } = await import(\"./commands/sessions.js\");\n sessionsCommand({ name, verbose: !!opts.verbose });\n });\n\nprogram\n .command(\"prune-sessions\")\n .description(t(\"cli.pruneSessions\"))\n .option(\"--days <n>\", t(\"ui.pruneDaysHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--dry-run\", t(\"ui.pruneDryRunHint\"))\n .action(async (opts) => {\n const { pruneSessionsCommand } = await import(\"./commands/prune-sessions.js\");\n pruneSessionsCommand({ days: opts.days, dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"events <name>\")\n .description(t(\"cli.events\"))\n .option(\"--type <type>\", t(\"ui.eventTypeHint\"))\n .option(\"--since <id>\", t(\"ui.eventSinceHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.eventTailHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--json\", t(\"ui.jsonHint\"))\n .option(\"--projection\", t(\"ui.projectionHint\"))\n .action(async (name: string, opts) => {\n const { eventsCommand } = await import(\"./commands/events.js\");\n eventsCommand({\n name,\n type: opts.type,\n since: Number.isFinite(opts.since) ? opts.since : undefined,\n tail: Number.isFinite(opts.tail) ? opts.tail : undefined,\n json: !!opts.json,\n projection: !!opts.projection,\n });\n });\n\nprogram\n .command(\"replay <transcript>\")\n .description(t(\"cli.replay\"))\n .option(\"--print\", t(\"ui.printHint\"))\n .option(\"--head <n>\", t(\"ui.headHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.tailHint\"), (v) => Number.parseInt(v, 10))\n .action(async (transcript: string, opts) => {\n const { replayCommand } = await import(\"./commands/replay.js\");\n await replayCommand({\n path: transcript,\n print: !!opts.print,\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(t(\"cli.diff\"))\n .option(\"--md <path>\", t(\"ui.mdReportHint\"))\n .option(\"--print\", t(\"ui.printHintTable\"))\n .option(\"--tui\", t(\"ui.tuiHint\"))\n .option(\"--label-a <label>\", t(\"ui.labelAHint\"))\n .option(\"--label-b <label>\", t(\"ui.labelBHint\"))\n .action(async (a: string, b: string, opts) => {\n const { diffCommand } = await import(\"./commands/diff.js\");\n await diffCommand({\n a,\n b,\n mdPath: opts.md,\n labelA: opts.labelA,\n labelB: opts.labelB,\n print: !!opts.print,\n tui: !!opts.tui,\n });\n });\n\nconst mcp = program.command(\"mcp\").description(t(\"cli.mcp\"));\n\nmcp\n .command(\"list\")\n .description(t(\"ui.mcpListDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--local\", t(\"ui.mcpLocalHint\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--pages <n>\", t(\"ui.mcpPagesHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--all\", t(\"ui.mcpAllHint\"))\n .action(async (opts) => {\n try {\n const { mcpListCommand } = await import(\"./commands/mcp.js\");\n await mcpListCommand({\n json: !!opts.json,\n local: !!opts.local,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n pages: typeof opts.pages === \"number\" && opts.pages > 0 ? opts.pages : undefined,\n all: !!opts.all,\n });\n } catch (err) {\n process.stderr.write(`mcp list failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"search <query>\")\n .description(t(\"ui.mcpSearchDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (query: string, opts) => {\n try {\n const { mcpSearchCommand } = await import(\"./commands/mcp.js\");\n await mcpSearchCommand(query, {\n json: !!opts.json,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp search failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"install <name>\")\n .description(t(\"ui.mcpInstallDescription\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (name: string, opts) => {\n try {\n const { mcpInstallCommand } = await import(\"./commands/mcp.js\");\n await mcpInstallCommand(name, {\n refresh: !!opts.refresh,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp install failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"browse\")\n .description(t(\"ui.mcpBrowseDescription\"))\n .action(async () => {\n try {\n const { mcpBrowseCommand } = await import(\"./commands/mcp-browse.js\");\n await mcpBrowseCommand();\n } catch (err) {\n process.stderr.write(`mcp browse failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"inspect <spec>\")\n .description(t(\"ui.mcpInspectDescription\"))\n .option(\"--json\", t(\"ui.jsonHintReport\"))\n .action(async (spec: string, opts) => {\n const { formatMcpInspectFailure, mcpInspectCommand } = await import(\n \"./commands/mcp-inspect.js\"\n );\n try {\n await mcpInspectCommand({ spec, json: !!opts.json });\n } catch (err) {\n process.stderr.write(`mcp inspect failed: ${formatMcpInspectFailure(err)}\\n`);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"version\")\n .description(t(\"cli.version\"))\n .action(async () => {\n const { versionCommand } = await import(\"./commands/version.js\");\n versionCommand();\n });\n\nprogram\n .command(\"update\")\n .description(t(\"cli.update\"))\n .option(\"--dry-run\", t(\"ui.dryRunHint\"))\n .action(async (opts: { dryRun?: boolean }) => {\n const { updateCommand } = await import(\"./commands/update.js\");\n await updateCommand({ dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"index\")\n .description(t(\"cli.index\"))\n .option(\"--rebuild\", t(\"ui.rebuildHint\"))\n .option(\"--model <name>\", t(\"ui.embedModelHint\"))\n .option(\"--dir <path>\", t(\"ui.projectDirHint\"))\n .option(\"--ollama-url <url>\", t(\"ui.ollamaUrlHint\"))\n .option(\"-y, --yes\", t(\"ui.skipPromptsHint\"))\n .action(\n async (opts: {\n rebuild?: boolean;\n model?: string;\n dir?: string;\n ollamaUrl?: string;\n yes?: boolean;\n }) => {\n const { indexCommand } = await import(\"./commands/index.js\");\n await indexCommand(opts);\n },\n );\n\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(err);\n process.exit(1);\n});\n","/** Precedence: per-setting flag > --preset > config.preset > \"auto\" defaults. */\n\nimport { type PresetName, type ReasonixConfig, readConfig } from \"../config.js\";\nimport { resolvePreset } from \"./ui/presets.js\";\n\nexport interface ResolvedDefaults {\n model: string;\n reasoningEffort: \"high\" | \"max\";\n mcp: string[];\n session: string | undefined;\n}\n\nexport interface RawCliFlags {\n model?: string;\n mcp?: string[];\n /** Commander's `--no-session` surfaces as `false`; `--session X` as a string. */\n session?: string | false;\n /** `--preset <name>`. */\n preset?: string;\n /** When true, ignore config entirely (power-user escape hatch). */\n noConfig?: boolean;\n}\n\nexport function resolveDefaults(flags: RawCliFlags): ResolvedDefaults {\n const cfg: ReasonixConfig = flags.noConfig ? {} : readConfig();\n const preset = pickPreset(flags.preset, cfg.preset);\n const presetSettings = resolvePreset(preset);\n\n const model = flags.model ?? presetSettings.model;\n const reasoningEffort = presetSettings.reasoningEffort;\n\n // `--mcp` accumulator is [] when absent. Treat empty from flags as\n // \"user didn't pass\" → fall through to config. Users who explicitly\n // want zero MCP servers can pass `--no-config` or edit the file.\n const mcp = flags.mcp && flags.mcp.length > 0 ? flags.mcp : (cfg.mcp ?? []);\n\n const session = resolveSession(flags.session, cfg.session);\n\n return { model, reasoningEffort, mcp, session };\n}\n\nfunction pickPreset(\n flagPreset: string | undefined,\n configPreset: PresetName | undefined,\n): PresetName {\n if (flagPreset && isPresetName(flagPreset)) return flagPreset;\n if (configPreset) return configPreset;\n return \"auto\";\n}\n\nfunction isPresetName(s: string): s is PresetName {\n return (\n s === \"auto\" ||\n s === \"flash\" ||\n s === \"pro\" ||\n // Legacy names — kept callable so old `--preset smart` invocations\n // and stale config.json entries don't error out.\n s === \"fast\" ||\n s === \"smart\" ||\n s === \"max\"\n );\n}\n\nfunction resolveSession(\n flag: string | false | undefined,\n configSession: string | null | undefined,\n): string | undefined {\n if (flag === false) return undefined; // --no-session\n if (typeof flag === \"string\" && flag.length > 0) return flag;\n if (configSession === null) return undefined; // config opted out\n if (typeof configSession === \"string\" && configSession.length > 0) return configSession;\n return \"default\";\n}\n\nexport function resolveContinueFlag(\n flag: boolean | undefined,\n fallbackSession: string | undefined,\n getLatestSession: () => { name: string } | undefined,\n warn: (msg: string) => void = () => {},\n): { session: string | undefined; forceResume: boolean } {\n if (!flag) return { session: fallbackSession, forceResume: false };\n const latest = getLatestSession();\n if (!latest) {\n warn(\"▸ -c/--continue: no saved sessions yet — starting a fresh one.\");\n return { session: fallbackSession, forceResume: false };\n }\n return { session: latest.name, forceResume: true };\n}\n"],"mappings":"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","names":["mcp"]}
@@ -7,7 +7,7 @@ import {
7
7
  ChromeRule,
8
8
  formatBalance,
9
9
  formatCost
10
- } from "./chunk-Q5GRLZJF.js";
10
+ } from "./chunk-63KAV5DX.js";
11
11
  import {
12
12
  computeCumulativeStats,
13
13
  groupRecordsByTurn,
@@ -270,4 +270,4 @@ function oneLine(s, max = 200) {
270
270
  export {
271
271
  replayCommand
272
272
  };
273
- //# sourceMappingURL=replay-TMJASRC4.js.map
273
+ //# sourceMappingURL=replay-Q43DSMG6.js.map
@@ -11,7 +11,7 @@ import {
11
11
  ImmutablePrefix,
12
12
  ToolRegistry,
13
13
  bridgeMcpTools
14
- } from "./chunk-Q6YFXW7H.js";
14
+ } from "./chunk-G7M3QWEN.js";
15
15
  import {
16
16
  McpClient,
17
17
  SseTransport,
@@ -26,6 +26,7 @@ import {
26
26
  writeRecord
27
27
  } from "./chunk-XHQIK7B6.js";
28
28
  import "./chunk-6TMHAK5D.js";
29
+ import "./chunk-DAEAAVDF.js";
29
30
  import {
30
31
  DeepSeekClient
31
32
  } from "./chunk-KMWKGPFZ.js";
@@ -212,4 +213,4 @@ transcript: ${opts.transcript}
212
213
  export {
213
214
  runCommand
214
215
  };
215
- //# sourceMappingURL=run-JMEOTQCG.js.map
216
+ //# sourceMappingURL=run-HK3FP266.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/run.ts"],"sourcesContent":["import type { WriteStream } from \"node:fs\";\nimport { stdin, stdout } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport {\n defaultConfigPath,\n isPlausibleKey,\n loadApiKey,\n readConfig,\n saveApiKey,\n} from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\nimport { McpClient } from \"../../mcp/client.js\";\nimport { preflightStdioSpec } from \"../../mcp/preflight.js\";\nimport { bridgeMcpTools } from \"../../mcp/registry.js\";\nimport { parseMcpSpec } from \"../../mcp/spec.js\";\nimport { SseTransport } from \"../../mcp/sse.js\";\nimport { type McpTransport, StdioTransport } from \"../../mcp/stdio.js\";\nimport { StreamableHttpTransport } from \"../../mcp/streamable-http.js\";\nimport { appendUsage } from \"../../telemetry/usage.js\";\nimport { ToolRegistry } from \"../../tools.js\";\nimport { openTranscriptFile, recordFromLoopEvent, writeRecord } from \"../../transcript/log.js\";\nimport { formatMcpLifecycleEvent } from \"../ui/mcp-lifecycle.js\";\nimport { formatMcpSlowToast } from \"../ui/mcp-toast.js\";\n\nexport interface RunOptions {\n task: string;\n model: string;\n system: string;\n budgetUsd?: number;\n /** JSONL transcript path — lets `reasonix replay` / `diff` audit this run. */\n transcript?: string;\n /** Zero or more MCP server specs. Each: `\"name=cmd args...\"` or `\"cmd args...\"`. */\n mcp?: string[];\n /** Global prefix — only honored when a single anonymous server is given. */\n mcpPrefix?: 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 // Optional MCP setup — mirrors chat's flow. Must happen before loop\n // construction so the tools make it into the prefix.\n const requestedSpecs = opts.mcp ?? [];\n const clients: McpClient[] = [];\n let tools: ToolRegistry | undefined;\n let successCount = 0;\n const disabledNames = new Set(readConfig().mcpDisabled ?? []);\n if (requestedSpecs.length > 0) {\n tools = new ToolRegistry();\n for (const raw of requestedSpecs) {\n let label = \"anon\";\n let mcp: McpClient | undefined;\n try {\n const spec = parseMcpSpec(raw);\n label = spec.name ?? \"anon\";\n if (spec.name && disabledNames.has(spec.name)) {\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"disabled\", name: label })}\\n`);\n continue;\n }\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"handshake\", name: label })}\\n`);\n const t0 = Date.now();\n const prefix = spec.name\n ? `${spec.name}_`\n : requestedSpecs.length === 1 && opts.mcpPrefix\n ? opts.mcpPrefix\n : \"\";\n if (spec.transport === \"stdio\") preflightStdioSpec(spec);\n const transport: McpTransport =\n spec.transport === \"sse\"\n ? new SseTransport({ url: spec.url })\n : spec.transport === \"streamable-http\"\n ? new StreamableHttpTransport({ url: spec.url })\n : new StdioTransport({ command: spec.command, args: spec.args });\n mcp = new McpClient({ transport });\n await mcp.initialize();\n const bridge = await bridgeMcpTools(mcp, {\n registry: tools,\n namePrefix: prefix,\n serverName: label,\n onSlow: (info) =>\n process.stderr.write(\n `${formatMcpSlowToast({ name: info.serverName, p95Ms: info.p95Ms, sampleSize: info.sampleSize })}\\n`,\n ),\n });\n process.stderr.write(\n `${formatMcpLifecycleEvent({\n state: \"connected\",\n name: label,\n tools: bridge.registeredNames.length,\n ms: Date.now() - t0,\n })}\\n`,\n );\n clients.push(mcp);\n successCount++;\n } catch (err) {\n // Non-fatal — skip and continue, same as `reasonix chat`. A\n // one-shot `run` invocation with a broken MCP server otherwise\n // fails the whole run over a side-concern tool the task might\n // not even touch.\n await mcp?.close().catch(() => undefined);\n process.stderr.write(\n `${formatMcpLifecycleEvent({ state: \"failed\", name: label, reason: (err as Error).message })}\\n → run \\`reasonix setup\\` to remove broken entries from your saved config.\\n`,\n );\n }\n }\n if (successCount === 0) tools = undefined;\n }\n\n const client = new DeepSeekClient();\n const prefix = new ImmutablePrefix({\n system: opts.system,\n toolSpecs: tools?.specs(),\n });\n const loop = new CacheFirstLoop({\n client,\n prefix,\n tools,\n model: opts.model,\n budgetUsd: opts.budgetUsd,\n });\n const prefixHash = prefix.fingerprint;\n\n let transcriptStream: WriteStream | null = null;\n if (opts.transcript) {\n transcriptStream = openTranscriptFile(opts.transcript, {\n version: 1,\n source: \"reasonix run\",\n model: opts.model,\n startedAt: new Date().toISOString(),\n });\n // Also persist the user turn itself (the loop's event stream starts with\n // assistant output, not the prompt we're about to send).\n writeRecord(transcriptStream, {\n ts: new Date().toISOString(),\n turn: 1,\n role: \"user\",\n content: opts.task,\n });\n }\n\n try {\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 if (ev.role === \"assistant_final\" && ev.stats?.usage) {\n // `reasonix run` is often used in CI / scripting — we want\n // those turns to show up in `reasonix stats` too so the\n // dashboard reflects all DeepSeek spend, not just TUI sessions.\n appendUsage({ session: null, model: ev.stats.model, usage: ev.stats.usage });\n }\n // Persist every non-streaming event — deltas would flood the file and\n // aren't useful for replay (replay renders final content, not keystrokes).\n if (transcriptStream && ev.role !== \"assistant_delta\") {\n writeRecord(transcriptStream, recordFromLoopEvent(ev, { model: opts.model, prefixHash }));\n }\n }\n } finally {\n transcriptStream?.end();\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 if (opts.transcript) {\n process.stdout.write(`\\ntranscript: ${opts.transcript}\\n`);\n process.stdout.write(` → npx reasonix replay ${opts.transcript}\\n`);\n }\n\n for (const c of clients) await c.close();\n}\n"],"mappings":"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","names":["prefix"]}
1
+ {"version":3,"sources":["../../src/cli/commands/run.ts"],"sourcesContent":["import type { WriteStream } from \"node:fs\";\nimport { stdin, stdout } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport {\n defaultConfigPath,\n isPlausibleKey,\n loadApiKey,\n readConfig,\n saveApiKey,\n} from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\nimport { McpClient } from \"../../mcp/client.js\";\nimport { preflightStdioSpec } from \"../../mcp/preflight.js\";\nimport { bridgeMcpTools } from \"../../mcp/registry.js\";\nimport { parseMcpSpec } from \"../../mcp/spec.js\";\nimport { SseTransport } from \"../../mcp/sse.js\";\nimport { type McpTransport, StdioTransport } from \"../../mcp/stdio.js\";\nimport { StreamableHttpTransport } from \"../../mcp/streamable-http.js\";\nimport { appendUsage } from \"../../telemetry/usage.js\";\nimport { ToolRegistry } from \"../../tools.js\";\nimport { openTranscriptFile, recordFromLoopEvent, writeRecord } from \"../../transcript/log.js\";\nimport { formatMcpLifecycleEvent } from \"../ui/mcp-lifecycle.js\";\nimport { formatMcpSlowToast } from \"../ui/mcp-toast.js\";\n\nexport interface RunOptions {\n task: string;\n model: string;\n system: string;\n budgetUsd?: number;\n /** JSONL transcript path — lets `reasonix replay` / `diff` audit this run. */\n transcript?: string;\n /** Zero or more MCP server specs. Each: `\"name=cmd args...\"` or `\"cmd args...\"`. */\n mcp?: string[];\n /** Global prefix — only honored when a single anonymous server is given. */\n mcpPrefix?: 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 // Optional MCP setup — mirrors chat's flow. Must happen before loop\n // construction so the tools make it into the prefix.\n const requestedSpecs = opts.mcp ?? [];\n const clients: McpClient[] = [];\n let tools: ToolRegistry | undefined;\n let successCount = 0;\n const disabledNames = new Set(readConfig().mcpDisabled ?? []);\n if (requestedSpecs.length > 0) {\n tools = new ToolRegistry();\n for (const raw of requestedSpecs) {\n let label = \"anon\";\n let mcp: McpClient | undefined;\n try {\n const spec = parseMcpSpec(raw);\n label = spec.name ?? \"anon\";\n if (spec.name && disabledNames.has(spec.name)) {\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"disabled\", name: label })}\\n`);\n continue;\n }\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"handshake\", name: label })}\\n`);\n const t0 = Date.now();\n const prefix = spec.name\n ? `${spec.name}_`\n : requestedSpecs.length === 1 && opts.mcpPrefix\n ? opts.mcpPrefix\n : \"\";\n if (spec.transport === \"stdio\") preflightStdioSpec(spec);\n const transport: McpTransport =\n spec.transport === \"sse\"\n ? new SseTransport({ url: spec.url })\n : spec.transport === \"streamable-http\"\n ? new StreamableHttpTransport({ url: spec.url })\n : new StdioTransport({ command: spec.command, args: spec.args });\n mcp = new McpClient({ transport });\n await mcp.initialize();\n const bridge = await bridgeMcpTools(mcp, {\n registry: tools,\n namePrefix: prefix,\n serverName: label,\n onSlow: (info) =>\n process.stderr.write(\n `${formatMcpSlowToast({ name: info.serverName, p95Ms: info.p95Ms, sampleSize: info.sampleSize })}\\n`,\n ),\n });\n process.stderr.write(\n `${formatMcpLifecycleEvent({\n state: \"connected\",\n name: label,\n tools: bridge.registeredNames.length,\n ms: Date.now() - t0,\n })}\\n`,\n );\n clients.push(mcp);\n successCount++;\n } catch (err) {\n // Non-fatal — skip and continue, same as `reasonix chat`. A\n // one-shot `run` invocation with a broken MCP server otherwise\n // fails the whole run over a side-concern tool the task might\n // not even touch.\n await mcp?.close().catch(() => undefined);\n process.stderr.write(\n `${formatMcpLifecycleEvent({ state: \"failed\", name: label, reason: (err as Error).message })}\\n → run \\`reasonix setup\\` to remove broken entries from your saved config.\\n`,\n );\n }\n }\n if (successCount === 0) tools = undefined;\n }\n\n const client = new DeepSeekClient();\n const prefix = new ImmutablePrefix({\n system: opts.system,\n toolSpecs: tools?.specs(),\n });\n const loop = new CacheFirstLoop({\n client,\n prefix,\n tools,\n model: opts.model,\n budgetUsd: opts.budgetUsd,\n });\n const prefixHash = prefix.fingerprint;\n\n let transcriptStream: WriteStream | null = null;\n if (opts.transcript) {\n transcriptStream = openTranscriptFile(opts.transcript, {\n version: 1,\n source: \"reasonix run\",\n model: opts.model,\n startedAt: new Date().toISOString(),\n });\n // Also persist the user turn itself (the loop's event stream starts with\n // assistant output, not the prompt we're about to send).\n writeRecord(transcriptStream, {\n ts: new Date().toISOString(),\n turn: 1,\n role: \"user\",\n content: opts.task,\n });\n }\n\n try {\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 if (ev.role === \"assistant_final\" && ev.stats?.usage) {\n // `reasonix run` is often used in CI / scripting — we want\n // those turns to show up in `reasonix stats` too so the\n // dashboard reflects all DeepSeek spend, not just TUI sessions.\n appendUsage({ session: null, model: ev.stats.model, usage: ev.stats.usage });\n }\n // Persist every non-streaming event — deltas would flood the file and\n // aren't useful for replay (replay renders final content, not keystrokes).\n if (transcriptStream && ev.role !== \"assistant_delta\") {\n writeRecord(transcriptStream, recordFromLoopEvent(ev, { model: opts.model, prefixHash }));\n }\n }\n } finally {\n transcriptStream?.end();\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 if (opts.transcript) {\n process.stdout.write(`\\ntranscript: ${opts.transcript}\\n`);\n process.stdout.write(` → npx reasonix replay ${opts.transcript}\\n`);\n }\n\n for (const c of clients) await c.close();\n}\n"],"mappings":"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","names":["prefix"]}
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-Q6YFXW7H.js";
2
+ import "./chunk-G7M3QWEN.js";
3
3
  import "./chunk-I6YIAK6C.js";
4
4
  import "./chunk-XJLZ4HKU.js";
5
5
  import "./chunk-XHQIK7B6.js";
6
6
  import "./chunk-6TMHAK5D.js";
7
+ import "./chunk-DAEAAVDF.js";
7
8
  import "./chunk-KMWKGPFZ.js";
8
9
  import "./chunk-3Q3C4W66.js";
9
10
  import "./chunk-W4LDFAZ6.js";
@@ -99,4 +100,4 @@ function truncate(s, max) {
99
100
  export {
100
101
  sessionsCommand
101
102
  };
102
- //# sourceMappingURL=sessions-MOJAALJI.js.map
103
+ //# sourceMappingURL=sessions-3XU2GGHX.js.map