@moikapy/lich 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +75 -1
  2. package/README.md +59 -7
  3. package/dist/{chunk-JC2G3XH2.js → chunk-CVX7LZWC.js} +2 -2
  4. package/dist/chunk-PZNYVGD4.js +58 -0
  5. package/dist/chunk-PZNYVGD4.js.map +1 -0
  6. package/dist/{chunk-7HLVKVIG.js → chunk-WNFBIX4E.js} +1344 -162
  7. package/dist/chunk-WNFBIX4E.js.map +1 -0
  8. package/dist/cli.js +246 -18
  9. package/dist/cli.js.map +1 -1
  10. package/dist/{gateway-RJFZJEUZ.js → gateway-44QTIJTJ.js} +108 -49
  11. package/dist/gateway-44QTIJTJ.js.map +1 -0
  12. package/dist/index.d.ts +288 -154
  13. package/dist/index.js +5 -3
  14. package/dist/{tui-LOUJVZ6A.js → tui-MEJGEILU.js} +25 -10
  15. package/dist/tui-MEJGEILU.js.map +1 -0
  16. package/docs/.vitepress/config.mts +4 -0
  17. package/docs/architecture/overview.md +30 -18
  18. package/docs/architecture/plugins.md +1 -1
  19. package/docs/architecture/tools.md +36 -4
  20. package/docs/getting-started.md +7 -6
  21. package/docs/index.md +5 -4
  22. package/docs/user-guide/cli.md +21 -8
  23. package/docs/user-guide/games.md +1 -1
  24. package/docs/user-guide/gateway.md +70 -16
  25. package/docs/user-guide/godot.md +3 -1
  26. package/docs/user-guide/library.md +4 -2
  27. package/docs/user-guide/plugins.md +2 -2
  28. package/docs/user-guide/redot.md +93 -0
  29. package/docs/user-guide/tui.md +2 -2
  30. package/examples/game_bridge/README.md +2 -0
  31. package/optional-mcps/godot/manifest.json +6 -0
  32. package/optional-mcps/redot/manifest.json +18 -0
  33. package/package.json +2 -1
  34. package/dist/chunk-6M6OAQGN.js +0 -17
  35. package/dist/chunk-6M6OAQGN.js.map +0 -1
  36. package/dist/chunk-7HLVKVIG.js.map +0 -1
  37. package/dist/gateway-RJFZJEUZ.js.map +0 -1
  38. package/dist/tui-LOUJVZ6A.js.map +0 -1
  39. /package/dist/{chunk-JC2G3XH2.js.map → chunk-CVX7LZWC.js.map} +0 -0
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/cli_config.ts","../src/cli_update.ts","../src/setup_wizard.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Thin zero-dependency CLI for lich: one-shot tasks, interactive chat,\n * config files, and environment-based provider resolution.\n */\nimport { existsSync, readFileSync, realpathSync } from \"node:fs\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { create_agent_with_plugins, type Agent, type AgentRunResult } from \"./agent/agent.js\";\nimport { parse_agent_config, type AgentConfig } from \"./agent/config.js\";\nimport { AgentEmitter } from \"./agent/events.js\";\nimport { LICH_VERSION } from \"./index.js\";\nimport { load_config, config_template, existing_config_path, starter_config_object, write_lich_config } from \"./cli_config.js\";\nimport { run_update } from \"./cli_update.js\";\nimport { ask_line as ask_wizard_line, build_setup_config, collect_setup_answers } from \"./setup_wizard.js\";\nimport { load_theme, notice_flavor } from \"./util/theme.js\";\n\ntype ProviderKind = \"openai_compat\" | \"anthropic\" | \"ollama\";\n\ninterface CliOptions {\n config_path?: string;\n help?: boolean;\n version?: boolean;\n overrides: Record<string, string>;\n positionals: string[];\n}\n\nconst FLAG_KEYS: Record<string, string> = {\n \"--work-dir\": \"work_dir\",\n \"--max-turns\": \"max_turns\",\n \"--model\": \"provider_model\",\n \"--provider-kind\": \"provider_kind\",\n \"--base-url\": \"provider_base_url\",\n \"--api-key-env\": \"provider_api_key_env\",\n \"--system-prompt\": \"system_prompt\",\n \"--session-dir\": \"session_dir\",\n \"--log-level\": \"log_level\",\n \"--theme\": \"theme\",\n};\n\nconst DEFAULT_BASE_URLS: Record<ProviderKind, string> = {\n openai_compat: \"https://api.openai.com/v1\",\n anthropic: \"https://api.anthropic.com\",\n ollama: \"http://localhost:11434\",\n};\n\nconst DEFAULT_ENV_API_KEYS: Record<ProviderKind, string | undefined> = {\n openai_compat: \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n ollama: undefined, // ollama needs no api key\n};\n\nfunction usage_text(): string {\n return [\n \"lich — the undead agent harness\",\n \"\",\n \"Usage:\",\n \" lich open the TUI (first run: setup wizard, then TUI)\",\n \" lich init write .lich/config.json without the wizard (flags apply; never overwrites)\",\n ' lich \"one shot task\" run a single task and print the reply',\n \" lich chat interactive chat (commands: /exit, /quit)\",\n \" lich tui interactive terminal UI (ink)\",\n \" lich gateway <plat..> messaging gateway (webhook|telegram|discord|twitch)\",\n \" lich config print a starter config template (save as .lich/config.json)\",\n \" lich update install a newer @moikapy/lich from npm, if one exists\",\n \" lich --help show this help\",\n \" lich --version print version\",\n \"\",\n \"Flags (before or after the subcommand):\",\n \" --config <path> JSON config file parsed by parse_agent_config\",\n \" --work-dir <path> working directory for tools\",\n \" --max-turns <n> loop turn budget (default 25)\",\n \" --model <m> model name (default from LICH_MODEL)\",\n \" --provider-kind <k> openai_compat | anthropic | ollama (default LICH_PROVIDER_KIND)\",\n \" --base-url <u> provider base url (default LICH_BASE_URL)\",\n \" --api-key-env <NAME> env var holding the api key (default LICH_API_KEY_ENV; unused by ollama)\",\n \" --system-prompt <s> system prompt override\",\n \" --session-dir <path> session transcript directory\",\n \" --log-level <level> debug | info | warn | error\",\n \" --theme <name> display theme (default lich; files in ~/.lich/themes)\",\n ].join(\"\\n\");\n}\n\nfunction error_message(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** Mode-aware config failure message; one-shot keeps the generic variant. */\nfunction error_for_mode(mode: string, base_message: string): string {\n if (mode === \"tui\") {\n return \"lich tui: no model configured — set LICH_MODEL (e.g. glm-5.3-flash:cloud), pass --model, or create .lich/config.json (`lich config` prints a template)\";\n }\n if (mode === \"gateway\") {\n return \"lich gateway: no model configured — set LICH_MODEL (e.g. glm-5.3-flash:cloud), pass --model, or create .lich/config.json (`lich config` prints a template)\";\n }\n if (mode === \"chat\") {\n return \"lich chat: no model configured — set LICH_MODEL (e.g. glm-5.3-flash:cloud), pass --model, or create .lich/config.json (`lich config` prints a template)\";\n }\n return base_message;\n}\n\nfunction parse_args(argv: string[]): CliOptions {\n const options: CliOptions = { overrides: {}, positionals: [] };\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === undefined) {\n break;\n }\n if (arg === \"--help\") {\n options.help = true;\n continue;\n }\n if (arg === \"--version\") {\n options.version = true;\n continue;\n }\n if (arg === \"--config\") {\n const value = argv[index + 1];\n if (value === undefined) {\n throw new Error(\"--config requires a path\");\n }\n options.config_path = value;\n index += 1;\n continue;\n }\n const override_key = FLAG_KEYS[arg];\n if (override_key === undefined) {\n if (arg.startsWith(\"--\") === true) {\n throw new Error(`unknown flag: ${arg}`);\n }\n options.positionals.push(arg);\n continue;\n }\n const value = argv[index + 1];\n if (value === undefined || value.startsWith(\"--\") === true) {\n throw new Error(`${arg} requires a value`);\n }\n options.overrides[override_key] = value;\n index += 1;\n }\n return options;\n}\n\nfunction env_provider(overrides: Record<string, string>): Record<string, unknown> {\n const kind_value = overrides[\"provider_kind\"] ?? process.env.LICH_PROVIDER_KIND ?? \"openai_compat\";\n if (kind_value !== \"openai_compat\" && kind_value !== \"anthropic\" && kind_value !== \"ollama\") {\n throw new Error(`unknown provider kind \"${kind_value}\" (expected openai_compat, anthropic, or ollama)`);\n }\n const kind: ProviderKind = kind_value;\n const model = overrides[\"provider_model\"] ?? process.env.LICH_MODEL;\n if (model === undefined || model.length === 0) {\n throw new Error(\"no model configured: set LICH_MODEL, pass --model, or create .lich/config.json (`lich config` prints a template)\");\n }\n return {\n kind,\n name: \"default\",\n model,\n base_url: overrides[\"provider_base_url\"] ?? process.env.LICH_BASE_URL ?? DEFAULT_BASE_URLS[kind],\n api_key_env: overrides[\"provider_api_key_env\"] ?? process.env.LICH_API_KEY_ENV ?? DEFAULT_ENV_API_KEYS[kind],\n };\n}\n\nfunction load_config_file(config_path: string): Record<string, unknown> {\n try {\n const raw = readFileSync(config_path, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"config root must be a JSON object\");\n }\n return parsed as Record<string, unknown>;\n } catch (error) {\n throw new Error(`cannot use config file ${config_path}: ${error_message(error)}`);\n }\n}\n\nfunction apply_provider_override(config: Record<string, unknown>, overrides: Record<string, string>): void {\n const keys = [\"provider_kind\", \"provider_model\", \"provider_base_url\", \"provider_api_key_env\"] as const;\n const any_present = keys.some((key) => overrides[key] !== undefined);\n if (any_present === false) {\n return;\n }\n const providers = config[\"providers\"];\n if (Array.isArray(providers) === false || providers.length === 0) {\n config[\"providers\"] = [env_provider(overrides)];\n return;\n }\n const first = providers[0];\n if (typeof first !== \"object\" || first === null) {\n throw new Error(\"config providers[0] must be an object\");\n }\n const provider = first as Record<string, unknown>;\n for (const key of keys) {\n const value = overrides[key];\n if (value !== undefined) {\n provider[key.replace(\"provider_\", \"\")] = value;\n }\n }\n}\n\nfunction apply_overrides(config: Record<string, unknown>, overrides: Record<string, string>): void {\n for (const key of [\"work_dir\", \"system_prompt\", \"session_dir\", \"log_level\", \"theme\"]) {\n if (overrides[key] !== undefined) {\n config[key] = overrides[key];\n }\n }\n if (overrides[\"max_turns\"] !== undefined) {\n const turns = Number(overrides[\"max_turns\"]);\n if (Number.isInteger(turns) === false || turns < 1) {\n throw new Error(\"--max-turns must be a positive integer\");\n }\n config[\"max_turns\"] = turns;\n }\n apply_provider_override(config, overrides);\n}\n\n/** Same search as the wizard: `--work-dir` (else cwd), then the user-home file. */\nfunction load_discovered_config(work_dir: string): Record<string, unknown> | undefined {\n const found = existing_config_path(work_dir);\n if (found === undefined) {\n return undefined;\n }\n return load_config(found);\n}\n\nfunction build_config(options: CliOptions): AgentConfig {\n const base =\n options.config_path === undefined\n ? load_discovered_config(work_dir_of(options)) ?? { providers: [env_provider(options.overrides)] }\n : load_config_file(options.config_path);\n apply_overrides(base, options.overrides);\n const providers = base[\"providers\"];\n if (Array.isArray(providers) === false || providers.length === 0) {\n throw new Error(\"no model configured: set LICH_MODEL, pass --model, or create .lich/config.json (`lich config` prints a template)\");\n }\n return parse_agent_config(base);\n}\n\n/** build_config with the failure message prefixed for the invoking subcommand. */\nfunction build_config_for(options: CliOptions, mode: string): AgentConfig {\n try {\n return build_config(options);\n } catch (error) {\n throw new Error(error_for_mode(mode, error_message(error)));\n }\n}\n\nfunction attach_progress(emitter: AgentEmitter): () => void {\n return emitter.on((event) => {\n if (event.type === \"turn_start\") {\n process.stderr.write(`\\n[lich] turn ${event.turn}`);\n return;\n }\n if (event.type === \"tool_call_end\") {\n const status = event.result.ok === true ? \"ok\" : `error: ${event.result.error ?? \"\"}`;\n process.stderr.write(`\\n[lich] ${event.call.name}: ${status}`);\n return;\n }\n if (event.type === \"final\") {\n process.stderr.write(\"\\n\");\n }\n });\n}\n\nexport async function run_one_shot(config: unknown, input: string): Promise<number> {\n const agent = await create_agent_with_plugins(config);\n const theme = load_theme(agent.config.theme);\n const stop_progress = attach_progress(agent.events);\n let result: AgentRunResult;\n try {\n result = await agent.run({ input });\n } finally {\n stop_progress();\n }\n const final = result.outcome.final;\n if (final !== undefined && final.content.length > 0) {\n process.stdout.write(`${final.content}\\n`);\n }\n if (result.outcome.stopped_reason === \"budget\") {\n process.stderr.write(budget_stderr_line(result.outcome.turns_used, theme.notices.budget_exhausted));\n return 1;\n }\n if (result.outcome.stopped_reason === \"aborted\") {\n process.stderr.write(\"[lich] run aborted\\n\");\n return 1;\n }\n return 0;\n}\n\nasync function run_chat_turn(agent: Agent, input: string): Promise<void> {\n const stop_progress = attach_progress(agent.events);\n try {\n const result = await agent.run({ input });\n const final = result.outcome.final;\n if (final !== undefined && final.content.length > 0) {\n process.stdout.write(`${final.content}\\n`);\n }\n process.stdout.write(`[turns ${result.outcome.turns_used} | tokens ${result.usage_total.total_tokens}]\\n`);\n } catch (error) {\n process.stderr.write(`[lich] ${error_message(error)}\\n`);\n } finally {\n stop_progress();\n }\n}\n\nfunction ask_line(rl: Interface): Promise<string> {\n return new Promise((resolve) => {\n const on_close = (): void => resolve(\"\");\n rl.question(\"> \", (answer) => {\n rl.removeListener(\"close\", on_close);\n resolve(answer);\n });\n rl.once(\"close\", on_close);\n });\n}\n\nfunction budget_stderr_line(turns: number, notice: string): string {\n const flavor = notice_flavor(notice);\n const suffix = flavor.length === 0 ? \"\" : ` — ${flavor}`;\n return `[lich] budget exhausted after ${turns} turns${suffix}\\n`;\n}\n\nexport async function run_chat(config: unknown): Promise<number> {\n const agent = await create_agent_with_plugins(config);\n const theme = load_theme(agent.config.theme);\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n for (;;) {\n const line = await ask_line(rl);\n if (line.trim() === \"\") {\n return 0;\n }\n const command = line.trim();\n if (command === \"/exit\" || command === \"/quit\") {\n process.stdout.write(`${theme.glyph} ${theme.goodbye}\\n`);\n return 0;\n }\n await run_chat_turn(agent, command);\n }\n } finally {\n rl.close();\n }\n}\n\nfunction model_hint(options: CliOptions): string | undefined {\n const model = options.overrides[\"provider_model\"] ?? process.env.LICH_MODEL;\n if (model === undefined || model.length === 0) {\n return undefined;\n }\n return model;\n}\n\nfunction skip_setup_message(existing: string): string {\n if (existing.endsWith(`${path.sep}.lich${path.sep}config.json`) === true) {\n return `lich: .lich/config.json already exists at ${existing}; skipping setup`;\n }\n return `lich: config already exists at ${existing}; skipping setup`;\n}\n\nfunction work_dir_of(options: CliOptions): string {\n return options.overrides[\"work_dir\"] ?? process.cwd();\n}\n\nasync function offer_wizard(work_dir: string, hint?: string): Promise<string | \"cancelled\"> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answers = await collect_setup_answers(work_dir, (prompt) => ask_wizard_line(rl, prompt), hint);\n if (answers === undefined) {\n return \"cancelled\";\n }\n const result = write_lich_config(work_dir, build_setup_config(answers));\n process.stdout.write(`${result.message}\\n`);\n return result.path;\n } finally {\n rl.close();\n }\n}\n\nasync function maybe_first_run(options: CliOptions, work_dir: string): Promise<number | undefined> {\n if (options.config_path !== undefined) {\n return undefined;\n }\n const existing = existing_config_path(work_dir);\n if (existing !== undefined) {\n process.stdout.write(`${skip_setup_message(existing)}\\n`);\n options.config_path = existing;\n return undefined;\n }\n const wrote = await offer_wizard(work_dir, model_hint(options));\n if (wrote === \"cancelled\") {\n process.stderr.write(\"lich: setup cancelled; nothing written\\n\");\n return 1;\n }\n options.config_path = wrote;\n return undefined;\n}\n\nasync function run_bare(options: CliOptions): Promise<number> {\n if (process.stdin.isTTY !== true) {\n process.stderr.write(\"lich: stdin is not a TTY; skipping setup wizard. Run `lich init` to write .lich/config.json, or `lich --help` for usage.\\n\");\n return 1;\n }\n const work_dir = work_dir_of(options);\n const stopped = await maybe_first_run(options, work_dir);\n if (stopped !== undefined) {\n return stopped;\n }\n return run_tui_entry(build_config_for(options, \"tui\"));\n}\n\nfunction model_still_placeholder(config: Record<string, unknown>): boolean {\n const providers = config[\"providers\"];\n const first = Array.isArray(providers) === true ? providers[0] : undefined;\n if (typeof first !== \"object\" || first === null) {\n return false;\n }\n return (first as Record<string, unknown>)[\"model\"] === \"<model-name>\";\n}\n\nfunction run_init(options: CliOptions): number {\n if (options.positionals.length > 1) {\n throw new Error(\"init takes no extra arguments\");\n }\n const config = starter_config_object();\n apply_overrides(config, options.overrides);\n const result = write_lich_config(work_dir_of(options), config);\n process.stdout.write(`${result.message}\\n`);\n if (result.written === true && model_still_placeholder(config) === true) {\n process.stdout.write(\"next: edit the model in .lich/config.json if needed, then run `lich`\\n\");\n }\n return 0;\n}\n\nasync function run_tui_entry(config: ReturnType<typeof build_config>): Promise<number> {\n const { run_tui } = await import(\"./tui.js\");\n return run_tui(config);\n}\n\nfunction gateway_platforms(config: AgentConfig, cli_platforms: readonly string[]): readonly string[] {\n if (cli_platforms.length > 0) {\n return cli_platforms;\n }\n const configured = config.gateway?.platforms ?? [];\n return configured.length === 0 ? [\"webhook\"] : configured;\n}\n\nasync function run_gateway_entry(config: AgentConfig, platforms: string[]): Promise<number> {\n const { run_gateway } = await import(\"./gateway.js\");\n return run_gateway(config, gateway_platforms(config, platforms));\n}\n\nexport interface CliEntryInput {\n bun: boolean;\n import_meta_main: boolean | undefined;\n module_url: string;\n argv1: string | undefined;\n}\n\n/** Bun uses `import.meta.main`. Node compares argv to this file, including a bin symlink. */\nexport function is_cli_entry(input: CliEntryInput): boolean {\n if (input.bun === true) {\n return input.import_meta_main === true;\n }\n return node_entry_matches(input.module_url, input.argv1);\n}\n\nfunction is_main_module(): boolean {\n return is_cli_entry({\n bun: process.versions.bun !== undefined,\n import_meta_main: import.meta.main,\n module_url: import.meta.url,\n argv1: process.argv[1],\n });\n}\n\nfunction node_entry_matches(module_url: string, entry: string | undefined): boolean {\n if (entry === undefined || entry === \"\") {\n return false;\n }\n const resolved = path.resolve(entry);\n if (module_url === pathToFileURL(resolved).href) {\n return true;\n }\n return same_real_file(fileURLToPath(module_url), resolved);\n}\n\nfunction same_real_file(left: string, right: string): boolean {\n if (existsSync(left) === false || existsSync(right) === false) {\n return false;\n }\n return realpathSync(left) === realpathSync(right);\n}\n\nexport async function run_cli(argv: string[]): Promise<number> {\n const options = parse_args(argv);\n if (options.help === true) {\n process.stdout.write(`${usage_text()}\\n`);\n return 0;\n }\n if (options.version === true) {\n process.stdout.write(`${LICH_VERSION}\\n`);\n return 0;\n }\n const [first] = options.positionals;\n if (first === undefined) {\n return run_bare(options);\n }\n if (first === \"init\") {\n return run_init(options);\n }\n if (first === \"config\") {\n process.stdout.write(`${config_template()}\\n`);\n return 0;\n }\n if (first === \"update\") {\n if (options.positionals.length > 1) {\n throw new Error(\"update takes no arguments\");\n }\n return run_update(fileURLToPath(import.meta.url));\n }\n if (first === \"chat\") {\n if (options.positionals.length > 1) {\n throw new Error(\"chat mode takes no task argument\");\n }\n return run_chat(build_config_for(options, first));\n }\n if (first === \"tui\") {\n return run_tui_entry(build_config_for(options, first));\n }\n if (first === \"gateway\") {\n return run_gateway_entry(build_config_for(options, first), options.positionals.slice(1));\n }\n return run_one_shot(build_config_for(options, \"one-shot\"), options.positionals.join(\" \"));\n}\n\nif (is_main_module() === true) {\n run_cli(process.argv.slice(2))\n .then((code) => {\n process.exitCode = code;\n })\n .catch((error) => {\n process.stderr.write(`lich: ${error_message(error)}\\n`);\n process.stderr.write(\"run `lich --help` for usage\\n\");\n process.exitCode = 1;\n });\n}","/**\n * Config-file discovery for the CLI: an ordered search chain, safe loading,\n * and a starter template so `lich tui` works with zero environment setup.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { safe_json_parse } from \"./util/json.js\";\n\nconst LICH_DIRNAME = \".lich\";\nconst CONFIG_RELPATH = `${LICH_DIRNAME}/config.json`;\nconst DEFAULT_USER_CONFIG = \".config/lich/config.json\";\n\n/** Ordered absolute chain: work_dir (default cwd) first, then the user config home. */\nexport function config_search_paths(work_dir?: string): string[] {\n const root = work_dir ?? process.cwd();\n const first = path.resolve(root, CONFIG_RELPATH);\n const second = path.resolve(homedir(), DEFAULT_USER_CONFIG);\n return first === second ? [first] : [first, second];\n}\n\n/** Explicit path must exist (else throw); otherwise walk the chain, undefined when absent. */\nexport function find_config_file(explicit?: string): string | undefined {\n if (explicit !== undefined) {\n if (existsSync(explicit) === false) {\n throw new Error(`config not found: ${explicit}`);\n }\n return explicit;\n }\n return existing_config_path(process.cwd());\n}\n\n/** Load the first config found as an object; undefined when absent, throw on bad json. */\nexport function load_config(explicit?: string): Record<string, unknown> | undefined {\n const found = find_config_file(explicit);\n if (found === undefined) {\n return undefined;\n }\n const raw = readFileSync(found, \"utf8\");\n const parsed = safe_json_parse<unknown>(raw);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(`invalid config json: ${found}`);\n }\n return parsed as Record<string, unknown>;\n}\n\n/** Starter config honoring LICH_* env hints; `lich config` prints it. */\nexport function config_template(): string {\n const kind = process.env.LICH_PROVIDER_KIND ?? \"ollama\";\n const provider: Record<string, unknown> = {\n kind,\n name: \"main\",\n model: process.env.LICH_MODEL ?? \"<model-name>\",\n };\n if (kind === \"ollama\") {\n provider[\"base_url\"] = \"http://localhost:11434\";\n }\n return JSON.stringify({ providers: [provider], max_turns: 25, theme: \"lich\" }, null, 2);\n}\n\n/** mkdir -p `${work_dir}/.lich` and return the directory path. */\nexport function ensure_lich_config_dir(work_dir: string): string {\n const dir = path.resolve(work_dir, LICH_DIRNAME);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n\n/** Project config path: the first entry in the search chain. */\nexport function project_config_path(work_dir: string): string {\n return path.resolve(work_dir, CONFIG_RELPATH);\n}\n\n/** First existing file on `config_search_paths(work_dir)`. */\nexport function existing_config_path(work_dir: string): string | undefined {\n for (const candidate of config_search_paths(work_dir)) {\n if (existsSync(candidate) === true) {\n return candidate;\n }\n }\n return undefined;\n}\n\nexport interface LichConfigWriteResult {\n path: string;\n written: boolean;\n message: string;\n}\n\n/** Parsed `config_template()` object. Does not write. */\nexport function starter_config_object(): Record<string, unknown> {\n const parsed: unknown = JSON.parse(config_template());\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"config template must be a JSON object\");\n }\n return parsed as Record<string, unknown>;\n}\n\n/**\n * Create `.lich/` and write `config.json` once. The only writer of that file.\n * Existing files are left untouched.\n */\nexport function write_lich_config(work_dir: string, config: Record<string, unknown>): LichConfigWriteResult {\n ensure_lich_config_dir(work_dir);\n const file = project_config_path(work_dir);\n if (existsSync(file) === true) {\n return already_exists(file);\n }\n try {\n writeFileSync(file, `${JSON.stringify(config, null, 2)}\\n`, { encoding: \"utf8\", flag: \"wx\" });\n } catch (error) {\n if (is_eexist(error) === true) {\n return already_exists(file);\n }\n throw error;\n }\n return { path: file, written: true, message: `wrote ${file}` };\n}\n\nfunction already_exists(file: string): LichConfigWriteResult {\n return {\n path: file,\n written: false,\n message: `lich: .lich/config.json already exists at ${file}; not overwriting`,\n };\n}\n\nfunction is_eexist(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: unknown }).code === \"EEXIST\";\n}\n","/**\n * `lich update`: compare the installed version to the npm registry and,\n * when newer, shell out to `npm install -g @moikapy/lich@latest`.\n */\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { LICH_VERSION } from \"./index.js\";\n\nexport const PACKAGE_NAME = \"@moikapy/lich\";\nexport const VIEW_ARGS = [\"view\", PACKAGE_NAME, \"version\"] as const;\nexport const INSTALL_ARGS = [\"install\", \"-g\", `${PACKAGE_NAME}@latest`] as const;\n\nexport type InstallKind = \"npm\" | \"git\" | \"npx\";\n\nexport interface CommandResult {\n exit_code: number;\n stdout: string;\n stderr: string;\n error_code?: string;\n}\n\nexport type CommandRunner = (command: string, args: readonly string[]) => Promise<CommandResult>;\n\nexport interface UpdateIo {\n write_stdout: (text: string) => void;\n write_stderr: (text: string) => void;\n}\n\nexport interface UpdateRequest extends UpdateIo {\n installed_version: string;\n install_kind: InstallKind;\n run_command: CommandRunner;\n}\n\ntype Semver = [number, number, number, string];\ntype VersionRelation = \"update\" | \"current\" | \"invalid\";\n\nconst NPM_MISSING =\n \"lich: npm is not on PATH. Install Node.js, or run `npm install -g @moikapy/lich@latest` once npm is available.\\n\";\nconst EXIT_FIRST_HINT =\n \"Exit any running `lich tui` or `lich gateway` first — npm cannot replace the package while those processes are running.\\n\";\n\nfunction parse_semver(version: string): Semver | null {\n const match = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?$/.exec(version.trim());\n if (match === null || match[1] === undefined || match[2] === undefined || match[3] === undefined) {\n return null;\n }\n return [Number(match[1]), Number(match[2]), Number(match[3]), match[4] ?? \"\"];\n}\n\n/** `update` when the registry version is strictly newer than the installed one. */\nexport function version_relation(installed: string, registry: string): VersionRelation {\n const left = parse_semver(installed);\n const right = parse_semver(registry);\n if (left === null || right === null) {\n return \"invalid\";\n }\n for (let index = 0; index < 3; index += 1) {\n const installed_part = left[index];\n const registry_part = right[index];\n if (typeof installed_part !== \"number\" || typeof registry_part !== \"number\") {\n return \"invalid\";\n }\n if (installed_part < registry_part) {\n return \"update\";\n }\n if (installed_part > registry_part) {\n return \"current\";\n }\n }\n if (left[3] !== \"\" && right[3] === \"\") {\n return \"update\";\n }\n return \"current\";\n}\n\n/** npm global, a git clone (`git pull`), or an npx temporary copy. */\nexport function detect_install_kind(\n module_path: string,\n env: NodeJS.ProcessEnv,\n has_git: (dir: string) => boolean,\n): InstallKind {\n if (env.npm_command === \"exec\" || module_path.includes(`${path.sep}_npx${path.sep}`)) {\n return \"npx\";\n }\n let dir = path.dirname(path.resolve(module_path));\n const root = path.parse(dir).root;\n while (dir !== root) {\n if (path.basename(dir) === \"node_modules\") {\n return \"npm\";\n }\n if (has_git(dir) === true) {\n return \"git\";\n }\n const parent = path.dirname(dir);\n if (parent === dir) {\n break;\n }\n dir = parent;\n }\n return \"npm\";\n}\n\nfunction blocked_install_message(kind: InstallKind): string | null {\n if (kind === \"git\") {\n return \"lich: this copy is a git clone, not an npm install. Update with `git pull` in the repository.\\n\";\n }\n if (kind === \"npx\") {\n return \"lich: npx runs a temporary copy and cannot persist an update. Install with `npm install -g @moikapy/lich`.\\n\";\n }\n return null;\n}\n\nfunction registry_version(viewed: CommandResult, request: UpdateRequest): string | null {\n if (viewed.error_code === \"ENOENT\") {\n request.write_stderr(NPM_MISSING);\n return null;\n }\n if (viewed.exit_code !== 0) {\n const detail = viewed.stderr.trim() || viewed.stdout.trim() || `exit ${viewed.exit_code}`;\n request.write_stderr(`lich: could not read the registry version of ${PACKAGE_NAME}: ${detail}\\n`);\n return null;\n }\n const registry = viewed.stdout.trim();\n if (parse_semver(registry) === null) {\n request.write_stderr(`lich: could not read the registry version of ${PACKAGE_NAME}: unexpected version \"${registry}\"\\n`);\n return null;\n }\n return registry;\n}\n\nfunction is_permission_failure(installed: CommandResult): boolean {\n if (installed.error_code === \"EACCES\" || installed.error_code === \"EPERM\") {\n return true;\n }\n const text = `${installed.stderr}\\n${installed.stdout}`.toLowerCase();\n return text.includes(\"eacces\") || text.includes(\"eperm\") || text.includes(\"permission denied\");\n}\n\nfunction report_install(request: UpdateRequest, installed: CommandResult): number {\n if (installed.exit_code === 0) {\n request.write_stdout(`updated ${PACKAGE_NAME}. Run \\`lich --version\\` in a new shell to confirm.\\n`);\n return 0;\n }\n if (installed.error_code === \"ENOENT\") {\n request.write_stderr(NPM_MISSING);\n return 1;\n }\n if (is_permission_failure(installed) === true) {\n request.write_stderr(\"lich: npm install failed (permission denied). Use a writable npm prefix, or run `npm install -g @moikapy/lich@latest` yourself.\\n\");\n return 1;\n }\n const detail = installed.stderr.trim() || `exit ${installed.exit_code}`;\n request.write_stderr(`lich: npm install failed: ${detail}\\n`);\n return 1;\n}\n\nasync function install_if_newer(request: UpdateRequest, registry: string): Promise<number> {\n const relation = version_relation(request.installed_version, registry);\n if (relation === \"invalid\") {\n request.write_stderr(`lich: could not compare versions (installed ${request.installed_version}, registry ${registry})\\n`);\n return 1;\n }\n if (relation !== \"update\") {\n request.write_stdout(`lich ${request.installed_version} is up to date\\n`);\n return 0;\n }\n request.write_stdout(`lich ${request.installed_version} -> ${registry}\\n`);\n request.write_stdout(EXIT_FIRST_HINT);\n const installed = await request.run_command(\"npm\", INSTALL_ARGS);\n return report_install(request, installed);\n}\n\n/** Decide whether to install. Tests inject `run_command` so neither lookup nor install hits the network. */\nexport async function run_lich_update(request: UpdateRequest): Promise<number> {\n const blocked = blocked_install_message(request.install_kind);\n if (blocked !== null) {\n request.write_stderr(blocked);\n return 1;\n }\n const viewed = await request.run_command(\"npm\", VIEW_ARGS);\n const registry = registry_version(viewed, request);\n if (registry === null) {\n return 1;\n }\n return install_if_newer(request, registry);\n}\n\nfunction running_under_bun(): boolean {\n return process.versions.bun !== undefined;\n}\n\n/** Default spawn. Forwards only `npm install` output; `npm view` stays quiet. */\nexport function default_command_runner(command: string, args: readonly string[]): Promise<CommandResult> {\n if (running_under_bun() === true) {\n return bun_command_runner(command, args);\n }\n return node_command_runner(command, args);\n}\n\nfunction node_command_runner(command: string, args: readonly string[]): Promise<CommandResult> {\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n const finish = (result: CommandResult): void => {\n if (settled === true) {\n return;\n }\n settled = true;\n resolve(result);\n };\n const forward = args[0] === \"install\";\n const child = spawn(command, [...args], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n const text = chunk.toString();\n stdout += text;\n if (forward === true) {\n process.stdout.write(text);\n }\n });\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n const text = chunk.toString();\n stderr += text;\n if (forward === true) {\n process.stderr.write(text);\n }\n });\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n finish({ exit_code: 127, stdout, stderr: error.message, error_code: error.code });\n });\n child.on(\"close\", (code) => {\n finish({ exit_code: code ?? 1, stdout, stderr });\n });\n });\n}\n\nasync function read_piped_text(\n stream: ReadableStream<Uint8Array>,\n forward: boolean,\n write: (text: string) => void,\n): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let text = \"\";\n for (;;) {\n const next = await reader.read();\n if (next.done === true) {\n return text;\n }\n const chunk = decoder.decode(next.value, { stream: true });\n text += chunk;\n if (forward === true) {\n write(chunk);\n }\n }\n}\n\nfunction bun_command_runner(command: string, args: readonly string[]): Promise<CommandResult> {\n const forward = args[0] === \"install\";\n try {\n const child = Bun.spawn([command, ...args], {\n stdin: \"ignore\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n return Promise.all([\n read_piped_text(child.stdout, forward, (text) => {\n process.stdout.write(text);\n }),\n read_piped_text(child.stderr, forward, (text) => {\n process.stderr.write(text);\n }),\n child.exited,\n ]).then(([stdout, stderr, exit_code]) => ({ exit_code, stdout, stderr }));\n } catch (error) {\n const coded = error as { code?: string; message?: string };\n const stderr = typeof coded.message === \"string\" ? coded.message : \"spawn failed\";\n return Promise.resolve({ exit_code: 127, stdout: \"\", stderr, error_code: coded.code });\n }\n}\n\nexport async function run_update(module_path: string): Promise<number> {\n return run_lich_update({\n installed_version: LICH_VERSION,\n install_kind: detect_install_kind(module_path, process.env, (dir) => existsSync(path.join(dir, \".git\"))),\n run_command: default_command_runner,\n write_stdout: (text) => {\n process.stdout.write(text);\n },\n write_stderr: (text) => {\n process.stderr.write(text);\n },\n });\n}\n","/**\n * First-run setup wizard. Builds an AgentConfig object; does not write the file.\n * Callers pass the object to write_lich_config.\n */\nimport { readdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Interface } from \"node:readline\";\nimport { DEFAULT_GATEWAY_TOKEN_ENVS, is_env_var_name } from \"./gateway/token_env.js\";\n\nexport type ProviderKind = \"ollama\" | \"openai_compat\" | \"anthropic\";\n\nconst PLATFORMS = [\"webhook\", \"telegram\", \"discord\", \"twitch\"] as const;\nconst PLUGIN_EXT = /\\.(mjs|js|ts|mts|cts|jsx|tsx)$/;\n\nconst PROVIDER_DEFAULTS: Record<ProviderKind, { model: string; base_url: string; api_key_env?: string }> = {\n ollama: { model: \"llama3.2\", base_url: \"http://localhost:11434\" },\n openai_compat: { model: \"gpt-4.1-mini\", base_url: \"https://api.openai.com/v1\", api_key_env: \"OPENAI_API_KEY\" },\n anthropic: { model: \"claude-sonnet-4\", base_url: \"https://api.anthropic.com\", api_key_env: \"ANTHROPIC_API_KEY\" },\n};\n\nexport interface SetupAnswers {\n agent_name: string;\n provider_kind: ProviderKind;\n model: string;\n base_url: string;\n api_key_env?: string;\n platforms: string[];\n token_envs: Record<string, string>;\n plugins: string[];\n}\n\nexport type AskLine = (prompt: string) => Promise<string | undefined>;\n\n/** Plugin entry files under `.lich/plugins`, as work_dir-relative specifiers. */\nfunction discover_plugin_entries(work_dir: string): string[] {\n const dir = path.resolve(work_dir, \".lich\", \"plugins\");\n let names: string[];\n try {\n names = readdirSync(dir);\n } catch {\n return [];\n }\n const entries: string[] = [];\n for (const name of names) {\n if (PLUGIN_EXT.test(name) === true) {\n entries.push(path.posix.join(\".lich/plugins\", name));\n }\n }\n return entries;\n}\n\n/** Object the agent schema already accepts. Omits gateway when no platforms were chosen. */\nexport function build_setup_config(answers: SetupAnswers): Record<string, unknown> {\n const provider: Record<string, unknown> = {\n kind: answers.provider_kind,\n name: \"main\",\n model: answers.model,\n base_url: answers.base_url,\n };\n if (answers.api_key_env !== undefined && answers.api_key_env.length > 0) {\n provider[\"api_key_env\"] = answers.api_key_env;\n }\n const config: Record<string, unknown> = {\n agent_name: answers.agent_name,\n providers: [provider],\n max_turns: 25,\n plugins: answers.plugins,\n };\n if (answers.platforms.length > 0) {\n config[\"gateway\"] = { platforms: answers.platforms, token_envs: answers.token_envs };\n }\n return config;\n}\n\nfunction blank_as_default(raw: string, fallback: string): string {\n const trimmed = raw.trim();\n return trimmed.length === 0 ? fallback : trimmed;\n}\n\nfunction parse_kind(raw: string): ProviderKind | undefined {\n const trimmed = raw.trim();\n const kind = trimmed.length === 0 ? \"ollama\" : trimmed;\n if (kind === \"ollama\" || kind === \"openai_compat\" || kind === \"anthropic\") {\n return kind;\n }\n return undefined;\n}\n\nfunction parse_platforms(raw: string): string[] {\n const seen = new Set<string>();\n const platforms: string[] = [];\n for (const part of raw.split(\",\")) {\n const name = part.trim().toLowerCase();\n if ((PLATFORMS as readonly string[]).includes(name) === false || seen.has(name) === true) {\n continue;\n }\n seen.add(name);\n platforms.push(name);\n }\n return platforms;\n}\n\n/** One prompt. Resolves undefined on Ctrl+C or a closed stream so nothing is written. */\nexport function ask_line(rl: Interface, prompt: string): Promise<string | undefined> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = (value: string | undefined): void => {\n if (settled === true) {\n return;\n }\n settled = true;\n rl.removeListener(\"SIGINT\", on_sigint);\n rl.removeListener(\"close\", on_close);\n resolve(value);\n };\n const on_sigint = (): void => finish(undefined);\n const on_close = (): void => finish(undefined);\n rl.once(\"SIGINT\", on_sigint);\n rl.once(\"close\", on_close);\n rl.question(prompt, (answer) => finish(answer));\n });\n}\n\nasync function ask_name(ask: AskLine): Promise<string | undefined> {\n const raw = await ask(\"Agent name [lich]: \");\n if (raw === undefined) {\n return undefined;\n }\n return blank_as_default(raw, \"lich\");\n}\n\nasync function ask_provider(\n ask: AskLine,\n model_hint?: string,\n): Promise<Pick<SetupAnswers, \"provider_kind\" | \"model\" | \"base_url\" | \"api_key_env\"> | undefined> {\n const kind_raw = await ask(\"Provider kind (ollama|openai_compat|anthropic) [ollama]: \");\n if (kind_raw === undefined) {\n return undefined;\n }\n let kind = parse_kind(kind_raw);\n if (kind === undefined) {\n const retry = await ask(\"Unknown kind. Provider kind (ollama|openai_compat|anthropic) [ollama]: \");\n if (retry === undefined) {\n return undefined;\n }\n kind = parse_kind(retry) ?? \"ollama\";\n }\n const defaults = PROVIDER_DEFAULTS[kind];\n const model_default = model_hint !== undefined && model_hint.length > 0 ? model_hint : defaults.model;\n const model_raw = await ask(`Model [${model_default}]: `);\n if (model_raw === undefined) {\n return undefined;\n }\n const url_raw = await ask(`Base URL [${defaults.base_url}]: `);\n if (url_raw === undefined) {\n return undefined;\n }\n const key_default = defaults.api_key_env ?? \"\";\n const key_prompt = key_default.length === 0 ? \"API key env var name (empty to skip): \" : `API key env var name [${key_default}]: `;\n const key_raw = await ask(key_prompt);\n if (key_raw === undefined) {\n return undefined;\n }\n const api_key_env = blank_as_default(key_raw, key_default);\n return {\n provider_kind: kind,\n model: blank_as_default(model_raw, model_default),\n base_url: blank_as_default(url_raw, defaults.base_url),\n api_key_env: api_key_env.length === 0 ? undefined : api_key_env,\n };\n}\n\nfunction token_env_name(raw: string, fallback: string): string | undefined {\n const name = blank_as_default(raw, fallback);\n return is_env_var_name(name) === true ? name : undefined;\n}\n\nasync function ask_token_env(ask: AskLine, platform: string, fallback: string): Promise<string | undefined> {\n const first = await ask(`${platform} token env var [${fallback}] (name only, not the secret): `);\n if (first === undefined) {\n return undefined;\n }\n const named = token_env_name(first, fallback);\n if (named !== undefined) {\n return named;\n }\n const retry = await ask(`Env var name must match [A-Za-z_][A-Za-z0-9_]* [${fallback}]: `);\n if (retry === undefined) {\n return undefined;\n }\n return token_env_name(retry, fallback);\n}\n\nasync function ask_gateway(ask: AskLine): Promise<{ platforms: string[]; token_envs: Record<string, string> } | undefined> {\n const raw = await ask(\"Gateway platforms (webhook,telegram,discord,twitch; empty to skip): \");\n if (raw === undefined) {\n return undefined;\n }\n const platforms = parse_platforms(raw);\n const token_envs: Record<string, string> = {};\n for (const platform of platforms) {\n const name = await ask_token_env(ask, platform, DEFAULT_GATEWAY_TOKEN_ENVS[platform] ?? \"\");\n if (name === undefined) {\n return undefined;\n }\n token_envs[platform] = name;\n }\n return { platforms, token_envs };\n}\n\nasync function ask_plugins(work_dir: string, ask: AskLine): Promise<string[] | undefined> {\n const found = discover_plugin_entries(work_dir);\n if (found.length === 0) {\n return [];\n }\n const enabled: string[] = [];\n for (const entry of found) {\n const answer = await ask(`Enable plugin ${entry}? [y/N]: `);\n if (answer === undefined) {\n return undefined;\n }\n const yes = answer.trim().toLowerCase();\n if (yes === \"y\" || yes === \"yes\") {\n enabled.push(entry);\n }\n }\n return enabled;\n}\n\n/** All steps skippable. Undefined means Ctrl+C or a rejected env name: caller must not write. */\nexport async function collect_setup_answers(work_dir: string, ask: AskLine, model_hint?: string): Promise<SetupAnswers | undefined> {\n const agent_name = await ask_name(ask);\n if (agent_name === undefined) {\n return undefined;\n }\n const provider = await ask_provider(ask, model_hint);\n if (provider === undefined) {\n return undefined;\n }\n const gateway = await ask_gateway(ask);\n if (gateway === undefined) {\n return undefined;\n }\n const plugins = await ask_plugins(work_dir, ask);\n if (plugins === undefined) {\n return undefined;\n }\n return { agent_name, ...provider, platforms: gateway.platforms, token_envs: gateway.token_envs, plugins };\n}\n"],"mappings":"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","names":["existsSync","readFileSync","path","existsSync","path","path","existsSync","path","path","model_hint","value","readFileSync","ask_line","path","existsSync"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/cli_config.ts","../src/cli_mcp_add.ts","../src/cli_mcp_store.ts","../src/cli_mcp_edit.ts","../src/cli_mcp.ts","../src/cli_mcp_flags.ts","../src/cli_update.ts","../src/setup_wizard.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Thin zero-dependency CLI for lich: one-shot tasks, interactive chat,\n * config files, and environment-based provider resolution.\n */\nimport { existsSync, readFileSync, realpathSync } from \"node:fs\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { create_agent_with_plugins, type Agent, type AgentRunResult } from \"./agent/agent.js\";\nimport { parse_agent_config, type AgentConfig } from \"./agent/config.js\";\nimport { AgentEmitter } from \"./agent/events.js\";\nimport { LICH_VERSION } from \"./index.js\";\nimport { load_config, config_template, existing_config_path, starter_config_object, write_lich_config } from \"./cli_config.js\";\nimport { run_mcp } from \"./cli_mcp.js\";\nimport { empty_mcp_flags, take_mcp_flag, type McpCliFlags } from \"./cli_mcp_flags.js\";\nimport { run_update } from \"./cli_update.js\";\nimport { ask_line as ask_wizard_line, build_setup_config, collect_setup_answers } from \"./setup_wizard.js\";\nimport { load_theme, notice_flavor } from \"./util/theme.js\";\n\ntype ProviderKind = \"openai_compat\" | \"anthropic\" | \"ollama\";\n\ninterface CliOptions {\n config_path?: string;\n help?: boolean;\n version?: boolean;\n overrides: Record<string, string>;\n positionals: string[];\n mcp_flags: McpCliFlags;\n}\n\nconst FLAG_KEYS: Record<string, string> = {\n \"--work-dir\": \"work_dir\",\n \"--max-turns\": \"max_turns\",\n \"--model\": \"provider_model\",\n \"--provider-kind\": \"provider_kind\",\n \"--base-url\": \"provider_base_url\",\n \"--api-key-env\": \"provider_api_key_env\",\n \"--system-prompt\": \"system_prompt\",\n \"--session-dir\": \"session_dir\",\n \"--log-level\": \"log_level\",\n \"--theme\": \"theme\",\n};\n\nconst DEFAULT_BASE_URLS: Record<ProviderKind, string> = {\n openai_compat: \"https://api.openai.com/v1\",\n anthropic: \"https://api.anthropic.com\",\n ollama: \"http://localhost:11434\",\n};\n\nconst DEFAULT_ENV_API_KEYS: Record<ProviderKind, string | undefined> = {\n openai_compat: \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n ollama: undefined, // ollama needs no api key\n};\n\nfunction usage_text(): string {\n return [\n \"lich — the undead agent harness\",\n \"\",\n \"Usage:\",\n \" lich open the TUI (first run: setup wizard, then TUI)\",\n \" lich init write .lich/config.json without the wizard (flags apply; never overwrites)\",\n ' lich \"one shot task\" run a single task and print the reply',\n \" lich chat interactive chat (commands: /exit, /quit)\",\n \" lich tui interactive terminal UI (ink)\",\n \" lich gateway <plat..> messaging gateway (webhook|telegram|discord|twitch)\",\n \" lich config print a starter config template (save as .lich/config.json)\",\n \" lich update install a newer @moikapy/lich from npm, if one exists\",\n \" lich mcp list list mcp servers in .lich/config.json\",\n \" lich mcp add <name> add a catalog or --command/--url server (disabled)\",\n \" lich mcp enable <name> / disable <name> / remove <name>\",\n \" lich --help show this help\",\n \" lich --version print version\",\n \"\",\n \"Flags (before or after the subcommand):\",\n \" --config <path> JSON config file parsed by parse_agent_config\",\n \" --work-dir <path> working directory for tools\",\n \" --max-turns <n> loop turn budget (default 25)\",\n \" --model <m> model name (default from LICH_MODEL)\",\n \" --provider-kind <k> openai_compat | anthropic | ollama (default LICH_PROVIDER_KIND)\",\n \" --base-url <u> provider base url (default LICH_BASE_URL)\",\n \" --api-key-env <NAME> env var holding the api key (default LICH_API_KEY_ENV; unused by ollama)\",\n \" --system-prompt <s> system prompt override\",\n \" --session-dir <path> session transcript directory\",\n \" --log-level <level> debug | info | warn | error\",\n \" --theme <name> display theme (default lich; files in ~/.lich/themes)\",\n \" --command <bin> mcp add: local stdio binary\",\n \" --arg <value> mcp add: repeatable stdio arg (may start with --)\",\n \" --url <url> mcp add: loopback http url\",\n \" --project-path <path> mcp add: catalog ${project_path} substitute\",\n ].join(\"\\n\");\n}\n\nfunction error_message(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** Mode-aware config failure message; one-shot keeps the generic variant. */\nfunction error_for_mode(mode: string, base_message: string): string {\n if (mode === \"tui\") {\n return \"lich tui: no model configured — set LICH_MODEL (e.g. glm-5.3-flash:cloud), pass --model, or create .lich/config.json (`lich config` prints a template)\";\n }\n if (mode === \"gateway\") {\n return \"lich gateway: no model configured — set LICH_MODEL (e.g. glm-5.3-flash:cloud), pass --model, or create .lich/config.json (`lich config` prints a template)\";\n }\n if (mode === \"chat\") {\n return \"lich chat: no model configured — set LICH_MODEL (e.g. glm-5.3-flash:cloud), pass --model, or create .lich/config.json (`lich config` prints a template)\";\n }\n return base_message;\n}\n\nfunction parse_args(argv: string[]): CliOptions {\n const options: CliOptions = { overrides: {}, positionals: [], mcp_flags: empty_mcp_flags() };\n const mcp = argv.includes(\"mcp\");\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === undefined) {\n break;\n }\n if (arg === \"--help\") {\n options.help = true;\n continue;\n }\n if (arg === \"--version\") {\n options.version = true;\n continue;\n }\n if (arg === \"--config\") {\n const value = argv[index + 1];\n if (value === undefined) {\n throw new Error(\"--config requires a path\");\n }\n options.config_path = value;\n index += 1;\n continue;\n }\n if (mcp === true) {\n const consumed = take_mcp_flag(argv, index, options.mcp_flags);\n if (consumed !== undefined) {\n index = consumed;\n continue;\n }\n }\n const override_key = FLAG_KEYS[arg];\n if (override_key === undefined) {\n if (arg.startsWith(\"--\") === true) {\n throw new Error(`unknown flag: ${arg}`);\n }\n options.positionals.push(arg);\n continue;\n }\n const value = argv[index + 1];\n if (value === undefined || value.startsWith(\"--\") === true) {\n throw new Error(`${arg} requires a value`);\n }\n options.overrides[override_key] = value;\n index += 1;\n }\n return options;\n}\n\nfunction env_provider(overrides: Record<string, string>): Record<string, unknown> {\n const kind_value = overrides[\"provider_kind\"] ?? process.env.LICH_PROVIDER_KIND ?? \"openai_compat\";\n if (kind_value !== \"openai_compat\" && kind_value !== \"anthropic\" && kind_value !== \"ollama\") {\n throw new Error(`unknown provider kind \"${kind_value}\" (expected openai_compat, anthropic, or ollama)`);\n }\n const kind: ProviderKind = kind_value;\n const model = overrides[\"provider_model\"] ?? process.env.LICH_MODEL;\n if (model === undefined || model.length === 0) {\n throw new Error(\"no model configured: set LICH_MODEL, pass --model, or create .lich/config.json (`lich config` prints a template)\");\n }\n return {\n kind,\n name: \"default\",\n model,\n base_url: overrides[\"provider_base_url\"] ?? process.env.LICH_BASE_URL ?? DEFAULT_BASE_URLS[kind],\n api_key_env: overrides[\"provider_api_key_env\"] ?? process.env.LICH_API_KEY_ENV ?? DEFAULT_ENV_API_KEYS[kind],\n };\n}\n\nfunction load_config_file(config_path: string): Record<string, unknown> {\n try {\n const raw = readFileSync(config_path, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"config root must be a JSON object\");\n }\n return parsed as Record<string, unknown>;\n } catch (error) {\n throw new Error(`cannot use config file ${config_path}: ${error_message(error)}`);\n }\n}\n\nfunction apply_provider_override(config: Record<string, unknown>, overrides: Record<string, string>): void {\n const keys = [\"provider_kind\", \"provider_model\", \"provider_base_url\", \"provider_api_key_env\"] as const;\n const any_present = keys.some((key) => overrides[key] !== undefined);\n if (any_present === false) {\n return;\n }\n const providers = config[\"providers\"];\n if (Array.isArray(providers) === false || providers.length === 0) {\n config[\"providers\"] = [env_provider(overrides)];\n return;\n }\n const first = providers[0];\n if (typeof first !== \"object\" || first === null) {\n throw new Error(\"config providers[0] must be an object\");\n }\n const provider = first as Record<string, unknown>;\n for (const key of keys) {\n const value = overrides[key];\n if (value !== undefined) {\n provider[key.replace(\"provider_\", \"\")] = value;\n }\n }\n}\n\nfunction apply_overrides(config: Record<string, unknown>, overrides: Record<string, string>): void {\n for (const key of [\"work_dir\", \"system_prompt\", \"session_dir\", \"log_level\", \"theme\"]) {\n if (overrides[key] !== undefined) {\n config[key] = overrides[key];\n }\n }\n if (overrides[\"max_turns\"] !== undefined) {\n const turns = Number(overrides[\"max_turns\"]);\n if (Number.isInteger(turns) === false || turns < 1) {\n throw new Error(\"--max-turns must be a positive integer\");\n }\n config[\"max_turns\"] = turns;\n }\n apply_provider_override(config, overrides);\n}\n\n/** Same search as the wizard: `--work-dir` (else cwd), then the user-home file. */\nfunction load_discovered_config(work_dir: string): Record<string, unknown> | undefined {\n const found = existing_config_path(work_dir);\n if (found === undefined) {\n return undefined;\n }\n return load_config(found);\n}\n\nfunction build_config(options: CliOptions): AgentConfig {\n const base =\n options.config_path === undefined\n ? load_discovered_config(work_dir_of(options)) ?? { providers: [env_provider(options.overrides)] }\n : load_config_file(options.config_path);\n apply_overrides(base, options.overrides);\n const providers = base[\"providers\"];\n if (Array.isArray(providers) === false || providers.length === 0) {\n base[\"providers\"] = [env_provider(options.overrides)];\n }\n return parse_agent_config(base);\n}\n\n/** build_config with the failure message prefixed for the invoking subcommand. */\nfunction build_config_for(options: CliOptions, mode: string): AgentConfig {\n try {\n return build_config(options);\n } catch (error) {\n throw new Error(error_for_mode(mode, error_message(error)));\n }\n}\n\nfunction attach_progress(emitter: AgentEmitter): () => void {\n return emitter.on((event) => {\n if (event.type === \"turn_start\") {\n process.stderr.write(`\\n[lich] turn ${event.turn}`);\n return;\n }\n if (event.type === \"tool_call_end\") {\n const status = event.result.ok === true ? \"ok\" : `error: ${event.result.error ?? \"\"}`;\n process.stderr.write(`\\n[lich] ${event.call.name}: ${status}`);\n return;\n }\n if (event.type === \"final\") {\n process.stderr.write(\"\\n\");\n }\n });\n}\n\nexport async function run_one_shot(config: unknown, input: string): Promise<number> {\n const agent = await create_agent_with_plugins(config);\n const theme = load_theme(agent.config.theme);\n const stop_progress = attach_progress(agent.events);\n let result: AgentRunResult;\n try {\n result = await agent.run({ input });\n } finally {\n stop_progress();\n agent.close();\n }\n const final = result.outcome.final;\n if (final !== undefined && final.content.length > 0) {\n process.stdout.write(`${final.content}\\n`);\n }\n if (result.outcome.stopped_reason === \"budget\") {\n process.stderr.write(budget_stderr_line(result.outcome.turns_used, theme.notices.budget_exhausted));\n return 1;\n }\n if (result.outcome.stopped_reason === \"aborted\") {\n process.stderr.write(\"[lich] run aborted\\n\");\n return 1;\n }\n return 0;\n}\n\nasync function run_chat_turn(agent: Agent, input: string): Promise<void> {\n const stop_progress = attach_progress(agent.events);\n try {\n const result = await agent.run({ input });\n const final = result.outcome.final;\n if (final !== undefined && final.content.length > 0) {\n process.stdout.write(`${final.content}\\n`);\n }\n process.stdout.write(`[turns ${result.outcome.turns_used} | tokens ${result.usage_total.total_tokens}]\\n`);\n } catch (error) {\n process.stderr.write(`[lich] ${error_message(error)}\\n`);\n } finally {\n stop_progress();\n }\n}\n\nfunction ask_line(rl: Interface): Promise<string> {\n return new Promise((resolve) => {\n const on_close = (): void => resolve(\"\");\n rl.question(\"> \", (answer) => {\n rl.removeListener(\"close\", on_close);\n resolve(answer);\n });\n rl.once(\"close\", on_close);\n });\n}\n\nfunction budget_stderr_line(turns: number, notice: string): string {\n const flavor = notice_flavor(notice);\n const suffix = flavor.length === 0 ? \"\" : ` — ${flavor}`;\n return `[lich] budget exhausted after ${turns} turns${suffix}\\n`;\n}\n\nexport async function run_chat(config: unknown): Promise<number> {\n const agent = await create_agent_with_plugins(config);\n const theme = load_theme(agent.config.theme);\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n for (;;) {\n const line = await ask_line(rl);\n if (line.trim() === \"\") {\n return 0;\n }\n const command = line.trim();\n if (command === \"/exit\" || command === \"/quit\") {\n process.stdout.write(`${theme.glyph} ${theme.goodbye}\\n`);\n return 0;\n }\n await run_chat_turn(agent, command);\n }\n } finally {\n rl.close();\n agent.close();\n }\n}\n\nfunction model_hint(options: CliOptions): string | undefined {\n const model = options.overrides[\"provider_model\"] ?? process.env.LICH_MODEL;\n if (model === undefined || model.length === 0) {\n return undefined;\n }\n return model;\n}\n\nfunction skip_setup_message(existing: string): string {\n if (existing.endsWith(`${path.sep}.lich${path.sep}config.json`) === true) {\n return `lich: .lich/config.json already exists at ${existing}; skipping setup`;\n }\n return `lich: config already exists at ${existing}; skipping setup`;\n}\n\nfunction work_dir_of(options: CliOptions): string {\n return options.overrides[\"work_dir\"] ?? process.cwd();\n}\n\nasync function offer_wizard(work_dir: string, hint?: string): Promise<string | \"cancelled\"> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answers = await collect_setup_answers(work_dir, (prompt) => ask_wizard_line(rl, prompt), hint);\n if (answers === undefined) {\n return \"cancelled\";\n }\n const result = write_lich_config(work_dir, build_setup_config(answers));\n process.stdout.write(`${result.message}\\n`);\n return result.path;\n } finally {\n rl.close();\n }\n}\n\nasync function maybe_first_run(options: CliOptions, work_dir: string): Promise<number | undefined> {\n if (options.config_path !== undefined) {\n return undefined;\n }\n const existing = existing_config_path(work_dir);\n if (existing !== undefined) {\n process.stdout.write(`${skip_setup_message(existing)}\\n`);\n options.config_path = existing;\n return undefined;\n }\n const wrote = await offer_wizard(work_dir, model_hint(options));\n if (wrote === \"cancelled\") {\n process.stderr.write(\"lich: setup cancelled; nothing written\\n\");\n return 1;\n }\n options.config_path = wrote;\n return undefined;\n}\n\nasync function run_bare(options: CliOptions): Promise<number> {\n if (process.stdin.isTTY !== true) {\n process.stderr.write(\"lich: stdin is not a TTY; skipping setup wizard. Run `lich init` to write .lich/config.json, or `lich --help` for usage.\\n\");\n return 1;\n }\n const work_dir = work_dir_of(options);\n const stopped = await maybe_first_run(options, work_dir);\n if (stopped !== undefined) {\n return stopped;\n }\n return run_tui_entry(build_config_for(options, \"tui\"));\n}\n\nfunction model_still_placeholder(config: Record<string, unknown>): boolean {\n const providers = config[\"providers\"];\n const first = Array.isArray(providers) === true ? providers[0] : undefined;\n if (typeof first !== \"object\" || first === null) {\n return false;\n }\n return (first as Record<string, unknown>)[\"model\"] === \"<model-name>\";\n}\n\nfunction run_init(options: CliOptions): number {\n if (options.positionals.length > 1) {\n throw new Error(\"init takes no extra arguments\");\n }\n const config = starter_config_object();\n apply_overrides(config, options.overrides);\n const result = write_lich_config(work_dir_of(options), config);\n process.stdout.write(`${result.message}\\n`);\n if (result.written === true && model_still_placeholder(config) === true) {\n process.stdout.write(\"next: edit the model in .lich/config.json if needed, then run `lich`\\n\");\n }\n return 0;\n}\n\nasync function run_tui_entry(config: ReturnType<typeof build_config>): Promise<number> {\n const { run_tui } = await import(\"./tui.js\");\n return run_tui(config);\n}\n\nfunction gateway_platforms(config: AgentConfig, cli_platforms: readonly string[]): readonly string[] {\n if (cli_platforms.length > 0) {\n return cli_platforms;\n }\n const configured = config.gateway?.platforms ?? [];\n return configured.length === 0 ? [\"webhook\"] : configured;\n}\n\nasync function run_gateway_entry(config: AgentConfig, platforms: string[]): Promise<number> {\n const { run_gateway } = await import(\"./gateway.js\");\n return run_gateway(config, gateway_platforms(config, platforms));\n}\n\nexport interface CliEntryInput {\n bun: boolean;\n import_meta_main: boolean | undefined;\n module_url: string;\n argv1: string | undefined;\n}\n\n/** Bun uses `import.meta.main`. Node compares argv to this file, including a bin symlink. */\nexport function is_cli_entry(input: CliEntryInput): boolean {\n if (input.bun === true) {\n return input.import_meta_main === true;\n }\n return node_entry_matches(input.module_url, input.argv1);\n}\n\nfunction is_main_module(): boolean {\n return is_cli_entry({\n bun: process.versions.bun !== undefined,\n import_meta_main: import.meta.main,\n module_url: import.meta.url,\n argv1: process.argv[1],\n });\n}\n\nfunction node_entry_matches(module_url: string, entry: string | undefined): boolean {\n if (entry === undefined || entry === \"\") {\n return false;\n }\n const resolved = path.resolve(entry);\n if (module_url === pathToFileURL(resolved).href) {\n return true;\n }\n return same_real_file(fileURLToPath(module_url), resolved);\n}\n\nfunction same_real_file(left: string, right: string): boolean {\n if (existsSync(left) === false || existsSync(right) === false) {\n return false;\n }\n return realpathSync(left) === realpathSync(right);\n}\n\nexport async function run_cli(argv: string[]): Promise<number> {\n const options = parse_args(argv);\n if (options.help === true) {\n process.stdout.write(`${usage_text()}\\n`);\n return 0;\n }\n if (options.version === true) {\n process.stdout.write(`${LICH_VERSION}\\n`);\n return 0;\n }\n const [first] = options.positionals;\n if (first === undefined) {\n return run_bare(options);\n }\n if (first === \"init\") {\n return run_init(options);\n }\n if (first === \"config\") {\n process.stdout.write(`${config_template()}\\n`);\n return 0;\n }\n if (first === \"mcp\") {\n return run_mcp(work_dir_of(options), options.positionals, options.mcp_flags);\n }\n if (first === \"update\") {\n if (options.positionals.length > 1) {\n throw new Error(\"update takes no arguments\");\n }\n return run_update(fileURLToPath(import.meta.url));\n }\n if (first === \"chat\") {\n if (options.positionals.length > 1) {\n throw new Error(\"chat mode takes no task argument\");\n }\n return run_chat(build_config_for(options, first));\n }\n if (first === \"tui\") {\n return run_tui_entry(build_config_for(options, first));\n }\n if (first === \"gateway\") {\n return run_gateway_entry(build_config_for(options, first), options.positionals.slice(1));\n }\n return run_one_shot(build_config_for(options, \"one-shot\"), options.positionals.join(\" \"));\n}\n\nif (is_main_module() === true) {\n run_cli(process.argv.slice(2))\n .then((code) => {\n process.exitCode = code;\n })\n .catch((error) => {\n process.stderr.write(`lich: ${error_message(error)}\\n`);\n process.stderr.write(\"run `lich --help` for usage\\n\");\n process.exitCode = 1;\n });\n}","/**\n * Config-file discovery for the CLI: an ordered search chain, safe loading,\n * and a starter template so `lich tui` works with zero environment setup.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { safe_json_parse } from \"./util/json.js\";\n\nconst LICH_DIRNAME = \".lich\";\nconst CONFIG_RELPATH = `${LICH_DIRNAME}/config.json`;\nconst DEFAULT_USER_CONFIG = \".config/lich/config.json\";\n\n/** Ordered absolute chain: work_dir (default cwd) first, then the user config home. */\nexport function config_search_paths(work_dir?: string): string[] {\n const root = work_dir ?? process.cwd();\n const first = path.resolve(root, CONFIG_RELPATH);\n const second = path.resolve(homedir(), DEFAULT_USER_CONFIG);\n return first === second ? [first] : [first, second];\n}\n\n/** Explicit path must exist (else throw); otherwise walk the chain, undefined when absent. */\nexport function find_config_file(explicit?: string): string | undefined {\n if (explicit !== undefined) {\n if (existsSync(explicit) === false) {\n throw new Error(`config not found: ${explicit}`);\n }\n return explicit;\n }\n return existing_config_path(process.cwd());\n}\n\n/** Load the first config found as an object; undefined when absent, throw on bad json. */\nexport function load_config(explicit?: string): Record<string, unknown> | undefined {\n const found = find_config_file(explicit);\n if (found === undefined) {\n return undefined;\n }\n const raw = readFileSync(found, \"utf8\");\n const parsed = safe_json_parse<unknown>(raw);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(`invalid config json: ${found}`);\n }\n return parsed as Record<string, unknown>;\n}\n\n/** Starter config honoring LICH_* env hints; `lich config` prints it. */\nexport function config_template(): string {\n const kind = process.env.LICH_PROVIDER_KIND ?? \"ollama\";\n const provider: Record<string, unknown> = {\n kind,\n name: \"main\",\n model: process.env.LICH_MODEL ?? \"<model-name>\",\n };\n if (kind === \"ollama\") {\n provider[\"base_url\"] = \"http://localhost:11434\";\n }\n return JSON.stringify({ providers: [provider], max_turns: 25, theme: \"lich\" }, null, 2);\n}\n\n/** mkdir -p `${work_dir}/.lich` and return the directory path. */\nexport function ensure_lich_config_dir(work_dir: string): string {\n const dir = path.resolve(work_dir, LICH_DIRNAME);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n\n/** Project config path: the first entry in the search chain. */\nexport function project_config_path(work_dir: string): string {\n return path.resolve(work_dir, CONFIG_RELPATH);\n}\n\n/** First existing file on `config_search_paths(work_dir)`. */\nexport function existing_config_path(work_dir: string): string | undefined {\n for (const candidate of config_search_paths(work_dir)) {\n if (existsSync(candidate) === true) {\n return candidate;\n }\n }\n return undefined;\n}\n\nexport interface LichConfigWriteResult {\n path: string;\n written: boolean;\n message: string;\n}\n\n/** Parsed `config_template()` object. Does not write. */\nexport function starter_config_object(): Record<string, unknown> {\n const parsed: unknown = JSON.parse(config_template());\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"config template must be a JSON object\");\n }\n return parsed as Record<string, unknown>;\n}\n\n/**\n * The only writer of `.lich/config.json`. Create leaves an existing file\n * untouched. `update` replaces that file with the object the caller built,\n * so a caller must keep unrelated keys itself.\n */\nexport function write_lich_config(\n work_dir: string,\n config: Record<string, unknown>,\n update = false,\n): LichConfigWriteResult {\n ensure_lich_config_dir(work_dir);\n const file = project_config_path(work_dir);\n if (existsSync(file) === true && update !== true) {\n return already_exists(file);\n }\n try {\n writeFileSync(file, `${JSON.stringify(config, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: update === true ? \"w\" : \"wx\",\n });\n } catch (error) {\n if (update !== true && is_eexist(error) === true) {\n return already_exists(file);\n }\n throw error;\n }\n const verb = update === true ? \"updated\" : \"wrote\";\n return { path: file, written: true, message: `${verb} ${file}` };\n}\n\nfunction already_exists(file: string): LichConfigWriteResult {\n return {\n path: file,\n written: false,\n message: `lich: .lich/config.json already exists at ${file}; not overwriting`,\n };\n}\n\nfunction is_eexist(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: unknown }).code === \"EEXIST\";\n}\n","/** Build a disabled mcp_servers entry. Does not write or log env. */\nimport { catalog_client_entry } from \"./mcp/mcp_catalog_entry.js\";\nimport { refuse_mcp_entry } from \"./mcp/mcp_pin.js\";\nimport type { McpCliFlags } from \"./cli_mcp_flags.js\";\n\nconst SERVER_NAME = /^[a-z][a-z0-9_]*$/;\n\nexport function require_server_name(name: string | undefined, action: string): string {\n if (name === undefined || SERVER_NAME.test(name) === false) {\n throw new Error(`mcp ${action} requires a snake_case name`);\n }\n return name;\n}\n\nfunction entry_from_flags(name: string, flags: McpCliFlags): Record<string, unknown> {\n if (flags.command !== undefined && flags.url !== undefined) {\n throw new Error(\"mcp add accepts --command or --url, not both\");\n }\n if (flags.url !== undefined) {\n if (flags.args.length > 0) {\n throw new Error(\"mcp add --url does not take --arg\");\n }\n return { enabled: false, url: flags.url };\n }\n if (flags.command === undefined) {\n throw new Error(\"mcp add needs a catalog entry, --command, or --url\");\n }\n return { enabled: false, command: flags.command, args: [...flags.args] };\n}\n\nfunction entry_from_catalog(name: string, flags: McpCliFlags): Record<string, unknown> {\n const substitutes: Record<string, string> = {};\n if (flags.project_path !== undefined) {\n substitutes[\"project_path\"] = flags.project_path;\n }\n const built = catalog_client_entry(name, substitutes);\n if (typeof built === \"string\") {\n throw new Error(built);\n }\n return built;\n}\n\nexport function build_mcp_entry(name: string, flags: McpCliFlags): Record<string, unknown> {\n const entry = flags.command !== undefined || flags.url !== undefined\n ? entry_from_flags(name, flags)\n : entry_from_catalog(name, flags);\n const refused = refuse_mcp_entry(name, {\n command: typeof entry[\"command\"] === \"string\" ? entry[\"command\"] : undefined,\n args: Array.isArray(entry[\"args\"]) ? entry[\"args\"].filter((arg): arg is string => typeof arg === \"string\") : [],\n url: typeof entry[\"url\"] === \"string\" ? entry[\"url\"] : undefined,\n });\n if (refused !== undefined) {\n throw new Error(refused);\n }\n return entry;\n}\n","/**\n * Read and update work-dir mcp_servers through write_lich_config.\n * Never prints env values.\n */\nimport { existsSync } from \"node:fs\";\nimport { load_config, project_config_path, write_lich_config } from \"./cli_config.js\";\n\nexport function read_work_config(work_dir: string): Record<string, unknown> {\n const file = project_config_path(work_dir);\n if (existsSync(file) === false) {\n return {};\n }\n return load_config(file) ?? {};\n}\n\nexport function mcp_servers_of(config: Record<string, unknown>): Record<string, Record<string, unknown>> {\n const raw = config[\"mcp_servers\"];\n if (raw === undefined) {\n return {};\n }\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw) === true) {\n throw new Error(\"mcp_servers must be an object\");\n }\n const servers: Record<string, Record<string, unknown>> = {};\n for (const [name, entry] of Object.entries(raw)) {\n if (typeof entry !== \"object\" || entry === null || Array.isArray(entry) === true) {\n throw new Error(`mcp server '${name}' is not an object`);\n }\n servers[name] = { ...entry };\n }\n return servers;\n}\n\nexport function save_mcp_servers(\n work_dir: string,\n current: Record<string, unknown>,\n servers: Record<string, Record<string, unknown>>,\n): void {\n const next: Record<string, unknown> = { ...current };\n if (Object.keys(servers).length === 0) {\n delete next[\"mcp_servers\"];\n } else {\n next[\"mcp_servers\"] = servers;\n }\n const result = write_lich_config(work_dir, next, true);\n if (result.written !== true) {\n throw new Error(\"mcp config was not written\");\n }\n}\n\nexport function list_mcp_lines(servers: Record<string, Record<string, unknown>>): string[] {\n const lines: string[] = [];\n for (const [name, entry] of Object.entries(servers)) {\n const transport = typeof entry[\"url\"] === \"string\" ? \"http\" : \"stdio\";\n const enabled = entry[\"enabled\"] === true ? \"true\" : \"false\";\n lines.push(`${name} ${transport} ${enabled}`);\n }\n return lines;\n}\n","/** Flip or delete one mcp_servers entry. Does not print env. */\nimport { require_server_name } from \"./cli_mcp_add.js\";\nimport { mcp_servers_of, read_work_config, save_mcp_servers } from \"./cli_mcp_store.js\";\n\nfunction require_entry(\n servers: Record<string, Record<string, unknown>>,\n name: string,\n): Record<string, unknown> {\n const entry = servers[name];\n if (entry === undefined) {\n throw new Error(`mcp server '${name}' not found`);\n }\n return entry;\n}\n\nexport function set_mcp_enabled(work_dir: string, name: string | undefined, enabled: boolean): string {\n const server = require_server_name(name, enabled === true ? \"enable\" : \"disable\");\n const current = read_work_config(work_dir);\n const servers = mcp_servers_of(current);\n const entry = require_entry(servers, server);\n servers[server] = { ...entry, enabled };\n save_mcp_servers(work_dir, current, servers);\n return enabled === true ? `enabled ${server}` : `disabled ${server}`;\n}\n\nexport function remove_mcp_server(work_dir: string, name: string | undefined): string {\n const server = require_server_name(name, \"remove\");\n const current = read_work_config(work_dir);\n const servers = mcp_servers_of(current);\n require_entry(servers, server);\n delete servers[server];\n save_mcp_servers(work_dir, current, servers);\n return `removed ${server}`;\n}\n","/** Non-interactive `lich mcp`. Edits work-dir config only. */\nimport { build_mcp_entry, require_server_name } from \"./cli_mcp_add.js\";\nimport { remove_mcp_server, set_mcp_enabled } from \"./cli_mcp_edit.js\";\nimport type { McpCliFlags } from \"./cli_mcp_flags.js\";\nimport { list_mcp_lines, mcp_servers_of, read_work_config, save_mcp_servers } from \"./cli_mcp_store.js\";\n\nfunction write_line(line: string): void {\n process.stdout.write(`${line}\\n`);\n}\n\nfunction add_mcp_server(work_dir: string, name: string | undefined, flags: McpCliFlags): string {\n const server = require_server_name(name, \"add\");\n const current = read_work_config(work_dir);\n const servers = mcp_servers_of(current);\n if (servers[server] !== undefined) {\n throw new Error(`mcp server '${server}' already exists`);\n }\n servers[server] = build_mcp_entry(server, flags);\n save_mcp_servers(work_dir, current, servers);\n return `added ${server} disabled`;\n}\n\nexport function run_mcp(work_dir: string, positionals: readonly string[], flags: McpCliFlags): number {\n const action = positionals[1];\n if (positionals.length > 3) {\n throw new Error(\"mcp takes one name\");\n }\n if (action === \"list\") {\n if (positionals[2] !== undefined) {\n throw new Error(\"mcp list takes no name\");\n }\n const lines = list_mcp_lines(mcp_servers_of(read_work_config(work_dir)));\n if (lines.length > 0) {\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n }\n return 0;\n }\n if (action === \"add\") {\n write_line(add_mcp_server(work_dir, positionals[2], flags));\n return 0;\n }\n if (action === \"enable\" || action === \"disable\") {\n write_line(set_mcp_enabled(work_dir, positionals[2], action === \"enable\"));\n return 0;\n }\n if (action === \"remove\") {\n write_line(remove_mcp_server(work_dir, positionals[2]));\n return 0;\n }\n throw new Error(\"mcp requires list, add, enable, disable, or remove\");\n}\n","/** MCP-only flags. Values are not logged. */\nexport interface McpCliFlags {\n command?: string;\n args: string[];\n url?: string;\n project_path?: string;\n}\n\nexport function empty_mcp_flags(): McpCliFlags {\n return { args: [] };\n}\n\n/** Consume one mcp flag. Returns the new index, or undefined if not ours. */\nexport function take_mcp_flag(argv: readonly string[], index: number, flags: McpCliFlags): number | undefined {\n const arg = argv[index];\n if (arg === \"--arg\") {\n const value = argv[index + 1];\n if (value === undefined) {\n throw new Error(\"--arg requires a value\");\n }\n flags.args.push(value);\n return index + 1;\n }\n if (arg !== \"--command\" && arg !== \"--url\" && arg !== \"--project-path\") {\n return undefined;\n }\n const value = argv[index + 1];\n if (value === undefined || value.startsWith(\"--\") === true) {\n throw new Error(`${arg} requires a value`);\n }\n if (arg === \"--command\") {\n flags.command = value;\n }\n if (arg === \"--url\") {\n flags.url = value;\n }\n if (arg === \"--project-path\") {\n flags.project_path = value;\n }\n return index + 1;\n}\n","/**\n * `lich update`: compare the installed version to the npm registry and,\n * when newer, shell out to `npm install -g @moikapy/lich@latest`.\n */\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { LICH_VERSION } from \"./index.js\";\n\nexport const PACKAGE_NAME = \"@moikapy/lich\";\nexport const VIEW_ARGS = [\"view\", PACKAGE_NAME, \"version\"] as const;\nexport const INSTALL_ARGS = [\"install\", \"-g\", `${PACKAGE_NAME}@latest`] as const;\n\nexport type InstallKind = \"npm\" | \"git\" | \"npx\";\n\nexport interface CommandResult {\n exit_code: number;\n stdout: string;\n stderr: string;\n error_code?: string;\n}\n\nexport type CommandRunner = (command: string, args: readonly string[]) => Promise<CommandResult>;\n\nexport interface UpdateIo {\n write_stdout: (text: string) => void;\n write_stderr: (text: string) => void;\n}\n\nexport interface UpdateRequest extends UpdateIo {\n installed_version: string;\n install_kind: InstallKind;\n run_command: CommandRunner;\n}\n\ntype Semver = [number, number, number, string];\ntype VersionRelation = \"update\" | \"current\" | \"invalid\";\n\nconst NPM_MISSING =\n \"lich: npm is not on PATH. Install Node.js, or run `npm install -g @moikapy/lich@latest` once npm is available.\\n\";\nconst EXIT_FIRST_HINT =\n \"Exit any running `lich tui` or `lich gateway` first — npm cannot replace the package while those processes are running.\\n\";\n\nfunction parse_semver(version: string): Semver | null {\n const match = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?$/.exec(version.trim());\n if (match === null || match[1] === undefined || match[2] === undefined || match[3] === undefined) {\n return null;\n }\n return [Number(match[1]), Number(match[2]), Number(match[3]), match[4] ?? \"\"];\n}\n\n/** `update` when the registry version is strictly newer than the installed one. */\nexport function version_relation(installed: string, registry: string): VersionRelation {\n const left = parse_semver(installed);\n const right = parse_semver(registry);\n if (left === null || right === null) {\n return \"invalid\";\n }\n for (let index = 0; index < 3; index += 1) {\n const installed_part = left[index];\n const registry_part = right[index];\n if (typeof installed_part !== \"number\" || typeof registry_part !== \"number\") {\n return \"invalid\";\n }\n if (installed_part < registry_part) {\n return \"update\";\n }\n if (installed_part > registry_part) {\n return \"current\";\n }\n }\n if (left[3] !== \"\" && right[3] === \"\") {\n return \"update\";\n }\n return \"current\";\n}\n\n/** npm global, a git clone (`git pull`), or an npx temporary copy. */\nexport function detect_install_kind(\n module_path: string,\n env: NodeJS.ProcessEnv,\n has_git: (dir: string) => boolean,\n): InstallKind {\n if (env.npm_command === \"exec\" || module_path.includes(`${path.sep}_npx${path.sep}`)) {\n return \"npx\";\n }\n let dir = path.dirname(path.resolve(module_path));\n const root = path.parse(dir).root;\n while (dir !== root) {\n if (path.basename(dir) === \"node_modules\") {\n return \"npm\";\n }\n if (has_git(dir) === true) {\n return \"git\";\n }\n const parent = path.dirname(dir);\n if (parent === dir) {\n break;\n }\n dir = parent;\n }\n return \"npm\";\n}\n\nfunction blocked_install_message(kind: InstallKind): string | null {\n if (kind === \"git\") {\n return \"lich: this copy is a git clone, not an npm install. Update with `git pull` in the repository.\\n\";\n }\n if (kind === \"npx\") {\n return \"lich: npx runs a temporary copy and cannot persist an update. Install with `npm install -g @moikapy/lich`.\\n\";\n }\n return null;\n}\n\nfunction registry_version(viewed: CommandResult, request: UpdateRequest): string | null {\n if (viewed.error_code === \"ENOENT\") {\n request.write_stderr(NPM_MISSING);\n return null;\n }\n if (viewed.exit_code !== 0) {\n const detail = viewed.stderr.trim() || viewed.stdout.trim() || `exit ${viewed.exit_code}`;\n request.write_stderr(`lich: could not read the registry version of ${PACKAGE_NAME}: ${detail}\\n`);\n return null;\n }\n const registry = viewed.stdout.trim();\n if (parse_semver(registry) === null) {\n request.write_stderr(`lich: could not read the registry version of ${PACKAGE_NAME}: unexpected version \"${registry}\"\\n`);\n return null;\n }\n return registry;\n}\n\nfunction is_permission_failure(installed: CommandResult): boolean {\n if (installed.error_code === \"EACCES\" || installed.error_code === \"EPERM\") {\n return true;\n }\n const text = `${installed.stderr}\\n${installed.stdout}`.toLowerCase();\n return text.includes(\"eacces\") || text.includes(\"eperm\") || text.includes(\"permission denied\");\n}\n\nfunction report_install(request: UpdateRequest, installed: CommandResult): number {\n if (installed.exit_code === 0) {\n request.write_stdout(`updated ${PACKAGE_NAME}. Run \\`lich --version\\` in a new shell to confirm.\\n`);\n return 0;\n }\n if (installed.error_code === \"ENOENT\") {\n request.write_stderr(NPM_MISSING);\n return 1;\n }\n if (is_permission_failure(installed) === true) {\n request.write_stderr(\"lich: npm install failed (permission denied). Use a writable npm prefix, or run `npm install -g @moikapy/lich@latest` yourself.\\n\");\n return 1;\n }\n const detail = installed.stderr.trim() || `exit ${installed.exit_code}`;\n request.write_stderr(`lich: npm install failed: ${detail}\\n`);\n return 1;\n}\n\nasync function install_if_newer(request: UpdateRequest, registry: string): Promise<number> {\n const relation = version_relation(request.installed_version, registry);\n if (relation === \"invalid\") {\n request.write_stderr(`lich: could not compare versions (installed ${request.installed_version}, registry ${registry})\\n`);\n return 1;\n }\n if (relation !== \"update\") {\n request.write_stdout(`lich ${request.installed_version} is up to date\\n`);\n return 0;\n }\n request.write_stdout(`lich ${request.installed_version} -> ${registry}\\n`);\n request.write_stdout(EXIT_FIRST_HINT);\n const installed = await request.run_command(\"npm\", INSTALL_ARGS);\n return report_install(request, installed);\n}\n\n/** Decide whether to install. Tests inject `run_command` so neither lookup nor install hits the network. */\nexport async function run_lich_update(request: UpdateRequest): Promise<number> {\n const blocked = blocked_install_message(request.install_kind);\n if (blocked !== null) {\n request.write_stderr(blocked);\n return 1;\n }\n const viewed = await request.run_command(\"npm\", VIEW_ARGS);\n const registry = registry_version(viewed, request);\n if (registry === null) {\n return 1;\n }\n return install_if_newer(request, registry);\n}\n\nfunction running_under_bun(): boolean {\n return process.versions.bun !== undefined;\n}\n\n/** Default spawn. Forwards only `npm install` output; `npm view` stays quiet. */\nexport function default_command_runner(command: string, args: readonly string[]): Promise<CommandResult> {\n if (running_under_bun() === true) {\n return bun_command_runner(command, args);\n }\n return node_command_runner(command, args);\n}\n\nfunction node_command_runner(command: string, args: readonly string[]): Promise<CommandResult> {\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n const finish = (result: CommandResult): void => {\n if (settled === true) {\n return;\n }\n settled = true;\n resolve(result);\n };\n const forward = args[0] === \"install\";\n const child = spawn(command, [...args], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n const text = chunk.toString();\n stdout += text;\n if (forward === true) {\n process.stdout.write(text);\n }\n });\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n const text = chunk.toString();\n stderr += text;\n if (forward === true) {\n process.stderr.write(text);\n }\n });\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n finish({ exit_code: 127, stdout, stderr: error.message, error_code: error.code });\n });\n child.on(\"close\", (code) => {\n finish({ exit_code: code ?? 1, stdout, stderr });\n });\n });\n}\n\nasync function read_piped_text(\n stream: ReadableStream<Uint8Array>,\n forward: boolean,\n write: (text: string) => void,\n): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let text = \"\";\n for (;;) {\n const next = await reader.read();\n if (next.done === true) {\n return text;\n }\n const chunk = decoder.decode(next.value, { stream: true });\n text += chunk;\n if (forward === true) {\n write(chunk);\n }\n }\n}\n\nfunction bun_command_runner(command: string, args: readonly string[]): Promise<CommandResult> {\n const forward = args[0] === \"install\";\n try {\n const child = Bun.spawn([command, ...args], {\n stdin: \"ignore\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n return Promise.all([\n read_piped_text(child.stdout, forward, (text) => {\n process.stdout.write(text);\n }),\n read_piped_text(child.stderr, forward, (text) => {\n process.stderr.write(text);\n }),\n child.exited,\n ]).then(([stdout, stderr, exit_code]) => ({ exit_code, stdout, stderr }));\n } catch (error) {\n const coded = error as { code?: string; message?: string };\n const stderr = typeof coded.message === \"string\" ? coded.message : \"spawn failed\";\n return Promise.resolve({ exit_code: 127, stdout: \"\", stderr, error_code: coded.code });\n }\n}\n\nexport async function run_update(module_path: string): Promise<number> {\n return run_lich_update({\n installed_version: LICH_VERSION,\n install_kind: detect_install_kind(module_path, process.env, (dir) => existsSync(path.join(dir, \".git\"))),\n run_command: default_command_runner,\n write_stdout: (text) => {\n process.stdout.write(text);\n },\n write_stderr: (text) => {\n process.stderr.write(text);\n },\n });\n}\n","/**\n * First-run setup wizard. Builds an AgentConfig object; does not write the file.\n * Callers pass the object to write_lich_config.\n */\nimport { readdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Interface } from \"node:readline\";\nimport { DEFAULT_GATEWAY_TOKEN_ENVS, is_env_var_name } from \"./gateway/token_env.js\";\n\nexport type ProviderKind = \"ollama\" | \"openai_compat\" | \"anthropic\";\n\nconst PLATFORMS = [\"webhook\", \"telegram\", \"discord\", \"twitch\"] as const;\nconst PLUGIN_EXT = /\\.(mjs|js|ts|mts|cts|jsx|tsx)$/;\n\nconst PROVIDER_DEFAULTS: Record<ProviderKind, { model: string; base_url: string; api_key_env?: string }> = {\n ollama: { model: \"llama3.2\", base_url: \"http://localhost:11434\" },\n openai_compat: { model: \"gpt-4.1-mini\", base_url: \"https://api.openai.com/v1\", api_key_env: \"OPENAI_API_KEY\" },\n anthropic: { model: \"claude-sonnet-4\", base_url: \"https://api.anthropic.com\", api_key_env: \"ANTHROPIC_API_KEY\" },\n};\n\nexport interface SetupAnswers {\n agent_name: string;\n provider_kind: ProviderKind;\n model: string;\n base_url: string;\n api_key_env?: string;\n platforms: string[];\n token_envs: Record<string, string>;\n plugins: string[];\n}\n\nexport type AskLine = (prompt: string) => Promise<string | undefined>;\n\n/** Plugin entry files under `.lich/plugins`, as work_dir-relative specifiers. */\nfunction discover_plugin_entries(work_dir: string): string[] {\n const dir = path.resolve(work_dir, \".lich\", \"plugins\");\n let names: string[];\n try {\n names = readdirSync(dir);\n } catch {\n return [];\n }\n const entries: string[] = [];\n for (const name of names) {\n if (PLUGIN_EXT.test(name) === true) {\n entries.push(path.posix.join(\".lich/plugins\", name));\n }\n }\n return entries;\n}\n\n/** Object the agent schema already accepts. Omits gateway when no platforms were chosen. */\nexport function build_setup_config(answers: SetupAnswers): Record<string, unknown> {\n const provider: Record<string, unknown> = {\n kind: answers.provider_kind,\n name: \"main\",\n model: answers.model,\n base_url: answers.base_url,\n };\n if (answers.api_key_env !== undefined && answers.api_key_env.length > 0) {\n provider[\"api_key_env\"] = answers.api_key_env;\n }\n const config: Record<string, unknown> = {\n agent_name: answers.agent_name,\n providers: [provider],\n max_turns: 25,\n plugins: answers.plugins,\n };\n if (answers.platforms.length > 0) {\n config[\"gateway\"] = { platforms: answers.platforms, token_envs: answers.token_envs };\n }\n return config;\n}\n\nfunction blank_as_default(raw: string, fallback: string): string {\n const trimmed = raw.trim();\n return trimmed.length === 0 ? fallback : trimmed;\n}\n\nfunction parse_kind(raw: string): ProviderKind | undefined {\n const trimmed = raw.trim();\n const kind = trimmed.length === 0 ? \"ollama\" : trimmed;\n if (kind === \"ollama\" || kind === \"openai_compat\" || kind === \"anthropic\") {\n return kind;\n }\n return undefined;\n}\n\nfunction parse_platforms(raw: string): string[] {\n const seen = new Set<string>();\n const platforms: string[] = [];\n for (const part of raw.split(\",\")) {\n const name = part.trim().toLowerCase();\n if ((PLATFORMS as readonly string[]).includes(name) === false || seen.has(name) === true) {\n continue;\n }\n seen.add(name);\n platforms.push(name);\n }\n return platforms;\n}\n\n/** One prompt. Resolves undefined on Ctrl+C or a closed stream so nothing is written. */\nexport function ask_line(rl: Interface, prompt: string): Promise<string | undefined> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = (value: string | undefined): void => {\n if (settled === true) {\n return;\n }\n settled = true;\n rl.removeListener(\"SIGINT\", on_sigint);\n rl.removeListener(\"close\", on_close);\n resolve(value);\n };\n const on_sigint = (): void => finish(undefined);\n const on_close = (): void => finish(undefined);\n rl.once(\"SIGINT\", on_sigint);\n rl.once(\"close\", on_close);\n rl.question(prompt, (answer) => finish(answer));\n });\n}\n\nasync function ask_name(ask: AskLine): Promise<string | undefined> {\n const raw = await ask(\"Agent name [lich]: \");\n if (raw === undefined) {\n return undefined;\n }\n return blank_as_default(raw, \"lich\");\n}\n\nasync function ask_provider(\n ask: AskLine,\n model_hint?: string,\n): Promise<Pick<SetupAnswers, \"provider_kind\" | \"model\" | \"base_url\" | \"api_key_env\"> | undefined> {\n const kind_raw = await ask(\"Provider kind (ollama|openai_compat|anthropic) [ollama]: \");\n if (kind_raw === undefined) {\n return undefined;\n }\n let kind = parse_kind(kind_raw);\n if (kind === undefined) {\n const retry = await ask(\"Unknown kind. Provider kind (ollama|openai_compat|anthropic) [ollama]: \");\n if (retry === undefined) {\n return undefined;\n }\n kind = parse_kind(retry) ?? \"ollama\";\n }\n const defaults = PROVIDER_DEFAULTS[kind];\n const model_default = model_hint !== undefined && model_hint.length > 0 ? model_hint : defaults.model;\n const model_raw = await ask(`Model [${model_default}]: `);\n if (model_raw === undefined) {\n return undefined;\n }\n const url_raw = await ask(`Base URL [${defaults.base_url}]: `);\n if (url_raw === undefined) {\n return undefined;\n }\n const key_default = defaults.api_key_env ?? \"\";\n const key_prompt = key_default.length === 0 ? \"API key env var name (empty to skip): \" : `API key env var name [${key_default}]: `;\n const key_raw = await ask(key_prompt);\n if (key_raw === undefined) {\n return undefined;\n }\n const api_key_env = blank_as_default(key_raw, key_default);\n return {\n provider_kind: kind,\n model: blank_as_default(model_raw, model_default),\n base_url: blank_as_default(url_raw, defaults.base_url),\n api_key_env: api_key_env.length === 0 ? undefined : api_key_env,\n };\n}\n\nfunction token_env_name(raw: string, fallback: string): string | undefined {\n const name = blank_as_default(raw, fallback);\n return is_env_var_name(name) === true ? name : undefined;\n}\n\nasync function ask_token_env(ask: AskLine, platform: string, fallback: string): Promise<string | undefined> {\n const first = await ask(`${platform} token env var [${fallback}] (name only, not the secret): `);\n if (first === undefined) {\n return undefined;\n }\n const named = token_env_name(first, fallback);\n if (named !== undefined) {\n return named;\n }\n const retry = await ask(`Env var name must match [A-Za-z_][A-Za-z0-9_]* [${fallback}]: `);\n if (retry === undefined) {\n return undefined;\n }\n return token_env_name(retry, fallback);\n}\n\nasync function ask_gateway(ask: AskLine): Promise<{ platforms: string[]; token_envs: Record<string, string> } | undefined> {\n const raw = await ask(\"Gateway platforms (webhook,telegram,discord,twitch; empty to skip): \");\n if (raw === undefined) {\n return undefined;\n }\n const platforms = parse_platforms(raw);\n const token_envs: Record<string, string> = {};\n for (const platform of platforms) {\n const name = await ask_token_env(ask, platform, DEFAULT_GATEWAY_TOKEN_ENVS[platform] ?? \"\");\n if (name === undefined) {\n return undefined;\n }\n token_envs[platform] = name;\n }\n return { platforms, token_envs };\n}\n\nasync function ask_plugins(work_dir: string, ask: AskLine): Promise<string[] | undefined> {\n const found = discover_plugin_entries(work_dir);\n if (found.length === 0) {\n return [];\n }\n const enabled: string[] = [];\n for (const entry of found) {\n const answer = await ask(`Enable plugin ${entry}? [y/N]: `);\n if (answer === undefined) {\n return undefined;\n }\n const yes = answer.trim().toLowerCase();\n if (yes === \"y\" || yes === \"yes\") {\n enabled.push(entry);\n }\n }\n return enabled;\n}\n\n/** All steps skippable. Undefined means Ctrl+C or a rejected env name: caller must not write. */\nexport async function collect_setup_answers(work_dir: string, ask: AskLine, model_hint?: string): Promise<SetupAnswers | undefined> {\n const agent_name = await ask_name(ask);\n if (agent_name === undefined) {\n return undefined;\n }\n const provider = await ask_provider(ask, model_hint);\n if (provider === undefined) {\n return undefined;\n }\n const gateway = await ask_gateway(ask);\n if (gateway === undefined) {\n return undefined;\n }\n const plugins = await ask_plugins(work_dir, ask);\n if (plugins === undefined) {\n return undefined;\n }\n return { agent_name, ...provider, platforms: gateway.platforms, token_envs: gateway.token_envs, plugins };\n}\n"],"mappings":"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","names":["existsSync","readFileSync","path","existsSync","existsSync","value","existsSync","path","path","existsSync","path","path","model_hint","value","readFileSync","ask_line","path","existsSync"]}