omnexx 0.11.2 → 0.11.3

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.
@@ -34,7 +34,7 @@ function text(c, key) {
34
34
  return v;
35
35
  }
36
36
  async function serveChat(io, runCli, opts) {
37
- const { Session } = await import("./session-D4JHZJSQ.js");
37
+ const { Session } = await import("./session-OORM43WG.js");
38
38
  const session = new Session(io, runCli);
39
39
  const write = (msg) => {
40
40
  println(io.stdout, JSON.stringify(msg));
@@ -299,4 +299,4 @@ async function serveChat(io, runCli, opts) {
299
299
  export {
300
300
  serveChat
301
301
  };
302
- //# sourceMappingURL=chat-server-ILVKG5TB.js.map
302
+ //# sourceMappingURL=chat-server-HFGPZ7RU.js.map
@@ -26,7 +26,7 @@ import {
26
26
  toolSpec,
27
27
  transcriptFor,
28
28
  workerTools
29
- } from "./chunk-MNTMFQJV.js";
29
+ } from "./chunk-IGUI6IJP.js";
30
30
  import {
31
31
  RunStore,
32
32
  git,
@@ -793,4 +793,4 @@ export {
793
793
  resolveModelLenient,
794
794
  CodeChat
795
795
  };
796
- //# sourceMappingURL=chunk-WXO45ZPF.js.map
796
+ //# sourceMappingURL=chunk-3Y7NVLVI.js.map
@@ -56,7 +56,7 @@ import {
56
56
  withoutVendored,
57
57
  workerTools,
58
58
  writeIntentTool
59
- } from "./chunk-MNTMFQJV.js";
59
+ } from "./chunk-IGUI6IJP.js";
60
60
  import {
61
61
  RunStore,
62
62
  applyPlanUpdate,
@@ -5864,4 +5864,4 @@ export {
5864
5864
  EventTail,
5865
5865
  LiveFeed
5866
5866
  };
5867
- //# sourceMappingURL=chunk-3KIPB3HQ.js.map
5867
+ //# sourceMappingURL=chunk-6U3WB5AL.js.map
@@ -14,7 +14,7 @@ import {
14
14
  humanize,
15
15
  pickRun,
16
16
  supervisorAlive
17
- } from "./chunk-3KIPB3HQ.js";
17
+ } from "./chunk-6U3WB5AL.js";
18
18
  import {
19
19
  connect,
20
20
  connectFromEnv,
@@ -27,14 +27,14 @@ import {
27
27
  CodeChat,
28
28
  attachImages,
29
29
  resolveModelLenient
30
- } from "./chunk-WXO45ZPF.js";
30
+ } from "./chunk-3Y7NVLVI.js";
31
31
  import {
32
32
  emptyTelemetry,
33
33
  fold,
34
34
  parseFrontmatter,
35
35
  resolveRunDeps,
36
36
  todoItemsOf
37
- } from "./chunk-MNTMFQJV.js";
37
+ } from "./chunk-IGUI6IJP.js";
38
38
  import {
39
39
  RunStore,
40
40
  compactPlanView,
@@ -542,6 +542,11 @@ ${args}` : cmd.template;
542
542
  }
543
543
 
544
544
  // src/tui/session.ts
545
+ function looksLikeError(line) {
546
+ const leads = /^\s*(?:error|✗|fatal|warning|refused)\b/i;
547
+ const says = /\b(?:error|failed|cannot|can't|not found|denied|invalid)\b/i;
548
+ return leads.test(line) || says.test(line);
549
+ }
545
550
  var SLASH = [
546
551
  {
547
552
  name: "model",
@@ -836,7 +841,8 @@ var Session = class {
836
841
  write: (chunk, _enc, cb) => {
837
842
  const s = chunk.toString();
838
843
  if (kind === "out") out += s;
839
- this.push(kind, s);
844
+ for (const line of s.split("\n").filter((l) => l.trim()))
845
+ this.push(kind === "err" && !looksLikeError(line) ? "system" : kind, line);
840
846
  cb();
841
847
  }
842
848
  });
@@ -1744,10 +1750,11 @@ export {
1744
1750
  timeLabel,
1745
1751
  AutoTimePicker,
1746
1752
  MarkdownLine,
1753
+ looksLikeError,
1747
1754
  SLASH,
1748
1755
  MORE_SLASH,
1749
1756
  AUTONOMOUS_DEFAULT_GOAL,
1750
1757
  Session,
1751
1758
  helpText
1752
1759
  };
1753
- //# sourceMappingURL=chunk-GIL6EOVE.js.map
1760
+ //# sourceMappingURL=chunk-FLIPPDUD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tui/auto-setup.tsx","../src/tui/session.ts","../src/cli/commands/steer.ts","../src/tui/chat.ts","../src/tui/markdown.tsx","../src/tui/diff.tsx","../src/tui/agents.tsx","../src/tui/commands.ts"],"sourcesContent":["import { Box, Text } from 'ink';\nimport { parseDuration } from '../config/duration.js';\nimport { CYAN, GRAY, GREEN } from './colors.js';\n\n/**\n * The guided way into an autonomous run: pick how long it works (or type a time), then say what\n * to work on (or nothing: keep improving the repo). `/autonomous` with no arguments opens it.\n */\nexport const AUTO_TIMES: readonly { label: string; value: string }[] = [\n { label: '30 minutes', value: '30m' },\n { label: '1 hour', value: '1h' },\n { label: '2 hours', value: '2h' },\n { label: '4 hours', value: '4h' },\n { label: '8 hours · a workday', value: '8h' },\n { label: '12 hours · overnight', value: '12h' },\n { label: '24 hours', value: '24h' },\n { label: 'custom…', value: '' },\n];\n\n/** `goal` is set when the person typed one before picking the time. */\nexport type AutoSetup =\n | { step: 'time'; cursor: number; goal?: string }\n | { step: 'custom'; goal?: string }\n | { step: 'goal'; time: string };\n\n/** A typed time (\"90m\", \"3h\", \"1d\", \"1h30m\", or a bare number of hours), or undefined. */\nexport function readTime(text: string): string | undefined {\n const t = text.trim().toLowerCase().replace(/\\s+/g, '');\n const value = /^\\d+(\\.\\d+)?$/.test(t) ? `${t}h` : t;\n try {\n return parseDuration(value) >= 60_000 ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** \"8h\" → \"8 hours\", \"90m\" → \"90 minutes\". */\nexport function timeLabel(value: string): string {\n const known = AUTO_TIMES.find((t) => t.value === value);\n if (known) return known.label.split(' · ')[0] ?? value;\n const m = /^(\\d+(?:\\.\\d+)?)(m|h|d)$/.exec(value);\n if (!m) return value;\n const unit = { m: 'minute', h: 'hour', d: 'day' }[m[2] as 'm' | 'h' | 'd'];\n return `${m[1] ?? ''} ${unit}${m[1] === '1' ? '' : 's'}`;\n}\n\nexport function AutoTimePicker({ state, width }: { state: AutoSetup; width: number }) {\n if (state.step !== 'time') return null;\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={GREEN} paddingX={1} width={width}>\n <Text>\n <Text color={GREEN} bold>\n autonomous run · how long should it work?\n </Text>\n <Text color={GRAY}>{' ↑↓ or 1-8 · enter choose · esc cancel'}</Text>\n </Text>\n {AUTO_TIMES.map((t, i) => (\n <Text key={t.label} inverse={i === state.cursor}>\n <Text color={i === state.cursor ? CYAN : GRAY}>{`${String(i + 1)} `}</Text>\n <Text>{t.label}</Text>\n </Text>\n ))}\n <Text color={GRAY}>\n next: what it should work on. It plans, works, checks every change, and stops at the time.\n </Text>\n </Box>\n );\n}\n","import { AUTO_TIMES, readTime, timeLabel, type AutoSetup } from './auto-setup.js';\nimport { join } from 'node:path';\nimport { loadConfig } from '../config/load.js';\nimport { Writable } from 'node:stream';\nimport { parse } from 'shell-quote';\nimport { brand, type Brand } from '../cli/brand.js';\nimport type { CliIO } from '../cli/io.js';\nimport { pickRun, supervisorAlive } from '../cli/commands/control.js';\nimport { steerRun } from '../cli/commands/steer.js';\nimport { git } from '../git/git.js';\nimport {\n connect,\n connectFromEnv,\n describeConnect,\n envKeys,\n findKeyInText,\n looksLikeKey,\n type EnvKey,\n} from '../cli/connect.js';\nimport { maskKey } from '../auth/keys.js';\nimport { Chat, defaultChatRef, hasProvider } from './chat.js';\nimport { CodeChat, type BrowserFrame, type ChatLine, type HelperEvent } from './code-chat.js';\nimport { todoItemsOf, type TodoItem } from '../tools/todo.js';\nimport { classifyMarkdown, type MdKind } from './markdown.js';\nimport { parseDiff, type DiffViewState } from './diff.js';\nimport { loadAgents, type AgentsState } from './agents.js';\nimport { attachImages } from './attach.js';\nimport { commandDirs, expandCommand, loadCustomCommands, type CustomCommand } from './commands.js';\nimport type { Mood } from './mascot.js';\nimport {\n filterChoices,\n loadModelChoices,\n type ModelPickerState,\n type RankState,\n} from './model-picker.js';\nimport {\n POOL_MODES,\n readPoolMode,\n readRanking,\n writePoolMode,\n writeRanking,\n} from '../config/ranking.js';\nimport { QuotaLedger } from '../providers/quota-ledger.js';\nimport { compactPlanView, planCounts } from '../core/plan.js';\nimport { resolvePaths } from '../core/paths.js';\nimport { listRunIds, RunStore } from '../core/run-store.js';\nimport { describeError } from '../errors.js';\nimport { emptyTelemetry, fold, type Telemetry } from '../telemetry/aggregate.js';\nimport { EventTail } from '../telemetry/feed.js';\nimport { humanize, type Verbosity } from '../telemetry/humanize.js';\n\n/** A stderr line that reports a failure, as opposed to a note about what the CLI did. */\nexport function looksLikeError(line: string): boolean {\n const leads = /^\\s*(?:error|✗|fatal|warning|refused)\\b/i;\n const says = /\\b(?:error|failed|cannot|can't|not found|denied|invalid)\\b/i;\n return leads.test(line) || says.test(line);\n}\n\nexport type EntryKind = 'feed' | 'out' | 'err' | 'user' | 'system' | 'act' | 'think';\nexport interface Entry {\n id: number;\n kind: EntryKind;\n text: string;\n /** Model replies render as markdown, line by line. */\n md?: MdKind;\n}\n\nexport interface Helper {\n id: number;\n kind: string;\n /** The agent card's name, when a named agent took the work. */\n agent?: string;\n description: string;\n status: 'working' | 'done' | 'stopped';\n turns: number;\n usd: number;\n startedAt: number;\n finishedAt?: number;\n}\n\nexport type RunCli = (argv: readonly string[], io: CliIO) => Promise<number>;\n\nexport interface SlashCommand {\n name: string;\n args?: string;\n help: string;\n}\n\n/** Built-in slash commands; anything else after `/` runs the CLI command of that name. */\nexport const SLASH: readonly SlashCommand[] = [\n {\n name: 'model',\n args: '[model|url|key]',\n help: 'pick the chat model, or add an API key or endpoint',\n },\n {\n name: 'models',\n help: 'your model pool: tick models, pick top-first or random, each runs until its quota is out',\n },\n { name: 'agents', help: 'every long run on this machine: watch, attach, pause, stop' },\n { name: 'yolo', help: 'approve every \"allow this?\" question automatically (toggle)' },\n { name: 'card', help: 'show or hide the live run card (health, progress, models, quota)' },\n { name: 'pause', help: 'pause the agent after its current step (/resume to continue)' },\n { name: 'resume', help: 'continue where the agent paused' },\n { name: 'stop', help: 'stop the agent now (same as esc)' },\n { name: 'diff', help: 'browse what changed' },\n {\n name: 'autonomous',\n help: 'work on its own for a set time: pick how long, then the goal (or /autonomous 8h [goal])',\n },\n { name: 'go', help: 'plan mode: approve the plan and carry it out' },\n { name: 'undo', help: 'put the files back as they were before the last message' },\n { name: 'skills', help: 'skills omnexx can use; /skills add <path|git-url>' },\n {\n name: 'apps',\n help: 'connect apps: /apps lists them, /apps notion signs in, /apps github --set Authorization=<token>',\n },\n { name: 'mcp', help: 'MCP servers: /mcp add <name>, /mcp search <q>, /mcp import' },\n { name: 'cards', help: 'agent cards: local helpers and remote A2A agents; /cards add <url>' },\n { name: 'compact', help: 'summarize the conversation to free up context' },\n { name: 'clear', help: 'start a fresh conversation' },\n { name: 'help', help: 'this list' },\n { name: 'quit', help: 'leave omnexx (a long run keeps going)' },\n];\n\n/** Still work when typed, but kept out of the menu: long-run plumbing and rarely needed tools. */\nexport const MORE_SLASH = [\n 'run <goal>',\n 'plan',\n 'status',\n 'report',\n 'runs',\n 'attach',\n 'detach',\n 'steer',\n 'connect',\n 'setup',\n 'init',\n 'doctor',\n];\n\nexport type Mode = 'chat' | 'plan' | 'run';\n\n/** `/autonomous 8h` with no goal. */\nexport const AUTONOMOUS_DEFAULT_GOAL =\n 'Improve this repository: fix bugs, add missing tests, harden error handling, speed up slow paths, and clean up real duplication. Keep everything working.';\n\nconst MODE_INTRO: Record<Mode, string> = {\n chat: 'chat mode: each message is worked on right here in your checkout; checks run after edits',\n plan: 'plan mode: the agent investigates and proposes a plan without changing anything; /go to carry it out',\n run: 'run mode: your text starts a long run, or steers the live one',\n};\n\nconst NEXT_MODE: Record<Mode, Mode> = { chat: 'plan', plan: 'run', run: 'chat' };\n\n/** Commands that never return or need the real terminal. */\nconst BLOCKED = new Set(['supervise', 'service']);\nconst MAX_ENTRIES = 5_000;\n\n/**\n * Everything the TUI does, without React: a transcript of entries, the attached run's live\n * telemetry and plan, and slash commands that reuse the real CLI with its output captured.\n */\nconst POOL_LABEL = { ordered: 'top first', random: 'random order', smart: 'Nimble picks' } as const;\n\nexport class Session {\n entries: Entry[] = [];\n telemetry: Telemetry = emptyTelemetry();\n runId: string | undefined;\n runAlive = false;\n plan = '';\n /** Phase and task progress of the attached run, refreshed with the plan. */\n info: { phase: string; done: number; tasks: number } | undefined;\n busy: string | undefined;\n verbosity: Verbosity = 'normal';\n quit = false;\n chat: Chat | undefined;\n /** What plain text does: start or steer a long run, or code turn by turn. */\n mode: Mode = 'chat';\n /** A y/n question from chat mode waiting on the person (permission to go past a guard). */\n pending: { question: string; resolve: (yes: boolean) => void } | undefined;\n private code: CodeChat | undefined;\n private opening: Promise<CodeChat> | undefined;\n /** Model chosen with /model before the chat opened. */\n private chatModel: string | undefined;\n /** The chat reply as it streams in; moves into the transcript when it lands. */\n live = '';\n /** The agent's checklist for the current request (the todo tool). */\n todos: TodoItem[] = [];\n /** The agent's browser after its latest page-changing action; `seq` grows with each frame. */\n browserFrame: (BrowserFrame & { seq: number; at: number }) | undefined;\n /** Helpers (subagents) started for the current message, in start order. */\n helpers: Helper[] = [];\n /** OMNEXX_NO_MASCOT=1 hides the animated character. */\n readonly mascot: boolean;\n readonly history: string[] = [];\n\n private nextId = 0;\n private tail: EventTail | undefined;\n private listeners = new Set<() => void>();\n private lastPlanAt = 0;\n private readonly b: Brand;\n\n constructor(\n private readonly io: CliIO,\n private readonly runCli: RunCli,\n private readonly now: () => number = Date.now,\n ) {\n this.b = brand({ env: io.env, isTTY: true });\n this.mascot = !io.env.OMNEXX_NO_MASCOT;\n this.nex = { mood: 'hello', at: now(), say: '' };\n this.lastActivity = now();\n }\n\n onChange(fn: () => void): () => void {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n\n private changed(): void {\n for (const fn of this.listeners) fn();\n }\n\n /** `markdown` marks a model's reply; command output (diffs, logs) is never reinterpreted. */\n push(kind: EntryKind, text: string, opts: { markdown?: boolean } = {}): void {\n const lines = text.replace(/\\n$/, '').split('\\n');\n const md = opts.markdown ? classifyMarkdown(lines) : undefined;\n for (const [i, line] of lines.entries()) {\n const m = md?.[i];\n this.entries.push({ id: this.nextId++, kind, text: line, ...(m ? { md: m } : {}) });\n }\n if (this.entries.length > MAX_ENTRIES) this.entries = this.entries.slice(-MAX_ENTRIES);\n this.changed();\n }\n\n /** No provider yet but Ollama is running locally: connect it, so the first chat just works. */\n private async autoOllama(): Promise<boolean> {\n const { ollamaModels, pickOllamaModel } = await import('../cli/ollama.js');\n const model = pickOllamaModel((await ollamaModels(this.io.fetch ?? fetch)) ?? []);\n if (!model) return false;\n try {\n await connect(this.io, 'ollama');\n } catch {\n return false;\n }\n this.chatModel ??= `ollama:${model}`;\n this.push(\n 'system',\n `found Ollama running locally: chatting with ollama:${model} (free). /model to switch`,\n );\n return true;\n }\n\n /** First-run hint: with no provider set up, say how to add one before anything else. */\n async greet(firstRun = false): Promise<void> {\n const { config } = await loadConfig({ cwd: this.io.cwd, env: this.io.env }).catch(() => ({\n config: undefined,\n }));\n if (config?.policy.auto_approve) this.autoApprove = true;\n let ready = await hasProvider(this.io).catch(() => true);\n if (!ready) ready = await this.autoOllama();\n if (ready && !firstRun) return;\n const found = await envKeys(this.io).catch(() => [] as EnvKey[]);\n const model = ready\n ? ['1. a model: you have one. /model to switch or add more, /models to rank them']\n : [\n '1. a model (pick any):',\n ...(found.length\n ? [\n ` /connect env use the keys already in your environment: ${found.map((k) => k.label).join(', ')}`,\n ]\n : []),\n ' paste an API key OpenAI, Gemini, xAI, Groq, OpenRouter, Mistral, NVIDIA, … are recognised',\n ' /connect ollama a free local model (also lmstudio, vllm, llamacpp, jan)',\n ' /model browse providers, or add any OpenAI-compatible URL',\n ];\n this.push(\n 'system',\n [\n firstRun\n ? 'welcome to omnexx: an agent that works in this folder and keeps going until your checks pass'\n : 'no model set up yet',\n '',\n ...model,\n '2. ask: type what you want built or fixed. shift+tab: plan first, or a long unattended run',\n '3. review: /diff shows what changed, /undo takes it back, /help lists everything',\n ].join('\\n'),\n );\n }\n\n /** Attach to the newest run if its supervisor is still alive (reopening the TUI mid-run). */\n async resumeLatest(): Promise<void> {\n const ids = await listRunIds(resolvePaths(this.io.env));\n const id = ids.at(-1);\n if (!id) return;\n if (await supervisorAlive(new RunStore(resolvePaths(this.io.env), id))) await this.attach(id);\n }\n\n async attach(runId?: string): Promise<void> {\n const store = await pickRun(resolvePaths(this.io.env), runId);\n this.runId = store.runId;\n this.tail = new EventTail(store.eventsPath);\n this.telemetry = emptyTelemetry();\n this.plan = '';\n this.lastPlanAt = 0;\n this.push('system', `attached to ${store.runId}`);\n await this.poll();\n }\n\n detach(): void {\n if (!this.runId) return;\n this.push(\n 'system',\n `detached from ${this.runId}; it keeps running (\\`omnexx watch\\` to return)`,\n );\n this.runId = undefined;\n this.tail = undefined;\n this.runAlive = false;\n this.plan = '';\n this.changed();\n }\n\n /** The live run card under the transcript (toggle with /card). */\n showRunCard = true;\n\n /** Nex narrates the moments of an autonomous run that matter. */\n private reactToRun(e: { type: string; [k: string]: unknown }): void {\n const model = (v: unknown): string =>\n typeof v === 'string' ? (v.split(':').pop() ?? v) : 'that model';\n switch (e.type) {\n case 'provider.quota_exhausted':\n this.react('sad', `${model(e.model)} is out of quota, next one!`);\n break;\n case 'provider.failover':\n this.react('startled', `${model(e.model ?? e.provider)} hiccuped, switching`);\n break;\n case 'milestone.done':\n this.react('happy', 'milestone done! ✨');\n break;\n case 'task.done':\n this.react('happy', 'task done!');\n break;\n case 'ladder.rung':\n this.react('startled', 'trying a different angle');\n break;\n case 'run.finish':\n this.react(e.status === 'finished' ? 'happy' : 'sad', `run ${String(e.status)}`);\n break;\n }\n }\n\n /** Every 10 minutes of an attached run: one line on what happened since the last one. */\n private digestAt = 0;\n private digestBase = { commits: 0, rejects: 0, failovers: 0, done: 0 };\n private digest(): void {\n const now = this.now();\n if (!this.digestAt) {\n this.digestAt = now;\n return;\n }\n if (now - this.digestAt < 10 * 60_000) return;\n const t = this.telemetry;\n const b = this.digestBase;\n const done = this.info?.done ?? 0;\n const parts = [\n `${t.commits - b.commits} commit${t.commits - b.commits === 1 ? '' : 's'}`,\n `${t.rejects - b.rejects} rejected`,\n `${done - b.done} task${done - b.done === 1 ? '' : 's'} done`,\n t.failovers > b.failovers ? `${t.failovers - b.failovers} model switches` : undefined,\n t.quotaOut.length\n ? `out of quota: ${t.quotaOut.map((r) => r.split(':').pop()).join(', ')}`\n : undefined,\n ].filter(Boolean);\n this.push(\n 'system',\n `last ${Math.round((now - this.digestAt) / 60_000)}m: ${parts.join(' · ')}${this.info ? ` · ${this.info.done}/${this.info.tasks} tasks overall` : ''}`,\n );\n this.digestAt = now;\n this.digestBase = { commits: t.commits, rejects: t.rejects, failovers: t.failovers, done };\n }\n\n /** Pull new events into the feed and refresh liveness and the plan (every ~2 s). */\n async poll(): Promise<void> {\n if (!this.tail || !this.runId) return;\n const events = await this.tail.read();\n for (const e of events) {\n fold(this.telemetry, e);\n this.trackRunTodos(e);\n const line = humanize(e, { brand: this.b, verbosity: this.verbosity });\n if (line) this.push('feed', line);\n this.reactToRun(e);\n }\n this.digest();\n if (this.now() - this.lastPlanAt > 2_000) {\n this.lastPlanAt = this.now();\n const store = new RunStore(resolvePaths(this.io.env), this.runId);\n this.runAlive = await supervisorAlive(store);\n const [plan, state] = await Promise.all([\n store.readPlan().catch(() => undefined),\n store.readState().catch(() => undefined),\n ]);\n this.plan = plan ? compactPlanView(plan, state?.taskId) : '';\n const c = plan ? planCounts(plan) : undefined;\n this.info = state\n ? { phase: state.phase, done: c?.done ?? 0, tasks: c?.tasks ?? 0 }\n : undefined;\n this.changed();\n } else if (events.length) {\n this.changed();\n }\n }\n\n /** An attached run's worker checklist: replaced on each update, cleared when a new task starts. */\n private trackRunTodos(e: { type: string; [k: string]: unknown }): void {\n if (e.type === 'cycle.start') this.todos = [];\n else if (e.type === 'todo.update') this.todos = todoItemsOf({ items: e.items }) ?? this.todos;\n }\n\n /** Run a CLI command with its output captured into the transcript. */\n async cli(\n argv: readonly string[],\n label = argv.join(' '),\n ): Promise<{ code: number; out: string }> {\n let out = '';\n const sink = (kind: EntryKind): Writable =>\n new Writable({\n write: (chunk: Buffer | string, _enc, cb) => {\n const s = chunk.toString();\n if (kind === 'out') out += s;\n // CLI notes go to stderr too (\"started a git repository\"); only real errors are red.\n for (const line of s.split('\\n').filter((l) => l.trim()))\n this.push(kind === 'err' && !looksLikeError(line) ? 'system' : kind, line);\n cb();\n },\n });\n const captured: CliIO = { ...this.io, stdout: sink('out'), stderr: sink('err'), isTTY: false };\n this.busy = label;\n this.changed();\n try {\n const code = await this.runCli(argv, captured);\n return { code, out };\n } finally {\n this.busy = undefined;\n this.changed();\n }\n }\n\n /** Plain text starts a run, or steers the attached live run. `/x` is a command. */\n async submit(raw: string): Promise<void> {\n const text = raw.trim();\n const pending = this.pending;\n if (pending) {\n const yes = /^y(es)?$/i.test(text);\n this.pending = undefined;\n this.push('system', `${yes ? 'allowed' : 'refused'}: ${pending.question}`);\n pending.resolve(yes);\n return;\n }\n // Setting up an autonomous run: an empty goal is a real answer (keep improving the repo).\n if (this.autoSetup && this.autoSetup.step !== 'time') {\n await this.autoInput(text);\n return;\n }\n if (!text) return;\n const awaiting = this.awaiting;\n if (awaiting) {\n // The picker asked for a key or endpoint: connect it, then show its models.\n this.awaiting = undefined;\n const words = text.split(/\\s+/);\n const at = words.indexOf('--name');\n const name = at >= 0 ? words[at + 1] : undefined;\n const rest = at >= 0 ? words.filter((_, i) => i !== at && i !== at + 1) : words;\n this.push('user', awaiting === 'key' ? maskKey(text) : text.replace(/\\s(\\S{20,})/, ' ••••'));\n try {\n await this.connect(rest[0] ?? '', rest[1], name);\n await this.openModelPicker();\n } catch (err) {\n this.push('err', describeError(err));\n }\n return;\n }\n // A key inside a sentence (\"my groq key is gsk_…\"): connect it, and keep it out of the chat.\n const found = !text.startsWith('/') && !looksLikeKey(text) ? findKeyInText(text) : undefined;\n if (found) {\n this.push('user', text.replace(found.key, maskKey(found.key)));\n if (found.provider)\n await this.connect(found.provider, found.key).catch((err: unknown) => {\n this.push('err', describeError(err));\n });\n else {\n this.pendingKey = found.key;\n this.push(\n 'system',\n `that looks like an API key. which provider is it for? (e.g. ${['mistral', 'together', 'deepinfra'].join(', ')}; /providers lists all)`,\n );\n }\n return;\n }\n if (this.pendingKey && /^[a-z][a-z0-9_-]*$/i.test(text.trim())) {\n const key = this.pendingKey;\n this.pendingKey = undefined;\n this.push('user', text);\n await this.connect(text.trim().toLowerCase(), key).catch((err: unknown) => {\n this.push('err', describeError(err));\n });\n return;\n }\n this.pendingKey = undefined;\n // A pasted key is never echoed, kept in history, or sent anywhere but the credentials file.\n const key = looksLikeKey(text);\n if (!key) this.history.push(text);\n this.push('user', key ? maskKey(text) : this.chat ? this.chat.redact(text) : text);\n try {\n if (text.startsWith('/')) await this.slash(text.slice(1));\n else if (key && !this.chat) await this.connect(text);\n else if (this.chat) await this.talk(text);\n else if (this.mode === 'chat' || this.mode === 'plan') await this.code_(text);\n else if (this.runId && this.runAlive) await this.steer(text);\n else await this.startRun(text);\n } catch (err) {\n this.push('err', describeError(err));\n }\n }\n\n private async connect(target: string, key?: string, name?: string): Promise<void> {\n this.busy = 'connecting';\n this.changed();\n try {\n this.push(\n 'system',\n describeConnect(await connect(this.io, target, key, name ? { name } : {})),\n );\n } finally {\n this.busy = undefined;\n this.changed();\n }\n }\n\n private async talk(text: string): Promise<void> {\n const chat = this.chat;\n if (!chat) return;\n this.busy = chat.ref;\n this.changed();\n try {\n await chat.send(text, (line) => {\n this.push('out', line, { markdown: true });\n });\n } finally {\n this.busy = undefined;\n this.changed();\n }\n }\n\n /** Session toggles (/yolo, /card): handled outside the big command switch. */\n private toggle(cmd: string): boolean {\n if (cmd === 'yolo') {\n this.autoApprove = !this.autoApprove;\n if (this.autoApprove && this.pending) {\n this.pending.resolve(true);\n this.pending = undefined;\n }\n this.push(\n 'system',\n this.autoApprove\n ? 'auto-approve on: guard questions get a yes (hard-denied commands stay denied)'\n : 'auto-approve off: you will be asked again',\n );\n return true;\n }\n if (cmd === 'card') {\n this.showRunCard = !this.showRunCard;\n this.push('system', `run card ${this.showRunCard ? 'on' : 'off'}`);\n return true;\n }\n return false;\n }\n\n /** Say yes to every guard question (config policy.auto_approve, or /yolo). */\n autoApprove = false;\n\n /** Chat mode asks the person before going past a guard; the TUI shows it above the input. */\n ask(question: string): Promise<boolean> {\n if (this.autoApprove) {\n const q = question.trimEnd();\n this.push('system', `auto-approved: ${q.endsWith('[y/N]') ? q.slice(0, -5).trimEnd() : q}`);\n return Promise.resolve(true);\n }\n return new Promise((resolve) => {\n this.pending = { question, resolve };\n this.changed();\n });\n }\n\n setMode(mode: Mode): void {\n this.mode = mode;\n this.push('system', MODE_INTRO[mode]);\n }\n\n /** shift+tab: chat → plan → run → chat. */\n nextMode(): void {\n this.setMode(NEXT_MODE[this.mode]);\n }\n\n /** Nex's latest reaction and what it says; the TUI turns this into a mood each tick. */\n nex: { mood: Mood; at: number; say: string } = { mood: 'hello', at: 0, say: '' };\n /** The last time anything happened (typing, output), for Nex dozing off. */\n lastActivity = 0;\n\n react(mood: Mood, say = ''): void {\n this.nex = { mood, at: this.now(), say };\n this.lastActivity = this.now();\n }\n\n /** The person is typing: Nex wakes up and listens. */\n touch(): void {\n this.lastActivity = this.now();\n }\n\n /** The open /model picker; it takes over the keys until closed. */\n modelPicker: ModelPickerState | undefined;\n /** The picker asked for a key or URL: the next message is that, not a chat message. */\n awaiting: 'key' | 'url' | undefined;\n\n /** A key found without a provider name: the next one-word message names its provider. */\n private pendingKey: string | undefined;\n\n /** The open /models ranking editor. */\n rankView: RankState | undefined;\n /** `/autonomous` with no arguments: picking the time, then the goal. */\n autoSetup: AutoSetup | undefined;\n\n openAutoSetup(): void {\n this.autoSetup = { step: 'time', cursor: 4 };\n this.changed();\n }\n\n /** Keys while the time list is open. */\n autoKey(k: {\n up?: boolean;\n down?: boolean;\n enter?: boolean;\n close?: boolean;\n pick?: number;\n }): void {\n const a = this.autoSetup;\n if (a?.step !== 'time') return;\n if (k.close) {\n this.autoSetup = undefined;\n this.push('system', 'autonomous run cancelled');\n } else if (k.up) a.cursor = Math.max(0, a.cursor - 1);\n else if (k.down) a.cursor = Math.min(AUTO_TIMES.length - 1, a.cursor + 1);\n else if (k.enter || k.pick !== undefined) {\n const choice = AUTO_TIMES[k.pick ?? a.cursor];\n if (!choice) return;\n const goal = a.goal === undefined ? {} : { goal: a.goal };\n if (!choice.value) this.autoSetup = { step: 'custom', ...goal };\n else if (a.goal !== undefined) void this.launchAuto(choice.value, a.goal);\n else this.autoSetup = { step: 'goal', time: choice.value };\n }\n this.changed();\n }\n\n private async launchAuto(time: string, goal: string): Promise<void> {\n this.autoSetup = undefined;\n this.push('system', `autonomous run for ${timeLabel(time)}`);\n try {\n await this.startRun(goal || AUTONOMOUS_DEFAULT_GOAL, ['--for', time]);\n } catch (err) {\n this.push('err', describeError(err));\n }\n }\n\n /** A message typed while setting up an autonomous run: the custom time, or the goal. */\n private async autoInput(text: string): Promise<void> {\n const a = this.autoSetup;\n if (a?.step === 'custom') {\n const time = readTime(text);\n if (!time) {\n this.push('err', `\"${text}\" isn't a time: try 90m, 3h, 1d or 1h30m`);\n return;\n }\n if (a.goal !== undefined) await this.launchAuto(time, a.goal);\n else {\n this.autoSetup = { step: 'goal', time };\n this.changed();\n }\n return;\n }\n if (a?.step !== 'goal') return;\n this.push('user', text || '(keep improving the repo)');\n await this.launchAuto(a.time, text);\n }\n /** What choosing in the picker does: switch chat, or add to the ranking. */\n private pickFor: 'chat' | 'rank' = 'chat';\n\n async openRanking(): Promise<void> {\n this.rankView = await this.rankState(0);\n this.changed();\n }\n\n private async rankState(cursor: number): Promise<RankState> {\n const paths = resolvePaths(this.io.env);\n const ranked = await readRanking(paths);\n const out = new QuotaLedger(join(paths.configHome, 'quota.json')).all();\n return {\n ranked,\n mode: await readPoolMode(paths),\n exhausted: new Set(Object.keys(out)),\n cursor: Math.min(cursor, Math.max(0, ranked.length - 1)),\n grabbed: false,\n };\n }\n\n /** Keys while the ranking editor is open; every change is saved to models.json at once. */\n async rankKey(k: {\n up?: boolean;\n down?: boolean;\n grab?: boolean;\n add?: boolean;\n remove?: boolean;\n mode?: boolean;\n close?: boolean;\n }): Promise<void> {\n const v = this.rankView;\n if (!v) return;\n const move = (d: number): void => {\n const to = v.cursor + d;\n if (to < 0 || to >= v.ranked.length) return;\n if (v.grabbed) {\n const [it] = v.ranked.splice(v.cursor, 1);\n if (it) v.ranked.splice(to, 0, it);\n }\n v.cursor = to;\n };\n if (k.close) {\n this.rankView = undefined;\n this.push(\n 'system',\n v.ranked.length\n ? `pool saved (${POOL_LABEL[v.mode]}): ${v.ranked.map((r, i) => `${i + 1}. ${r}`).join(' ')}. new chats and runs use it; /model switches this chat`\n : 'no ranking: roles use your config.toml models',\n );\n } else if (k.up) move(-1);\n else if (k.down) move(1);\n else if (k.mode) {\n v.mode = POOL_MODES[(POOL_MODES.indexOf(v.mode) + 1) % POOL_MODES.length] ?? 'ordered';\n await writePoolMode(resolvePaths(this.io.env), v.mode);\n } else if (k.grab) v.grabbed = !v.grabbed && v.ranked.length > 0;\n else if (k.remove) {\n v.ranked.splice(v.cursor, 1);\n v.cursor = Math.max(0, Math.min(v.cursor, v.ranked.length - 1));\n v.grabbed = false;\n } else if (k.add) {\n this.rankView = undefined;\n this.pickFor = 'rank';\n await this.openModelPicker();\n return;\n }\n await writeRanking(resolvePaths(this.io.env), v.ranked);\n this.changed();\n }\n\n async openModelPicker(): Promise<void> {\n this.busy = 'listing models';\n this.changed();\n try {\n const { items, unreachable } = await loadModelChoices(this.io);\n this.modelPicker = {\n items,\n unreachable,\n query: '',\n cursor: 0,\n current: this.chatModelName,\n ...(this.pickFor === 'rank' ? { checked: new Set<string>() } : {}),\n };\n } finally {\n this.busy = undefined;\n this.changed();\n }\n }\n\n /** Keys while the picker is open. */\n pickerKey(k: {\n up?: boolean;\n down?: boolean;\n enter?: boolean;\n close?: boolean;\n back?: boolean;\n toggle?: boolean;\n char?: string;\n }): void {\n const p = this.modelPicker;\n if (!p) return;\n const shown = filterChoices(p.items, p.query);\n if (k.close) {\n this.modelPicker = undefined;\n if (this.pickFor === 'rank') {\n this.pickFor = 'chat';\n void this.openRanking();\n }\n } else if (k.up) p.cursor = Math.max(0, p.cursor - 1);\n else if (k.down) p.cursor = Math.min(shown.length - 1, p.cursor + 1);\n else if (k.toggle && p.checked) {\n const it = shown[Math.min(p.cursor, shown.length - 1)];\n if (it?.kind === 'model') {\n if (p.checked.has(it.ref)) p.checked.delete(it.ref);\n else p.checked.add(it.ref);\n // Step to the next model, never onto the \"+ add…\" actions below the list.\n if (shown[p.cursor + 1]?.kind === 'model') p.cursor += 1;\n }\n } else if (k.back) {\n p.query = p.query.slice(0, -1);\n p.cursor = 0;\n } else if (k.char) {\n p.query += k.char;\n p.cursor = 0;\n } else if (k.enter) {\n const it = shown[Math.min(p.cursor, shown.length - 1)];\n this.modelPicker = undefined;\n const ticked = this.pickFor === 'rank' && (p.checked?.size ?? 0) > 0;\n if (this.pickFor === 'rank' && (ticked || it?.kind === 'model')) {\n // Picked for the pool: the ticked models (wherever the cursor is), else this one.\n this.pickFor = 'chat';\n let add: string[] = [];\n if (ticked && p.checked) add = [...p.checked];\n else if (it?.kind === 'model') add = [it.ref];\n void (async () => {\n const paths = resolvePaths(this.io.env);\n const ranked = await readRanking(paths);\n for (const r of add) if (!ranked.includes(r)) ranked.push(r);\n await writeRanking(paths, ranked);\n this.rankView = await this.rankState(ranked.length - 1);\n this.changed();\n })();\n } else if (it?.kind === 'model')\n void this.switchModel(it.ref).catch((err: unknown) => {\n this.push('err', describeError(err));\n });\n else if (it?.kind === 'add-env')\n void this.slash('connect env').catch((err: unknown) => {\n this.push('err', describeError(err));\n });\n else if (it?.kind === 'add-key') {\n this.awaiting = 'key';\n this.push(\n 'system',\n 'paste the API key and press enter (it is saved to a 0600 file, never shown)',\n );\n } else if (it?.kind === 'add-url') {\n this.awaiting = 'url';\n this.push(\n 'system',\n 'enter the endpoint: <url> [key] [--name alias], e.g. http://localhost:11434/v1 --name local',\n );\n }\n }\n this.changed();\n }\n\n /** The chat model to open with (`omnexx --ollama`), before any chat exists. */\n useModel(ref: string): void {\n this.chatModel = ref;\n }\n\n /** Switch chat to `ref`, keeping the conversation. */\n async switchModel(ref: string): Promise<void> {\n if (this.code?.busy) throw new Error('wait for the agent to finish (or esc), then switch');\n this.chatModel = ref;\n if (this.code) {\n // A model on another endpoint needs its own client: reopen, keep the conversation.\n const history = this.code.conversation;\n this.code = undefined;\n (await this.openCode()).conversation = history;\n }\n this.push('system', `chat model: ${ref}`);\n this.react('happy', `hello from ${ref.split(':').pop() ?? ref}!`);\n }\n\n /** Context in use / the limit chat compacts at, once a chat is open. */\n get context():\n | {\n used: number;\n limit: number;\n parts: { system: number; tools: number; conversation: number };\n }\n | undefined {\n return this.code\n ? {\n used: this.code.contextUsed,\n limit: this.code.contextLimit,\n parts: this.code.contextParts,\n }\n : undefined;\n }\n\n /** True while /pause holds the chat at its next step. */\n get chatPaused(): boolean {\n return this.code?.paused ?? false;\n }\n\n /** True while a chat turn is running (the agent is working on a message). */\n get chatBusy(): boolean {\n return this.code?.busy ?? false;\n }\n\n /** Token, tool and turn totals for the open chat (runs have their own `telemetry`). */\n get chatTelemetry(): Telemetry | undefined {\n return this.code?.telemetry;\n }\n\n get chatModelName(): string | undefined {\n return this.code?.model ?? this.chatModel;\n }\n\n /** `omnexx --continue`: open chat with the last conversation in this folder. */\n async continueChat(): Promise<void> {\n try {\n const code = await this.openCode();\n const n = await code.resumeLatest();\n this.push(\n 'system',\n n\n ? `continuing your last chat here (${n} message${n === 1 ? '' : 's'})`\n : 'no earlier chat in this folder; starting fresh',\n );\n } catch (err) {\n this.push('err', describeError(err));\n }\n }\n\n /** Esc: stop the agent's current turn. Returns false when nothing was running. */\n interrupt(): boolean {\n if (this.autoSetup) {\n this.autoSetup = undefined;\n this.push('system', 'autonomous run cancelled');\n return true;\n }\n if (!this.code?.busy) return false;\n this.code.interrupt();\n this.react('startled');\n this.push('system', 'stopping…');\n return true;\n }\n\n private async openCode(): Promise<CodeChat> {\n if (this.code) return this.code;\n this.opening ??= CodeChat.open(this.io, (q) => this.ask(q), this.chatModel);\n try {\n this.code = await this.opening;\n return this.code;\n } finally {\n this.opening = undefined;\n }\n }\n\n private readonly view = {\n line: (l: ChatLine) => {\n this.push(l.kind, l.text, { markdown: l.kind === 'out' });\n if (l.kind === 'act') this.nex = { mood: 'working', at: 0, say: `${l.text}!` };\n else if (l.kind === 'err') this.react('sad', l.text.includes('✗') ? 'hm, that failed' : '');\n else if (l.kind === 'feed' && l.text.startsWith('checks'))\n this.react(\n l.text.includes('✗') ? 'sad' : 'happy',\n l.text.includes('✗') ? 'checks failed' : 'checks pass!',\n );\n else if (l.kind === 'out') this.react('happy', 'done!');\n this.lastActivity = this.now();\n },\n stream: (delta: string) => {\n this.live = delta ? this.live + delta : '';\n this.changed();\n },\n todo: (items: TodoItem[]) => {\n this.todos = items;\n this.changed();\n },\n browser: (f: BrowserFrame) => {\n this.browserFrame = { ...f, seq: (this.browserFrame?.seq ?? 0) + 1, at: this.now() };\n this.changed();\n },\n helper: (h: HelperEvent) => {\n if (h.phase === 'start') {\n this.helpers = [\n ...this.helpers,\n {\n id: h.id,\n kind: h.kind,\n ...(h.agent ? { agent: h.agent } : {}),\n description: h.description,\n status: 'working',\n turns: 0,\n usd: 0,\n startedAt: this.now(),\n },\n ];\n } else {\n this.helpers = this.helpers.map((x) =>\n x.id === h.id\n ? {\n ...x,\n status: h.end === 'done' ? 'done' : 'stopped',\n turns: h.turns,\n usd: h.usd,\n finishedAt: this.now(),\n }\n : x,\n );\n }\n this.changed();\n },\n };\n\n private async code_(text: string): Promise<void> {\n // While the agent works, a new message goes straight to it, read at its next step.\n if (this.code?.busy) {\n this.code.steer(text);\n this.push('system', 'sent to the agent; it reads this at its next step');\n return;\n }\n this.busy = 'working';\n this.helpers = [];\n this.changed();\n try {\n let code: CodeChat;\n try {\n code = await this.openCode();\n } catch (err) {\n // No model set up yet: say how, and open the picker, instead of a raw key error.\n if (!/API key|needs [A-Z_]+|no provider/i.test(describeError(err))) throw err;\n this.push(\n 'system',\n 'no model set up yet: pick one below, paste an API key, or add your own endpoint',\n );\n await this.openModelPicker();\n return;\n }\n let next: string | undefined = text;\n while (next !== undefined) {\n // Images the message points at (dragged-in paths) go to the model with it.\n const att = await attachImages(next, this.io.cwd);\n if (att.attached.length) this.push('system', `attached ${att.attached.join(', ')}`);\n if (att.skipped.length) this.push('system', `not attached: ${att.skipped.join(', ')}`);\n await code.send(next, this.view, {\n plan: this.mode === 'plan',\n ...(att.blocks.length ? { images: att.blocks } : {}),\n });\n // Messages that arrived after its last step: answer them now, not never.\n const left = code.takeLeftovers();\n next = left.length ? left.join('\\n') : undefined;\n }\n if (code.usd > 0) this.push('system', `chat spend $${code.usd.toFixed(2)}`);\n if (this.mode === 'plan')\n this.push('system', 'plan ready: /go to carry it out, or type what to change');\n } finally {\n this.busy = undefined;\n this.live = '';\n this.changed();\n }\n }\n\n private async openChat(arg: string): Promise<void> {\n if (arg === 'off') {\n this.chat = undefined;\n this.push('system', 'setup chat off');\n return;\n }\n const ref = arg || (await defaultChatRef(this.io));\n if (!ref)\n throw new Error(\n 'no provider set up yet: paste an API key, or /connect ollama (or any URL) first',\n );\n this.chat = await Chat.open(this.io, ref);\n this.push(\n 'system',\n `talking to ${ref} about providers. e.g. \"connect my groq key\". /setup off to leave`,\n );\n }\n\n private async steer(text: string): Promise<void> {\n const id = await steerRun(this.io, this.runId, text, this.now());\n this.push('system', `steering note added to ${id}; it applies from the next cycle`);\n }\n\n private async startRun(goal: string, extra: readonly string[] = []): Promise<void> {\n const { code, out } = await this.cli(['run', '--detach', ...extra, goal], 'starting run');\n const id = out\n .split('\\n')\n .find((l) => /^\\S+$/.test(l.trim()))\n ?.trim();\n if (code === 0 && id) await this.attach(id);\n }\n\n /** A slash command from an editor button: runs as if typed, without echoing it as a message. */\n async command(line: string): Promise<void> {\n try {\n await this.slash(line);\n } catch (err) {\n this.push('err', describeError(err));\n }\n }\n\n private async slash(line: string): Promise<void> {\n const words = parse(line).filter((w): w is string => typeof w === 'string');\n const [cmd = '', ...args] = words;\n const rest = line.slice(cmd.length).trim();\n if (this.toggle(cmd)) return;\n switch (cmd) {\n case 'help':\n this.push('system', helpText(this.b));\n if (this.custom.length)\n this.push(\n 'system',\n [\n 'your commands',\n ...this.custom.map((c) => ` /${c.name} ${c.description} (${c.source})`),\n ].join('\\n'),\n );\n return;\n case 'quit':\n case 'exit':\n this.quit = true;\n this.changed();\n return;\n case 'run':\n if (rest) await this.startRun(rest);\n else this.setMode('run');\n return;\n case 'auto':\n case 'autonomous': {\n const [time, ...goal] = args;\n if (!time) {\n this.openAutoSetup();\n return;\n }\n const valid = readTime(time);\n if (!valid) {\n // \"/autonomous make it faster\": no time given, so ask for one and keep the goal.\n this.autoSetup = { step: 'time', cursor: 4, goal: rest };\n this.push('system', 'pick how long it should work');\n this.changed();\n return;\n }\n await this.startRun(goal.join(' ') || AUTONOMOUS_DEFAULT_GOAL, ['--for', valid]);\n return;\n }\n case 'plan':\n if (rest) await this.cli(['run', '--plan-only', rest], 'planning');\n else await this.cli(['plan', ...(this.runId ? [this.runId] : [])]);\n return;\n case 'steer':\n await this.steer(rest);\n return;\n case 'attach':\n case 'watch':\n await this.attach(args[0]);\n return;\n case 'detach':\n this.detach();\n return;\n case 'quiet':\n case 'normal':\n case 'verbose':\n this.verbosity = cmd;\n this.push('system', `feed verbosity: ${cmd}`);\n return;\n case 'diff':\n if (args.length) await this.cli(['diff', ...(this.runId ? [this.runId] : []), ...args]);\n else await this.openDiff();\n return;\n case 'pause':\n if (this.code?.busy) {\n this.code.paused = true;\n this.push('system', 'pausing after the current step; /resume to continue');\n } else if (this.runId) await this.cli(['pause', this.runId]);\n else this.push('system', 'nothing is running');\n return;\n case 'resume':\n if (this.code?.busy) {\n this.code.paused = false;\n this.push('system', 'resumed');\n } else await this.cli(['resume', ...(this.runId ? [this.runId] : []), ...args]);\n return;\n case 'stop':\n case 'abort':\n if (this.interrupt()) return;\n if (this.runId) await this.cli(['stop', this.runId, ...args]);\n else this.push('system', 'nothing is running');\n return;\n case 'status':\n case 'report':\n await this.cli([cmd, ...(this.runId ? [this.runId] : []), ...args]);\n return;\n case 'connect': {\n if (args[0] === 'env') {\n const added = await connectFromEnv(this.io);\n this.push(\n 'system',\n added.length\n ? `connected from your environment: ${added.map((k) => k.label).join(', ')}. /model to pick one`\n : 'no API keys found in your environment',\n );\n if (added.length) await this.openModelPicker();\n return;\n }\n // /connect <name|url|key> [key] [--name <alias>]\n const at = args.indexOf('--name');\n const alias = at >= 0 ? args[at + 1] : undefined;\n const rest = at >= 0 ? args.filter((_, i) => i !== at && i !== at + 1) : args;\n if (!rest[0]) throw new Error('usage: /connect <name|url|key> [key] [--name <alias>]');\n await this.connect(rest[0], rest[1], alias);\n return;\n }\n case 'chat':\n this.setMode('chat');\n return;\n case 'agents':\n await this.openAgents();\n return;\n case 'models':\n await this.openRanking();\n return;\n case 'model':\n if (!rest) await this.openModelPicker();\n else if (/^https?:\\/\\//i.test(rest) || looksLikeKey(rest)) {\n // /model <url or key>: connect it, then pick one of its models.\n const [target = '', ...more] = rest.split(/\\s+/);\n const at = more.indexOf('--name');\n const name = at >= 0 ? more[at + 1] : undefined;\n const key = more.find((_, i) => i !== at && i !== at + 1);\n await this.connect(target, key, name);\n await this.openModelPicker();\n } else await this.switchModel(rest);\n return;\n case 'go':\n if (this.mode !== 'plan')\n throw new Error('/go approves a plan: switch to plan mode with shift+tab first');\n this.mode = 'chat';\n this.push('system', 'plan approved: carrying it out');\n await this.code_(\n 'The plan is approved. Carry it out now, keeping the todo list up to date.',\n );\n return;\n case 'undo': {\n if (this.code?.busy) throw new Error('wait for the agent to finish (or esc), then undo');\n const touched = await this.code?.undo();\n if (touched === undefined) this.push('system', 'nothing to undo');\n else\n this.push(\n 'system',\n touched.length\n ? `undone: restored ${touched.length} file${touched.length === 1 ? '' : 's'} (${touched.slice(0, 6).join(', ')}${touched.length > 6 ? ', …' : ''}) and dropped that message`\n : 'undone: no files had changed; dropped that message',\n );\n return;\n }\n case 'compact':\n if (!this.code) {\n this.push('system', 'nothing to compact yet');\n return;\n }\n await this.code.compact(this.view);\n return;\n case 'clear':\n this.todos = [];\n this.helpers = [];\n this.browserFrame = undefined;\n await this.code?.clear();\n this.push('system', 'chat conversation cleared');\n return;\n case 'cards':\n await this.cli(['agent-cards', ...(args.length ? args : ['list'])]);\n return;\n case 'mcp':\n await this.cli(['mcp', ...(args.length ? args : ['list'])]);\n return;\n case 'apps':\n await this.cli(['connect', ...args]);\n return;\n case 'skills':\n await this.cli(['skills', ...(args.length ? args : ['list'])]);\n return;\n case 'setup':\n await this.openChat(rest);\n return;\n case 'init':\n await this.cli(['init', '--yes']);\n return;\n default: {\n const custom = this.custom.find((c) => c.name === cmd);\n if (custom) {\n // A custom command is a saved prompt: it goes to the agent like a typed message.\n await this.code_(expandCommand(custom, rest));\n return;\n }\n if (\n BLOCKED.has(cmd) ||\n (cmd === 'logs' && args.some((a) => a === '-f' || a === '--follow'))\n )\n throw new Error(\n `/${cmd} needs the plain terminal; run \\`omnexx ${line}\\` outside the TUI`,\n );\n await this.cli([cmd, ...args]);\n }\n }\n }\n\n /** The open /agents view: every long run on this machine. */\n agentsView: AgentsState | undefined;\n private agentsAt = 0;\n\n async openAgents(): Promise<void> {\n this.agentsView = { rows: await loadAgents(resolvePaths(this.io.env), this.now()), cursor: 0 };\n this.agentsAt = this.now();\n this.changed();\n }\n\n /** Called on the TUI's tick: refresh the agents view every 2 s while it is open. */\n async refreshAgents(): Promise<void> {\n const v = this.agentsView;\n if (!v || this.now() - this.agentsAt < 2_000) return;\n this.agentsAt = this.now();\n const selected = v.rows[v.cursor]?.runId;\n const rows = await loadAgents(resolvePaths(this.io.env), this.now());\n if (!this.agentsView) return;\n const at = rows.findIndex((r) => r.runId === selected);\n this.agentsView = {\n rows,\n cursor: at >= 0 ? at : Math.min(v.cursor, Math.max(0, rows.length - 1)),\n };\n this.changed();\n }\n\n /** Keys while the agents view is open. */\n async agentsKey(k: 'up' | 'down' | 'attach' | 'pause' | 'stop' | 'close'): Promise<void> {\n const v = this.agentsView;\n if (!v) return;\n const row = v.rows[v.cursor];\n if (k === 'close') this.agentsView = undefined;\n else if (k === 'up') v.cursor = Math.max(0, v.cursor - 1);\n else if (k === 'down') v.cursor = Math.min(v.rows.length - 1, v.cursor + 1);\n else if (row && k === 'attach') {\n this.agentsView = undefined;\n await this.attach(row.runId);\n } else if (row && k === 'pause')\n await this.cli([row.phase === 'paused' ? 'resume' : 'pause', row.runId]);\n else if (row && k === 'stop') await this.cli(['stop', row.runId]);\n this.agentsAt = 0;\n this.changed();\n }\n\n /** The open /diff viewer, if any; it takes over the keys until closed. */\n diffView: DiffViewState | undefined;\n\n /** /diff: the attached run's commits since it started, or uncommitted changes in this checkout. */\n async openDiff(): Promise<void> {\n let text: string;\n let title: string;\n if (this.runId) {\n const st = await new RunStore(resolvePaths(this.io.env), this.runId).readState();\n text = (await git(st.worktree, ['diff', `${st.startRef}..${st.lastGreen}`])).stdout;\n title = `${this.runId} since start`;\n } else {\n text = (await git(this.io.cwd, ['diff', 'HEAD'], { allowFailure: true })).stdout;\n title = 'uncommitted changes';\n }\n this.diffView = { title, files: parseDiff(text), cursor: 0, open: new Set() };\n this.changed();\n }\n\n /** Keys while the diff viewer is open. */\n diffKey(key: 'up' | 'down' | 'enter' | 'close'): void {\n const v = this.diffView;\n if (!v) return;\n if (key === 'close') this.diffView = undefined;\n else if (key === 'up') v.cursor = Math.max(0, v.cursor - 1);\n else if (key === 'down') v.cursor = Math.min(v.files.length - 1, v.cursor + 1);\n else if (v.open.has(v.cursor)) v.open.delete(v.cursor);\n else v.open.add(v.cursor);\n this.changed();\n }\n\n private files: string[] | undefined;\n private loadingFiles = false;\n\n /**\n * Repo files matching an `@partial` at the end of the input (tab completes the first).\n * The file list loads once in the background on the first `@`.\n */\n completeFile(input: string): string[] {\n const m = /@([^\\s@]*)$/.exec(input);\n if (!m) return [];\n if (!this.files) {\n if (!this.loadingFiles) {\n this.loadingFiles = true;\n void git(this.io.cwd, ['ls-files', '--cached', '--others', '--exclude-standard'], {\n allowFailure: true,\n }).then((r) => {\n this.files = r.exitCode === 0 ? r.stdout.split('\\n').filter(Boolean) : [];\n this.changed();\n });\n }\n return [];\n }\n const q = (m[1] ?? '').toLowerCase();\n const starts = this.files.filter((f) => f.toLowerCase().startsWith(q));\n const contains = this.files.filter(\n (f) => !f.toLowerCase().startsWith(q) && f.toLowerCase().includes(q),\n );\n return [...starts, ...contains].slice(0, 20);\n }\n\n /** Commands whose name starts with what's typed after `/`. */\n complete(input: string): SlashCommand[] {\n if (!input.startsWith('/') || input.includes(' ')) return [];\n const q = input.slice(1);\n const builtIn = new Set(SLASH.map((c) => c.name));\n return [\n ...SLASH,\n ...this.custom\n .filter((c) => !builtIn.has(c.name))\n .map((c) => ({ name: c.name, help: c.description })),\n ].filter((c) => c.name.startsWith(q));\n }\n\n /** Slash commands from .omnexx/commands, .claude/commands and the config folder. */\n custom: CustomCommand[] = [];\n\n async loadCommands(): Promise<void> {\n const root =\n (\n await git(this.io.cwd, ['rev-parse', '--show-toplevel'], { allowFailure: true })\n ).stdout.trim() || this.io.cwd;\n this.custom = await loadCustomCommands(commandDirs(root, resolvePaths(this.io.env).configHome));\n this.changed();\n }\n}\n\nexport function helpText(b: Brand): string {\n const w = Math.max(...SLASH.map((c) => `/${c.name} ${c.args ?? ''}`.length));\n return [\n b.green('commands'),\n ...SLASH.map((c) => ` ${b.cyan(`/${c.name} ${c.args ?? ''}`.padEnd(w))} ${c.help}`),\n ` ${b.dim(`also: ${MORE_SLASH.map((c) => `/${c}`).join(' ')}, and any omnexx command`)}`,\n '',\n b.green('typing'),\n ' paste an API key: it is saved and the provider set up (never echoed)',\n ' chat mode (default): the agent works on your message right here, showing every step',\n ' type while it works to steer it (it reads your message at its next step); esc stops it',\n ' run mode (shift+tab, or /run <goal>): a long unattended run on its own branch',\n ' /autonomous 8h [goal]: keep improving the repo until the time is up',\n ' in /setup: your text goes to that model, which can add providers for you',\n ].join('\\n');\n}\n","import type { Command } from 'commander';\nimport { resolvePaths } from '../../core/paths.js';\nimport { UsageError } from '../../errors.js';\nimport { EXIT } from '../exit-codes.js';\nimport { println, type CliIO } from '../io.js';\nimport { pickRun } from './control.js';\n\nexport const STEERING_HEADING = '## Steering';\n\n/** Append a dated note under \"## Steering\" in goal.md; the run picks it up at the next cycle. */\nexport async function steerRun(\n io: CliIO,\n runId: string | undefined,\n text: string,\n now = Date.now(),\n): Promise<string> {\n const note = text.trim();\n if (!note) throw new UsageError('nothing to steer with', 'omnexx steer \"focus on the API first\"');\n const store = await pickRun(resolvePaths(io.env), runId);\n const goal = (await store.readGoal()).text.trimEnd();\n const stamp = new Date(now).toISOString().slice(0, 16).replace('T', ' ');\n const head = goal.includes(STEERING_HEADING) ? goal : `${goal}\\n\\n${STEERING_HEADING}`;\n await store.writeGoal(`${head}\\n- ${stamp}: ${note}\\n`);\n return store.runId;\n}\n\nexport function register(program: Command, io: CliIO, setExit: (code: number) => void): void {\n program\n .command('steer')\n .argument('<text...>', 'the note, e.g. \"skip the admin UI, focus on the API\"')\n .option('--run <runId>', 'defaults to the most recent run')\n .description('add a steering note to a run’s goal; picked up at the next cycle')\n .action(async (words: string[], opts: { run?: string }) => {\n const id = await steerRun(io, opts.run, words.join(' '));\n println(io.stdout, `steering note added to ${id}; it applies from the next cycle`);\n setExit(EXIT.ok);\n });\n}\n","import { findProviderKey } from '../auth/keys.js';\nimport { connect, describeConnect } from '../cli/connect.js';\nimport type { CliIO } from '../cli/io.js';\nimport { resolveRunDeps } from '../cli/run-deps.js';\nimport { loadConfig } from '../config/load.js';\nimport { resolvePaths } from '../core/paths.js';\nimport { describeError } from '../errors.js';\nimport { discoverModels } from '../providers/discovery.js';\nimport { resolveModelLenient } from '../providers/profiles.js';\nimport type { ContentBlock, Message, Provider, ToolSpec } from '../providers/types.js';\n\nconst SYSTEM = `You are omnexx's setup assistant, talking to the user in their terminal.\nYour job: help them connect model providers and custom OpenAI-compatible endpoints.\nUse the tools; never invent results. Keys the user pastes reach you as placeholders like\n<key-1>: pass the placeholder as the key argument and omnexx swaps in the real key.\nNever ask the user to paste a key into anything but this chat. Be brief: plain text, no\nmarkdown headings. When a provider is connected, tell them the model ref to use.`;\n\nconst TOOLS: ToolSpec[] = [\n {\n name: 'list_providers',\n description: 'Configured providers, their base URLs and whether a key is set.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'connect_provider',\n description:\n 'Add or update a provider. target is a known name (openai, openrouter, groq, deepseek, ' +\n 'together, fireworks, mistral, gemini, xai, ollama, lmstudio, vllm, litellm, anthropic) ' +\n 'or a base URL of any OpenAI-compatible endpoint. Lists its models to prove it works.',\n inputSchema: {\n type: 'object',\n properties: {\n target: { type: 'string' },\n key: { type: 'string', description: 'API key or a <key-N> placeholder' },\n name: { type: 'string', description: 'name for a URL endpoint (optional)' },\n },\n required: ['target'],\n },\n },\n {\n name: 'list_models',\n description: 'Models a configured provider serves.',\n inputSchema: {\n type: 'object',\n properties: { provider: { type: 'string' } },\n required: ['provider'],\n },\n },\n];\n\nconst KEYISH = /\\b(sk-ant-|sk-or-|sk-|gsk_|xai-|AIza|fw_)[A-Za-z0-9_\\-.]{16,}/g;\n\n/**\n * A direct conversation with one model (`/chat openrouter:some-model`). The model can connect\n * further providers through tools; pasted keys never reach it, only `<key-N>` placeholders.\n */\nexport class Chat {\n private messages: Message[] = [];\n private keys: string[] = [];\n\n private constructor(\n private readonly io: CliIO,\n readonly ref: string,\n private readonly provider: Provider,\n private readonly route: string,\n private readonly model: string,\n ) {}\n\n static async open(io: CliIO, ref: string): Promise<Chat> {\n const { config, deps } = await resolveRunDeps(io, io.cwd, {\n models: { planner: ref, worker: ref, cheap: ref },\n });\n const m = resolveModelLenient(ref, config);\n return new Chat(io, ref, deps.provider, m.provider, m.id);\n }\n\n /** Replace pasted keys with placeholders; the real values stay here. */\n redact(text: string): string {\n return text.replace(KEYISH, (k) => {\n let i = this.keys.indexOf(k);\n if (i === -1) i = this.keys.push(k) - 1;\n return `<key-${i + 1}>`;\n });\n }\n\n private unredact(text: string | undefined): string | undefined {\n return text?.replace(/<key-(\\d+)>/g, (m, n: string) => this.keys[Number(n) - 1] ?? m);\n }\n\n /** One user turn: loops through tool calls until the model answers. `say` gets each line. */\n async send(text: string, say: (line: string) => void, maxSteps = 8): Promise<void> {\n this.messages.push({ role: 'user', content: [{ type: 'text', text: this.redact(text) }] });\n for (let step = 0; step < maxSteps; step++) {\n const res = await this.provider.complete({\n model: this.model,\n route: this.route,\n system: [{ text: SYSTEM }],\n tools: TOOLS,\n messages: this.messages,\n maxTokens: 2048,\n messageBreakpoints: [],\n });\n this.messages.push({ role: 'assistant', content: res.content });\n const said = res.content\n .filter((b): b is Extract<ContentBlock, { type: 'text' }> => b.type === 'text')\n .map((b) => b.text)\n .join('')\n .trim();\n if (said) say(said);\n const calls = res.content.filter(\n (b): b is Extract<ContentBlock, { type: 'tool_use' }> => b.type === 'tool_use',\n );\n if (!calls.length) return;\n const results: ContentBlock[] = [];\n for (const c of calls) {\n say(`· ${c.name}`);\n try {\n results.push({\n type: 'tool_result',\n toolUseId: c.id,\n content: await this.tool(c.name, (c.input ?? {}) as Record<string, unknown>),\n });\n } catch (err) {\n results.push({\n type: 'tool_result',\n toolUseId: c.id,\n content: describeError(err),\n isError: true,\n });\n }\n }\n this.messages.push({ role: 'user', content: results });\n }\n say('(stopped after too many tool calls)');\n }\n\n private async tool(name: string, input: Record<string, unknown>): Promise<string> {\n const str = (k: string): string | undefined =>\n typeof input[k] === 'string' ? input[k] : undefined;\n switch (name) {\n case 'list_providers': {\n const { config } = await loadConfig({ cwd: this.io.cwd, env: this.io.env });\n const paths = resolvePaths(this.io.env);\n const rows = [\n `anthropic (built-in) key: ${(await findProviderKey(paths, this.io.env, 'anthropic')) ? 'yes' : 'no'}`,\n ];\n for (const [n, ep] of Object.entries(config.providers.endpoints)) {\n const key = await findProviderKey(paths, this.io.env, n, ep.api_key_env);\n rows.push(`${n} ${ep.base_url} key: ${key ? 'yes' : ep.free ? 'not needed' : 'no'}`);\n }\n return rows.join('\\n');\n }\n case 'connect_provider': {\n const target = this.unredact(str('target')) ?? '';\n const key = this.unredact(str('key'));\n const nm = str('name');\n // A model that passes the key as the target still works.\n const r = await connect(this.io, target, key, nm ? { name: nm } : {});\n return this.redact(describeConnect(r));\n }\n case 'list_models': {\n const p = str('provider') ?? '';\n const { config } = await loadConfig({ cwd: this.io.cwd, env: this.io.env });\n const ep = config.providers.endpoints[p];\n if (!ep) return `unknown provider \"${p}\"`;\n const apiKey = (\n await findProviderKey(resolvePaths(this.io.env), this.io.env, p, ep.api_key_env)\n )?.key;\n const models = await discoverModels(\n { baseUrl: ep.base_url, ...(apiKey ? { apiKey } : {}) },\n this.io.fetch ? { fetch: this.io.fetch } : {},\n );\n return models.length ? models.map((m) => m.id).join('\\n') : 'no models listed';\n }\n default:\n return `unknown tool ${name}`;\n }\n }\n}\n\n/** The model to chat with when `/chat` has no argument: Anthropic if keyed, else any endpoint. */\nexport async function defaultChatRef(io: CliIO): Promise<string | undefined> {\n const paths = resolvePaths(io.env);\n if (await findProviderKey(paths, io.env, 'anthropic')) return 'anthropic:sonnet';\n const { config } = await loadConfig({ cwd: io.cwd, env: io.env });\n for (const [n, ep] of Object.entries(config.providers.endpoints)) {\n const apiKey = (await findProviderKey(paths, io.env, n, ep.api_key_env))?.key;\n if (!apiKey && !ep.free) continue;\n const models = await discoverModels(\n { baseUrl: ep.base_url, ...(apiKey ? { apiKey } : {}) },\n io.fetch ? { fetch: io.fetch } : {},\n );\n if (models[0]) return `${n}:${models[0].id}`;\n }\n return undefined;\n}\n\n/** Whether any provider can be called at all (no network): a key, or a free endpoint. */\nexport async function hasProvider(io: CliIO): Promise<boolean> {\n const paths = resolvePaths(io.env);\n if (await findProviderKey(paths, io.env, 'anthropic')) return true;\n const { config } = await loadConfig({ cwd: io.cwd, env: io.env });\n for (const [n, ep] of Object.entries(config.providers.endpoints)) {\n if (ep.free || (await findProviderKey(paths, io.env, n, ep.api_key_env))) return true;\n }\n return false;\n}\n","import { Text } from 'ink';\nimport { CYAN, GRAY, GREEN } from './colors.js';\n\n/** How one line of a model reply renders: inside a code block, a heading, a bullet, or prose. */\nexport type MdKind = 'fence' | 'code' | 'heading' | 'bullet' | 'text';\n\n/** Classify each line of a reply. Code-block state carries across lines, so this sees the whole reply. */\nexport function classifyMarkdown(lines: readonly string[]): MdKind[] {\n let inCode = false;\n return lines.map((l) => {\n if (/^\\s*```/.test(l)) {\n inCode = !inCode;\n return 'fence';\n }\n if (inCode) return 'code';\n if (/^#{1,6}\\s/.test(l)) return 'heading';\n if (/^\\s*([-*]|\\d+\\.)\\s/.test(l)) return 'bullet';\n return 'text';\n });\n}\n\n/** `code` and **bold** spans inside a prose line. Unclosed markers stay as typed. */\nexport function inlineSpans(line: string): { text: string; style?: 'code' | 'bold' }[] {\n const out: { text: string; style?: 'code' | 'bold' }[] = [];\n const re = /`([^`]+)`|\\*\\*([^*]+)\\*\\*/g;\n let last = 0;\n for (const m of line.matchAll(re)) {\n if (m.index > last) out.push({ text: line.slice(last, m.index) });\n out.push(\n m[1] !== undefined ? { text: m[1], style: 'code' } : { text: m[2] ?? '', style: 'bold' },\n );\n last = m.index + m[0].length;\n }\n if (last < line.length) out.push({ text: line.slice(last) });\n return out;\n}\n\nfunction Inline({ line }: { line: string }) {\n return (\n <Text>\n {inlineSpans(line).map((s, i) =>\n s.style === 'code' ? (\n <Text key={i} color={CYAN}>\n {s.text}\n </Text>\n ) : s.style === 'bold' ? (\n <Text key={i} bold>\n {s.text}\n </Text>\n ) : (\n <Text key={i}>{s.text}</Text>\n ),\n )}\n </Text>\n );\n}\n\nexport function MarkdownLine({ text, md }: { text: string; md: MdKind }) {\n switch (md) {\n case 'fence':\n return <Text color={GRAY}>{text.replace(/^\\s*```/, '──── ').trimEnd()}</Text>;\n case 'code':\n return (\n <Text>\n <Text color={GRAY}>{'│ '}</Text>\n <Text color={CYAN}>{text}</Text>\n </Text>\n );\n case 'heading':\n return (\n <Text color={GREEN} bold>\n {text.replace(/^#{1,6}\\s/, '')}\n </Text>\n );\n case 'bullet': {\n const m = /^(\\s*)([-*]|\\d+\\.)\\s(.*)$/.exec(text);\n return (\n <Text>\n {m?.[1]}\n <Text color={GREEN}>{m?.[2] === '-' || m?.[2] === '*' ? '•' : m?.[2]}</Text>{' '}\n <Inline line={m?.[3] ?? text} />\n </Text>\n );\n }\n case 'text':\n return <Inline line={text} />;\n }\n}\n","import { Box, Text } from 'ink';\nimport { CYAN, GRAY, GREEN, RED } from './colors.js';\n\nexport interface DiffFile {\n path: string;\n added: number;\n removed: number;\n /** Hunk lines (`@@`, `+`, `-`, context), without the file headers. */\n lines: string[];\n}\n\n/** Split `git diff` output into files with their +/- counts. */\nexport function parseDiff(text: string): DiffFile[] {\n const files: DiffFile[] = [];\n let cur: DiffFile | undefined;\n for (const line of text.split('\\n')) {\n const head = /^diff --git a\\/(.+?) b\\/(.+)$/.exec(line);\n if (head) {\n cur = { path: head[2] ?? head[1] ?? '?', added: 0, removed: 0, lines: [] };\n files.push(cur);\n continue;\n }\n if (\n !cur ||\n /^(index |--- |\\+\\+\\+ |new file|deleted file|similarity|rename |old mode|new mode)/.test(line)\n )\n continue;\n if (line.startsWith('+')) cur.added++;\n else if (line.startsWith('-')) cur.removed++;\n if (line || cur.lines.length) cur.lines.push(line);\n }\n for (const f of files) while (f.lines.at(-1) === '') f.lines.pop();\n return files;\n}\n\nexport interface DiffViewState {\n title: string;\n files: DiffFile[];\n cursor: number;\n open: Set<number>;\n}\n\nconst MAX_LINES_PER_FILE = 200;\n\nexport function DiffView({ view, width }: { view: DiffViewState; width: number }) {\n const total = view.files.reduce(\n (a, f) => ({ added: a.added + f.added, removed: a.removed + f.removed }),\n { added: 0, removed: 0 },\n );\n return (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor={GRAY} paddingX={1} width={width}>\n <Text>\n <Text color={GREEN} bold>\n {view.title}\n </Text>\n <Text color={GRAY}>\n {` · ${view.files.length} file${view.files.length === 1 ? '' : 's'} `}\n </Text>\n <Text color={GREEN}>{`+${total.added}`}</Text>{' '}\n <Text color={RED}>{`-${total.removed}`}</Text>\n <Text color={GRAY}>{' ↑↓ move · enter expand · esc close'}</Text>\n </Text>\n {view.files.length === 0 && <Text color={GRAY}>no changes</Text>}\n {view.files.map((f, i) => {\n const open = view.open.has(i);\n const shown = f.lines.slice(0, MAX_LINES_PER_FILE);\n return (\n <Box key={f.path} flexDirection=\"column\">\n <Text inverse={i === view.cursor}>\n <Text color={GRAY}>{open ? '▾ ' : '▸ '}</Text>\n {f.path} <Text color={GREEN}>{`+${f.added}`}</Text>{' '}\n <Text color={RED}>{`-${f.removed}`}</Text>\n </Text>\n {open &&\n shown.map((l, j) => (\n <Text\n key={j}\n wrap=\"truncate-end\"\n color={\n l.startsWith('+')\n ? GREEN\n : l.startsWith('-')\n ? RED\n : l.startsWith('@@')\n ? CYAN\n : GRAY\n }\n >\n {` ${l}`}\n </Text>\n ))}\n {open && f.lines.length > shown.length && (\n <Text color={GRAY}>{` … ${f.lines.length - shown.length} more lines`}</Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport { supervisorAlive } from '../cli/commands/control.js';\nimport { planCounts } from '../core/plan.js';\nimport type { OmnexxPaths } from '../core/paths.js';\nimport { listRunIds, RunStore } from '../core/run-store.js';\nimport { fmtMs } from '../telemetry/humanize.js';\nimport { CYAN, GRAY, GREEN, RED } from './colors.js';\n\nexport interface AgentRow {\n runId: string;\n repo: string;\n status: string;\n phase: string;\n alive: boolean;\n done: number;\n tasks: number;\n task: string | undefined;\n usd: number;\n /** ms since the supervisor's last heartbeat. */\n beatAge: number | undefined;\n goal: string;\n}\n\nexport interface AgentsState {\n rows: AgentRow[];\n cursor: number;\n}\n\n/** Every long run on this machine (chats excluded), newest first, live ones on top. */\nexport async function loadAgents(paths: OmnexxPaths, now: number): Promise<AgentRow[]> {\n const ids = (await listRunIds(paths)).filter((id) => !id.startsWith('chat_')).reverse();\n const rows: AgentRow[] = [];\n for (const id of ids.slice(0, 40)) {\n const store = new RunStore(paths, id);\n const state = await store.readState().catch(() => undefined);\n if (!state) continue;\n const [plan, beat, alive, goal] = await Promise.all([\n store.readPlan().catch(() => undefined),\n store.readHeartbeat().catch(() => undefined),\n supervisorAlive(store).catch(() => false),\n store.readGoal().catch(() => ({ text: '' })),\n ]);\n const c = plan ? planCounts(plan) : undefined;\n rows.push({\n runId: id,\n repo: state.repoName,\n status: state.status,\n phase: state.phase,\n alive,\n done: c?.done ?? 0,\n tasks: c?.tasks ?? 0,\n task: state.taskId,\n usd: state.spend.usd,\n beatAge: beat ? now - beat.ts : undefined,\n goal:\n goal.text\n .split('\\n')\n .find((l) => l.trim() && !l.startsWith('#'))\n ?.trim() ?? '',\n });\n }\n return rows.sort((a, b) => Number(b.alive) - Number(a.alive));\n}\n\nconst bar = (done: number, total: number, width = 8): string => {\n const n = total ? Math.round((done / total) * width) : 0;\n return '▰'.repeat(n) + '▱'.repeat(width - n);\n};\n\nexport function AgentsView({ state, width }: { state: AgentsState; width: number }) {\n const live = state.rows.filter((r) => r.alive).length;\n return (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor={GREEN} paddingX={1} width={width}>\n <Text>\n <Text color={GREEN} bold>\n agents\n </Text>\n <Text\n color={GRAY}\n >{` ${live} running · ${state.rows.length} total · ↑↓ · enter attach · p pause/resume · s stop · esc`}</Text>\n </Text>\n {state.rows.length === 0 && (\n <Text color={GRAY}>no runs yet: /run &lt;goal&gt; starts one</Text>\n )}\n {state.rows.map((r, i) => (\n <Text key={r.runId} inverse={i === state.cursor} wrap=\"truncate-end\">\n <Text color={r.alive ? GREEN : r.status === 'error' ? RED : GRAY}>\n {r.alive ? '● ' : '○ '}\n </Text>\n <Text color={CYAN}>{r.repo.padEnd(14).slice(0, 14)}</Text>\n <Text>{` ${r.alive ? r.phase.padEnd(9) : r.status.padEnd(9)} `}</Text>\n <Text color={GREEN}>{bar(r.done, r.tasks)}</Text>\n <Text\n color={GRAY}\n >{` ${r.done}/${r.tasks} ${r.task ?? ''} $${r.usd.toFixed(2)}${r.alive && r.beatAge !== undefined ? ` · ${fmtMs(r.beatAge)} ago` : ''} ${r.goal.slice(0, 60)}`}</Text>\n </Text>\n ))}\n </Box>\n );\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { parseFrontmatter } from '../instructions/frontmatter.js';\n\nexport interface CustomCommand {\n name: string;\n description: string;\n /** The prompt; `$ARGUMENTS` is replaced by what follows the command. */\n template: string;\n /** Where it came from, for /help. */\n source: string;\n}\n\n/** Command folders, highest precedence first: the repo's, Claude Code's, then the person's own. */\nexport function commandDirs(repoRoot: string, configHome: string): string[] {\n return [\n join(repoRoot, '.omnexx', 'commands'),\n join(repoRoot, '.claude', 'commands'),\n join(configHome, 'commands'),\n ];\n}\n\n/**\n * Markdown files in the command folders become slash commands: `review.md` is `/review`. An\n * optional frontmatter `description:` shows in the menu; the first folder that has a name wins.\n */\nexport async function loadCustomCommands(dirs: readonly string[]): Promise<CustomCommand[]> {\n const out = new Map<string, CustomCommand>();\n for (const dir of dirs) {\n const files = await readdir(dir).catch(() => [] as string[]);\n for (const f of files.filter((x) => x.endsWith('.md')).sort()) {\n const name = f.slice(0, -3).toLowerCase();\n if (!/^[a-z0-9][a-z0-9_-]*$/.test(name) || out.has(name)) continue;\n const { data, body } = parseFrontmatter(await readFile(join(dir, f), 'utf8'));\n const template = body.trim();\n if (!template) continue;\n const first = template.split('\\n').find((l) => l.trim()) ?? '';\n out.set(name, {\n name,\n description: (data.description ?? first.replace(/^#+\\s*/, '')).slice(0, 80),\n template,\n source: join(dir, f),\n });\n }\n }\n return [...out.values()];\n}\n\n/** Fill a command's template with what was typed after it. */\nexport function expandCommand(cmd: CustomCommand, args: string): string {\n return cmd.template.includes('$ARGUMENTS')\n ? cmd.template.replaceAll('$ARGUMENTS', args)\n : args\n ? `${cmd.template}\\n\\n${args}`\n : cmd.template;\n}\n"],"mappings":"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","names":["join","Text","jsx","jsxs","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","key","join","rest"]}
@@ -1237,6 +1237,15 @@ var readLogTool = {
1237
1237
  import { mkdir as mkdir2, readFile as readFile4, writeFile as writeFile2 } from "fs/promises";
1238
1238
  import { dirname as dirname3 } from "path";
1239
1239
  import { z as z5 } from "zod";
1240
+ function linesOf(text, needle) {
1241
+ const out = [];
1242
+ let at = text.indexOf(needle);
1243
+ while (at >= 0 && out.length < 10) {
1244
+ out.push(text.slice(0, at).split("\n").length);
1245
+ at = text.indexOf(needle, at + needle.length);
1246
+ }
1247
+ return out;
1248
+ }
1240
1249
  var WRITE_MAX_LINES = 50;
1241
1250
  var editSchema = z5.strictObject({ old_str: z5.string().min(1), new_str: z5.string() });
1242
1251
  function countOccurrences(hay, needle) {
@@ -1258,8 +1267,9 @@ async function applyEdits(path, edits, ctx) {
1258
1267
  for (const [i, e] of edits.entries()) {
1259
1268
  const n2 = countOccurrences(text, e.old_str);
1260
1269
  if (n2 !== 1) {
1270
+ const where = n2 > 1 ? ` (at lines ${linesOf(text, e.old_str).join(", ")})` : "";
1261
1271
  return fail(
1262
- `edit ${i + 1}: old_str found ${n2} times in ${path}; it must match exactly once (include more surrounding lines). No changes were written.`
1272
+ `edit ${i + 1}: old_str found ${n2} times in ${path}${where}; it must match exactly once: add a line before or after that only the one you mean has. No changes were written.`
1263
1273
  );
1264
1274
  }
1265
1275
  text = text.replace(e.old_str, () => e.new_str);
@@ -5958,6 +5968,43 @@ var TOOL_ALIASES = {
5958
5968
  exec: "bash",
5959
5969
  terminal: "bash"
5960
5970
  };
5971
+ var ARG_SYNONYMS = {
5972
+ file_path: "path",
5973
+ filepath: "path",
5974
+ filename: "path",
5975
+ file: "path",
5976
+ dir: "path",
5977
+ directory: "path",
5978
+ line_start: "start",
5979
+ start_line: "start",
5980
+ from_line: "start",
5981
+ line_end: "end",
5982
+ end_line: "end",
5983
+ to_line: "end",
5984
+ query: "pattern",
5985
+ regex: "pattern",
5986
+ cmd: "command",
5987
+ old_string: "old_str",
5988
+ new_string: "new_str",
5989
+ old_text: "old_str",
5990
+ new_text: "new_str",
5991
+ text: "content"
5992
+ };
5993
+ function lenientInput(schema15, input) {
5994
+ const shape = schema15.shape;
5995
+ if (!shape || typeof input !== "object" || input === null || Array.isArray(input))
5996
+ return void 0;
5997
+ const out = {};
5998
+ let changed = false;
5999
+ for (const [k, v] of Object.entries(input)) {
6000
+ const name = k in shape ? k : ARG_SYNONYMS[k];
6001
+ if (name && name in shape && !(name in out)) {
6002
+ out[name] = v;
6003
+ if (name !== k) changed = true;
6004
+ } else changed = true;
6005
+ }
6006
+ return changed ? out : void 0;
6007
+ }
5961
6008
  function stuckNudge(detail) {
5962
6009
  return `[harness] You seem to be going in circles (${detail}). If the request is done, stop calling tools and give your summary now. If not, say in one line what is blocking you, then take a different approach; don't repeat the same searches or commands.`;
5963
6010
  }
@@ -6290,6 +6337,13 @@ async function runAgentLoop(ctx, deps) {
6290
6337
  if (again.success) parsed = again;
6291
6338
  }
6292
6339
  }
6340
+ if (!parsed.success) {
6341
+ const lenient = lenientInput(tool.schema, call.input);
6342
+ if (lenient !== void 0) {
6343
+ const again = tool.schema.safeParse(prepare(lenient));
6344
+ if (again.success) parsed = again;
6345
+ }
6346
+ }
6293
6347
  if (!parsed.success) {
6294
6348
  content = `invalid input for ${call.name}: ${parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")}`;
6295
6349
  isError = true;
@@ -7946,4 +8000,4 @@ export {
7946
8000
  cacheHitRate,
7947
8001
  tokensPerCommit
7948
8002
  };
7949
- //# sourceMappingURL=chunk-MNTMFQJV.js.map
8003
+ //# sourceMappingURL=chunk-IGUI6IJP.js.map