@wrongstack/cli 0.1.3 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin-api-factory.ts","../src/input-reader.ts","../src/diff-renderer.ts","../src/theme.ts","../src/permission-prompt.ts","../src/picker.ts","../src/slash-commands/index.ts","../src/pre-launch.ts","../src/renderer.ts","../src/version.ts","../src/utils.ts","../src/repl.ts","../src/session-stats.ts","../src/spinner.ts","../src/boot-config.ts","../src/multi-agent.ts","../src/auth-menu.ts","../src/subcommands/index.ts","../src/index.ts"],"names":["path","os","fs","resolve","color","theme","atomicWrite","path2","fs2","msg","fs3","path3","answer","FILLED","EMPTY","renderContextChip","renderProgress","path4","os2","fs4","baseUrl","fs5","req","createRequire","path6","sessionStore","skillLoader","code","Container","TOKENS","EventBus","fs7","makeProviderFromConfig","Context","createDefaultPipelines","Agent","createApi"],"mappings":"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","file":"index.js","sourcesContent":["import {\n DefaultPluginAPI,\n type PluginAPIInit,\n type PluginAPI,\n} from '@wrongstack/core';\n\nexport default function createApi(ownerName: string, base: Omit<PluginAPIInit, 'ownerName'>): PluginAPI {\n return new DefaultPluginAPI({ ownerName, ...base });\n}\n","import * as readline from 'node:readline';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { InputReader, PromptOption } from '@wrongstack/core';\n\nexport interface ReadlineInputReaderOptions {\n historyFile?: string;\n prompt?: string;\n}\n\nexport class ReadlineInputReader implements InputReader {\n private rl?: readline.Interface;\n private readonly historyFile: string;\n private history: string[] = [];\n private pending = false;\n\n constructor(opts: ReadlineInputReaderOptions = {}) {\n this.historyFile = opts.historyFile ?? path.join(os.homedir(), '.wrongstack', 'history');\n }\n\n private async loadHistory(): Promise<void> {\n try {\n const raw = await fs.readFile(this.historyFile, 'utf8');\n this.history = raw.split('\\n').filter(Boolean).slice(-1000);\n } catch {\n this.history = [];\n }\n }\n\n private async saveHistory(): Promise<void> {\n try {\n await fs.mkdir(path.dirname(this.historyFile), { recursive: true });\n await fs.writeFile(this.historyFile, this.history.slice(-1000).join('\\n'));\n } catch {\n // ignore\n }\n }\n\n private ensure(): readline.Interface {\n if (!this.rl) {\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n history: this.history,\n terminal: process.stdin.isTTY,\n });\n }\n return this.rl;\n }\n\n async readLine(prompt?: string): Promise<string> {\n if (this.history.length === 0) await this.loadHistory();\n while (this.pending) {\n // Wait for the current read to settle before accepting another.\n await new Promise<void>((resolve) => setTimeout(resolve, 50));\n }\n this.pending = true;\n try {\n const rl = this.ensure();\n if ((rl as unknown as { _flushed?: boolean })._flushed) {\n rl.close();\n this.rl = undefined;\n }\n const fresh = this.ensure();\n return new Promise<string>((resolve, reject) => {\n fresh.question(prompt ?? '> ', (line) => {\n if (line.trim()) {\n this.history.push(line);\n void this.saveHistory();\n }\n resolve(line);\n });\n fresh.once('close', () => reject(new Error('EOF')));\n });\n } finally {\n this.pending = false;\n }\n }\n\n async readKey(prompt: string, options: PromptOption[]): Promise<string> {\n process.stdout.write(prompt);\n return new Promise<string>((resolve) => {\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n const wasPaused = stdin.isPaused();\n if (stdin.isTTY) stdin.setRawMode(true);\n stdin.resume();\n const onData = (buf: Buffer) => {\n const key = buf.toString();\n const opt = options.find(\n (o) => o.key.toLowerCase() === key.toLowerCase() || o.value === key,\n );\n if (opt) {\n cleanup();\n process.stdout.write(`${opt.key}\\n`);\n resolve(opt.value);\n }\n };\n const cleanup = () => {\n stdin.off('data', onData);\n if (stdin.isTTY) stdin.setRawMode(wasRaw);\n if (wasPaused) stdin.pause();\n };\n stdin.on('data', onData);\n });\n }\n\n /**\n * Read a line of input while masking each character with a bullet so the\n * user gets visual confirmation that bytes are arriving (especially on\n * paste, which previously felt like nothing happened). Pasted chunks\n * are echoed as a run of bullets, Backspace/DEL erases one bullet, and\n * Ctrl+U / Ctrl+W are honored. Non-TTY input is read normally — there's\n * nothing to hide when piped, and echoing bullets to a file is noise.\n *\n * Returns the raw entered string (no trim — caller decides).\n */\n async readSecret(prompt: string): Promise<string> {\n const stdin = process.stdin;\n if (!stdin.isTTY) return this.readLine(prompt);\n // Tear down the active readline so we can take over stdin.\n this.rl?.close();\n this.rl = undefined;\n process.stdout.write(prompt);\n return new Promise<string>((resolve) => {\n let buf = '';\n const wasRaw = stdin.isRaw;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n const eraseChar = () => {\n // Move cursor back, overwrite with space, move back again.\n process.stdout.write('\\b \\b');\n };\n const eraseAll = () => {\n for (let i = 0; i < buf.length; i++) eraseChar();\n };\n\n const onData = (chunk: string) => {\n // Process the whole chunk at once — paste arrives as one event.\n // We walk char-by-char so embedded control bytes (e.g. a stray\n // CR inside a paste) terminate input cleanly.\n for (const ch of chunk) {\n if (ch === '\\r' || ch === '\\n') {\n cleanup();\n process.stdout.write(` ${dim(`[${buf.length} chars]`)}\\n`);\n resolve(buf);\n return;\n }\n if (ch === '\u0003') {\n // Ctrl+C\n cleanup();\n process.stdout.write('\\n');\n process.exit(130);\n }\n if (ch === '\u0015') {\n // Ctrl+U — clear line\n eraseAll();\n buf = '';\n continue;\n }\n if (ch === '\u0017') {\n // Ctrl+W — erase last whitespace-delimited token\n const m = buf.match(/(\\S+\\s*)$/);\n const drop = m ? m[0].length : buf.length;\n for (let i = 0; i < drop; i++) eraseChar();\n buf = buf.slice(0, buf.length - drop);\n continue;\n }\n if (ch === '' || ch === '\\b') {\n if (buf.length > 0) {\n buf = buf.slice(0, -1);\n eraseChar();\n }\n continue;\n }\n // Skip other control bytes silently (escape sequences, etc.).\n if (ch < ' ') continue;\n buf += ch;\n process.stdout.write('•');\n }\n };\n const cleanup = () => {\n stdin.off('data', onData);\n stdin.setRawMode(wasRaw);\n stdin.pause();\n };\n stdin.on('data', onData);\n });\n }\n\n async close(): Promise<void> {\n await this.saveHistory();\n this.rl?.close();\n this.rl = undefined;\n }\n}\n\n// Local ANSI dim — kept inline so this module has no @wrongstack/core\n// dependency for its single visual flourish.\nfunction dim(s: string): string {\n if (!process.stdout.isTTY) return s;\n return `\u001b[2m${s}\u001b[22m`;\n}\n","import { color } from '@wrongstack/core';\n\nexport function renderDiff(diff: string): string {\n if (!diff) return '';\n const lines = diff.split('\\n');\n return lines\n .map((line) => {\n if (line.startsWith('+++') || line.startsWith('---')) return color.bold(line);\n if (line.startsWith('@@')) return color.cyan(line);\n if (line.startsWith('+')) return color.green(line);\n if (line.startsWith('-')) return color.red(line);\n return color.dim(line);\n })\n .join('\\n');\n}\n","import { color } from '@wrongstack/core';\n\nexport const theme = {\n primary: color.amber,\n accent: color.pink,\n muted: color.dim,\n success: color.green,\n warn: color.yellow,\n error: color.red,\n info: color.cyan,\n bold: color.bold,\n underline: color.underline,\n};\n","import type { Tool, InputReader, ConfirmAwaiter } from '@wrongstack/core';\r\nimport { color } from '@wrongstack/core';\r\nimport { renderDiff } from './diff-renderer.js';\r\nimport { theme } from './theme.js';\r\n\r\nexport type PromptDecision = 'yes' | 'no' | 'always' | 'deny';\r\n\r\nexport function makePromptDelegate(reader: InputReader) {\r\n return async (\r\n tool: Tool,\r\n input: unknown,\r\n suggestedPattern: string,\r\n ): Promise<PromptDecision> => {\r\n process.stdout.write(`\\n${theme.primary('▍')} ${theme.bold(tool.name)}\\n`);\r\n process.stdout.write(`${color.dim(stringifyInput(input))}\\n`);\r\n\r\n if (tool.name === 'edit' && hasDiff(input)) {\r\n const inp = input as { diff?: unknown };\r\n const diff = typeof inp.diff === 'string' ? inp.diff : '';\r\n if (diff) process.stdout.write(`${renderDiff(diff)}\\n`);\r\n }\r\n\r\n process.stdout.write(color.dim('─────────────────\\n'));\r\n const answer = await reader.readKey(\r\n `${theme.bold('[y]')}es ${theme.bold('[n]')}o ${theme.bold('[a]')}lways allow (${suggestedPattern}) ${theme.bold('[d]')}eny: `,\r\n [\r\n { key: 'y', label: 'yes', value: 'yes' },\r\n { key: 'n', label: 'no', value: 'no' },\r\n { key: 'a', label: 'always', value: 'always' },\r\n { key: 'd', label: 'deny', value: 'deny' },\r\n ],\r\n );\r\n return answer as PromptDecision;\r\n };\r\n}\r\n\r\n/**\r\n * Create a ConfirmAwaiter for the CLI path. Wraps makePromptDelegate\r\n * with the ConfirmAwaiter type signature expected by the Agent.\r\n */\r\nexport function makeConfirmAwaiter(reader: InputReader): ConfirmAwaiter {\r\n const delegate = makePromptDelegate(reader);\r\n return async (tool, input, _toolUseId, suggestedPattern) => {\r\n const result = await delegate(tool, input, suggestedPattern);\r\n return result as 'yes' | 'no' | 'always' | 'deny';\r\n };\r\n}\r\n\r\nfunction stringifyInput(input: unknown): string {\r\n if (!input || typeof input !== 'object') return '';\r\n const obj = input as Record<string, unknown>;\r\n return Object.entries(obj)\r\n .filter(([k]) => k !== 'content' && k !== 'new_string')\r\n .map(([k, v]) => `${k}: ${truncate(JSON.stringify(v), 80)}`)\r\n .join(' ');\r\n}\r\n\r\nfunction truncate(s: string, max: number): string {\r\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\r\n}\r\n\r\nfunction hasDiff(input: unknown): boolean {\r\n return Boolean(\r\n input && typeof input === 'object' && 'diff' in (input as Record<string, unknown>),\r\n );\r\n}\r\n","import type { Config, ModelsRegistry, ResolvedProvider } from '@wrongstack/core';\r\nimport { color } from '@wrongstack/core';\r\nimport type { TerminalRenderer } from './renderer.js';\r\nimport type { ReadlineInputReader } from './input-reader.js';\r\n\r\nexport interface PickerResult {\r\n provider: string;\r\n model: string;\r\n}\r\n\r\n/**\r\n * Does this provider have an API key available — either in the\r\n * environment (via one of its known env vars) or stored in config\r\n * (encrypted or plaintext)? Used to filter the picker to providers\r\n * the user can actually use right now.\r\n */\r\nfunction hasApiKey(provider: ResolvedProvider, config?: Config): boolean {\r\n if (provider.envVars.some((v) => !!process.env[v])) return true;\r\n const entry = config?.providers?.[provider.id];\r\n if (!entry) return false;\r\n if (typeof entry.apiKey === 'string' && entry.apiKey.length > 0) return true;\r\n if (Array.isArray(entry.apiKeys) && entry.apiKeys.some((k) => k?.apiKey)) return true;\r\n return false;\r\n}\r\n\r\n/**\r\n * Interactive provider + model picker. Lists supported providers grouped\r\n * by wire family — by default only those with an API key (env or stored\r\n * config), so you see only what you can actually launch into. Falls back\r\n * to the full catalog when no keys are found anywhere.\r\n *\r\n * When `defaultProvider`/`defaultModel` are passed, they're pre-selected\r\n * so the user can press Enter to accept the previous choice.\r\n */\r\nexport async function runPicker(deps: {\r\n modelsRegistry: ModelsRegistry;\r\n renderer: TerminalRenderer;\r\n reader: ReadlineInputReader;\r\n config?: Config;\r\n defaultProvider?: string;\r\n defaultModel?: string;\r\n}): Promise<PickerResult | undefined> {\r\n const { modelsRegistry, renderer, reader, config, defaultProvider, defaultModel } = deps;\r\n\r\n renderer.write(`\\n${color.bold(theme.primary('WrongStack') + color.dim(' — Provider & Model Selection'))}\\n`);\r\n renderer.write(color.dim('Loading provider catalog…\\n'));\r\n\r\n let providers: ResolvedProvider[];\r\n try {\r\n providers = await modelsRegistry.listProviders();\r\n } catch {\r\n renderer.writeError('Failed to load provider catalog. Pass --provider and --model to skip the picker.');\r\n return undefined;\r\n }\r\n\r\n // Drop unsupported wire families — they need a plugin and can't be\r\n // selected through this path.\r\n const supported = providers.filter((p) => p.family !== 'unsupported');\r\n\r\n // Build the display list by overlaying saved config on top of the\r\n // catalog. Two kinds of saved entries matter:\r\n // 1. The map key matches a catalog id (`zai-coding-plan`) — the\r\n // user may have overridden family/baseUrl. We MUST honor those\r\n // overrides for grouping/display, otherwise an entry the user\r\n // saved as `family: \"anthropic\"` would still appear under the\r\n // catalog's `openai-compatible` group.\r\n // 2. The map key is an alias not in the catalog. Its `cfg.type` may\r\n // still point at a catalog id, in which case we inherit the\r\n // model list and display name from there.\r\n const catalogById = new Map(supported.map((p) => [p.id, p]));\r\n const overlay = config?.providers ?? {};\r\n const seen = new Set<string>();\r\n const merged: ResolvedProvider[] = [];\r\n for (const p of supported) {\r\n const cfg = overlay[p.id];\r\n seen.add(p.id);\r\n if (cfg) {\r\n merged.push({\r\n ...p,\r\n family: cfg.family ?? p.family,\r\n apiBase: cfg.baseUrl ?? p.apiBase,\r\n envVars: cfg.envVars && cfg.envVars.length > 0 ? cfg.envVars : p.envVars,\r\n // When the user has saved an explicit model list, it wins — they\r\n // know which models their endpoint actually serves (e.g. LM\r\n // Studio, vLLM, or a proxy with custom model ids). Otherwise the\r\n // catalog list keeps providing suggestions.\r\n models:\r\n cfg.models && cfg.models.length > 0\r\n ? cfg.models.map((m) => ({ id: m, name: m }))\r\n : p.models,\r\n });\r\n } else {\r\n merged.push(p);\r\n }\r\n }\r\n for (const [id, cfg] of Object.entries(overlay)) {\r\n if (seen.has(id)) continue;\r\n if (!cfg?.family || cfg.family === 'unsupported') continue;\r\n const catalogType = cfg.type && cfg.type !== id ? cfg.type : undefined;\r\n const inherited = catalogType ? catalogById.get(catalogType) : undefined;\r\n merged.push({\r\n id,\r\n name: inherited ? `${inherited.name} ${color.dim('(alias)')}` : id,\r\n family: cfg.family,\r\n apiBase: cfg.baseUrl ?? inherited?.apiBase,\r\n envVars: cfg.envVars ?? inherited?.envVars ?? [],\r\n models:\r\n cfg.models && cfg.models.length > 0\r\n ? cfg.models.map((m) => ({ id: m, name: m }))\r\n : inherited?.models ?? [],\r\n npm: inherited?.npm,\r\n });\r\n }\r\n\r\n if (merged.length === 0) {\r\n renderer.writeError('No supported providers found in catalog.');\r\n return undefined;\r\n }\r\n\r\n // Filter to keyed providers. If none are keyed (fresh install, no env\r\n // vars set), fall back to the full list and prompt the user to add a\r\n // key — picking a keyless provider here is still useful because the\r\n // very next step (`wstack auth <prov>`) needs to know which provider.\r\n const keyed = merged.filter((p) => hasApiKey(p, config));\r\n let displayList = keyed;\r\n let showingFallback = false;\r\n if (keyed.length === 0) {\r\n displayList = merged;\r\n showingFallback = true;\r\n }\r\n\r\n // Group by family for nicer display\r\n const families = new Map<string, ResolvedProvider[]>();\r\n for (const p of displayList) {\r\n const list = families.get(p.family) ?? [];\r\n list.push(p);\r\n families.set(p.family, list);\r\n }\r\n\r\n // Build a flat numbered list (family → providers). Track which entry\r\n // matches the current default so we can highlight + accept Enter.\r\n const ordered: Array<{ provider: ResolvedProvider; index: number }> = [];\r\n const familyOrder = ['anthropic', 'openai', 'google', 'openai-compatible'];\r\n let idx = 1;\r\n let defaultIdx: number | undefined;\r\n renderer.write('\\n');\r\n for (const fam of familyOrder) {\r\n const list = families.get(fam);\r\n if (!list || list.length === 0) continue;\r\n renderer.write(` ${color.bold(fam)}\\n`);\r\n for (const p of list) {\r\n const envFound = p.envVars.some((v) => !!process.env[v]);\r\n const entry = config?.providers?.[p.id];\r\n const configKey =\r\n (typeof entry?.apiKey === 'string' && entry.apiKey.length > 0) ||\r\n (Array.isArray(entry?.apiKeys) && entry!.apiKeys!.some((k) => k?.apiKey));\r\n // ● green = env key, ◉ cyan = stored in config, ○ dim = no key\r\n const marker = envFound\r\n ? color.green('●')\r\n : configKey\r\n ? color.cyan('◉')\r\n : color.dim('○');\r\n const isDefault = p.id === defaultProvider;\r\n if (isDefault) defaultIdx = idx;\r\n const idLabel = isDefault ? color.bold(p.id) : p.id;\r\n const suffix = isDefault ? color.dim(' (default)') : '';\r\n renderer.write(\r\n ` ${color.dim(`${idx}.`.padStart(4))} ${marker} ${idLabel.padEnd(22)} ${color.dim(p.name)}${suffix}\\n`,\r\n );\r\n ordered.push({ provider: p, index: idx });\r\n idx++;\r\n }\r\n }\r\n\r\n if (showingFallback) {\r\n renderer.write(\r\n `\\n ${color.yellow('⚠ No API keys detected.')} ${color.dim('Pick a provider, then run `wstack auth <provider>` to add one.')}\\n`,\r\n );\r\n } else {\r\n renderer.write(\r\n `\\n ${color.dim('● = env key ◉ = stored in config ○ = no key')}\\n`,\r\n );\r\n }\r\n\r\n // Provider prompt. Enter on an empty line accepts the default when one\r\n // is present; otherwise we treat it as cancel.\r\n const defaultHint =\r\n defaultIdx !== undefined && defaultProvider\r\n ? ` ${color.dim(`[Enter = ${defaultProvider}]`)}`\r\n : '';\r\n const providerAnswer = (\r\n await reader.readLine(`\\n${color.amber('?')} Select provider (1-${ordered.length})${defaultHint}: `)\r\n ).trim();\r\n\r\n if (!providerAnswer) {\r\n if (defaultIdx !== undefined) {\r\n const def = ordered[defaultIdx - 1];\r\n if (def) return pickModel(def.provider, modelsRegistry, renderer, reader, defaultModel);\r\n }\r\n renderer.write(color.dim('Cancelled.\\n'));\r\n return undefined;\r\n }\r\n\r\n const providerIdx = Number.parseInt(providerAnswer, 10);\r\n if (Number.isNaN(providerIdx) || providerIdx < 1 || providerIdx > ordered.length) {\r\n // Try matching by id\r\n const byId = ordered.find((o) => o.provider.id.toLowerCase() === providerAnswer.toLowerCase());\r\n if (!byId) {\r\n renderer.writeError(`Invalid selection: \"${providerAnswer}\"`);\r\n return undefined;\r\n }\r\n return pickModel(byId.provider, modelsRegistry, renderer, reader, defaultModel);\r\n }\r\n\r\n const chosen = ordered[providerIdx - 1];\r\n if (!chosen) return undefined;\r\n // Only honor the default-model hint when the user picked the default\r\n // provider; switching providers invalidates it.\r\n const modelHint = chosen.provider.id === defaultProvider ? defaultModel : undefined;\r\n return pickModel(chosen.provider, modelsRegistry, renderer, reader, modelHint);\r\n}\r\n\r\nasync function pickModel(\r\n provider: ResolvedProvider,\r\n registry: ModelsRegistry,\r\n renderer: TerminalRenderer,\r\n reader: ReadlineInputReader,\r\n defaultModel?: string,\r\n): Promise<PickerResult | undefined> {\r\n renderer.write(`\\n ${color.bold(provider.name)} ${color.dim(`(${provider.id})`)} models:\\n\\n`);\r\n\r\n const models = [...provider.models].sort((a, b) =>\r\n (b.release_date ?? '').localeCompare(a.release_date ?? ''),\r\n );\r\n\r\n if (models.length === 0) {\r\n renderer.writeError(' No models listed for this provider in the catalog.');\r\n return undefined;\r\n }\r\n\r\n // Find default-model index for the \"Enter = default\" hint.\r\n const defaultIdxInModels =\r\n defaultModel !== undefined ? models.findIndex((m) => m.id === defaultModel) : -1;\r\n\r\n // Show paginated — up to 30 at a time\r\n const pageSize = 30;\r\n let offset = 0;\r\n\r\n while (offset < models.length) {\r\n const page = models.slice(offset, offset + pageSize);\r\n for (let i = 0; i < page.length; i++) {\r\n const m = page[i]!;\r\n const num = offset + i + 1;\r\n const ctx = m.limit?.context ? `${(m.limit.context / 1000).toFixed(0)}k`.padStart(6) : ' ?';\r\n const cost =\r\n m.cost?.input !== undefined\r\n ? `$${m.cost.input}/$${m.cost.output ?? '?'}`\r\n : '';\r\n const caps: string[] = [];\r\n if (m.tool_call) caps.push('tools');\r\n if (m.reasoning) caps.push('reason');\r\n if (m.modalities?.input?.includes('image')) caps.push('vision');\r\n const capStr = caps.length > 0 ? color.dim(caps.join(',')) : '';\r\n const isDefault = m.id === defaultModel;\r\n const idLabel = isDefault ? color.bold(m.id) : m.id;\r\n const suffix = isDefault ? color.dim(' (default)') : '';\r\n renderer.write(\r\n ` ${color.dim(`${num}.`.padStart(5))} ${idLabel.padEnd(44)} ${color.dim(ctx)} ${color.dim(cost.padEnd(14))} ${capStr}${suffix}\\n`,\r\n );\r\n }\r\n offset += pageSize;\r\n\r\n if (offset < models.length) {\r\n const more = (\r\n await reader.readLine(\r\n `\\n${color.amber('?')} Showing ${Math.min(offset, models.length)}/${models.length} — Enter number or ${color.dim('Enter')} for more: `,\r\n )\r\n ).trim();\r\n if (!more) continue; // show next page\r\n return resolveModelSelection(more, models, provider, registry, renderer, reader);\r\n }\r\n }\r\n\r\n // All shown — final prompt. Enter accepts the default model when present.\r\n const defaultHint =\r\n defaultIdxInModels >= 0 && defaultModel\r\n ? ` ${color.dim(`[Enter = ${defaultModel}]`)}`\r\n : '';\r\n const answer = (\r\n await reader.readLine(`\\n${color.amber('?')} Select model (1-${models.length})${defaultHint}: `)\r\n ).trim();\r\n if (!answer) {\r\n if (defaultIdxInModels >= 0 && defaultModel) {\r\n renderer.write(\r\n `\\n ${color.green('✓')} ${color.bold(provider.id)} / ${color.bold(defaultModel)}\\n\\n`,\r\n );\r\n return { provider: provider.id, model: defaultModel };\r\n }\r\n renderer.write(color.dim('Cancelled.\\n'));\r\n return undefined;\r\n }\r\n return resolveModelSelection(answer, models, provider, registry, renderer, reader);\r\n}\r\n\r\nasync function resolveModelSelection(\r\n answer: string,\r\n models: import('@wrongstack/core').ModelsDevModel[],\r\n provider: ResolvedProvider,\r\n _registry: ModelsRegistry,\r\n renderer: TerminalRenderer,\r\n _reader: ReadlineInputReader,\r\n): Promise<PickerResult | undefined> {\r\n const idx = Number.parseInt(answer, 10);\r\n let modelId: string | undefined;\r\n\r\n if (!Number.isNaN(idx) && idx >= 1 && idx <= models.length) {\r\n modelId = models[idx - 1]!.id;\r\n } else {\r\n // Try fuzzy matching by id\r\n const lower = answer.toLowerCase();\r\n const match = models.find((m) => m.id.toLowerCase() === lower);\r\n if (match) {\r\n modelId = match.id;\r\n } else {\r\n // Partial match\r\n const partial = models.filter((m) => m.id.toLowerCase().includes(lower));\r\n if (partial.length === 1) {\r\n modelId = partial[0]!.id;\r\n } else if (partial.length > 1) {\r\n renderer.writeError(`\"${answer}\" matches multiple models. Be more specific.`);\r\n return undefined;\r\n }\r\n }\r\n }\r\n\r\n if (!modelId) {\r\n // Use as-is (user might know the exact model string)\r\n modelId = answer;\r\n }\r\n\r\n renderer.write(\r\n `\\n ${color.green('✓')} ${color.bold(provider.id)} / ${color.bold(modelId)}\\n\\n`,\r\n );\r\n\r\n return { provider: provider.id, model: modelId };\r\n}\r\n\r\n// --- Helpers ---\r\n\r\n// Simple theme alias (avoids importing the full theme module just for one color)\r\nconst theme = { primary: color.amber };\r\n\r\n/**\r\n * Save provider + model to the global config file.\r\n * Returns true if saved successfully.\r\n */\r\nexport async function saveToGlobalConfig(\r\n configPath: string,\r\n provider: string,\r\n model: string,\r\n): Promise<boolean> {\r\n try {\r\n const { atomicWrite } = await import('@wrongstack/core');\r\n const fs = await import('node:fs/promises');\r\n\r\n let existing: Record<string, unknown> = {};\r\n try {\r\n const raw = await fs.readFile(configPath, 'utf8');\r\n existing = JSON.parse(raw) as Record<string, unknown>;\r\n } catch {\r\n // No existing config\r\n }\r\n\r\n existing.provider = provider;\r\n existing.model = model;\r\n await atomicWrite(configPath, JSON.stringify(existing, null, 2));\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import * as fs from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport type {\r\n SlashCommand,\r\n SlashCommandRegistry,\r\n ToolRegistry,\r\n Compactor,\r\n SessionStore,\r\n SkillLoader,\r\n TokenCounter,\r\n Renderer,\r\n Context,\r\n MemoryStore,\r\n MetricsSink,\r\n HealthRegistry,\r\n} from '@wrongstack/core';\r\nimport { color } from '@wrongstack/core';\r\n\r\nexport interface SlashCommandContext {\r\n registry: SlashCommandRegistry;\r\n toolRegistry: ToolRegistry;\r\n compactor?: Compactor;\r\n sessionStore?: SessionStore;\r\n skillLoader?: SkillLoader;\r\n tokenCounter: TokenCounter;\r\n renderer: Renderer;\r\n memoryStore?: MemoryStore;\r\n context?: Context;\r\n metricsSink?: MetricsSink;\r\n healthRegistry?: HealthRegistry;\r\n onExit?: () => void;\r\n onClear?: () => void;\r\n /**\r\n * Returns the diagnostics text. The TUI surfaces this as a history\r\n * entry (the renderer is silent there); REPL prints it via its\r\n * dispatcher. Avoid writing to the renderer directly from here — that\r\n * would either double-print in REPL or get swallowed by the TUI.\r\n */\r\n onDiag?: () => string;\r\n /** Same contract as `onDiag`. Returns `null` when there's no activity yet. */\r\n onStats?: () => string | null;\r\n /**\r\n * Optional spawn handler — wired by the CLI when the multi-agent host is\r\n * available. Receives the task description and returns a one-line summary\r\n * once the subagent finishes (or an error). When unset, `/spawn` reports\r\n * that multi-agent is not enabled.\r\n */\r\n onSpawn?: (description: string) => Promise<string>;\r\n /** Lists active and completed subagents. Same on/off semantics as onSpawn. */\r\n onAgents?: () => string;\r\n}\r\n\r\nexport function buildBuiltinSlashCommands(opts: SlashCommandContext): SlashCommand[] {\r\n return [\r\n helpCommand(opts),\r\n initCommand(opts),\r\n clearCommand(opts),\r\n compactCommand(opts),\r\n contextCommand(opts),\r\n toolsCommand(opts),\r\n skillCommand(opts),\r\n diagCommand(opts),\r\n statsCommand(opts),\r\n spawnCommand(opts),\r\n agentsCommand(opts),\r\n metricsCommand(opts),\r\n healthCommand(opts),\r\n memoryCommand(opts),\r\n saveCommand(opts),\r\n loadCommand(opts),\r\n exitCommand(opts),\r\n ];\r\n}\r\n\r\nfunction memoryCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'memory',\r\n description:\r\n 'Inspect or edit persistent memory: /memory [show|remember <text>|forget <query>|clear]',\r\n async run(args) {\r\n const store = opts.memoryStore;\r\n if (!store) return { message: 'No memory store configured.' };\r\n const [verb, ...rest] = args.trim().split(/\\s+/);\r\n const restJoined = rest.join(' ').trim();\r\n switch (verb) {\r\n case '':\r\n case 'show':\r\n case 'list': {\r\n const text = await store.readAll();\r\n return {\r\n message: text.trim().length === 0\r\n ? 'Memory is empty. Add an entry with `/memory remember <text>`.'\r\n : text,\r\n };\r\n }\r\n case 'remember':\r\n case 'add': {\r\n if (!restJoined) return { message: 'Usage: /memory remember <text>' };\r\n await store.remember(restJoined);\r\n return { message: `Remembered: ${restJoined}` };\r\n }\r\n case 'forget':\r\n case 'rm': {\r\n if (!restJoined) return { message: 'Usage: /memory forget <query>' };\r\n const n = await store.forget(restJoined);\r\n return {\r\n message:\r\n n === 0 ? `No entries matched \"${restJoined}\".` : `Forgot ${n} entries.`,\r\n };\r\n }\r\n case 'clear': {\r\n await store.clear();\r\n return { message: 'Cleared all memory scopes.' };\r\n }\r\n default:\r\n return {\r\n message: `Unknown subcommand \"${verb}\". Try: show | remember <text> | forget <query> | clear`,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Bootstrap a `.wrongstack/AGENTS.md` in the current project. We try to\r\n * sniff the repo for common build/test commands so the file starts with\r\n * useful content instead of a blank template — the user is meant to edit\r\n * it, but those defaults remove the friction of staring at a blank page.\r\n */\r\nfunction initCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'init',\r\n description: 'Scaffold .wrongstack/AGENTS.md in the current project.',\r\n async run(args, ctx) {\r\n const force = args.trim() === '--force';\r\n const dir = path.join(ctx.projectRoot, '.wrongstack');\r\n const file = path.join(dir, 'AGENTS.md');\r\n try {\r\n await fs.access(file);\r\n if (!force) {\r\n const msg = `AGENTS.md already exists at ${file}. Use \"/init --force\" to overwrite.`;\r\n opts.renderer.writeWarning(msg);\r\n return { message: msg };\r\n }\r\n } catch {\r\n // doesn't exist — proceed\r\n }\r\n const detected = await detectProjectFacts(ctx.projectRoot);\r\n const body = renderAgentsTemplate(detected);\r\n await fs.mkdir(dir, { recursive: true });\r\n await fs.writeFile(file, body, 'utf8');\r\n if (detected.hints.length > 0) {\r\n const msg = `Wrote ${file}\\nPre-filled: ${detected.hints.join(', ')}. Edit the file to add anything else worth remembering.`;\r\n opts.renderer.writeInfo(`Wrote ${file}`);\r\n opts.renderer.writeInfo(`Pre-filled: ${detected.hints.join(', ')}. Edit the file to add anything else worth remembering.`);\r\n return { message: msg };\r\n }\r\n const msg = `Wrote ${file}\\nNo project type auto-detected. Edit the file to add build/test commands and conventions.`;\r\n opts.renderer.writeInfo(`Wrote ${file}`);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nexport interface ProjectFacts {\r\n build?: string;\r\n test?: string;\r\n lint?: string;\r\n run?: string;\r\n hints: string[];\r\n}\r\n\r\nexport async function detectProjectFacts(root: string): Promise<ProjectFacts> {\r\n const facts: ProjectFacts = { hints: [] };\r\n // package.json\r\n try {\r\n const pkg = JSON.parse(await fs.readFile(path.join(root, 'package.json'), 'utf8')) as {\r\n scripts?: Record<string, string>;\r\n packageManager?: string;\r\n };\r\n const scripts = pkg.scripts ?? {};\r\n const pm = (pkg.packageManager ?? 'npm').split('@')[0] ?? 'npm';\r\n if (scripts['build']) facts.build = `${pm} run build`;\r\n if (scripts['test']) facts.test = `${pm} test`;\r\n if (scripts['lint']) facts.lint = `${pm} run lint`;\r\n if (scripts['dev'] ?? scripts['start']) facts.run = `${pm} run ${scripts['dev'] ? 'dev' : 'start'}`;\r\n facts.hints.push('package.json scripts');\r\n } catch {\r\n // not node\r\n }\r\n // pyproject.toml\r\n try {\r\n await fs.access(path.join(root, 'pyproject.toml'));\r\n facts.test ??= 'pytest';\r\n facts.lint ??= 'ruff check .';\r\n facts.hints.push('pyproject.toml');\r\n } catch {\r\n // not python\r\n }\r\n // go.mod\r\n try {\r\n await fs.access(path.join(root, 'go.mod'));\r\n facts.build ??= 'go build ./...';\r\n facts.test ??= 'go test ./...';\r\n facts.hints.push('go.mod');\r\n } catch {\r\n // not go\r\n }\r\n // Cargo.toml\r\n try {\r\n await fs.access(path.join(root, 'Cargo.toml'));\r\n facts.build ??= 'cargo build';\r\n facts.test ??= 'cargo test';\r\n facts.hints.push('Cargo.toml');\r\n } catch {\r\n // not rust\r\n }\r\n // Makefile — last resort\r\n try {\r\n await fs.access(path.join(root, 'Makefile'));\r\n facts.build ??= 'make';\r\n facts.test ??= 'make test';\r\n facts.hints.push('Makefile');\r\n } catch {\r\n // no make\r\n }\r\n return facts;\r\n}\r\n\r\nexport function renderAgentsTemplate(f: ProjectFacts): string {\r\n const cmd = (s?: string) => (s ? `\\`${s}\\`` : '_TODO_');\r\n return `# AGENTS.md\r\n\r\nProject notes for WrongStack. Committed to the repo so every contributor\r\n(human or agent) starts with the same context. Edit freely.\r\n\r\n## What this project is\r\n\r\n_One paragraph: what does this codebase do, who runs it, what's the\r\ndeployment target?_\r\n\r\n## How to work on it\r\n\r\n- **Build:** ${cmd(f.build)}\r\n- **Test:** ${cmd(f.test)}\r\n- **Lint:** ${cmd(f.lint)}\r\n- **Run locally:** ${cmd(f.run)}\r\n\r\n## Conventions\r\n\r\n_What style choices matter here? Filenames, module layout, naming, error\r\nhandling, log format. Anything a stranger would get wrong._\r\n\r\n## Domain knowledge\r\n\r\n_Acronyms, business rules, foot-guns, \"this looks weird but it's\r\nintentional because…\"._\r\n\r\n## Pointers\r\n\r\n_Where to look for: routing, database migrations, feature flags,\r\non-call runbooks, dashboards._\r\n`;\r\n}\r\n\r\nfunction diagCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'diag',\r\n description: 'Show runtime diagnostics (provider, tokens, tools, MCP).',\r\n async run() {\r\n if (!opts.onDiag) return { message: 'Diag not available in this context.' };\r\n return { message: opts.onDiag() };\r\n },\r\n };\r\n}\r\n\r\nfunction statsCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'stats',\r\n description: 'Show session report: tokens, requests, tools, files, cost.',\r\n async run() {\r\n if (!opts.onStats) return { message: 'Stats not available in this context.' };\r\n const text = opts.onStats();\r\n return { message: text ?? 'No session activity recorded yet.' };\r\n },\r\n };\r\n}\r\n\r\nfunction helpCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'help',\r\n description: 'Show available slash commands. Pass a name for detailed help.',\r\n help: [\r\n 'Usage:',\r\n ' /help List every command with its one-line description.',\r\n ' /help <name> Show detailed help for one command (falls back to the description).',\r\n '',\r\n 'Examples:',\r\n ' /help',\r\n ' /help context',\r\n ' /help model',\r\n ].join('\\n'),\r\n async run(args) {\r\n const query = args.trim();\r\n if (query) {\r\n // Strip a leading slash if the user wrote `/help /foo`.\r\n const needle = query.startsWith('/') ? query.slice(1) : query;\r\n let match:\r\n | { cmd: SlashCommand; owner: string; fullName: string }\r\n | undefined;\r\n for (const entry of opts.registry.listWithOwner()) {\r\n const aliases = entry.cmd.aliases ?? [];\r\n const candidates = [\r\n entry.cmd.name,\r\n entry.fullName,\r\n ...aliases,\r\n ...aliases.map(\r\n (a) => (entry.owner === 'core' ? a : `${entry.owner}:${a}`),\r\n ),\r\n ];\r\n if (candidates.includes(needle)) {\r\n match = entry;\r\n break;\r\n }\r\n }\r\n if (!match) {\r\n return { message: `Unknown command: /${needle}. Run /help to list commands.` };\r\n }\r\n const prefix = match.owner === 'core' ? '' : `${match.owner}:`;\r\n const header = `/${prefix}${match.cmd.name}`;\r\n const aliasLine =\r\n match.cmd.aliases && match.cmd.aliases.length > 0\r\n ? `Aliases: ${match.cmd.aliases.map((a) => `/${prefix}${a}`).join(', ')}\\n`\r\n : '';\r\n const body = match.cmd.help ?? match.cmd.description;\r\n return {\r\n message: [\r\n header,\r\n '─'.repeat(header.length),\r\n aliasLine + (match.cmd.help ? '' : `${match.cmd.description}\\n`),\r\n body,\r\n ]\r\n .filter(Boolean)\r\n .join('\\n'),\r\n };\r\n }\r\n const lines = ['Available slash commands:'];\r\n for (const { cmd, owner } of opts.registry.listWithOwner()) {\r\n const isBuiltin = owner === 'core';\r\n const prefix = isBuiltin ? '' : `${owner}:`;\r\n const aliases = cmd.aliases\r\n ? cmd.aliases.map((a) => `/${prefix}${a}`).join(', ')\r\n : '';\r\n const aliasStr = aliases ? ` (${aliases})` : '';\r\n lines.push(` /${prefix}${cmd.name}${aliasStr} — ${cmd.description}`);\r\n }\r\n lines.push('', 'Run `/help <name>` for detailed help on a specific command.');\r\n return { message: lines.join('\\n') };\r\n },\r\n };\r\n}\r\n\r\nfunction clearCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'clear',\r\n description: 'Reset the session and start a new one.',\r\n help: [\r\n 'Usage:',\r\n ' /clear',\r\n '',\r\n 'Wipes everything in the current REPL state: messages, todos, read-file tracking,',\r\n 'file mtimes, meta. Memory store entries (all scopes) are cleared too. The terminal',\r\n 'is wiped. Use this when you want a fresh conversation without restarting `wstack`.',\r\n ].join('\\n'),\r\n async run(_args, ctx) {\r\n // Clear context: messages, todos, readFiles, fileMtimes\r\n if (ctx) {\r\n ctx.messages = [];\r\n ctx.todos = [];\r\n ctx.readFiles.clear();\r\n ctx.fileMtimes.clear();\r\n ctx.meta = {};\r\n }\r\n // Clear memory store (all scopes)\r\n await opts.memoryStore?.clear();\r\n opts.onClear?.();\r\n opts.renderer.clear();\r\n const msg = 'Session cleared (context, memory, and history reset).';\r\n opts.renderer.writeInfo(msg);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction contextCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'context',\r\n aliases: ['ctx'],\r\n description: 'Show context window summary.',\r\n help: [\r\n 'Usage:',\r\n ' /context Show counts: messages, est. tokens, tool calls, todos, read files.',\r\n ' /context detail As above, plus model, cwd, projectRoot, and the file list.',\r\n '',\r\n 'Token estimate is a `chars ÷ 4` heuristic, not a real tokenizer call —',\r\n 'good enough to spot growth between turns.',\r\n ].join('\\n'),\r\n async run(args, ctx) {\r\n const messages = ctx.messages;\r\n const detailed = args.trim() === 'detail';\r\n\r\n const pairCount = countTurnPairs(messages);\r\n const estimatedTokens = estimateTokens(messages);\r\n const toolUseCount = countToolUses(messages);\r\n const toolResultCount = countToolResults(messages);\r\n\r\n const lines = [\r\n `${color.bold('Context Window')}`,\r\n ` messages: ${messages.length} total (${pairCount} user+assistant pairs)`,\r\n ` tokens (≈): ${estimatedTokens.toLocaleString()} (chars ÷ 4 estimate)`,\r\n ` system prompt: ${ctx.systemPrompt.length} block${ctx.systemPrompt.length !== 1 ? 's' : ''}`,\r\n ` tools: ${toolUseCount} calls made, ${toolResultCount} results in history`,\r\n ` read files: ${ctx.readFiles.size} files`,\r\n ` todos: ${ctx.todos.filter((t) => t.status === 'in_progress').length} in_progress / ${ctx.todos.filter((t) => t.status === 'pending').length} pending / ${ctx.todos.filter((t) => t.status === 'completed').length} completed`,\r\n ];\r\n\r\n if (detailed) {\r\n lines.push(` model: ${ctx.model}`);\r\n lines.push(` cwd: ${ctx.cwd}`);\r\n lines.push(` projectRoot: ${ctx.projectRoot}`);\r\n lines.push(` file mtimes: ${ctx.fileMtimes.size} tracked`);\r\n if (ctx.readFiles.size > 0) {\r\n lines.push(` file list: ${[...ctx.readFiles].join(', ')}`);\r\n }\r\n }\r\n\r\n const msg = lines.join('\\n');\r\n opts.renderer.write(`${msg}\\n`);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction countTurnPairs(messages: Context['messages']): number {\r\n let count = 0;\r\n for (const m of messages) {\r\n if (m.role === 'user' || m.role === 'assistant') count++;\r\n }\r\n return Math.floor(count / 2);\r\n}\r\n\r\nfunction countToolUses(messages: Context['messages']): number {\r\n let count = 0;\r\n for (const m of messages) {\r\n const content = m.content;\r\n if (Array.isArray(content)) {\r\n count += content.filter((b) => b.type === 'tool_use').length;\r\n }\r\n }\r\n return count;\r\n}\r\n\r\nfunction countToolResults(messages: Context['messages']): number {\r\n let count = 0;\r\n for (const m of messages) {\r\n const content = m.content;\r\n if (Array.isArray(content)) {\r\n count += content.filter((b) => b.type === 'tool_result').length;\r\n }\r\n }\r\n return count;\r\n}\r\n\r\nfunction estimateTokens(messages: Context['messages']): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n const content = m.content;\r\n if (typeof content === 'string') {\r\n total += Math.ceil(content.length / 4);\r\n } else if (Array.isArray(content)) {\r\n for (const b of content) {\r\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\r\n else if (b.type === 'tool_use' || b.type === 'tool_result') {\r\n total += Math.ceil(JSON.stringify(b).length / 4);\r\n }\r\n }\r\n }\r\n }\r\n return total;\r\n}\r\n\r\nfunction compactCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'compact',\r\n description: 'Compact the context window.',\r\n help: [\r\n 'Usage:',\r\n ' /compact Run the configured compactor with default settings.',\r\n ' /compact aggressive Compact more aggressively — keeps fewer recent turns verbatim.',\r\n '',\r\n 'The compactor summarizes older turns to reclaim tokens. The default keeps the most',\r\n 'recent K message pairs untouched; aggressive halves that window.',\r\n ].join('\\n'),\r\n async run(args, ctx) {\r\n if (!opts.compactor) {\r\n const msg = 'No compactor configured.';\r\n opts.renderer.writeWarning(msg);\r\n return { message: msg };\r\n }\r\n const aggressive = args.trim() === 'aggressive';\r\n const report = await opts.compactor.compact(ctx, { aggressive });\r\n const msg =\r\n `Compaction: ${report.before} → ${report.after} tokens (${report.reductions\r\n .map((r) => `${r.phase}: ${r.saved}`)\r\n .join(', ')})`;\r\n opts.renderer.writeInfo(msg);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction toolsCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'tools',\r\n description: 'List registered tools.',\r\n async run() {\r\n const all = opts.toolRegistry.listWithOwner();\r\n const lines = all.map(({ tool, owner }) => {\r\n return ` ${tool.name.padEnd(28)} ${color.dim(`[${owner}]`)} ${tool.mutating ? color.yellow('mut') : color.cyan('ro')} ${color.dim(tool.permission)}`;\r\n });\r\n const msg = `${color.bold('Tools')} (${all.length}):\\n${lines.join('\\n')}\\n`;\r\n opts.renderer.write(msg);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction skillCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'skill',\r\n description: 'Show a skill manifest or list skills.',\r\n async run(args) {\r\n if (!opts.skillLoader) {\r\n const msg = 'No skill loader configured.';\r\n return { message: msg };\r\n }\r\n if (!args.trim()) {\r\n const list = await opts.skillLoader.list();\r\n if (list.length === 0) {\r\n const msg = 'No skills found.';\r\n return { message: msg };\r\n }\r\n const lines = list.map((s) => ` ${s.name.padEnd(24)} ${color.dim(`[${s.source}]`)} ${s.description.split('\\n')[0]}`);\r\n const msg = `Skills:\\n${lines.join('\\n')}\\n`;\r\n return { message: msg };\r\n }\r\n const skill = await opts.skillLoader.find(args.trim());\r\n if (!skill) {\r\n const msg = `Skill \"${args.trim()}\" not found.`;\r\n return { message: msg };\r\n }\r\n const body = await opts.skillLoader.readBody(skill.name);\r\n return { message: body };\r\n },\r\n };\r\n}\r\n\r\nfunction saveCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'save',\r\n description: 'Save current session (auto by default; this forces flush).',\r\n async run(_args, ctx) {\r\n await ctx.session.append({\r\n type: 'session_end',\r\n ts: new Date().toISOString(),\r\n usage: opts.tokenCounter.total(),\r\n });\r\n const msg = `Session ${ctx.session.id} flushed.`;\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction loadCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'resume',\r\n aliases: ['load', 'sessions'],\r\n description:\r\n 'List recent sessions. To actually resume, exit and run `wstack resume <id>`.',\r\n async run() {\r\n if (!opts.sessionStore) {\r\n const msg = 'No session store configured.';\r\n return { message: msg };\r\n }\r\n const list = await opts.sessionStore.list(10);\r\n if (list.length === 0) {\r\n const msg = 'No saved sessions.';\r\n return { message: msg };\r\n }\r\n const lines = list.map(\r\n (s) =>\r\n ` ${s.id} ${color.dim(s.startedAt)} ${color.dim(`${s.tokenTotal} tok`)} ${s.title}`,\r\n );\r\n const msg =\r\n `Recent sessions:\\n${lines.join('\\n')}\\n\\n` +\r\n color.dim(`Resume one with: wstack resume ${list[0]?.id ?? '<id>'}\\n`);\r\n opts.renderer.write(msg);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction exitCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'exit',\r\n aliases: ['quit', 'q'],\r\n description: 'Exit the REPL.',\r\n async run() {\r\n opts.onExit?.();\r\n return { exit: true };\r\n },\r\n };\r\n}\r\n\r\nfunction metricsCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'metrics',\r\n description: 'Show metrics snapshot (requires --metrics flag).',\r\n async run() {\r\n if (!opts.metricsSink) {\r\n return { message: 'Metrics not enabled. Restart with --metrics to collect.' };\r\n }\r\n const snap = opts.metricsSink.snapshot();\r\n if (snap.series.length === 0) {\r\n return { message: 'No metrics recorded yet.' };\r\n }\r\n const lines: string[] = [];\r\n // Group by metric name for a more readable dump\r\n const byName = new Map<string, typeof snap.series>();\r\n for (const s of snap.series) {\r\n const bucket = byName.get(s.name) ?? [];\r\n bucket.push(s);\r\n byName.set(s.name, bucket);\r\n }\r\n for (const [name, series] of [...byName.entries()].sort()) {\r\n lines.push(color.dim(`# ${name}`));\r\n for (const s of series) {\r\n const labels = Object.entries(s.labels).map(([k, v]) => `${k}=${v}`).join(' ');\r\n const labelStr = labels ? color.dim(` {${labels}}`) : '';\r\n if (s.type === 'histogram') {\r\n lines.push(\r\n ` count=${s.values.count} sum=${s.values.sum} min=${s.values.min} max=${s.values.max} p50=${s.values.p50} p95=${s.values.p95} p99=${s.values.p99}${labelStr}`,\r\n );\r\n } else {\r\n lines.push(` ${s.values.value}${labelStr}`);\r\n }\r\n }\r\n }\r\n const msg = lines.join('\\n');\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction healthCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'health',\r\n description: 'Run health checks (requires --metrics flag).',\r\n async run() {\r\n if (!opts.healthRegistry) {\r\n return { message: 'Health checks not enabled. Restart with --metrics.' };\r\n }\r\n const result = await opts.healthRegistry.run();\r\n const lines: string[] = [\r\n `${statusIcon(result.status)} overall: ${result.status}`,\r\n ...result.checks.map((c) => {\r\n const detail = c.detail ? color.dim(` — ${c.detail}`) : '';\r\n return ` ${statusIcon(c.status)} ${c.name}: ${c.status}${detail}`;\r\n }),\r\n ];\r\n return { message: lines.join('\\n') };\r\n },\r\n };\r\n}\r\n\r\nfunction statusIcon(status: string): string {\r\n if (status === 'healthy') return color.green('●');\r\n if (status === 'degraded') return color.yellow('●');\r\n return color.red('●');\r\n}\r\n\r\nfunction spawnCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'spawn',\r\n description:\r\n 'Spawn an isolated subagent to handle a task. Usage: /spawn <task description>',\r\n async run(args) {\r\n const description = args.trim();\r\n if (!description) return { message: 'Usage: /spawn <task description>' };\r\n if (!opts.onSpawn) {\r\n return { message: 'Multi-agent is not enabled in this session.' };\r\n }\r\n try {\r\n const summary = await opts.onSpawn(description);\r\n return { message: summary };\r\n } catch (err) {\r\n return {\r\n message: `Spawn failed: ${err instanceof Error ? err.message : String(err)}`,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n\r\nfunction agentsCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'agents',\r\n description: 'Show status of spawned subagents (pending + completed tasks).',\r\n async run() {\r\n if (!opts.onAgents) {\r\n return { message: 'Multi-agent is not enabled in this session.' };\r\n }\r\n return { message: opts.onAgents() };\r\n },\r\n };\r\n}\r\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { color } from '@wrongstack/core';\nimport type { TerminalRenderer } from './renderer.js';\nimport type { ReadlineInputReader } from './input-reader.js';\nimport { detectProjectFacts, renderAgentsTemplate } from './slash-commands/index.js';\n\nexport type ProjectKind =\n /** `.wrongstack/AGENTS.md` exists — fully set up. */\n | 'initialized'\n /** Has a recognizable manifest (package.json, pyproject.toml, etc.) but no AGENTS.md yet. */\n | 'project'\n /** No manifest, no AGENTS.md — probably an empty/scratch directory. */\n | 'empty';\n\nconst MANIFESTS = [\n 'package.json',\n 'pyproject.toml',\n 'Cargo.toml',\n 'go.mod',\n 'Makefile',\n 'pom.xml',\n 'build.gradle',\n 'build.gradle.kts',\n 'composer.json',\n 'Gemfile',\n];\n\nexport async function detectProjectKind(projectRoot: string): Promise<ProjectKind> {\n try {\n await fs.access(path.join(projectRoot, '.wrongstack', 'AGENTS.md'));\n return 'initialized';\n } catch {\n // not initialized\n }\n for (const m of MANIFESTS) {\n try {\n await fs.access(path.join(projectRoot, m));\n return 'project';\n } catch {\n // try next\n }\n }\n return 'empty';\n}\n\nasync function scaffoldAgentsMd(projectRoot: string): Promise<string> {\n const dir = path.join(projectRoot, '.wrongstack');\n const file = path.join(dir, 'AGENTS.md');\n const facts = await detectProjectFacts(projectRoot);\n const body = renderAgentsTemplate(facts);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(file, body, 'utf8');\n return file;\n}\n\n/**\n * Print a one-line project status banner and, when relevant, prompt the\n * user about scaffolding `AGENTS.md` or continuing in a directory that\n * doesn't look like a project. Returns `false` if the user bailed out.\n */\nexport async function runProjectCheck(opts: {\n projectRoot: string;\n renderer: TerminalRenderer;\n reader: ReadlineInputReader;\n}): Promise<boolean> {\n const { projectRoot, renderer, reader } = opts;\n const kind = await detectProjectKind(projectRoot);\n\n if (kind === 'initialized') {\n renderer.write(\n `\\n ${color.green('✓')} Project initialized ${color.dim(`(${path.join(projectRoot, '.wrongstack', 'AGENTS.md')})`)}\\n`,\n );\n return true;\n }\n\n if (kind === 'project') {\n renderer.write(\n `\\n ${color.amber('●')} Project detected ${color.dim(`(${projectRoot})`)} but ${color.bold('.wrongstack/AGENTS.md')} is missing.\\n`,\n );\n const answer = (\n await reader.readLine(\n ` ${color.amber('?')} Scaffold ${color.bold('AGENTS.md')} now? ${color.dim('[y/N]')} `,\n )\n ).trim().toLowerCase();\n if (answer === 'y' || answer === 'yes') {\n try {\n const file = await scaffoldAgentsMd(projectRoot);\n renderer.write(` ${color.green('✓')} Wrote ${color.dim(file)}\\n`);\n } catch (err) {\n renderer.writeError(\n `Failed to scaffold AGENTS.md: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n return true;\n }\n\n // 'empty' — no manifest, no AGENTS.md\n renderer.write(\n `\\n ${color.dim('○')} ${color.dim(`No project manifest in ${projectRoot} — running in a scratch directory.`)}\\n`,\n );\n const answer = (\n await reader.readLine(\n ` ${color.amber('?')} Continue anyway? ${color.dim('[Y/n]')} `,\n )\n ).trim().toLowerCase();\n if (answer === 'n' || answer === 'no') {\n renderer.write(color.dim(' Cancelled.\\n'));\n return false;\n }\n return true;\n}\n\nexport interface LaunchModeChoices {\n /** TUI or plain REPL. */\n mode: 'tui' | 'repl';\n /** Auto-approve every tool call (no permission prompts). */\n yolo: boolean;\n}\n\n/**\n * Ask for interactive mode (TUI vs REPL) and YOLO. Either prompt is\n * skipped when the corresponding CLI flag was already pinned. Returns\n * the resolved pair.\n */\nexport async function runLaunchPrompts(opts: {\n renderer: TerminalRenderer;\n reader: ReadlineInputReader;\n modePinned?: 'tui' | 'repl';\n yoloPinned?: boolean;\n}): Promise<LaunchModeChoices> {\n const { renderer, reader, modePinned, yoloPinned } = opts;\n\n let mode: 'tui' | 'repl';\n if (modePinned) {\n mode = modePinned;\n } else {\n const answer = (\n await reader.readLine(\n `\\n ${color.amber('?')} Interactive mode: ${color.bold('T')}UI / ${color.bold('R')}EPL ${color.dim('[T/r]')} `,\n )\n ).trim().toLowerCase();\n mode = answer === 'r' || answer === 'repl' ? 'repl' : 'tui';\n }\n\n let yolo: boolean;\n if (yoloPinned !== undefined) {\n yolo = yoloPinned;\n } else {\n const answer = (\n await reader.readLine(\n ` ${color.amber('?')} YOLO mode ${color.dim('(auto-approve every tool call)')} ${color.dim('[y/N]')} `,\n )\n ).trim().toLowerCase();\n yolo = answer === 'y' || answer === 'yes';\n }\n\n renderer.write(\n `\\n ${color.green('▶')} Launching in ${color.bold(mode.toUpperCase())} mode${yolo ? color.yellow(' (YOLO)') : ''}\\n\\n`,\n );\n\n return { mode, yolo };\n}\n","import type { ContentBlock, Renderer, TextBlock } from '@wrongstack/core';\nimport { color } from '@wrongstack/core';\nimport { theme } from './theme.js';\nimport { renderDiff } from './diff-renderer.js';\n\nexport interface TerminalRendererOptions {\n out?: NodeJS.WriteStream;\n err?: NodeJS.WriteStream;\n}\n\nexport class TerminalRenderer implements Renderer {\n private readonly out: NodeJS.WriteStream;\n private readonly err: NodeJS.WriteStream;\n private lineStart = true;\n /**\n * When true, every stdout-bound method is a no-op. This is the only\n * safe state to be in while Ink owns the terminal (TUI mode):\n * raw writes to stdout interleave with Ink's cursor math and cause\n * the input + status bar to be reprinted as scrollback junk.\n * Stderr-bound methods (writeInfo/Warning/Error) still flow — they\n * go to a different stream Ink does not manage.\n */\n private silent = false;\n\n constructor(opts: TerminalRendererOptions = {}) {\n this.out = opts.out ?? process.stdout;\n this.err = opts.err ?? process.stderr;\n }\n\n /**\n * Toggle stdout suppression. Call `setSilent(true)` right before\n * handing the terminal to Ink, and `setSilent(false)` after Ink\n * exits. Idempotent.\n */\n setSilent(silent: boolean): void {\n this.silent = silent;\n }\n\n isSilent(): boolean {\n return this.silent;\n }\n\n write(input: string | TextBlock): void {\n if (this.silent) return;\n const text = typeof input === 'string' ? input : input.text;\n if (!text) return;\n const rendered = renderMarkdown(text);\n this.out.write(rendered);\n this.lineStart = rendered.endsWith('\\n');\n }\n\n writeLine(text = ''): void {\n if (this.silent) return;\n if (!this.lineStart) this.out.write('\\n');\n if (text) this.out.write(`${text}\\n`);\n else this.out.write('\\n');\n this.lineStart = true;\n }\n\n writeBlock(block: ContentBlock): void {\n if (this.silent) return;\n if (block.type === 'text') {\n this.write(block);\n } else if (block.type === 'tool_use') {\n this.writeToolCall(block.name, block.input);\n } else if (block.type === 'tool_result') {\n const text = typeof block.content === 'string' ? block.content : JSON.stringify(block.content);\n this.writeToolResult('result', text, !!block.is_error);\n }\n }\n\n writeToolCall(name: string, input: unknown): void {\n if (this.silent) return;\n if (!this.lineStart) this.out.write('\\n');\n const arrow = theme.primary('→');\n const display = formatInputSummary(input);\n this.out.write(`${arrow} ${theme.bold(name)}${display ? color.dim(` ${display}`) : ''}\\n`);\n this.lineStart = true;\n }\n\n writeToolResult(name: string, content: unknown, isError: boolean): void {\n if (this.silent) return;\n const txt = typeof content === 'string' ? content : safeStringify(content);\n const prefix = isError ? theme.error('✘') : theme.success('✓');\n\n if (isError) {\n const firstLine = txt.split('\\n')[0] ?? '';\n const truncated = firstLine.length > 200 ? `${firstLine.slice(0, 197)}…` : firstLine;\n this.out.write(` ${prefix} ${color.dim(truncated)}\\n`);\n this.lineStart = true;\n return;\n }\n\n // Tool-specific rendering.\n const isEditLike = name === 'edit' || name === 'write';\n const isReadLike = name === 'read' || name === 'grep' || name === 'glob' || name === 'bash';\n const previewLines = isEditLike ? 0 : isReadLike ? 6 : 2;\n\n // Edit-like tools: pull the embedded diff if present.\n const diff = extractDiff(content);\n if (isEditLike && diff) {\n this.out.write(` ${prefix} ${color.dim(summarize(content, name))}\\n`);\n const rendered = renderDiff(diff)\n .split('\\n')\n .map((l) => ` ${l}`)\n .join('\\n');\n this.out.write(`${rendered}\\n`);\n this.lineStart = true;\n return;\n }\n\n // Generic preview: show up to N lines, then \"+X more\" if truncated.\n const lines = txt.split('\\n');\n const head = lines.slice(0, previewLines).map((l: string) => l.replace(/\\s+$/, ''));\n const moreCount = Math.max(0, lines.length - head.length);\n this.out.write(` ${prefix} ${color.dim(summarize(content, name))}\\n`);\n for (const l of head) {\n const capped = l.length > 200 ? `${l.slice(0, 197)}…` : l;\n this.out.write(` ${color.dim(capped)}\\n`);\n }\n if (moreCount > 0) {\n this.out.write(` ${color.dim(`+${moreCount} more line${moreCount === 1 ? '' : 's'}`)}\\n`);\n }\n this.lineStart = true;\n }\n\n writeDiff(diff: string): void {\n if (this.silent) return;\n if (!this.lineStart) this.out.write('\\n');\n this.out.write(`${renderDiff(diff)}\\n`);\n this.lineStart = true;\n }\n\n writeWarning(text: string): void {\n this.err.write(`${theme.warn('⚠')} ${text}\\n`);\n }\n writeError(text: string): void {\n this.err.write(`${theme.error('✘')} ${text}\\n`);\n }\n writeInfo(text: string): void {\n this.err.write(`${theme.info('ℹ')} ${text}\\n`);\n }\n\n clear(): void {\n if (this.silent) return;\n this.out.write('\\x1b[2J\\x1b[H');\n this.lineStart = true;\n }\n}\n\nfunction renderMarkdown(s: string): string {\n let out = s;\n // Headings\n out = out.replace(/^(#{1,6}) (.+)$/gm, (_m, hashes, text) => {\n return theme.primary(theme.bold(`${hashes} ${text}`));\n });\n // Fenced code\n out = out.replace(/```([a-zA-Z0-9_+-]*)\\n([\\s\\S]*?)```/g, (_m, _lang, code) => {\n return color.gray(`\\n┌─\\n${code.replace(/^/gm, '│ ')}└─`);\n });\n // Inline code\n out = out.replace(/`([^`\\n]+)`/g, (_m, code) => theme.accent(code));\n // Bold\n out = out.replace(/\\*\\*([^*]+)\\*\\*/g, (_m, text) => theme.bold(text));\n // Italic — single-asterisk\n out = out.replace(/(^|[^*])\\*([^*\\n]+)\\*([^*]|$)/g, (_m, l, t, r) => `${l}${color.italic(t)}${r}`);\n return out;\n}\n\nfunction formatInputSummary(input: unknown): string {\n if (!input || typeof input !== 'object') return '';\n const obj = input as Record<string, unknown>;\n if (typeof obj['path'] === 'string') return obj['path'] as string;\n if (typeof obj['url'] === 'string') return obj['url'] as string;\n if (typeof obj['command'] === 'string') {\n const cmd = obj['command'] as string;\n return cmd.length > 60 ? cmd.slice(0, 57) + '...' : cmd;\n }\n if (typeof obj['pattern'] === 'string') return obj['pattern'] as string;\n return '';\n}\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * If the tool result is an object with a `diff` field (e.g. from the edit\n * tool), return that. If it's a string containing a unified diff header,\n * return it as-is. Otherwise return null and the caller falls back to a\n * generic preview.\n */\nfunction extractDiff(value: unknown): string | null {\n if (typeof value === 'object' && value !== null) {\n const d = (value as { diff?: unknown }).diff;\n if (typeof d === 'string' && d.length > 0) return d;\n }\n if (typeof value === 'string') {\n // The agent serialises tool results to JSON before handing them to the\n // renderer, so a string `{\"diff\": \"...\"}` is the common case. Try parsing.\n const trimmed = value.trimStart();\n if (trimmed.startsWith('{')) {\n try {\n const parsed = JSON.parse(value) as { diff?: unknown };\n if (typeof parsed.diff === 'string' && parsed.diff.length > 0) {\n return parsed.diff;\n }\n } catch {\n // fall through\n }\n }\n if (/^---[^\\n]*\\n\\+\\+\\+/m.test(value)) return value;\n }\n return null;\n}\n\n/**\n * Short summary shown next to the ✓: file path + count for edit, line count\n * for read/grep, etc. Falls back to nothing if the shape isn't recognised.\n */\nfunction summarize(value: unknown, name: string): string {\n // Tool results arrive at the renderer already serialised to a JSON string.\n // Re-parse so we can pull out structured fields. Falls back to the raw value\n // for tools that return plain strings.\n let v: unknown = value;\n if (typeof value === 'string') {\n const trimmed = value.trimStart();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n v = JSON.parse(value);\n } catch {\n // not JSON — leave as string\n }\n }\n }\n if (typeof v === 'object' && v !== null) {\n const o = v as Record<string, unknown>;\n if (name === 'edit') {\n const path = typeof o['path'] === 'string' ? (o['path'] as string) : '';\n const reps = typeof o['replacements'] === 'number' ? (o['replacements'] as number) : 0;\n return `${path} ${reps} replacement${reps === 1 ? '' : 's'}`.trim();\n }\n if (name === 'write') {\n const path = typeof o['path'] === 'string' ? (o['path'] as string) : '';\n const bytes = typeof o['bytes'] === 'number' ? (o['bytes'] as number) : undefined;\n return bytes !== undefined ? `${path} ${bytes}B` : path;\n }\n if (typeof o['count'] === 'number') {\n return `${o['count']} match${o['count'] === 1 ? '' : 'es'}`;\n }\n }\n return '';\n}\n\n","import { createRequire } from 'node:module';\n\nconst req = createRequire(import.meta.url);\n\nfunction readOwnVersion(): string {\n const candidates = ['../package.json', '../../package.json'];\n for (const rel of candidates) {\n try {\n const pkg = req(rel) as { version?: unknown };\n if (typeof pkg.version === 'string' && pkg.version.length > 0) return pkg.version;\n } catch {\n // try next\n }\n }\n return 'dev';\n}\n\nexport const CLI_VERSION = readOwnVersion();\n\nlet API_VERSION = '0.0.0';\ntry {\n const corePkg = req('@wrongstack/core/package.json') as { wrongstackApiVersion?: string };\n if (corePkg.wrongstackApiVersion) API_VERSION = corePkg.wrongstackApiVersion;\n} catch { /* fallback */ }\n\nexport { API_VERSION };\n","/**\r\n * Format a token count for human-readable display.\r\n * 999 → \"999\"\r\n * 1_200 → \"1.2k\"\r\n * 12_000 → \"12k\"\r\n * 1_500_000 → \"1.5M\"\r\n */\r\nexport function fmtTok(n: number): string {\r\n if (n < 1000) return String(n);\r\n if (n < 1_000_000) return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}k`;\r\n return `${(n / 1_000_000).toFixed(1)}M`;\r\n}\r\n\r\n/**\r\n * Return a new frozen config object with the given patch applied.\r\n * Config objects are frozen by the config loader — direct mutation\r\n * silently fails at runtime. This helper spreads + re-freezes safely.\r\n */\r\nexport function patchConfig<T extends object>(base: T, patch: Partial<T>): T {\r\n return Object.freeze({ ...base, ...patch }) as T;\r\n}\r\n","import type {\r\n Agent,\r\n AttachmentStore,\r\n SlashCommandRegistry,\r\n TokenCounter,\r\n} from '@wrongstack/core';\r\nimport { InputBuilder, color } from '@wrongstack/core';\r\nimport { theme } from './theme.js';\r\nimport type { TerminalRenderer } from './renderer.js';\r\nimport type { ReadlineInputReader } from './input-reader.js';\r\nimport { CLI_VERSION } from './version.js';\r\nimport { fmtTok } from './utils.js';\r\n\r\nexport interface ReplOptions {\r\n agent: Agent;\r\n renderer: TerminalRenderer;\r\n reader: ReadlineInputReader;\r\n slashRegistry: SlashCommandRegistry;\r\n attachments: AttachmentStore;\r\n banner?: boolean;\r\n tokenCounter?: TokenCounter;\r\n /** Model-specific max context window (tokens). Used for the context bar in turn summaries. */\r\n effectiveMaxContext?: number;\r\n}\r\n\r\nexport async function runRepl(opts: ReplOptions): Promise<number> {\r\n if (opts.banner !== false) printBanner(opts.renderer);\r\n\r\n // Per-iteration abort controller — assigned each loop so a Ctrl+C that\r\n // cancels turn N doesn't leak into turn N+1. `activeCtrl` is updated\r\n // before each agent.run so the SIGINT handler can target it.\r\n let activeCtrl: AbortController | undefined;\r\n let interrupts = 0;\r\n const onSigint = () => {\r\n interrupts++;\r\n if (interrupts >= 2) {\r\n opts.renderer.writeWarning('Exiting.');\r\n process.exit(130);\r\n }\r\n if (activeCtrl) {\r\n activeCtrl.abort();\r\n opts.renderer.writeWarning('Iteration cancelled. Press Ctrl+C again to exit.');\r\n } else {\r\n opts.renderer.writeWarning('Press Ctrl+C again to exit.');\r\n }\r\n };\r\n process.on('SIGINT', onSigint);\r\n\r\n const builder = new InputBuilder({ store: opts.attachments });\r\n\r\n for (;;) {\r\n let raw: string;\r\n try {\r\n raw = await readPossiblyMultiline(opts);\r\n } catch {\r\n break; // EOF (Ctrl+D)\r\n }\r\n const trimmed = raw.trim();\r\n if (!trimmed) {\r\n interrupts = 0;\r\n continue;\r\n }\r\n interrupts = 0;\r\n\r\n if (trimmed.startsWith('/')) {\r\n try {\r\n const res = await opts.slashRegistry.dispatch(trimmed, opts.agent.ctx);\r\n if (res?.message) opts.renderer.write(`${res.message}\\n`);\r\n if (res?.exit) break;\r\n } catch (err) {\r\n opts.renderer.writeError(err instanceof Error ? err.message : String(err));\r\n }\r\n continue;\r\n }\r\n\r\n // Route through InputBuilder so big pastes collapse to placeholders.\r\n const ph = await builder.appendPaste(raw);\r\n if (ph) {\r\n const lineCount = raw.split('\\n').length;\r\n opts.renderer.write(color.dim(` ↳ ${ph} (${lineCount} lines)\\n`));\r\n }\r\n const blocks = await builder.submit();\r\n\r\n const runCtrl = new AbortController();\r\n activeCtrl = runCtrl;\r\n try {\r\n const startedAt = Date.now();\r\n const before = opts.tokenCounter?.total();\r\n const costBefore = opts.tokenCounter?.estimateCost().total ?? 0;\r\n const result = await opts.agent.run(blocks, { signal: runCtrl.signal });\r\n if (result.status === 'aborted') {\r\n opts.renderer.writeWarning('Aborted.');\r\n } else if (result.status === 'failed') {\r\n const err = result.error;\r\n if (err) {\r\n const tag = err.recoverable ? ' (recoverable)' : '';\r\n opts.renderer.writeError(`Failed [${err.severity}]${tag}: ${err.describe()}`);\r\n } else {\r\n opts.renderer.writeError('Failed.');\r\n }\r\n } else if (result.status === 'max_iterations') {\r\n opts.renderer.writeWarning(`Hit max iterations (${result.iterations}).`);\r\n }\r\n if (opts.tokenCounter && before) {\r\n const after = opts.tokenCounter.total();\r\n const costAfter = opts.tokenCounter.estimateCost().total;\r\n const ctxChip =\r\n opts.effectiveMaxContext && opts.effectiveMaxContext > 0\r\n ? ` ctx: ${renderContextChip(after.input, opts.effectiveMaxContext)}`\r\n : '';\r\n opts.renderer.write(\r\n `\\n${color.dim(\r\n `[in: ${fmtTok(after.input - before.input)} out: ${fmtTok(after.output - before.output)} iters: ${result.iterations} cost: ${(costAfter - costBefore).toFixed(4)} ${((Date.now() - startedAt) / 1000).toFixed(1)}s]${ctxChip}`,\r\n )}\\n`,\r\n );\r\n }\r\n } catch (err) {\r\n opts.renderer.writeError(err instanceof Error ? err.message : String(err));\r\n } finally {\r\n activeCtrl = undefined;\r\n }\r\n }\r\n\r\n process.off('SIGINT', onSigint);\r\n await opts.reader.close();\r\n return 0;\r\n}\r\n\r\n/**\r\n * Read a line, but support two multiline patterns:\r\n * 1. Trailing `\\` → continue on the next line (shell-style line continuation).\r\n * 2. A line that is exactly `\"\"\"` → start a heredoc; keep reading until\r\n * another bare `\"\"\"`. Useful for pasting code snippets.\r\n * Returns the assembled text and whether it came from a heredoc block (so\r\n * the caller can decide to always collapse heredocs as pastes).\r\n */\r\nasync function readPossiblyMultiline(opts: ReplOptions): Promise<string> {\r\n const firstPrompt = theme.primary('› ');\r\n const contPrompt = color.dim('· ');\r\n const first = await opts.reader.readLine(firstPrompt);\r\n\r\n if (first.trim() === '\"\"\"') {\r\n const parts: string[] = [];\r\n for (;;) {\r\n const next = await opts.reader.readLine(contPrompt);\r\n if (next.trim() === '\"\"\"') break;\r\n parts.push(next);\r\n }\r\n return parts.join('\\n');\r\n }\r\n\r\n let buf = first;\r\n while (buf.endsWith('\\\\')) {\r\n buf = buf.slice(0, -1); // drop the trailing backslash\r\n const cont = await opts.reader.readLine(contPrompt);\r\n buf += '\\n' + cont;\r\n }\r\n return buf;\r\n}\r\n\r\n\r\nconst FILLED = '█';\r\nconst EMPTY = '░';\r\n\r\nfunction renderContextChip(used: number, max: number): string {\r\n const ratio = Math.max(0, Math.min(1, used / max));\r\n const pct = Math.round(ratio * 100);\r\n const bar = renderProgress(ratio, 6);\r\n return `${bar} ${pct}% (${fmtTok(used)}/${fmtTok(max)})`;\r\n}\r\n\r\nfunction renderProgress(ratio: number, width: number): string {\r\n const clamped = Math.max(0, Math.min(1, ratio));\r\n const filled = clamped === 0 ? 0 : Math.max(1, Math.round(clamped * width));\r\n const capped = Math.min(width, filled);\r\n return FILLED.repeat(capped) + EMPTY.repeat(width - capped);\r\n}\r\n\r\nfunction printBanner(renderer: TerminalRenderer): void {\r\n const lines = [\r\n theme.primary(theme.bold('WrongStack')) + color.dim(` v${CLI_VERSION}`),\r\n color.dim('Built on the wrong stack. Shipped anyway.'),\r\n color.dim('Type /help for commands, /exit to quit.'),\r\n '',\r\n ];\r\n renderer.write(`${lines.join('\\n')}\\n`);\r\n}\r\n","import type { EventBus, TokenCounter } from '@wrongstack/core';\r\nimport { color } from '@wrongstack/core';\r\nimport type { TerminalRenderer } from './renderer.js';\r\nimport { fmtTok } from './utils.js';\r\n\r\ninterface ToolStat {\r\n ok: number;\r\n fail: number;\r\n totalMs: number;\r\n}\r\n\r\n/**\r\n * Accumulates per-session stats by listening to EventBus events. Designed\r\n * to be created once in main(), live for the whole CLI invocation (single-shot\r\n * or REPL), and produce the closing report when asked.\r\n *\r\n * Cost is intentionally not tracked here — TokenCounter is the authority.\r\n */\r\nexport class SessionStats {\r\n private readonly tokenCounter: TokenCounter;\r\n private readonly startedAt = Date.now();\r\n\r\n private apiRequests = 0;\r\n private iterations = 0;\r\n private errors = 0;\r\n\r\n private readonly toolStats = new Map<string, ToolStat>();\r\n private readonly readPaths = new Set<string>();\r\n private readonly editedPaths = new Set<string>();\r\n private readonly writtenPaths = new Set<string>();\r\n private bytesWritten = 0;\r\n private bashCommands = 0;\r\n private fetches = 0;\r\n\r\n constructor(events: EventBus, tokenCounter: TokenCounter) {\r\n this.tokenCounter = tokenCounter;\r\n events.on('provider.response', () => {\r\n this.apiRequests++;\r\n });\r\n events.on('iteration.completed', () => {\r\n this.iterations++;\r\n });\r\n events.on('error', () => {\r\n this.errors++;\r\n });\r\n events.on('tool.executed', (e) => {\r\n const slot = this.toolStats.get(e.name) ?? { ok: 0, fail: 0, totalMs: 0 };\r\n if (e.ok) slot.ok++;\r\n else slot.fail++;\r\n slot.totalMs += e.durationMs;\r\n this.toolStats.set(e.name, slot);\r\n\r\n const input = e.input as Record<string, unknown> | undefined;\r\n // Side-effect counts are attempt-based (count failed shells / fetches too —\r\n // the user wants to see \"the agent tried to run 4 commands\").\r\n if (e.name === 'bash') this.bashCommands++;\r\n else if (e.name === 'fetch') this.fetches++;\r\n\r\n // File-path tracking is success-only: a failed read or edit didn't\r\n // actually touch the file, so don't claim it did.\r\n if (!e.ok) return;\r\n const path = typeof input?.path === 'string' ? (input.path as string) : undefined;\r\n if (e.name === 'read' && path) this.readPaths.add(path);\r\n else if (e.name === 'edit' && path) this.editedPaths.add(path);\r\n else if (e.name === 'write' && path) {\r\n this.writtenPaths.add(path);\r\n const content = typeof input?.content === 'string' ? (input.content as string) : '';\r\n this.bytesWritten += Buffer.byteLength(content, 'utf8');\r\n }\r\n });\r\n }\r\n\r\n hasActivity(): boolean {\r\n return (\r\n this.apiRequests > 0 ||\r\n this.iterations > 0 ||\r\n this.toolStats.size > 0 ||\r\n this.tokenCounter.total().input > 0\r\n );\r\n }\r\n\r\n /**\r\n * Build the report string. Returns null when there's no recorded\r\n * activity yet — caller decides whether to emit a placeholder or stay\r\n * silent. Splitting `format()` out of `render()` lets the TUI's slash\r\n * dispatcher take the string and turn it into a history entry, while\r\n * REPL keeps the old direct-write path.\r\n */\r\n format(): string | null {\r\n if (!this.hasActivity()) return null;\r\n const u = this.tokenCounter.total();\r\n const cost = this.tokenCounter.estimateCost();\r\n const elapsedSec = ((Date.now() - this.startedAt) / 1000).toFixed(1);\r\n\r\n const lines: string[] = [];\r\n lines.push('');\r\n lines.push(color.bold('Session report'));\r\n lines.push(color.dim('─'.repeat(40)));\r\n lines.push(` Elapsed: ${elapsedSec}s`);\r\n lines.push(` Iterations: ${this.iterations}`);\r\n lines.push(` API requests: ${this.apiRequests}`);\r\n if (this.errors > 0) {\r\n lines.push(` Errors: ${color.yellow(String(this.errors))}`);\r\n }\r\n lines.push('');\r\n lines.push(` Tokens: in ${fmtTok(u.input)} out ${fmtTok(u.output)}${u.cacheRead ? ` cacheR ${fmtTok(u.cacheRead)}` : ''}${u.cacheWrite ? ` cacheW ${fmtTok(u.cacheWrite)}` : ''}`);\r\n const cache = this.tokenCounter.cacheStats();\r\n if (cache.readTokens > 0 || cache.writeTokens > 0) {\r\n const pct = (cache.hitRatio * 100).toFixed(1);\r\n lines.push(\r\n ` Prompt cache: ${pct}% hit ${color.dim(`(${fmtTok(cache.readTokens)} read / ${fmtTok(cache.writeTokens)} write)`)}`,\r\n );\r\n }\r\n if (cost.total > 0) {\r\n lines.push(` Cost: $${cost.total.toFixed(4)}${color.dim(` (in $${cost.input.toFixed(4)} / out $${cost.output.toFixed(4)})`)}`);\r\n } else {\r\n lines.push(` Cost: ${color.dim('$0 (no pricing on this plan)')}`);\r\n }\r\n\r\n if (this.toolStats.size > 0) {\r\n lines.push('');\r\n lines.push(` ${color.bold('Tool calls')}`);\r\n const sorted = [...this.toolStats.entries()].sort(\r\n (a, b) => (b[1].ok + b[1].fail) - (a[1].ok + a[1].fail),\r\n );\r\n for (const [name, s] of sorted) {\r\n const total = s.ok + s.fail;\r\n const failPart = s.fail > 0 ? color.yellow(` (${s.fail} failed)`) : '';\r\n const avgMs = total > 0 ? Math.round(s.totalMs / total) : 0;\r\n lines.push(` ${name.padEnd(12)} ${String(total).padStart(3)}× ${color.dim(`avg ${avgMs}ms`)}${failPart}`);\r\n }\r\n }\r\n\r\n const fileActivity =\r\n this.readPaths.size > 0 ||\r\n this.editedPaths.size > 0 ||\r\n this.writtenPaths.size > 0 ||\r\n this.bytesWritten > 0;\r\n if (fileActivity) {\r\n lines.push('');\r\n lines.push(` ${color.bold('Files')}`);\r\n if (this.readPaths.size > 0)\r\n lines.push(` read: ${this.readPaths.size} ${color.dim(samplePaths(this.readPaths))}`);\r\n if (this.editedPaths.size > 0)\r\n lines.push(` edited: ${this.editedPaths.size} ${color.dim(samplePaths(this.editedPaths))}`);\r\n if (this.writtenPaths.size > 0) {\r\n const bytes = this.bytesWritten;\r\n const byteStr = bytes > 1024 ? `${(bytes / 1024).toFixed(1)}KB` : `${bytes}B`;\r\n lines.push(` written: ${this.writtenPaths.size} (${byteStr}) ${color.dim(samplePaths(this.writtenPaths))}`);\r\n }\r\n }\r\n\r\n if (this.bashCommands > 0 || this.fetches > 0) {\r\n lines.push('');\r\n if (this.bashCommands > 0) lines.push(` Shell commands: ${this.bashCommands}`);\r\n if (this.fetches > 0) lines.push(` Web fetches: ${this.fetches}`);\r\n }\r\n\r\n lines.push('');\r\n return lines.join('\\n');\r\n }\r\n\r\n render(renderer: TerminalRenderer): void {\r\n const text = this.format();\r\n if (text === null) return;\r\n renderer.write(`${text}\\n`);\r\n }\r\n}\r\n\r\nfunction samplePaths(set: Set<string>): string {\r\n const arr = [...set];\r\n if (arr.length <= 2) return arr.join(', ');\r\n return `${arr[0]}, … (+${arr.length - 1} more)`;\r\n}","import { color } from '@wrongstack/core';\r\nimport { fmtTok } from './utils.js';\r\n\r\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\r\nconst FILLED = '█';\r\nconst EMPTY = '░';\r\n\r\nexport interface ContextInfo {\r\n used: number;\r\n max: number;\r\n}\r\n\r\n/**\r\n * Minimal single-line spinner. Writes to stderr so it doesn't get mixed with\r\n * the agent's stdout output (assistant text, tool diffs). Auto-no-ops outside\r\n * a TTY so logs don't get spammed with control codes.\r\n *\r\n * When a {@link ContextInfo} is set via {@link setContext}, the spinner line\r\n * appends a compact `ctx ████░░ 42% (12k/200k)` chip so the user can see\r\n * how full the model's context window is while waiting for a response.\r\n */\r\nexport class Spinner {\r\n private timer?: NodeJS.Timeout;\r\n private frame = 0;\r\n private active = false;\r\n private label = '';\r\n private startedAt = 0;\r\n private context?: ContextInfo;\r\n private readonly out: NodeJS.WriteStream;\r\n private readonly enabled: boolean;\r\n\r\n constructor(out: NodeJS.WriteStream = process.stderr) {\r\n this.out = out;\r\n this.enabled = Boolean(out.isTTY) && !process.env.NO_COLOR;\r\n }\r\n\r\n start(label: string): void {\r\n if (!this.enabled || this.active) return;\r\n this.label = label;\r\n this.frame = 0;\r\n this.active = true;\r\n this.startedAt = Date.now();\r\n this.render();\r\n this.timer = setInterval(() => {\r\n this.frame = (this.frame + 1) % FRAMES.length;\r\n this.render();\r\n }, 80);\r\n this.timer.unref?.();\r\n }\r\n\r\n stop(): void {\r\n if (!this.active) return;\r\n this.active = false;\r\n if (this.timer) clearInterval(this.timer);\r\n this.timer = undefined;\r\n this.clearLine();\r\n }\r\n\r\n /** Stop and persist a one-line note where the spinner was (e.g. \"✓ done in 1.4s\"). */\r\n stopWith(note: string): void {\r\n this.stop();\r\n this.out.write(`${note}\\n`);\r\n }\r\n\r\n /** Update the live context-window chip shown on the spinner line. */\r\n setContext(ctx: ContextInfo | undefined): void {\r\n this.context = ctx;\r\n }\r\n\r\n private render(): void {\r\n const elapsed = ((Date.now() - this.startedAt) / 1000).toFixed(1);\r\n let line = `${color.amber(FRAMES[this.frame] ?? '')} ${this.label} ${color.dim(`${elapsed}s`)}`;\r\n if (this.context && this.context.max > 0) {\r\n line += ' ' + renderContextChip(this.context);\r\n }\r\n this.clearLine();\r\n this.out.write(line);\r\n }\r\n\r\n private clearLine(): void {\r\n if (!this.enabled) return;\r\n this.out.write('\\r\\x1b[2K');\r\n }\r\n}\r\n\r\nfunction renderContextChip(ctx: ContextInfo): string {\r\n const ratio = Math.max(0, Math.min(1, ctx.used / ctx.max));\r\n const pct = Math.round(ratio * 100);\r\n const chipColor = ratio >= 0.85 ? color.red : ratio >= 0.65 ? color.yellow : color.cyan;\r\n const bar = renderProgress(ratio, 8);\r\n return (\r\n color.dim('ctx ') +\r\n chipColor(bar) +\r\n chipColor(` ${pct}%`) +\r\n color.dim(` (${fmtTok(ctx.used)}/${fmtTok(ctx.max)})`)\r\n );\r\n}\r\n\r\nfunction renderProgress(ratio: number, width: number): string {\r\n const clamped = Math.max(0, Math.min(1, ratio));\r\n const filled = clamped === 0 ? 0 : Math.max(1, Math.round(clamped * width));\r\n const capped = Math.min(width, filled);\r\n return FILLED.repeat(capped) + EMPTY.repeat(width - capped);\r\n}\r\n","import * as fs from 'node:fs/promises';\r\nimport * as os from 'node:os';\r\nimport * as path from 'node:path';\r\nimport {\r\n type Config,\r\n type WstackPaths,\r\n DefaultConfigLoader,\r\n DefaultPathResolver,\r\n DefaultSecretVault,\r\n migratePlaintextSecrets,\r\n resolveWstackPaths,\r\n} from '@wrongstack/core';\r\n\r\nexport interface BootPaths {\r\n cwd: string;\r\n projectRoot: string;\r\n userHome: string;\r\n wpaths: WstackPaths;\r\n pathResolver: DefaultPathResolver;\r\n}\r\n\r\nexport interface BootConfigResult {\r\n paths: BootPaths;\r\n config: Config;\r\n vault: DefaultSecretVault;\r\n}\r\n\r\n/**\r\n * Resolve paths and load config. This covers:\r\n * - cwd/project resolution\r\n * - wstack paths\r\n * - secret vault creation + plaintext migration\r\n * - config loading with CLI flag overrides\r\n */\r\nexport async function bootConfig(flags: Record<string, string | boolean>): Promise<BootConfigResult> {\r\n const cwd = typeof flags['cwd'] === 'string' ? path.resolve(flags['cwd']) : process.cwd();\r\n const pathResolver = new DefaultPathResolver(cwd);\r\n const projectRoot = pathResolver.projectRoot;\r\n const userHome = os.homedir();\r\n const wpaths = resolveWstackPaths({ projectRoot, userHome });\r\n await ensureProjectMeta(wpaths, projectRoot);\r\n\r\n // Vault must come first so the config loader can decrypt apiKey-like\r\n // fields. It lazily creates ~/.wrongstack/.key on first encrypt/decrypt.\r\n const vault = new DefaultSecretVault({ keyFile: wpaths.secretsKey });\r\n\r\n // Auto-encrypt any plaintext secrets users still have in their config\r\n // files (left over from before the vault existed, or hand-written).\r\n // Silent no-op for already-encrypted configs.\r\n for (const file of [wpaths.globalConfig, wpaths.projectLocalConfig]) {\r\n try {\r\n const { migrated } = await migratePlaintextSecrets(file, vault);\r\n if (migrated > 0) {\r\n process.stderr.write(`[wstack] Encrypted ${migrated} plaintext secret(s) in ${file}\\n`);\r\n }\r\n } catch {\r\n // best-effort — never block boot on migration issues\r\n }\r\n }\r\n\r\n const configLoader = new DefaultConfigLoader({ paths: wpaths, vault });\r\n const config = await configLoader.load({ cliFlags: flagsToConfigPatch(flags) });\r\n\r\n return {\r\n paths: { cwd, projectRoot, userHome, wpaths, pathResolver },\r\n config,\r\n vault,\r\n };\r\n}\r\n\r\nfunction flagsToConfigPatch(flags: Record<string, string | boolean>): Partial<Config> {\r\n const patch: Partial<Config> = {};\r\n if (typeof flags['provider'] === 'string') patch.provider = flags['provider'];\r\n if (typeof flags['model'] === 'string') patch.model = flags['model'];\r\n if (typeof flags['cwd'] === 'string') patch.cwd = flags['cwd'];\r\n if (typeof flags['log-level'] === 'string') {\r\n patch.log = { level: flags['log-level'] as Config['log']['level'] };\r\n } else if (flags['verbose']) {\r\n patch.log = { level: 'debug' };\r\n } else if (flags['trace']) {\r\n patch.log = { level: 'trace' };\r\n }\r\n if (flags['yolo']) patch.yolo = true;\r\n if (flags['no-features']) {\r\n patch.features = {\r\n mcp: false,\r\n plugins: false,\r\n memory: false,\r\n modelsRegistry: false,\r\n skills: false,\r\n };\r\n }\r\n return patch;\r\n}\r\n\r\nasync function ensureProjectMeta(paths: WstackPaths, projectRoot: string): Promise<void> {\r\n try {\r\n await fs.mkdir(paths.projectDir, { recursive: true });\r\n const meta = {\r\n hash: paths.projectHash,\r\n root: projectRoot,\r\n lastSeen: new Date().toISOString(),\r\n };\r\n await fs.writeFile(paths.projectMeta, JSON.stringify(meta, null, 2));\r\n } catch {\r\n // best-effort\r\n }\r\n}\r\n","/**\n * L1-E: Multi-agent CLI integration. The coordinator + per-task agent\n * factory is created lazily on the first `/spawn` so users who never use\n * subagents don't pay the construction cost.\n */\nimport { randomUUID } from 'node:crypto';\nimport {\n Agent,\n Container,\n Context,\n type Config,\n type ConfigStore,\n DefaultMultiAgentCoordinator,\n EventBus,\n makeAgentSubagentRunner,\n type MultiAgentCoordinator,\n type Provider,\n type ProviderRegistry,\n type SessionWriter,\n type SystemPromptBuilder,\n type TaskResult,\n type Tool,\n type ToolRegistry,\n type TokenCounter,\n TOKENS,\n createDefaultPipelines,\n} from '@wrongstack/core';\nimport type { TextBlock } from '@wrongstack/core';\nimport { makeProviderFromConfig } from '@wrongstack/providers';\n\nexport interface MultiAgentDeps {\n container: Container;\n toolRegistry: ToolRegistry;\n providerRegistry: ProviderRegistry;\n configStore: ConfigStore;\n events: EventBus;\n systemPromptBuilder: SystemPromptBuilder;\n session: SessionWriter;\n tokenCounter: TokenCounter;\n projectRoot: string;\n cwd: string;\n}\n\n/**\n * Lazy holder — created on first /spawn call, reused across the session\n * so /agents can list everyone running.\n */\nexport class MultiAgentHost {\n private coordinator?: MultiAgentCoordinator;\n private readonly pending = new Map<string, { description: string; subagentId: string }>();\n private readonly results: TaskResult[] = [];\n\n constructor(private readonly deps: MultiAgentDeps) {}\n\n private async ensureCoordinator(): Promise<MultiAgentCoordinator> {\n if (this.coordinator) return this.coordinator;\n const config: Config = this.deps.configStore.get() as Config;\n\n const factory = async (subCfg: { model?: string; tools?: string[] }) => {\n const events = new EventBus();\n const provider = await this.buildSubagentProvider(config);\n\n // Fresh context per subagent — explicit isolation.\n const baseSystem: TextBlock[] = await this.deps.systemPromptBuilder.build({\n cwd: this.deps.cwd,\n projectRoot: this.deps.projectRoot,\n tools: this.filterTools(subCfg.tools),\n model: subCfg.model ?? config.model,\n provider: config.provider,\n });\n\n // Reuse session id and append channel; subagent events get tagged\n // by source via the event bus rather than persisted to a separate\n // file. Keeps replay simple.\n const parentSession = this.deps.session;\n const subSession: SessionWriter = {\n id: parentSession.id,\n append: (ev) => parentSession.append({ ...ev }),\n } as SessionWriter;\n\n const ctx = new Context({\n systemPrompt: baseSystem,\n provider,\n session: subSession,\n signal: new AbortController().signal,\n tokenCounter: this.deps.tokenCounter,\n cwd: this.deps.cwd,\n projectRoot: this.deps.projectRoot,\n model: subCfg.model ?? config.model,\n tools: this.filterTools(subCfg.tools),\n });\n\n const agent = new Agent({\n container: this.deps.container,\n tools: this.subagentToolRegistry(subCfg.tools),\n providers: this.deps.providerRegistry,\n events,\n pipelines: createDefaultPipelines(),\n context: ctx,\n });\n\n return { agent, events };\n };\n\n const runner = makeAgentSubagentRunner({ factory });\n\n this.coordinator = new DefaultMultiAgentCoordinator(\n {\n coordinatorId: randomUUID(),\n doneCondition: { type: 'all_tasks_done' },\n maxConcurrent: 2,\n defaultBudget: { maxToolCalls: 20, maxIterations: 20, timeoutMs: 120_000 },\n },\n { runner },\n );\n\n // Drain task.completed into our local result buffer for /agents\n (this.coordinator as unknown as { on: Function }).on(\n 'task.completed',\n ({ task, result }: { task: { id: string }; result: TaskResult }) => {\n this.results.push(result);\n this.pending.delete(task.id);\n },\n );\n\n return this.coordinator;\n }\n\n private async buildSubagentProvider(config: Config): Promise<Provider> {\n const newCfg = config.providers?.[config.provider] ?? {\n type: config.provider,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n };\n return makeProviderFromConfig(config.provider, {\n ...newCfg,\n type: config.provider,\n });\n }\n\n /** Returns a tool slice for the subagent — full set unless restricted. */\n private filterTools(allow?: string[]): Tool[] {\n const all = this.deps.toolRegistry.list();\n if (!allow || allow.length === 0) return all;\n const allowSet = new Set(allow);\n return all.filter((t) => allowSet.has(t.name));\n }\n\n private subagentToolRegistry(allow?: string[]): ToolRegistry {\n if (!allow || allow.length === 0) return this.deps.toolRegistry;\n // Build a filtered registry by cloning entries.\n const cloneCtor = this.deps.toolRegistry.constructor as new () => ToolRegistry;\n const sub = new cloneCtor();\n for (const t of this.filterTools(allow)) sub.register(t);\n return sub;\n }\n\n /** Spawn a fresh subagent and assign a single task. Returns task id. */\n async spawn(description: string): Promise<{ subagentId: string; taskId: string }> {\n const coord = await this.ensureCoordinator();\n const spawned = await coord.spawn({\n name: 'adhoc',\n role: 'general',\n maxToolCalls: 20,\n maxIterations: 20,\n });\n const taskId = randomUUID();\n this.pending.set(taskId, { description, subagentId: spawned.subagentId });\n await coord.assign({\n id: taskId,\n description,\n subagentId: spawned.subagentId,\n maxToolCalls: 20,\n });\n return { subagentId: spawned.subagentId, taskId };\n }\n\n status(): {\n pending: { taskId: string; description: string; subagentId: string }[];\n completed: TaskResult[];\n summary: string;\n } {\n const pending = Array.from(this.pending.entries()).map(([taskId, v]) => ({\n taskId,\n description: v.description,\n subagentId: v.subagentId,\n }));\n const summary = !this.coordinator\n ? 'No subagents have been spawned.'\n : `${pending.length} pending, ${this.results.length} completed.`;\n return { pending, completed: this.results, summary };\n }\n\n async stopAll(): Promise<void> {\n if (this.coordinator) {\n await this.coordinator.stopAll();\n }\n }\n}\n// Workaround: TOKENS reference satisfies unused-import lint without being\n// active runtime usage — included for clarity that the coordinator\n// shares the container's permission policy etc. via the agent factory.\nvoid TOKENS;\n","import * as fs from 'node:fs/promises';\r\nimport {\r\n color,\r\n atomicWrite,\r\n encryptConfigSecrets,\r\n decryptConfigSecrets,\r\n type ProviderConfig,\r\n type ProviderApiKey,\r\n type SecretVault,\r\n type ModelsRegistry,\r\n type ResolvedProvider,\r\n type WireFamily,\r\n} from '@wrongstack/core';\r\nimport type { TerminalRenderer } from './renderer.js';\r\nimport type { ReadlineInputReader } from './input-reader.js';\r\n\r\nexport interface AuthMenuDeps {\r\n renderer: TerminalRenderer;\r\n reader: ReadlineInputReader;\r\n modelsRegistry: ModelsRegistry;\r\n vault: SecretVault;\r\n globalConfigPath: string;\r\n}\r\n\r\n/**\r\n * Interactive auth manager. Shows saved providers + keys, lets the user\r\n * add/update/delete keys, set the active key per provider, or add a key\r\n * for any provider in the models.dev catalog. Loops until the user exits.\r\n *\r\n * The legacy single-key `apiKey` field is migrated to `apiKeys[]` lazily\r\n * on first edit, so users who set up under the old schema upgrade\r\n * transparently the first time they open this menu.\r\n */\r\nexport async function runAuthMenu(deps: AuthMenuDeps): Promise<number> {\r\n for (;;) {\r\n const providers = await loadProviders(deps);\r\n renderTopMenu(deps.renderer, providers);\r\n\r\n const ids = Object.keys(providers).sort();\r\n const choice = (await deps.reader.readLine(`\\n${color.amber('?')} Pick: `)).trim().toLowerCase();\r\n\r\n if (!choice || choice === 'q' || choice === 'quit' || choice === 'exit') {\r\n deps.renderer.write(color.dim('Done.\\n'));\r\n return 0;\r\n }\r\n\r\n if (choice === 'a' || choice === 'add') {\r\n await addForNewProvider(deps);\r\n continue;\r\n }\r\n\r\n if (choice === 'c' || choice === 'custom') {\r\n await addCustomProvider(deps);\r\n continue;\r\n }\r\n\r\n const idx = Number.parseInt(choice, 10);\r\n if (!Number.isNaN(idx) && idx >= 1 && idx <= ids.length) {\r\n const pid = ids[idx - 1]!;\r\n await manageProvider(pid, deps);\r\n continue;\r\n }\r\n\r\n // Try matching by provider id directly.\r\n const byId = ids.find((id) => id.toLowerCase() === choice);\r\n if (byId) {\r\n await manageProvider(byId, deps);\r\n continue;\r\n }\r\n\r\n deps.renderer.writeError(`Unknown selection: \"${choice}\"`);\r\n }\r\n}\r\n\r\nfunction renderTopMenu(renderer: TerminalRenderer, providers: Record<string, ProviderConfig>): void {\r\n renderer.write(`\\n${color.bold('WrongStack')} ${color.dim('— API keys')}\\n\\n`);\r\n const ids = Object.keys(providers).sort();\r\n if (ids.length === 0) {\r\n renderer.write(color.dim(' No providers configured yet.\\n'));\r\n } else {\r\n renderer.write(` ${color.dim('Saved providers:')}\\n`);\r\n let idx = 1;\r\n for (const id of ids) {\r\n const cfg = providers[id]!;\r\n const keys = normalizeKeys(cfg);\r\n const active = activeLabel(cfg, keys);\r\n const summary = keys.length === 0\r\n ? color.dim('(no keys)')\r\n : keys.length === 1\r\n ? maskedKey(keys[0]!.apiKey)\r\n : `${color.dim(`${keys.length} keys`)} ${color.dim('active:')} ${color.bold(active ?? '?')} ${maskedKey(keys.find((k) => k.label === active)?.apiKey ?? keys[0]!.apiKey)}`;\r\n const fam = cfg.family ? color.dim(`[${cfg.family}]`) : '';\r\n const aliasHint = cfg.type && cfg.type !== id ? color.dim(`→ ${cfg.type}`) : '';\r\n renderer.write(\r\n ` ${color.dim(`${idx}.`.padStart(4))} ${id.padEnd(22)} ${fam} ${aliasHint} ${summary}\\n`,\r\n );\r\n idx++;\r\n }\r\n }\r\n renderer.write(`\\n ${color.dim('Actions:')}\\n`);\r\n renderer.write(` ${color.bold('a')} Add key for a new provider (from catalog)\\n`);\r\n renderer.write(` ${color.bold('c')} Add custom provider (type + family + baseUrl)\\n`);\r\n renderer.write(` ${color.bold('q')} Quit\\n`);\r\n if (ids.length > 0) {\r\n renderer.write(color.dim(`\\n Pick a number to manage that provider's keys.\\n`));\r\n }\r\n}\r\n\r\nasync function manageProvider(providerId: string, deps: AuthMenuDeps): Promise<void> {\r\n for (;;) {\r\n const providers = await loadProviders(deps);\r\n const cfg = providers[providerId];\r\n if (!cfg) {\r\n deps.renderer.writeError(`Provider \"${providerId}\" no longer in config.`);\r\n return;\r\n }\r\n const keys = normalizeKeys(cfg);\r\n const active = activeLabel(cfg, keys);\r\n\r\n deps.renderer.write(`\\n${color.bold(providerId)} ${cfg.family ? color.dim(`[${cfg.family}]`) : color.amber('[no family]')}\\n`);\r\n deps.renderer.write(\r\n color.dim(` type: ${cfg.type ?? providerId}\\n`) +\r\n color.dim(` family: ${cfg.family ?? '(unset → resolved from models.dev when type matches)'}\\n`) +\r\n color.dim(` baseUrl: ${cfg.baseUrl ?? '(unset → catalog default)'}\\n`),\r\n );\r\n if (cfg.envVars && cfg.envVars.length > 0) {\r\n deps.renderer.write(color.dim(` envVars: ${cfg.envVars.join(', ')}\\n`));\r\n }\r\n if (cfg.models && cfg.models.length > 0) {\r\n deps.renderer.write(color.dim(` models: ${cfg.models.join(', ')}\\n`));\r\n }\r\n if (keys.length === 0) {\r\n deps.renderer.write(color.dim(' (no keys saved)\\n'));\r\n } else {\r\n for (let i = 0; i < keys.length; i++) {\r\n const k = keys[i]!;\r\n const marker = k.label === active ? color.green('●') : color.dim('○');\r\n deps.renderer.write(\r\n ` ${color.dim(`${i + 1}.`.padStart(4))} ${marker} ${k.label.padEnd(20)} ${maskedKey(k.apiKey)} ${color.dim(k.createdAt)}\\n`,\r\n );\r\n }\r\n }\r\n\r\n deps.renderer.write(`\\n ${color.dim('Actions:')}\\n`);\r\n deps.renderer.write(` ${color.bold('a')} Add another key\\n`);\r\n if (keys.length > 0) {\r\n deps.renderer.write(` ${color.bold('u')} <n> Update key <n>\\n`);\r\n deps.renderer.write(` ${color.bold('d')} <n> Delete key <n>\\n`);\r\n deps.renderer.write(` ${color.bold('s')} <n> Set key <n> as active\\n`);\r\n }\r\n deps.renderer.write(` ${color.bold('f')} Edit family\\n`);\r\n deps.renderer.write(` ${color.bold('B')} Edit baseUrl\\n`);\r\n deps.renderer.write(` ${color.bold('m')} Edit visible model list\\n`);\r\n deps.renderer.write(` ${color.bold('x')} Remove this provider entirely\\n`);\r\n deps.renderer.write(` ${color.bold('b')} Back\\n`);\r\n\r\n const raw = (await deps.reader.readLine(`\\n${color.amber('?')} ${providerId} > `)).trim();\r\n if (!raw || raw === 'b' || raw === 'back') return;\r\n\r\n const [verb, argRaw] = raw.split(/\\s+/, 2);\r\n const arg = argRaw ? Number.parseInt(argRaw, 10) : Number.NaN;\r\n\r\n if (verb === 'a' || verb === 'add') {\r\n await addKeyForProvider(providerId, deps, cfg);\r\n continue;\r\n }\r\n if (verb === 'x' || verb === 'remove') {\r\n const confirm = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Remove provider \"${providerId}\" and ${keys.length} key(s)? ${color.dim('[y/N]')} `,\r\n )).trim().toLowerCase();\r\n if (confirm === 'y' || confirm === 'yes') {\r\n await mutateProviders(deps, (all) => {\r\n delete all[providerId];\r\n });\r\n deps.renderer.write(` ${color.green('✓')} Removed ${providerId}.\\n`);\r\n return;\r\n }\r\n continue;\r\n }\r\n if (verb === 'u' || verb === 'update') {\r\n if (!Number.isFinite(arg) || arg < 1 || arg > keys.length) {\r\n deps.renderer.writeError(`Usage: u <1-${keys.length}>`);\r\n continue;\r\n }\r\n const target = keys[arg - 1]!;\r\n const newKey = await readKeyInput(deps, `Updated key for ${target.label}`);\r\n if (!newKey) continue;\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n const list = normalizeKeys(p).map((k) =>\r\n k.label === target.label ? { ...k, apiKey: newKey, createdAt: nowIso() } : k,\r\n );\r\n writeKeysBack(p, list);\r\n });\r\n deps.renderer.write(` ${color.green('✓')} Updated ${providerId}/${target.label}.\\n`);\r\n continue;\r\n }\r\n if (verb === 'd' || verb === 'delete' || verb === 'rm') {\r\n if (!Number.isFinite(arg) || arg < 1 || arg > keys.length) {\r\n deps.renderer.writeError(`Usage: d <1-${keys.length}>`);\r\n continue;\r\n }\r\n const target = keys[arg - 1]!;\r\n const confirm = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Delete key \"${target.label}\" (${maskedKey(target.apiKey)})? ${color.dim('[y/N]')} `,\r\n )).trim().toLowerCase();\r\n if (confirm !== 'y' && confirm !== 'yes') continue;\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n const list = normalizeKeys(p).filter((k) => k.label !== target.label);\r\n writeKeysBack(p, list);\r\n if (p.activeKey === target.label) {\r\n p.activeKey = list[0]?.label;\r\n }\r\n });\r\n deps.renderer.write(` ${color.green('✓')} Deleted ${providerId}/${target.label}.\\n`);\r\n continue;\r\n }\r\n if (verb === 'f' || verb === 'family') {\r\n const current = cfg.family ?? '';\r\n const ans = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Family ${color.dim(`(anthropic | openai | openai-compatible | google, empty = unset, current: ${current || 'unset'})`)}: `,\r\n )).trim() as WireFamily | '';\r\n if (ans !== '' && !['anthropic', 'openai', 'openai-compatible', 'google'].includes(ans)) {\r\n deps.renderer.writeError(`Invalid family: \"${ans}\"`);\r\n continue;\r\n }\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n if (ans === '') delete p.family;\r\n else p.family = ans;\r\n });\r\n deps.renderer.write(` ${color.green('✓')} family → ${ans || '(unset)'}\\n`);\r\n continue;\r\n }\r\n if (verb === 'B' || verb === 'baseurl' || verb === 'base-url') {\r\n const current = cfg.baseUrl ?? '';\r\n const ans = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Base URL ${color.dim(`(empty = unset, current: ${current || 'unset'})`)}: `,\r\n )).trim();\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n if (ans === '') delete p.baseUrl;\r\n else p.baseUrl = ans;\r\n });\r\n deps.renderer.write(` ${color.green('✓')} baseUrl → ${ans || '(unset)'}\\n`);\r\n continue;\r\n }\r\n if (verb === 'm' || verb === 'models') {\r\n const current = (cfg.models ?? []).join(', ');\r\n const ans = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Model ids ${color.dim(`(comma-separated, empty = catalog default, current: ${current || 'none'})`)}: `,\r\n )).trim();\r\n const list = ans\r\n ? ans.split(',').map((s) => s.trim()).filter(Boolean)\r\n : [];\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n if (list.length === 0) delete p.models;\r\n else p.models = list;\r\n });\r\n deps.renderer.write(` ${color.green('✓')} models → ${list.length === 0 ? '(catalog default)' : list.join(', ')}\\n`);\r\n continue;\r\n }\r\n if (verb === 's' || verb === 'set' || verb === 'active') {\r\n if (!Number.isFinite(arg) || arg < 1 || arg > keys.length) {\r\n deps.renderer.writeError(`Usage: s <1-${keys.length}>`);\r\n continue;\r\n }\r\n const target = keys[arg - 1]!;\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n // Make sure the apiKeys[] form is canonical before flipping active.\r\n const list = normalizeKeys(p);\r\n writeKeysBack(p, list);\r\n p.activeKey = target.label;\r\n });\r\n deps.renderer.write(` ${color.green('✓')} Active key for ${providerId} → ${color.bold(target.label)}.\\n`);\r\n continue;\r\n }\r\n deps.renderer.writeError(`Unknown action: \"${raw}\"`);\r\n }\r\n}\r\n\r\n/**\r\n * Pick a provider from the models.dev catalog (grouped by family) and add\r\n * a key for it. Catalog lookup populates family/baseUrl/envVars defaults.\r\n * When the catalog is unavailable we still let the user type a provider\r\n * id and family manually so the offline path keeps working.\r\n */\r\nasync function addForNewProvider(deps: AuthMenuDeps): Promise<void> {\r\n let catalog: ResolvedProvider[] = [];\r\n try {\r\n catalog = (await deps.modelsRegistry.listProviders()).filter((p) => p.family !== 'unsupported');\r\n } catch {\r\n deps.renderer.writeWarning('Catalog unavailable — falling back to manual entry.');\r\n }\r\n\r\n if (catalog.length === 0) {\r\n // Manual entry path\r\n const pid = (await deps.reader.readLine(` ${color.amber('?')} Provider id: `)).trim();\r\n if (!pid) return;\r\n const fam = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Family (anthropic/openai/openai-compatible/google): `,\r\n )).trim() as WireFamily;\r\n const baseUrl = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Base URL ${color.dim('(optional)')}: `,\r\n )).trim();\r\n await addKeyForProvider(pid, deps, {\r\n type: pid,\r\n family: fam || undefined,\r\n ...(baseUrl ? { baseUrl } : {}),\r\n });\r\n return;\r\n }\r\n\r\n // Group catalog by family, optionally narrowed by a substring filter\r\n // and/or hiding already-saved entries. The catalog has 120+ entries —\r\n // without a filter the openai-compatible list alone scrolls off-screen,\r\n // so types like \"zai-coding-plan\" get easy to miss.\r\n const saved = new Set(Object.keys(await loadProviders(deps)));\r\n deps.renderer.write(\r\n color.dim(` Catalog has ${catalog.length} providers. Filter by name to narrow, or \"s\" for unsaved-only.\\n`),\r\n );\r\n const filterRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Filter ${color.dim('(substring of id/name, \"s\" for unsaved-only, empty = all)')}: `,\r\n )).trim();\r\n const filterLc = filterRaw.toLowerCase();\r\n const showUnsavedOnly = filterLc === 's' || filterLc === 'unsaved';\r\n const matches = (p: ResolvedProvider): boolean => {\r\n if (showUnsavedOnly) return !saved.has(p.id);\r\n if (!filterLc) return true;\r\n return p.id.toLowerCase().includes(filterLc) || p.name.toLowerCase().includes(filterLc);\r\n };\r\n\r\n const byFamily = new Map<WireFamily, ResolvedProvider[]>();\r\n let filteredCount = 0;\r\n for (const p of catalog) {\r\n if (!matches(p)) continue;\r\n filteredCount++;\r\n const list = byFamily.get(p.family) ?? [];\r\n list.push(p);\r\n byFamily.set(p.family, list);\r\n }\r\n\r\n if (filteredCount === 0) {\r\n deps.renderer.writeError(\r\n `No providers match \"${filterRaw}\". Try a shorter substring or check \\`wstack providers\\` for valid ids.`,\r\n );\r\n return;\r\n }\r\n if (filterRaw && !showUnsavedOnly) {\r\n deps.renderer.write(\r\n color.dim(` ${filteredCount} match${filteredCount === 1 ? '' : 'es'} for \"${filterRaw}\".\\n`),\r\n );\r\n }\r\n\r\n const ordered: ResolvedProvider[] = [];\r\n const familyOrder: WireFamily[] = ['anthropic', 'openai', 'google', 'openai-compatible'];\r\n let idx = 1;\r\n deps.renderer.write('\\n');\r\n for (const fam of familyOrder) {\r\n const list = byFamily.get(fam);\r\n if (!list || list.length === 0) continue;\r\n deps.renderer.write(` ${color.bold(fam)}\\n`);\r\n for (const p of list) {\r\n const savedMark = saved.has(p.id) ? color.cyan('◉') : color.dim('○');\r\n const env = p.envVars[0] ? color.dim(`[${p.envVars[0]}]`) : '';\r\n deps.renderer.write(\r\n ` ${color.dim(`${idx}.`.padStart(4))} ${savedMark} ${p.id.padEnd(22)} ${color.dim(p.name)} ${env}\\n`,\r\n );\r\n ordered.push(p);\r\n idx++;\r\n }\r\n }\r\n deps.renderer.write(`\\n ${color.dim('◉ already saved ○ no key yet')}\\n`);\r\n\r\n const answer = (await deps.reader.readLine(\r\n `\\n${color.amber('?')} Pick (1-${ordered.length}) or type provider id: `,\r\n )).trim();\r\n if (!answer) return;\r\n\r\n let chosen: ResolvedProvider | undefined;\r\n const num = Number.parseInt(answer, 10);\r\n if (!Number.isNaN(num) && num >= 1 && num <= ordered.length) {\r\n chosen = ordered[num - 1];\r\n } else {\r\n chosen = ordered.find((p) => p.id.toLowerCase() === answer.toLowerCase())\r\n ?? catalog.find((p) => p.id.toLowerCase() === answer.toLowerCase());\r\n }\r\n if (!chosen) {\r\n deps.renderer.writeError(`No such provider: \"${answer}\"`);\r\n return;\r\n }\r\n\r\n // Always show family + baseUrl as inline prompts with catalog defaults\r\n // so the user can override either one without a separate confirmation\r\n // step. Press Enter to accept the catalog value, or type a new one to\r\n // change it. Useful for routing a catalog-known id through a custom\r\n // proxy or a different wire family (e.g. \"anthropic\"-id provider\r\n // through an openai-compatible gateway).\r\n deps.renderer.write(\r\n color.dim(`\\n Defaults from models.dev — press Enter to keep, or type a new value.\\n`),\r\n );\r\n const famRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Family ${color.dim(`[${chosen.family}]`)}: `,\r\n )).trim();\r\n let family: WireFamily = chosen.family;\r\n if (famRaw) {\r\n if (!['anthropic', 'openai', 'openai-compatible', 'google'].includes(famRaw)) {\r\n deps.renderer.writeError(`Invalid family: \"${famRaw}\" (must be anthropic | openai | openai-compatible | google).`);\r\n return;\r\n }\r\n family = famRaw as WireFamily;\r\n }\r\n const baseRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Base URL ${color.dim(`[${chosen.apiBase ?? 'unset'}]`)}: `,\r\n )).trim();\r\n const baseUrl: string | undefined = baseRaw || chosen.apiBase;\r\n\r\n // Pick the storage alias (= map key under `providers`). Two reasons to\r\n // make this distinct from the catalog id:\r\n // 1. The user may want the SAME catalog provider saved twice with\r\n // different family/baseUrl (e.g. zai-coding-plan once as\r\n // openai-compatible, once as anthropic) — different aliases let\r\n // both entries coexist.\r\n // 2. The CLI launches via `--provider <alias>`, so a short custom\r\n // name like \"zai-claude\" is friendlier than \"zai-coding-plan-anthropic\".\r\n // Auto-suggest a disambiguated alias when family diverges from the\r\n // catalog default, since that's the signal the user is creating a\r\n // second variant — not just adding another key to the same profile.\r\n const providersNow = await loadProviders(deps);\r\n let suggestedAlias = chosen.id;\r\n if (family !== chosen.family) {\r\n let candidate = `${chosen.id}-${family}`;\r\n let n = 2;\r\n while (providersNow[candidate]) {\r\n candidate = `${chosen.id}-${family}-${n}`;\r\n n++;\r\n }\r\n suggestedAlias = candidate;\r\n }\r\n const aliasRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Save under alias ${color.dim(`[${suggestedAlias}]`)} ${color.dim('(used as `--provider <alias>`)')}: `,\r\n )).trim();\r\n const alias = aliasRaw || suggestedAlias;\r\n\r\n // Block clobbering an unrelated existing entry. Same alias is fine if\r\n // the user is intentionally adding another KEY to the same profile —\r\n // but only when family + baseUrl match what's already saved. Otherwise\r\n // we'd silently overwrite their settings and pile a key into the wrong\r\n // place (exactly the bug that motivated the alias prompt).\r\n const existing = providersNow[alias];\r\n if (existing) {\r\n const sameFamily = (existing.family ?? chosen.family) === family;\r\n const sameBase = (existing.baseUrl ?? chosen.apiBase) === baseUrl;\r\n if (!sameFamily || !sameBase) {\r\n deps.renderer.writeError(\r\n `Alias \"${alias}\" already exists with different family/baseUrl.\\n ` +\r\n `Existing: family=${existing.family ?? '(unset)'}, baseUrl=${existing.baseUrl ?? '(unset)'}\\n ` +\r\n `New: family=${family}, baseUrl=${baseUrl ?? '(unset)'}\\n ` +\r\n `Pick a different alias to keep them separate.`,\r\n );\r\n return;\r\n }\r\n }\r\n\r\n await addKeyForProvider(alias, deps, {\r\n type: chosen.id,\r\n family,\r\n baseUrl,\r\n envVars: chosen.envVars,\r\n });\r\n}\r\n\r\n/**\r\n * Add a fully user-defined provider that bypasses the models.dev catalog.\r\n * The user picks the type (registry id), wire family, and base URL — all\r\n * three are stored on the entry so the CLI can construct the provider\r\n * via `makeProviderFromConfig` at boot without a catalog lookup.\r\n */\r\nasync function addCustomProvider(deps: AuthMenuDeps): Promise<void> {\r\n deps.renderer.write(`\\n${color.bold('Custom provider')} ${color.dim('— for local models or proxies not in the models.dev catalog.')}\\n`);\r\n const type = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Provider id ${color.dim('(e.g. \"local-llama\", \"my-proxy\")')}: `,\r\n )).trim();\r\n if (!type) return;\r\n\r\n const existing = (await loadProviders(deps))[type];\r\n if (existing) {\r\n deps.renderer.writeWarning(`\"${type}\" already exists. Pick it from the main menu to edit.`);\r\n return;\r\n }\r\n\r\n const familyRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Wire family ${color.dim('(anthropic | openai | openai-compatible | google)')}: `,\r\n )).trim();\r\n if (!['anthropic', 'openai', 'openai-compatible', 'google'].includes(familyRaw)) {\r\n deps.renderer.writeError(`Invalid family: \"${familyRaw}\"`);\r\n return;\r\n }\r\n const family = familyRaw as WireFamily;\r\n\r\n const baseUrl = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Base URL ${color.dim('(e.g. http://localhost:11434/v1, leave empty if not needed)')}: `,\r\n )).trim();\r\n\r\n const modelsRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Model ids ${color.dim('(comma-separated, optional)')}: `,\r\n )).trim();\r\n const models = modelsRaw\r\n ? modelsRaw.split(',').map((s) => s.trim()).filter(Boolean)\r\n : undefined;\r\n\r\n const envVarsRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Env var names ${color.dim('(comma-separated, optional fallback for the key)')}: `,\r\n )).trim();\r\n const envVars = envVarsRaw\r\n ? envVarsRaw.split(',').map((s) => s.trim()).filter(Boolean)\r\n : undefined;\r\n\r\n await addKeyForProvider(type, deps, {\r\n type,\r\n family,\r\n ...(baseUrl ? { baseUrl } : {}),\r\n ...(models ? { models } : {}),\r\n ...(envVars ? { envVars } : {}),\r\n });\r\n}\r\n\r\nasync function addKeyForProvider(\r\n providerId: string,\r\n deps: AuthMenuDeps,\r\n template: Partial<ProviderConfig>,\r\n): Promise<void> {\r\n const providers = await loadProviders(deps);\r\n const existing = providers[providerId];\r\n const existingKeys = existing ? normalizeKeys(existing) : [];\r\n const usedLabels = new Set(existingKeys.map((k) => k.label));\r\n\r\n // Suggest a sensible default label\r\n let defaultLabel = 'default';\r\n if (usedLabels.has(defaultLabel)) {\r\n let n = 2;\r\n while (usedLabels.has(`key${n}`)) n++;\r\n defaultLabel = `key${n}`;\r\n }\r\n\r\n const labelRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Label for this key ${color.dim(`[${defaultLabel}]`)}: `,\r\n )).trim();\r\n const label = labelRaw || defaultLabel;\r\n if (usedLabels.has(label)) {\r\n deps.renderer.writeError(`Label \"${label}\" already used for ${providerId}. Use update (u) instead.`);\r\n return;\r\n }\r\n\r\n const apiKey = await readKeyInput(deps, `API key for ${providerId}/${label}`);\r\n if (!apiKey) {\r\n deps.renderer.writeError('No key entered. Nothing saved.');\r\n return;\r\n }\r\n\r\n await mutateProviders(deps, (all) => {\r\n const existingProv = all[providerId] ?? { type: providerId, ...template };\r\n // Backfill type/family/baseUrl from template when absent.\r\n if (!existingProv.type) existingProv.type = providerId;\r\n if (!existingProv.family && template.family) existingProv.family = template.family;\r\n if (!existingProv.baseUrl && template.baseUrl) existingProv.baseUrl = template.baseUrl;\r\n if (!existingProv.envVars && template.envVars) existingProv.envVars = template.envVars;\r\n const list = normalizeKeys(existingProv);\r\n list.push({ label, apiKey, createdAt: nowIso() });\r\n writeKeysBack(existingProv, list);\r\n if (!existingProv.activeKey) existingProv.activeKey = label;\r\n all[providerId] = existingProv;\r\n });\r\n\r\n deps.renderer.write(\r\n ` ${color.green('✓')} Saved ${color.bold(providerId)}/${color.bold(label)}. ${color.dim('Use `wstack --provider ' + providerId + ' \"<task>\"` to launch.')}\\n`,\r\n );\r\n}\r\n\r\n/**\r\n * One-shot add: used by `wstack auth <provider>` to skip the menu and\r\n * append a single key. Honors --label / --family / --base-url / --env\r\n * flags. If the label collides, we suffix with a counter.\r\n */\r\nexport async function runAuthDirect(deps: AuthMenuDeps, opts: {\r\n providerId: string;\r\n label?: string;\r\n family?: WireFamily;\r\n baseUrl?: string;\r\n envVars?: string[];\r\n}): Promise<number> {\r\n const { providerId } = opts;\r\n const providers = await loadProviders(deps);\r\n const existing = providers[providerId];\r\n\r\n if (!existing && !opts.family) {\r\n // Try the catalog before giving up.\r\n let knownFamily: WireFamily | undefined;\r\n let knownBase: string | undefined;\r\n let knownEnv: string[] | undefined;\r\n try {\r\n const k = await deps.modelsRegistry.getProvider(providerId);\r\n if (k) {\r\n knownFamily = k.family;\r\n knownBase = k.apiBase;\r\n knownEnv = k.envVars;\r\n }\r\n } catch {\r\n // catalog unavailable\r\n }\r\n if (!knownFamily || knownFamily === 'unsupported') {\r\n deps.renderer.writeError(\r\n `Provider \"${providerId}\" not in catalog. Pass --family <anthropic|openai|openai-compatible|google>.`,\r\n );\r\n return 1;\r\n }\r\n opts.family = knownFamily;\r\n opts.baseUrl ??= knownBase;\r\n opts.envVars ??= knownEnv;\r\n }\r\n\r\n const usedLabels = new Set(\r\n existing ? normalizeKeys(existing).map((k) => k.label) : [],\r\n );\r\n let label = opts.label ?? 'default';\r\n if (usedLabels.has(label)) {\r\n let n = 2;\r\n while (usedLabels.has(`${label}-${n}`)) n++;\r\n label = `${label}-${n}`;\r\n deps.renderer.writeInfo(`Label collided; saving as \"${label}\".`);\r\n }\r\n\r\n const apiKey = await readKeyInput(deps, `API key for ${providerId}/${label}`);\r\n if (!apiKey) return 1;\r\n\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId] ?? { type: providerId };\r\n if (!p.type) p.type = providerId;\r\n if (!p.family && opts.family) p.family = opts.family;\r\n if (!p.baseUrl && opts.baseUrl) p.baseUrl = opts.baseUrl;\r\n if (!p.envVars && opts.envVars) p.envVars = opts.envVars;\r\n const list = normalizeKeys(p);\r\n list.push({ label, apiKey, createdAt: nowIso() });\r\n writeKeysBack(p, list);\r\n if (!p.activeKey) p.activeKey = label;\r\n all[providerId] = p;\r\n });\r\n\r\n deps.renderer.writeInfo(`Stored encrypted key for ${providerId} (label \"${label}\").`);\r\n deps.renderer.writeInfo(`Use: wstack --provider ${providerId} \"<task>\"`);\r\n return 0;\r\n}\r\n\r\nasync function readKeyInput(deps: AuthMenuDeps, intent: string): Promise<string | undefined> {\r\n const key = (await deps.reader.readSecret(` ${color.amber('?')} ${intent} ${color.dim('(hidden, paste OK)')}: `)).trim();\r\n if (!key) {\r\n deps.renderer.writeError('No key entered.');\r\n return undefined;\r\n }\r\n return key;\r\n}\r\n\r\n/* ----------------------------- I/O helpers ----------------------------- */\r\n\r\n/**\r\n * Read the on-disk config file and return its `providers` map, fully\r\n * decrypted. We don't use `deps.config` here because it's a frozen\r\n * snapshot taken at startup — and once we start mutating keys we want to\r\n * see our own writes on the next iteration.\r\n */\r\nasync function loadProviders(deps: AuthMenuDeps): Promise<Record<string, ProviderConfig>> {\r\n let raw: string;\r\n try {\r\n raw = await fs.readFile(deps.globalConfigPath, 'utf8');\r\n } catch {\r\n return {};\r\n }\r\n let parsed: { providers?: Record<string, ProviderConfig> } = {};\r\n try {\r\n parsed = JSON.parse(raw) as { providers?: Record<string, ProviderConfig> };\r\n } catch {\r\n return {};\r\n }\r\n const decrypted = decryptConfigSecrets(parsed, deps.vault);\r\n return decrypted.providers ?? {};\r\n}\r\n\r\n/**\r\n * Load → mutate → encrypt → atomic-write. Operates on the FULL config\r\n * file so we don't truncate anything the user has set up elsewhere; only\r\n * the `providers` key gets replaced wholesale with the post-mutation\r\n * value (so deletions actually take effect).\r\n */\r\nasync function mutateProviders(\r\n deps: AuthMenuDeps,\r\n mutator: (providers: Record<string, ProviderConfig>) => void,\r\n): Promise<void> {\r\n let raw: string;\r\n try {\r\n raw = await fs.readFile(deps.globalConfigPath, 'utf8');\r\n } catch {\r\n raw = '{}';\r\n }\r\n let parsed: Record<string, unknown>;\r\n try {\r\n parsed = JSON.parse(raw) as Record<string, unknown>;\r\n } catch {\r\n parsed = {};\r\n }\r\n const decrypted = decryptConfigSecrets(parsed, deps.vault) as Record<string, unknown>;\r\n const providers = ((decrypted.providers as Record<string, ProviderConfig>) ?? {});\r\n mutator(providers);\r\n decrypted.providers = providers;\r\n const encrypted = encryptConfigSecrets(decrypted, deps.vault);\r\n await atomicWrite(deps.globalConfigPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\r\n}\r\n\r\n/* --------------------------- Schema helpers --------------------------- */\r\n\r\n/**\r\n * Normalize to the canonical `apiKeys[]` form. Migrates the legacy\r\n * single-key field on the fly so the caller never has to think about\r\n * two shapes. Does NOT mutate the input.\r\n */\r\nfunction normalizeKeys(cfg: ProviderConfig): ProviderApiKey[] {\r\n if (Array.isArray(cfg.apiKeys) && cfg.apiKeys.length > 0) {\r\n return cfg.apiKeys.map((k) => ({ ...k }));\r\n }\r\n if (typeof cfg.apiKey === 'string' && cfg.apiKey.length > 0) {\r\n return [{ label: 'default', apiKey: cfg.apiKey, createdAt: '' }];\r\n }\r\n return [];\r\n}\r\n\r\nfunction writeKeysBack(cfg: ProviderConfig, keys: ProviderApiKey[]): void {\r\n if (keys.length === 0) {\r\n delete cfg.apiKeys;\r\n delete cfg.apiKey;\r\n delete cfg.activeKey;\r\n return;\r\n }\r\n cfg.apiKeys = keys;\r\n // Keep legacy `apiKey` mirrored to the active entry so anything that\r\n // bypasses the config loader still sees a usable key.\r\n const active = keys.find((k) => k.label === cfg.activeKey) ?? keys[0]!;\r\n cfg.apiKey = active.apiKey;\r\n if (!cfg.activeKey || !keys.some((k) => k.label === cfg.activeKey)) {\r\n cfg.activeKey = active.label;\r\n }\r\n}\r\n\r\nfunction activeLabel(cfg: ProviderConfig, keys: ProviderApiKey[]): string | undefined {\r\n if (cfg.activeKey && keys.some((k) => k.label === cfg.activeKey)) return cfg.activeKey;\r\n return keys[0]?.label;\r\n}\r\n\r\nfunction maskedKey(key: string): string {\r\n if (!key) return color.dim('—');\r\n if (key.length <= 8) return color.dim('•'.repeat(key.length));\r\n const head = key.slice(0, 4);\r\n const tail = key.slice(-4);\r\n return `${color.dim(head + '…')}${tail}`;\r\n}\r\n\r\nfunction nowIso(): string {\r\n return new Date().toISOString();\r\n}\r\n","import * as fs from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport * as os from 'node:os';\r\nimport {\r\n color,\r\n atomicWrite,\r\n DefaultSessionReader,\r\n type Config,\r\n type SecretVault,\r\n type SessionStore,\r\n type SkillLoader,\r\n type ToolRegistry,\r\n type ModelsRegistry,\r\n type WstackPaths,\r\n type WireFamily,\r\n} from '@wrongstack/core';\r\nimport type { TerminalRenderer } from '../renderer.js';\r\nimport type { ReadlineInputReader } from '../input-reader.js';\r\nimport { CLI_VERSION, API_VERSION } from '../version.js';\r\nimport { runAuthMenu, runAuthDirect } from '../auth-menu.js';\r\n\r\nexport type SubcommandHandler = (args: string[], deps: SubcommandDeps) => Promise<number>;\r\n\r\nexport interface SubcommandDeps {\r\n config: Config;\r\n renderer: TerminalRenderer;\r\n reader: ReadlineInputReader;\r\n sessionStore?: SessionStore;\r\n skillLoader?: SkillLoader;\r\n toolRegistry?: ToolRegistry;\r\n modelsRegistry: ModelsRegistry;\r\n paths: WstackPaths;\r\n vault: SecretVault;\r\n cwd: string;\r\n projectRoot: string;\r\n userHome: string;\r\n}\r\n\r\nexport const subcommands: Record<string, SubcommandHandler> = {\r\n init: initCmd,\r\n auth: authCmd,\r\n // `resume <id>` is special-cased in src/index.ts: it's lifted into\r\n // `--resume <id>` so the normal REPL bootstrap runs with a pre-loaded\r\n // session. There is no standalone subcommand handler.\r\n sessions: sessionsCmd,\r\n config: configCmd,\r\n tools: toolsCmd,\r\n skills: skillsCmd,\r\n providers: providersCmd,\r\n models: modelsCmd,\r\n mcp: mcpCmd,\r\n plugin: pluginCmd,\r\n diag: diagCmd,\r\n doctor: doctorCmd,\r\n export: exportCmd,\r\n usage: usageCmd,\r\n version: versionCmd,\r\n help: helpCmd,\r\n projects: projectsCmd,\r\n};\r\n\r\n/**\r\n * Manage API keys.\r\n *\r\n * - `wstack auth` (no args) opens the interactive manager: list saved\r\n * providers, add/update/delete keys, set the active key per provider,\r\n * or pick a new provider from the models.dev catalog.\r\n * - `wstack auth <providerId> [--label <l>] [--family <f>] [--base-url <u>] [--env <a,b>]`\r\n * is the scripted one-shot: prompt for a single key and append it\r\n * under `<l>` (default \"default\", auto-suffixed on collision).\r\n *\r\n * Keys are stored under `providers[<id>].apiKeys[]`, encrypted at rest\r\n * by the secret vault. The legacy single-key `apiKey` field is still\r\n * honored for reads and is kept in sync with the active entry.\r\n */\r\nasync function authCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const flags = parseAuthFlags(args);\r\n const menuDeps = {\r\n renderer: deps.renderer,\r\n reader: deps.reader,\r\n modelsRegistry: deps.modelsRegistry,\r\n vault: deps.vault,\r\n globalConfigPath: deps.paths.globalConfig,\r\n };\r\n\r\n if (flags.positional.length === 0) {\r\n return runAuthMenu(menuDeps);\r\n }\r\n\r\n return runAuthDirect(menuDeps, {\r\n providerId: flags.positional[0]!,\r\n label: flags.label,\r\n family: flags.family,\r\n baseUrl: flags.baseUrl,\r\n envVars: flags.envVars,\r\n });\r\n}\r\n\r\ninterface AuthFlags {\r\n positional: string[];\r\n label?: string;\r\n family?: WireFamily;\r\n baseUrl?: string;\r\n envVars?: string[];\r\n}\r\n\r\nfunction parseAuthFlags(args: string[]): AuthFlags {\r\n const out: AuthFlags = { positional: [] };\r\n for (let i = 0; i < args.length; i++) {\r\n const a = args[i];\r\n if (a === '--label') {\r\n const v = args[++i];\r\n if (v) out.label = v;\r\n } else if (a === '--family') {\r\n const v = args[++i];\r\n if (v) out.family = v as WireFamily;\r\n } else if (a === '--base-url') {\r\n const v = args[++i];\r\n if (v) out.baseUrl = v;\r\n } else if (a === '--env') {\r\n const v = args[++i];\r\n if (v) out.envVars = v.split(',').map((s) => s.trim()).filter(Boolean);\r\n } else if (a && !a.startsWith('--')) {\r\n out.positional.push(a);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nasync function initCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n deps.renderer.write(color.bold('WrongStack init\\n'));\r\n deps.renderer.writeInfo('Loading provider catalog from models.dev (cached locally)…');\r\n\r\n let providers;\r\n try {\r\n providers = await deps.modelsRegistry.listProviders();\r\n } catch (err) {\r\n deps.renderer.writeError(\r\n `Failed to load provider catalog: ${err instanceof Error ? err.message : err}`,\r\n );\r\n return 1;\r\n }\r\n\r\n // Prefer providers whose env var is already set, then anthropic/openai/google as common defaults.\r\n const detected = providers\r\n .filter((p) => p.family !== 'unsupported')\r\n .filter((p) => p.envVars.some((v) => process.env[v]));\r\n const ranked =\r\n detected.length > 0\r\n ? detected\r\n : providers.filter((p) => ['anthropic', 'openai', 'google'].includes(p.id));\r\n\r\n if (detected.length > 0) {\r\n deps.renderer.write(`Detected API keys for: ${detected.map((p) => p.name).join(', ')}\\n`);\r\n }\r\n\r\n const defaultId = ranked[0]?.id ?? 'anthropic';\r\n const providerId =\r\n (await deps.reader.readLine(`Provider [${defaultId}]: `)).trim() || defaultId;\r\n\r\n const provider = await deps.modelsRegistry.getProvider(providerId);\r\n if (!provider) {\r\n deps.renderer.writeError(`Provider \"${providerId}\" not found in models.dev catalog.`);\r\n return 1;\r\n }\r\n if (provider.family === 'unsupported') {\r\n deps.renderer.writeError(\r\n `Provider \"${providerId}\" uses ${provider.npm} which has no built-in transport. Install a plugin to enable it.`,\r\n );\r\n return 1;\r\n }\r\n\r\n const suggestedModel = (await deps.modelsRegistry.suggestModel(providerId)) ?? '';\r\n const modelHint = suggestedModel ? ` [${suggestedModel}]` : '';\r\n const modelId =\r\n (await deps.reader.readLine(`Model${modelHint}: `)).trim() || suggestedModel;\r\n if (!modelId) {\r\n deps.renderer.writeError('No model selected. Aborting.');\r\n return 1;\r\n }\r\n\r\n // Find any existing env value\r\n const envHit = provider.envVars.map((v) => process.env[v]).find(Boolean);\r\n let apiKey = '';\r\n if (!envHit) {\r\n apiKey = (\r\n await deps.reader.readLine(\r\n `API key (stored in ${deps.paths.globalConfig}; empty = expect ${provider.envVars[0] ?? 'env var'}): `,\r\n )\r\n ).trim();\r\n } else {\r\n deps.renderer.writeInfo(`Found API key in env (${provider.envVars.join(' / ')}).`);\r\n }\r\n\r\n await fs.mkdir(deps.paths.globalRoot, { recursive: true });\r\n const config: Partial<Config> = {\r\n version: 1,\r\n provider: providerId,\r\n model: modelId,\r\n };\r\n if (apiKey) config.apiKey = apiKey;\r\n await atomicWrite(deps.paths.globalConfig, JSON.stringify(config, null, 2));\r\n\r\n // Project-local committed marker (opt-in)\r\n await fs.mkdir(path.join(deps.projectRoot, '.wrongstack'), { recursive: true });\r\n const agentsFile = path.join(deps.projectRoot, '.wrongstack', 'AGENTS.md');\r\n try {\r\n await fs.access(agentsFile);\r\n } catch {\r\n await atomicWrite(\r\n agentsFile,\r\n '# Project notes for WrongStack\\n\\nWrite project-specific conventions, build commands,\\nand domain knowledge here. This file is committed to git.\\n',\r\n );\r\n }\r\n\r\n deps.renderer.writeInfo(`Wrote ${deps.paths.globalConfig}`);\r\n deps.renderer.writeInfo(`Project state lives in ${deps.paths.projectDir}`);\r\n deps.renderer.writeInfo('Try: wstack \"<task>\" or wstack');\r\n return 0;\r\n}\r\n\r\nasync function sessionsCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n if (!deps.sessionStore) {\r\n deps.renderer.writeError('No session store available.');\r\n return 1;\r\n }\r\n const list = await deps.sessionStore.list(20);\r\n if (list.length === 0) {\r\n deps.renderer.write('No sessions found.\\n');\r\n return 0;\r\n }\r\n for (const s of list) {\r\n deps.renderer.write(\r\n ` ${s.id} ${color.dim(s.startedAt)} ${color.dim(`${s.tokenTotal} tok`)} ${s.title}\\n`,\r\n );\r\n }\r\n return 0;\r\n}\r\n\r\nasync function configCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const sub = args[0];\r\n if (!sub || sub === 'show') {\r\n const redacted = redactKeys(deps.config);\r\n deps.renderer.write(JSON.stringify(redacted, null, 2) + '\\n');\r\n return 0;\r\n }\r\n if (sub === 'edit') {\r\n const editor = process.env['EDITOR'] ?? 'vi';\r\n deps.renderer.write(`Run: ${editor} ${deps.paths.globalConfig}\\n`);\r\n return 0;\r\n }\r\n deps.renderer.writeError(`Unknown config subcommand: ${sub}`);\r\n return 1;\r\n}\r\n\r\nasync function toolsCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n const reg = deps.toolRegistry;\r\n if (!reg) return 0;\r\n for (const { tool, owner } of reg.listWithOwner()) {\r\n deps.renderer.write(\r\n ` ${tool.name.padEnd(28)} ${color.dim(`[${owner}]`)} ${tool.permission}\\n`,\r\n );\r\n }\r\n return 0;\r\n}\r\n\r\nasync function skillsCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n if (!deps.skillLoader) return 0;\r\n const list = await deps.skillLoader.list();\r\n for (const s of list) {\r\n deps.renderer.write(\r\n ` ${s.name.padEnd(24)} ${color.dim(`[${s.source}]`)} ${s.description.split('\\n')[0]}\\n`,\r\n );\r\n }\r\n return 0;\r\n}\r\n\r\nasync function providersCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const showAll = args.includes('--all');\r\n const showUnsupported = args.includes('--unsupported');\r\n try {\r\n const all = await deps.modelsRegistry.listProviders();\r\n const byFamily: Record<WireFamily, typeof all> = {\r\n anthropic: [],\r\n openai: [],\r\n 'openai-compatible': [],\r\n google: [],\r\n unsupported: [],\r\n };\r\n for (const p of all) byFamily[p.family].push(p);\r\n\r\n const families: WireFamily[] = showUnsupported\r\n ? ['unsupported']\r\n : showAll\r\n ? ['anthropic', 'openai', 'google', 'openai-compatible', 'unsupported']\r\n : ['anthropic', 'openai', 'google', 'openai-compatible'];\r\n\r\n for (const family of families) {\r\n const list = byFamily[family];\r\n if (list.length === 0) continue;\r\n deps.renderer.write(`\\n${color.bold(family)} (${list.length}):\\n`);\r\n for (const p of list) {\r\n const envFound = p.envVars.some((v) => process.env[v]);\r\n const marker = envFound ? color.green('●') : color.dim('○');\r\n const envHint = p.envVars[0] ? color.dim(`[${p.envVars[0]}]`) : '';\r\n const note = family === 'unsupported' ? color.dim('(needs plugin)') : '';\r\n deps.renderer.write(\r\n ` ${marker} ${p.id.padEnd(20)} ${p.name.padEnd(28)} ${envHint} ${note}\\n`,\r\n );\r\n }\r\n }\r\n deps.renderer.write(\r\n `\\n${color.dim(`Current: ${deps.config.provider ?? '<unset>'} / ${deps.config.model ?? '<unset>'}. Use --all to include unsupported families.`)}\\n`,\r\n );\r\n return 0;\r\n } catch (err) {\r\n deps.renderer.writeError(\r\n `Failed to list providers: ${err instanceof Error ? err.message : err}`,\r\n );\r\n return 1;\r\n }\r\n}\r\n\r\nasync function modelsCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const sub = args[0];\r\n if (sub === 'refresh') {\r\n deps.renderer.writeInfo('Refreshing models.dev cache…');\r\n try {\r\n const payload = await deps.modelsRegistry.refresh();\r\n deps.renderer.writeInfo(\r\n `Cached ${Object.keys(payload).length} providers to ${deps.paths.modelsCache}`,\r\n );\r\n return 0;\r\n } catch (err) {\r\n deps.renderer.writeError(`Refresh failed: ${err instanceof Error ? err.message : err}`);\r\n return 1;\r\n }\r\n }\r\n const providerId = sub ?? deps.config.provider;\r\n if (!providerId) {\r\n deps.renderer.writeError('Usage: wstack models <provider> | refresh');\r\n return 1;\r\n }\r\n // If the requested id is an alias (`providers[id].type` points at a\r\n // different catalog entry), fall back to that catalog id so the user\r\n // still gets the model list.\r\n let lookupId = providerId;\r\n const savedAlias = deps.config.providers?.[providerId];\r\n if (savedAlias?.type && savedAlias.type !== providerId) {\r\n lookupId = savedAlias.type;\r\n }\r\n const provider = await deps.modelsRegistry.getProvider(lookupId);\r\n if (!provider) {\r\n deps.renderer.writeError(\r\n lookupId !== providerId\r\n ? `Alias \"${providerId}\" points at catalog id \"${lookupId}\" which is not in the cache.`\r\n : `Provider \"${providerId}\" not in catalog.`,\r\n );\r\n return 1;\r\n }\r\n if (lookupId !== providerId) {\r\n deps.renderer.write(color.dim(`(showing catalog models for \"${lookupId}\" via alias \"${providerId}\")\\n`));\r\n }\r\n deps.renderer.write(`${color.bold(provider.name)} ${color.dim(`(${provider.id})`)}\\n`);\r\n if (provider.doc) deps.renderer.write(color.dim(`Docs: ${provider.doc}\\n`));\r\n // User-saved model list wins when present — `wstack models <id>` should\r\n // reflect what the user has configured for that endpoint, not what\r\n // models.dev thinks is on offer (e.g. LM Studio with custom model ids).\r\n // When a user model id ALSO exists in the catalog we surface the\r\n // catalog metadata (ctx/cost/caps); otherwise we just print the id.\r\n const userModels = deps.config.providers?.[providerId]?.models;\r\n const catalogById = new Map(provider.models.map((m) => [m.id, m]));\r\n const sorted = userModels && userModels.length > 0\r\n ? userModels.map((id) => catalogById.get(id) ?? { id, name: id })\r\n : [...provider.models].sort((a, b) =>\r\n (b.release_date ?? '').localeCompare(a.release_date ?? ''),\r\n );\r\n if (userModels && userModels.length > 0) {\r\n deps.renderer.write(color.dim(`(${userModels.length} model(s) from your saved config)\\n`));\r\n }\r\n for (const m of sorted) {\r\n const caps: string[] = [];\r\n if ('tool_call' in m && m.tool_call) caps.push('tools');\r\n if ('reasoning' in m && m.reasoning) caps.push('reasoning');\r\n if ('modalities' in m && m.modalities?.input?.includes('image')) caps.push('vision');\r\n const ctx = 'limit' in m && m.limit?.context\r\n ? `${(m.limit.context / 1000).toFixed(0)}k`\r\n : '?';\r\n const cost = 'cost' in m && m.cost?.input !== undefined\r\n ? `$${m.cost.input}/$${m.cost.output ?? '?'}`\r\n : '';\r\n deps.renderer.write(\r\n ` ${m.id.padEnd(40)} ${color.dim(ctx.padStart(6))} ${color.dim(cost.padEnd(14))} ${color.dim(caps.join(','))}\\n`,\r\n );\r\n }\r\n const age = await deps.modelsRegistry.ageSeconds();\r\n deps.renderer.write(\r\n color.dim(\r\n `\\nCache age: ${isFinite(age) ? `${Math.round(age / 60)}m` : 'never fetched'}. Run \\`wstack models refresh\\` to update.\\n`,\r\n ),\r\n );\r\n return 0;\r\n}\r\n\r\nasync function mcpCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const sub = args[0];\r\n if (!sub || sub === 'list') {\r\n const servers = deps.config.mcpServers ?? {};\r\n if (Object.keys(servers).length === 0) {\r\n deps.renderer.write('No MCP servers configured.\\n');\r\n deps.renderer.write('Use `wstack mcp add <name>` or set mcpServers in your config.\\n');\r\n return 0;\r\n }\r\n for (const [name, cfg] of Object.entries(servers)) {\r\n const status = cfg.enabled === false ? 'disabled' : 'enabled';\r\n const desc = cfg.description ? ` # ${cfg.description}` : '';\r\n deps.renderer.write(\r\n ` ${name.padEnd(20)} ${cfg.transport.padEnd(16)} ${status}${desc}\\n`,\r\n );\r\n }\r\n return 0;\r\n }\r\n\r\n if (sub === 'add') {\r\n const name = args[1];\r\n if (!name) {\r\n deps.renderer.writeError('Usage: wstack mcp add <name>\\n');\r\n deps.renderer.write('Available servers:\\n');\r\n for (const [sname, scfg] of Object.entries(deps.config.mcpServers ?? {})) {\r\n deps.renderer.write(` ${sname.padEnd(20)} ${scfg.description ?? scfg.transport}\\n`);\r\n }\r\n if (Object.keys(deps.config.mcpServers ?? {}).length === 0) {\r\n deps.renderer.write(\r\n ' filesystem filesystem (read/write/navigate)\\n' +\r\n ' github github (issues, PRs, repos)\\n' +\r\n ' context7 context7 (codebase docs & Q&A)\\n' +\r\n ' brave-search brave search (web search)\\n' +\r\n ' block block (Postgres via SQL)\\n' +\r\n ' everart everart (AI image generation)\\n' +\r\n ' slack slack (messaging & channels)\\n' +\r\n ' aws aws (EC2, S3, Lambda, IAM)\\n' +\r\n ' google-maps google-maps (directions, geocoding)\\n' +\r\n ' sentinel sentinel (security vulnerabilities)\\n',\r\n );\r\n }\r\n deps.renderer.write('\\nRun `wstack mcp add <name> --enable` to enable immediately.\\n');\r\n return 1;\r\n }\r\n return addMcpServer(args, deps);\r\n }\r\n\r\n if (sub === 'remove') {\r\n const name = args[1];\r\n if (!name) {\r\n deps.renderer.writeError('Usage: wstack mcp remove <name>\\n');\r\n return 1;\r\n }\r\n return removeMcpServer(name, deps);\r\n }\r\n\r\n if (sub === 'restart') {\r\n deps.renderer.writeWarning('mcp restart is only available in REPL mode.');\r\n return 0;\r\n }\r\n deps.renderer.writeError(`Unknown mcp subcommand: ${sub}`);\r\n return 1;\r\n}\r\n\r\nasync function addMcpServer(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const name = args[1]!;\r\n const enable = args.includes('--enable') || args.includes('-e');\r\n\r\n /** Built-in server presets — all start disabled unless --enable is passed. */\r\n const builtIn: Record<string, { name: string; transport: 'stdio' | 'sse' | 'streamable-http'; command?: string; args?: string[]; url?: string; env?: Record<string, string>; permission: 'auto' | 'confirm' | 'deny'; description: string; enabled?: boolean }> = {\r\n filesystem: { name: 'filesystem', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-filesystem', '.'], permission: 'confirm', description: 'Read, write, and navigate the local filesystem' },\r\n github: { name: 'github', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-github'], permission: 'confirm', description: 'GitHub API — issues, PRs, repos, search' },\r\n 'context7': { name: 'context7', transport: 'streamable-http', url: 'https://server.context7.ai/mcp', permission: 'confirm', description: 'Codebase-aware documentation and Q&A' },\r\n 'brave-search': { name: 'brave-search', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-brave-search'], permission: 'confirm', description: 'Web search (Brave)' },\r\n block: { name: 'block', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-block'], permission: 'confirm', description: 'Postgres database via SQL' },\r\n everart: { name: 'everart', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-everart'], permission: 'confirm', description: 'AI image generation' },\r\n slack: { name: 'slack', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-slack'], permission: 'confirm', description: 'Slack messaging & channels' },\r\n aws: { name: 'aws', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-aws'], permission: 'confirm', description: 'AWS — EC2, S3, Lambda, IAM' },\r\n 'google-maps': { name: 'google-maps', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-google-maps'], permission: 'confirm', description: 'Google Maps — directions, geocoding, places' },\r\n sentinel: { name: 'sentinel', transport: 'streamable-http', url: 'https://mcp.sentinel.ai', permission: 'deny', description: 'Security vulnerability scanning' },\r\n };\r\n\r\n const factory = builtIn[name] as typeof builtIn[string] | undefined;\r\n if (!factory) {\r\n deps.renderer.writeError(`Unknown server \"${name}\". Run \\`wstack mcp add\\` without args to see available servers.\\n`);\r\n return 1;\r\n }\r\n\r\n const serverCfg = { ...factory };\r\n if (!enable) serverCfg.enabled = false;\r\n\r\n // Load and update the config file\r\n let existing: Record<string, unknown> = {};\r\n try {\r\n const raw = await fs.readFile(deps.paths.globalConfig, 'utf8');\r\n existing = JSON.parse(raw);\r\n } catch {\r\n // Config doesn't exist yet — that's fine\r\n }\r\n\r\n const mcpServers = (existing.mcpServers as Record<string, Record<string, unknown>> | undefined) ?? {};\r\n if (mcpServers[name]) {\r\n deps.renderer.writeWarning(`Server \"${name}\" already in config. Updating.\\n`);\r\n }\r\n // MCPServerConfig is a closed interface (no string index signature), but\r\n // the on-disk JSON shape stores it as a plain object — cast through unknown\r\n // so we can land it without widening the public type.\r\n mcpServers[name] = serverCfg as unknown as Record<string, unknown>;\r\n existing.mcpServers = mcpServers;\r\n\r\n await atomicWrite(deps.paths.globalConfig, JSON.stringify(existing, null, 2));\r\n const verb = enable ? 'Enabled' : 'Added (disabled — set enabled:true to activate)';\r\n deps.renderer.writeInfo(`${verb} \"${name}\" (${serverCfg.transport}). Config written to ${deps.paths.globalConfig}.\\n`);\r\n return 0;\r\n}\r\n\r\nasync function removeMcpServer(name: string, deps: SubcommandDeps): Promise<number> {\r\n let existing: Record<string, unknown> = {};\r\n try {\r\n const raw = await fs.readFile(deps.paths.globalConfig, 'utf8');\r\n existing = JSON.parse(raw);\r\n } catch {\r\n deps.renderer.writeError('No config file found.\\n');\r\n return 1;\r\n }\r\n\r\n const mcpServers = (existing.mcpServers as Record<string, Record<string, unknown>> | undefined) ?? {};\r\n if (!mcpServers[name]) {\r\n deps.renderer.writeError(`Server \"${name}\" not in config.\\n`);\r\n return 1;\r\n }\r\n delete mcpServers[name];\r\n existing.mcpServers = mcpServers;\r\n\r\n await atomicWrite(deps.paths.globalConfig, JSON.stringify(existing, null, 2));\r\n deps.renderer.writeInfo(`Removed \"${name}\" from config.\\n`);\r\n return 0;\r\n}\r\n\r\nasync function pluginCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const sub = args[0];\r\n if (!sub || sub === 'list') {\r\n const plugins = deps.config.plugins ?? [];\r\n if (plugins.length === 0) {\r\n deps.renderer.write('No plugins configured.\\n');\r\n return 0;\r\n }\r\n for (const p of plugins) {\r\n const name = typeof p === 'string' ? p : p.name;\r\n const enabled = typeof p === 'object' && p.enabled === false ? 'disabled' : 'enabled';\r\n deps.renderer.write(` ${name} ${enabled}\\n`);\r\n }\r\n return 0;\r\n }\r\n deps.renderer.writeWarning(`plugin ${sub} not implemented (edit config.plugins manually).`);\r\n return 0;\r\n}\r\n\r\nasync function diagCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n const cfg = deps.config;\r\n const age = await deps.modelsRegistry.ageSeconds();\r\n const lines = [\r\n color.bold('WrongStack diagnostics'),\r\n ` apiVersion: ${API_VERSION}`,\r\n ` cwd: ${deps.cwd}`,\r\n ` projectRoot: ${deps.projectRoot}`,\r\n ` projectHash: ${deps.paths.projectHash}`,\r\n ` projectDir: ${deps.paths.projectDir}`,\r\n ` globalRoot: ${deps.paths.globalRoot}`,\r\n ` modelsCache: ${deps.paths.modelsCache}`,\r\n ` cacheAge: ${isFinite(age) ? `${Math.round(age / 60)}m` : 'never'}`,\r\n ` node: ${process.version}`,\r\n ` os: ${os.platform()} ${os.release()}`,\r\n ` provider: ${cfg.provider ?? '<unset>'}`,\r\n ` model: ${cfg.model ?? '<unset>'}`,\r\n ` tools: ${deps.toolRegistry?.list().length ?? 0}`,\r\n ` plugins: ${cfg.plugins?.length ?? 0}`,\r\n ` mcpServers: ${Object.keys(cfg.mcpServers ?? {}).length}`,\r\n ];\r\n deps.renderer.write(lines.join('\\n') + '\\n');\r\n return 0;\r\n}\r\n\r\n/**\r\n * V3-A: `wstack doctor` — runs a battery of checks and returns non-zero\r\n * if any are unhealthy. Unlike `diag` (which dumps facts), `doctor` makes\r\n * a judgement call per check so users get an actionable list of fix-ups\r\n * instead of having to interpret raw config.\r\n */\r\nasync function doctorCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n type CheckResult = { name: string; status: 'ok' | 'warn' | 'fail'; detail: string };\r\n const checks: CheckResult[] = [];\r\n\r\n // 1. Provider + model are set\r\n const cfg = deps.config;\r\n if (!cfg.provider) {\r\n checks.push({ name: 'provider', status: 'fail', detail: 'no provider configured — run `wstack init` or `wstack auth`' });\r\n } else {\r\n checks.push({ name: 'provider', status: 'ok', detail: cfg.provider });\r\n }\r\n if (!cfg.model) {\r\n checks.push({ name: 'model', status: 'fail', detail: 'no model configured — run `wstack init`' });\r\n } else {\r\n checks.push({ name: 'model', status: 'ok', detail: cfg.model });\r\n }\r\n\r\n // 2. An API key is reachable (either in vault or env)\r\n if (cfg.provider) {\r\n const providerCfg = (cfg.providers as Record<string, { apiKey?: string; envVars?: string[] }> | undefined)?.[cfg.provider];\r\n const hasVaultKey = typeof providerCfg?.apiKey === 'string' && providerCfg.apiKey.length > 0;\r\n const envHit = providerCfg?.envVars?.some((v) => process.env[v]) ?? false;\r\n if (hasVaultKey || envHit) {\r\n checks.push({\r\n name: 'api key',\r\n status: 'ok',\r\n detail: hasVaultKey ? 'found in vault' : 'found in env',\r\n });\r\n } else {\r\n checks.push({\r\n name: 'api key',\r\n status: 'fail',\r\n detail: `no key for \"${cfg.provider}\" in vault or env — run \\`wstack auth ${cfg.provider}\\``,\r\n });\r\n }\r\n }\r\n\r\n // 3. models.dev cache is reasonably fresh (< 7 days)\r\n try {\r\n const age = await deps.modelsRegistry.ageSeconds();\r\n if (!isFinite(age)) {\r\n checks.push({ name: 'models cache', status: 'warn', detail: 'never fetched — run `wstack models refresh`' });\r\n } else if (age > 7 * 24 * 3600) {\r\n checks.push({\r\n name: 'models cache',\r\n status: 'warn',\r\n detail: `${Math.round(age / 86400)} days old — run \\`wstack models refresh\\``,\r\n });\r\n } else {\r\n checks.push({ name: 'models cache', status: 'ok', detail: `${Math.round(age / 60)}m old` });\r\n }\r\n } catch (err) {\r\n checks.push({\r\n name: 'models cache',\r\n status: 'warn',\r\n detail: `read failed: ${err instanceof Error ? err.message : String(err)}`,\r\n });\r\n }\r\n\r\n // 4. Vault file is readable when present\r\n try {\r\n await fs.access(deps.paths.secretsKey);\r\n checks.push({ name: 'secret vault', status: 'ok', detail: deps.paths.secretsKey });\r\n } catch {\r\n checks.push({\r\n name: 'secret vault',\r\n status: 'warn',\r\n detail: 'not yet initialized (created lazily on first encrypt)',\r\n });\r\n }\r\n\r\n // 5. Project sessions dir is writable\r\n try {\r\n await fs.mkdir(deps.paths.projectSessions, { recursive: true });\r\n const probe = path.join(deps.paths.projectSessions, `.probe-${Date.now()}`);\r\n await fs.writeFile(probe, '');\r\n await fs.unlink(probe);\r\n checks.push({ name: 'sessions writable', status: 'ok', detail: deps.paths.projectSessions });\r\n } catch (err) {\r\n checks.push({\r\n name: 'sessions writable',\r\n status: 'fail',\r\n detail: `cannot write to ${deps.paths.projectSessions}: ${err instanceof Error ? err.message : String(err)}`,\r\n });\r\n }\r\n\r\n // 6. Each enabled MCP server has a reachable command/url\r\n const mcpEntries = Object.entries(cfg.mcpServers ?? {}) as [\r\n string,\r\n { enabled?: boolean; transport?: string; command?: string; url?: string },\r\n ][];\r\n for (const [name, srv] of mcpEntries) {\r\n if (!srv.enabled) continue;\r\n if ((srv.transport === 'sse' || srv.transport === 'streamable-http') && !srv.url) {\r\n checks.push({ name: `mcp:${name}`, status: 'fail', detail: 'transport requires url' });\r\n } else if (srv.transport === 'stdio' && !srv.command) {\r\n checks.push({ name: `mcp:${name}`, status: 'fail', detail: 'stdio transport requires command' });\r\n } else {\r\n checks.push({ name: `mcp:${name}`, status: 'ok', detail: `${srv.transport} ${srv.command ?? srv.url ?? ''}`.trim() });\r\n }\r\n }\r\n\r\n // 7. Node engine\r\n const major = Number.parseInt(process.version.replace(/^v/, '').split('.')[0] ?? '0', 10);\r\n if (major < 22) {\r\n checks.push({ name: 'node', status: 'fail', detail: `${process.version} (need ≥22)` });\r\n } else {\r\n checks.push({ name: 'node', status: 'ok', detail: process.version });\r\n }\r\n\r\n // Render\r\n deps.renderer.write(color.bold('WrongStack doctor\\n\\n'));\r\n let failed = 0;\r\n let warned = 0;\r\n for (const c of checks) {\r\n const icon = c.status === 'ok' ? color.green('✓') : c.status === 'warn' ? color.amber('●') : color.red('✗');\r\n deps.renderer.write(` ${icon} ${c.name.padEnd(20)} ${color.dim(c.detail)}\\n`);\r\n if (c.status === 'fail') failed++;\r\n if (c.status === 'warn') warned++;\r\n }\r\n deps.renderer.write('\\n');\r\n if (failed > 0) {\r\n deps.renderer.write(color.red(`${failed} failed, ${warned} warning${warned === 1 ? '' : 's'}\\n`));\r\n return 1;\r\n }\r\n if (warned > 0) {\r\n deps.renderer.write(color.amber(`All checks passed (${warned} warning${warned === 1 ? '' : 's'})\\n`));\r\n return 0;\r\n }\r\n deps.renderer.write(color.green('All checks passed.\\n'));\r\n return 0;\r\n}\r\n\r\nasync function exportCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n if (!deps.sessionStore) {\r\n deps.renderer.writeError('No session store configured.');\r\n return 1;\r\n }\r\n\r\n let format: 'markdown' | 'json' | 'text' = 'markdown';\r\n let output: string | undefined;\r\n let includeTools = true;\r\n let includeDiagnostics = true;\r\n let sessionId: string | undefined;\r\n\r\n for (let i = 0; i < args.length; i++) {\r\n const a = args[i]!;\r\n if (a === '--format' || a === '-f') {\r\n const v = args[++i];\r\n if (v !== 'markdown' && v !== 'json' && v !== 'text') {\r\n deps.renderer.writeError(`Unknown --format ${v}. Use markdown, json, or text.`);\r\n return 1;\r\n }\r\n format = v;\r\n } else if (a === '--out' || a === '-o') {\r\n output = args[++i];\r\n } else if (a === '--no-tools') {\r\n includeTools = false;\r\n } else if (a === '--no-diagnostics') {\r\n includeDiagnostics = false;\r\n } else if (a.startsWith('-')) {\r\n deps.renderer.writeError(`Unknown flag: ${a}`);\r\n return 1;\r\n } else if (!sessionId) {\r\n sessionId = a;\r\n }\r\n }\r\n\r\n if (!sessionId) {\r\n deps.renderer.writeError('Usage: wstack export <sessionId> [--format markdown|json|text] [--out <file>] [--no-tools] [--no-diagnostics]');\r\n return 1;\r\n }\r\n\r\n const reader = new DefaultSessionReader({ store: deps.sessionStore });\r\n let rendered: string;\r\n try {\r\n rendered = await reader.export(sessionId, {\r\n format,\r\n includeTools,\r\n includeDiagnostics,\r\n });\r\n } catch (err) {\r\n deps.renderer.writeError(\r\n `Export failed: ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n return 1;\r\n }\r\n\r\n if (output) {\r\n await fs.mkdir(path.dirname(path.resolve(deps.cwd, output)), { recursive: true });\r\n await fs.writeFile(path.resolve(deps.cwd, output), rendered, 'utf8');\r\n deps.renderer.write(`Wrote ${rendered.length} bytes to ${output}\\n`);\r\n } else {\r\n deps.renderer.write(rendered);\r\n if (!rendered.endsWith('\\n')) deps.renderer.write('\\n');\r\n }\r\n return 0;\r\n}\r\n\r\nasync function usageCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n if (!deps.sessionStore) return 0;\r\n const list = await deps.sessionStore.list(100);\r\n let totalIn = 0;\r\n for (const s of list) totalIn += s.tokenTotal;\r\n deps.renderer.write(`Sessions: ${list.length} total tokens: ${totalIn}\\n`);\r\n return 0;\r\n}\r\n\r\nasync function versionCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n deps.renderer.write(\r\n `WrongStack ${CLI_VERSION} (apiVersion ${API_VERSION}, node ${process.version}, ${os.platform()})\\n`,\r\n );\r\n return 0;\r\n}\r\n\r\nasync function helpCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n const lines = [\r\n color.bold('WrongStack — usage'),\r\n '',\r\n ' wstack Start REPL',\r\n ' wstack \"<task>\" Run task and exit',\r\n ' wstack resume [<id>] Resume a session',\r\n ' wstack sessions List recent sessions',\r\n ' wstack init Pick provider + model from models.dev',\r\n ' wstack auth Interactive key manager (list/add/update/delete)',\r\n ' wstack auth <provider> Append one key for a provider (encrypted at rest)',\r\n ' wstack resume <id> Resume a session (loads transcript + appends)',\r\n ' wstack config [show|edit] Show or edit effective config',\r\n ' wstack tools List registered tools',\r\n ' wstack skills List discovered skills',\r\n ' wstack providers [--all] List providers from models.dev',\r\n ' wstack models [<provider>] List models for current/specified provider',\r\n ' wstack models refresh Force-refresh models.dev cache',\r\n ' wstack mcp [list] List MCP servers',\r\n ' wstack plugin [list] List plugins',\r\n ' wstack projects List projects tracked in ~/.wrongstack/projects/',\r\n ' wstack diag Full diagnostics',\r\n ' wstack doctor Health checks (config, keys, MCP, node)',\r\n ' wstack export <id> [opts] Render a session (--format markdown|json|text, --out <file>)',\r\n ' wstack usage Token + cost summary',\r\n ' wstack version Print version',\r\n '',\r\n 'Global flags:',\r\n ' --provider, --model, --cwd, --log-level, --yolo, --verbose, --trace, --config',\r\n ];\r\n deps.renderer.write(lines.join('\\n') + '\\n');\r\n return 0;\r\n}\r\n\r\nasync function projectsCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n const projectsRoot = path.join(deps.paths.globalRoot, 'projects');\r\n try {\r\n const entries = await fs.readdir(projectsRoot);\r\n if (entries.length === 0) {\r\n deps.renderer.write('No projects tracked.\\n');\r\n return 0;\r\n }\r\n for (const hash of entries) {\r\n try {\r\n const meta = JSON.parse(\r\n await fs.readFile(path.join(projectsRoot, hash, 'meta.json'), 'utf8'),\r\n ) as { root?: string; lastSeen?: string };\r\n deps.renderer.write(\r\n ` ${color.dim(hash)} ${color.dim(meta.lastSeen ?? '')} ${meta.root ?? '?'}\\n`,\r\n );\r\n } catch {\r\n deps.renderer.write(` ${color.dim(hash)} ${color.dim('(no meta)')}\\n`);\r\n }\r\n }\r\n return 0;\r\n } catch {\r\n deps.renderer.write('No projects directory.\\n');\r\n return 0;\r\n }\r\n}\r\n\r\nfunction redactKeys(obj: unknown): unknown {\r\n if (!obj || typeof obj !== 'object') return obj;\r\n if (Array.isArray(obj)) return obj.map(redactKeys);\r\n const out: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\r\n if (/api.?key|secret|token|pass/i.test(k) && typeof v === 'string' && v.length > 0) {\r\n out[k] = '[REDACTED]';\r\n } else {\r\n out[k] = redactKeys(v);\r\n }\r\n }\r\n return out;\r\n}\r\n","import * as fs from 'node:fs/promises';\r\nimport { writeFileSync } from 'node:fs';\r\nimport { createRequire } from 'node:module';\r\nimport * as path from 'node:path';\r\nimport {\r\n Agent,\r\n AutoCompactionMiddleware,\r\n type Config,\r\n Container,\r\n Context,\r\n DefaultAttachmentStore,\r\n DefaultConfigStore,\r\n DefaultErrorHandler,\r\n DefaultLogger,\r\n DefaultMemoryStore,\r\n DefaultModelsRegistry,\r\n DefaultPermissionPolicy,\r\n DefaultRetryPolicy,\r\n DefaultSecretScrubber,\r\n DefaultSessionStore,\r\n DefaultSkillLoader,\r\n DefaultSystemPromptBuilder,\r\n DefaultTokenCounter,\r\n EventBus,\r\n HybridCompactor,\r\n InMemoryMetricsSink,\r\n DefaultHealthRegistry,\r\n wireMetricsToEvents,\r\n startMetricsServer,\r\n type MetricsServerHandle,\r\n type MetricsSink,\r\n type HealthRegistry,\r\n type Plugin,\r\n ProviderRegistry,\r\n QueueStore,\r\n RecoveryLock,\r\n SlashCommandRegistry,\r\n type SystemPromptBuilder,\r\n TOKENS,\r\n ToolRegistry,\r\n color,\r\n createContextManagerTool,\r\n createDefaultPipelines,\r\n loadPlugins,\r\n} from '@wrongstack/core';\r\nimport { MCPRegistry } from '@wrongstack/mcp';\r\nimport {\r\n buildProviderFactoriesFromRegistry,\r\n capabilitiesFor,\r\n makeProviderFromConfig,\r\n} from '@wrongstack/providers';\r\nimport { forgetTool, rememberTool } from '@wrongstack/tools';\r\nimport { builtinTools } from '@wrongstack/tools/builtin';\r\nimport { ReadlineInputReader } from './input-reader.js';\r\nimport { makePromptDelegate, makeConfirmAwaiter } from './permission-prompt.js';\r\nimport { runPicker, saveToGlobalConfig } from './picker.js';\r\nimport { runLaunchPrompts, runProjectCheck } from './pre-launch.js';\r\nimport { TerminalRenderer } from './renderer.js';\r\nimport { runRepl } from './repl.js';\r\nimport { SessionStats } from './session-stats.js';\r\nimport { buildBuiltinSlashCommands } from './slash-commands/index.js';\r\nimport { Spinner } from './spinner.js';\r\nimport { fmtTok, patchConfig } from './utils.js';\r\nimport { bootConfig } from './boot-config.js';\r\nimport { MultiAgentHost } from './multi-agent.js';\r\nimport { subcommands } from './subcommands/index.js';\r\n\r\ninterface ParsedArgs {\r\n flags: Record<string, string | boolean>;\r\n positional: string[];\r\n}\r\n\r\nconst BOOLEAN_FLAGS = new Set([\r\n 'yolo',\r\n 'verbose',\r\n 'trace',\r\n 'help',\r\n 'version',\r\n 'no-banner',\r\n 'no-features',\r\n 'tui',\r\n 'no-tui',\r\n 'no-recovery',\r\n 'recover',\r\n 'no-alt-screen',\r\n 'alt-screen',\r\n 'output-json',\r\n 'prompt',\r\n 'metrics',\r\n]);\r\n\r\nfunction parseArgs(argv: string[]): ParsedArgs {\r\n const flags: Record<string, string | boolean> = {};\r\n const positional: string[] = [];\r\n for (let i = 0; i < argv.length; i++) {\r\n const a = argv[i];\r\n if (!a) continue;\r\n if (a === '--') {\r\n positional.push(...argv.slice(i + 1));\r\n break;\r\n }\r\n if (a.startsWith('--')) {\r\n const eq = a.indexOf('=');\r\n if (eq !== -1) {\r\n flags[a.slice(2, eq)] = a.slice(eq + 1);\r\n continue;\r\n }\r\n const name = a.slice(2);\r\n if (BOOLEAN_FLAGS.has(name)) {\r\n flags[name] = true;\r\n continue;\r\n }\r\n if (i + 1 < argv.length && !(argv[i + 1] ?? '').startsWith('-')) {\r\n flags[name] = argv[++i] ?? '';\r\n } else {\r\n flags[name] = true;\r\n }\r\n } else if (a.startsWith('-') && a.length === 2) {\r\n const short = a.slice(1);\r\n const expand: Record<string, string> = { v: 'verbose' };\r\n flags[expand[short] ?? short] = true;\r\n } else {\r\n positional.push(a);\r\n }\r\n }\r\n return { flags, positional };\r\n}\r\n\r\nfunction resolveBundledSkillsDir(): string | undefined {\r\n try {\r\n const req = createRequire(import.meta.url);\r\n const corePkg = req.resolve('@wrongstack/core/package.json');\r\n return path.join(path.dirname(corePkg), 'skills');\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nimport { CLI_VERSION } from './version.js';\r\nexport { CLI_VERSION };\r\n\r\nexport async function main(argv: string[]): Promise<number> {\r\n const { flags, positional } = parseArgs(argv);\r\n\r\n // `wstack resume <id>` is sugar for `wstack --resume <id>`. Lift it\r\n // before subcommand dispatch so resume falls through to the normal\r\n // REPL flow with the session pre-loaded.\r\n if (positional[0] === 'resume' && positional[1] && !subcommands['__noop_resume_marker']) {\r\n flags['resume'] = positional[1];\r\n positional.splice(0, 2);\r\n }\r\n\r\n // Resolve paths, create vault, migrate plaintext secrets, load config.\r\n let boot;\r\n try {\r\n boot = await bootConfig(flags);\r\n } catch (err) {\r\n process.stderr.write(`Config error: ${err instanceof Error ? err.message : String(err)}\\n`);\r\n return 2;\r\n }\r\n const { paths, config: _config, vault } = boot;\r\n let config = _config;\r\n const { cwd, projectRoot, userHome, wpaths, pathResolver } = paths;\r\n\r\n // Logger — operational log lives in user home\r\n const logger = new DefaultLogger({\r\n level: config.log.level,\r\n file: wpaths.logFile,\r\n });\r\n const renderer = new TerminalRenderer();\r\n const reader = new ReadlineInputReader({ historyFile: wpaths.historyFile });\r\n\r\n // ModelsRegistry — source of truth for providers, models, pricing.\r\n const modelsRegistry = new DefaultModelsRegistry({\r\n cacheFile: wpaths.modelsCache,\r\n ttlSeconds: 24 * 3600,\r\n });\r\n\r\n // Quick path: subcommand dispatch (no provider required for most)\r\n const first = positional[0];\r\n if (first && subcommands[first]) {\r\n const sessionStore = new DefaultSessionStore({ dir: wpaths.projectSessions });\r\n const skillLoader = new DefaultSkillLoader({\r\n paths: wpaths,\r\n bundledDir: resolveBundledSkillsDir(),\r\n });\r\n const toolRegistryForSubcmd = new ToolRegistry();\r\n for (const t of builtinTools) toolRegistryForSubcmd.register(t);\r\n const code = await subcommands[first]!(positional.slice(1), {\r\n config,\r\n renderer,\r\n reader,\r\n sessionStore,\r\n skillLoader,\r\n toolRegistry: toolRegistryForSubcmd,\r\n modelsRegistry,\r\n paths: wpaths,\r\n vault,\r\n cwd,\r\n projectRoot,\r\n userHome,\r\n });\r\n await reader.close();\r\n return code;\r\n }\r\n\r\n // Determine the launch shape up front so the pre-launch prompts (project\r\n // check + mode + yolo) only fire when this is actually an interactive\r\n // session. Single-shot invocations (`wrongstack \"do X\"` / `--prompt`) and\r\n // non-TTY pipes (CI) skip all the interactive sugar.\r\n const isSingleShot = positional.length > 0 || typeof flags['prompt'] === 'string';\r\n const isInteractiveTTY = !!process.stdin.isTTY && !isSingleShot;\r\n\r\n // Project status banner + optional AGENTS.md scaffold. Returns false\r\n // when the user bails out of an empty/scratch directory.\r\n if (isInteractiveTTY) {\r\n const cont = await runProjectCheck({ projectRoot, renderer, reader });\r\n if (!cont) {\r\n await reader.close();\r\n return 0;\r\n }\r\n }\r\n\r\n // Identity selection. We launch the interactive picker whenever the user\r\n // didn't pin BOTH provider and model on the CLI (--provider AND --model).\r\n // The picker pre-selects whatever the config has so Enter accepts the\r\n // previous choice — switching models becomes \"wstack ↵ ↵\" most days.\r\n //\r\n // Non-TTY (pipes, CI) skips the picker: it falls back to whatever's in\r\n // config and hard-errors if that's still empty.\r\n const providerFlag = typeof flags['provider'] === 'string' ? flags['provider'] : undefined;\r\n const modelFlag = typeof flags['model'] === 'string' ? flags['model'] : undefined;\r\n const bothFlagsPinned = !!providerFlag && !!modelFlag;\r\n if (!bothFlagsPinned) {\r\n if (process.stdin.isTTY) {\r\n const picked = await runPicker({\r\n modelsRegistry,\r\n renderer,\r\n reader,\r\n config,\r\n defaultProvider: providerFlag ?? config.provider,\r\n defaultModel: modelFlag ?? config.model,\r\n });\r\n if (!picked) {\r\n // User bailed out and we have no fallback in config — error out.\r\n if (!config.provider || !config.model) {\r\n await reader.close();\r\n return 2;\r\n }\r\n // Otherwise honor the cancel by keeping the config defaults.\r\n } else {\r\n // Persist as the new default so next launch pre-selects this pair.\r\n // Read-before-replace so we can tell whether anything actually\r\n // changed — re-saving the same pair every launch is just noise.\r\n const prevProvider = config.provider;\r\n const prevModel = config.model;\r\n\r\n // The loader hands back a frozen Config. Rebuild a fresh object\r\n // with the picked pair patched in (and re-freeze) instead of\r\n // mutating in place — Object.freeze blocks runtime writes even\r\n // when a TS cast hides it from the compiler.\r\n config = patchConfig(config, { provider: picked.provider, model: picked.model });\r\n\r\n if (picked.provider !== prevProvider || picked.model !== prevModel) {\r\n const saved = await saveToGlobalConfig(\r\n wpaths.globalConfig,\r\n picked.provider,\r\n picked.model,\r\n );\r\n if (saved) {\r\n renderer.writeInfo(`Saved ${picked.provider}/${picked.model} as default.\\n`);\r\n }\r\n }\r\n }\r\n } else if (!config.provider || !config.model) {\r\n process.stderr.write(\r\n 'No provider or model configured. Run `wrongstack init` first, or pass ' +\r\n '--provider <id> --model <id>.\\n',\r\n );\r\n await reader.close();\r\n return 2;\r\n }\r\n // Non-TTY with config present: fall through using config defaults.\r\n }\r\n\r\n // Interactive mode + YOLO prompts. Each prompt is skipped when the user\r\n // already pinned the corresponding flag (--tui / --no-tui / --yolo) on\r\n // the CLI; otherwise we ask. The chosen values are written back to\r\n // `flags` and `config` so the rest of the boot sequence (permission\r\n // policy, REPL-vs-TUI branch) reads them naturally.\r\n if (isInteractiveTTY) {\r\n let modePinned: 'tui' | 'repl' | undefined;\r\n if (flags['no-tui']) modePinned = 'repl';\r\n else if (flags['tui']) modePinned = 'tui';\r\n const yoloPinned: boolean | undefined = flags['yolo'] === true ? true : undefined;\r\n\r\n const choices = await runLaunchPrompts({ renderer, reader, modePinned, yoloPinned });\r\n\r\n // Propagate mode → the REPL/TUI branch later reads flags.tui / flags['no-tui'].\r\n if (choices.mode === 'tui') {\r\n flags['tui'] = true;\r\n flags['no-tui'] = false;\r\n } else {\r\n flags['tui'] = false;\r\n flags['no-tui'] = true;\r\n }\r\n // Propagate yolo → permission policy reads config.yolo. Config is\r\n // frozen so we rebuild (same pattern as the picker patch above).\r\n if (choices.yolo !== config.yolo) {\r\n config = patchConfig(config, { yolo: choices.yolo });\r\n }\r\n }\r\n\r\n // Resolve provider details from models.dev. An alias may not match a\r\n // catalog id directly, so we also try `cfg.type` (which points at the\r\n // catalog entry the alias was derived from). When neither resolves AND\r\n // the user has explicitly set `family` in their config, this is a\r\n // deliberate custom/local provider — staying silent is the right call;\r\n // logging would just train people to ignore the warning.\r\n const savedProviderCfg = config.providers?.[config.provider];\r\n let resolvedProvider = await modelsRegistry.getProvider(config.provider).catch(() => undefined);\r\n if (!resolvedProvider && savedProviderCfg?.type && savedProviderCfg.type !== config.provider) {\r\n resolvedProvider = await modelsRegistry\r\n .getProvider(savedProviderCfg.type)\r\n .catch(() => undefined);\r\n }\r\n if (!resolvedProvider) {\r\n if (!savedProviderCfg?.family) {\r\n logger.warn(\r\n `Provider \"${config.provider}\" not found in models.dev. Continuing with raw config.`,\r\n );\r\n }\r\n } else if (resolvedProvider.family === 'unsupported' && !savedProviderCfg?.family) {\r\n // Catalog says unsupported AND the user hasn't supplied their own\r\n // family override — bail. With an override we trust the user knows\r\n // how to route this endpoint.\r\n process.stderr.write(\r\n `Provider \"${config.provider}\" uses an unsupported wire family (${resolvedProvider.npm}). ` +\r\n `Install a plugin to enable it, or pick a different provider.\\n`,\r\n );\r\n await reader.close();\r\n return 2;\r\n }\r\n\r\n // Build container + services\r\n const container = new Container();\r\n // L1-B: a single ConfigStore is the source of truth for runtime config.\r\n // Subsystems that care about live updates (provider switching, extension\r\n // reload) resolve this and call .watch() — everything else can still read\r\n // the flat `config` snapshot. We mutate the store on /model and similar\r\n // commands so observers re-render automatically.\r\n const configStore = new DefaultConfigStore(config);\r\n container.bind(TOKENS.ConfigStore, () => configStore);\r\n container.bind(TOKENS.Logger, () => logger);\r\n container.bind(TOKENS.PathResolver, () => pathResolver);\r\n container.bind(TOKENS.SecretScrubber, () => new DefaultSecretScrubber());\r\n container.bind(TOKENS.RetryPolicy, () => new DefaultRetryPolicy());\r\n container.bind(TOKENS.ErrorHandler, () => new DefaultErrorHandler());\r\n container.bind(TOKENS.ModelsRegistry, () => modelsRegistry);\r\n container.bind(\r\n TOKENS.TokenCounter,\r\n () => new DefaultTokenCounter({ registry: modelsRegistry, providerId: config.provider }),\r\n );\r\n container.bind(\r\n TOKENS.SessionStore,\r\n () => new DefaultSessionStore({ dir: wpaths.projectSessions }),\r\n );\r\n const memoryStore = new DefaultMemoryStore({ paths: wpaths });\r\n container.bind(TOKENS.MemoryStore, () => memoryStore);\r\n // Skills are an opt-in feature pack — when disabled we still bind a\r\n // loader that returns an empty list so the prompt builder doesn't\r\n // need a special path. This way `--no-features` doesn't drift behaviour.\r\n const skillLoader = new DefaultSkillLoader({\r\n paths: wpaths,\r\n bundledDir: config.features.skills ? resolveBundledSkillsDir() : undefined,\r\n });\r\n container.bind(TOKENS.SkillLoader, () => skillLoader);\r\n container.bind(\r\n TOKENS.SystemPromptBuilder,\r\n () =>\r\n new DefaultSystemPromptBuilder({\r\n memoryStore,\r\n skillLoader: config.features.skills ? skillLoader : undefined,\r\n }),\r\n );\r\n container.bind(TOKENS.Renderer, () => renderer);\r\n container.bind(TOKENS.InputReader, () => reader);\r\n container.bind(\r\n TOKENS.PermissionPolicy,\r\n () =>\r\n new DefaultPermissionPolicy({\r\n trustFile: wpaths.projectTrust,\r\n yolo: config.yolo,\r\n promptDelegate: makePromptDelegate(reader),\r\n }),\r\n );\r\n container.bind(\r\n TOKENS.Compactor,\r\n () =>\r\n new HybridCompactor({\r\n preserveK: config.context.preserveK,\r\n eliseThreshold: config.context.eliseThreshold,\r\n }),\r\n );\r\n\r\n // Provider registry — populated dynamically from models.dev catalog\r\n // when enabled. With features.modelsRegistry=false we don't touch the\r\n // network at boot and rely on the user's config to declare the wire\r\n // family explicitly (see makeProviderFromConfig path below).\r\n const providerRegistry = new ProviderRegistry();\r\n if (config.features.modelsRegistry) {\r\n try {\r\n const factories = await buildProviderFactoriesFromRegistry({\r\n registry: modelsRegistry,\r\n log: logger,\r\n });\r\n for (const f of factories) providerRegistry.register(f);\r\n } catch (err) {\r\n process.stderr.write(\r\n `Failed to load models.dev registry: ${err instanceof Error ? err.message : err}\\n` +\r\n `Try \\`wstack models refresh\\` once you have network access, or run with --no-features.\\n`,\r\n );\r\n await reader.close();\r\n return 2;\r\n }\r\n }\r\n\r\n // Tool registry\r\n const toolRegistry = new ToolRegistry();\r\n for (const t of builtinTools) toolRegistry.register(t);\r\n toolRegistry.registerDefault(\r\n createContextManagerTool({ compactor: container.resolve(TOKENS.Compactor) }),\r\n );\r\n if (config.features.memory) {\r\n toolRegistry.register(rememberTool(memoryStore));\r\n toolRegistry.register(forgetTool(memoryStore));\r\n }\r\n\r\n const events = new EventBus();\r\n events.setLogger(logger);\r\n\r\n // Observability — opt-in via --metrics. Writes a snapshot to\r\n // <session-dir>/metrics.json on shutdown so users get a post-run summary\r\n // without standing up a scrape endpoint. The sink is also exposed via the\r\n // /metrics slash command for live inspection mid-session.\r\n let metricsSink: MetricsSink | undefined;\r\n let healthRegistry: HealthRegistry | undefined;\r\n let metricsServerHandle: MetricsServerHandle | undefined;\r\n // --metrics-port implies --metrics (you can't scrape what isn't recorded).\r\n const metricsPortFlag = flags['metrics-port'];\r\n const metricsPort =\r\n typeof metricsPortFlag === 'string' && metricsPortFlag.length > 0\r\n ? Number.parseInt(metricsPortFlag, 10)\r\n : undefined;\r\n if (metricsPort !== undefined && !flags.metrics) flags.metrics = true;\r\n if (flags.metrics) {\r\n metricsSink = new InMemoryMetricsSink();\r\n wireMetricsToEvents(events, metricsSink);\r\n healthRegistry = new DefaultHealthRegistry();\r\n healthRegistry.register({\r\n name: 'session-store',\r\n check: async () => {\r\n try {\r\n await fs.access(wpaths.projectSessions);\r\n return { status: 'healthy' };\r\n } catch (e) {\r\n return { status: 'unhealthy', detail: e instanceof Error ? e.message : 'access denied' };\r\n }\r\n },\r\n });\r\n healthRegistry.register({\r\n name: 'provider',\r\n check: async () => ({\r\n status: 'healthy',\r\n data: { id: config.provider, model: config.model },\r\n }),\r\n });\r\n\r\n const dumpMetrics = () => {\r\n if (!metricsSink) return;\r\n try {\r\n const out = path.join(wpaths.projectSessions, 'metrics.json');\r\n const snap = metricsSink.snapshot();\r\n // Sync write — async fs APIs can't survive process.exit().\r\n writeFileSync(out, JSON.stringify(snap, null, 2));\r\n } catch {\r\n // Snapshot is best-effort — never block shutdown on it.\r\n }\r\n };\r\n process.on('exit', dumpMetrics);\r\n process.on('SIGINT', () => { dumpMetrics(); process.exit(130); });\r\n\r\n // L3-C: optional Prometheus scrape endpoint. Bound to 127.0.0.1 by\r\n // default — operators who want network-visible metrics set\r\n // METRICS_HOST=0.0.0.0 explicitly. Failure to bind is logged but does\r\n // not fail the run; the in-process sink keeps recording.\r\n if (metricsPort !== undefined && Number.isFinite(metricsPort)) {\r\n try {\r\n metricsServerHandle = await startMetricsServer({\r\n port: metricsPort,\r\n host: process.env.METRICS_HOST ?? '127.0.0.1',\r\n sink: metricsSink,\r\n // V2-C: mount /healthz on the same listener so k8s probes can\r\n // hit one endpoint per pod for both observability and liveness.\r\n healthRegistry,\r\n });\r\n logger.info(`metrics endpoint listening on ${metricsServerHandle.url} (healthz on same port)`);\r\n process.on('exit', () => { void metricsServerHandle?.close().catch(() => {}); });\r\n } catch (err) {\r\n logger.warn(`metrics endpoint failed to start: ${err instanceof Error ? err.message : String(err)}`);\r\n }\r\n }\r\n }\r\n\r\n // Spinner: visible \"thinking…\" line during each model request.\r\n const spinner = new Spinner();\r\n // Track the latest provider request's input-token count so the spinner\r\n // can render a live context-window fullness bar (TUI parity).\r\n let lastInputTokens = 0;\r\n events.on('provider.response', (e) => {\r\n lastInputTokens = e.usage?.input ?? 0;\r\n updateSpinnerContext();\r\n });\r\n events.on('iteration.started', () => {\r\n updateSpinnerContext();\r\n spinner.start(color.dim(`${config.provider}/${config.model} thinking…`));\r\n });\r\n events.on('provider.response', () => {\r\n spinner.stop();\r\n });\r\n events.on('error', () => {\r\n spinner.stop();\r\n });\r\n\r\n // Live streaming output: first text_delta stops the spinner and starts\r\n // writing tokens directly so the user sees the model \"type\".\r\n let streamingActive = false;\r\n events.on('provider.text_delta', (p) => {\r\n if (!streamingActive) {\r\n spinner.stop();\r\n streamingActive = true;\r\n }\r\n renderer.write(p.text);\r\n });\r\n events.on('iteration.completed', () => {\r\n if (streamingActive) {\r\n renderer.write('\\n');\r\n streamingActive = false;\r\n }\r\n });\r\n\r\n // Provider hiccups — render a single friendly line instead of leaving the\r\n // raw JSON body in logger output. retry events show a countdown; error\r\n // events surface a final failure that won't be retried.\r\n events.on('provider.retry', (p) => {\r\n spinner.stop();\r\n if (streamingActive) {\r\n renderer.write('\\n');\r\n streamingActive = false;\r\n }\r\n const secs = (p.delayMs / 1000).toFixed(p.delayMs >= 1000 ? 1 : 2);\r\n process.stderr.write(color.yellow(` ⟳ retry ${p.attempt} in ${secs}s — ${p.description}\\n`));\r\n spinner.start(color.dim(`${config.provider}/${config.model} thinking…`));\r\n });\r\n events.on('provider.error', (p) => {\r\n spinner.stop();\r\n if (streamingActive) {\r\n renderer.write('\\n');\r\n streamingActive = false;\r\n }\r\n process.stderr.write(color.red(` ✗ ${p.description}\\n`));\r\n });\r\n\r\n // Provider instance — registry-driven by default, but falls through to\r\n // config-only construction when the catalog is unavailable (or the\r\n // user explicitly disabled it).\r\n const providerConfig = config.providers?.[config.provider] ?? {\r\n type: config.provider,\r\n apiKey: config.apiKey,\r\n baseUrl: config.baseUrl,\r\n };\r\n let provider: ReturnType<ProviderRegistry['create']>;\r\n try {\r\n const cfgWithType = { ...providerConfig, type: config.provider };\r\n if (config.features.modelsRegistry && providerRegistry.has(config.provider)) {\r\n // Catalog-backed type: registry knows it, so use the factory. Config\r\n // overrides (family, baseUrl, envVars) still apply inside `makeProvider`.\r\n provider = providerRegistry.create(cfgWithType);\r\n } else {\r\n // Custom provider (not in catalog), or modelsRegistry feature\r\n // disabled. Requires `family` to be set in the saved config.\r\n provider = makeProviderFromConfig(config.provider, cfgWithType);\r\n }\r\n } catch (err) {\r\n process.stderr.write(\r\n `Failed to create provider: ${err instanceof Error ? err.message : err}\\n`,\r\n );\r\n await reader.close();\r\n return 2;\r\n }\r\n\r\n // Build system prompt\r\n const promptBuilder = container.resolve(TOKENS.SystemPromptBuilder) as SystemPromptBuilder;\r\n const systemPrompt = await promptBuilder.build({\r\n cwd,\r\n projectRoot,\r\n tools: toolRegistry.list(),\r\n provider: config.provider,\r\n model: config.model,\r\n });\r\n\r\n // Session — fresh by default, or resumed from disk if --resume <id> was passed.\r\n const sessionStore = container.resolve(TOKENS.SessionStore);\r\n let resumeId = typeof flags['resume'] === 'string' ? flags['resume'] : undefined;\r\n\r\n // Crash recovery: if the last interactive run was killed mid-flight,\r\n // its `active.json` lockfile is still on disk and the session has no\r\n // `session_end` event. Offer to resume it before opening a fresh one.\r\n // Skipped when the user explicitly chose `--resume <id>` or asked to\r\n // bypass with `--no-recovery`.\r\n const recoveryLock = new RecoveryLock({\r\n dir: wpaths.projectSessions,\r\n sessionStore,\r\n });\r\n if (!resumeId && !flags['no-recovery']) {\r\n const abandoned = await recoveryLock.checkAbandoned();\r\n if (abandoned && abandoned.messageCount > 0) {\r\n const choice = await promptRecovery(reader, renderer, abandoned, !!flags['recover']);\r\n if (choice === 'resume') {\r\n resumeId = abandoned.sessionId;\r\n } else if (choice === 'delete') {\r\n await sessionStore.delete(abandoned.sessionId).catch(() => undefined);\r\n await recoveryLock.clear();\r\n } else {\r\n // 'skip' — leave the file on disk, just clear the lock so we\r\n // don't ask again every launch.\r\n await recoveryLock.clear();\r\n }\r\n } else if (abandoned) {\r\n // Empty session (no real work done) — silently discard.\r\n await sessionStore.delete(abandoned.sessionId).catch(() => undefined);\r\n await recoveryLock.clear();\r\n }\r\n }\r\n\r\n let session;\r\n let restoredMessages: import('@wrongstack/core').Message[] = [];\r\n if (resumeId) {\r\n try {\r\n const resumed = await sessionStore.resume(resumeId);\r\n session = resumed.writer;\r\n restoredMessages = resumed.data.messages;\r\n renderer.writeInfo(\r\n `Resumed session ${resumed.data.metadata.id} — ${restoredMessages.length} messages, ${resumed.data.usage.input + resumed.data.usage.output} tokens used previously.`,\r\n );\r\n } catch (err) {\r\n renderer.writeError(`Resume failed: ${err instanceof Error ? err.message : String(err)}`);\r\n return 2;\r\n }\r\n } else {\r\n session = await sessionStore.create({\r\n id: '',\r\n title: '',\r\n model: config.model,\r\n provider: config.provider,\r\n });\r\n }\r\n\r\n // Claim the lock for this session. Released in the finally block below.\r\n await recoveryLock.write(session.id).catch(() => undefined);\r\n\r\n // Attachment store: per-session, spooled under sessions/<id>/attachments/.\r\n const attachments = new DefaultAttachmentStore({\r\n spoolDir: path.join(wpaths.projectSessions, session.id, 'attachments'),\r\n });\r\n\r\n // Queue persistence (TUI only — the REPL has no concurrent input).\r\n // Lives next to attachments so deleting the session dir cleans both.\r\n const queueStore = new QueueStore({\r\n dir: path.join(wpaths.projectSessions, session.id),\r\n });\r\n\r\n const tokenCounter = container.resolve(TOKENS.TokenCounter);\r\n\r\n // Session stats tracker — subscribes to events; rendered at the end.\r\n const stats = new SessionStats(events, tokenCounter);\r\n\r\n // Last-N error ring buffer surfaced by /diag. Captures whatever `error`\r\n // events the agent emits during a run (provider failures, retries, etc).\r\n const errorRing: { ts: string; phase: string; code: string; message: string }[] = [];\r\n events.on('error', (e) => {\r\n const err = e.err as unknown;\r\n const code =\r\n err && typeof err === 'object' && 'code' in err && typeof (err as { code: unknown }).code === 'string'\r\n ? (err as { code: string }).code\r\n : 'UNKNOWN';\r\n const message = e.err instanceof Error ? e.err.message : String(e.err);\r\n errorRing.push({ ts: new Date().toISOString(), phase: e.phase, code, message });\r\n if (errorRing.length > 5) errorRing.shift();\r\n });\r\n\r\n const ctxSignal = new AbortController().signal;\r\n const context = new Context({\r\n systemPrompt,\r\n provider,\r\n session,\r\n signal: ctxSignal,\r\n tokenCounter,\r\n cwd,\r\n projectRoot,\r\n model: config.model,\r\n });\r\n // Hydrate the transcript when resuming so the model sees the prior\r\n // conversation. Order is preserved from the JSONL log.\r\n if (restoredMessages.length > 0) {\r\n context.messages.push(...restoredMessages);\r\n }\r\n\r\n const pipelines = createDefaultPipelines();\r\n\r\n // L1-F error boundary: a crashing plugin-owned middleware shouldn't kill\r\n // the agent run. Core-owned middleware still rethrows so genuine bugs in\r\n // the framework surface loudly. Plugin owners are identified by the\r\n // `owner` field set by the slash-command/middleware registration helper.\r\n const installBoundary = <T,>(p: { setErrorHandler: (h: (ev: { middleware: string; owner?: string; err: unknown }) => 'rethrow' | 'swallow') => unknown }) => {\r\n p.setErrorHandler((ev) => {\r\n const fromPlugin = !!ev.owner && ev.owner !== 'core';\r\n logger.error(\r\n `Pipeline middleware \"${ev.middleware}\" crashed (owner=${ev.owner ?? 'unknown'}); ${fromPlugin ? 'swallowed' : 'rethrown'}`,\r\n ev.err,\r\n );\r\n events.emit('error', {\r\n err: ev.err instanceof Error ? ev.err : new Error(String(ev.err)),\r\n phase: `pipeline:${ev.middleware}`,\r\n });\r\n return fromPlugin ? 'swallow' : 'rethrow';\r\n });\r\n };\r\n installBoundary(pipelines.request);\r\n installBoundary(pipelines.response);\r\n installBoundary(pipelines.toolCall);\r\n installBoundary(pipelines.userInput);\r\n installBoundary(pipelines.assistantOutput);\r\n installBoundary(pipelines.contextWindow);\r\n\r\n // Resolve compactor — bound earlier (strategy-aware binding moved before provider creation)\r\n const compactor = container.resolve(TOKENS.Compactor);\r\n\r\n // Auto-compaction: monitor token load and compact when thresholds are crossed.\r\n // Skipped when config.context.autoCompact is false.\r\n //\r\n // Resolve the *model-specific* maxContext via the registry — the\r\n // provider object only knows its family default (e.g. anthropic =\r\n // 200k), which is wrong for variants like Claude Opus 4.7 with the\r\n // 1M-context beta. Falls back to the provider baseline when the\r\n // registry can't resolve the model.\r\n const resolvedCaps = await capabilitiesFor(modelsRegistry, config.provider, context.model).catch(\r\n () => undefined,\r\n );\r\n const effectiveMaxContext =\r\n config.context.effectiveMaxContext ??\r\n resolvedCaps?.maxContext ??\r\n provider.capabilities.maxContext;\r\n\r\n // Helper: keep the spinner's context chip in sync with the latest\r\n // provider response and the resolved max-context ceiling.\r\n const updateSpinnerContext = () => {\r\n if (effectiveMaxContext > 0 && lastInputTokens > 0) {\r\n spinner.setContext({ used: lastInputTokens, max: effectiveMaxContext });\r\n } else {\r\n spinner.setContext(undefined);\r\n }\r\n };\r\n\r\n if (config.context.autoCompact !== false) {\r\n const autoCompactor = new AutoCompactionMiddleware(\r\n compactor,\r\n effectiveMaxContext,\r\n (ctx) => {\r\n const msgs = ctx.messages;\r\n let total = 0;\r\n for (const m of msgs) {\r\n if (typeof m.content === 'string') total += Math.ceil(m.content.length / 4);\r\n else if (Array.isArray(m.content)) {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\r\n else if (b.type === 'tool_use' || b.type === 'tool_result') {\r\n total += Math.ceil(JSON.stringify(b).length / 4);\r\n }\r\n }\r\n }\r\n }\r\n return total;\r\n },\r\n {\r\n warn: config.context.warnThreshold,\r\n soft: config.context.softThreshold,\r\n hard: config.context.hardThreshold,\r\n },\r\n 'soft',\r\n );\r\n pipelines.contextWindow.use({\r\n name: 'AutoCompaction',\r\n handler: autoCompactor.handler(),\r\n });\r\n }\r\n\r\n const agent = new Agent({\r\n container,\r\n tools: toolRegistry,\r\n providers: providerRegistry,\r\n events,\r\n pipelines,\r\n context,\r\n maxIterations: config.tools.maxIterations,\r\n iterationTimeoutMs: config.tools.iterationTimeoutMs,\r\n executionStrategy: config.tools.defaultExecutionStrategy,\r\n perIterationOutputCapBytes: config.tools.perIterationOutputCapBytes,\r\n confirmAwaiter: makeConfirmAwaiter(reader),\r\n });\r\n\r\n // MCP servers\r\n const mcpRegistry = new MCPRegistry({ toolRegistry, events, log: logger });\r\n if (config.features.mcp) {\r\n for (const cfg of Object.values(config.mcpServers ?? {})) {\r\n try {\r\n await mcpRegistry.start(cfg);\r\n } catch (err) {\r\n logger.warn(`MCP server \"${cfg.name}\" failed to start`, err);\r\n }\r\n }\r\n }\r\n\r\n // Slash registry — created before plugins so plugins can register commands.\r\n const slashRegistry = new SlashCommandRegistry();\r\n\r\n // Plugins\r\n if (config.features.plugins && config.plugins && config.plugins.length > 0) {\r\n const resolvedPlugins: Plugin[] = [];\r\n for (const p of config.plugins) {\r\n const spec = typeof p === 'string' ? p : p.name;\r\n try {\r\n const mod = (await import(spec)) as { default?: Plugin };\r\n if (mod.default) resolvedPlugins.push(mod.default);\r\n } catch (err) {\r\n logger.warn(`Plugin \"${spec}\" failed to load`, err);\r\n }\r\n }\r\n if (resolvedPlugins.length > 0) {\r\n const { default: createApi } = await import('./plugin-api-factory.js');\r\n await loadPlugins(resolvedPlugins, {\r\n log: logger,\r\n // Each plugin's `configSchema` is validated against the matching\r\n // `Config.extensions[name]` subtree before its `setup()` runs.\r\n // The plugin then reads the same data through `api.config.extensions`\r\n // (or, once L1-B lands, via `ConfigStore.getExtension(name)`).\r\n pluginOptions: config.extensions ?? {},\r\n apiFactory: (plugin) =>\r\n createApi(plugin.name, {\r\n container,\r\n events,\r\n pipelines: pipelines as unknown as Parameters<typeof createApi>[1]['pipelines'],\r\n toolRegistry,\r\n providerRegistry,\r\n slashCommandRegistry: slashRegistry,\r\n mcpRegistry,\r\n config,\r\n log: logger,\r\n }),\r\n });\r\n }\r\n }\r\n\r\n // Build the list of providers the user can actually switch to right\r\n // now: only those whose config has a key (env var or stored\r\n // `apiKey/apiKeys`). We inline the catalog's model list for each one\r\n // so the picker can show a real selection in step 2 — falling back\r\n // to `cfg.models` for custom/LM-Studio-style providers and to the\r\n // catalog list (by `cfg.type` for aliases) otherwise.\r\n const buildPickableProviders = async () => {\r\n const overlay = config.providers ?? {};\r\n let catalog: Awaited<ReturnType<typeof modelsRegistry.listProviders>> = [];\r\n try {\r\n catalog = await modelsRegistry.listProviders();\r\n } catch {\r\n // catalog unavailable — keyed-by-config-only path still works\r\n }\r\n const catalogById = new Map(catalog.map((p) => [p.id, p]));\r\n const hasKey = (id: string): boolean => {\r\n const entry = overlay[id];\r\n const envHit = catalogById.get(id)?.envVars.some((v) => !!process.env[v]);\r\n if (envHit) return true;\r\n if (!entry) return false;\r\n if (typeof entry.apiKey === 'string' && entry.apiKey.length > 0) return true;\r\n if (Array.isArray(entry.apiKeys) && entry.apiKeys.some((k) => k?.apiKey)) return true;\r\n return false;\r\n };\r\n const seen = new Set<string>();\r\n const out: Array<{ id: string; family: string; models: string[] }> = [];\r\n for (const [id, cfg] of Object.entries(overlay)) {\r\n if (!hasKey(id)) continue;\r\n seen.add(id);\r\n const catalogType = cfg.type && cfg.type !== id ? cfg.type : id;\r\n const inherited = catalogById.get(catalogType);\r\n const family = cfg.family ?? inherited?.family ?? 'unsupported';\r\n if (family === 'unsupported') continue;\r\n const models =\r\n cfg.models && cfg.models.length > 0\r\n ? [...cfg.models]\r\n : (inherited?.models ?? []).map((m) => m.id);\r\n out.push({ id, family, models });\r\n }\r\n for (const p of catalog) {\r\n if (seen.has(p.id)) continue;\r\n if (p.family === 'unsupported') continue;\r\n if (!hasKey(p.id)) continue;\r\n out.push({ id: p.id, family: p.family, models: p.models.map((m) => m.id) });\r\n }\r\n return out;\r\n };\r\n\r\n // Build provider+model switch as a single callback. The TUI picker\r\n // calls this after the user confirms a (provider, model) pair; we\r\n // construct a fresh Provider instance, swap it onto the live context,\r\n // and rebuild the frozen config so other consumers see the new ids.\r\n const switchProviderAndModel = (providerId: string, modelId: string): string | null => {\r\n try {\r\n const newCfg = config.providers?.[providerId] ?? {\r\n type: providerId,\r\n apiKey: config.apiKey,\r\n baseUrl: config.baseUrl,\r\n };\r\n const cfgWithType = { ...newCfg, type: providerId };\r\n const newProvider =\r\n config.features.modelsRegistry && providerRegistry.has(providerId)\r\n ? providerRegistry.create(cfgWithType)\r\n : makeProviderFromConfig(providerId, cfgWithType);\r\n context.provider = newProvider;\r\n context.model = modelId;\r\n config = patchConfig(config, { provider: providerId, model: modelId });\r\n // L1-B: propagate the change to the ConfigStore so any subsystem\r\n // that subscribed via .watch() re-renders. Crucially, /diag now\r\n // reads the live provider via the store.\r\n configStore.update({ provider: providerId, model: modelId });\r\n return null;\r\n } catch (err) {\r\n return err instanceof Error ? err.message : String(err);\r\n }\r\n };\r\n\r\n // L1-E: lazily-instantiated multi-agent host. Wired into /spawn and\r\n // /agents slash commands; constructed on first invocation so users\r\n // who never spawn subagents pay nothing.\r\n const multiAgentHost = new MultiAgentHost({\r\n container,\r\n toolRegistry,\r\n providerRegistry,\r\n configStore,\r\n events,\r\n systemPromptBuilder: promptBuilder,\r\n session,\r\n tokenCounter,\r\n projectRoot,\r\n cwd,\r\n });\r\n\r\n const slashCmds = buildBuiltinSlashCommands({\r\n registry: slashRegistry,\r\n toolRegistry,\r\n compactor: container.resolve(TOKENS.Compactor),\r\n sessionStore,\r\n skillLoader,\r\n tokenCounter,\r\n renderer,\r\n memoryStore,\r\n context,\r\n metricsSink,\r\n healthRegistry,\r\n onSpawn: async (description) => {\r\n const { subagentId, taskId } = await multiAgentHost.spawn(description);\r\n return `Spawned subagent ${subagentId} for task ${taskId}. Use /agents to track progress.`;\r\n },\r\n onAgents: () => {\r\n const s = multiAgentHost.status();\r\n const lines = [s.summary];\r\n for (const p of s.pending) {\r\n lines.push(` pending ${p.taskId.slice(0, 8)} → ${p.description.slice(0, 60)}`);\r\n }\r\n for (const r of s.completed) {\r\n lines.push(\r\n ` ${r.status === 'success' ? color.green('✓') : color.red('✗')} ${r.taskId.slice(0, 8)} ${r.iterations}it ${r.toolCalls}tc ${r.durationMs}ms`,\r\n );\r\n }\r\n return lines.join('\\n');\r\n },\r\n onExit: () => {\r\n void mcpRegistry.stopAll();\r\n },\r\n onClear: () => {\r\n // In TUI mode Ink owns the live area; writing `\\x1b[2J` here would\r\n // fight Ink's cursor math and leave the status bar smeared. The\r\n // context/memory reset inside /clear is enough — the user can\r\n // scroll up to see prior turns in scrollback. In REPL we erase\r\n // the visible screen + scrollback (`\\x1b[3J`) so the next prompt\r\n // starts on a fresh terminal.\r\n if (flags.tui && !flags['no-tui']) return;\r\n try {\r\n process.stdout.write('\\x1b[2J\\x1b[3J\\x1b[H');\r\n } catch {\r\n // stdout may be closed during shutdown — ignore.\r\n }\r\n },\r\n onDiag: () => {\r\n const u = tokenCounter.total();\r\n const cost = tokenCounter.estimateCost();\r\n const errSection = errorRing.length === 0\r\n ? []\r\n : [\r\n '',\r\n `${color.bold('Recent errors')} (last ${errorRing.length}):`,\r\n ...errorRing.map((e) => ` [${e.ts}] ${e.phase} ${e.code} — ${e.message}`),\r\n ];\r\n // Read current provider from the ConfigStore so /diag always shows\r\n // the live value, even if /model swapped it mid-session (L1-B).\r\n const liveCfg = configStore.get();\r\n return [\r\n `${color.bold('WrongStack diag')}`,\r\n ` provider: ${liveCfg.provider} / ${context.model}`,\r\n ` projectRoot: ${projectRoot}`,\r\n ` tokens: in ${u.input} out ${u.output} cacheR ${u.cacheRead ?? 0}`,\r\n ` cost: $${cost.total.toFixed(4)}`,\r\n ` tools: ${toolRegistry.list().length}`,\r\n ` mcpServers: ${mcpRegistry.list().length}`,\r\n ...errSection,\r\n ].join('\\n');\r\n },\r\n onStats: () => stats.format(),\r\n });\r\n for (const cmd of slashCmds) slashRegistry.register(cmd);\r\n\r\n // Single-shot vs REPL\r\n let code = 0;\r\n try {\r\n // --prompt flag takes precedence: treat it like a positional query\r\n const promptFlag = typeof flags['prompt'] === 'string' ? flags['prompt'] : undefined;\r\n if (promptFlag) {\r\n positional.unshift(promptFlag);\r\n }\r\n if (positional.length > 0 || promptFlag) {\r\n const query = positional.join(' ');\r\n const ctrl = new AbortController();\r\n const onSigint = () => ctrl.abort();\r\n process.on('SIGINT', onSigint);\r\n const startedAt = Date.now();\r\n const before = tokenCounter.total();\r\n const costBefore = tokenCounter.estimateCost().total;\r\n let result: import('@wrongstack/core').RunResult;\r\n try {\r\n result = await agent.run(query, { signal: ctrl.signal });\r\n } finally {\r\n process.off('SIGINT', onSigint);\r\n }\r\n const after = tokenCounter.total();\r\n const costAfter = tokenCounter.estimateCost().total;\r\n const usage = {\r\n input: after.input - before.input,\r\n output: after.output - before.output,\r\n iterations: result.iterations,\r\n cost: costAfter - costBefore,\r\n elapsedMs: Date.now() - startedAt,\r\n };\r\n if (flags['output-json']) {\r\n const json = JSON.stringify({\r\n status: result.status,\r\n finalText: result.finalText ?? null,\r\n error: result.error\r\n ? {\r\n code: result.error.code,\r\n subsystem: result.error.subsystem,\r\n severity: result.error.severity,\r\n recoverable: result.error.recoverable,\r\n message: result.error.message,\r\n context: result.error.context ?? null,\r\n }\r\n : null,\r\n usage,\r\n });\r\n process.stdout.write(json + '\\n');\r\n } else {\r\n if (result.status === 'failed') {\r\n code = 1;\r\n const err = result.error;\r\n if (err) {\r\n const tag = err.recoverable ? ' (recoverable)' : '';\r\n renderer.writeError(`Failed [${err.severity}]${tag}: ${err.describe()}`);\r\n } else {\r\n renderer.writeError('Failed.');\r\n }\r\n } else if (result.status === 'aborted') {\r\n code = 130;\r\n renderer.writeWarning('Aborted.');\r\n } else if (result.status === 'max_iterations') {\r\n code = 1;\r\n renderer.writeWarning(`Hit max iterations (${result.iterations}).`);\r\n }\r\n if (result.finalText) renderer.write('\\n' + result.finalText + '\\n');\r\n renderer.write(\r\n '\\n' +\r\n color.dim(\r\n `[in: ${fmtTok(usage.input)} out: ${fmtTok(usage.output)} iters: ${usage.iterations} cost: ${usage.cost.toFixed(4)} ${(usage.elapsedMs / 1000).toFixed(1)}s]`,\r\n ) +\r\n '\\n',\r\n );\r\n }\r\n } else if (flags.tui && !flags['no-tui']) {\r\n // Lazy-load to avoid pulling React/Ink into the cold path for non-TUI usage.\r\n const { runTui } = await import('@wrongstack/tui');\r\n // Silence stdout writes from the renderer while Ink owns the\r\n // terminal. The tool executor calls renderer.writeToolCall /\r\n // writeToolResult on every tool execution; if those raw writes\r\n // land in stdout alongside Ink's redraws, the cursor math\r\n // breaks and the input + status bar end up duplicated in\r\n // scrollback (and in alt-screen, smeared across the buffer).\r\n // The TUI shows tool calls via the `tool.executed` event in\r\n // its own <History> component, so the renderer has nothing\r\n // useful to add here anyway.\r\n renderer.setSilent(true);\r\n // Resolve banner-only metadata: family (effective wire family the\r\n // provider is configured to speak) + the last 3 chars of the active\r\n // API key. Source order matches what `makeProvider` actually uses\r\n // at runtime, so the visible tail matches the key the agent will\r\n // send. Env-sourced keys are included so users using e.g.\r\n // ANTHROPIC_API_KEY without storing a config key still see a tail.\r\n const banneredFamily = savedProviderCfg?.family ?? resolvedProvider?.family;\r\n const banneredKey =\r\n savedProviderCfg?.apiKey ??\r\n config.apiKey ??\r\n (resolvedProvider?.envVars ?? savedProviderCfg?.envVars ?? [])\r\n .map((v) => process.env[v])\r\n .find((v): v is string => !!v);\r\n const banneredKeyTail =\r\n banneredKey && banneredKey.length >= 3 ? banneredKey.slice(-3) : undefined;\r\n try {\r\n code = await runTui({\r\n agent,\r\n events,\r\n slashRegistry,\r\n attachments,\r\n tokenCounter,\r\n model: context.model,\r\n banner: !flags['no-banner'],\r\n queueStore,\r\n yolo: !!config.yolo,\r\n appVersion: CLI_VERSION,\r\n provider: config.provider,\r\n family: banneredFamily,\r\n keyTail: banneredKeyTail,\r\n getPickableProviders: buildPickableProviders,\r\n switchProviderAndModel,\r\n effectiveMaxContext,\r\n // Opt-in: alt-screen disables the terminal's native scrollback,\r\n // so we default to false. `--no-alt-screen` is kept as a no-op\r\n // for backward compatibility with old invocation scripts.\r\n altScreen: flags['alt-screen'] === true,\r\n // Alt-screen exit erases the TUI view. Print a one-line hint\r\n // into the user's normal terminal so they know the session is\r\n // preserved and can resume it. Skipped automatically when\r\n // alt-screen is off — runTui only fires onAfterExit then.\r\n onAfterExit: () => {\r\n process.stdout.write(\r\n color.dim(`Session saved: ${session.id} — resume with `) +\r\n color.cyan(`wstack resume ${session.id}`) +\r\n '\\n',\r\n );\r\n },\r\n });\r\n } finally {\r\n renderer.setSilent(false);\r\n }\r\n } else {\r\n code = await runRepl({\r\n agent,\r\n renderer,\r\n reader,\r\n slashRegistry,\r\n tokenCounter,\r\n attachments,\r\n effectiveMaxContext,\r\n });\r\n }\r\n } finally {\r\n stats.render(renderer);\r\n await mcpRegistry.stopAll();\r\n await session.append({\r\n type: 'session_end',\r\n ts: new Date().toISOString(),\r\n usage: tokenCounter.total(),\r\n });\r\n await session.close();\r\n await recoveryLock.clear().catch(() => undefined);\r\n await reader.close();\r\n }\r\n return code;\r\n}\r\n\r\n/**\r\n * Prompt the user about an abandoned session. The lockfile lifecycle\r\n * guarantees we only get here when the previous instance died without\r\n * writing `session_end` AND there's real work on disk (≥1 message).\r\n *\r\n * `--recover` short-circuits to \"resume\" without asking; piped/non-TTY\r\n * input degrades to the same — the alternative is hanging on stdin or\r\n * forcing the user to remember a flag they never typed.\r\n */\r\nasync function promptRecovery(\r\n reader: ReadlineInputReader,\r\n renderer: TerminalRenderer,\r\n abandoned: import('@wrongstack/core').AbandonedSession,\r\n autoRecover: boolean,\r\n): Promise<'resume' | 'delete' | 'skip'> {\r\n const minutes = Math.round(abandoned.ageMs / 60_000);\r\n const ageLabel =\r\n minutes < 1\r\n ? `${Math.round(abandoned.ageMs / 1000)}s ago`\r\n : minutes < 60\r\n ? `${minutes} min ago`\r\n : `${Math.round(minutes / 60)}h ago`;\r\n const summary = `Previous session was killed mid-run: ${abandoned.sessionId} (${abandoned.messageCount} messages, ${ageLabel}).`;\r\n if (autoRecover) {\r\n renderer.writeInfo(`${summary} Auto-resuming (--recover).`);\r\n return 'resume';\r\n }\r\n if (!process.stdin.isTTY) {\r\n renderer.writeInfo(\r\n `${summary} Non-interactive — leaving as-is. Use \\`wstack resume ${abandoned.sessionId}\\` or pass \\`--recover\\` to auto-resume.`,\r\n );\r\n return 'skip';\r\n }\r\n renderer.writeInfo(summary);\r\n const answer = await reader.readKey(\r\n `${color.amber('?')} Recover it? ${color.dim('[')}${color.bold('Y')}es / ${color.bold('n')}o / ${color.bold('d')}elete${color.dim(']')} `,\r\n [\r\n { key: 'y', label: 'yes', value: 'resume' },\r\n { key: 'Y', label: 'yes', value: 'resume' },\r\n { key: '\\r', label: 'yes', value: 'resume' },\r\n { key: '\\n', label: 'yes', value: 'resume' },\r\n { key: 'n', label: 'no', value: 'skip' },\r\n { key: 'N', label: 'no', value: 'skip' },\r\n { key: 'd', label: 'delete', value: 'delete' },\r\n { key: 'D', label: 'delete', value: 'delete' },\r\n ],\r\n );\r\n return answer as 'resume' | 'delete' | 'skip';\r\n}\r\n\r\n\r\n\r\nconst isMain =\r\n import.meta.url === `file://${process.argv[1]?.replace(/\\\\/g, '/')}` ||\r\n process.argv[1]?.endsWith('/cli/dist/index.js') ||\r\n process.argv[1]?.endsWith('\\\\cli\\\\dist\\\\index.js');\r\nif (isMain) {\r\n main(process.argv.slice(2)).then(\r\n (c) => {\r\n // Set exitCode and let Node drain async handles (undici TLS, log file\r\n // flushes) naturally. Force-exit after a brief grace period so we don't\r\n // hang if a plugin or MCP server leaks. Avoids libuv UV_HANDLE_CLOSING\r\n // assertions seen on Windows when process.exit() races with handle teardown.\r\n process.exitCode = c;\r\n setTimeout(() => process.exit(c), 200).unref();\r\n },\r\n (err) => {\r\n process.stderr.write((err instanceof Error ? err.stack : String(err)) + '\\n');\r\n process.exitCode = 1;\r\n setTimeout(() => process.exit(1), 200).unref();\r\n },\r\n );\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/plugin-api-factory.ts","../src/webui-server.ts","../src/input-reader.ts","../src/diff-renderer.ts","../src/theme.ts","../src/permission-prompt.ts","../src/picker.ts","../src/slash-commands/index.ts","../src/pre-launch.ts","../src/renderer.ts","../src/version.ts","../src/utils.ts","../src/repl.ts","../src/session-stats.ts","../src/spinner.ts","../src/boot-config.ts","../src/multi-agent.ts","../src/auth-menu.ts","../src/subcommands/index.ts","../src/index.ts"],"names":["resolve","normalizeKeys","maskedKey","nowIso","writeKeysBack","fs7","atomicWrite","path","os","fs","color","theme","path2","fs2","msg","fs3","path3","answer","FILLED","EMPTY","renderContextChip","renderProgress","path4","os2","fs4","baseUrl","fs5","req","createRequire","path6","sessionStore","skillLoader","code","TOKENS","EventBus","fs8","makeProviderFromConfig","Context","createDefaultPipelines","Agent","createApi","runWebUI"],"mappings":"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","file":"index.js","sourcesContent":["import {\n DefaultPluginAPI,\n type PluginAPIInit,\n type PluginAPI,\n} from '@wrongstack/core';\n\nexport default function createApi(ownerName: string, base: Omit<PluginAPIInit, 'ownerName'>): PluginAPI {\n return new DefaultPluginAPI({ ownerName, ...base });\n}\n","import type {\n Agent,\n EventBus,\n SessionWriter,\n ModelsRegistry,\n} from '@wrongstack/core';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport * as fs from 'node:fs/promises';\nimport {\n encryptConfigSecrets,\n decryptConfigSecrets,\n type ProviderConfig,\n type ProviderApiKey,\n atomicWrite,\n} from '@wrongstack/core';\n\n// Re-export types from webui for type checking\n// At runtime, the actual types are resolved via workspace resolution\n\n// WSServerMessage and WSClientMessage types (mirrors packages/webui/src/types.ts)\nexport interface WSServerMessage {\n type: string;\n payload: unknown;\n}\n\nexport interface WSClientMessage {\n type: string;\n payload?: unknown;\n}\n\ninterface WebUIOptions {\n agent: Agent;\n events: EventBus;\n session: SessionWriter;\n port?: number;\n modelsRegistry?: ModelsRegistry;\n globalConfigPath?: string;\n}\n\ninterface ConnectedClient {\n ws: WebSocket;\n sessionId: string | null;\n}\n\nexport async function runWebUI(opts: WebUIOptions): Promise<void> {\n const port = opts.port ?? 3457;\n const clients = new Map<WebSocket, ConnectedClient>();\n let abortController: AbortController | null = null;\n\n const wss = new WebSocketServer({ port });\n\n console.log(`[WebUI] WebSocket server starting on ws://localhost:${port}`);\n\n // Subscribe to events once\n const eventUnsubscribers: Array<() => void> = [];\n\n function setupEvents() {\n // Clear any existing subscriptions\n for (const unsub of eventUnsubscribers) unsub();\n eventUnsubscribers.length = 0;\n\n // iteration.started\n eventUnsubscribers.push(\n opts.events.on('iteration.started', (e) => {\n broadcast({\n type: 'iteration.started',\n payload: { index: e.index },\n });\n })\n );\n\n // provider.text_delta\n eventUnsubscribers.push(\n opts.events.on('provider.text_delta', (e) => {\n broadcast({\n type: 'provider.text_delta',\n payload: { text: e.text, messageId: 'current' },\n });\n })\n );\n\n // tool.started\n eventUnsubscribers.push(\n opts.events.on('tool.started', (e) => {\n broadcast({\n type: 'tool.started',\n payload: {\n id: e.id,\n name: e.name,\n input: e.input,\n messageId: `tool_${e.id}`,\n },\n });\n })\n );\n\n // tool.progress\n eventUnsubscribers.push(\n opts.events.on('tool.progress', (e) => {\n broadcast({\n type: 'tool.progress',\n payload: {\n name: e.name,\n id: e.id,\n event: e.event,\n },\n });\n })\n );\n\n // tool.executed\n eventUnsubscribers.push(\n opts.events.on('tool.executed', (e) => {\n broadcast({\n type: 'tool.executed',\n payload: {\n // Forward the tool_use id so the WebUI can correlate this with\n // the matching tool.started bubble for parallel tool calls.\n id: e.id,\n name: e.name,\n durationMs: e.durationMs,\n ok: e.ok,\n input: e.input,\n output: e.output,\n },\n });\n })\n );\n\n // provider.response\n eventUnsubscribers.push(\n opts.events.on('provider.response', (e) => {\n broadcast({\n type: 'provider.response',\n payload: {\n usage: e.usage,\n stopReason: e.stopReason,\n messageId: 'current',\n },\n });\n })\n );\n\n // error\n eventUnsubscribers.push(\n opts.events.on('error', (e) => {\n broadcast({\n type: 'error',\n payload: {\n phase: e.phase,\n message: e.err instanceof Error ? e.err.message : String(e.err),\n },\n });\n })\n );\n }\n\n return new Promise<void>((resolve) => {\n wss.on('listening', () => {\n console.log(`[WebUI] WebSocket server running on ws://localhost:${port}`);\n setupEvents();\n });\n\n wss.on('connection', (ws) => {\n const client: ConnectedClient = { ws, sessionId: opts.session.id };\n clients.set(ws, client);\n console.log('[WebUI] Client connected');\n\n ws.on('message', async (data) => {\n try {\n const msg = JSON.parse(data.toString()) as WSClientMessage;\n await handleMessage(ws, client, msg);\n } catch (err) {\n console.error('[WebUI] Failed to parse message', err);\n }\n });\n\n ws.on('close', () => {\n console.log('[WebUI] Client disconnected');\n clients.delete(ws);\n });\n\n // Send session.start to the new client\n send(ws, {\n type: 'session.start',\n payload: {\n sessionId: opts.session.id,\n model: opts.agent.ctx.model,\n provider: (opts.agent.ctx.provider as { id: string }).id,\n },\n });\n });\n\n wss.on('error', (err) => {\n console.error('[WebUI] Server error:', err);\n });\n\n // Graceful shutdown\n function shutdown() {\n console.log('[WebUI] Shutting down...');\n for (const unsub of eventUnsubscribers) unsub();\n for (const [ws] of clients) {\n ws.close();\n }\n clients.clear();\n wss.close(() => {\n console.log('[WebUI] Server stopped');\n resolve();\n });\n }\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n });\n\n async function handleMessage(\n ws: WebSocket,\n client: ConnectedClient,\n msg: WSClientMessage\n ): Promise<void> {\n switch (msg.type) {\n case 'user_message':\n await handleUserMessage(ws, client, (msg as { payload: { content: string } }).payload.content);\n break;\n\n case 'abort':\n abortController?.abort();\n broadcast({\n type: 'error',\n payload: { phase: 'abort', message: 'User aborted' },\n });\n break;\n\n case 'ping':\n send(ws, { type: 'pong', payload: {} });\n break;\n\n case 'providers.list':\n await handleProvidersList(ws);\n break;\n\n case 'provider.models':\n await handleProviderModels(ws, (msg as { payload: { providerId: string } }).payload.providerId);\n break;\n\n case 'providers.saved':\n await handleProvidersSaved(ws);\n break;\n\n case 'key.add':\n case 'key.update': {\n const m = msg as { payload: { providerId: string; label: string; apiKey: string } };\n await handleKeyUpsert(ws, m.payload.providerId, m.payload.label, m.payload.apiKey);\n break;\n }\n\n case 'key.delete': {\n const m = msg as { payload: { providerId: string; label: string } };\n await handleKeyDelete(ws, m.payload.providerId, m.payload.label);\n break;\n }\n\n case 'key.set_active': {\n const m = msg as { payload: { providerId: string; label: string } };\n await handleKeySetActive(ws, m.payload.providerId, m.payload.label);\n break;\n }\n\n case 'provider.add': {\n const m = msg as { payload: { id: string; family: string; baseUrl?: string; apiKey?: string } };\n await handleProviderAdd(ws, m.payload);\n break;\n }\n\n case 'provider.remove': {\n const m = msg as { payload: { providerId: string } };\n await handleProviderRemove(ws, m.payload.providerId);\n break;\n }\n }\n }\n\n async function handleUserMessage(\n ws: WebSocket,\n client: ConnectedClient,\n content: string\n ): Promise<void> {\n // Abort any existing run\n abortController?.abort();\n abortController = new AbortController();\n\n try {\n const result = await opts.agent.run(content, {\n signal: abortController.signal,\n });\n\n send(ws, {\n type: 'run.result',\n payload: {\n status: result.status,\n iterations: result.iterations,\n finalText: result.finalText,\n error: result.error\n ? {\n code: result.error.code,\n message: result.error.message,\n recoverable: result.error.recoverable,\n }\n : undefined,\n },\n });\n } catch (err) {\n send(ws, {\n type: 'error',\n payload: {\n phase: 'agent.run',\n message: err instanceof Error ? err.message : String(err),\n },\n });\n } finally {\n abortController = null;\n }\n }\n\n function send(ws: WebSocket, msg: WSServerMessage): void {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(msg));\n }\n }\n\n function broadcast(msg: WSServerMessage): void {\n const data = JSON.stringify(msg);\n for (const [ws] of clients) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(data);\n }\n }\n }\n\n // ---- Provider/Model/Key management handlers ----\n\n async function handleProvidersList(ws: WebSocket): Promise<void> {\n if (!opts.modelsRegistry) {\n sendResult(ws, false, 'Models registry not available');\n return;\n }\n try {\n const providers = await opts.modelsRegistry.listProviders();\n const savedProviders = await loadSavedProviders();\n const savedIds = new Set(Object.keys(savedProviders));\n\n send(ws, {\n type: 'provider.catalog',\n payload: {\n providers: providers.map((p) => ({\n id: p.id,\n name: p.name,\n family: p.family,\n apiBase: p.apiBase,\n envVars: p.envVars,\n modelCount: p.models.length,\n hasApiKey: savedIds.has(p.id) || p.envVars.some((v) => !!process.env[v]),\n })),\n },\n });\n } catch (err) {\n sendResult(ws, false, err instanceof Error ? err.message : String(err));\n }\n }\n\n async function handleProviderModels(ws: WebSocket, providerId: string): Promise<void> {\n if (!opts.modelsRegistry) {\n sendResult(ws, false, 'Models registry not available');\n return;\n }\n try {\n const provider = await opts.modelsRegistry.getProvider(providerId);\n if (!provider) {\n sendResult(ws, false, `Provider \"${providerId}\" not found in catalog`);\n return;\n }\n send(ws, {\n type: 'provider.models',\n payload: {\n provider: providerId,\n models: provider.models.map((m) => ({\n id: m.id,\n name: m.name,\n releaseDate: m.release_date,\n contextWindow: m.limit?.context,\n inputCost: m.cost?.input,\n outputCost: m.cost?.output,\n capabilities: [\n ...(m.tool_call ? ['tools'] : []),\n ...(m.reasoning ? ['reasoning'] : []),\n ...(m.modalities?.input?.includes('image') ? ['vision'] : []),\n ...(m.open_weights ? ['open_weights'] : []),\n ],\n })),\n },\n });\n } catch (err) {\n sendResult(ws, false, err instanceof Error ? err.message : String(err));\n }\n }\n\n async function handleProvidersSaved(ws: WebSocket): Promise<void> {\n try {\n const providers = await loadSavedProviders();\n send(ws, {\n type: 'providers.saved',\n payload: {\n providers: Object.entries(providers).map(([id, cfg]) => ({\n id,\n family: cfg.family,\n baseUrl: cfg.baseUrl,\n apiKeys: normalizeKeys(cfg).map((k) => ({\n label: k.label,\n maskedKey: maskedKey(k.apiKey),\n isActive: k.label === cfg.activeKey,\n createdAt: k.createdAt,\n })),\n })),\n },\n });\n } catch (err) {\n sendResult(ws, false, err instanceof Error ? err.message : String(err));\n }\n }\n\n async function handleKeyUpsert(ws: WebSocket, providerId: string, label: string, apiKey: string): Promise<void> {\n try {\n const providers = await loadSavedProviders();\n const existing = providers[providerId] ?? { type: providerId };\n const keys = normalizeKeys(existing);\n \n // Check if label exists\n const existingIdx = keys.findIndex((k) => k.label === label);\n if (existingIdx >= 0) {\n keys[existingIdx] = { ...keys[existingIdx]!, apiKey, createdAt: nowIso() };\n } else {\n keys.push({ label, apiKey, createdAt: nowIso() });\n }\n \n writeKeysBack(existing, keys);\n if (!existing.activeKey) existing.activeKey = label;\n providers[providerId] = existing;\n \n await saveProviders(providers);\n sendResult(ws, true, `Key \"${label}\" saved for ${providerId}`);\n } catch (err) {\n sendResult(ws, false, err instanceof Error ? err.message : String(err));\n }\n }\n\n async function handleKeyDelete(ws: WebSocket, providerId: string, label: string): Promise<void> {\n try {\n const providers = await loadSavedProviders();\n const existing = providers[providerId];\n if (!existing) {\n sendResult(ws, false, `Provider \"${providerId}\" not found`);\n return;\n }\n const keys = normalizeKeys(existing).filter((k) => k.label !== label);\n if (keys.length === 0) {\n delete providers[providerId];\n } else {\n writeKeysBack(existing, keys);\n if (existing.activeKey === label) {\n existing.activeKey = keys[0]!.label;\n }\n providers[providerId] = existing;\n }\n await saveProviders(providers);\n sendResult(ws, true, `Key \"${label}\" deleted from ${providerId}`);\n } catch (err) {\n sendResult(ws, false, err instanceof Error ? err.message : String(err));\n }\n }\n\n async function handleKeySetActive(ws: WebSocket, providerId: string, label: string): Promise<void> {\n try {\n const providers = await loadSavedProviders();\n const existing = providers[providerId];\n if (!existing) {\n sendResult(ws, false, `Provider \"${providerId}\" not found`);\n return;\n }\n existing.activeKey = label;\n writeKeysBack(existing, normalizeKeys(existing));\n providers[providerId] = existing;\n await saveProviders(providers);\n sendResult(ws, true, `Active key for ${providerId} set to \"${label}\"`);\n } catch (err) {\n sendResult(ws, false, err instanceof Error ? err.message : String(err));\n }\n }\n\n async function handleProviderAdd(ws: WebSocket, payload: { id: string; family: string; baseUrl?: string; apiKey?: string }): Promise<void> {\n try {\n const providers = await loadSavedProviders();\n if (providers[payload.id]) {\n sendResult(ws, false, `Provider \"${payload.id}\" already exists. Use key.add to add a key.`);\n return;\n }\n const newProv: ProviderConfig = {\n type: payload.id,\n family: payload.family as ProviderConfig['family'],\n baseUrl: payload.baseUrl,\n };\n if (payload.apiKey) {\n newProv.apiKeys = [{ label: 'default', apiKey: payload.apiKey, createdAt: nowIso() }];\n newProv.activeKey = 'default';\n }\n providers[payload.id] = newProv;\n await saveProviders(providers);\n sendResult(ws, true, `Provider \"${payload.id}\" added`);\n } catch (err) {\n sendResult(ws, false, err instanceof Error ? err.message : String(err));\n }\n }\n\n async function handleProviderRemove(ws: WebSocket, providerId: string): Promise<void> {\n try {\n const providers = await loadSavedProviders();\n if (!providers[providerId]) {\n sendResult(ws, false, `Provider \"${providerId}\" not found`);\n return;\n }\n delete providers[providerId];\n await saveProviders(providers);\n sendResult(ws, true, `Provider \"${providerId}\" removed`);\n } catch (err) {\n sendResult(ws, false, err instanceof Error ? err.message : String(err));\n }\n }\n\n // ---- Config I/O helpers (mirrors auth-menu.ts patterns) ----\n\n async function loadSavedProviders(): Promise<Record<string, ProviderConfig>> {\n if (!opts.globalConfigPath) return {};\n let raw: string;\n try {\n raw = await fs.readFile(opts.globalConfigPath, 'utf8');\n } catch {\n return {};\n }\n let parsed: { providers?: Record<string, ProviderConfig> } = {};\n try {\n parsed = JSON.parse(raw) as { providers?: Record<string, ProviderConfig> };\n } catch {\n return {};\n }\n // No vault decryption here — webui-server operates on pre-decrypted config\n return parsed.providers ?? {};\n }\n\n async function saveProviders(providers: Record<string, ProviderConfig>): Promise<void> {\n if (!opts.globalConfigPath) return;\n let raw: string;\n try {\n raw = await fs.readFile(opts.globalConfigPath, 'utf8');\n } catch {\n raw = '{}';\n }\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n parsed = {};\n }\n parsed.providers = providers;\n await atomicWrite(opts.globalConfigPath, JSON.stringify(parsed, null, 2), { mode: 0o600 });\n }\n\n function normalizeKeys(cfg: ProviderConfig): ProviderApiKey[] {\n if (Array.isArray(cfg.apiKeys) && cfg.apiKeys.length > 0) {\n return cfg.apiKeys.map((k) => ({ ...k }));\n }\n if (typeof cfg.apiKey === 'string' && cfg.apiKey.length > 0) {\n return [{ label: 'default', apiKey: cfg.apiKey, createdAt: '' }];\n }\n return [];\n }\n\n function writeKeysBack(cfg: ProviderConfig, keys: ProviderApiKey[]): void {\n if (keys.length === 0) {\n delete cfg.apiKeys;\n delete cfg.apiKey;\n delete cfg.activeKey;\n return;\n }\n cfg.apiKeys = keys;\n const active = keys.find((k) => k.label === cfg.activeKey) ?? keys[0]!;\n cfg.apiKey = active.apiKey;\n if (!cfg.activeKey || !keys.some((k) => k.label === cfg.activeKey)) {\n cfg.activeKey = active.label;\n }\n }\n\n function maskedKey(key: string): string {\n if (!key) return '—';\n if (key.length <= 8) return '•'.repeat(key.length);\n const head = key.slice(0, 4);\n const tail = key.slice(-4);\n return `${head}…${tail}`;\n }\n\n function nowIso(): string {\n return new Date().toISOString();\n }\n\n function sendResult(ws: WebSocket, success: boolean, message: string): void {\n send(ws, { type: 'key.operation_result', payload: { success, message } });\n }\n} // end of runWebUI\n","import * as readline from 'node:readline';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { InputReader, PromptOption } from '@wrongstack/core';\n\nexport interface ReadlineInputReaderOptions {\n historyFile?: string;\n prompt?: string;\n}\n\nexport class ReadlineInputReader implements InputReader {\n private rl?: readline.Interface;\n private readonly historyFile: string;\n private history: string[] = [];\n private pending = false;\n\n constructor(opts: ReadlineInputReaderOptions = {}) {\n this.historyFile = opts.historyFile ?? path.join(os.homedir(), '.wrongstack', 'history');\n }\n\n private async loadHistory(): Promise<void> {\n try {\n const raw = await fs.readFile(this.historyFile, 'utf8');\n this.history = raw.split('\\n').filter(Boolean).slice(-1000);\n } catch {\n this.history = [];\n }\n }\n\n private async saveHistory(): Promise<void> {\n try {\n await fs.mkdir(path.dirname(this.historyFile), { recursive: true });\n await fs.writeFile(this.historyFile, this.history.slice(-1000).join('\\n'));\n } catch {\n // ignore\n }\n }\n\n private ensure(): readline.Interface {\n if (!this.rl) {\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n history: this.history,\n terminal: process.stdin.isTTY,\n });\n }\n return this.rl;\n }\n\n async readLine(prompt?: string): Promise<string> {\n if (this.history.length === 0) await this.loadHistory();\n while (this.pending) {\n // Wait for the current read to settle before accepting another.\n await new Promise<void>((resolve) => setTimeout(resolve, 50));\n }\n this.pending = true;\n try {\n const rl = this.ensure();\n if ((rl as unknown as { _flushed?: boolean })._flushed) {\n rl.close();\n this.rl = undefined;\n }\n const fresh = this.ensure();\n return new Promise<string>((resolve, reject) => {\n fresh.question(prompt ?? '> ', (line) => {\n if (line.trim()) {\n this.history.push(line);\n void this.saveHistory();\n }\n resolve(line);\n });\n fresh.once('close', () => reject(new Error('EOF')));\n });\n } finally {\n this.pending = false;\n }\n }\n\n async readKey(prompt: string, options: PromptOption[]): Promise<string> {\n process.stdout.write(prompt);\n return new Promise<string>((resolve) => {\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n const wasPaused = stdin.isPaused();\n if (stdin.isTTY) stdin.setRawMode(true);\n stdin.resume();\n const onData = (buf: Buffer) => {\n const key = buf.toString();\n const opt = options.find(\n (o) => o.key.toLowerCase() === key.toLowerCase() || o.value === key,\n );\n if (opt) {\n cleanup();\n process.stdout.write(`${opt.key}\\n`);\n resolve(opt.value);\n }\n };\n const cleanup = () => {\n stdin.off('data', onData);\n if (stdin.isTTY) stdin.setRawMode(wasRaw);\n if (wasPaused) stdin.pause();\n };\n stdin.on('data', onData);\n });\n }\n\n /**\n * Read a line of input while masking each character with a bullet so the\n * user gets visual confirmation that bytes are arriving (especially on\n * paste, which previously felt like nothing happened). Pasted chunks\n * are echoed as a run of bullets, Backspace/DEL erases one bullet, and\n * Ctrl+U / Ctrl+W are honored. Non-TTY input is read normally — there's\n * nothing to hide when piped, and echoing bullets to a file is noise.\n *\n * Returns the raw entered string (no trim — caller decides).\n */\n async readSecret(prompt: string): Promise<string> {\n const stdin = process.stdin;\n if (!stdin.isTTY) return this.readLine(prompt);\n // Tear down the active readline so we can take over stdin.\n this.rl?.close();\n this.rl = undefined;\n process.stdout.write(prompt);\n return new Promise<string>((resolve) => {\n let buf = '';\n const wasRaw = stdin.isRaw;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n const eraseChar = () => {\n // Move cursor back, overwrite with space, move back again.\n process.stdout.write('\\b \\b');\n };\n const eraseAll = () => {\n for (let i = 0; i < buf.length; i++) eraseChar();\n };\n\n const onData = (chunk: string) => {\n // Process the whole chunk at once — paste arrives as one event.\n // We walk char-by-char so embedded control bytes (e.g. a stray\n // CR inside a paste) terminate input cleanly.\n for (const ch of chunk) {\n if (ch === '\\r' || ch === '\\n') {\n cleanup();\n process.stdout.write(` ${dim(`[${buf.length} chars]`)}\\n`);\n resolve(buf);\n return;\n }\n if (ch === '\u0003') {\n // Ctrl+C\n cleanup();\n process.stdout.write('\\n');\n process.exit(130);\n }\n if (ch === '\u0015') {\n // Ctrl+U — clear line\n eraseAll();\n buf = '';\n continue;\n }\n if (ch === '\u0017') {\n // Ctrl+W — erase last whitespace-delimited token\n const m = buf.match(/(\\S+\\s*)$/);\n const drop = m ? m[0].length : buf.length;\n for (let i = 0; i < drop; i++) eraseChar();\n buf = buf.slice(0, buf.length - drop);\n continue;\n }\n if (ch === '' || ch === '\\b') {\n if (buf.length > 0) {\n buf = buf.slice(0, -1);\n eraseChar();\n }\n continue;\n }\n // Skip other control bytes silently (escape sequences, etc.).\n if (ch < ' ') continue;\n buf += ch;\n process.stdout.write('•');\n }\n };\n const cleanup = () => {\n stdin.off('data', onData);\n stdin.setRawMode(wasRaw);\n stdin.pause();\n };\n stdin.on('data', onData);\n });\n }\n\n async close(): Promise<void> {\n await this.saveHistory();\n this.rl?.close();\n this.rl = undefined;\n }\n}\n\n// Local ANSI dim — kept inline so this module has no @wrongstack/core\n// dependency for its single visual flourish.\nfunction dim(s: string): string {\n if (!process.stdout.isTTY) return s;\n return `\u001b[2m${s}\u001b[22m`;\n}\n","import { color } from '@wrongstack/core';\n\nexport function renderDiff(diff: string): string {\n if (!diff) return '';\n const lines = diff.split('\\n');\n return lines\n .map((line) => {\n if (line.startsWith('+++') || line.startsWith('---')) return color.bold(line);\n if (line.startsWith('@@')) return color.cyan(line);\n if (line.startsWith('+')) return color.green(line);\n if (line.startsWith('-')) return color.red(line);\n return color.dim(line);\n })\n .join('\\n');\n}\n","import { color } from '@wrongstack/core';\n\nexport const theme = {\n primary: color.amber,\n accent: color.pink,\n muted: color.dim,\n success: color.green,\n warn: color.yellow,\n error: color.red,\n info: color.cyan,\n bold: color.bold,\n underline: color.underline,\n};\n","import type { Tool, InputReader, ConfirmAwaiter } from '@wrongstack/core';\r\nimport { color } from '@wrongstack/core';\r\nimport { renderDiff } from './diff-renderer.js';\r\nimport { theme } from './theme.js';\r\n\r\nexport type PromptDecision = 'yes' | 'no' | 'always' | 'deny';\r\n\r\nexport function makePromptDelegate(reader: InputReader) {\r\n return async (\r\n tool: Tool,\r\n input: unknown,\r\n suggestedPattern: string,\r\n ): Promise<PromptDecision> => {\r\n process.stdout.write(`\\n${theme.primary('▍')} ${theme.bold(tool.name)}\\n`);\r\n process.stdout.write(`${color.dim(stringifyInput(input))}\\n`);\r\n\r\n if (tool.name === 'edit' && hasDiff(input)) {\r\n const inp = input as { diff?: unknown };\r\n const diff = typeof inp.diff === 'string' ? inp.diff : '';\r\n if (diff) process.stdout.write(`${renderDiff(diff)}\\n`);\r\n }\r\n\r\n process.stdout.write(color.dim('─────────────────\\n'));\r\n const answer = await reader.readKey(\r\n `${theme.bold('[y]')}es ${theme.bold('[n]')}o ${theme.bold('[a]')}lways allow (${suggestedPattern}) ${theme.bold('[d]')}eny: `,\r\n [\r\n { key: 'y', label: 'yes', value: 'yes' },\r\n { key: 'n', label: 'no', value: 'no' },\r\n { key: 'a', label: 'always', value: 'always' },\r\n { key: 'd', label: 'deny', value: 'deny' },\r\n ],\r\n );\r\n return answer as PromptDecision;\r\n };\r\n}\r\n\r\n/**\r\n * Create a ConfirmAwaiter for the CLI path. Wraps makePromptDelegate\r\n * with the ConfirmAwaiter type signature expected by the Agent.\r\n */\r\nexport function makeConfirmAwaiter(reader: InputReader): ConfirmAwaiter {\r\n const delegate = makePromptDelegate(reader);\r\n return async (tool, input, _toolUseId, suggestedPattern) => {\r\n const result = await delegate(tool, input, suggestedPattern);\r\n return result as 'yes' | 'no' | 'always' | 'deny';\r\n };\r\n}\r\n\r\nfunction stringifyInput(input: unknown): string {\r\n if (!input || typeof input !== 'object') return '';\r\n const obj = input as Record<string, unknown>;\r\n return Object.entries(obj)\r\n .filter(([k]) => k !== 'content' && k !== 'new_string')\r\n .map(([k, v]) => `${k}: ${truncate(JSON.stringify(v), 80)}`)\r\n .join(' ');\r\n}\r\n\r\nfunction truncate(s: string, max: number): string {\r\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\r\n}\r\n\r\nfunction hasDiff(input: unknown): boolean {\r\n return Boolean(\r\n input && typeof input === 'object' && 'diff' in (input as Record<string, unknown>),\r\n );\r\n}\r\n","import type { Config, ModelsRegistry, ResolvedProvider } from '@wrongstack/core';\r\nimport { color } from '@wrongstack/core';\r\nimport type { TerminalRenderer } from './renderer.js';\r\nimport type { ReadlineInputReader } from './input-reader.js';\r\n\r\nexport interface PickerResult {\r\n provider: string;\r\n model: string;\r\n}\r\n\r\n/**\r\n * Does this provider have an API key available — either in the\r\n * environment (via one of its known env vars) or stored in config\r\n * (encrypted or plaintext)? Used to filter the picker to providers\r\n * the user can actually use right now.\r\n */\r\nfunction hasApiKey(provider: ResolvedProvider, config?: Config): boolean {\r\n if (provider.envVars.some((v) => !!process.env[v])) return true;\r\n const entry = config?.providers?.[provider.id];\r\n if (!entry) return false;\r\n if (typeof entry.apiKey === 'string' && entry.apiKey.length > 0) return true;\r\n if (Array.isArray(entry.apiKeys) && entry.apiKeys.some((k) => k?.apiKey)) return true;\r\n return false;\r\n}\r\n\r\n/**\r\n * Interactive provider + model picker. Lists supported providers grouped\r\n * by wire family — by default only those with an API key (env or stored\r\n * config), so you see only what you can actually launch into. Falls back\r\n * to the full catalog when no keys are found anywhere.\r\n *\r\n * When `defaultProvider`/`defaultModel` are passed, they're pre-selected\r\n * so the user can press Enter to accept the previous choice.\r\n */\r\nexport async function runPicker(deps: {\r\n modelsRegistry: ModelsRegistry;\r\n renderer: TerminalRenderer;\r\n reader: ReadlineInputReader;\r\n config?: Config;\r\n defaultProvider?: string;\r\n defaultModel?: string;\r\n}): Promise<PickerResult | undefined> {\r\n const { modelsRegistry, renderer, reader, config, defaultProvider, defaultModel } = deps;\r\n\r\n renderer.write(`\\n${color.bold(theme.primary('WrongStack') + color.dim(' — Provider & Model Selection'))}\\n`);\r\n renderer.write(color.dim('Loading provider catalog…\\n'));\r\n\r\n let providers: ResolvedProvider[];\r\n try {\r\n providers = await modelsRegistry.listProviders();\r\n } catch {\r\n renderer.writeError('Failed to load provider catalog. Pass --provider and --model to skip the picker.');\r\n return undefined;\r\n }\r\n\r\n // Drop unsupported wire families — they need a plugin and can't be\r\n // selected through this path.\r\n const supported = providers.filter((p) => p.family !== 'unsupported');\r\n\r\n // Build the display list by overlaying saved config on top of the\r\n // catalog. Two kinds of saved entries matter:\r\n // 1. The map key matches a catalog id (`zai-coding-plan`) — the\r\n // user may have overridden family/baseUrl. We MUST honor those\r\n // overrides for grouping/display, otherwise an entry the user\r\n // saved as `family: \"anthropic\"` would still appear under the\r\n // catalog's `openai-compatible` group.\r\n // 2. The map key is an alias not in the catalog. Its `cfg.type` may\r\n // still point at a catalog id, in which case we inherit the\r\n // model list and display name from there.\r\n const catalogById = new Map(supported.map((p) => [p.id, p]));\r\n const overlay = config?.providers ?? {};\r\n const seen = new Set<string>();\r\n const merged: ResolvedProvider[] = [];\r\n for (const p of supported) {\r\n const cfg = overlay[p.id];\r\n seen.add(p.id);\r\n if (cfg) {\r\n merged.push({\r\n ...p,\r\n family: cfg.family ?? p.family,\r\n apiBase: cfg.baseUrl ?? p.apiBase,\r\n envVars: cfg.envVars && cfg.envVars.length > 0 ? cfg.envVars : p.envVars,\r\n // When the user has saved an explicit model list, it wins — they\r\n // know which models their endpoint actually serves (e.g. LM\r\n // Studio, vLLM, or a proxy with custom model ids). Otherwise the\r\n // catalog list keeps providing suggestions.\r\n models:\r\n cfg.models && cfg.models.length > 0\r\n ? cfg.models.map((m) => ({ id: m, name: m }))\r\n : p.models,\r\n });\r\n } else {\r\n merged.push(p);\r\n }\r\n }\r\n for (const [id, cfg] of Object.entries(overlay)) {\r\n if (seen.has(id)) continue;\r\n if (!cfg?.family || cfg.family === 'unsupported') continue;\r\n const catalogType = cfg.type && cfg.type !== id ? cfg.type : undefined;\r\n const inherited = catalogType ? catalogById.get(catalogType) : undefined;\r\n merged.push({\r\n id,\r\n name: inherited ? `${inherited.name} ${color.dim('(alias)')}` : id,\r\n family: cfg.family,\r\n apiBase: cfg.baseUrl ?? inherited?.apiBase,\r\n envVars: cfg.envVars ?? inherited?.envVars ?? [],\r\n models:\r\n cfg.models && cfg.models.length > 0\r\n ? cfg.models.map((m) => ({ id: m, name: m }))\r\n : inherited?.models ?? [],\r\n npm: inherited?.npm,\r\n });\r\n }\r\n\r\n if (merged.length === 0) {\r\n renderer.writeError('No supported providers found in catalog.');\r\n return undefined;\r\n }\r\n\r\n // Filter to keyed providers. If none are keyed (fresh install, no env\r\n // vars set), fall back to the full list and prompt the user to add a\r\n // key — picking a keyless provider here is still useful because the\r\n // very next step (`wstack auth <prov>`) needs to know which provider.\r\n const keyed = merged.filter((p) => hasApiKey(p, config));\r\n let displayList = keyed;\r\n let showingFallback = false;\r\n if (keyed.length === 0) {\r\n displayList = merged;\r\n showingFallback = true;\r\n }\r\n\r\n // Group by family for nicer display\r\n const families = new Map<string, ResolvedProvider[]>();\r\n for (const p of displayList) {\r\n const list = families.get(p.family) ?? [];\r\n list.push(p);\r\n families.set(p.family, list);\r\n }\r\n\r\n // Build a flat numbered list (family → providers). Track which entry\r\n // matches the current default so we can highlight + accept Enter.\r\n const ordered: Array<{ provider: ResolvedProvider; index: number }> = [];\r\n const familyOrder = ['anthropic', 'openai', 'google', 'openai-compatible'];\r\n let idx = 1;\r\n let defaultIdx: number | undefined;\r\n renderer.write('\\n');\r\n for (const fam of familyOrder) {\r\n const list = families.get(fam);\r\n if (!list || list.length === 0) continue;\r\n renderer.write(` ${color.bold(fam)}\\n`);\r\n for (const p of list) {\r\n const envFound = p.envVars.some((v) => !!process.env[v]);\r\n const entry = config?.providers?.[p.id];\r\n const configKey =\r\n (typeof entry?.apiKey === 'string' && entry.apiKey.length > 0) ||\r\n (Array.isArray(entry?.apiKeys) && entry!.apiKeys!.some((k) => k?.apiKey));\r\n // ● green = env key, ◉ cyan = stored in config, ○ dim = no key\r\n const marker = envFound\r\n ? color.green('●')\r\n : configKey\r\n ? color.cyan('◉')\r\n : color.dim('○');\r\n const isDefault = p.id === defaultProvider;\r\n if (isDefault) defaultIdx = idx;\r\n const idLabel = isDefault ? color.bold(p.id) : p.id;\r\n const suffix = isDefault ? color.dim(' (default)') : '';\r\n renderer.write(\r\n ` ${color.dim(`${idx}.`.padStart(4))} ${marker} ${idLabel.padEnd(22)} ${color.dim(p.name)}${suffix}\\n`,\r\n );\r\n ordered.push({ provider: p, index: idx });\r\n idx++;\r\n }\r\n }\r\n\r\n if (showingFallback) {\r\n renderer.write(\r\n `\\n ${color.yellow('⚠ No API keys detected.')} ${color.dim('Pick a provider, then run `wstack auth <provider>` to add one.')}\\n`,\r\n );\r\n } else {\r\n renderer.write(\r\n `\\n ${color.dim('● = env key ◉ = stored in config ○ = no key')}\\n`,\r\n );\r\n }\r\n\r\n // Provider prompt. Enter on an empty line accepts the default when one\r\n // is present; otherwise we treat it as cancel.\r\n const defaultHint =\r\n defaultIdx !== undefined && defaultProvider\r\n ? ` ${color.dim(`[Enter = ${defaultProvider}]`)}`\r\n : '';\r\n const providerAnswer = (\r\n await reader.readLine(`\\n${color.amber('?')} Select provider (1-${ordered.length})${defaultHint}: `)\r\n ).trim();\r\n\r\n if (!providerAnswer) {\r\n if (defaultIdx !== undefined) {\r\n const def = ordered[defaultIdx - 1];\r\n if (def) return pickModel(def.provider, modelsRegistry, renderer, reader, defaultModel);\r\n }\r\n renderer.write(color.dim('Cancelled.\\n'));\r\n return undefined;\r\n }\r\n\r\n const providerIdx = Number.parseInt(providerAnswer, 10);\r\n if (Number.isNaN(providerIdx) || providerIdx < 1 || providerIdx > ordered.length) {\r\n // Try matching by id\r\n const byId = ordered.find((o) => o.provider.id.toLowerCase() === providerAnswer.toLowerCase());\r\n if (!byId) {\r\n renderer.writeError(`Invalid selection: \"${providerAnswer}\"`);\r\n return undefined;\r\n }\r\n return pickModel(byId.provider, modelsRegistry, renderer, reader, defaultModel);\r\n }\r\n\r\n const chosen = ordered[providerIdx - 1];\r\n if (!chosen) return undefined;\r\n // Only honor the default-model hint when the user picked the default\r\n // provider; switching providers invalidates it.\r\n const modelHint = chosen.provider.id === defaultProvider ? defaultModel : undefined;\r\n return pickModel(chosen.provider, modelsRegistry, renderer, reader, modelHint);\r\n}\r\n\r\nasync function pickModel(\r\n provider: ResolvedProvider,\r\n registry: ModelsRegistry,\r\n renderer: TerminalRenderer,\r\n reader: ReadlineInputReader,\r\n defaultModel?: string,\r\n): Promise<PickerResult | undefined> {\r\n renderer.write(`\\n ${color.bold(provider.name)} ${color.dim(`(${provider.id})`)} models:\\n\\n`);\r\n\r\n const models = [...provider.models].sort((a, b) =>\r\n (b.release_date ?? '').localeCompare(a.release_date ?? ''),\r\n );\r\n\r\n if (models.length === 0) {\r\n renderer.writeError(' No models listed for this provider in the catalog.');\r\n return undefined;\r\n }\r\n\r\n // Find default-model index for the \"Enter = default\" hint.\r\n const defaultIdxInModels =\r\n defaultModel !== undefined ? models.findIndex((m) => m.id === defaultModel) : -1;\r\n\r\n // Show paginated — up to 30 at a time\r\n const pageSize = 30;\r\n let offset = 0;\r\n\r\n while (offset < models.length) {\r\n const page = models.slice(offset, offset + pageSize);\r\n for (let i = 0; i < page.length; i++) {\r\n const m = page[i]!;\r\n const num = offset + i + 1;\r\n const ctx = m.limit?.context ? `${(m.limit.context / 1000).toFixed(0)}k`.padStart(6) : ' ?';\r\n const cost =\r\n m.cost?.input !== undefined\r\n ? `$${m.cost.input}/$${m.cost.output ?? '?'}`\r\n : '';\r\n const caps: string[] = [];\r\n if (m.tool_call) caps.push('tools');\r\n if (m.reasoning) caps.push('reason');\r\n if (m.modalities?.input?.includes('image')) caps.push('vision');\r\n const capStr = caps.length > 0 ? color.dim(caps.join(',')) : '';\r\n const isDefault = m.id === defaultModel;\r\n const idLabel = isDefault ? color.bold(m.id) : m.id;\r\n const suffix = isDefault ? color.dim(' (default)') : '';\r\n renderer.write(\r\n ` ${color.dim(`${num}.`.padStart(5))} ${idLabel.padEnd(44)} ${color.dim(ctx)} ${color.dim(cost.padEnd(14))} ${capStr}${suffix}\\n`,\r\n );\r\n }\r\n offset += pageSize;\r\n\r\n if (offset < models.length) {\r\n const more = (\r\n await reader.readLine(\r\n `\\n${color.amber('?')} Showing ${Math.min(offset, models.length)}/${models.length} — Enter number or ${color.dim('Enter')} for more: `,\r\n )\r\n ).trim();\r\n if (!more) continue; // show next page\r\n return resolveModelSelection(more, models, provider, registry, renderer, reader);\r\n }\r\n }\r\n\r\n // All shown — final prompt. Enter accepts the default model when present.\r\n const defaultHint =\r\n defaultIdxInModels >= 0 && defaultModel\r\n ? ` ${color.dim(`[Enter = ${defaultModel}]`)}`\r\n : '';\r\n const answer = (\r\n await reader.readLine(`\\n${color.amber('?')} Select model (1-${models.length})${defaultHint}: `)\r\n ).trim();\r\n if (!answer) {\r\n if (defaultIdxInModels >= 0 && defaultModel) {\r\n renderer.write(\r\n `\\n ${color.green('✓')} ${color.bold(provider.id)} / ${color.bold(defaultModel)}\\n\\n`,\r\n );\r\n return { provider: provider.id, model: defaultModel };\r\n }\r\n renderer.write(color.dim('Cancelled.\\n'));\r\n return undefined;\r\n }\r\n return resolveModelSelection(answer, models, provider, registry, renderer, reader);\r\n}\r\n\r\nasync function resolveModelSelection(\r\n answer: string,\r\n models: import('@wrongstack/core').ModelsDevModel[],\r\n provider: ResolvedProvider,\r\n _registry: ModelsRegistry,\r\n renderer: TerminalRenderer,\r\n _reader: ReadlineInputReader,\r\n): Promise<PickerResult | undefined> {\r\n const idx = Number.parseInt(answer, 10);\r\n let modelId: string | undefined;\r\n\r\n if (!Number.isNaN(idx) && idx >= 1 && idx <= models.length) {\r\n modelId = models[idx - 1]!.id;\r\n } else {\r\n // Try fuzzy matching by id\r\n const lower = answer.toLowerCase();\r\n const match = models.find((m) => m.id.toLowerCase() === lower);\r\n if (match) {\r\n modelId = match.id;\r\n } else {\r\n // Partial match\r\n const partial = models.filter((m) => m.id.toLowerCase().includes(lower));\r\n if (partial.length === 1) {\r\n modelId = partial[0]!.id;\r\n } else if (partial.length > 1) {\r\n renderer.writeError(`\"${answer}\" matches multiple models. Be more specific.`);\r\n return undefined;\r\n }\r\n }\r\n }\r\n\r\n if (!modelId) {\r\n // Use as-is (user might know the exact model string)\r\n modelId = answer;\r\n }\r\n\r\n renderer.write(\r\n `\\n ${color.green('✓')} ${color.bold(provider.id)} / ${color.bold(modelId)}\\n\\n`,\r\n );\r\n\r\n return { provider: provider.id, model: modelId };\r\n}\r\n\r\n// --- Helpers ---\r\n\r\n// Simple theme alias (avoids importing the full theme module just for one color)\r\nconst theme = { primary: color.amber };\r\n\r\n/**\r\n * Save provider + model to the global config file.\r\n * Returns true if saved successfully.\r\n */\r\nexport async function saveToGlobalConfig(\r\n configPath: string,\r\n provider: string,\r\n model: string,\r\n): Promise<boolean> {\r\n try {\r\n const { atomicWrite } = await import('@wrongstack/core');\r\n const fs = await import('node:fs/promises');\r\n\r\n let existing: Record<string, unknown> = {};\r\n try {\r\n const raw = await fs.readFile(configPath, 'utf8');\r\n existing = JSON.parse(raw) as Record<string, unknown>;\r\n } catch {\r\n // No existing config\r\n }\r\n\r\n existing.provider = provider;\r\n existing.model = model;\r\n await atomicWrite(configPath, JSON.stringify(existing, null, 2));\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import * as fs from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport type {\r\n SlashCommand,\r\n SlashCommandRegistry,\r\n ToolRegistry,\r\n Compactor,\r\n SessionStore,\r\n SkillLoader,\r\n TokenCounter,\r\n Renderer,\r\n Context,\r\n MemoryStore,\r\n MetricsSink,\r\n HealthRegistry,\r\n} from '@wrongstack/core';\r\nimport { color } from '@wrongstack/core';\r\n\r\nexport interface SlashCommandContext {\r\n registry: SlashCommandRegistry;\r\n toolRegistry: ToolRegistry;\r\n compactor?: Compactor;\r\n sessionStore?: SessionStore;\r\n skillLoader?: SkillLoader;\r\n tokenCounter: TokenCounter;\r\n renderer: Renderer;\r\n memoryStore?: MemoryStore;\r\n context?: Context;\r\n metricsSink?: MetricsSink;\r\n healthRegistry?: HealthRegistry;\r\n onExit?: () => void;\r\n onClear?: () => void;\r\n /**\r\n * Returns the diagnostics text. The TUI surfaces this as a history\r\n * entry (the renderer is silent there); REPL prints it via its\r\n * dispatcher. Avoid writing to the renderer directly from here — that\r\n * would either double-print in REPL or get swallowed by the TUI.\r\n */\r\n onDiag?: () => string;\r\n /** Same contract as `onDiag`. Returns `null` when there's no activity yet. */\r\n onStats?: () => string | null;\r\n /**\r\n * Optional spawn handler — wired by the CLI when the multi-agent host is\r\n * available. Receives the task description and returns a one-line summary\r\n * once the subagent finishes (or an error). When unset, `/spawn` reports\r\n * that multi-agent is not enabled.\r\n */\r\n onSpawn?: (description: string) => Promise<string>;\r\n /** Lists active and completed subagents. Same on/off semantics as onSpawn. */\r\n onAgents?: () => string;\r\n}\r\n\r\nexport function buildBuiltinSlashCommands(opts: SlashCommandContext): SlashCommand[] {\r\n return [\r\n helpCommand(opts),\r\n initCommand(opts),\r\n clearCommand(opts),\r\n compactCommand(opts),\r\n contextCommand(opts),\r\n toolsCommand(opts),\r\n skillCommand(opts),\r\n diagCommand(opts),\r\n statsCommand(opts),\r\n spawnCommand(opts),\r\n agentsCommand(opts),\r\n metricsCommand(opts),\r\n healthCommand(opts),\r\n memoryCommand(opts),\r\n todosCommand(opts),\r\n saveCommand(opts),\r\n loadCommand(opts),\r\n exitCommand(opts),\r\n ];\r\n}\r\n\r\nfunction memoryCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'memory',\r\n description:\r\n 'Inspect or edit persistent memory: /memory [show|remember <text>|forget <query>|clear]',\r\n async run(args) {\r\n const store = opts.memoryStore;\r\n if (!store) return { message: 'No memory store configured.' };\r\n const [verb, ...rest] = args.trim().split(/\\s+/);\r\n const restJoined = rest.join(' ').trim();\r\n switch (verb) {\r\n case '':\r\n case 'show':\r\n case 'list': {\r\n const text = await store.readAll();\r\n return {\r\n message: text.trim().length === 0\r\n ? 'Memory is empty. Add an entry with `/memory remember <text>`.'\r\n : text,\r\n };\r\n }\r\n case 'remember':\r\n case 'add': {\r\n if (!restJoined) return { message: 'Usage: /memory remember <text>' };\r\n await store.remember(restJoined);\r\n return { message: `Remembered: ${restJoined}` };\r\n }\r\n case 'forget':\r\n case 'rm': {\r\n if (!restJoined) return { message: 'Usage: /memory forget <query>' };\r\n const n = await store.forget(restJoined);\r\n return {\r\n message:\r\n n === 0 ? `No entries matched \"${restJoined}\".` : `Forgot ${n} entries.`,\r\n };\r\n }\r\n case 'clear': {\r\n await store.clear();\r\n return { message: 'Cleared all memory scopes.' };\r\n }\r\n default:\r\n return {\r\n message: `Unknown subcommand \"${verb}\". Try: show | remember <text> | forget <query> | clear`,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Live todo inspector. The agent curates `context.todos` via the\r\n * TodoWrite tool; this command surfaces it so the user can see plan state\r\n * at any time and wipe it for a clean slate.\r\n *\r\n * /todos list todos (default)\r\n * /todos clear drop them all\r\n * /todos add <text> append a pending todo manually\r\n * /todos done <id|index> mark a todo completed\r\n *\r\n * `add` / `done` are escape hatches — the agent's TodoWrite tool is still\r\n * the primary writer.\r\n */\r\nfunction todosCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'todos',\r\n description:\r\n 'Inspect or edit the live todo list: /todos [show|clear|add <text>|done <id|index>]',\r\n async run(args) {\r\n const ctx = opts.context;\r\n if (!ctx) return { message: 'No active context.' };\r\n const [verb, ...rest] = args.trim().split(/\\s+/);\r\n const restJoined = rest.join(' ').trim();\r\n switch (verb) {\r\n case '':\r\n case 'show':\r\n case 'list': {\r\n const todos = ctx.todos;\r\n if (todos.length === 0) {\r\n return { message: 'No todos. The agent will add some when it plans work.' };\r\n }\r\n const lines: string[] = [];\r\n const done = todos.filter((t) => t.status === 'completed').length;\r\n lines.push(color.dim(`Todos (${done}/${todos.length} done):`));\r\n todos.forEach((t, i) => {\r\n const mark =\r\n t.status === 'completed'\r\n ? color.green('[x]')\r\n : t.status === 'in_progress'\r\n ? color.yellow('[~]')\r\n : color.dim('[ ]');\r\n const text =\r\n t.status === 'in_progress' && t.activeForm ? t.activeForm : t.content;\r\n const label = t.status === 'completed' ? color.dim(text) : text;\r\n lines.push(` ${color.dim(String(i + 1).padStart(2))}. ${mark} ${label}`);\r\n });\r\n return { message: lines.join('\\n') };\r\n }\r\n case 'clear': {\r\n const n = ctx.todos.length;\r\n ctx.todos.length = 0;\r\n return { message: n === 0 ? 'Todos were already empty.' : `Cleared ${n} todo${n === 1 ? '' : 's'}.` };\r\n }\r\n case 'add': {\r\n if (!restJoined) return { message: 'Usage: /todos add <text>' };\r\n ctx.todos.push({\r\n id: `todo_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,\r\n content: restJoined,\r\n status: 'pending',\r\n });\r\n return { message: `Added: ${restJoined}` };\r\n }\r\n case 'done':\r\n case 'complete': {\r\n if (!restJoined) return { message: 'Usage: /todos done <id|index>' };\r\n // Accept either the todo's id or a 1-based index for ergonomics.\r\n const asIndex = Number.parseInt(restJoined, 10);\r\n let target = !Number.isNaN(asIndex)\r\n ? ctx.todos[asIndex - 1]\r\n : ctx.todos.find((t) => t.id === restJoined);\r\n if (!target) {\r\n target = ctx.todos.find((t) => t.content.toLowerCase().includes(restJoined.toLowerCase()));\r\n }\r\n if (!target) return { message: `No todo matched \"${restJoined}\".` };\r\n target.status = 'completed';\r\n return { message: `Marked done: ${target.content}` };\r\n }\r\n default:\r\n return {\r\n message: `Unknown subcommand \"${verb}\". Try: show | clear | add <text> | done <id|index>`,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Bootstrap a `.wrongstack/AGENTS.md` in the current project. We try to\r\n * sniff the repo for common build/test commands so the file starts with\r\n * useful content instead of a blank template — the user is meant to edit\r\n * it, but those defaults remove the friction of staring at a blank page.\r\n */\r\nfunction initCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'init',\r\n description: 'Scaffold .wrongstack/AGENTS.md in the current project.',\r\n async run(args, ctx) {\r\n const force = args.trim() === '--force';\r\n const dir = path.join(ctx.projectRoot, '.wrongstack');\r\n const file = path.join(dir, 'AGENTS.md');\r\n try {\r\n await fs.access(file);\r\n if (!force) {\r\n const msg = `AGENTS.md already exists at ${file}. Use \"/init --force\" to overwrite.`;\r\n opts.renderer.writeWarning(msg);\r\n return { message: msg };\r\n }\r\n } catch {\r\n // doesn't exist — proceed\r\n }\r\n const detected = await detectProjectFacts(ctx.projectRoot);\r\n const body = renderAgentsTemplate(detected);\r\n await fs.mkdir(dir, { recursive: true });\r\n await fs.writeFile(file, body, 'utf8');\r\n if (detected.hints.length > 0) {\r\n const msg = `Wrote ${file}\\nPre-filled: ${detected.hints.join(', ')}. Edit the file to add anything else worth remembering.`;\r\n opts.renderer.writeInfo(`Wrote ${file}`);\r\n opts.renderer.writeInfo(`Pre-filled: ${detected.hints.join(', ')}. Edit the file to add anything else worth remembering.`);\r\n return { message: msg };\r\n }\r\n const msg = `Wrote ${file}\\nNo project type auto-detected. Edit the file to add build/test commands and conventions.`;\r\n opts.renderer.writeInfo(`Wrote ${file}`);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nexport interface ProjectFacts {\r\n build?: string;\r\n test?: string;\r\n lint?: string;\r\n run?: string;\r\n hints: string[];\r\n}\r\n\r\nexport async function detectProjectFacts(root: string): Promise<ProjectFacts> {\r\n const facts: ProjectFacts = { hints: [] };\r\n // package.json\r\n try {\r\n const pkg = JSON.parse(await fs.readFile(path.join(root, 'package.json'), 'utf8')) as {\r\n scripts?: Record<string, string>;\r\n packageManager?: string;\r\n };\r\n const scripts = pkg.scripts ?? {};\r\n const pm = (pkg.packageManager ?? 'npm').split('@')[0] ?? 'npm';\r\n if (scripts['build']) facts.build = `${pm} run build`;\r\n if (scripts['test']) facts.test = `${pm} test`;\r\n if (scripts['lint']) facts.lint = `${pm} run lint`;\r\n if (scripts['dev'] ?? scripts['start']) facts.run = `${pm} run ${scripts['dev'] ? 'dev' : 'start'}`;\r\n facts.hints.push('package.json scripts');\r\n } catch {\r\n // not node\r\n }\r\n // pyproject.toml\r\n try {\r\n await fs.access(path.join(root, 'pyproject.toml'));\r\n facts.test ??= 'pytest';\r\n facts.lint ??= 'ruff check .';\r\n facts.hints.push('pyproject.toml');\r\n } catch {\r\n // not python\r\n }\r\n // go.mod\r\n try {\r\n await fs.access(path.join(root, 'go.mod'));\r\n facts.build ??= 'go build ./...';\r\n facts.test ??= 'go test ./...';\r\n facts.hints.push('go.mod');\r\n } catch {\r\n // not go\r\n }\r\n // Cargo.toml\r\n try {\r\n await fs.access(path.join(root, 'Cargo.toml'));\r\n facts.build ??= 'cargo build';\r\n facts.test ??= 'cargo test';\r\n facts.hints.push('Cargo.toml');\r\n } catch {\r\n // not rust\r\n }\r\n // Makefile — last resort\r\n try {\r\n await fs.access(path.join(root, 'Makefile'));\r\n facts.build ??= 'make';\r\n facts.test ??= 'make test';\r\n facts.hints.push('Makefile');\r\n } catch {\r\n // no make\r\n }\r\n return facts;\r\n}\r\n\r\nexport function renderAgentsTemplate(f: ProjectFacts): string {\r\n const cmd = (s?: string) => (s ? `\\`${s}\\`` : '_TODO_');\r\n return `# AGENTS.md\r\n\r\nProject notes for WrongStack. Committed to the repo so every contributor\r\n(human or agent) starts with the same context. Edit freely.\r\n\r\n## What this project is\r\n\r\n_One paragraph: what does this codebase do, who runs it, what's the\r\ndeployment target?_\r\n\r\n## How to work on it\r\n\r\n- **Build:** ${cmd(f.build)}\r\n- **Test:** ${cmd(f.test)}\r\n- **Lint:** ${cmd(f.lint)}\r\n- **Run locally:** ${cmd(f.run)}\r\n\r\n## Conventions\r\n\r\n_What style choices matter here? Filenames, module layout, naming, error\r\nhandling, log format. Anything a stranger would get wrong._\r\n\r\n## Domain knowledge\r\n\r\n_Acronyms, business rules, foot-guns, \"this looks weird but it's\r\nintentional because…\"._\r\n\r\n## Pointers\r\n\r\n_Where to look for: routing, database migrations, feature flags,\r\non-call runbooks, dashboards._\r\n`;\r\n}\r\n\r\nfunction diagCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'diag',\r\n description: 'Show runtime diagnostics (provider, tokens, tools, MCP).',\r\n async run() {\r\n if (!opts.onDiag) return { message: 'Diag not available in this context.' };\r\n return { message: opts.onDiag() };\r\n },\r\n };\r\n}\r\n\r\nfunction statsCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'stats',\r\n description: 'Show session report: tokens, requests, tools, files, cost.',\r\n async run() {\r\n if (!opts.onStats) return { message: 'Stats not available in this context.' };\r\n const text = opts.onStats();\r\n return { message: text ?? 'No session activity recorded yet.' };\r\n },\r\n };\r\n}\r\n\r\nfunction helpCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'help',\r\n description: 'Show available slash commands. Pass a name for detailed help.',\r\n help: [\r\n 'Usage:',\r\n ' /help List every command with its one-line description.',\r\n ' /help <name> Show detailed help for one command (falls back to the description).',\r\n '',\r\n 'Examples:',\r\n ' /help',\r\n ' /help context',\r\n ' /help model',\r\n ].join('\\n'),\r\n async run(args) {\r\n const query = args.trim();\r\n if (query) {\r\n // Strip a leading slash if the user wrote `/help /foo`.\r\n const needle = query.startsWith('/') ? query.slice(1) : query;\r\n let match:\r\n | { cmd: SlashCommand; owner: string; fullName: string }\r\n | undefined;\r\n for (const entry of opts.registry.listWithOwner()) {\r\n const aliases = entry.cmd.aliases ?? [];\r\n const candidates = [\r\n entry.cmd.name,\r\n entry.fullName,\r\n ...aliases,\r\n ...aliases.map(\r\n (a) => (entry.owner === 'core' ? a : `${entry.owner}:${a}`),\r\n ),\r\n ];\r\n if (candidates.includes(needle)) {\r\n match = entry;\r\n break;\r\n }\r\n }\r\n if (!match) {\r\n return { message: `Unknown command: /${needle}. Run /help to list commands.` };\r\n }\r\n const prefix = match.owner === 'core' ? '' : `${match.owner}:`;\r\n const header = `/${prefix}${match.cmd.name}`;\r\n const aliasLine =\r\n match.cmd.aliases && match.cmd.aliases.length > 0\r\n ? `Aliases: ${match.cmd.aliases.map((a) => `/${prefix}${a}`).join(', ')}\\n`\r\n : '';\r\n const body = match.cmd.help ?? match.cmd.description;\r\n return {\r\n message: [\r\n header,\r\n '─'.repeat(header.length),\r\n aliasLine + (match.cmd.help ? '' : `${match.cmd.description}\\n`),\r\n body,\r\n ]\r\n .filter(Boolean)\r\n .join('\\n'),\r\n };\r\n }\r\n const lines = ['Available slash commands:'];\r\n for (const { cmd, owner } of opts.registry.listWithOwner()) {\r\n const isBuiltin = owner === 'core';\r\n const prefix = isBuiltin ? '' : `${owner}:`;\r\n const aliases = cmd.aliases\r\n ? cmd.aliases.map((a) => `/${prefix}${a}`).join(', ')\r\n : '';\r\n const aliasStr = aliases ? ` (${aliases})` : '';\r\n lines.push(` /${prefix}${cmd.name}${aliasStr} — ${cmd.description}`);\r\n }\r\n lines.push('', 'Run `/help <name>` for detailed help on a specific command.');\r\n return { message: lines.join('\\n') };\r\n },\r\n };\r\n}\r\n\r\nfunction clearCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'clear',\r\n description: 'Reset the session and start a new one.',\r\n help: [\r\n 'Usage:',\r\n ' /clear',\r\n '',\r\n 'Wipes everything in the current REPL state: messages, todos, read-file tracking,',\r\n 'file mtimes, meta. Memory store entries (all scopes) are cleared too. The terminal',\r\n 'is wiped. Use this when you want a fresh conversation without restarting `wstack`.',\r\n ].join('\\n'),\r\n async run(_args, ctx) {\r\n // Clear context: messages, todos, readFiles, fileMtimes\r\n if (ctx) {\r\n ctx.state.replaceMessages([]);\r\n ctx.state.replaceTodos([]);\r\n ctx.readFiles.clear();\r\n ctx.fileMtimes.clear();\r\n for (const key of Object.keys(ctx.meta)) ctx.state.deleteMeta(key);\r\n }\r\n // Clear memory store (all scopes)\r\n await opts.memoryStore?.clear();\r\n opts.onClear?.();\r\n opts.renderer.clear();\r\n const msg = 'Session cleared (context, memory, and history reset).';\r\n opts.renderer.writeInfo(msg);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction contextCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'context',\r\n aliases: ['ctx'],\r\n description: 'Show context window summary.',\r\n help: [\r\n 'Usage:',\r\n ' /context Show counts: messages, est. tokens, tool calls, todos, read files.',\r\n ' /context detail As above, plus model, cwd, projectRoot, and the file list.',\r\n '',\r\n 'Token estimate is a `chars ÷ 4` heuristic, not a real tokenizer call —',\r\n 'good enough to spot growth between turns.',\r\n ].join('\\n'),\r\n async run(args, ctx) {\r\n const messages = ctx.messages;\r\n const detailed = args.trim() === 'detail';\r\n\r\n const pairCount = countTurnPairs(messages);\r\n const estimatedTokens = estimateTokens(messages);\r\n const toolUseCount = countToolUses(messages);\r\n const toolResultCount = countToolResults(messages);\r\n\r\n const lines = [\r\n `${color.bold('Context Window')}`,\r\n ` messages: ${messages.length} total (${pairCount} user+assistant pairs)`,\r\n ` tokens (≈): ${estimatedTokens.toLocaleString()} (chars ÷ 4 estimate)`,\r\n ` system prompt: ${ctx.systemPrompt.length} block${ctx.systemPrompt.length !== 1 ? 's' : ''}`,\r\n ` tools: ${toolUseCount} calls made, ${toolResultCount} results in history`,\r\n ` read files: ${ctx.readFiles.size} files`,\r\n ` todos: ${ctx.todos.filter((t) => t.status === 'in_progress').length} in_progress / ${ctx.todos.filter((t) => t.status === 'pending').length} pending / ${ctx.todos.filter((t) => t.status === 'completed').length} completed`,\r\n ];\r\n\r\n if (detailed) {\r\n lines.push(` model: ${ctx.model}`);\r\n lines.push(` cwd: ${ctx.cwd}`);\r\n lines.push(` projectRoot: ${ctx.projectRoot}`);\r\n lines.push(` file mtimes: ${ctx.fileMtimes.size} tracked`);\r\n if (ctx.readFiles.size > 0) {\r\n lines.push(` file list: ${[...ctx.readFiles].join(', ')}`);\r\n }\r\n }\r\n\r\n const msg = lines.join('\\n');\r\n opts.renderer.write(`${msg}\\n`);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction countTurnPairs(messages: Context['messages']): number {\r\n let count = 0;\r\n for (const m of messages) {\r\n if (m.role === 'user' || m.role === 'assistant') count++;\r\n }\r\n return Math.floor(count / 2);\r\n}\r\n\r\nfunction countToolUses(messages: Context['messages']): number {\r\n let count = 0;\r\n for (const m of messages) {\r\n const content = m.content;\r\n if (Array.isArray(content)) {\r\n count += content.filter((b) => b.type === 'tool_use').length;\r\n }\r\n }\r\n return count;\r\n}\r\n\r\nfunction countToolResults(messages: Context['messages']): number {\r\n let count = 0;\r\n for (const m of messages) {\r\n const content = m.content;\r\n if (Array.isArray(content)) {\r\n count += content.filter((b) => b.type === 'tool_result').length;\r\n }\r\n }\r\n return count;\r\n}\r\n\r\nfunction estimateTokens(messages: Context['messages']): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n const content = m.content;\r\n if (typeof content === 'string') {\r\n total += Math.ceil(content.length / 4);\r\n } else if (Array.isArray(content)) {\r\n for (const b of content) {\r\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\r\n else if (b.type === 'tool_use' || b.type === 'tool_result') {\r\n total += Math.ceil(JSON.stringify(b).length / 4);\r\n }\r\n }\r\n }\r\n }\r\n return total;\r\n}\r\n\r\nfunction compactCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'compact',\r\n description: 'Compact the context window.',\r\n help: [\r\n 'Usage:',\r\n ' /compact Run the configured compactor with default settings.',\r\n ' /compact aggressive Compact more aggressively — keeps fewer recent turns verbatim.',\r\n '',\r\n 'The compactor summarizes older turns to reclaim tokens. The default keeps the most',\r\n 'recent K message pairs untouched; aggressive halves that window.',\r\n ].join('\\n'),\r\n async run(args, ctx) {\r\n if (!opts.compactor) {\r\n const msg = 'No compactor configured.';\r\n opts.renderer.writeWarning(msg);\r\n return { message: msg };\r\n }\r\n const aggressive = args.trim() === 'aggressive';\r\n const report = await opts.compactor.compact(ctx, { aggressive });\r\n const msg =\r\n `Compaction: ${report.before} → ${report.after} tokens (${report.reductions\r\n .map((r) => `${r.phase}: ${r.saved}`)\r\n .join(', ')})`;\r\n opts.renderer.writeInfo(msg);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction toolsCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'tools',\r\n description: 'List registered tools.',\r\n async run() {\r\n const all = opts.toolRegistry.listWithOwner();\r\n const lines = all.map(({ tool, owner }) => {\r\n return ` ${tool.name.padEnd(28)} ${color.dim(`[${owner}]`)} ${tool.mutating ? color.yellow('mut') : color.cyan('ro')} ${color.dim(tool.permission)}`;\r\n });\r\n const msg = `${color.bold('Tools')} (${all.length}):\\n${lines.join('\\n')}\\n`;\r\n opts.renderer.write(msg);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction skillCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'skill',\r\n description: 'Show skill details or list available skills.',\r\n async run(args) {\r\n if (!opts.skillLoader) {\r\n const msg = 'No skill loader configured.';\r\n return { message: msg };\r\n }\r\n if (!args.trim()) {\r\n const entries = await opts.skillLoader.listEntries();\r\n if (entries.length === 0) {\r\n const msg = 'No skills found.';\r\n return { message: msg };\r\n }\r\n const lines = entries.map((e) => {\r\n const scopeTag = e.scope.length > 0 ? ` ${color.dim(`(${e.scope.slice(0, 3).join(', ')})`)}` : '';\r\n return ` ${color.bold(e.name)}${scopeTag}\\n Use when: ${e.trigger}`;\r\n });\r\n const msg = `Available skills:\\n${lines.join('\\n\\n')}\\n`;\r\n return { message: msg };\r\n }\r\n const skill = await opts.skillLoader.find(args.trim());\r\n if (!skill) {\r\n const msg = `Skill \"${args.trim()}\" not found.`;\r\n return { message: msg };\r\n }\r\n const body = await opts.skillLoader.readBody(skill.name);\r\n return { message: body };\r\n },\r\n };\r\n}\r\n\r\nfunction saveCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'save',\r\n description: 'Save current session (auto by default; this forces flush).',\r\n async run(_args, ctx) {\r\n await ctx.session.append({\r\n type: 'session_end',\r\n ts: new Date().toISOString(),\r\n usage: opts.tokenCounter.total(),\r\n });\r\n const msg = `Session ${ctx.session.id} flushed.`;\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction loadCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'resume',\r\n aliases: ['load', 'sessions'],\r\n description:\r\n 'List recent sessions. To actually resume, exit and run `wstack resume <id>`.',\r\n async run() {\r\n if (!opts.sessionStore) {\r\n const msg = 'No session store configured.';\r\n return { message: msg };\r\n }\r\n const list = await opts.sessionStore.list(10);\r\n if (list.length === 0) {\r\n const msg = 'No saved sessions.';\r\n return { message: msg };\r\n }\r\n const lines = list.map(\r\n (s) =>\r\n ` ${s.id} ${color.dim(s.startedAt)} ${color.dim(`${s.tokenTotal} tok`)} ${s.title}`,\r\n );\r\n const msg =\r\n `Recent sessions:\\n${lines.join('\\n')}\\n\\n` +\r\n color.dim(`Resume one with: wstack resume ${list[0]?.id ?? '<id>'}\\n`);\r\n opts.renderer.write(msg);\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction exitCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'exit',\r\n aliases: ['quit', 'q'],\r\n description: 'Exit the REPL.',\r\n async run() {\r\n opts.onExit?.();\r\n return { exit: true };\r\n },\r\n };\r\n}\r\n\r\nfunction metricsCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'metrics',\r\n description: 'Show metrics snapshot (requires --metrics flag).',\r\n async run() {\r\n if (!opts.metricsSink) {\r\n return { message: 'Metrics not enabled. Restart with --metrics to collect.' };\r\n }\r\n const snap = opts.metricsSink.snapshot();\r\n if (snap.series.length === 0) {\r\n return { message: 'No metrics recorded yet.' };\r\n }\r\n const lines: string[] = [];\r\n // Group by metric name for a more readable dump\r\n const byName = new Map<string, typeof snap.series>();\r\n for (const s of snap.series) {\r\n const bucket = byName.get(s.name) ?? [];\r\n bucket.push(s);\r\n byName.set(s.name, bucket);\r\n }\r\n for (const [name, series] of [...byName.entries()].sort()) {\r\n lines.push(color.dim(`# ${name}`));\r\n for (const s of series) {\r\n const labels = Object.entries(s.labels).map(([k, v]) => `${k}=${v}`).join(' ');\r\n const labelStr = labels ? color.dim(` {${labels}}`) : '';\r\n if (s.type === 'histogram') {\r\n lines.push(\r\n ` count=${s.values.count} sum=${s.values.sum} min=${s.values.min} max=${s.values.max} p50=${s.values.p50} p95=${s.values.p95} p99=${s.values.p99}${labelStr}`,\r\n );\r\n } else {\r\n lines.push(` ${s.values.value}${labelStr}`);\r\n }\r\n }\r\n }\r\n const msg = lines.join('\\n');\r\n return { message: msg };\r\n },\r\n };\r\n}\r\n\r\nfunction healthCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'health',\r\n description: 'Run health checks (requires --metrics flag).',\r\n async run() {\r\n if (!opts.healthRegistry) {\r\n return { message: 'Health checks not enabled. Restart with --metrics.' };\r\n }\r\n const result = await opts.healthRegistry.run();\r\n const lines: string[] = [\r\n `${statusIcon(result.status)} overall: ${result.status}`,\r\n ...result.checks.map((c) => {\r\n const detail = c.detail ? color.dim(` — ${c.detail}`) : '';\r\n return ` ${statusIcon(c.status)} ${c.name}: ${c.status}${detail}`;\r\n }),\r\n ];\r\n return { message: lines.join('\\n') };\r\n },\r\n };\r\n}\r\n\r\nfunction statusIcon(status: string): string {\r\n if (status === 'healthy') return color.green('●');\r\n if (status === 'degraded') return color.yellow('●');\r\n return color.red('●');\r\n}\r\n\r\nfunction spawnCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'spawn',\r\n description:\r\n 'Spawn an isolated subagent to handle a task. Usage: /spawn <task description>',\r\n async run(args) {\r\n const description = args.trim();\r\n if (!description) return { message: 'Usage: /spawn <task description>' };\r\n if (!opts.onSpawn) {\r\n return { message: 'Multi-agent is not enabled in this session.' };\r\n }\r\n try {\r\n const summary = await opts.onSpawn(description);\r\n return { message: summary };\r\n } catch (err) {\r\n return {\r\n message: `Spawn failed: ${err instanceof Error ? err.message : String(err)}`,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n\r\nfunction agentsCommand(opts: SlashCommandContext): SlashCommand {\r\n return {\r\n name: 'agents',\r\n description: 'Show status of spawned subagents (pending + completed tasks).',\r\n async run() {\r\n if (!opts.onAgents) {\r\n return { message: 'Multi-agent is not enabled in this session.' };\r\n }\r\n return { message: opts.onAgents() };\r\n },\r\n };\r\n}\r\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { color } from '@wrongstack/core';\nimport type { TerminalRenderer } from './renderer.js';\nimport type { ReadlineInputReader } from './input-reader.js';\nimport { detectProjectFacts, renderAgentsTemplate } from './slash-commands/index.js';\n\nexport type ProjectKind =\n /** `.wrongstack/AGENTS.md` exists — fully set up. */\n | 'initialized'\n /** Has a recognizable manifest (package.json, pyproject.toml, etc.) but no AGENTS.md yet. */\n | 'project'\n /** No manifest, no AGENTS.md — probably an empty/scratch directory. */\n | 'empty';\n\nconst MANIFESTS = [\n 'package.json',\n 'pyproject.toml',\n 'Cargo.toml',\n 'go.mod',\n 'Makefile',\n 'pom.xml',\n 'build.gradle',\n 'build.gradle.kts',\n 'composer.json',\n 'Gemfile',\n];\n\nexport async function detectProjectKind(projectRoot: string): Promise<ProjectKind> {\n try {\n await fs.access(path.join(projectRoot, '.wrongstack', 'AGENTS.md'));\n return 'initialized';\n } catch {\n // not initialized\n }\n for (const m of MANIFESTS) {\n try {\n await fs.access(path.join(projectRoot, m));\n return 'project';\n } catch {\n // try next\n }\n }\n return 'empty';\n}\n\nasync function scaffoldAgentsMd(projectRoot: string): Promise<string> {\n const dir = path.join(projectRoot, '.wrongstack');\n const file = path.join(dir, 'AGENTS.md');\n const facts = await detectProjectFacts(projectRoot);\n const body = renderAgentsTemplate(facts);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(file, body, 'utf8');\n return file;\n}\n\n/**\n * Print a one-line project status banner and, when relevant, prompt the\n * user about scaffolding `AGENTS.md` or continuing in a directory that\n * doesn't look like a project. Returns `false` if the user bailed out.\n */\nexport async function runProjectCheck(opts: {\n projectRoot: string;\n renderer: TerminalRenderer;\n reader: ReadlineInputReader;\n}): Promise<boolean> {\n const { projectRoot, renderer, reader } = opts;\n const kind = await detectProjectKind(projectRoot);\n\n if (kind === 'initialized') {\n renderer.write(\n `\\n ${color.green('✓')} Project initialized ${color.dim(`(${path.join(projectRoot, '.wrongstack', 'AGENTS.md')})`)}\\n`,\n );\n return true;\n }\n\n if (kind === 'project') {\n renderer.write(\n `\\n ${color.amber('●')} Project detected ${color.dim(`(${projectRoot})`)} but ${color.bold('.wrongstack/AGENTS.md')} is missing.\\n`,\n );\n const answer = (\n await reader.readLine(\n ` ${color.amber('?')} Scaffold ${color.bold('AGENTS.md')} now? ${color.dim('[y/N]')} `,\n )\n ).trim().toLowerCase();\n if (answer === 'y' || answer === 'yes') {\n try {\n const file = await scaffoldAgentsMd(projectRoot);\n renderer.write(` ${color.green('✓')} Wrote ${color.dim(file)}\\n`);\n } catch (err) {\n renderer.writeError(\n `Failed to scaffold AGENTS.md: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n return true;\n }\n\n // 'empty' — no manifest, no AGENTS.md\n renderer.write(\n `\\n ${color.dim('○')} ${color.dim(`No project manifest in ${projectRoot} — running in a scratch directory.`)}\\n`,\n );\n const answer = (\n await reader.readLine(\n ` ${color.amber('?')} Continue anyway? ${color.dim('[Y/n]')} `,\n )\n ).trim().toLowerCase();\n if (answer === 'n' || answer === 'no') {\n renderer.write(color.dim(' Cancelled.\\n'));\n return false;\n }\n return true;\n}\n\nexport interface LaunchModeChoices {\n /** TUI or plain REPL. */\n mode: 'tui' | 'repl';\n /** Auto-approve every tool call (no permission prompts). */\n yolo: boolean;\n}\n\n/**\n * Ask for interactive mode (TUI vs REPL) and YOLO. Either prompt is\n * skipped when the corresponding CLI flag was already pinned. Returns\n * the resolved pair.\n */\nexport async function runLaunchPrompts(opts: {\n renderer: TerminalRenderer;\n reader: ReadlineInputReader;\n modePinned?: 'tui' | 'repl';\n yoloPinned?: boolean;\n}): Promise<LaunchModeChoices> {\n const { renderer, reader, modePinned, yoloPinned } = opts;\n\n let mode: 'tui' | 'repl';\n if (modePinned) {\n mode = modePinned;\n } else {\n const answer = (\n await reader.readLine(\n `\\n ${color.amber('?')} Interactive mode: ${color.bold('T')}UI / ${color.bold('R')}EPL ${color.dim('[T/r]')} `,\n )\n ).trim().toLowerCase();\n mode = answer === 'r' || answer === 'repl' ? 'repl' : 'tui';\n }\n\n let yolo: boolean;\n if (yoloPinned !== undefined) {\n yolo = yoloPinned;\n } else {\n const answer = (\n await reader.readLine(\n ` ${color.amber('?')} YOLO mode ${color.dim('(auto-approve every tool call)')} ${color.dim('[y/N]')} `,\n )\n ).trim().toLowerCase();\n yolo = answer === 'y' || answer === 'yes';\n }\n\n renderer.write(\n `\\n ${color.green('▶')} Launching in ${color.bold(mode.toUpperCase())} mode${yolo ? color.yellow(' (YOLO)') : ''}\\n\\n`,\n );\n\n return { mode, yolo };\n}\n","import type { ContentBlock, Renderer, TextBlock } from '@wrongstack/core';\nimport { color } from '@wrongstack/core';\nimport { theme } from './theme.js';\nimport { renderDiff } from './diff-renderer.js';\n\nexport interface TerminalRendererOptions {\n out?: NodeJS.WriteStream;\n err?: NodeJS.WriteStream;\n}\n\nexport class TerminalRenderer implements Renderer {\n private readonly out: NodeJS.WriteStream;\n private readonly err: NodeJS.WriteStream;\n private lineStart = true;\n /**\n * When true, every stdout-bound method is a no-op. This is the only\n * safe state to be in while Ink owns the terminal (TUI mode):\n * raw writes to stdout interleave with Ink's cursor math and cause\n * the input + status bar to be reprinted as scrollback junk.\n * Stderr-bound methods (writeInfo/Warning/Error) still flow — they\n * go to a different stream Ink does not manage.\n */\n private silent = false;\n\n constructor(opts: TerminalRendererOptions = {}) {\n this.out = opts.out ?? process.stdout;\n this.err = opts.err ?? process.stderr;\n }\n\n /**\n * Toggle stdout suppression. Call `setSilent(true)` right before\n * handing the terminal to Ink, and `setSilent(false)` after Ink\n * exits. Idempotent.\n */\n setSilent(silent: boolean): void {\n this.silent = silent;\n }\n\n isSilent(): boolean {\n return this.silent;\n }\n\n write(input: string | TextBlock): void {\n if (this.silent) return;\n const text = typeof input === 'string' ? input : input.text;\n if (!text) return;\n const rendered = renderMarkdown(text);\n this.out.write(rendered);\n this.lineStart = rendered.endsWith('\\n');\n }\n\n writeLine(text = ''): void {\n if (this.silent) return;\n if (!this.lineStart) this.out.write('\\n');\n if (text) this.out.write(`${text}\\n`);\n else this.out.write('\\n');\n this.lineStart = true;\n }\n\n writeBlock(block: ContentBlock): void {\n if (this.silent) return;\n if (block.type === 'text') {\n this.write(block);\n } else if (block.type === 'tool_use') {\n this.writeToolCall(block.name, block.input);\n } else if (block.type === 'tool_result') {\n const text = typeof block.content === 'string' ? block.content : JSON.stringify(block.content);\n this.writeToolResult('result', text, !!block.is_error);\n }\n }\n\n writeToolCall(name: string, input: unknown): void {\n if (this.silent) return;\n if (!this.lineStart) this.out.write('\\n');\n const arrow = theme.primary('→');\n const display = formatInputSummary(input);\n this.out.write(`${arrow} ${theme.bold(name)}${display ? color.dim(` ${display}`) : ''}\\n`);\n this.lineStart = true;\n }\n\n writeToolResult(name: string, content: unknown, isError: boolean): void {\n if (this.silent) return;\n const txt = typeof content === 'string' ? content : safeStringify(content);\n const prefix = isError ? theme.error('✘') : theme.success('✓');\n\n if (isError) {\n const firstLine = txt.split('\\n')[0] ?? '';\n const truncated = firstLine.length > 200 ? `${firstLine.slice(0, 197)}…` : firstLine;\n this.out.write(` ${prefix} ${color.dim(truncated)}\\n`);\n this.lineStart = true;\n return;\n }\n\n // Tool-specific rendering.\n const isEditLike = name === 'edit' || name === 'write';\n const isReadLike = name === 'read' || name === 'grep' || name === 'glob' || name === 'bash';\n const previewLines = isEditLike ? 0 : isReadLike ? 6 : 2;\n\n // Edit-like tools: pull the embedded diff if present.\n const diff = extractDiff(content);\n if (isEditLike && diff) {\n this.out.write(` ${prefix} ${color.dim(summarize(content, name))}\\n`);\n const rendered = renderDiff(diff)\n .split('\\n')\n .map((l) => ` ${l}`)\n .join('\\n');\n this.out.write(`${rendered}\\n`);\n this.lineStart = true;\n return;\n }\n\n // Generic preview: show up to N lines, then \"+X more\" if truncated.\n const lines = txt.split('\\n');\n const head = lines.slice(0, previewLines).map((l: string) => l.replace(/\\s+$/, ''));\n const moreCount = Math.max(0, lines.length - head.length);\n this.out.write(` ${prefix} ${color.dim(summarize(content, name))}\\n`);\n for (const l of head) {\n const capped = l.length > 200 ? `${l.slice(0, 197)}…` : l;\n this.out.write(` ${color.dim(capped)}\\n`);\n }\n if (moreCount > 0) {\n this.out.write(` ${color.dim(`+${moreCount} more line${moreCount === 1 ? '' : 's'}`)}\\n`);\n }\n this.lineStart = true;\n }\n\n writeDiff(diff: string): void {\n if (this.silent) return;\n if (!this.lineStart) this.out.write('\\n');\n this.out.write(`${renderDiff(diff)}\\n`);\n this.lineStart = true;\n }\n\n writeWarning(text: string): void {\n this.err.write(`${theme.warn('⚠')} ${text}\\n`);\n }\n writeError(text: string): void {\n this.err.write(`${theme.error('✘')} ${text}\\n`);\n }\n writeInfo(text: string): void {\n this.err.write(`${theme.info('ℹ')} ${text}\\n`);\n }\n\n clear(): void {\n if (this.silent) return;\n this.out.write('\\x1b[2J\\x1b[H');\n this.lineStart = true;\n }\n}\n\nfunction renderMarkdown(s: string): string {\n let out = s;\n // Headings\n out = out.replace(/^(#{1,6}) (.+)$/gm, (_m, hashes, text) => {\n return theme.primary(theme.bold(`${hashes} ${text}`));\n });\n // Fenced code\n out = out.replace(/```([a-zA-Z0-9_+-]*)\\n([\\s\\S]*?)```/g, (_m, _lang, code) => {\n return color.gray(`\\n┌─\\n${code.replace(/^/gm, '│ ')}└─`);\n });\n // Inline code\n out = out.replace(/`([^`\\n]+)`/g, (_m, code) => theme.accent(code));\n // Bold\n out = out.replace(/\\*\\*([^*]+)\\*\\*/g, (_m, text) => theme.bold(text));\n // Italic — single-asterisk\n out = out.replace(/(^|[^*])\\*([^*\\n]+)\\*([^*]|$)/g, (_m, l, t, r) => `${l}${color.italic(t)}${r}`);\n return out;\n}\n\nfunction formatInputSummary(input: unknown): string {\n if (!input || typeof input !== 'object') return '';\n const obj = input as Record<string, unknown>;\n if (typeof obj['path'] === 'string') return obj['path'] as string;\n if (typeof obj['url'] === 'string') return obj['url'] as string;\n if (typeof obj['command'] === 'string') {\n const cmd = obj['command'] as string;\n return cmd.length > 60 ? cmd.slice(0, 57) + '...' : cmd;\n }\n if (typeof obj['pattern'] === 'string') return obj['pattern'] as string;\n return '';\n}\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * If the tool result is an object with a `diff` field (e.g. from the edit\n * tool), return that. If it's a string containing a unified diff header,\n * return it as-is. Otherwise return null and the caller falls back to a\n * generic preview.\n */\nfunction extractDiff(value: unknown): string | null {\n if (typeof value === 'object' && value !== null) {\n const d = (value as { diff?: unknown }).diff;\n if (typeof d === 'string' && d.length > 0) return d;\n }\n if (typeof value === 'string') {\n // The agent serialises tool results to JSON before handing them to the\n // renderer, so a string `{\"diff\": \"...\"}` is the common case. Try parsing.\n const trimmed = value.trimStart();\n if (trimmed.startsWith('{')) {\n try {\n const parsed = JSON.parse(value) as { diff?: unknown };\n if (typeof parsed.diff === 'string' && parsed.diff.length > 0) {\n return parsed.diff;\n }\n } catch {\n // fall through\n }\n }\n if (/^---[^\\n]*\\n\\+\\+\\+/m.test(value)) return value;\n }\n return null;\n}\n\n/**\n * Short summary shown next to the ✓: file path + count for edit, line count\n * for read/grep, etc. Falls back to nothing if the shape isn't recognised.\n */\nfunction summarize(value: unknown, name: string): string {\n // Tool results arrive at the renderer already serialised to a JSON string.\n // Re-parse so we can pull out structured fields. Falls back to the raw value\n // for tools that return plain strings.\n let v: unknown = value;\n if (typeof value === 'string') {\n const trimmed = value.trimStart();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n v = JSON.parse(value);\n } catch {\n // not JSON — leave as string\n }\n }\n }\n if (typeof v === 'object' && v !== null) {\n const o = v as Record<string, unknown>;\n if (name === 'edit') {\n const path = typeof o['path'] === 'string' ? (o['path'] as string) : '';\n const reps = typeof o['replacements'] === 'number' ? (o['replacements'] as number) : 0;\n return `${path} ${reps} replacement${reps === 1 ? '' : 's'}`.trim();\n }\n if (name === 'write') {\n const path = typeof o['path'] === 'string' ? (o['path'] as string) : '';\n const bytes = typeof o['bytes'] === 'number' ? (o['bytes'] as number) : undefined;\n return bytes !== undefined ? `${path} ${bytes}B` : path;\n }\n if (typeof o['count'] === 'number') {\n return `${o['count']} match${o['count'] === 1 ? '' : 'es'}`;\n }\n }\n return '';\n}\n\n","import { createRequire } from 'node:module';\n\nconst req = createRequire(import.meta.url);\n\nfunction readOwnVersion(): string {\n const candidates = ['../package.json', '../../package.json'];\n for (const rel of candidates) {\n try {\n const pkg = req(rel) as { version?: unknown };\n if (typeof pkg.version === 'string' && pkg.version.length > 0) return pkg.version;\n } catch {\n // try next\n }\n }\n return 'dev';\n}\n\nexport const CLI_VERSION = readOwnVersion();\n\nlet API_VERSION = '0.0.0';\ntry {\n const corePkg = req('@wrongstack/core/package.json') as { wrongstackApiVersion?: string };\n if (corePkg.wrongstackApiVersion) API_VERSION = corePkg.wrongstackApiVersion;\n} catch { /* fallback */ }\n\nexport { API_VERSION };\n","/**\r\n * Format a token count for human-readable display.\r\n * 999 → \"999\"\r\n * 1_200 → \"1.2k\"\r\n * 12_000 → \"12k\"\r\n * 1_500_000 → \"1.5M\"\r\n */\r\nexport function fmtTok(n: number): string {\r\n if (n < 1000) return String(n);\r\n if (n < 1_000_000) return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}k`;\r\n return `${(n / 1_000_000).toFixed(1)}M`;\r\n}\r\n\r\n/**\r\n * Return a new frozen config object with the given patch applied.\r\n * Config objects are frozen by the config loader — direct mutation\r\n * silently fails at runtime. This helper spreads + re-freezes safely.\r\n */\r\nexport function patchConfig<T extends object>(base: T, patch: Partial<T>): T {\r\n return Object.freeze({ ...base, ...patch }) as T;\r\n}\r\n","import type {\r\n Agent,\r\n AttachmentStore,\r\n SlashCommandRegistry,\r\n TokenCounter,\r\n} from '@wrongstack/core';\r\nimport { InputBuilder, color } from '@wrongstack/core';\r\nimport { theme } from './theme.js';\r\nimport type { TerminalRenderer } from './renderer.js';\r\nimport type { ReadlineInputReader } from './input-reader.js';\r\nimport { CLI_VERSION } from './version.js';\r\nimport { fmtTok } from './utils.js';\r\n\r\nexport interface ReplOptions {\r\n agent: Agent;\r\n renderer: TerminalRenderer;\r\n reader: ReadlineInputReader;\r\n slashRegistry: SlashCommandRegistry;\r\n attachments: AttachmentStore;\r\n banner?: boolean;\r\n tokenCounter?: TokenCounter;\r\n /** Model-specific max context window (tokens). Used for the context bar in turn summaries. */\r\n effectiveMaxContext?: number;\r\n /** Project / folder name shown in the banner. Usually `path.basename(projectRoot)`. */\r\n projectName?: string;\r\n}\r\n\r\nexport async function runRepl(opts: ReplOptions): Promise<number> {\r\n if (opts.banner !== false) printBanner(opts.renderer, opts.projectName);\r\n\r\n // Per-iteration abort controller — assigned each loop so a Ctrl+C that\r\n // cancels turn N doesn't leak into turn N+1. `activeCtrl` is updated\r\n // before each agent.run so the SIGINT handler can target it.\r\n let activeCtrl: AbortController | undefined;\r\n let interrupts = 0;\r\n const onSigint = () => {\r\n interrupts++;\r\n if (interrupts >= 2) {\r\n opts.renderer.writeWarning('Exiting.');\r\n process.exit(130);\r\n }\r\n if (activeCtrl) {\r\n activeCtrl.abort();\r\n opts.renderer.writeWarning('Iteration cancelled. Press Ctrl+C again to exit.');\r\n } else {\r\n opts.renderer.writeWarning('Press Ctrl+C again to exit.');\r\n }\r\n };\r\n process.on('SIGINT', onSigint);\r\n\r\n const builder = new InputBuilder({ store: opts.attachments });\r\n\r\n // Wrap the entire loop so SIGINT and reader teardown run on every exit\r\n // path — exceptions, EOF, breakouts. Previously a throw between `on`\r\n // and the final `off` left the listener installed across REPL restarts.\r\n try {\r\n\r\n for (;;) {\r\n let raw: string;\r\n try {\r\n raw = await readPossiblyMultiline(opts);\r\n } catch {\r\n break; // EOF (Ctrl+D)\r\n }\r\n const trimmed = raw.trim();\r\n if (!trimmed) {\r\n interrupts = 0;\r\n continue;\r\n }\r\n interrupts = 0;\r\n\r\n if (trimmed.startsWith('/')) {\r\n try {\r\n const res = await opts.slashRegistry.dispatch(trimmed, opts.agent.ctx);\r\n if (res?.message) opts.renderer.write(`${res.message}\\n`);\r\n if (res?.exit) break;\r\n } catch (err) {\r\n opts.renderer.writeError(err instanceof Error ? err.message : String(err));\r\n }\r\n continue;\r\n }\r\n\r\n // Route through InputBuilder so big pastes collapse to placeholders.\r\n const ph = await builder.appendPaste(raw);\r\n if (ph) {\r\n const lineCount = raw.split('\\n').length;\r\n opts.renderer.write(color.dim(` ↳ ${ph} (${lineCount} lines)\\n`));\r\n }\r\n const blocks = await builder.submit();\r\n\r\n const runCtrl = new AbortController();\r\n activeCtrl = runCtrl;\r\n try {\r\n const startedAt = Date.now();\r\n const before = opts.tokenCounter?.total();\r\n const costBefore = opts.tokenCounter?.estimateCost().total ?? 0;\r\n const result = await opts.agent.run(blocks, { signal: runCtrl.signal });\r\n if (result.status === 'aborted') {\r\n opts.renderer.writeWarning('Aborted.');\r\n } else if (result.status === 'failed') {\r\n const err = result.error;\r\n if (err) {\r\n const tag = err.recoverable ? ' (recoverable)' : '';\r\n opts.renderer.writeError(`Failed [${err.severity}]${tag}: ${err.describe()}`);\r\n } else {\r\n opts.renderer.writeError('Failed.');\r\n }\r\n } else if (result.status === 'max_iterations') {\r\n opts.renderer.writeWarning(`Hit max iterations (${result.iterations}).`);\r\n }\r\n if (opts.tokenCounter && before) {\r\n const after = opts.tokenCounter.total();\r\n const costAfter = opts.tokenCounter.estimateCost().total;\r\n const ctxChip =\r\n opts.effectiveMaxContext && opts.effectiveMaxContext > 0\r\n ? ` ctx: ${renderContextChip(after.input, opts.effectiveMaxContext)}`\r\n : '';\r\n opts.renderer.write(\r\n `\\n${color.dim(\r\n `[in: ${fmtTok(after.input - before.input)} out: ${fmtTok(after.output - before.output)} iters: ${result.iterations} cost: ${(costAfter - costBefore).toFixed(4)} ${((Date.now() - startedAt) / 1000).toFixed(1)}s]${ctxChip}`,\r\n )}\\n`,\r\n );\r\n }\r\n } catch (err) {\r\n opts.renderer.writeError(err instanceof Error ? err.message : String(err));\r\n } finally {\r\n activeCtrl = undefined;\r\n }\r\n }\r\n\r\n return 0;\r\n } finally {\r\n // Ensure listener + reader cleanup happens on every exit path: normal\r\n // EOF, /quit, an uncaught throw, etc. Without this, a thrown exception\r\n // mid-loop would leave the SIGINT handler attached for the rest of\r\n // the process lifetime (and the reader's terminal handle open).\r\n process.off('SIGINT', onSigint);\r\n await opts.reader.close().catch(() => { /* best-effort */ });\r\n }\r\n}\r\n\r\n/**\r\n * Read a line, but support two multiline patterns:\r\n * 1. Trailing `\\` → continue on the next line (shell-style line continuation).\r\n * 2. A line that is exactly `\"\"\"` → start a heredoc; keep reading until\r\n * another bare `\"\"\"`. Useful for pasting code snippets.\r\n * Returns the assembled text and whether it came from a heredoc block (so\r\n * the caller can decide to always collapse heredocs as pastes).\r\n */\r\nasync function readPossiblyMultiline(opts: ReplOptions): Promise<string> {\r\n const firstPrompt = theme.primary('› ');\r\n const contPrompt = color.dim('· ');\r\n const first = await opts.reader.readLine(firstPrompt);\r\n\r\n if (first.trim() === '\"\"\"') {\r\n const parts: string[] = [];\r\n for (;;) {\r\n const next = await opts.reader.readLine(contPrompt);\r\n if (next.trim() === '\"\"\"') break;\r\n parts.push(next);\r\n }\r\n return parts.join('\\n');\r\n }\r\n\r\n let buf = first;\r\n while (buf.endsWith('\\\\')) {\r\n buf = buf.slice(0, -1); // drop the trailing backslash\r\n const cont = await opts.reader.readLine(contPrompt);\r\n buf += '\\n' + cont;\r\n }\r\n return buf;\r\n}\r\n\r\n\r\nconst FILLED = '█';\r\nconst EMPTY = '░';\r\n\r\nfunction renderContextChip(used: number, max: number): string {\r\n const ratio = Math.max(0, Math.min(1, used / max));\r\n const pct = Math.round(ratio * 100);\r\n const bar = renderProgress(ratio, 6);\r\n return `${bar} ${pct}% (${fmtTok(used)}/${fmtTok(max)})`;\r\n}\r\n\r\nfunction renderProgress(ratio: number, width: number): string {\r\n const clamped = Math.max(0, Math.min(1, ratio));\r\n const filled = clamped === 0 ? 0 : Math.max(1, Math.round(clamped * width));\r\n const capped = Math.min(width, filled);\r\n return FILLED.repeat(capped) + EMPTY.repeat(width - capped);\r\n}\r\n\r\nfunction printBanner(renderer: TerminalRenderer, projectName?: string): void {\r\n const lines = [\r\n theme.primary(theme.bold('WrongStack')) + color.dim(` v${CLI_VERSION}`),\r\n color.dim('Built on the wrong stack. Shipped anyway.'),\r\n ];\r\n if (projectName && projectName.length > 0) {\r\n lines.push(color.dim('Project: ') + theme.bold(projectName));\r\n }\r\n lines.push(color.dim('Type /help for commands, /exit to quit.'), '');\r\n renderer.write(`${lines.join('\\n')}\\n`);\r\n}\r\n","import type { EventBus, TokenCounter } from '@wrongstack/core';\r\nimport { color } from '@wrongstack/core';\r\nimport type { TerminalRenderer } from './renderer.js';\r\nimport { fmtTok } from './utils.js';\r\n\r\ninterface ToolStat {\r\n ok: number;\r\n fail: number;\r\n totalMs: number;\r\n}\r\n\r\n/**\r\n * Accumulates per-session stats by listening to EventBus events. Designed\r\n * to be created once in main(), live for the whole CLI invocation (single-shot\r\n * or REPL), and produce the closing report when asked.\r\n *\r\n * Cost is intentionally not tracked here — TokenCounter is the authority.\r\n */\r\nexport class SessionStats {\r\n private readonly tokenCounter: TokenCounter;\r\n private readonly startedAt = Date.now();\r\n\r\n private apiRequests = 0;\r\n private iterations = 0;\r\n private errors = 0;\r\n\r\n private readonly toolStats = new Map<string, ToolStat>();\r\n private readonly readPaths = new Set<string>();\r\n private readonly editedPaths = new Set<string>();\r\n private readonly writtenPaths = new Set<string>();\r\n private bytesWritten = 0;\r\n private bashCommands = 0;\r\n private fetches = 0;\r\n\r\n constructor(events: EventBus, tokenCounter: TokenCounter) {\r\n this.tokenCounter = tokenCounter;\r\n events.on('provider.response', () => {\r\n this.apiRequests++;\r\n });\r\n events.on('iteration.completed', () => {\r\n this.iterations++;\r\n });\r\n events.on('error', () => {\r\n this.errors++;\r\n });\r\n events.on('tool.executed', (e) => {\r\n const slot = this.toolStats.get(e.name) ?? { ok: 0, fail: 0, totalMs: 0 };\r\n if (e.ok) slot.ok++;\r\n else slot.fail++;\r\n slot.totalMs += e.durationMs;\r\n this.toolStats.set(e.name, slot);\r\n\r\n const input = e.input as Record<string, unknown> | undefined;\r\n // Side-effect counts are attempt-based (count failed shells / fetches too —\r\n // the user wants to see \"the agent tried to run 4 commands\").\r\n if (e.name === 'bash') this.bashCommands++;\r\n else if (e.name === 'fetch') this.fetches++;\r\n\r\n // File-path tracking is success-only: a failed read or edit didn't\r\n // actually touch the file, so don't claim it did.\r\n if (!e.ok) return;\r\n const path = typeof input?.path === 'string' ? (input.path as string) : undefined;\r\n if (e.name === 'read' && path) this.readPaths.add(path);\r\n else if (e.name === 'edit' && path) this.editedPaths.add(path);\r\n else if (e.name === 'write' && path) {\r\n this.writtenPaths.add(path);\r\n const content = typeof input?.content === 'string' ? (input.content as string) : '';\r\n this.bytesWritten += Buffer.byteLength(content, 'utf8');\r\n }\r\n });\r\n }\r\n\r\n hasActivity(): boolean {\r\n return (\r\n this.apiRequests > 0 ||\r\n this.iterations > 0 ||\r\n this.toolStats.size > 0 ||\r\n this.tokenCounter.total().input > 0\r\n );\r\n }\r\n\r\n /**\r\n * Build the report string. Returns null when there's no recorded\r\n * activity yet — caller decides whether to emit a placeholder or stay\r\n * silent. Splitting `format()` out of `render()` lets the TUI's slash\r\n * dispatcher take the string and turn it into a history entry, while\r\n * REPL keeps the old direct-write path.\r\n */\r\n format(): string | null {\r\n if (!this.hasActivity()) return null;\r\n const u = this.tokenCounter.total();\r\n const cost = this.tokenCounter.estimateCost();\r\n const elapsedSec = ((Date.now() - this.startedAt) / 1000).toFixed(1);\r\n\r\n const lines: string[] = [];\r\n lines.push('');\r\n lines.push(color.bold('Session report'));\r\n lines.push(color.dim('─'.repeat(40)));\r\n lines.push(` Elapsed: ${elapsedSec}s`);\r\n lines.push(` Iterations: ${this.iterations}`);\r\n lines.push(` API requests: ${this.apiRequests}`);\r\n if (this.errors > 0) {\r\n lines.push(` Errors: ${color.yellow(String(this.errors))}`);\r\n }\r\n lines.push('');\r\n lines.push(` Tokens: in ${fmtTok(u.input)} out ${fmtTok(u.output)}${u.cacheRead ? ` cacheR ${fmtTok(u.cacheRead)}` : ''}${u.cacheWrite ? ` cacheW ${fmtTok(u.cacheWrite)}` : ''}`);\r\n const cache = this.tokenCounter.cacheStats();\r\n if (cache.readTokens > 0 || cache.writeTokens > 0) {\r\n const pct = (cache.hitRatio * 100).toFixed(1);\r\n lines.push(\r\n ` Prompt cache: ${pct}% hit ${color.dim(`(${fmtTok(cache.readTokens)} read / ${fmtTok(cache.writeTokens)} write)`)}`,\r\n );\r\n }\r\n if (cost.total > 0) {\r\n lines.push(` Cost: $${cost.total.toFixed(4)}${color.dim(` (in $${cost.input.toFixed(4)} / out $${cost.output.toFixed(4)})`)}`);\r\n } else {\r\n lines.push(` Cost: ${color.dim('$0 (no pricing on this plan)')}`);\r\n }\r\n\r\n if (this.toolStats.size > 0) {\r\n lines.push('');\r\n lines.push(` ${color.bold('Tool calls')}`);\r\n const sorted = [...this.toolStats.entries()].sort(\r\n (a, b) => (b[1].ok + b[1].fail) - (a[1].ok + a[1].fail),\r\n );\r\n for (const [name, s] of sorted) {\r\n const total = s.ok + s.fail;\r\n const failPart = s.fail > 0 ? color.yellow(` (${s.fail} failed)`) : '';\r\n const avgMs = total > 0 ? Math.round(s.totalMs / total) : 0;\r\n lines.push(` ${name.padEnd(12)} ${String(total).padStart(3)}× ${color.dim(`avg ${avgMs}ms`)}${failPart}`);\r\n }\r\n }\r\n\r\n const fileActivity =\r\n this.readPaths.size > 0 ||\r\n this.editedPaths.size > 0 ||\r\n this.writtenPaths.size > 0 ||\r\n this.bytesWritten > 0;\r\n if (fileActivity) {\r\n lines.push('');\r\n lines.push(` ${color.bold('Files')}`);\r\n if (this.readPaths.size > 0)\r\n lines.push(` read: ${this.readPaths.size} ${color.dim(samplePaths(this.readPaths))}`);\r\n if (this.editedPaths.size > 0)\r\n lines.push(` edited: ${this.editedPaths.size} ${color.dim(samplePaths(this.editedPaths))}`);\r\n if (this.writtenPaths.size > 0) {\r\n const bytes = this.bytesWritten;\r\n const byteStr = bytes > 1024 ? `${(bytes / 1024).toFixed(1)}KB` : `${bytes}B`;\r\n lines.push(` written: ${this.writtenPaths.size} (${byteStr}) ${color.dim(samplePaths(this.writtenPaths))}`);\r\n }\r\n }\r\n\r\n if (this.bashCommands > 0 || this.fetches > 0) {\r\n lines.push('');\r\n if (this.bashCommands > 0) lines.push(` Shell commands: ${this.bashCommands}`);\r\n if (this.fetches > 0) lines.push(` Web fetches: ${this.fetches}`);\r\n }\r\n\r\n lines.push('');\r\n return lines.join('\\n');\r\n }\r\n\r\n render(renderer: TerminalRenderer): void {\r\n const text = this.format();\r\n if (text === null) return;\r\n renderer.write(`${text}\\n`);\r\n }\r\n}\r\n\r\nfunction samplePaths(set: Set<string>): string {\r\n const arr = [...set];\r\n if (arr.length <= 2) return arr.join(', ');\r\n return `${arr[0]}, … (+${arr.length - 1} more)`;\r\n}","import { color } from '@wrongstack/core';\r\nimport { fmtTok } from './utils.js';\r\n\r\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\r\nconst FILLED = '█';\r\nconst EMPTY = '░';\r\n\r\nexport interface ContextInfo {\r\n used: number;\r\n max: number;\r\n}\r\n\r\n/**\r\n * Minimal single-line spinner. Writes to stderr so it doesn't get mixed with\r\n * the agent's stdout output (assistant text, tool diffs). Auto-no-ops outside\r\n * a TTY so logs don't get spammed with control codes.\r\n *\r\n * When a {@link ContextInfo} is set via {@link setContext}, the spinner line\r\n * appends a compact `ctx ████░░ 42% (12k/200k)` chip so the user can see\r\n * how full the model's context window is while waiting for a response.\r\n */\r\nexport class Spinner {\r\n private timer?: NodeJS.Timeout;\r\n private frame = 0;\r\n private active = false;\r\n private label = '';\r\n private startedAt = 0;\r\n private context?: ContextInfo;\r\n private readonly out: NodeJS.WriteStream;\r\n private readonly enabled: boolean;\r\n\r\n constructor(out: NodeJS.WriteStream = process.stderr) {\r\n this.out = out;\r\n this.enabled = Boolean(out.isTTY) && !process.env.NO_COLOR;\r\n }\r\n\r\n start(label: string): void {\r\n if (!this.enabled || this.active) return;\r\n this.label = label;\r\n this.frame = 0;\r\n this.active = true;\r\n this.startedAt = Date.now();\r\n this.render();\r\n this.timer = setInterval(() => {\r\n this.frame = (this.frame + 1) % FRAMES.length;\r\n this.render();\r\n }, 80);\r\n this.timer.unref?.();\r\n }\r\n\r\n stop(): void {\r\n if (!this.active) return;\r\n this.active = false;\r\n if (this.timer) clearInterval(this.timer);\r\n this.timer = undefined;\r\n this.clearLine();\r\n }\r\n\r\n /** Stop and persist a one-line note where the spinner was (e.g. \"✓ done in 1.4s\"). */\r\n stopWith(note: string): void {\r\n this.stop();\r\n this.out.write(`${note}\\n`);\r\n }\r\n\r\n /** Update the live context-window chip shown on the spinner line. */\r\n setContext(ctx: ContextInfo | undefined): void {\r\n this.context = ctx;\r\n }\r\n\r\n private render(): void {\r\n const elapsed = ((Date.now() - this.startedAt) / 1000).toFixed(1);\r\n let line = `${color.amber(FRAMES[this.frame] ?? '')} ${this.label} ${color.dim(`${elapsed}s`)}`;\r\n if (this.context && this.context.max > 0) {\r\n line += ' ' + renderContextChip(this.context);\r\n }\r\n this.clearLine();\r\n this.out.write(line);\r\n }\r\n\r\n private clearLine(): void {\r\n if (!this.enabled) return;\r\n this.out.write('\\r\\x1b[2K');\r\n }\r\n}\r\n\r\nfunction renderContextChip(ctx: ContextInfo): string {\r\n const ratio = Math.max(0, Math.min(1, ctx.used / ctx.max));\r\n const pct = Math.round(ratio * 100);\r\n const chipColor = ratio >= 0.85 ? color.red : ratio >= 0.65 ? color.yellow : color.cyan;\r\n const bar = renderProgress(ratio, 8);\r\n return (\r\n color.dim('ctx ') +\r\n chipColor(bar) +\r\n chipColor(` ${pct}%`) +\r\n color.dim(` (${fmtTok(ctx.used)}/${fmtTok(ctx.max)})`)\r\n );\r\n}\r\n\r\nfunction renderProgress(ratio: number, width: number): string {\r\n const clamped = Math.max(0, Math.min(1, ratio));\r\n const filled = clamped === 0 ? 0 : Math.max(1, Math.round(clamped * width));\r\n const capped = Math.min(width, filled);\r\n return FILLED.repeat(capped) + EMPTY.repeat(width - capped);\r\n}\r\n","import * as fs from 'node:fs/promises';\r\nimport * as os from 'node:os';\r\nimport * as path from 'node:path';\r\nimport {\r\n type Config,\r\n type WstackPaths,\r\n DefaultConfigLoader,\r\n DefaultPathResolver,\r\n DefaultSecretVault,\r\n migratePlaintextSecrets,\r\n resolveWstackPaths,\r\n} from '@wrongstack/core';\r\n\r\nexport interface BootPaths {\r\n cwd: string;\r\n projectRoot: string;\r\n userHome: string;\r\n wpaths: WstackPaths;\r\n pathResolver: DefaultPathResolver;\r\n}\r\n\r\nexport interface BootConfigResult {\r\n paths: BootPaths;\r\n config: Config;\r\n vault: DefaultSecretVault;\r\n}\r\n\r\n/**\r\n * Resolve paths and load config. This covers:\r\n * - cwd/project resolution\r\n * - wstack paths\r\n * - secret vault creation + plaintext migration\r\n * - config loading with CLI flag overrides\r\n */\r\nexport async function bootConfig(flags: Record<string, string | boolean>): Promise<BootConfigResult> {\r\n const cwd = typeof flags['cwd'] === 'string' ? path.resolve(flags['cwd']) : process.cwd();\r\n const pathResolver = new DefaultPathResolver(cwd);\r\n const projectRoot = pathResolver.projectRoot;\r\n const userHome = os.homedir();\r\n const wpaths = resolveWstackPaths({ projectRoot, userHome });\r\n await ensureProjectMeta(wpaths, projectRoot);\r\n\r\n // Vault must come first so the config loader can decrypt apiKey-like\r\n // fields. It lazily creates ~/.wrongstack/.key on first encrypt/decrypt.\r\n const vault = new DefaultSecretVault({ keyFile: wpaths.secretsKey });\r\n\r\n // Auto-encrypt any plaintext secrets users still have in their config\r\n // files (left over from before the vault existed, or hand-written).\r\n // Silent no-op for already-encrypted configs.\r\n for (const file of [wpaths.globalConfig, wpaths.projectLocalConfig]) {\r\n try {\r\n const { migrated } = await migratePlaintextSecrets(file, vault);\r\n if (migrated > 0) {\r\n process.stderr.write(`[wstack] Encrypted ${migrated} plaintext secret(s) in ${file}\\n`);\r\n }\r\n } catch {\r\n // best-effort — never block boot on migration issues\r\n }\r\n }\r\n\r\n const configLoader = new DefaultConfigLoader({ paths: wpaths, vault });\r\n const config = await configLoader.load({ cliFlags: flagsToConfigPatch(flags) });\r\n\r\n return {\r\n paths: { cwd, projectRoot, userHome, wpaths, pathResolver },\r\n config,\r\n vault,\r\n };\r\n}\r\n\r\nfunction flagsToConfigPatch(flags: Record<string, string | boolean>): Partial<Config> {\r\n const patch: Partial<Config> = {};\r\n if (typeof flags['provider'] === 'string') patch.provider = flags['provider'];\r\n if (typeof flags['model'] === 'string') patch.model = flags['model'];\r\n if (typeof flags['cwd'] === 'string') patch.cwd = flags['cwd'];\r\n if (typeof flags['log-level'] === 'string') {\r\n patch.log = { level: flags['log-level'] as Config['log']['level'] };\r\n } else if (flags['verbose']) {\r\n patch.log = { level: 'debug' };\r\n } else if (flags['trace']) {\r\n patch.log = { level: 'trace' };\r\n }\r\n if (flags['yolo']) patch.yolo = true;\r\n if (flags['no-features']) {\r\n patch.features = {\r\n mcp: false,\r\n plugins: false,\r\n memory: false,\r\n modelsRegistry: false,\r\n skills: false,\r\n };\r\n }\r\n return patch;\r\n}\r\n\r\nasync function ensureProjectMeta(paths: WstackPaths, projectRoot: string): Promise<void> {\r\n try {\r\n await fs.mkdir(paths.projectDir, { recursive: true });\r\n const meta = {\r\n hash: paths.projectHash,\r\n root: projectRoot,\r\n lastSeen: new Date().toISOString(),\r\n };\r\n await fs.writeFile(paths.projectMeta, JSON.stringify(meta, null, 2));\r\n } catch {\r\n // best-effort\r\n }\r\n}\r\n","/**\n * L1-E: Multi-agent CLI integration. The coordinator + per-task agent\n * factory is created lazily on the first `/spawn` so users who never use\n * subagents don't pay the construction cost.\n */\nimport { randomUUID } from 'node:crypto';\nimport {\n Agent,\n type Container,\n Context,\n type Config,\n type ConfigStore,\n DefaultMultiAgentCoordinator,\n EventBus,\n makeAgentSubagentRunner,\n type MultiAgentCoordinator,\n type Provider,\n type ProviderRegistry,\n type SessionWriter,\n type SystemPromptBuilder,\n type TaskResult,\n type Tool,\n type ToolRegistry,\n type TokenCounter,\n TOKENS,\n createDefaultPipelines,\n} from '@wrongstack/core';\nimport type { TextBlock } from '@wrongstack/core';\nimport { makeProviderFromConfig } from '@wrongstack/providers';\n\nexport interface MultiAgentDeps {\n container: Container;\n toolRegistry: ToolRegistry;\n providerRegistry: ProviderRegistry;\n configStore: ConfigStore;\n events: EventBus;\n systemPromptBuilder: SystemPromptBuilder;\n session: SessionWriter;\n tokenCounter: TokenCounter;\n projectRoot: string;\n cwd: string;\n}\n\n/**\n * Lazy holder — created on first /spawn call, reused across the session\n * so /agents can list everyone running.\n */\nexport class MultiAgentHost {\n private coordinator?: MultiAgentCoordinator;\n private readonly pending = new Map<string, { description: string; subagentId: string }>();\n private readonly results: TaskResult[] = [];\n\n constructor(private readonly deps: MultiAgentDeps) {}\n\n private async ensureCoordinator(): Promise<MultiAgentCoordinator> {\n if (this.coordinator) return this.coordinator;\n const config: Config = this.deps.configStore.get() as Config;\n\n const factory = async (subCfg: { model?: string; tools?: string[] }) => {\n const events = new EventBus();\n const provider = await this.buildSubagentProvider(config);\n\n // Fresh context per subagent — explicit isolation.\n const baseSystem: TextBlock[] = await this.deps.systemPromptBuilder.build({\n cwd: this.deps.cwd,\n projectRoot: this.deps.projectRoot,\n tools: this.filterTools(subCfg.tools),\n model: subCfg.model ?? config.model,\n provider: config.provider,\n });\n\n // Reuse session id and append channel; subagent events get tagged\n // by source via the event bus rather than persisted to a separate\n // file. Keeps replay simple.\n const parentSession = this.deps.session;\n const subSession: SessionWriter = {\n id: parentSession.id,\n append: (ev) => parentSession.append({ ...ev }),\n } as SessionWriter;\n\n const ctx = new Context({\n systemPrompt: baseSystem,\n provider,\n session: subSession,\n // Placeholder — Agent.run() overwrites ctx.signal with the live\n // per-run signal (see core/agent.ts run()). Tools/middleware that\n // read ctx.signal after construction will see the runtime signal,\n // not this one. Kept as `new AbortController().signal` so the\n // initial value is non-null/non-aborted.\n signal: new AbortController().signal,\n tokenCounter: this.deps.tokenCounter,\n cwd: this.deps.cwd,\n projectRoot: this.deps.projectRoot,\n model: subCfg.model ?? config.model,\n tools: this.filterTools(subCfg.tools),\n });\n\n const agent = new Agent({\n container: this.deps.container,\n tools: this.subagentToolRegistry(subCfg.tools),\n providers: this.deps.providerRegistry,\n events,\n pipelines: createDefaultPipelines(),\n context: ctx,\n });\n\n return { agent, events };\n };\n\n const runner = makeAgentSubagentRunner({ factory });\n\n this.coordinator = new DefaultMultiAgentCoordinator(\n {\n coordinatorId: randomUUID(),\n doneCondition: { type: 'all_tasks_done' },\n maxConcurrent: 2,\n defaultBudget: { maxToolCalls: 20, maxIterations: 20, timeoutMs: 120_000 },\n },\n { runner },\n );\n\n // Drain task.completed into our local result buffer for /agents\n (this.coordinator as unknown as { on: Function }).on(\n 'task.completed',\n ({ task, result }: { task: { id: string }; result: TaskResult }) => {\n this.results.push(result);\n this.pending.delete(task.id);\n },\n );\n\n return this.coordinator;\n }\n\n private async buildSubagentProvider(config: Config): Promise<Provider> {\n const newCfg = config.providers?.[config.provider] ?? {\n type: config.provider,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n };\n return makeProviderFromConfig(config.provider, {\n ...newCfg,\n type: config.provider,\n });\n }\n\n /** Returns a tool slice for the subagent — full set unless restricted. */\n private filterTools(allow?: string[]): Tool[] {\n const all = this.deps.toolRegistry.list();\n if (!allow || allow.length === 0) return all;\n const allowSet = new Set(allow);\n return all.filter((t) => allowSet.has(t.name));\n }\n\n private subagentToolRegistry(allow?: string[]): ToolRegistry {\n if (!allow || allow.length === 0) return this.deps.toolRegistry;\n // Build a filtered registry by cloning entries.\n const cloneCtor = this.deps.toolRegistry.constructor as new () => ToolRegistry;\n const sub = new cloneCtor();\n for (const t of this.filterTools(allow)) sub.register(t);\n return sub;\n }\n\n /** Spawn a fresh subagent and assign a single task. Returns task id. */\n async spawn(description: string): Promise<{ subagentId: string; taskId: string }> {\n const coord = await this.ensureCoordinator();\n const spawned = await coord.spawn({\n name: 'adhoc',\n role: 'general',\n maxToolCalls: 20,\n maxIterations: 20,\n });\n const taskId = randomUUID();\n this.pending.set(taskId, { description, subagentId: spawned.subagentId });\n await coord.assign({\n id: taskId,\n description,\n subagentId: spawned.subagentId,\n maxToolCalls: 20,\n });\n return { subagentId: spawned.subagentId, taskId };\n }\n\n status(): {\n pending: { taskId: string; description: string; subagentId: string }[];\n completed: TaskResult[];\n summary: string;\n } {\n const pending = Array.from(this.pending.entries()).map(([taskId, v]) => ({\n taskId,\n description: v.description,\n subagentId: v.subagentId,\n }));\n const summary = !this.coordinator\n ? 'No subagents have been spawned.'\n : `${pending.length} pending, ${this.results.length} completed.`;\n return { pending, completed: this.results, summary };\n }\n\n async stopAll(): Promise<void> {\n if (this.coordinator) {\n await this.coordinator.stopAll();\n }\n }\n}\n// Workaround: TOKENS reference satisfies unused-import lint without being\n// active runtime usage — included for clarity that the coordinator\n// shares the container's permission policy etc. via the agent factory.\nvoid TOKENS;\n","import * as fs from 'node:fs/promises';\r\nimport {\r\n color,\r\n atomicWrite,\r\n encryptConfigSecrets,\r\n decryptConfigSecrets,\r\n type ProviderConfig,\r\n type ProviderApiKey,\r\n type SecretVault,\r\n type ModelsRegistry,\r\n type ResolvedProvider,\r\n type WireFamily,\r\n} from '@wrongstack/core';\r\nimport type { TerminalRenderer } from './renderer.js';\r\nimport type { ReadlineInputReader } from './input-reader.js';\r\n\r\nexport interface AuthMenuDeps {\r\n renderer: TerminalRenderer;\r\n reader: ReadlineInputReader;\r\n modelsRegistry: ModelsRegistry;\r\n vault: SecretVault;\r\n globalConfigPath: string;\r\n}\r\n\r\n/**\r\n * Interactive auth manager. Shows saved providers + keys, lets the user\r\n * add/update/delete keys, set the active key per provider, or add a key\r\n * for any provider in the models.dev catalog. Loops until the user exits.\r\n *\r\n * The legacy single-key `apiKey` field is migrated to `apiKeys[]` lazily\r\n * on first edit, so users who set up under the old schema upgrade\r\n * transparently the first time they open this menu.\r\n */\r\nexport async function runAuthMenu(deps: AuthMenuDeps): Promise<number> {\r\n for (;;) {\r\n const providers = await loadProviders(deps);\r\n renderTopMenu(deps.renderer, providers);\r\n\r\n const ids = Object.keys(providers).sort();\r\n const choice = (await deps.reader.readLine(`\\n${color.amber('?')} Pick: `)).trim().toLowerCase();\r\n\r\n if (!choice || choice === 'q' || choice === 'quit' || choice === 'exit') {\r\n deps.renderer.write(color.dim('Done.\\n'));\r\n return 0;\r\n }\r\n\r\n if (choice === 'a' || choice === 'add') {\r\n await addForNewProvider(deps);\r\n continue;\r\n }\r\n\r\n if (choice === 'c' || choice === 'custom') {\r\n await addCustomProvider(deps);\r\n continue;\r\n }\r\n\r\n const idx = Number.parseInt(choice, 10);\r\n if (!Number.isNaN(idx) && idx >= 1 && idx <= ids.length) {\r\n const pid = ids[idx - 1]!;\r\n await manageProvider(pid, deps);\r\n continue;\r\n }\r\n\r\n // Try matching by provider id directly.\r\n const byId = ids.find((id) => id.toLowerCase() === choice);\r\n if (byId) {\r\n await manageProvider(byId, deps);\r\n continue;\r\n }\r\n\r\n deps.renderer.writeError(`Unknown selection: \"${choice}\"`);\r\n }\r\n}\r\n\r\nfunction renderTopMenu(renderer: TerminalRenderer, providers: Record<string, ProviderConfig>): void {\r\n renderer.write(`\\n${color.bold('WrongStack')} ${color.dim('— API keys')}\\n\\n`);\r\n const ids = Object.keys(providers).sort();\r\n if (ids.length === 0) {\r\n renderer.write(color.dim(' No providers configured yet.\\n'));\r\n } else {\r\n renderer.write(` ${color.dim('Saved providers:')}\\n`);\r\n let idx = 1;\r\n for (const id of ids) {\r\n const cfg = providers[id]!;\r\n const keys = normalizeKeys(cfg);\r\n const active = activeLabel(cfg, keys);\r\n const summary = keys.length === 0\r\n ? color.dim('(no keys)')\r\n : keys.length === 1\r\n ? maskedKey(keys[0]!.apiKey)\r\n : `${color.dim(`${keys.length} keys`)} ${color.dim('active:')} ${color.bold(active ?? '?')} ${maskedKey(keys.find((k) => k.label === active)?.apiKey ?? keys[0]!.apiKey)}`;\r\n const fam = cfg.family ? color.dim(`[${cfg.family}]`) : '';\r\n const aliasHint = cfg.type && cfg.type !== id ? color.dim(`→ ${cfg.type}`) : '';\r\n renderer.write(\r\n ` ${color.dim(`${idx}.`.padStart(4))} ${id.padEnd(22)} ${fam} ${aliasHint} ${summary}\\n`,\r\n );\r\n idx++;\r\n }\r\n }\r\n renderer.write(`\\n ${color.dim('Actions:')}\\n`);\r\n renderer.write(` ${color.bold('a')} Add key for a new provider (from catalog)\\n`);\r\n renderer.write(` ${color.bold('c')} Add custom provider (type + family + baseUrl)\\n`);\r\n renderer.write(` ${color.bold('q')} Quit\\n`);\r\n if (ids.length > 0) {\r\n renderer.write(color.dim(`\\n Pick a number to manage that provider's keys.\\n`));\r\n }\r\n}\r\n\r\nasync function manageProvider(providerId: string, deps: AuthMenuDeps): Promise<void> {\r\n for (;;) {\r\n const providers = await loadProviders(deps);\r\n const cfg = providers[providerId];\r\n if (!cfg) {\r\n deps.renderer.writeError(`Provider \"${providerId}\" no longer in config.`);\r\n return;\r\n }\r\n const keys = normalizeKeys(cfg);\r\n const active = activeLabel(cfg, keys);\r\n\r\n deps.renderer.write(`\\n${color.bold(providerId)} ${cfg.family ? color.dim(`[${cfg.family}]`) : color.amber('[no family]')}\\n`);\r\n deps.renderer.write(\r\n color.dim(` type: ${cfg.type ?? providerId}\\n`) +\r\n color.dim(` family: ${cfg.family ?? '(unset → resolved from models.dev when type matches)'}\\n`) +\r\n color.dim(` baseUrl: ${cfg.baseUrl ?? '(unset → catalog default)'}\\n`),\r\n );\r\n if (cfg.envVars && cfg.envVars.length > 0) {\r\n deps.renderer.write(color.dim(` envVars: ${cfg.envVars.join(', ')}\\n`));\r\n }\r\n if (cfg.models && cfg.models.length > 0) {\r\n deps.renderer.write(color.dim(` models: ${cfg.models.join(', ')}\\n`));\r\n }\r\n if (keys.length === 0) {\r\n deps.renderer.write(color.dim(' (no keys saved)\\n'));\r\n } else {\r\n for (let i = 0; i < keys.length; i++) {\r\n const k = keys[i]!;\r\n const marker = k.label === active ? color.green('●') : color.dim('○');\r\n deps.renderer.write(\r\n ` ${color.dim(`${i + 1}.`.padStart(4))} ${marker} ${k.label.padEnd(20)} ${maskedKey(k.apiKey)} ${color.dim(k.createdAt)}\\n`,\r\n );\r\n }\r\n }\r\n\r\n deps.renderer.write(`\\n ${color.dim('Actions:')}\\n`);\r\n deps.renderer.write(` ${color.bold('a')} Add another key\\n`);\r\n if (keys.length > 0) {\r\n deps.renderer.write(` ${color.bold('u')} <n> Update key <n>\\n`);\r\n deps.renderer.write(` ${color.bold('d')} <n> Delete key <n>\\n`);\r\n deps.renderer.write(` ${color.bold('s')} <n> Set key <n> as active\\n`);\r\n }\r\n deps.renderer.write(` ${color.bold('f')} Edit family\\n`);\r\n deps.renderer.write(` ${color.bold('B')} Edit baseUrl\\n`);\r\n deps.renderer.write(` ${color.bold('m')} Edit visible model list\\n`);\r\n deps.renderer.write(` ${color.bold('x')} Remove this provider entirely\\n`);\r\n deps.renderer.write(` ${color.bold('b')} Back\\n`);\r\n\r\n const raw = (await deps.reader.readLine(`\\n${color.amber('?')} ${providerId} > `)).trim();\r\n if (!raw || raw === 'b' || raw === 'back') return;\r\n\r\n const [verb, argRaw] = raw.split(/\\s+/, 2);\r\n const arg = argRaw ? Number.parseInt(argRaw, 10) : Number.NaN;\r\n\r\n if (verb === 'a' || verb === 'add') {\r\n await addKeyForProvider(providerId, deps, cfg);\r\n continue;\r\n }\r\n if (verb === 'x' || verb === 'remove') {\r\n const confirm = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Remove provider \"${providerId}\" and ${keys.length} key(s)? ${color.dim('[y/N]')} `,\r\n )).trim().toLowerCase();\r\n if (confirm === 'y' || confirm === 'yes') {\r\n await mutateProviders(deps, (all) => {\r\n delete all[providerId];\r\n });\r\n deps.renderer.write(` ${color.green('✓')} Removed ${providerId}.\\n`);\r\n return;\r\n }\r\n continue;\r\n }\r\n if (verb === 'u' || verb === 'update') {\r\n if (!Number.isFinite(arg) || arg < 1 || arg > keys.length) {\r\n deps.renderer.writeError(`Usage: u <1-${keys.length}>`);\r\n continue;\r\n }\r\n const target = keys[arg - 1]!;\r\n const newKey = await readKeyInput(deps, `Updated key for ${target.label}`);\r\n if (!newKey) continue;\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n const list = normalizeKeys(p).map((k) =>\r\n k.label === target.label ? { ...k, apiKey: newKey, createdAt: nowIso() } : k,\r\n );\r\n writeKeysBack(p, list);\r\n });\r\n deps.renderer.write(` ${color.green('✓')} Updated ${providerId}/${target.label}.\\n`);\r\n continue;\r\n }\r\n if (verb === 'd' || verb === 'delete' || verb === 'rm') {\r\n if (!Number.isFinite(arg) || arg < 1 || arg > keys.length) {\r\n deps.renderer.writeError(`Usage: d <1-${keys.length}>`);\r\n continue;\r\n }\r\n const target = keys[arg - 1]!;\r\n const confirm = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Delete key \"${target.label}\" (${maskedKey(target.apiKey)})? ${color.dim('[y/N]')} `,\r\n )).trim().toLowerCase();\r\n if (confirm !== 'y' && confirm !== 'yes') continue;\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n const list = normalizeKeys(p).filter((k) => k.label !== target.label);\r\n writeKeysBack(p, list);\r\n if (p.activeKey === target.label) {\r\n p.activeKey = list[0]?.label;\r\n }\r\n });\r\n deps.renderer.write(` ${color.green('✓')} Deleted ${providerId}/${target.label}.\\n`);\r\n continue;\r\n }\r\n if (verb === 'f' || verb === 'family') {\r\n const current = cfg.family ?? '';\r\n const ans = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Family ${color.dim(`(anthropic | openai | openai-compatible | google, empty = unset, current: ${current || 'unset'})`)}: `,\r\n )).trim() as WireFamily | '';\r\n if (ans !== '' && !['anthropic', 'openai', 'openai-compatible', 'google'].includes(ans)) {\r\n deps.renderer.writeError(`Invalid family: \"${ans}\"`);\r\n continue;\r\n }\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n if (ans === '') delete p.family;\r\n else p.family = ans;\r\n });\r\n deps.renderer.write(` ${color.green('✓')} family → ${ans || '(unset)'}\\n`);\r\n continue;\r\n }\r\n if (verb === 'B' || verb === 'baseurl' || verb === 'base-url') {\r\n const current = cfg.baseUrl ?? '';\r\n const ans = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Base URL ${color.dim(`(empty = unset, current: ${current || 'unset'})`)}: `,\r\n )).trim();\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n if (ans === '') delete p.baseUrl;\r\n else p.baseUrl = ans;\r\n });\r\n deps.renderer.write(` ${color.green('✓')} baseUrl → ${ans || '(unset)'}\\n`);\r\n continue;\r\n }\r\n if (verb === 'm' || verb === 'models') {\r\n const current = (cfg.models ?? []).join(', ');\r\n const ans = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Model ids ${color.dim(`(comma-separated, empty = catalog default, current: ${current || 'none'})`)}: `,\r\n )).trim();\r\n const list = ans\r\n ? ans.split(',').map((s) => s.trim()).filter(Boolean)\r\n : [];\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n if (list.length === 0) delete p.models;\r\n else p.models = list;\r\n });\r\n deps.renderer.write(` ${color.green('✓')} models → ${list.length === 0 ? '(catalog default)' : list.join(', ')}\\n`);\r\n continue;\r\n }\r\n if (verb === 's' || verb === 'set' || verb === 'active') {\r\n if (!Number.isFinite(arg) || arg < 1 || arg > keys.length) {\r\n deps.renderer.writeError(`Usage: s <1-${keys.length}>`);\r\n continue;\r\n }\r\n const target = keys[arg - 1]!;\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId];\r\n if (!p) return;\r\n // Make sure the apiKeys[] form is canonical before flipping active.\r\n const list = normalizeKeys(p);\r\n writeKeysBack(p, list);\r\n p.activeKey = target.label;\r\n });\r\n deps.renderer.write(` ${color.green('✓')} Active key for ${providerId} → ${color.bold(target.label)}.\\n`);\r\n continue;\r\n }\r\n deps.renderer.writeError(`Unknown action: \"${raw}\"`);\r\n }\r\n}\r\n\r\n/**\r\n * Pick a provider from the models.dev catalog (grouped by family) and add\r\n * a key for it. Catalog lookup populates family/baseUrl/envVars defaults.\r\n * When the catalog is unavailable we still let the user type a provider\r\n * id and family manually so the offline path keeps working.\r\n */\r\nasync function addForNewProvider(deps: AuthMenuDeps): Promise<void> {\r\n let catalog: ResolvedProvider[] = [];\r\n try {\r\n catalog = (await deps.modelsRegistry.listProviders()).filter((p) => p.family !== 'unsupported');\r\n } catch {\r\n deps.renderer.writeWarning('Catalog unavailable — falling back to manual entry.');\r\n }\r\n\r\n if (catalog.length === 0) {\r\n // Manual entry path\r\n const pid = (await deps.reader.readLine(` ${color.amber('?')} Provider id: `)).trim();\r\n if (!pid) return;\r\n const fam = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Family (anthropic/openai/openai-compatible/google): `,\r\n )).trim() as WireFamily;\r\n const baseUrl = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Base URL ${color.dim('(optional)')}: `,\r\n )).trim();\r\n await addKeyForProvider(pid, deps, {\r\n type: pid,\r\n family: fam || undefined,\r\n ...(baseUrl ? { baseUrl } : {}),\r\n });\r\n return;\r\n }\r\n\r\n // Group catalog by family, optionally narrowed by a substring filter\r\n // and/or hiding already-saved entries. The catalog has 120+ entries —\r\n // without a filter the openai-compatible list alone scrolls off-screen,\r\n // so types like \"zai-coding-plan\" get easy to miss.\r\n const saved = new Set(Object.keys(await loadProviders(deps)));\r\n deps.renderer.write(\r\n color.dim(` Catalog has ${catalog.length} providers. Filter by name to narrow, or \"s\" for unsaved-only.\\n`),\r\n );\r\n const filterRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Filter ${color.dim('(substring of id/name, \"s\" for unsaved-only, empty = all)')}: `,\r\n )).trim();\r\n const filterLc = filterRaw.toLowerCase();\r\n const showUnsavedOnly = filterLc === 's' || filterLc === 'unsaved';\r\n const matches = (p: ResolvedProvider): boolean => {\r\n if (showUnsavedOnly) return !saved.has(p.id);\r\n if (!filterLc) return true;\r\n return p.id.toLowerCase().includes(filterLc) || p.name.toLowerCase().includes(filterLc);\r\n };\r\n\r\n const byFamily = new Map<WireFamily, ResolvedProvider[]>();\r\n let filteredCount = 0;\r\n for (const p of catalog) {\r\n if (!matches(p)) continue;\r\n filteredCount++;\r\n const list = byFamily.get(p.family) ?? [];\r\n list.push(p);\r\n byFamily.set(p.family, list);\r\n }\r\n\r\n if (filteredCount === 0) {\r\n deps.renderer.writeError(\r\n `No providers match \"${filterRaw}\". Try a shorter substring or check \\`wstack providers\\` for valid ids.`,\r\n );\r\n return;\r\n }\r\n if (filterRaw && !showUnsavedOnly) {\r\n deps.renderer.write(\r\n color.dim(` ${filteredCount} match${filteredCount === 1 ? '' : 'es'} for \"${filterRaw}\".\\n`),\r\n );\r\n }\r\n\r\n const ordered: ResolvedProvider[] = [];\r\n const familyOrder: WireFamily[] = ['anthropic', 'openai', 'google', 'openai-compatible'];\r\n let idx = 1;\r\n deps.renderer.write('\\n');\r\n for (const fam of familyOrder) {\r\n const list = byFamily.get(fam);\r\n if (!list || list.length === 0) continue;\r\n deps.renderer.write(` ${color.bold(fam)}\\n`);\r\n for (const p of list) {\r\n const savedMark = saved.has(p.id) ? color.cyan('◉') : color.dim('○');\r\n const env = p.envVars[0] ? color.dim(`[${p.envVars[0]}]`) : '';\r\n deps.renderer.write(\r\n ` ${color.dim(`${idx}.`.padStart(4))} ${savedMark} ${p.id.padEnd(22)} ${color.dim(p.name)} ${env}\\n`,\r\n );\r\n ordered.push(p);\r\n idx++;\r\n }\r\n }\r\n deps.renderer.write(`\\n ${color.dim('◉ already saved ○ no key yet')}\\n`);\r\n\r\n const answer = (await deps.reader.readLine(\r\n `\\n${color.amber('?')} Pick (1-${ordered.length}) or type provider id: `,\r\n )).trim();\r\n if (!answer) return;\r\n\r\n let chosen: ResolvedProvider | undefined;\r\n const num = Number.parseInt(answer, 10);\r\n if (!Number.isNaN(num) && num >= 1 && num <= ordered.length) {\r\n chosen = ordered[num - 1];\r\n } else {\r\n chosen = ordered.find((p) => p.id.toLowerCase() === answer.toLowerCase())\r\n ?? catalog.find((p) => p.id.toLowerCase() === answer.toLowerCase());\r\n }\r\n if (!chosen) {\r\n deps.renderer.writeError(`No such provider: \"${answer}\"`);\r\n return;\r\n }\r\n\r\n // Always show family + baseUrl as inline prompts with catalog defaults\r\n // so the user can override either one without a separate confirmation\r\n // step. Press Enter to accept the catalog value, or type a new one to\r\n // change it. Useful for routing a catalog-known id through a custom\r\n // proxy or a different wire family (e.g. \"anthropic\"-id provider\r\n // through an openai-compatible gateway).\r\n deps.renderer.write(\r\n color.dim(`\\n Defaults from models.dev — press Enter to keep, or type a new value.\\n`),\r\n );\r\n const famRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Family ${color.dim(`[${chosen.family}]`)}: `,\r\n )).trim();\r\n let family: WireFamily = chosen.family;\r\n if (famRaw) {\r\n if (!['anthropic', 'openai', 'openai-compatible', 'google'].includes(famRaw)) {\r\n deps.renderer.writeError(`Invalid family: \"${famRaw}\" (must be anthropic | openai | openai-compatible | google).`);\r\n return;\r\n }\r\n family = famRaw as WireFamily;\r\n }\r\n const baseRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Base URL ${color.dim(`[${chosen.apiBase ?? 'unset'}]`)}: `,\r\n )).trim();\r\n const baseUrl: string | undefined = baseRaw || chosen.apiBase;\r\n\r\n // Pick the storage alias (= map key under `providers`). Two reasons to\r\n // make this distinct from the catalog id:\r\n // 1. The user may want the SAME catalog provider saved twice with\r\n // different family/baseUrl (e.g. zai-coding-plan once as\r\n // openai-compatible, once as anthropic) — different aliases let\r\n // both entries coexist.\r\n // 2. The CLI launches via `--provider <alias>`, so a short custom\r\n // name like \"zai-claude\" is friendlier than \"zai-coding-plan-anthropic\".\r\n // Auto-suggest a disambiguated alias when family diverges from the\r\n // catalog default, since that's the signal the user is creating a\r\n // second variant — not just adding another key to the same profile.\r\n const providersNow = await loadProviders(deps);\r\n let suggestedAlias = chosen.id;\r\n if (family !== chosen.family) {\r\n let candidate = `${chosen.id}-${family}`;\r\n let n = 2;\r\n while (providersNow[candidate]) {\r\n candidate = `${chosen.id}-${family}-${n}`;\r\n n++;\r\n }\r\n suggestedAlias = candidate;\r\n }\r\n const aliasRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Save under alias ${color.dim(`[${suggestedAlias}]`)} ${color.dim('(used as `--provider <alias>`)')}: `,\r\n )).trim();\r\n const alias = aliasRaw || suggestedAlias;\r\n\r\n // Block clobbering an unrelated existing entry. Same alias is fine if\r\n // the user is intentionally adding another KEY to the same profile —\r\n // but only when family + baseUrl match what's already saved. Otherwise\r\n // we'd silently overwrite their settings and pile a key into the wrong\r\n // place (exactly the bug that motivated the alias prompt).\r\n const existing = providersNow[alias];\r\n if (existing) {\r\n const sameFamily = (existing.family ?? chosen.family) === family;\r\n const sameBase = (existing.baseUrl ?? chosen.apiBase) === baseUrl;\r\n if (!sameFamily || !sameBase) {\r\n deps.renderer.writeError(\r\n `Alias \"${alias}\" already exists with different family/baseUrl.\\n ` +\r\n `Existing: family=${existing.family ?? '(unset)'}, baseUrl=${existing.baseUrl ?? '(unset)'}\\n ` +\r\n `New: family=${family}, baseUrl=${baseUrl ?? '(unset)'}\\n ` +\r\n `Pick a different alias to keep them separate.`,\r\n );\r\n return;\r\n }\r\n }\r\n\r\n await addKeyForProvider(alias, deps, {\r\n type: chosen.id,\r\n family,\r\n baseUrl,\r\n envVars: chosen.envVars,\r\n });\r\n}\r\n\r\n/**\r\n * Add a fully user-defined provider that bypasses the models.dev catalog.\r\n * The user picks the type (registry id), wire family, and base URL — all\r\n * three are stored on the entry so the CLI can construct the provider\r\n * via `makeProviderFromConfig` at boot without a catalog lookup.\r\n */\r\nasync function addCustomProvider(deps: AuthMenuDeps): Promise<void> {\r\n deps.renderer.write(`\\n${color.bold('Custom provider')} ${color.dim('— for local models or proxies not in the models.dev catalog.')}\\n`);\r\n const type = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Provider id ${color.dim('(e.g. \"local-llama\", \"my-proxy\")')}: `,\r\n )).trim();\r\n if (!type) return;\r\n\r\n const existing = (await loadProviders(deps))[type];\r\n if (existing) {\r\n deps.renderer.writeWarning(`\"${type}\" already exists. Pick it from the main menu to edit.`);\r\n return;\r\n }\r\n\r\n const familyRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Wire family ${color.dim('(anthropic | openai | openai-compatible | google)')}: `,\r\n )).trim();\r\n if (!['anthropic', 'openai', 'openai-compatible', 'google'].includes(familyRaw)) {\r\n deps.renderer.writeError(`Invalid family: \"${familyRaw}\"`);\r\n return;\r\n }\r\n const family = familyRaw as WireFamily;\r\n\r\n const baseUrl = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Base URL ${color.dim('(e.g. http://localhost:11434/v1, leave empty if not needed)')}: `,\r\n )).trim();\r\n\r\n const modelsRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Model ids ${color.dim('(comma-separated, optional)')}: `,\r\n )).trim();\r\n const models = modelsRaw\r\n ? modelsRaw.split(',').map((s) => s.trim()).filter(Boolean)\r\n : undefined;\r\n\r\n const envVarsRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Env var names ${color.dim('(comma-separated, optional fallback for the key)')}: `,\r\n )).trim();\r\n const envVars = envVarsRaw\r\n ? envVarsRaw.split(',').map((s) => s.trim()).filter(Boolean)\r\n : undefined;\r\n\r\n await addKeyForProvider(type, deps, {\r\n type,\r\n family,\r\n ...(baseUrl ? { baseUrl } : {}),\r\n ...(models ? { models } : {}),\r\n ...(envVars ? { envVars } : {}),\r\n });\r\n}\r\n\r\nasync function addKeyForProvider(\r\n providerId: string,\r\n deps: AuthMenuDeps,\r\n template: Partial<ProviderConfig>,\r\n): Promise<void> {\r\n const providers = await loadProviders(deps);\r\n const existing = providers[providerId];\r\n const existingKeys = existing ? normalizeKeys(existing) : [];\r\n const usedLabels = new Set(existingKeys.map((k) => k.label));\r\n\r\n // Suggest a sensible default label\r\n let defaultLabel = 'default';\r\n if (usedLabels.has(defaultLabel)) {\r\n let n = 2;\r\n while (usedLabels.has(`key${n}`)) n++;\r\n defaultLabel = `key${n}`;\r\n }\r\n\r\n const labelRaw = (await deps.reader.readLine(\r\n ` ${color.amber('?')} Label for this key ${color.dim(`[${defaultLabel}]`)}: `,\r\n )).trim();\r\n const label = labelRaw || defaultLabel;\r\n if (usedLabels.has(label)) {\r\n deps.renderer.writeError(`Label \"${label}\" already used for ${providerId}. Use update (u) instead.`);\r\n return;\r\n }\r\n\r\n const apiKey = await readKeyInput(deps, `API key for ${providerId}/${label}`);\r\n if (!apiKey) {\r\n deps.renderer.writeError('No key entered. Nothing saved.');\r\n return;\r\n }\r\n\r\n await mutateProviders(deps, (all) => {\r\n const existingProv = all[providerId] ?? { type: providerId, ...template };\r\n // Backfill type/family/baseUrl from template when absent.\r\n if (!existingProv.type) existingProv.type = providerId;\r\n if (!existingProv.family && template.family) existingProv.family = template.family;\r\n if (!existingProv.baseUrl && template.baseUrl) existingProv.baseUrl = template.baseUrl;\r\n if (!existingProv.envVars && template.envVars) existingProv.envVars = template.envVars;\r\n const list = normalizeKeys(existingProv);\r\n list.push({ label, apiKey, createdAt: nowIso() });\r\n writeKeysBack(existingProv, list);\r\n if (!existingProv.activeKey) existingProv.activeKey = label;\r\n all[providerId] = existingProv;\r\n });\r\n\r\n deps.renderer.write(\r\n ` ${color.green('✓')} Saved ${color.bold(providerId)}/${color.bold(label)}. ${color.dim('Use `wstack --provider ' + providerId + ' \"<task>\"` to launch.')}\\n`,\r\n );\r\n}\r\n\r\n/**\r\n * One-shot add: used by `wstack auth <provider>` to skip the menu and\r\n * append a single key. Honors --label / --family / --base-url / --env\r\n * flags. If the label collides, we suffix with a counter.\r\n */\r\nexport async function runAuthDirect(deps: AuthMenuDeps, opts: {\r\n providerId: string;\r\n label?: string;\r\n family?: WireFamily;\r\n baseUrl?: string;\r\n envVars?: string[];\r\n}): Promise<number> {\r\n const { providerId } = opts;\r\n const providers = await loadProviders(deps);\r\n const existing = providers[providerId];\r\n\r\n if (!existing && !opts.family) {\r\n // Try the catalog before giving up.\r\n let knownFamily: WireFamily | undefined;\r\n let knownBase: string | undefined;\r\n let knownEnv: string[] | undefined;\r\n try {\r\n const k = await deps.modelsRegistry.getProvider(providerId);\r\n if (k) {\r\n knownFamily = k.family;\r\n knownBase = k.apiBase;\r\n knownEnv = k.envVars;\r\n }\r\n } catch {\r\n // catalog unavailable\r\n }\r\n if (!knownFamily || knownFamily === 'unsupported') {\r\n deps.renderer.writeError(\r\n `Provider \"${providerId}\" not in catalog. Pass --family <anthropic|openai|openai-compatible|google>.`,\r\n );\r\n return 1;\r\n }\r\n opts.family = knownFamily;\r\n opts.baseUrl ??= knownBase;\r\n opts.envVars ??= knownEnv;\r\n }\r\n\r\n const usedLabels = new Set(\r\n existing ? normalizeKeys(existing).map((k) => k.label) : [],\r\n );\r\n let label = opts.label ?? 'default';\r\n if (usedLabels.has(label)) {\r\n let n = 2;\r\n while (usedLabels.has(`${label}-${n}`)) n++;\r\n label = `${label}-${n}`;\r\n deps.renderer.writeInfo(`Label collided; saving as \"${label}\".`);\r\n }\r\n\r\n const apiKey = await readKeyInput(deps, `API key for ${providerId}/${label}`);\r\n if (!apiKey) return 1;\r\n\r\n await mutateProviders(deps, (all) => {\r\n const p = all[providerId] ?? { type: providerId };\r\n if (!p.type) p.type = providerId;\r\n if (!p.family && opts.family) p.family = opts.family;\r\n if (!p.baseUrl && opts.baseUrl) p.baseUrl = opts.baseUrl;\r\n if (!p.envVars && opts.envVars) p.envVars = opts.envVars;\r\n const list = normalizeKeys(p);\r\n list.push({ label, apiKey, createdAt: nowIso() });\r\n writeKeysBack(p, list);\r\n if (!p.activeKey) p.activeKey = label;\r\n all[providerId] = p;\r\n });\r\n\r\n deps.renderer.writeInfo(`Stored encrypted key for ${providerId} (label \"${label}\").`);\r\n deps.renderer.writeInfo(`Use: wstack --provider ${providerId} \"<task>\"`);\r\n return 0;\r\n}\r\n\r\nasync function readKeyInput(deps: AuthMenuDeps, intent: string): Promise<string | undefined> {\r\n const key = (await deps.reader.readSecret(` ${color.amber('?')} ${intent} ${color.dim('(hidden, paste OK)')}: `)).trim();\r\n if (!key) {\r\n deps.renderer.writeError('No key entered.');\r\n return undefined;\r\n }\r\n return key;\r\n}\r\n\r\n/* ----------------------------- I/O helpers ----------------------------- */\r\n\r\n/**\r\n * Read the on-disk config file and return its `providers` map, fully\r\n * decrypted. We don't use `deps.config` here because it's a frozen\r\n * snapshot taken at startup — and once we start mutating keys we want to\r\n * see our own writes on the next iteration.\r\n */\r\nasync function loadProviders(deps: AuthMenuDeps): Promise<Record<string, ProviderConfig>> {\r\n let raw: string;\r\n try {\r\n raw = await fs.readFile(deps.globalConfigPath, 'utf8');\r\n } catch {\r\n return {};\r\n }\r\n let parsed: { providers?: Record<string, ProviderConfig> } = {};\r\n try {\r\n parsed = JSON.parse(raw) as { providers?: Record<string, ProviderConfig> };\r\n } catch {\r\n return {};\r\n }\r\n const decrypted = decryptConfigSecrets(parsed, deps.vault);\r\n return decrypted.providers ?? {};\r\n}\r\n\r\n/**\r\n * Load → mutate → encrypt → atomic-write. Operates on the FULL config\r\n * file so we don't truncate anything the user has set up elsewhere; only\r\n * the `providers` key gets replaced wholesale with the post-mutation\r\n * value (so deletions actually take effect).\r\n */\r\nasync function mutateProviders(\r\n deps: AuthMenuDeps,\r\n mutator: (providers: Record<string, ProviderConfig>) => void,\r\n): Promise<void> {\r\n let raw: string;\r\n try {\r\n raw = await fs.readFile(deps.globalConfigPath, 'utf8');\r\n } catch {\r\n raw = '{}';\r\n }\r\n let parsed: Record<string, unknown>;\r\n try {\r\n parsed = JSON.parse(raw) as Record<string, unknown>;\r\n } catch {\r\n parsed = {};\r\n }\r\n const decrypted = decryptConfigSecrets(parsed, deps.vault) as Record<string, unknown>;\r\n const providers = ((decrypted.providers as Record<string, ProviderConfig>) ?? {});\r\n mutator(providers);\r\n decrypted.providers = providers;\r\n const encrypted = encryptConfigSecrets(decrypted, deps.vault);\r\n await atomicWrite(deps.globalConfigPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\r\n}\r\n\r\n/* --------------------------- Schema helpers --------------------------- */\r\n\r\n/**\r\n * Normalize to the canonical `apiKeys[]` form. Migrates the legacy\r\n * single-key field on the fly so the caller never has to think about\r\n * two shapes. Does NOT mutate the input.\r\n */\r\nfunction normalizeKeys(cfg: ProviderConfig): ProviderApiKey[] {\r\n if (Array.isArray(cfg.apiKeys) && cfg.apiKeys.length > 0) {\r\n return cfg.apiKeys.map((k) => ({ ...k }));\r\n }\r\n if (typeof cfg.apiKey === 'string' && cfg.apiKey.length > 0) {\r\n return [{ label: 'default', apiKey: cfg.apiKey, createdAt: '' }];\r\n }\r\n return [];\r\n}\r\n\r\nfunction writeKeysBack(cfg: ProviderConfig, keys: ProviderApiKey[]): void {\r\n if (keys.length === 0) {\r\n delete cfg.apiKeys;\r\n delete cfg.apiKey;\r\n delete cfg.activeKey;\r\n return;\r\n }\r\n cfg.apiKeys = keys;\r\n // Keep legacy `apiKey` mirrored to the active entry so anything that\r\n // bypasses the config loader still sees a usable key.\r\n const active = keys.find((k) => k.label === cfg.activeKey) ?? keys[0]!;\r\n cfg.apiKey = active.apiKey;\r\n if (!cfg.activeKey || !keys.some((k) => k.label === cfg.activeKey)) {\r\n cfg.activeKey = active.label;\r\n }\r\n}\r\n\r\nfunction activeLabel(cfg: ProviderConfig, keys: ProviderApiKey[]): string | undefined {\r\n if (cfg.activeKey && keys.some((k) => k.label === cfg.activeKey)) return cfg.activeKey;\r\n return keys[0]?.label;\r\n}\r\n\r\nfunction maskedKey(key: string): string {\r\n if (!key) return color.dim('—');\r\n if (key.length <= 8) return color.dim('•'.repeat(key.length));\r\n const head = key.slice(0, 4);\r\n const tail = key.slice(-4);\r\n return `${color.dim(head + '…')}${tail}`;\r\n}\r\n\r\nfunction nowIso(): string {\r\n return new Date().toISOString();\r\n}\r\n","import * as fs from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport * as os from 'node:os';\r\nimport {\r\n color,\r\n atomicWrite,\r\n DefaultSessionReader,\r\n type Config,\r\n type SecretVault,\r\n type SessionStore,\r\n type SkillLoader,\r\n type ToolRegistry,\r\n type ModelsRegistry,\r\n type WstackPaths,\r\n type WireFamily,\r\n} from '@wrongstack/core';\r\nimport type { TerminalRenderer } from '../renderer.js';\r\nimport type { ReadlineInputReader } from '../input-reader.js';\r\nimport { CLI_VERSION, API_VERSION } from '../version.js';\r\nimport { runAuthMenu, runAuthDirect } from '../auth-menu.js';\r\n\r\nexport type SubcommandHandler = (args: string[], deps: SubcommandDeps) => Promise<number>;\r\n\r\nexport interface SubcommandDeps {\r\n config: Config;\r\n renderer: TerminalRenderer;\r\n reader: ReadlineInputReader;\r\n sessionStore?: SessionStore;\r\n skillLoader?: SkillLoader;\r\n toolRegistry?: ToolRegistry;\r\n modelsRegistry: ModelsRegistry;\r\n paths: WstackPaths;\r\n vault: SecretVault;\r\n cwd: string;\r\n projectRoot: string;\r\n userHome: string;\r\n}\r\n\r\nexport const subcommands: Record<string, SubcommandHandler> = {\r\n init: initCmd,\r\n auth: authCmd,\r\n // `resume <id>` is special-cased in src/index.ts: it's lifted into\r\n // `--resume <id>` so the normal REPL bootstrap runs with a pre-loaded\r\n // session. There is no standalone subcommand handler.\r\n sessions: sessionsCmd,\r\n config: configCmd,\r\n tools: toolsCmd,\r\n skills: skillsCmd,\r\n providers: providersCmd,\r\n models: modelsCmd,\r\n mcp: mcpCmd,\r\n plugin: pluginCmd,\r\n diag: diagCmd,\r\n doctor: doctorCmd,\r\n export: exportCmd,\r\n usage: usageCmd,\r\n version: versionCmd,\r\n help: helpCmd,\r\n projects: projectsCmd,\r\n};\r\n\r\n/**\r\n * Manage API keys.\r\n *\r\n * - `wstack auth` (no args) opens the interactive manager: list saved\r\n * providers, add/update/delete keys, set the active key per provider,\r\n * or pick a new provider from the models.dev catalog.\r\n * - `wstack auth <providerId> [--label <l>] [--family <f>] [--base-url <u>] [--env <a,b>]`\r\n * is the scripted one-shot: prompt for a single key and append it\r\n * under `<l>` (default \"default\", auto-suffixed on collision).\r\n *\r\n * Keys are stored under `providers[<id>].apiKeys[]`, encrypted at rest\r\n * by the secret vault. The legacy single-key `apiKey` field is still\r\n * honored for reads and is kept in sync with the active entry.\r\n */\r\nasync function authCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const flags = parseAuthFlags(args);\r\n const menuDeps = {\r\n renderer: deps.renderer,\r\n reader: deps.reader,\r\n modelsRegistry: deps.modelsRegistry,\r\n vault: deps.vault,\r\n globalConfigPath: deps.paths.globalConfig,\r\n };\r\n\r\n if (flags.positional.length === 0) {\r\n return runAuthMenu(menuDeps);\r\n }\r\n\r\n return runAuthDirect(menuDeps, {\r\n providerId: flags.positional[0]!,\r\n label: flags.label,\r\n family: flags.family,\r\n baseUrl: flags.baseUrl,\r\n envVars: flags.envVars,\r\n });\r\n}\r\n\r\ninterface AuthFlags {\r\n positional: string[];\r\n label?: string;\r\n family?: WireFamily;\r\n baseUrl?: string;\r\n envVars?: string[];\r\n}\r\n\r\nfunction parseAuthFlags(args: string[]): AuthFlags {\r\n const out: AuthFlags = { positional: [] };\r\n for (let i = 0; i < args.length; i++) {\r\n const a = args[i];\r\n if (a === '--label') {\r\n const v = args[++i];\r\n if (v) out.label = v;\r\n } else if (a === '--family') {\r\n const v = args[++i];\r\n if (v) out.family = v as WireFamily;\r\n } else if (a === '--base-url') {\r\n const v = args[++i];\r\n if (v) out.baseUrl = v;\r\n } else if (a === '--env') {\r\n const v = args[++i];\r\n if (v) out.envVars = v.split(',').map((s) => s.trim()).filter(Boolean);\r\n } else if (a && !a.startsWith('--')) {\r\n out.positional.push(a);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nasync function initCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n deps.renderer.write(color.bold('WrongStack init\\n'));\r\n deps.renderer.writeInfo('Loading provider catalog from models.dev (cached locally)…');\r\n\r\n let providers;\r\n try {\r\n providers = await deps.modelsRegistry.listProviders();\r\n } catch (err) {\r\n deps.renderer.writeError(\r\n `Failed to load provider catalog: ${err instanceof Error ? err.message : err}`,\r\n );\r\n return 1;\r\n }\r\n\r\n // Prefer providers whose env var is already set, then anthropic/openai/google as common defaults.\r\n const detected = providers\r\n .filter((p) => p.family !== 'unsupported')\r\n .filter((p) => p.envVars.some((v) => process.env[v]));\r\n const ranked =\r\n detected.length > 0\r\n ? detected\r\n : providers.filter((p) => ['anthropic', 'openai', 'google'].includes(p.id));\r\n\r\n if (detected.length > 0) {\r\n deps.renderer.write(`Detected API keys for: ${detected.map((p) => p.name).join(', ')}\\n`);\r\n }\r\n\r\n const defaultId = ranked[0]?.id ?? 'anthropic';\r\n const providerId =\r\n (await deps.reader.readLine(`Provider [${defaultId}]: `)).trim() || defaultId;\r\n\r\n const provider = await deps.modelsRegistry.getProvider(providerId);\r\n if (!provider) {\r\n deps.renderer.writeError(`Provider \"${providerId}\" not found in models.dev catalog.`);\r\n return 1;\r\n }\r\n if (provider.family === 'unsupported') {\r\n deps.renderer.writeError(\r\n `Provider \"${providerId}\" uses ${provider.npm} which has no built-in transport. Install a plugin to enable it.`,\r\n );\r\n return 1;\r\n }\r\n\r\n const suggestedModel = (await deps.modelsRegistry.suggestModel(providerId)) ?? '';\r\n const modelHint = suggestedModel ? ` [${suggestedModel}]` : '';\r\n const modelId =\r\n (await deps.reader.readLine(`Model${modelHint}: `)).trim() || suggestedModel;\r\n if (!modelId) {\r\n deps.renderer.writeError('No model selected. Aborting.');\r\n return 1;\r\n }\r\n\r\n // Find any existing env value\r\n const envHit = provider.envVars.map((v) => process.env[v]).find(Boolean);\r\n let apiKey = '';\r\n if (!envHit) {\r\n apiKey = (\r\n await deps.reader.readLine(\r\n `API key (stored in ${deps.paths.globalConfig}; empty = expect ${provider.envVars[0] ?? 'env var'}): `,\r\n )\r\n ).trim();\r\n } else {\r\n deps.renderer.writeInfo(`Found API key in env (${provider.envVars.join(' / ')}).`);\r\n }\r\n\r\n await fs.mkdir(deps.paths.globalRoot, { recursive: true });\r\n const config: Partial<Config> = {\r\n version: 1,\r\n provider: providerId,\r\n model: modelId,\r\n };\r\n if (apiKey) config.apiKey = apiKey;\r\n await atomicWrite(deps.paths.globalConfig, JSON.stringify(config, null, 2));\r\n\r\n // Project-local committed marker (opt-in)\r\n await fs.mkdir(path.join(deps.projectRoot, '.wrongstack'), { recursive: true });\r\n const agentsFile = path.join(deps.projectRoot, '.wrongstack', 'AGENTS.md');\r\n try {\r\n await fs.access(agentsFile);\r\n } catch {\r\n await atomicWrite(\r\n agentsFile,\r\n '# Project notes for WrongStack\\n\\nWrite project-specific conventions, build commands,\\nand domain knowledge here. This file is committed to git.\\n',\r\n );\r\n }\r\n\r\n deps.renderer.writeInfo(`Wrote ${deps.paths.globalConfig}`);\r\n deps.renderer.writeInfo(`Project state lives in ${deps.paths.projectDir}`);\r\n deps.renderer.writeInfo('Try: wstack \"<task>\" or wstack');\r\n return 0;\r\n}\r\n\r\nasync function sessionsCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n if (!deps.sessionStore) {\r\n deps.renderer.writeError('No session store available.');\r\n return 1;\r\n }\r\n const list = await deps.sessionStore.list(20);\r\n if (list.length === 0) {\r\n deps.renderer.write('No sessions found.\\n');\r\n return 0;\r\n }\r\n for (const s of list) {\r\n deps.renderer.write(\r\n ` ${s.id} ${color.dim(s.startedAt)} ${color.dim(`${s.tokenTotal} tok`)} ${s.title}\\n`,\r\n );\r\n }\r\n return 0;\r\n}\r\n\r\nasync function configCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const sub = args[0];\r\n if (!sub || sub === 'show') {\r\n const redacted = redactKeys(deps.config);\r\n deps.renderer.write(JSON.stringify(redacted, null, 2) + '\\n');\r\n return 0;\r\n }\r\n if (sub === 'edit') {\r\n const editor = process.env['EDITOR'] ?? 'vi';\r\n deps.renderer.write(`Run: ${editor} ${deps.paths.globalConfig}\\n`);\r\n return 0;\r\n }\r\n deps.renderer.writeError(`Unknown config subcommand: ${sub}`);\r\n return 1;\r\n}\r\n\r\nasync function toolsCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n const reg = deps.toolRegistry;\r\n if (!reg) return 0;\r\n for (const { tool, owner } of reg.listWithOwner()) {\r\n deps.renderer.write(\r\n ` ${tool.name.padEnd(28)} ${color.dim(`[${owner}]`)} ${tool.permission}\\n`,\r\n );\r\n }\r\n return 0;\r\n}\r\n\r\nasync function skillsCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n if (!deps.skillLoader) return 0;\r\n const list = await deps.skillLoader.list();\r\n for (const s of list) {\r\n deps.renderer.write(\r\n ` ${s.name.padEnd(24)} ${color.dim(`[${s.source}]`)} ${s.description.split('\\n')[0]}\\n`,\r\n );\r\n }\r\n return 0;\r\n}\r\n\r\nasync function providersCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const showAll = args.includes('--all');\r\n const showUnsupported = args.includes('--unsupported');\r\n try {\r\n const all = await deps.modelsRegistry.listProviders();\r\n const byFamily: Record<WireFamily, typeof all> = {\r\n anthropic: [],\r\n openai: [],\r\n 'openai-compatible': [],\r\n google: [],\r\n unsupported: [],\r\n };\r\n for (const p of all) byFamily[p.family].push(p);\r\n\r\n const families: WireFamily[] = showUnsupported\r\n ? ['unsupported']\r\n : showAll\r\n ? ['anthropic', 'openai', 'google', 'openai-compatible', 'unsupported']\r\n : ['anthropic', 'openai', 'google', 'openai-compatible'];\r\n\r\n for (const family of families) {\r\n const list = byFamily[family];\r\n if (list.length === 0) continue;\r\n deps.renderer.write(`\\n${color.bold(family)} (${list.length}):\\n`);\r\n for (const p of list) {\r\n const envFound = p.envVars.some((v) => process.env[v]);\r\n const marker = envFound ? color.green('●') : color.dim('○');\r\n const envHint = p.envVars[0] ? color.dim(`[${p.envVars[0]}]`) : '';\r\n const note = family === 'unsupported' ? color.dim('(needs plugin)') : '';\r\n deps.renderer.write(\r\n ` ${marker} ${p.id.padEnd(20)} ${p.name.padEnd(28)} ${envHint} ${note}\\n`,\r\n );\r\n }\r\n }\r\n deps.renderer.write(\r\n `\\n${color.dim(`Current: ${deps.config.provider ?? '<unset>'} / ${deps.config.model ?? '<unset>'}. Use --all to include unsupported families.`)}\\n`,\r\n );\r\n return 0;\r\n } catch (err) {\r\n deps.renderer.writeError(\r\n `Failed to list providers: ${err instanceof Error ? err.message : err}`,\r\n );\r\n return 1;\r\n }\r\n}\r\n\r\nasync function modelsCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const sub = args[0];\r\n if (sub === 'refresh') {\r\n deps.renderer.writeInfo('Refreshing models.dev cache…');\r\n try {\r\n const payload = await deps.modelsRegistry.refresh();\r\n deps.renderer.writeInfo(\r\n `Cached ${Object.keys(payload).length} providers to ${deps.paths.modelsCache}`,\r\n );\r\n return 0;\r\n } catch (err) {\r\n deps.renderer.writeError(`Refresh failed: ${err instanceof Error ? err.message : err}`);\r\n return 1;\r\n }\r\n }\r\n const providerId = sub ?? deps.config.provider;\r\n if (!providerId) {\r\n deps.renderer.writeError('Usage: wstack models <provider> | refresh');\r\n return 1;\r\n }\r\n // If the requested id is an alias (`providers[id].type` points at a\r\n // different catalog entry), fall back to that catalog id so the user\r\n // still gets the model list.\r\n let lookupId = providerId;\r\n const savedAlias = deps.config.providers?.[providerId];\r\n if (savedAlias?.type && savedAlias.type !== providerId) {\r\n lookupId = savedAlias.type;\r\n }\r\n const provider = await deps.modelsRegistry.getProvider(lookupId);\r\n if (!provider) {\r\n deps.renderer.writeError(\r\n lookupId !== providerId\r\n ? `Alias \"${providerId}\" points at catalog id \"${lookupId}\" which is not in the cache.`\r\n : `Provider \"${providerId}\" not in catalog.`,\r\n );\r\n return 1;\r\n }\r\n if (lookupId !== providerId) {\r\n deps.renderer.write(color.dim(`(showing catalog models for \"${lookupId}\" via alias \"${providerId}\")\\n`));\r\n }\r\n deps.renderer.write(`${color.bold(provider.name)} ${color.dim(`(${provider.id})`)}\\n`);\r\n if (provider.doc) deps.renderer.write(color.dim(`Docs: ${provider.doc}\\n`));\r\n // User-saved model list wins when present — `wstack models <id>` should\r\n // reflect what the user has configured for that endpoint, not what\r\n // models.dev thinks is on offer (e.g. LM Studio with custom model ids).\r\n // When a user model id ALSO exists in the catalog we surface the\r\n // catalog metadata (ctx/cost/caps); otherwise we just print the id.\r\n const userModels = deps.config.providers?.[providerId]?.models;\r\n const catalogById = new Map(provider.models.map((m) => [m.id, m]));\r\n const sorted = userModels && userModels.length > 0\r\n ? userModels.map((id) => catalogById.get(id) ?? { id, name: id })\r\n : [...provider.models].sort((a, b) =>\r\n (b.release_date ?? '').localeCompare(a.release_date ?? ''),\r\n );\r\n if (userModels && userModels.length > 0) {\r\n deps.renderer.write(color.dim(`(${userModels.length} model(s) from your saved config)\\n`));\r\n }\r\n for (const m of sorted) {\r\n const caps: string[] = [];\r\n if ('tool_call' in m && m.tool_call) caps.push('tools');\r\n if ('reasoning' in m && m.reasoning) caps.push('reasoning');\r\n if ('modalities' in m && m.modalities?.input?.includes('image')) caps.push('vision');\r\n const ctx = 'limit' in m && m.limit?.context\r\n ? `${(m.limit.context / 1000).toFixed(0)}k`\r\n : '?';\r\n const cost = 'cost' in m && m.cost?.input !== undefined\r\n ? `$${m.cost.input}/$${m.cost.output ?? '?'}`\r\n : '';\r\n deps.renderer.write(\r\n ` ${m.id.padEnd(40)} ${color.dim(ctx.padStart(6))} ${color.dim(cost.padEnd(14))} ${color.dim(caps.join(','))}\\n`,\r\n );\r\n }\r\n const age = await deps.modelsRegistry.ageSeconds();\r\n deps.renderer.write(\r\n color.dim(\r\n `\\nCache age: ${isFinite(age) ? `${Math.round(age / 60)}m` : 'never fetched'}. Run \\`wstack models refresh\\` to update.\\n`,\r\n ),\r\n );\r\n return 0;\r\n}\r\n\r\nasync function mcpCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const sub = args[0];\r\n if (!sub || sub === 'list') {\r\n const servers = deps.config.mcpServers ?? {};\r\n if (Object.keys(servers).length === 0) {\r\n deps.renderer.write('No MCP servers configured.\\n');\r\n deps.renderer.write('Use `wstack mcp add <name>` or set mcpServers in your config.\\n');\r\n return 0;\r\n }\r\n for (const [name, cfg] of Object.entries(servers)) {\r\n const status = cfg.enabled === false ? 'disabled' : 'enabled';\r\n const desc = cfg.description ? ` # ${cfg.description}` : '';\r\n deps.renderer.write(\r\n ` ${name.padEnd(20)} ${cfg.transport.padEnd(16)} ${status}${desc}\\n`,\r\n );\r\n }\r\n return 0;\r\n }\r\n\r\n if (sub === 'add') {\r\n const name = args[1];\r\n if (!name) {\r\n deps.renderer.writeError('Usage: wstack mcp add <name>\\n');\r\n deps.renderer.write('Available servers:\\n');\r\n for (const [sname, scfg] of Object.entries(deps.config.mcpServers ?? {})) {\r\n deps.renderer.write(` ${sname.padEnd(20)} ${scfg.description ?? scfg.transport}\\n`);\r\n }\r\n if (Object.keys(deps.config.mcpServers ?? {}).length === 0) {\r\n deps.renderer.write(\r\n ' filesystem filesystem (read/write/navigate)\\n' +\r\n ' github github (issues, PRs, repos)\\n' +\r\n ' context7 context7 (codebase docs & Q&A)\\n' +\r\n ' brave-search brave search (web search)\\n' +\r\n ' block block (Postgres via SQL)\\n' +\r\n ' everart everart (AI image generation)\\n' +\r\n ' slack slack (messaging & channels)\\n' +\r\n ' aws aws (EC2, S3, Lambda, IAM)\\n' +\r\n ' google-maps google-maps (directions, geocoding)\\n' +\r\n ' sentinel sentinel (security vulnerabilities)\\n',\r\n );\r\n }\r\n deps.renderer.write('\\nRun `wstack mcp add <name> --enable` to enable immediately.\\n');\r\n return 1;\r\n }\r\n return addMcpServer(args, deps);\r\n }\r\n\r\n if (sub === 'remove') {\r\n const name = args[1];\r\n if (!name) {\r\n deps.renderer.writeError('Usage: wstack mcp remove <name>\\n');\r\n return 1;\r\n }\r\n return removeMcpServer(name, deps);\r\n }\r\n\r\n if (sub === 'restart') {\r\n deps.renderer.writeWarning('mcp restart is only available in REPL mode.');\r\n return 0;\r\n }\r\n deps.renderer.writeError(`Unknown mcp subcommand: ${sub}`);\r\n return 1;\r\n}\r\n\r\nasync function addMcpServer(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const name = args[1]!;\r\n const enable = args.includes('--enable') || args.includes('-e');\r\n\r\n /** Built-in server presets — all start disabled unless --enable is passed. */\r\n const builtIn: Record<string, { name: string; transport: 'stdio' | 'sse' | 'streamable-http'; command?: string; args?: string[]; url?: string; env?: Record<string, string>; permission: 'auto' | 'confirm' | 'deny'; description: string; enabled?: boolean }> = {\r\n filesystem: { name: 'filesystem', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-filesystem', '.'], permission: 'confirm', description: 'Read, write, and navigate the local filesystem' },\r\n github: { name: 'github', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-github'], permission: 'confirm', description: 'GitHub API — issues, PRs, repos, search' },\r\n 'context7': { name: 'context7', transport: 'streamable-http', url: 'https://server.context7.ai/mcp', permission: 'confirm', description: 'Codebase-aware documentation and Q&A' },\r\n 'brave-search': { name: 'brave-search', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-brave-search'], permission: 'confirm', description: 'Web search (Brave)' },\r\n block: { name: 'block', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-block'], permission: 'confirm', description: 'Postgres database via SQL' },\r\n everart: { name: 'everart', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-everart'], permission: 'confirm', description: 'AI image generation' },\r\n slack: { name: 'slack', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-slack'], permission: 'confirm', description: 'Slack messaging & channels' },\r\n aws: { name: 'aws', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-aws'], permission: 'confirm', description: 'AWS — EC2, S3, Lambda, IAM' },\r\n 'google-maps': { name: 'google-maps', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-google-maps'], permission: 'confirm', description: 'Google Maps — directions, geocoding, places' },\r\n sentinel: { name: 'sentinel', transport: 'streamable-http', url: 'https://mcp.sentinel.ai', permission: 'deny', description: 'Security vulnerability scanning' },\r\n };\r\n\r\n const factory = builtIn[name] as typeof builtIn[string] | undefined;\r\n if (!factory) {\r\n deps.renderer.writeError(`Unknown server \"${name}\". Run \\`wstack mcp add\\` without args to see available servers.\\n`);\r\n return 1;\r\n }\r\n\r\n const serverCfg = { ...factory };\r\n if (!enable) serverCfg.enabled = false;\r\n\r\n // Load and update the config file\r\n let existing: Record<string, unknown> = {};\r\n try {\r\n const raw = await fs.readFile(deps.paths.globalConfig, 'utf8');\r\n existing = JSON.parse(raw);\r\n } catch {\r\n // Config doesn't exist yet — that's fine\r\n }\r\n\r\n const mcpServers = (existing.mcpServers as Record<string, Record<string, unknown>> | undefined) ?? {};\r\n if (mcpServers[name]) {\r\n deps.renderer.writeWarning(`Server \"${name}\" already in config. Updating.\\n`);\r\n }\r\n // MCPServerConfig is a closed interface (no string index signature), but\r\n // the on-disk JSON shape stores it as a plain object — cast through unknown\r\n // so we can land it without widening the public type.\r\n mcpServers[name] = serverCfg as unknown as Record<string, unknown>;\r\n existing.mcpServers = mcpServers;\r\n\r\n await atomicWrite(deps.paths.globalConfig, JSON.stringify(existing, null, 2));\r\n const verb = enable ? 'Enabled' : 'Added (disabled — set enabled:true to activate)';\r\n deps.renderer.writeInfo(`${verb} \"${name}\" (${serverCfg.transport}). Config written to ${deps.paths.globalConfig}.\\n`);\r\n return 0;\r\n}\r\n\r\nasync function removeMcpServer(name: string, deps: SubcommandDeps): Promise<number> {\r\n let existing: Record<string, unknown> = {};\r\n try {\r\n const raw = await fs.readFile(deps.paths.globalConfig, 'utf8');\r\n existing = JSON.parse(raw);\r\n } catch {\r\n deps.renderer.writeError('No config file found.\\n');\r\n return 1;\r\n }\r\n\r\n const mcpServers = (existing.mcpServers as Record<string, Record<string, unknown>> | undefined) ?? {};\r\n if (!mcpServers[name]) {\r\n deps.renderer.writeError(`Server \"${name}\" not in config.\\n`);\r\n return 1;\r\n }\r\n delete mcpServers[name];\r\n existing.mcpServers = mcpServers;\r\n\r\n await atomicWrite(deps.paths.globalConfig, JSON.stringify(existing, null, 2));\r\n deps.renderer.writeInfo(`Removed \"${name}\" from config.\\n`);\r\n return 0;\r\n}\r\n\r\nasync function pluginCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n const sub = args[0];\r\n if (!sub || sub === 'list') {\r\n const plugins = deps.config.plugins ?? [];\r\n if (plugins.length === 0) {\r\n deps.renderer.write('No plugins configured.\\n');\r\n return 0;\r\n }\r\n for (const p of plugins) {\r\n const name = typeof p === 'string' ? p : p.name;\r\n const enabled = typeof p === 'object' && p.enabled === false ? 'disabled' : 'enabled';\r\n deps.renderer.write(` ${name} ${enabled}\\n`);\r\n }\r\n return 0;\r\n }\r\n deps.renderer.writeWarning(`plugin ${sub} not implemented (edit config.plugins manually).`);\r\n return 0;\r\n}\r\n\r\nasync function diagCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n const cfg = deps.config;\r\n const age = await deps.modelsRegistry.ageSeconds();\r\n const lines = [\r\n color.bold('WrongStack diagnostics'),\r\n ` apiVersion: ${API_VERSION}`,\r\n ` cwd: ${deps.cwd}`,\r\n ` projectRoot: ${deps.projectRoot}`,\r\n ` projectHash: ${deps.paths.projectHash}`,\r\n ` projectDir: ${deps.paths.projectDir}`,\r\n ` globalRoot: ${deps.paths.globalRoot}`,\r\n ` modelsCache: ${deps.paths.modelsCache}`,\r\n ` cacheAge: ${isFinite(age) ? `${Math.round(age / 60)}m` : 'never'}`,\r\n ` node: ${process.version}`,\r\n ` os: ${os.platform()} ${os.release()}`,\r\n ` provider: ${cfg.provider ?? '<unset>'}`,\r\n ` model: ${cfg.model ?? '<unset>'}`,\r\n ` tools: ${deps.toolRegistry?.list().length ?? 0}`,\r\n ` plugins: ${cfg.plugins?.length ?? 0}`,\r\n ` mcpServers: ${Object.keys(cfg.mcpServers ?? {}).length}`,\r\n ];\r\n deps.renderer.write(lines.join('\\n') + '\\n');\r\n return 0;\r\n}\r\n\r\n/**\r\n * V3-A: `wstack doctor` — runs a battery of checks and returns non-zero\r\n * if any are unhealthy. Unlike `diag` (which dumps facts), `doctor` makes\r\n * a judgement call per check so users get an actionable list of fix-ups\r\n * instead of having to interpret raw config.\r\n */\r\nasync function doctorCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n type CheckResult = { name: string; status: 'ok' | 'warn' | 'fail'; detail: string };\r\n const checks: CheckResult[] = [];\r\n\r\n // 1. Provider + model are set\r\n const cfg = deps.config;\r\n if (!cfg.provider) {\r\n checks.push({ name: 'provider', status: 'fail', detail: 'no provider configured — run `wstack init` or `wstack auth`' });\r\n } else {\r\n checks.push({ name: 'provider', status: 'ok', detail: cfg.provider });\r\n }\r\n if (!cfg.model) {\r\n checks.push({ name: 'model', status: 'fail', detail: 'no model configured — run `wstack init`' });\r\n } else {\r\n checks.push({ name: 'model', status: 'ok', detail: cfg.model });\r\n }\r\n\r\n // 2. An API key is reachable (either in vault or env)\r\n if (cfg.provider) {\r\n const providerCfg = (cfg.providers as Record<string, { apiKey?: string; envVars?: string[] }> | undefined)?.[cfg.provider];\r\n const hasVaultKey = typeof providerCfg?.apiKey === 'string' && providerCfg.apiKey.length > 0;\r\n const envHit = providerCfg?.envVars?.some((v) => process.env[v]) ?? false;\r\n if (hasVaultKey || envHit) {\r\n checks.push({\r\n name: 'api key',\r\n status: 'ok',\r\n detail: hasVaultKey ? 'found in vault' : 'found in env',\r\n });\r\n } else {\r\n checks.push({\r\n name: 'api key',\r\n status: 'fail',\r\n detail: `no key for \"${cfg.provider}\" in vault or env — run \\`wstack auth ${cfg.provider}\\``,\r\n });\r\n }\r\n }\r\n\r\n // 3. models.dev cache is reasonably fresh (< 7 days)\r\n try {\r\n const age = await deps.modelsRegistry.ageSeconds();\r\n if (!isFinite(age)) {\r\n checks.push({ name: 'models cache', status: 'warn', detail: 'never fetched — run `wstack models refresh`' });\r\n } else if (age > 7 * 24 * 3600) {\r\n checks.push({\r\n name: 'models cache',\r\n status: 'warn',\r\n detail: `${Math.round(age / 86400)} days old — run \\`wstack models refresh\\``,\r\n });\r\n } else {\r\n checks.push({ name: 'models cache', status: 'ok', detail: `${Math.round(age / 60)}m old` });\r\n }\r\n } catch (err) {\r\n checks.push({\r\n name: 'models cache',\r\n status: 'warn',\r\n detail: `read failed: ${err instanceof Error ? err.message : String(err)}`,\r\n });\r\n }\r\n\r\n // 4. Vault file is readable when present\r\n try {\r\n await fs.access(deps.paths.secretsKey);\r\n checks.push({ name: 'secret vault', status: 'ok', detail: deps.paths.secretsKey });\r\n } catch {\r\n checks.push({\r\n name: 'secret vault',\r\n status: 'warn',\r\n detail: 'not yet initialized (created lazily on first encrypt)',\r\n });\r\n }\r\n\r\n // 5. Project sessions dir is writable\r\n try {\r\n await fs.mkdir(deps.paths.projectSessions, { recursive: true });\r\n const probe = path.join(deps.paths.projectSessions, `.probe-${Date.now()}`);\r\n await fs.writeFile(probe, '');\r\n await fs.unlink(probe);\r\n checks.push({ name: 'sessions writable', status: 'ok', detail: deps.paths.projectSessions });\r\n } catch (err) {\r\n checks.push({\r\n name: 'sessions writable',\r\n status: 'fail',\r\n detail: `cannot write to ${deps.paths.projectSessions}: ${err instanceof Error ? err.message : String(err)}`,\r\n });\r\n }\r\n\r\n // 6. Each enabled MCP server has a reachable command/url\r\n const mcpEntries = Object.entries(cfg.mcpServers ?? {}) as [\r\n string,\r\n { enabled?: boolean; transport?: string; command?: string; url?: string },\r\n ][];\r\n for (const [name, srv] of mcpEntries) {\r\n if (!srv.enabled) continue;\r\n if ((srv.transport === 'sse' || srv.transport === 'streamable-http') && !srv.url) {\r\n checks.push({ name: `mcp:${name}`, status: 'fail', detail: 'transport requires url' });\r\n } else if (srv.transport === 'stdio' && !srv.command) {\r\n checks.push({ name: `mcp:${name}`, status: 'fail', detail: 'stdio transport requires command' });\r\n } else {\r\n checks.push({ name: `mcp:${name}`, status: 'ok', detail: `${srv.transport} ${srv.command ?? srv.url ?? ''}`.trim() });\r\n }\r\n }\r\n\r\n // 7. Node engine\r\n const major = Number.parseInt(process.version.replace(/^v/, '').split('.')[0] ?? '0', 10);\r\n if (major < 22) {\r\n checks.push({ name: 'node', status: 'fail', detail: `${process.version} (need ≥22)` });\r\n } else {\r\n checks.push({ name: 'node', status: 'ok', detail: process.version });\r\n }\r\n\r\n // Render\r\n deps.renderer.write(color.bold('WrongStack doctor\\n\\n'));\r\n let failed = 0;\r\n let warned = 0;\r\n for (const c of checks) {\r\n const icon = c.status === 'ok' ? color.green('✓') : c.status === 'warn' ? color.amber('●') : color.red('✗');\r\n deps.renderer.write(` ${icon} ${c.name.padEnd(20)} ${color.dim(c.detail)}\\n`);\r\n if (c.status === 'fail') failed++;\r\n if (c.status === 'warn') warned++;\r\n }\r\n deps.renderer.write('\\n');\r\n if (failed > 0) {\r\n deps.renderer.write(color.red(`${failed} failed, ${warned} warning${warned === 1 ? '' : 's'}\\n`));\r\n return 1;\r\n }\r\n if (warned > 0) {\r\n deps.renderer.write(color.amber(`All checks passed (${warned} warning${warned === 1 ? '' : 's'})\\n`));\r\n return 0;\r\n }\r\n deps.renderer.write(color.green('All checks passed.\\n'));\r\n return 0;\r\n}\r\n\r\nasync function exportCmd(args: string[], deps: SubcommandDeps): Promise<number> {\r\n if (!deps.sessionStore) {\r\n deps.renderer.writeError('No session store configured.');\r\n return 1;\r\n }\r\n\r\n let format: 'markdown' | 'json' | 'text' = 'markdown';\r\n let output: string | undefined;\r\n let includeTools = true;\r\n let includeDiagnostics = true;\r\n let sessionId: string | undefined;\r\n\r\n for (let i = 0; i < args.length; i++) {\r\n const a = args[i]!;\r\n if (a === '--format' || a === '-f') {\r\n const v = args[++i];\r\n if (v !== 'markdown' && v !== 'json' && v !== 'text') {\r\n deps.renderer.writeError(`Unknown --format ${v}. Use markdown, json, or text.`);\r\n return 1;\r\n }\r\n format = v;\r\n } else if (a === '--out' || a === '-o') {\r\n output = args[++i];\r\n } else if (a === '--no-tools') {\r\n includeTools = false;\r\n } else if (a === '--no-diagnostics') {\r\n includeDiagnostics = false;\r\n } else if (a.startsWith('-')) {\r\n deps.renderer.writeError(`Unknown flag: ${a}`);\r\n return 1;\r\n } else if (!sessionId) {\r\n sessionId = a;\r\n }\r\n }\r\n\r\n if (!sessionId) {\r\n deps.renderer.writeError('Usage: wstack export <sessionId> [--format markdown|json|text] [--out <file>] [--no-tools] [--no-diagnostics]');\r\n return 1;\r\n }\r\n\r\n const reader = new DefaultSessionReader({ store: deps.sessionStore });\r\n let rendered: string;\r\n try {\r\n rendered = await reader.export(sessionId, {\r\n format,\r\n includeTools,\r\n includeDiagnostics,\r\n });\r\n } catch (err) {\r\n deps.renderer.writeError(\r\n `Export failed: ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n return 1;\r\n }\r\n\r\n if (output) {\r\n await fs.mkdir(path.dirname(path.resolve(deps.cwd, output)), { recursive: true });\r\n await fs.writeFile(path.resolve(deps.cwd, output), rendered, 'utf8');\r\n deps.renderer.write(`Wrote ${rendered.length} bytes to ${output}\\n`);\r\n } else {\r\n deps.renderer.write(rendered);\r\n if (!rendered.endsWith('\\n')) deps.renderer.write('\\n');\r\n }\r\n return 0;\r\n}\r\n\r\nasync function usageCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n if (!deps.sessionStore) return 0;\r\n const list = await deps.sessionStore.list(100);\r\n let totalIn = 0;\r\n for (const s of list) totalIn += s.tokenTotal;\r\n deps.renderer.write(`Sessions: ${list.length} total tokens: ${totalIn}\\n`);\r\n return 0;\r\n}\r\n\r\nasync function versionCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n deps.renderer.write(\r\n `WrongStack ${CLI_VERSION} (apiVersion ${API_VERSION}, node ${process.version}, ${os.platform()})\\n`,\r\n );\r\n return 0;\r\n}\r\n\r\nasync function helpCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n const lines = [\r\n color.bold('WrongStack — usage'),\r\n '',\r\n ' wstack Start REPL',\r\n ' wstack \"<task>\" Run task and exit',\r\n ' wstack resume [<id>] Resume a session',\r\n ' wstack sessions List recent sessions',\r\n ' wstack init Pick provider + model from models.dev',\r\n ' wstack auth Interactive key manager (list/add/update/delete)',\r\n ' wstack auth <provider> Append one key for a provider (encrypted at rest)',\r\n ' wstack resume <id> Resume a session (loads transcript + appends)',\r\n ' wstack config [show|edit] Show or edit effective config',\r\n ' wstack tools List registered tools',\r\n ' wstack skills List discovered skills',\r\n ' wstack providers [--all] List providers from models.dev',\r\n ' wstack models [<provider>] List models for current/specified provider',\r\n ' wstack models refresh Force-refresh models.dev cache',\r\n ' wstack mcp [list] List MCP servers',\r\n ' wstack plugin [list] List plugins',\r\n ' wstack projects List projects tracked in ~/.wrongstack/projects/',\r\n ' wstack diag Full diagnostics',\r\n ' wstack doctor Health checks (config, keys, MCP, node)',\r\n ' wstack export <id> [opts] Render a session (--format markdown|json|text, --out <file>)',\r\n ' wstack usage Token + cost summary',\r\n ' wstack version Print version',\r\n '',\r\n 'Global flags:',\r\n ' --provider, --model, --cwd, --log-level, --yolo, --verbose, --trace, --config',\r\n ];\r\n deps.renderer.write(lines.join('\\n') + '\\n');\r\n return 0;\r\n}\r\n\r\nasync function projectsCmd(_args: string[], deps: SubcommandDeps): Promise<number> {\r\n const projectsRoot = path.join(deps.paths.globalRoot, 'projects');\r\n try {\r\n const entries = await fs.readdir(projectsRoot);\r\n if (entries.length === 0) {\r\n deps.renderer.write('No projects tracked.\\n');\r\n return 0;\r\n }\r\n for (const hash of entries) {\r\n try {\r\n const meta = JSON.parse(\r\n await fs.readFile(path.join(projectsRoot, hash, 'meta.json'), 'utf8'),\r\n ) as { root?: string; lastSeen?: string };\r\n deps.renderer.write(\r\n ` ${color.dim(hash)} ${color.dim(meta.lastSeen ?? '')} ${meta.root ?? '?'}\\n`,\r\n );\r\n } catch {\r\n deps.renderer.write(` ${color.dim(hash)} ${color.dim('(no meta)')}\\n`);\r\n }\r\n }\r\n return 0;\r\n } catch {\r\n deps.renderer.write('No projects directory.\\n');\r\n return 0;\r\n }\r\n}\r\n\r\nfunction redactKeys(obj: unknown): unknown {\r\n if (!obj || typeof obj !== 'object') return obj;\r\n if (Array.isArray(obj)) return obj.map(redactKeys);\r\n const out: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\r\n if (/api.?key|secret|token|pass/i.test(k) && typeof v === 'string' && v.length > 0) {\r\n out[k] = '[REDACTED]';\r\n } else {\r\n out[k] = redactKeys(v);\r\n }\r\n }\r\n return out;\r\n}\r\n","import * as fs from 'node:fs/promises';\r\nimport { writeFileSync } from 'node:fs';\r\nimport { createRequire } from 'node:module';\r\nimport * as path from 'node:path';\r\nimport {\r\n Agent,\r\n AutoCompactionMiddleware,\r\n type Config,\r\n Container,\r\n Context,\r\n DefaultAttachmentStore,\r\n DefaultConfigStore,\r\n DefaultErrorHandler,\r\n DefaultLogger,\r\n DefaultMemoryStore,\r\n DefaultModelsRegistry,\r\n DefaultPermissionPolicy,\r\n DefaultRetryPolicy,\r\n DefaultSecretScrubber,\r\n DefaultSessionStore,\r\n DefaultSkillLoader,\r\n DefaultModeStore,\r\n DefaultSystemPromptBuilder,\r\n DefaultTokenCounter,\r\n EventBus,\r\n HybridCompactor,\r\n InMemoryMetricsSink,\r\n DefaultHealthRegistry,\r\n wireMetricsToEvents,\r\n startMetricsServer,\r\n type MetricsServerHandle,\r\n type MetricsSink,\r\n type HealthRegistry,\r\n type Plugin,\r\n ProviderRegistry,\r\n QueueStore,\r\n RecoveryLock,\r\n SlashCommandRegistry,\r\n type SystemPromptBuilder,\r\n TOKENS,\r\n ToolRegistry,\r\n color,\r\n createContextManagerTool,\r\n createDefaultPipelines,\r\n loadPlugins,\r\n} from '@wrongstack/core';\r\nimport { MCPRegistry } from '@wrongstack/mcp';\r\nimport {\r\n buildProviderFactoriesFromRegistry,\r\n capabilitiesFor,\r\n makeProviderFromConfig,\r\n} from '@wrongstack/providers';\r\nimport { forgetTool, rememberTool } from '@wrongstack/tools';\r\nimport { builtinTools } from '@wrongstack/tools/builtin';\r\nimport { ReadlineInputReader } from './input-reader.js';\r\nimport { makePromptDelegate, makeConfirmAwaiter } from './permission-prompt.js';\r\nimport { runPicker, saveToGlobalConfig } from './picker.js';\r\nimport { runLaunchPrompts, runProjectCheck } from './pre-launch.js';\r\nimport { TerminalRenderer } from './renderer.js';\r\nimport { runRepl } from './repl.js';\r\nimport { SessionStats } from './session-stats.js';\r\nimport { buildBuiltinSlashCommands } from './slash-commands/index.js';\r\nimport { Spinner } from './spinner.js';\r\nimport { fmtTok, patchConfig } from './utils.js';\r\nimport { bootConfig } from './boot-config.js';\r\nimport { MultiAgentHost } from './multi-agent.js';\r\nimport { subcommands } from './subcommands/index.js';\r\n\r\ninterface ParsedArgs {\r\n flags: Record<string, string | boolean>;\r\n positional: string[];\r\n}\r\n\r\nconst BOOLEAN_FLAGS = new Set([\r\n 'yolo',\r\n 'verbose',\r\n 'trace',\r\n 'help',\r\n 'version',\r\n 'no-banner',\r\n 'no-features',\r\n 'tui',\r\n 'no-tui',\r\n 'no-recovery',\r\n 'recover',\r\n 'no-alt-screen',\r\n 'alt-screen',\r\n 'output-json',\r\n 'prompt',\r\n 'metrics',\r\n 'webui',\r\n]);\r\n\r\nfunction parseArgs(argv: string[]): ParsedArgs {\r\n const flags: Record<string, string | boolean> = {};\r\n const positional: string[] = [];\r\n for (let i = 0; i < argv.length; i++) {\r\n const a = argv[i];\r\n if (!a) continue;\r\n if (a === '--') {\r\n positional.push(...argv.slice(i + 1));\r\n break;\r\n }\r\n if (a.startsWith('--')) {\r\n const eq = a.indexOf('=');\r\n if (eq !== -1) {\r\n flags[a.slice(2, eq)] = a.slice(eq + 1);\r\n continue;\r\n }\r\n const name = a.slice(2);\r\n if (BOOLEAN_FLAGS.has(name)) {\r\n flags[name] = true;\r\n continue;\r\n }\r\n if (i + 1 < argv.length && !(argv[i + 1] ?? '').startsWith('-')) {\r\n flags[name] = argv[++i] ?? '';\r\n } else {\r\n flags[name] = true;\r\n }\r\n } else if (a.startsWith('-') && a.length === 2) {\r\n const short = a.slice(1);\r\n const expand: Record<string, string> = { v: 'verbose' };\r\n flags[expand[short] ?? short] = true;\r\n } else {\r\n positional.push(a);\r\n }\r\n }\r\n return { flags, positional };\r\n}\r\n\r\nfunction resolveBundledSkillsDir(): string | undefined {\r\n try {\r\n const req = createRequire(import.meta.url);\r\n const corePkg = req.resolve('@wrongstack/core/package.json');\r\n return path.join(path.dirname(corePkg), 'skills');\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nimport { CLI_VERSION } from './version.js';\r\nexport { CLI_VERSION };\r\n\r\nexport async function main(argv: string[]): Promise<number> {\r\n const { flags, positional } = parseArgs(argv);\r\n\r\n // `wstack resume <id>` is sugar for `wstack --resume <id>`. Lift it\r\n // before subcommand dispatch so resume falls through to the normal\r\n // REPL flow with the session pre-loaded.\r\n if (positional[0] === 'resume' && positional[1] && !subcommands['__noop_resume_marker']) {\r\n flags['resume'] = positional[1];\r\n positional.splice(0, 2);\r\n }\r\n\r\n // Resolve paths, create vault, migrate plaintext secrets, load config.\r\n let boot;\r\n try {\r\n boot = await bootConfig(flags);\r\n } catch (err) {\r\n process.stderr.write(`Config error: ${err instanceof Error ? err.message : String(err)}\\n`);\r\n return 2;\r\n }\r\n const { paths, config: _config, vault } = boot;\r\n let config = _config;\r\n const { cwd, projectRoot, userHome, wpaths, pathResolver } = paths;\r\n\r\n // Logger — operational log lives in user home\r\n const logger = new DefaultLogger({\r\n level: config.log.level,\r\n file: wpaths.logFile,\r\n });\r\n const renderer = new TerminalRenderer();\r\n const reader = new ReadlineInputReader({ historyFile: wpaths.historyFile });\r\n\r\n // ModelsRegistry — source of truth for providers, models, pricing.\r\n const modelsRegistry = new DefaultModelsRegistry({\r\n cacheFile: wpaths.modelsCache,\r\n ttlSeconds: 24 * 3600,\r\n });\r\n\r\n // Quick path: subcommand dispatch (no provider required for most)\r\n const first = positional[0];\r\n if (first && subcommands[first]) {\r\n const sessionStore = new DefaultSessionStore({ dir: wpaths.projectSessions });\r\n const skillLoader = new DefaultSkillLoader({\r\n paths: wpaths,\r\n bundledDir: resolveBundledSkillsDir(),\r\n });\r\n const toolRegistryForSubcmd = new ToolRegistry();\r\n for (const t of builtinTools) toolRegistryForSubcmd.register(t);\r\n const code = await subcommands[first]!(positional.slice(1), {\r\n config,\r\n renderer,\r\n reader,\r\n sessionStore,\r\n skillLoader,\r\n toolRegistry: toolRegistryForSubcmd,\r\n modelsRegistry,\r\n paths: wpaths,\r\n vault,\r\n cwd,\r\n projectRoot,\r\n userHome,\r\n });\r\n await reader.close();\r\n return code;\r\n }\r\n\r\n // Determine the launch shape up front so the pre-launch prompts (project\r\n // check + mode + yolo) only fire when this is actually an interactive\r\n // session. Single-shot invocations (`wrongstack \"do X\"` / `--prompt`) and\r\n // non-TTY pipes (CI) skip all the interactive sugar.\r\n const isSingleShot = positional.length > 0 || typeof flags['prompt'] === 'string';\r\n const isInteractiveTTY = !!process.stdin.isTTY && !isSingleShot;\r\n\r\n // Project status banner + optional AGENTS.md scaffold. Returns false\r\n // when the user bails out of an empty/scratch directory.\r\n if (isInteractiveTTY) {\r\n const cont = await runProjectCheck({ projectRoot, renderer, reader });\r\n if (!cont) {\r\n await reader.close();\r\n return 0;\r\n }\r\n }\r\n\r\n // Identity selection. We launch the interactive picker whenever the user\r\n // didn't pin BOTH provider and model on the CLI (--provider AND --model).\r\n // The picker pre-selects whatever the config has so Enter accepts the\r\n // previous choice — switching models becomes \"wstack ↵ ↵\" most days.\r\n //\r\n // Non-TTY (pipes, CI) skips the picker: it falls back to whatever's in\r\n // config and hard-errors if that's still empty.\r\n const providerFlag = typeof flags['provider'] === 'string' ? flags['provider'] : undefined;\r\n const modelFlag = typeof flags['model'] === 'string' ? flags['model'] : undefined;\r\n const bothFlagsPinned = !!providerFlag && !!modelFlag;\r\n if (!bothFlagsPinned) {\r\n if (process.stdin.isTTY) {\r\n const picked = await runPicker({\r\n modelsRegistry,\r\n renderer,\r\n reader,\r\n config,\r\n defaultProvider: providerFlag ?? config.provider,\r\n defaultModel: modelFlag ?? config.model,\r\n });\r\n if (!picked) {\r\n // User bailed out and we have no fallback in config — error out.\r\n if (!config.provider || !config.model) {\r\n await reader.close();\r\n return 2;\r\n }\r\n // Otherwise honor the cancel by keeping the config defaults.\r\n } else {\r\n // Persist as the new default so next launch pre-selects this pair.\r\n // Read-before-replace so we can tell whether anything actually\r\n // changed — re-saving the same pair every launch is just noise.\r\n const prevProvider = config.provider;\r\n const prevModel = config.model;\r\n\r\n // The loader hands back a frozen Config. Rebuild a fresh object\r\n // with the picked pair patched in (and re-freeze) instead of\r\n // mutating in place — Object.freeze blocks runtime writes even\r\n // when a TS cast hides it from the compiler.\r\n config = patchConfig(config, { provider: picked.provider, model: picked.model });\r\n\r\n if (picked.provider !== prevProvider || picked.model !== prevModel) {\r\n const saved = await saveToGlobalConfig(\r\n wpaths.globalConfig,\r\n picked.provider,\r\n picked.model,\r\n );\r\n if (saved) {\r\n renderer.writeInfo(`Saved ${picked.provider}/${picked.model} as default.\\n`);\r\n }\r\n }\r\n }\r\n } else if (!config.provider || !config.model) {\r\n process.stderr.write(\r\n 'No provider or model configured. Run `wrongstack init` first, or pass ' +\r\n '--provider <id> --model <id>.\\n',\r\n );\r\n await reader.close();\r\n return 2;\r\n }\r\n // Non-TTY with config present: fall through using config defaults.\r\n }\r\n\r\n // Interactive mode + YOLO prompts. Each prompt is skipped when the user\r\n // already pinned the corresponding flag (--tui / --no-tui / --yolo) on\r\n // the CLI; otherwise we ask. The chosen values are written back to\r\n // `flags` and `config` so the rest of the boot sequence (permission\r\n // policy, REPL-vs-TUI branch) reads them naturally.\r\n if (isInteractiveTTY) {\r\n let modePinned: 'tui' | 'repl' | undefined;\r\n if (flags['no-tui']) modePinned = 'repl';\r\n else if (flags['tui']) modePinned = 'tui';\r\n const yoloPinned: boolean | undefined = flags['yolo'] === true ? true : undefined;\r\n\r\n const choices = await runLaunchPrompts({ renderer, reader, modePinned, yoloPinned });\r\n\r\n // Propagate mode → the REPL/TUI branch later reads flags.tui / flags['no-tui'].\r\n if (choices.mode === 'tui') {\r\n flags['tui'] = true;\r\n flags['no-tui'] = false;\r\n } else {\r\n flags['tui'] = false;\r\n flags['no-tui'] = true;\r\n }\r\n // Propagate yolo → permission policy reads config.yolo. Config is\r\n // frozen so we rebuild (same pattern as the picker patch above).\r\n if (choices.yolo !== config.yolo) {\r\n config = patchConfig(config, { yolo: choices.yolo });\r\n }\r\n }\r\n\r\n // Resolve provider details from models.dev. An alias may not match a\r\n // catalog id directly, so we also try `cfg.type` (which points at the\r\n // catalog entry the alias was derived from). When neither resolves AND\r\n // the user has explicitly set `family` in their config, this is a\r\n // deliberate custom/local provider — staying silent is the right call;\r\n // logging would just train people to ignore the warning.\r\n const savedProviderCfg = config.providers?.[config.provider];\r\n let resolvedProvider = await modelsRegistry.getProvider(config.provider).catch(() => undefined);\r\n if (!resolvedProvider && savedProviderCfg?.type && savedProviderCfg.type !== config.provider) {\r\n resolvedProvider = await modelsRegistry\r\n .getProvider(savedProviderCfg.type)\r\n .catch(() => undefined);\r\n }\r\n if (!resolvedProvider) {\r\n if (!savedProviderCfg?.family) {\r\n logger.warn(\r\n `Provider \"${config.provider}\" not found in models.dev. Continuing with raw config.`,\r\n );\r\n }\r\n } else if (resolvedProvider.family === 'unsupported' && !savedProviderCfg?.family) {\r\n // Catalog says unsupported AND the user hasn't supplied their own\r\n // family override — bail. With an override we trust the user knows\r\n // how to route this endpoint.\r\n process.stderr.write(\r\n `Provider \"${config.provider}\" uses an unsupported wire family (${resolvedProvider.npm}). ` +\r\n `Install a plugin to enable it, or pick a different provider.\\n`,\r\n );\r\n await reader.close();\r\n return 2;\r\n }\r\n\r\n // Build container + services\r\n const container = new Container();\r\n // L1-B: a single ConfigStore is the source of truth for runtime config.\r\n // Subsystems that care about live updates (provider switching, extension\r\n // reload) resolve this and call .watch() — everything else can still read\r\n // the flat `config` snapshot. We mutate the store on /model and similar\r\n // commands so observers re-render automatically.\r\n const configStore = new DefaultConfigStore(config);\r\n container.bind(TOKENS.ConfigStore, () => configStore);\r\n container.bind(TOKENS.Logger, () => logger);\r\n container.bind(TOKENS.PathResolver, () => pathResolver);\r\n container.bind(TOKENS.SecretScrubber, () => new DefaultSecretScrubber());\r\n container.bind(TOKENS.RetryPolicy, () => new DefaultRetryPolicy());\r\n container.bind(TOKENS.ErrorHandler, () => new DefaultErrorHandler());\r\n container.bind(TOKENS.ModelsRegistry, () => modelsRegistry);\r\n container.bind(\r\n TOKENS.TokenCounter,\r\n () => new DefaultTokenCounter({ registry: modelsRegistry, providerId: config.provider }),\r\n );\r\n const modeStore = new DefaultModeStore({ directory: wpaths.configDir });\r\n container.bind(TOKENS.ModeStore, () => modeStore);\r\n container.bind(\r\n TOKENS.SessionStore,\r\n () => new DefaultSessionStore({ dir: wpaths.projectSessions }),\r\n );\r\n const memoryStore = new DefaultMemoryStore({ paths: wpaths });\r\n container.bind(TOKENS.MemoryStore, () => memoryStore);\r\n // Skills are an opt-in feature pack — when disabled we still bind a\r\n // loader that returns an empty list so the prompt builder doesn't\r\n // need a special path. This way `--no-features` doesn't drift behaviour.\r\n const skillLoader = new DefaultSkillLoader({\r\n paths: wpaths,\r\n bundledDir: config.features.skills ? resolveBundledSkillsDir() : undefined,\r\n });\r\n container.bind(TOKENS.SkillLoader, () => skillLoader);\r\n // Resolve modeId and modelCapabilities before building system prompt.\r\n const activeMode = await modeStore.getActiveMode();\r\n const modeId = activeMode?.id ?? 'default';\r\n const modePrompt = activeMode?.prompt ?? '';\r\n const resolvedModel = await modelsRegistry.getModel(config.provider, config.model);\r\n const modelCapabilities = resolvedModel?.capabilities\r\n ? {\r\n maxContextTokens: resolvedModel.capabilities.maxContext,\r\n supportsTools: resolvedModel.capabilities.tools,\r\n supportsVision: resolvedModel.capabilities.vision,\r\n supportsReasoning: resolvedModel.capabilities.reasoning,\r\n }\r\n : undefined;\r\n container.bind(\r\n TOKENS.SystemPromptBuilder,\r\n () =>\r\n new DefaultSystemPromptBuilder({\r\n memoryStore,\r\n skillLoader: config.features.skills ? skillLoader : undefined,\r\n modeStore,\r\n modeId,\r\n modePrompt,\r\n modelCapabilities,\r\n }),\r\n );\r\n container.bind(TOKENS.Renderer, () => renderer);\r\n container.bind(TOKENS.InputReader, () => reader);\r\n container.bind(\r\n TOKENS.PermissionPolicy,\r\n () =>\r\n new DefaultPermissionPolicy({\r\n trustFile: wpaths.projectTrust,\r\n yolo: config.yolo,\r\n promptDelegate: makePromptDelegate(reader),\r\n }),\r\n );\r\n container.bind(\r\n TOKENS.Compactor,\r\n () =>\r\n new HybridCompactor({\r\n preserveK: config.context.preserveK,\r\n eliseThreshold: config.context.eliseThreshold,\r\n }),\r\n );\r\n\r\n // Provider registry — populated dynamically from models.dev catalog\r\n // when enabled. With features.modelsRegistry=false we don't touch the\r\n // network at boot and rely on the user's config to declare the wire\r\n // family explicitly (see makeProviderFromConfig path below).\r\n const providerRegistry = new ProviderRegistry();\r\n if (config.features.modelsRegistry) {\r\n try {\r\n const factories = await buildProviderFactoriesFromRegistry({\r\n registry: modelsRegistry,\r\n log: logger,\r\n });\r\n for (const f of factories) providerRegistry.register(f);\r\n } catch (err) {\r\n process.stderr.write(\r\n `Failed to load models.dev registry: ${err instanceof Error ? err.message : err}\\n` +\r\n `Try \\`wstack models refresh\\` once you have network access, or run with --no-features.\\n`,\r\n );\r\n await reader.close();\r\n return 2;\r\n }\r\n }\r\n\r\n // Tool registry\r\n const toolRegistry = new ToolRegistry();\r\n for (const t of builtinTools) toolRegistry.register(t);\r\n toolRegistry.registerDefault(\r\n createContextManagerTool({ compactor: container.resolve(TOKENS.Compactor) }),\r\n );\r\n if (config.features.memory) {\r\n toolRegistry.register(rememberTool(memoryStore));\r\n toolRegistry.register(forgetTool(memoryStore));\r\n }\r\n\r\n const events = new EventBus();\r\n events.setLogger(logger);\r\n\r\n // Observability — opt-in via --metrics. Writes a snapshot to\r\n // <session-dir>/metrics.json on shutdown so users get a post-run summary\r\n // without standing up a scrape endpoint. The sink is also exposed via the\r\n // /metrics slash command for live inspection mid-session.\r\n let metricsSink: MetricsSink | undefined;\r\n let healthRegistry: HealthRegistry | undefined;\r\n let metricsServerHandle: MetricsServerHandle | undefined;\r\n // --metrics-port implies --metrics (you can't scrape what isn't recorded).\r\n const metricsPortFlag = flags['metrics-port'];\r\n const metricsPort =\r\n typeof metricsPortFlag === 'string' && metricsPortFlag.length > 0\r\n ? Number.parseInt(metricsPortFlag, 10)\r\n : undefined;\r\n if (metricsPort !== undefined && !flags.metrics) flags.metrics = true;\r\n if (flags.metrics) {\r\n metricsSink = new InMemoryMetricsSink();\r\n wireMetricsToEvents(events, metricsSink);\r\n healthRegistry = new DefaultHealthRegistry();\r\n healthRegistry.register({\r\n name: 'session-store',\r\n check: async () => {\r\n try {\r\n await fs.access(wpaths.projectSessions);\r\n return { status: 'healthy' };\r\n } catch (e) {\r\n return { status: 'unhealthy', detail: e instanceof Error ? e.message : 'access denied' };\r\n }\r\n },\r\n });\r\n healthRegistry.register({\r\n name: 'provider',\r\n check: async () => ({\r\n status: 'healthy',\r\n data: { id: config.provider, model: config.model },\r\n }),\r\n });\r\n\r\n const dumpMetrics = () => {\r\n if (!metricsSink) return;\r\n try {\r\n const out = path.join(wpaths.projectSessions, 'metrics.json');\r\n const snap = metricsSink.snapshot();\r\n // Sync write — async fs APIs can't survive process.exit().\r\n writeFileSync(out, JSON.stringify(snap, null, 2));\r\n } catch {\r\n // Snapshot is best-effort — never block shutdown on it.\r\n }\r\n };\r\n process.on('exit', dumpMetrics);\r\n process.on('SIGINT', () => { dumpMetrics(); process.exit(130); });\r\n\r\n // L3-C: optional Prometheus scrape endpoint. Bound to 127.0.0.1 by\r\n // default — operators who want network-visible metrics set\r\n // METRICS_HOST=0.0.0.0 explicitly. Failure to bind is logged but does\r\n // not fail the run; the in-process sink keeps recording.\r\n if (metricsPort !== undefined && Number.isFinite(metricsPort)) {\r\n try {\r\n metricsServerHandle = await startMetricsServer({\r\n port: metricsPort,\r\n host: process.env.METRICS_HOST ?? '127.0.0.1',\r\n sink: metricsSink,\r\n // V2-C: mount /healthz on the same listener so k8s probes can\r\n // hit one endpoint per pod for both observability and liveness.\r\n healthRegistry,\r\n });\r\n logger.info(`metrics endpoint listening on ${metricsServerHandle.url} (healthz on same port)`);\r\n process.on('exit', () => { void metricsServerHandle?.close().catch(() => {}); });\r\n } catch (err) {\r\n logger.warn(`metrics endpoint failed to start: ${err instanceof Error ? err.message : String(err)}`);\r\n }\r\n }\r\n }\r\n\r\n // Spinner: visible \"thinking…\" line during each model request.\r\n const spinner = new Spinner();\r\n // Track the latest provider request's input-token count so the spinner\r\n // can render a live context-window fullness bar (TUI parity).\r\n let lastInputTokens = 0;\r\n events.on('provider.response', (e) => {\r\n lastInputTokens = e.usage?.input ?? 0;\r\n updateSpinnerContext();\r\n });\r\n events.on('iteration.started', () => {\r\n updateSpinnerContext();\r\n spinner.start(color.dim(`${config.provider}/${config.model} thinking…`));\r\n });\r\n events.on('provider.response', () => {\r\n spinner.stop();\r\n });\r\n events.on('error', () => {\r\n spinner.stop();\r\n });\r\n\r\n // Live streaming output: first text_delta stops the spinner and starts\r\n // writing tokens directly so the user sees the model \"type\".\r\n let streamingActive = false;\r\n events.on('provider.text_delta', (p) => {\r\n if (!streamingActive) {\r\n spinner.stop();\r\n streamingActive = true;\r\n }\r\n renderer.write(p.text);\r\n });\r\n events.on('iteration.completed', () => {\r\n if (streamingActive) {\r\n renderer.write('\\n');\r\n streamingActive = false;\r\n }\r\n });\r\n\r\n // Provider hiccups — render a single friendly line instead of leaving the\r\n // raw JSON body in logger output. retry events show a countdown; error\r\n // events surface a final failure that won't be retried.\r\n events.on('provider.retry', (p) => {\r\n spinner.stop();\r\n if (streamingActive) {\r\n renderer.write('\\n');\r\n streamingActive = false;\r\n }\r\n const secs = (p.delayMs / 1000).toFixed(p.delayMs >= 1000 ? 1 : 2);\r\n process.stderr.write(color.yellow(` ⟳ retry ${p.attempt} in ${secs}s — ${p.description}\\n`));\r\n spinner.start(color.dim(`${config.provider}/${config.model} thinking…`));\r\n });\r\n events.on('provider.error', (p) => {\r\n spinner.stop();\r\n if (streamingActive) {\r\n renderer.write('\\n');\r\n streamingActive = false;\r\n }\r\n process.stderr.write(color.red(` ✗ ${p.description}\\n`));\r\n });\r\n\r\n // Provider instance — registry-driven by default, but falls through to\r\n // config-only construction when the catalog is unavailable (or the\r\n // user explicitly disabled it).\r\n const providerConfig = config.providers?.[config.provider] ?? {\r\n type: config.provider,\r\n apiKey: config.apiKey,\r\n baseUrl: config.baseUrl,\r\n };\r\n let provider: ReturnType<ProviderRegistry['create']>;\r\n try {\r\n const cfgWithType = { ...providerConfig, type: config.provider };\r\n if (config.features.modelsRegistry && providerRegistry.has(config.provider)) {\r\n // Catalog-backed type: registry knows it, so use the factory. Config\r\n // overrides (family, baseUrl, envVars) still apply inside `makeProvider`.\r\n provider = providerRegistry.create(cfgWithType);\r\n } else {\r\n // Custom provider (not in catalog), or modelsRegistry feature\r\n // disabled. Requires `family` to be set in the saved config.\r\n provider = makeProviderFromConfig(config.provider, cfgWithType);\r\n }\r\n } catch (err) {\r\n process.stderr.write(\r\n `Failed to create provider: ${err instanceof Error ? err.message : err}\\n`,\r\n );\r\n await reader.close();\r\n return 2;\r\n }\r\n\r\n // Build system prompt\r\n const promptBuilder = container.resolve(TOKENS.SystemPromptBuilder) as SystemPromptBuilder;\r\n const systemPrompt = await promptBuilder.build({\r\n cwd,\r\n projectRoot,\r\n tools: toolRegistry.list(),\r\n provider: config.provider,\r\n model: config.model,\r\n });\r\n\r\n // Session — fresh by default, or resumed from disk if --resume <id> was passed.\r\n const sessionStore = container.resolve(TOKENS.SessionStore);\r\n let resumeId = typeof flags['resume'] === 'string' ? flags['resume'] : undefined;\r\n\r\n // Crash recovery: if the last interactive run was killed mid-flight,\r\n // its `active.json` lockfile is still on disk and the session has no\r\n // `session_end` event. Offer to resume it before opening a fresh one.\r\n // Skipped when the user explicitly chose `--resume <id>` or asked to\r\n // bypass with `--no-recovery`.\r\n const recoveryLock = new RecoveryLock({\r\n dir: wpaths.projectSessions,\r\n sessionStore,\r\n });\r\n if (!resumeId && !flags['no-recovery']) {\r\n const abandoned = await recoveryLock.checkAbandoned();\r\n if (abandoned && abandoned.messageCount > 0) {\r\n const choice = await promptRecovery(reader, renderer, abandoned, !!flags['recover']);\r\n if (choice === 'resume') {\r\n resumeId = abandoned.sessionId;\r\n } else if (choice === 'delete') {\r\n await sessionStore.delete(abandoned.sessionId).catch(() => undefined);\r\n await recoveryLock.clear();\r\n } else {\r\n // 'skip' — leave the file on disk, just clear the lock so we\r\n // don't ask again every launch.\r\n await recoveryLock.clear();\r\n }\r\n } else if (abandoned) {\r\n // Empty session (no real work done) — silently discard.\r\n await sessionStore.delete(abandoned.sessionId).catch(() => undefined);\r\n await recoveryLock.clear();\r\n }\r\n }\r\n\r\n let session;\r\n let restoredMessages: import('@wrongstack/core').Message[] = [];\r\n if (resumeId) {\r\n try {\r\n const resumed = await sessionStore.resume(resumeId);\r\n session = resumed.writer;\r\n restoredMessages = resumed.data.messages;\r\n renderer.writeInfo(\r\n `Resumed session ${resumed.data.metadata.id} — ${restoredMessages.length} messages, ${resumed.data.usage.input + resumed.data.usage.output} tokens used previously.`,\r\n );\r\n } catch (err) {\r\n renderer.writeError(`Resume failed: ${err instanceof Error ? err.message : String(err)}`);\r\n return 2;\r\n }\r\n } else {\r\n session = await sessionStore.create({\r\n id: '',\r\n title: '',\r\n model: config.model,\r\n provider: config.provider,\r\n });\r\n }\r\n\r\n // Claim the lock for this session. Released in the finally block below.\r\n await recoveryLock.write(session.id).catch(() => undefined);\r\n\r\n // Attachment store: per-session, spooled under sessions/<id>/attachments/.\r\n const attachments = new DefaultAttachmentStore({\r\n spoolDir: path.join(wpaths.projectSessions, session.id, 'attachments'),\r\n });\r\n\r\n // Queue persistence (TUI only — the REPL has no concurrent input).\r\n // Lives next to attachments so deleting the session dir cleans both.\r\n const queueStore = new QueueStore({\r\n dir: path.join(wpaths.projectSessions, session.id),\r\n });\r\n\r\n const tokenCounter = container.resolve(TOKENS.TokenCounter);\r\n\r\n // Session stats tracker — subscribes to events; rendered at the end.\r\n const stats = new SessionStats(events, tokenCounter);\r\n\r\n // Last-N error ring buffer surfaced by /diag. Captures whatever `error`\r\n // events the agent emits during a run (provider failures, retries, etc).\r\n const errorRing: { ts: string; phase: string; code: string; message: string }[] = [];\r\n events.on('error', (e) => {\r\n const err = e.err as unknown;\r\n const code =\r\n err && typeof err === 'object' && 'code' in err && typeof (err as { code: unknown }).code === 'string'\r\n ? (err as { code: string }).code\r\n : 'UNKNOWN';\r\n const message = e.err instanceof Error ? e.err.message : String(e.err);\r\n errorRing.push({ ts: new Date().toISOString(), phase: e.phase, code, message });\r\n if (errorRing.length > 5) errorRing.shift();\r\n });\r\n\r\n const ctxSignal = new AbortController().signal;\r\n const context = new Context({\r\n systemPrompt,\r\n provider,\r\n session,\r\n signal: ctxSignal,\r\n tokenCounter,\r\n cwd,\r\n projectRoot,\r\n model: config.model,\r\n });\r\n // Hydrate the transcript when resuming so the model sees the prior\r\n // conversation. Order is preserved from the JSONL log.\r\n if (restoredMessages.length > 0) {\r\n context.state.replaceMessages(restoredMessages);\r\n }\r\n\r\n const pipelines = createDefaultPipelines();\r\n\r\n // L1-F error boundary: a crashing plugin-owned middleware shouldn't kill\r\n // the agent run. Core-owned middleware still rethrows so genuine bugs in\r\n // the framework surface loudly. Plugin owners are identified by the\r\n // `owner` field set by the slash-command/middleware registration helper.\r\n const installBoundary = <T,>(p: { setErrorHandler: (h: (ev: { middleware: string; owner?: string; err: unknown }) => 'rethrow' | 'swallow') => unknown }) => {\r\n p.setErrorHandler((ev) => {\r\n const fromPlugin = !!ev.owner && ev.owner !== 'core';\r\n logger.error(\r\n `Pipeline middleware \"${ev.middleware}\" crashed (owner=${ev.owner ?? 'unknown'}); ${fromPlugin ? 'swallowed' : 'rethrown'}`,\r\n ev.err,\r\n );\r\n events.emit('error', {\r\n err: ev.err instanceof Error ? ev.err : new Error(String(ev.err)),\r\n phase: `pipeline:${ev.middleware}`,\r\n });\r\n return fromPlugin ? 'swallow' : 'rethrow';\r\n });\r\n };\r\n installBoundary(pipelines.request);\r\n installBoundary(pipelines.response);\r\n installBoundary(pipelines.toolCall);\r\n installBoundary(pipelines.userInput);\r\n installBoundary(pipelines.assistantOutput);\r\n installBoundary(pipelines.contextWindow);\r\n\r\n // Resolve compactor — bound earlier (strategy-aware binding moved before provider creation)\r\n const compactor = container.resolve(TOKENS.Compactor);\r\n\r\n // Auto-compaction: monitor token load and compact when thresholds are crossed.\r\n // Skipped when config.context.autoCompact is false.\r\n //\r\n // Resolve the *model-specific* maxContext via the registry — the\r\n // provider object only knows its family default (e.g. anthropic =\r\n // 200k), which is wrong for variants like Claude Opus 4.7 with the\r\n // 1M-context beta. Falls back to the provider baseline when the\r\n // registry can't resolve the model.\r\n const resolvedCaps = await capabilitiesFor(modelsRegistry, config.provider, context.model).catch(\r\n () => undefined,\r\n );\r\n const effectiveMaxContext =\r\n config.context.effectiveMaxContext ??\r\n resolvedCaps?.maxContext ??\r\n provider.capabilities.maxContext;\r\n\r\n // Helper: keep the spinner's context chip in sync with the latest\r\n // provider response and the resolved max-context ceiling.\r\n const updateSpinnerContext = () => {\r\n if (effectiveMaxContext > 0 && lastInputTokens > 0) {\r\n spinner.setContext({ used: lastInputTokens, max: effectiveMaxContext });\r\n } else {\r\n spinner.setContext(undefined);\r\n }\r\n };\r\n\r\n if (config.context.autoCompact !== false) {\r\n const autoCompactor = new AutoCompactionMiddleware(\r\n compactor,\r\n effectiveMaxContext,\r\n (ctx) => {\r\n const msgs = ctx.messages;\r\n let total = 0;\r\n for (const m of msgs) {\r\n if (typeof m.content === 'string') total += Math.ceil(m.content.length / 4);\r\n else if (Array.isArray(m.content)) {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\r\n else if (b.type === 'tool_use' || b.type === 'tool_result') {\r\n total += Math.ceil(JSON.stringify(b).length / 4);\r\n }\r\n }\r\n }\r\n }\r\n return total;\r\n },\r\n {\n warn: config.context.warnThreshold,\n soft: config.context.softThreshold,\n hard: config.context.hardThreshold,\n },\n {\n aggressiveOn: 'soft',\n failureMode: 'throw_on_hard',\n events,\n },\n );\n pipelines.contextWindow.use({\r\n name: 'AutoCompaction',\r\n handler: autoCompactor.handler(),\r\n });\r\n }\r\n\r\n const agent = new Agent({\r\n container,\r\n tools: toolRegistry,\r\n providers: providerRegistry,\r\n events,\r\n pipelines,\r\n context,\r\n maxIterations: config.tools.maxIterations,\r\n iterationTimeoutMs: config.tools.iterationTimeoutMs,\r\n executionStrategy: config.tools.defaultExecutionStrategy,\r\n perIterationOutputCapBytes: config.tools.perIterationOutputCapBytes,\r\n confirmAwaiter: makeConfirmAwaiter(reader),\r\n });\r\n\r\n // MCP servers\r\n const mcpRegistry = new MCPRegistry({ toolRegistry, events, log: logger });\r\n if (config.features.mcp) {\r\n for (const cfg of Object.values(config.mcpServers ?? {})) {\r\n try {\r\n await mcpRegistry.start(cfg);\r\n } catch (err) {\r\n logger.warn(`MCP server \"${cfg.name}\" failed to start`, err);\r\n }\r\n }\r\n }\r\n\r\n // Slash registry — created before plugins so plugins can register commands.\r\n const slashRegistry = new SlashCommandRegistry();\r\n\r\n // Plugins\r\n if (config.features.plugins && config.plugins && config.plugins.length > 0) {\r\n const resolvedPlugins: Plugin[] = [];\r\n for (const p of config.plugins) {\r\n const spec = typeof p === 'string' ? p : p.name;\r\n try {\r\n const mod = (await import(spec)) as { default?: Plugin };\r\n if (mod.default) resolvedPlugins.push(mod.default);\r\n } catch (err) {\r\n logger.warn(`Plugin \"${spec}\" failed to load`, err);\r\n }\r\n }\r\n if (resolvedPlugins.length > 0) {\r\n const { default: createApi } = await import('./plugin-api-factory.js');\r\n await loadPlugins(resolvedPlugins, {\r\n log: logger,\r\n // Each plugin's `configSchema` is validated against the matching\r\n // `Config.extensions[name]` subtree before its `setup()` runs.\r\n // The plugin then reads the same data through `api.config.extensions`\r\n // (or, once L1-B lands, via `ConfigStore.getExtension(name)`).\r\n pluginOptions: config.extensions ?? {},\r\n apiFactory: (plugin) =>\r\n createApi(plugin.name, {\r\n container,\r\n events,\r\n pipelines: pipelines as unknown as Parameters<typeof createApi>[1]['pipelines'],\r\n toolRegistry,\r\n providerRegistry,\r\n slashCommandRegistry: slashRegistry,\r\n mcpRegistry,\r\n config,\r\n log: logger,\r\n }),\r\n });\r\n }\r\n }\r\n\r\n // Build the list of providers the user can actually switch to right\r\n // now: only those whose config has a key (env var or stored\r\n // `apiKey/apiKeys`). We inline the catalog's model list for each one\r\n // so the picker can show a real selection in step 2 — falling back\r\n // to `cfg.models` for custom/LM-Studio-style providers and to the\r\n // catalog list (by `cfg.type` for aliases) otherwise.\r\n const buildPickableProviders = async () => {\r\n const overlay = config.providers ?? {};\r\n let catalog: Awaited<ReturnType<typeof modelsRegistry.listProviders>> = [];\r\n try {\r\n catalog = await modelsRegistry.listProviders();\r\n } catch {\r\n // catalog unavailable — keyed-by-config-only path still works\r\n }\r\n const catalogById = new Map(catalog.map((p) => [p.id, p]));\r\n const hasKey = (id: string): boolean => {\r\n const entry = overlay[id];\r\n const envHit = catalogById.get(id)?.envVars.some((v) => !!process.env[v]);\r\n if (envHit) return true;\r\n if (!entry) return false;\r\n if (typeof entry.apiKey === 'string' && entry.apiKey.length > 0) return true;\r\n if (Array.isArray(entry.apiKeys) && entry.apiKeys.some((k) => k?.apiKey)) return true;\r\n return false;\r\n };\r\n const seen = new Set<string>();\r\n const out: Array<{ id: string; family: string; models: string[] }> = [];\r\n for (const [id, cfg] of Object.entries(overlay)) {\r\n if (!hasKey(id)) continue;\r\n seen.add(id);\r\n const catalogType = cfg.type && cfg.type !== id ? cfg.type : id;\r\n const inherited = catalogById.get(catalogType);\r\n const family = cfg.family ?? inherited?.family ?? 'unsupported';\r\n if (family === 'unsupported') continue;\r\n const models =\r\n cfg.models && cfg.models.length > 0\r\n ? [...cfg.models]\r\n : (inherited?.models ?? []).map((m) => m.id);\r\n out.push({ id, family, models });\r\n }\r\n for (const p of catalog) {\r\n if (seen.has(p.id)) continue;\r\n if (p.family === 'unsupported') continue;\r\n if (!hasKey(p.id)) continue;\r\n out.push({ id: p.id, family: p.family, models: p.models.map((m) => m.id) });\r\n }\r\n return out;\r\n };\r\n\r\n // Build provider+model switch as a single callback. The TUI picker\r\n // calls this after the user confirms a (provider, model) pair; we\r\n // construct a fresh Provider instance, swap it onto the live context,\r\n // and rebuild the frozen config so other consumers see the new ids.\r\n const switchProviderAndModel = (providerId: string, modelId: string): string | null => {\r\n try {\r\n const newCfg = config.providers?.[providerId] ?? {\r\n type: providerId,\r\n apiKey: config.apiKey,\r\n baseUrl: config.baseUrl,\r\n };\r\n const cfgWithType = { ...newCfg, type: providerId };\r\n const newProvider =\r\n config.features.modelsRegistry && providerRegistry.has(providerId)\r\n ? providerRegistry.create(cfgWithType)\r\n : makeProviderFromConfig(providerId, cfgWithType);\r\n context.provider = newProvider;\r\n context.model = modelId;\r\n config = patchConfig(config, { provider: providerId, model: modelId });\r\n // L1-B: propagate the change to the ConfigStore so any subsystem\r\n // that subscribed via .watch() re-renders. Crucially, /diag now\r\n // reads the live provider via the store.\r\n configStore.update({ provider: providerId, model: modelId });\r\n return null;\r\n } catch (err) {\r\n return err instanceof Error ? err.message : String(err);\r\n }\r\n };\r\n\r\n // L1-E: lazily-instantiated multi-agent host. Wired into /spawn and\r\n // /agents slash commands; constructed on first invocation so users\r\n // who never spawn subagents pay nothing.\r\n const multiAgentHost = new MultiAgentHost({\r\n container,\r\n toolRegistry,\r\n providerRegistry,\r\n configStore,\r\n events,\r\n systemPromptBuilder: promptBuilder,\r\n session,\r\n tokenCounter,\r\n projectRoot,\r\n cwd,\r\n });\r\n\r\n const slashCmds = buildBuiltinSlashCommands({\r\n registry: slashRegistry,\r\n toolRegistry,\r\n compactor: container.resolve(TOKENS.Compactor),\r\n sessionStore,\r\n skillLoader,\r\n tokenCounter,\r\n renderer,\r\n memoryStore,\r\n context,\r\n metricsSink,\r\n healthRegistry,\r\n onSpawn: async (description) => {\r\n const { subagentId, taskId } = await multiAgentHost.spawn(description);\r\n return `Spawned subagent ${subagentId} for task ${taskId}. Use /agents to track progress.`;\r\n },\r\n onAgents: () => {\r\n const s = multiAgentHost.status();\r\n const lines = [s.summary];\r\n for (const p of s.pending) {\r\n lines.push(` pending ${p.taskId.slice(0, 8)} → ${p.description.slice(0, 60)}`);\r\n }\r\n for (const r of s.completed) {\r\n lines.push(\r\n ` ${r.status === 'success' ? color.green('✓') : color.red('✗')} ${r.taskId.slice(0, 8)} ${r.iterations}it ${r.toolCalls}tc ${r.durationMs}ms`,\r\n );\r\n }\r\n return lines.join('\\n');\r\n },\r\n onExit: () => {\r\n void mcpRegistry.stopAll();\r\n },\r\n onClear: () => {\r\n // In TUI mode Ink owns the live area; writing `\\x1b[2J` here would\r\n // fight Ink's cursor math and leave the status bar smeared. The\r\n // context/memory reset inside /clear is enough — the user can\r\n // scroll up to see prior turns in scrollback. In REPL we erase\r\n // the visible screen + scrollback (`\\x1b[3J`) so the next prompt\r\n // starts on a fresh terminal.\r\n if (flags.tui && !flags['no-tui']) return;\r\n try {\r\n process.stdout.write('\\x1b[2J\\x1b[3J\\x1b[H');\r\n } catch {\r\n // stdout may be closed during shutdown — ignore.\r\n }\r\n },\r\n onDiag: () => {\r\n const u = tokenCounter.total();\r\n const cost = tokenCounter.estimateCost();\r\n const errSection = errorRing.length === 0\r\n ? []\r\n : [\r\n '',\r\n `${color.bold('Recent errors')} (last ${errorRing.length}):`,\r\n ...errorRing.map((e) => ` [${e.ts}] ${e.phase} ${e.code} — ${e.message}`),\r\n ];\r\n // Read current provider from the ConfigStore so /diag always shows\r\n // the live value, even if /model swapped it mid-session (L1-B).\r\n const liveCfg = configStore.get();\r\n return [\r\n `${color.bold('WrongStack diag')}`,\r\n ` provider: ${liveCfg.provider} / ${context.model}`,\r\n ` projectRoot: ${projectRoot}`,\r\n ` tokens: in ${u.input} out ${u.output} cacheR ${u.cacheRead ?? 0}`,\r\n ` cost: $${cost.total.toFixed(4)}`,\r\n ` tools: ${toolRegistry.list().length}`,\r\n ` mcpServers: ${mcpRegistry.list().length}`,\r\n ...errSection,\r\n ].join('\\n');\r\n },\r\n onStats: () => stats.format(),\r\n });\r\n for (const cmd of slashCmds) slashRegistry.register(cmd);\r\n\r\n // Single-shot vs REPL\r\n let code = 0;\r\n try {\r\n // --prompt flag takes precedence: treat it like a positional query\r\n const promptFlag = typeof flags['prompt'] === 'string' ? flags['prompt'] : undefined;\r\n if (promptFlag) {\r\n positional.unshift(promptFlag);\r\n }\r\n if (positional.length > 0 || promptFlag) {\r\n const query = positional.join(' ');\r\n const ctrl = new AbortController();\r\n const onSigint = () => ctrl.abort();\r\n process.on('SIGINT', onSigint);\r\n const startedAt = Date.now();\r\n const before = tokenCounter.total();\r\n const costBefore = tokenCounter.estimateCost().total;\r\n let result: import('@wrongstack/core').RunResult;\r\n try {\r\n result = await agent.run(query, { signal: ctrl.signal });\r\n } finally {\r\n process.off('SIGINT', onSigint);\r\n }\r\n const after = tokenCounter.total();\r\n const costAfter = tokenCounter.estimateCost().total;\r\n const usage = {\r\n input: after.input - before.input,\r\n output: after.output - before.output,\r\n iterations: result.iterations,\r\n cost: costAfter - costBefore,\r\n elapsedMs: Date.now() - startedAt,\r\n };\r\n if (flags['output-json']) {\r\n const json = JSON.stringify({\r\n status: result.status,\r\n finalText: result.finalText ?? null,\r\n error: result.error\r\n ? {\r\n code: result.error.code,\r\n subsystem: result.error.subsystem,\r\n severity: result.error.severity,\r\n recoverable: result.error.recoverable,\r\n message: result.error.message,\r\n context: result.error.context ?? null,\r\n }\r\n : null,\r\n usage,\r\n });\r\n process.stdout.write(json + '\\n');\r\n } else {\r\n if (result.status === 'failed') {\r\n code = 1;\r\n const err = result.error;\r\n if (err) {\r\n const tag = err.recoverable ? ' (recoverable)' : '';\r\n renderer.writeError(`Failed [${err.severity}]${tag}: ${err.describe()}`);\r\n } else {\r\n renderer.writeError('Failed.');\r\n }\r\n } else if (result.status === 'aborted') {\r\n code = 130;\r\n renderer.writeWarning('Aborted.');\r\n } else if (result.status === 'max_iterations') {\r\n code = 1;\r\n renderer.writeWarning(`Hit max iterations (${result.iterations}).`);\r\n }\r\n if (result.finalText) renderer.write('\\n' + result.finalText + '\\n');\r\n renderer.write(\r\n '\\n' +\r\n color.dim(\r\n `[in: ${fmtTok(usage.input)} out: ${fmtTok(usage.output)} iters: ${usage.iterations} cost: ${usage.cost.toFixed(4)} ${(usage.elapsedMs / 1000).toFixed(1)}s]`,\r\n ) +\r\n '\\n',\r\n );\r\n }\r\n } else if (flags.tui && !flags['no-tui']) {\r\n // Lazy-load to avoid pulling React/Ink into the cold path for non-TUI usage.\r\n const { runTui } = await import('@wrongstack/tui');\r\n // Silence stdout writes from the renderer while Ink owns the\r\n // terminal. The tool executor calls renderer.writeToolCall /\r\n // writeToolResult on every tool execution; if those raw writes\r\n // land in stdout alongside Ink's redraws, the cursor math\r\n // breaks and the input + status bar end up duplicated in\r\n // scrollback (and in alt-screen, smeared across the buffer).\r\n // The TUI shows tool calls via the `tool.executed` event in\r\n // its own <History> component, so the renderer has nothing\r\n // useful to add here anyway.\r\n renderer.setSilent(true);\r\n // Resolve banner-only metadata: family (effective wire family the\r\n // provider is configured to speak) + the last 3 chars of the active\r\n // API key. Source order matches what `makeProvider` actually uses\r\n // at runtime, so the visible tail matches the key the agent will\r\n // send. Env-sourced keys are included so users using e.g.\r\n // ANTHROPIC_API_KEY without storing a config key still see a tail.\r\n const banneredFamily = savedProviderCfg?.family ?? resolvedProvider?.family;\r\n const banneredKey =\r\n savedProviderCfg?.apiKey ??\r\n config.apiKey ??\r\n (resolvedProvider?.envVars ?? savedProviderCfg?.envVars ?? [])\r\n .map((v) => process.env[v])\r\n .find((v): v is string => !!v);\r\n const banneredKeyTail =\r\n banneredKey && banneredKey.length >= 3 ? banneredKey.slice(-3) : undefined;\r\n try {\r\n code = await runTui({\r\n agent,\r\n events,\r\n slashRegistry,\r\n attachments,\r\n tokenCounter,\r\n model: context.model,\r\n banner: !flags['no-banner'],\r\n queueStore,\r\n yolo: !!config.yolo,\r\n appVersion: CLI_VERSION,\r\n provider: config.provider,\r\n family: banneredFamily,\r\n keyTail: banneredKeyTail,\r\n getPickableProviders: buildPickableProviders,\r\n switchProviderAndModel,\r\n effectiveMaxContext,\r\n // Opt-in: alt-screen disables the terminal's native scrollback,\r\n // so we default to false. `--no-alt-screen` is kept as a no-op\r\n // for backward compatibility with old invocation scripts.\r\n altScreen: flags['alt-screen'] === true,\r\n // Alt-screen exit erases the TUI view. Print a one-line hint\r\n // into the user's normal terminal so they know the session is\r\n // preserved and can resume it. Skipped automatically when\r\n // alt-screen is off — runTui only fires onAfterExit then.\r\n onAfterExit: () => {\r\n process.stdout.write(\r\n color.dim(`Session saved: ${session.id} — resume with `) +\r\n color.cyan(`wstack resume ${session.id}`) +\r\n '\\n',\r\n );\r\n },\r\n onClearHistory: (dispatch) => {\r\n // Signal the TUI to wipe its history entries and reset the context chip.\r\n // This is fire-and-forget — the slash command has already reset\r\n // agent.ctx + memory; the TUI just needs to stop showing the old\r\n // conversation and stale context bar.\r\n dispatch({ type: 'clearHistory' });\r\n dispatch({ type: 'resetContextChip' });\r\n },\r\n });\r\n } finally {\r\n renderer.setSilent(false);\r\n }\r\n } else if (flags.webui) {\r\n // Start WebUI WebSocket server alongside REPL\r\n const { runWebUI } = await import('./webui-server.js');\r\n // Start the WebSocket server in the background\r\n const webuiPromise = runWebUI({\r\n agent,\r\n events,\r\n session,\r\n port: Number.parseInt(String(flags.port ?? '3457'), 10),\n modelsRegistry,\r\n globalConfigPath: wpaths.globalConfig,\r\n });\r\n // Also run REPL so user can interact in terminal\r\n code = await runRepl({\r\n agent,\r\n renderer,\r\n reader,\r\n slashRegistry,\r\n tokenCounter,\r\n attachments,\r\n effectiveMaxContext,\r\n projectName: path.basename(projectRoot) || undefined,\r\n });\r\n // Wait for webui to complete (only on exit)\r\n await webuiPromise;\r\n } else {\r\n code = await runRepl({\r\n agent,\r\n renderer,\r\n reader,\r\n slashRegistry,\r\n tokenCounter,\r\n attachments,\r\n effectiveMaxContext,\r\n projectName: path.basename(projectRoot) || undefined,\r\n });\r\n }\r\n } finally {\r\n stats.render(renderer);\r\n await mcpRegistry.stopAll();\r\n await session.append({\r\n type: 'session_end',\r\n ts: new Date().toISOString(),\r\n usage: tokenCounter.total(),\r\n });\r\n await session.close();\r\n await recoveryLock.clear().catch(() => undefined);\r\n await reader.close();\r\n }\r\n return code;\r\n}\r\n\r\n/**\r\n * Prompt the user about an abandoned session. The lockfile lifecycle\r\n * guarantees we only get here when the previous instance died without\r\n * writing `session_end` AND there's real work on disk (≥1 message).\r\n *\r\n * `--recover` short-circuits to \"resume\" without asking; piped/non-TTY\r\n * input degrades to the same — the alternative is hanging on stdin or\r\n * forcing the user to remember a flag they never typed.\r\n */\r\nasync function promptRecovery(\r\n reader: ReadlineInputReader,\r\n renderer: TerminalRenderer,\r\n abandoned: import('@wrongstack/core').AbandonedSession,\r\n autoRecover: boolean,\r\n): Promise<'resume' | 'delete' | 'skip'> {\r\n const minutes = Math.round(abandoned.ageMs / 60_000);\r\n const ageLabel =\r\n minutes < 1\r\n ? `${Math.round(abandoned.ageMs / 1000)}s ago`\r\n : minutes < 60\r\n ? `${minutes} min ago`\r\n : `${Math.round(minutes / 60)}h ago`;\r\n const summary = `Previous session was killed mid-run: ${abandoned.sessionId} (${abandoned.messageCount} messages, ${ageLabel}).`;\r\n if (autoRecover) {\r\n renderer.writeInfo(`${summary} Auto-resuming (--recover).`);\r\n return 'resume';\r\n }\r\n if (!process.stdin.isTTY) {\r\n renderer.writeInfo(\r\n `${summary} Non-interactive — leaving as-is. Use \\`wstack resume ${abandoned.sessionId}\\` or pass \\`--recover\\` to auto-resume.`,\r\n );\r\n return 'skip';\r\n }\r\n renderer.writeInfo(summary);\r\n const answer = await reader.readKey(\r\n `${color.amber('?')} Recover it? ${color.dim('[')}${color.bold('Y')}es / ${color.bold('n')}o / ${color.bold('d')}elete${color.dim(']')} `,\r\n [\r\n { key: 'y', label: 'yes', value: 'resume' },\r\n { key: 'Y', label: 'yes', value: 'resume' },\r\n { key: '\\r', label: 'yes', value: 'resume' },\r\n { key: '\\n', label: 'yes', value: 'resume' },\r\n { key: 'n', label: 'no', value: 'skip' },\r\n { key: 'N', label: 'no', value: 'skip' },\r\n { key: 'd', label: 'delete', value: 'delete' },\r\n { key: 'D', label: 'delete', value: 'delete' },\r\n ],\r\n );\r\n return answer as 'resume' | 'delete' | 'skip';\r\n}\r\n\r\n\r\n\r\nconst isMain =\r\n import.meta.url === `file://${process.argv[1]?.replace(/\\\\/g, '/')}` ||\r\n process.argv[1]?.endsWith('/cli/dist/index.js') ||\r\n process.argv[1]?.endsWith('\\\\cli\\\\dist\\\\index.js');\r\nif (isMain) {\r\n main(process.argv.slice(2)).then(\r\n (c) => {\r\n // Set exitCode and let Node drain async handles (undici TLS, log file\r\n // flushes) naturally. Force-exit after a brief grace period so we don't\r\n // hang if a plugin or MCP server leaks. Avoids libuv UV_HANDLE_CLOSING\r\n // assertions seen on Windows when process.exit() races with handle teardown.\r\n process.exitCode = c;\r\n setTimeout(() => process.exit(c), 200).unref();\r\n },\r\n (err) => {\r\n process.stderr.write((err instanceof Error ? err.stack : String(err)) + '\\n');\r\n process.exitCode = 1;\r\n setTimeout(() => process.exit(1), 200).unref();\r\n },\r\n );\r\n}\r\n"]}