noumen 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +95 -16
  2. package/dist/a2a/index.d.ts +5 -5
  3. package/dist/a2a/index.js +3 -3
  4. package/dist/a2a/index.js.map +1 -1
  5. package/dist/acp/index.d.ts +5 -5
  6. package/dist/acp/index.js +4 -4
  7. package/dist/acp/index.js.map +1 -1
  8. package/dist/{agent-BrkbZyOT.d.ts → agent-1nFVUP9E.d.ts} +319 -15
  9. package/dist/{cache-DVqaCX8v.d.ts → cache-DsRqxx6v.d.ts} +1 -1
  10. package/dist/{chunk-BGG2E6JD.js → chunk-3HEYCV26.js} +1 -1
  11. package/dist/chunk-3SK5GCI6.js +75 -0
  12. package/dist/chunk-3SK5GCI6.js.map +1 -0
  13. package/dist/{chunk-NBDFQYUZ.js → chunk-4HW6LN6D.js} +4784 -2411
  14. package/dist/chunk-4HW6LN6D.js.map +1 -0
  15. package/dist/{chunk-7ZMN7XJE.js → chunk-5JN4SPI7.js} +6 -6
  16. package/dist/chunk-5JN4SPI7.js.map +1 -0
  17. package/dist/{chunk-CPFHEPW4.js → chunk-CS6WNDCF.js} +73 -41
  18. package/dist/chunk-CS6WNDCF.js.map +1 -0
  19. package/dist/chunk-EKOGVTBT.js +472 -0
  20. package/dist/chunk-EKOGVTBT.js.map +1 -0
  21. package/dist/{chunk-KY6ZPWHO.js → chunk-HEQQQGK5.js} +47 -28
  22. package/dist/chunk-HEQQQGK5.js.map +1 -0
  23. package/dist/{chunk-QTJ7VTJY.js → chunk-HL6JCRZJ.js} +1599 -481
  24. package/dist/chunk-HL6JCRZJ.js.map +1 -0
  25. package/dist/chunk-L3L3FG5T.js +16 -0
  26. package/dist/chunk-L3L3FG5T.js.map +1 -0
  27. package/dist/cli/index.js +36 -30
  28. package/dist/cli/index.js.map +1 -1
  29. package/dist/client/index.d.ts +2 -2
  30. package/dist/{headless-Q7XHHZIW.js → headless-FFU2DESQ.js} +3 -4
  31. package/dist/headless-FFU2DESQ.js.map +1 -0
  32. package/dist/index.d.ts +218 -68
  33. package/dist/index.js +37 -23
  34. package/dist/lsp/index.d.ts +4 -4
  35. package/dist/mcp/index.d.ts +5 -5
  36. package/dist/mcp/index.js +2 -1
  37. package/dist/mcp/index.js.map +1 -1
  38. package/dist/{provider-factory-34MSWJZ3.js → provider-factory-KCLIF34X.js} +2 -2
  39. package/dist/providers/anthropic.d.ts +2 -2
  40. package/dist/providers/anthropic.js +5 -3
  41. package/dist/providers/anthropic.js.map +1 -1
  42. package/dist/providers/bedrock.d.ts +2 -2
  43. package/dist/providers/bedrock.js +5 -3
  44. package/dist/providers/bedrock.js.map +1 -1
  45. package/dist/providers/gemini.d.ts +2 -1
  46. package/dist/providers/gemini.js +133 -95
  47. package/dist/providers/gemini.js.map +1 -1
  48. package/dist/providers/ollama.d.ts +13 -0
  49. package/dist/{ollama-YNXAYP3R.js → providers/ollama.js} +6 -4
  50. package/dist/providers/ollama.js.map +1 -0
  51. package/dist/providers/openai.d.ts +4 -1
  52. package/dist/providers/openai.js +2 -1
  53. package/dist/providers/openrouter.d.ts +1 -1
  54. package/dist/providers/openrouter.js +2 -1
  55. package/dist/providers/openrouter.js.map +1 -1
  56. package/dist/providers/vertex.d.ts +4 -2
  57. package/dist/providers/vertex.js +6 -3
  58. package/dist/providers/vertex.js.map +1 -1
  59. package/dist/{resolve-XM52G7YE.js → resolve-4JA2BBDA.js} +2 -2
  60. package/dist/server/index.d.ts +35 -20
  61. package/dist/server/index.js +276 -207
  62. package/dist/server/index.js.map +1 -1
  63. package/dist/{server-Cg1yWGaV.d.ts → server-CHMxuWKq.d.ts} +1 -1
  64. package/dist/{types-DwdzmXfs.d.ts → types-CD0rUKKT.d.ts} +2 -0
  65. package/dist/{types-3c88cRKH.d.ts → types-LrU4LRmX.d.ts} +28 -0
  66. package/dist/{types-CwKKucOF.d.ts → types-RPKUTu1k.d.ts} +27 -2
  67. package/dist/uuid-RVN2T26F.js +8 -0
  68. package/dist/uuid-RVN2T26F.js.map +1 -0
  69. package/dist/zod-7YXKWYMC.js +12 -0
  70. package/dist/zod-7YXKWYMC.js.map +1 -0
  71. package/package.json +22 -13
  72. package/dist/chunk-2ZTGQLYK.js +0 -356
  73. package/dist/chunk-2ZTGQLYK.js.map +0 -1
  74. package/dist/chunk-7ZMN7XJE.js.map +0 -1
  75. package/dist/chunk-CPFHEPW4.js.map +0 -1
  76. package/dist/chunk-KY6ZPWHO.js.map +0 -1
  77. package/dist/chunk-NBDFQYUZ.js.map +0 -1
  78. package/dist/chunk-QTJ7VTJY.js.map +0 -1
  79. package/dist/headless-Q7XHHZIW.js.map +0 -1
  80. package/dist/ollama-YNXAYP3R.js.map +0 -1
  81. /package/dist/{chunk-BGG2E6JD.js.map → chunk-3HEYCV26.js.map} +0 -0
  82. /package/dist/{provider-factory-34MSWJZ3.js.map → provider-factory-KCLIF34X.js.map} +0 -0
  83. /package/dist/{resolve-XM52G7YE.js.map → resolve-4JA2BBDA.js.map} +0 -0
package/dist/cli/index.js CHANGED
@@ -1,7 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- startSpinner
4
- } from "../chunk-KXDB56YW.js";
5
2
  import {
6
3
  isOllamaRunning,
7
4
  ollamaBaseURL
@@ -12,21 +9,26 @@ import {
12
9
  promptPermission,
13
10
  renderEvent
14
11
  } from "../chunk-OGXNFXFA.js";
12
+ import {
13
+ startSpinner
14
+ } from "../chunk-KXDB56YW.js";
15
15
  import {
16
16
  Agent,
17
17
  LocalSandbox,
18
18
  UnsandboxedLocal
19
- } from "../chunk-NBDFQYUZ.js";
19
+ } from "../chunk-4HW6LN6D.js";
20
+ import "../chunk-42PHHZUA.js";
20
21
  import {
21
22
  DEFAULT_MODELS,
22
23
  SUPPORTED_PROVIDERS,
23
24
  detectProvider,
24
25
  resolveProvider
25
- } from "../chunk-7ZMN7XJE.js";
26
- import "../chunk-KY6ZPWHO.js";
27
- import "../chunk-42PHHZUA.js";
28
- import "../chunk-BGG2E6JD.js";
29
- import "../chunk-QTJ7VTJY.js";
26
+ } from "../chunk-5JN4SPI7.js";
27
+ import "../chunk-HEQQQGK5.js";
28
+ import "../chunk-L3L3FG5T.js";
29
+ import "../chunk-3HEYCV26.js";
30
+ import "../chunk-HL6JCRZJ.js";
31
+ import "../chunk-3SK5GCI6.js";
30
32
  import "../chunk-5GEX6ZSB.js";
31
33
  import "../chunk-4SQA2UCV.js";
32
34
  import "../chunk-JACGEMTF.js";
@@ -97,13 +99,13 @@ function mergeConfig(config, flags) {
97
99
  // src/cli/repl.ts
98
100
  import * as readline from "readline/promises";
99
101
  import chalk from "chalk";
100
- async function startRepl(code, config) {
102
+ async function startRepl(code, config, cleanup) {
101
103
  const rl = readline.createInterface({
102
104
  input: process.stdin,
103
105
  output: process.stderr,
104
106
  terminal: true
105
107
  });
106
- let thread = code.createThread({
108
+ let thread = await code.createThread({
107
109
  userInputHandler: (q) => promptPermission(rl, "agent", q).then((ok) => ok ? "yes" : "no")
108
110
  });
109
111
  let runningTurn = false;
@@ -116,7 +118,8 @@ async function startRepl(code, config) {
116
118
  } else {
117
119
  process.stderr.write(chalk.dim("\nGoodbye.\n"));
118
120
  rl.close();
119
- process.exit(0);
121
+ cleanup?.().catch(() => {
122
+ }).finally(() => process.exit(0));
120
123
  }
121
124
  };
122
125
  process.on("SIGINT", sigintHandler);
@@ -140,7 +143,7 @@ async function startRepl(code, config) {
140
143
  );
141
144
  if (result === "quit") break;
142
145
  if (result === "new") {
143
- thread = code.createThread({
146
+ thread = await code.createThread({
144
147
  userInputHandler: (q) => promptPermission(rl, "agent", q).then((ok) => ok ? "yes" : "no")
145
148
  });
146
149
  currentThread = thread;
@@ -434,7 +437,7 @@ These instructions are loaded automatically when running noumen in this director
434
437
 
435
438
  // src/cli/index.ts
436
439
  import * as os2 from "os";
437
- var VERSION = "0.1.0";
440
+ var VERSION = "0.2.0";
438
441
  async function listLocalOllamaModels(baseURL) {
439
442
  try {
440
443
  const res = await fetch(`${baseURL}/api/tags`, {
@@ -529,7 +532,7 @@ async function runAgent(config) {
529
532
  const { createInterface: createInterface3 } = await import("readline/promises");
530
533
  const rl = createInterface3({ input: process.stdin, output: process.stderr, terminal: true });
531
534
  try {
532
- const { SUPPORTED_PROVIDERS: SUPPORTED_PROVIDERS2, isOllamaRunning: isOllamaRunning2, ollamaBaseURL: ollamaBaseURL2 } = await import("../provider-factory-34MSWJZ3.js");
535
+ const { SUPPORTED_PROVIDERS: SUPPORTED_PROVIDERS2, isOllamaRunning: isOllamaRunning2, ollamaBaseURL: ollamaBaseURL2 } = await import("../provider-factory-KCLIF34X.js");
533
536
  const providerAnswer = await rl.question(
534
537
  ` Provider (${SUPPORTED_PROVIDERS2.join(", ")}) [${chalk3.bold("ollama")}]: `
535
538
  );
@@ -586,9 +589,9 @@ async function runAgent(config) {
586
589
  return runAgent(config);
587
590
  }
588
591
  if (!config.model) {
589
- const { DEFAULT_MODELS: DEFAULT_MODELS2 } = await import("../provider-factory-34MSWJZ3.js");
592
+ const { DEFAULT_MODELS: DEFAULT_MODELS2 } = await import("../provider-factory-KCLIF34X.js");
590
593
  if (providerName === "ollama") {
591
- const { ollamaBaseURL: ollamaBaseURL2 } = await import("../provider-factory-34MSWJZ3.js");
594
+ const { ollamaBaseURL: ollamaBaseURL2 } = await import("../provider-factory-KCLIF34X.js");
592
595
  const models = await listLocalOllamaModels(ollamaBaseURL2());
593
596
  const preferred = DEFAULT_MODELS2[providerName];
594
597
  config.model = models.includes(preferred) ? preferred : models[0] ?? preferred;
@@ -630,28 +633,31 @@ async function runAgent(config) {
630
633
  }
631
634
  });
632
635
  if (config.headless) {
633
- const { runHeadless } = await import("../headless-Q7XHHZIW.js");
636
+ const { runHeadless } = await import("../headless-FFU2DESQ.js");
634
637
  await runHeadless(agent, config);
635
638
  return;
636
639
  }
637
640
  await agent.init();
638
- if (config.prompt) {
639
- await runOneShot(agent, config);
640
- } else {
641
- if (!process.stdin.isTTY) {
642
- process.stderr.write(
643
- chalk3.red("Interactive mode requires a TTY. Use -c or pipe input.\n")
644
- );
645
- process.exit(1);
641
+ try {
642
+ if (config.prompt) {
643
+ await runOneShot(agent, config);
644
+ } else {
645
+ if (!process.stdin.isTTY) {
646
+ process.stderr.write(
647
+ chalk3.red("Interactive mode requires a TTY. Use -c or pipe input.\n")
648
+ );
649
+ process.exit(1);
650
+ }
651
+ await startRepl(agent, config, () => agent.close());
646
652
  }
647
- await startRepl(agent, config);
653
+ } finally {
654
+ await agent.close();
648
655
  }
649
- await agent.close();
650
656
  }
651
657
  async function runOneShot(agent, config) {
652
658
  const { startSpinner: startSpinner2 } = await import("../spinner-OJNR6NFO.js");
653
659
  const { isVisibleEvent: isVisibleEvent2 } = await import("../render-GRN4ZSSW.js");
654
- const thread = agent.createThread();
660
+ const thread = await agent.createThread();
655
661
  const state = createRenderState();
656
662
  const runOpts = config.maxTurns ? { maxTurns: config.maxTurns } : void 0;
657
663
  const spinner = !config.json && !config.quiet ? startSpinner2("Thinking") : null;
@@ -761,7 +767,7 @@ async function resumeSession(sessionId) {
761
767
  );
762
768
  const { createInterface: createInterface3 } = await import("readline/promises");
763
769
  const rl = createInterface3({ input: process.stdin, output: process.stderr, terminal: true });
764
- const thread = agent.resumeThread(match.sessionId);
770
+ const thread = await agent.resumeThread(match.sessionId);
765
771
  const { renderEvent: render, createRenderState: makeState } = await import("../render-GRN4ZSSW.js");
766
772
  process.stderr.write(chalk3.dim("Session resumed. Type a message to continue.\n\n"));
767
773
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/config.ts","../../src/cli/repl.ts","../../src/cli/init.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loadCliConfig, mergeConfig, type MergedConfig } from \"./config.js\";\nimport { createProvider, detectProvider, type ProviderName } from \"./provider-factory.js\";\nimport { startRepl } from \"./repl.js\";\nimport { renderEvent, createRenderState, promptPermission } from \"./render.js\";\nimport { runInit } from \"./init.js\";\nimport * as os from \"node:os\";\nimport { Agent, LocalSandbox, UnsandboxedLocal, type Sandbox, type DiagnoseResult, type DiagnoseCheckResult } from \"../index.js\";\nimport type { ThinkingConfig } from \"../thinking/types.js\";\nimport type { PermissionMode } from \"../permissions/types.js\";\n\nconst VERSION = \"0.1.0\";\n\nasync function listLocalOllamaModels(baseURL: string): Promise<string[]> {\n try {\n const res = await fetch(`${baseURL}/api/tags`, {\n signal: AbortSignal.timeout(2000),\n });\n if (!res.ok) return [];\n const data = (await res.json()) as { models?: Array<{ name: string }> };\n return (data.models ?? []).map((m) => m.name);\n } catch {\n return [];\n }\n}\n\nfunction parseThinking(level: string | undefined): ThinkingConfig | undefined {\n if (!level || level === \"off\") return { type: \"disabled\" };\n const budgets: Record<string, number> = {\n low: 1024,\n medium: 10240,\n high: 32768,\n };\n const budget = budgets[level];\n if (budget) return { type: \"enabled\", budgetTokens: budget };\n return undefined;\n}\n\n/**\n * Create the CLI sandbox. Defaults to OS-level sandboxed `LocalSandbox`.\n * Use `--no-sandbox` to explicitly opt out.\n */\nfunction createCliSandbox(config: MergedConfig): Sandbox {\n if (config.noSandbox) {\n return UnsandboxedLocal({ cwd: config.cwd });\n }\n\n const sandboxOpts: import(\"../index.js\").LocalSandboxOptions = {\n cwd: config.cwd,\n };\n\n const allowWrite = config.sandboxAllowWrite\n ? (config.sandboxAllowWrite as string).split(\",\").map((s: string) => s.trim())\n : undefined;\n const allowDomains = config.sandboxAllowDomain\n ? (config.sandboxAllowDomain as string).split(\",\").map((s: string) => s.trim())\n : undefined;\n\n if (allowWrite || allowDomains) {\n sandboxOpts.sandbox = {\n filesystem: allowWrite ? { allowWrite: [config.cwd, ...allowWrite] } : undefined,\n network: allowDomains ? { allowedDomains: allowDomains } : undefined,\n };\n }\n\n return LocalSandbox(sandboxOpts);\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n return Buffer.concat(chunks).toString(\"utf-8\").trim();\n}\n\nasync function main(): Promise<void> {\n const program = new Command(\"noumen\")\n .version(VERSION)\n .description(\"AI coding agent — bring your own provider\")\n .option(\"-p, --provider <name>\", \"openai | anthropic | gemini | openrouter | bedrock | vertex | ollama\")\n .option(\"-m, --model <model>\", \"model name\")\n .option(\"--api-key <key>\", \"API key (overrides env vars)\")\n .option(\"--base-url <url>\", \"override provider base URL\")\n .option(\"--cwd <dir>\", \"working directory\")\n .option(\"--permission <mode>\", \"permission mode (default, plan, acceptEdits, auto, bypassPermissions, dontAsk)\")\n .option(\"--thinking <level>\", \"thinking level: off, low, medium, high\")\n .option(\"--max-turns <n>\", \"max agent turns\", parseInt)\n .option(\"--json\", \"emit JSONL stream events to stdout\")\n .option(\"--quiet\", \"only output final text\")\n .option(\"--verbose\", \"show tool calls and thinking\")\n .option(\"--headless\", \"NDJSON stdin/stdout protocol for programmatic control\")\n .option(\"--no-sandbox\", \"disable OS-level sandboxing (use UnsandboxedLocal)\")\n .option(\"--sandbox-allow-write <paths>\", \"comma-separated paths to allow writing in sandbox\")\n .option(\"--sandbox-allow-domain <domains>\", \"comma-separated domains to allow in sandbox\")\n .option(\"-c, --prompt <text>\", \"one-shot prompt (non-interactive)\")\n .argument(\"[prompt...]\", \"inline prompt\")\n .allowExcessArguments(true)\n .action(async (args: string[]) => {\n const opts = program.opts();\n\n if (args.length > 0 && !opts.prompt) {\n opts.prompt = args.join(\" \");\n }\n\n if (!process.stdin.isTTY && !opts.prompt) {\n opts.prompt = await readStdin();\n if (!opts.prompt) {\n process.stderr.write(chalk.red(\"No input provided.\\n\"));\n process.exit(1);\n }\n }\n\n const cwd = opts.cwd ?? process.cwd();\n const config = loadCliConfig(cwd);\n const merged = mergeConfig(config, opts);\n\n await runAgent(merged);\n });\n\n program\n .command(\"init\")\n .description(\"create .noumen/config.json in the current directory\")\n .action(async () => {\n await runInit();\n process.exit(0);\n });\n\n program\n .command(\"sessions\")\n .description(\"list past sessions\")\n .action(async () => {\n await listSessions();\n process.exit(0);\n });\n\n program\n .command(\"resume <session-id>\")\n .description(\"resume a previous session\")\n .action(async (sessionId: string) => {\n await resumeSession(sessionId);\n });\n\n program\n .command(\"doctor\")\n .description(\"run health checks on provider, sandbox, MCP, and LSP\")\n .action(async () => {\n await runDoctor();\n });\n\n await program.parseAsync(process.argv);\n}\n\nasync function runAgent(config: MergedConfig): Promise<void> {\n const providerName: ProviderName | undefined =\n (config.provider as ProviderName | undefined) ?? await detectProvider();\n\n if (!providerName) {\n if (!process.stdin.isTTY) {\n process.stderr.write(chalk.red(\"No provider specified.\\n\"));\n process.exit(1);\n }\n process.stderr.write(\n chalk.bold(\"Welcome to noumen!\\n\\n\") +\n chalk.dim(\"No provider detected. Let's set one up.\\n\\n\"),\n );\n\n const { createInterface } = await import(\"node:readline/promises\");\n const rl = createInterface({ input: process.stdin, output: process.stderr, terminal: true });\n\n try {\n const { SUPPORTED_PROVIDERS, isOllamaRunning, ollamaBaseURL } = await import(\"./provider-factory.js\");\n const providerAnswer = await rl.question(\n ` Provider (${SUPPORTED_PROVIDERS.join(\", \")}) [${chalk.bold(\"ollama\")}]: `,\n );\n const picked = providerAnswer.trim() || \"ollama\";\n if (!(SUPPORTED_PROVIDERS as readonly string[]).includes(picked)) {\n process.stderr.write(chalk.red(`Unknown provider: ${picked}\\n`));\n process.exit(1);\n }\n\n if (picked === \"ollama\") {\n if (!(await isOllamaRunning())) {\n process.stderr.write(\n chalk.yellow(`\\n Ollama doesn't appear to be running at ${ollamaBaseURL()}.\\n`) +\n chalk.yellow(` Install it from https://ollama.com, then run:\\n\\n`) +\n ` ${chalk.cyan(\"ollama pull qwen2.5-coder:32b\")}\\n` +\n ` ${chalk.cyan(\"ollama serve\")}\\n\\n` +\n chalk.yellow(` Then re-run noumen.\\n`),\n );\n rl.close();\n process.exit(1);\n }\n\n const models = await listLocalOllamaModels(ollamaBaseURL());\n if (models.length > 0) {\n process.stderr.write(chalk.dim(` Available models: ${models.join(\", \")}\\n`));\n const defaultModel = models.includes(\"qwen2.5-coder:32b\") ? \"qwen2.5-coder:32b\" : models[0];\n const modelAnswer = await rl.question(\n ` Model [${chalk.bold(defaultModel)}]: `,\n );\n config.model = modelAnswer.trim() || defaultModel;\n }\n }\n\n const needsKey = ![\"bedrock\", \"vertex\", \"ollama\"].includes(picked);\n let apiKey: string | undefined;\n if (needsKey) {\n const keyAnswer = await rl.question(` API key: `);\n apiKey = keyAnswer.trim();\n if (!apiKey) {\n process.stderr.write(chalk.red(\"API key is required.\\n\"));\n process.exit(1);\n }\n }\n\n rl.close();\n config.provider = picked;\n if (apiKey) config.apiKey = apiKey;\n } catch {\n rl.close();\n process.exit(1);\n }\n\n return runAgent(config);\n }\n\n if (!config.model) {\n const { DEFAULT_MODELS } = await import(\"./provider-factory.js\");\n if (providerName === \"ollama\") {\n const { ollamaBaseURL } = await import(\"./provider-factory.js\");\n const models = await listLocalOllamaModels(ollamaBaseURL());\n const preferred = DEFAULT_MODELS[providerName];\n config.model = models.includes(preferred) ? preferred : models[0] ?? preferred;\n } else {\n config.model = DEFAULT_MODELS[providerName];\n }\n }\n\n const provider = await createProvider(providerName, {\n apiKey: config.apiKey,\n model: config.model,\n baseURL: config.baseURL,\n });\n\n const thinking = parseThinking(config.thinking);\n const permissionMode = (config.permissions ?? \"default\") as PermissionMode;\n\n const agent = new Agent({\n provider: provider,\n sandbox: createCliSandbox(config),\n options: {\n cwd: config.cwd,\n model: config.model,\n systemPrompt: config.systemPrompt,\n permissions: {\n mode: permissionMode,\n },\n thinking,\n autoCompact: config.autoCompact ?? true,\n enableSubagents: config.enableSubagents ?? true,\n enableTasks: config.enableTasks ?? false,\n enablePlanMode: config.enablePlanMode ?? true,\n enableWorktrees: config.enableWorktrees ?? false,\n mcpServers: config.mcpServers,\n lsp: config.lsp,\n hooks: config.hooks,\n webSearch: config.webSearch,\n sessionDir: config.sessionDir ?? \".noumen/sessions\",\n projectContext: { cwd: config.cwd, homeDir: os.homedir() },\n costTracking: { enabled: true },\n retry: true,\n },\n });\n\n if (config.headless) {\n const { runHeadless } = await import(\"./headless.js\");\n await runHeadless(agent, config);\n return;\n }\n\n await agent.init();\n\n if (config.prompt) {\n await runOneShot(agent, config);\n } else {\n if (!process.stdin.isTTY) {\n process.stderr.write(\n chalk.red(\"Interactive mode requires a TTY. Use -c or pipe input.\\n\"),\n );\n process.exit(1);\n }\n await startRepl(agent, config);\n }\n\n await agent.close();\n}\n\nasync function runOneShot(agent: Agent, config: MergedConfig): Promise<void> {\n const { startSpinner } = await import(\"./spinner.js\");\n const { isVisibleEvent } = await import(\"./render.js\");\n const thread = agent.createThread();\n const state = createRenderState();\n const runOpts = config.maxTurns ? { maxTurns: config.maxTurns } : undefined;\n\n const spinner =\n !config.json && !config.quiet ? startSpinner(\"Thinking\") : null;\n\n try {\n for await (const event of thread.run(config.prompt!, runOpts)) {\n if (!state.showedActivity && spinner && isVisibleEvent(event, config)) {\n spinner.stop();\n state.showedActivity = true;\n }\n renderEvent(event, config, state);\n }\n } finally {\n spinner?.stop();\n }\n\n if (config.quiet && state.accumulatedText) {\n process.stdout.write(state.accumulatedText);\n if (!state.accumulatedText.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n } else if (state.accumulatedText && !state.accumulatedText.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n}\n\nasync function listSessions(): Promise<void> {\n const cwd = process.cwd();\n const config = loadCliConfig(cwd);\n const merged = mergeConfig(config, { cwd });\n\n const providerName: ProviderName | undefined = (merged.provider as ProviderName | undefined) ?? await detectProvider();\n if (!providerName) {\n process.stderr.write(chalk.red(\"No provider configured. Run `noumen init` first.\\n\"));\n process.exit(1);\n }\n\n const provider = await createProvider(providerName, {\n apiKey: merged.apiKey,\n model: merged.model,\n baseURL: merged.baseURL,\n });\n\n const agent = new Agent({\n provider: provider,\n sandbox: UnsandboxedLocal({ cwd }),\n options: { cwd, sessionDir: merged.sessionDir ?? \".noumen/sessions\" },\n });\n\n const sessions = await agent.listSessions();\n if (sessions.length === 0) {\n process.stdout.write(chalk.dim(\"No saved sessions.\\n\"));\n return;\n }\n\n process.stdout.write(chalk.bold(\"Sessions:\\n\"));\n for (const s of sessions) {\n const title = s.title ? chalk.white(` ${s.title}`) : \"\";\n process.stdout.write(\n ` ${chalk.cyan(s.sessionId.slice(0, 8))} ${chalk.dim(s.createdAt)} ${chalk.dim(`${s.messageCount} msgs`)}${title}\\n`,\n );\n }\n}\n\nasync function resumeSession(sessionId: string): Promise<void> {\n const cwd = process.cwd();\n const config = loadCliConfig(cwd);\n const merged = mergeConfig(config, { cwd });\n\n const providerName: ProviderName | undefined = (merged.provider as ProviderName | undefined) ?? await detectProvider();\n if (!providerName) {\n process.stderr.write(chalk.red(\"No provider configured. Run `noumen init` first.\\n\"));\n process.exit(1);\n }\n\n const provider = await createProvider(providerName, {\n apiKey: merged.apiKey,\n model: merged.model,\n baseURL: merged.baseURL,\n });\n\n const thinking = parseThinking(merged.thinking);\n const permissionMode = (merged.permissions ?? \"default\") as PermissionMode;\n\n const agent = new Agent({\n provider: provider,\n sandbox: createCliSandbox(merged),\n options: {\n cwd,\n model: merged.model,\n permissions: { mode: permissionMode },\n thinking,\n autoCompact: merged.autoCompact ?? true,\n enableSubagents: merged.enableSubagents ?? true,\n enablePlanMode: merged.enablePlanMode ?? true,\n mcpServers: merged.mcpServers,\n lsp: merged.lsp,\n hooks: merged.hooks,\n sessionDir: merged.sessionDir ?? \".noumen/sessions\",\n projectContext: { cwd, homeDir: os.homedir() },\n costTracking: { enabled: true },\n retry: true,\n },\n });\n\n await agent.init();\n\n // Match full session ID from partial prefix\n const sessions = await agent.listSessions();\n const match = sessions.find(\n (s) => s.sessionId === sessionId || s.sessionId.startsWith(sessionId),\n );\n\n if (!match) {\n process.stderr.write(chalk.red(`Session not found: ${sessionId}\\n`));\n process.exit(1);\n }\n\n process.stderr.write(\n chalk.dim(`Resuming session ${match.sessionId.slice(0, 8)}...\\n\\n`),\n );\n\n const { createInterface } = await import(\"node:readline/promises\");\n const rl = createInterface({ input: process.stdin, output: process.stderr, terminal: true });\n\n const thread = agent.resumeThread(match.sessionId);\n\n // Enter REPL with the resumed thread\n const { renderEvent: render, createRenderState: makeState } = await import(\"./render.js\");\n\n process.stderr.write(chalk.dim(\"Session resumed. Type a message to continue.\\n\\n\"));\n\n try {\n while (true) {\n let input: string;\n try {\n input = await rl.question(chalk.blue(\"> \"));\n } catch {\n break;\n }\n if (!input.trim()) continue;\n if (input.trim() === \"/quit\" || input.trim() === \"/exit\") break;\n\n const state = makeState();\n for await (const event of thread.run(input)) {\n render(event, merged, state);\n }\n if (state.accumulatedText && !state.accumulatedText.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n } finally {\n rl.close();\n await agent.close();\n }\n}\n\nasync function runDoctor(): Promise<void> {\n const cwd = process.cwd();\n const config = loadCliConfig(cwd);\n const merged = mergeConfig(config, { cwd });\n\n const providerName: ProviderName | undefined = (merged.provider as ProviderName | undefined) ?? await detectProvider();\n if (!providerName) {\n process.stderr.write(chalk.red(\"No provider configured. Run `noumen init` first.\\n\"));\n process.exit(1);\n }\n\n const provider = await createProvider(providerName, {\n apiKey: merged.apiKey,\n model: merged.model,\n baseURL: merged.baseURL,\n });\n\n const agent = new Agent({\n provider: provider,\n sandbox: createCliSandbox(merged),\n options: {\n cwd,\n model: merged.model,\n mcpServers: merged.mcpServers,\n lsp: merged.lsp,\n sessionDir: merged.sessionDir ?? \".noumen/sessions\",\n },\n });\n\n await agent.init();\n\n process.stderr.write(chalk.bold(\"\\nnoumen doctor\\n\\n\"));\n const result = await agent.diagnose();\n printDiagnoseResult(result);\n await agent.close();\n process.exit(result.overall ? 0 : 1);\n}\n\nfunction formatCheckLine(label: string, check: DiagnoseCheckResult, extra?: string): string {\n const icon = check.ok ? chalk.green(\"✓\") : chalk.red(\"✗\");\n const timing = check.latencyMs > 0 ? chalk.dim(` (${check.latencyMs}ms)`) : \"\";\n const suffix = extra ? chalk.dim(` ${extra}`) : \"\";\n const errMsg = check.error ? chalk.red(` ${check.error}`) : \"\";\n const warnMsg = !check.error && check.warning ? chalk.yellow(` ${check.warning}`) : \"\";\n return ` ${icon} ${label}${timing}${suffix}${errMsg}${warnMsg}\\n`;\n}\n\nfunction printDiagnoseResult(r: DiagnoseResult): void {\n const modelLabel = r.provider.model ? ` (${r.provider.model})` : \"\";\n process.stderr.write(formatCheckLine(`Provider${modelLabel}`, r.provider));\n process.stderr.write(formatCheckLine(\"Sandbox: filesystem\", r.sandbox.fs));\n process.stderr.write(formatCheckLine(\"Sandbox: shell\", r.sandbox.computer));\n process.stderr.write(formatCheckLine(\n \"Sandbox: OS-level (sandbox-runtime)\",\n r.sandboxRuntime,\n r.sandboxRuntime.platform,\n ));\n\n for (const [name, check] of Object.entries(r.mcp)) {\n const parts: string[] = [];\n if (check.status) parts.push(check.status);\n if (check.toolCount != null) parts.push(`${check.toolCount} tools`);\n const extra = parts.length ? parts.join(\", \") : undefined;\n process.stderr.write(formatCheckLine(`MCP: ${name}`, check, extra));\n }\n\n for (const [name, check] of Object.entries(r.lsp)) {\n const extra = check.state ?? undefined;\n process.stderr.write(formatCheckLine(`LSP: ${name}`, check, extra));\n }\n\n process.stderr.write(\"\\n\");\n if (r.overall) {\n process.stderr.write(` ${chalk.green(\"Overall: healthy\")}\\n\\n`);\n } else {\n process.stderr.write(` ${chalk.red(\"Overall: unhealthy\")}\\n\\n`);\n }\n}\n\nmain().catch((err) => {\n process.stderr.write(chalk.red(`Fatal: ${err.message}\\n`));\n process.exit(1);\n});\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport type { McpServerConfig } from \"../mcp/types.js\";\nimport type { LspServerConfig } from \"../lsp/types.js\";\nimport type { HookDefinition } from \"../hooks/types.js\";\nimport type { WebSearchConfig } from \"../tools/web-search.js\";\n\nexport interface CliConfig {\n provider?: string;\n model?: string;\n apiKey?: string;\n baseURL?: string;\n permissions?: string;\n thinking?: string;\n sandbox?: string;\n mcpServers?: Record<string, McpServerConfig>;\n lsp?: Record<string, LspServerConfig>;\n hooks?: HookDefinition[];\n autoCompact?: boolean;\n enableSubagents?: boolean;\n enableTasks?: boolean;\n enablePlanMode?: boolean;\n enableWorktrees?: boolean;\n webSearch?: WebSearchConfig;\n costLimit?: number;\n maxTurns?: number;\n systemPrompt?: string;\n sessionDir?: string;\n}\n\n/**\n * Load global config from ~/.noumen/config.json.\n * Returns empty object if not found or invalid.\n */\nexport function loadGlobalConfig(): CliConfig {\n const globalPath = path.join(os.homedir(), \".noumen\", \"config.json\");\n try {\n const raw = fs.readFileSync(globalPath, \"utf-8\");\n return JSON.parse(raw) as CliConfig;\n } catch {\n return {};\n }\n}\n\n/**\n * Walk up from `cwd` looking for `.noumen/config.json`.\n * Returns parsed config or empty object if none found.\n */\nfunction loadProjectConfig(cwd: string): CliConfig {\n let dir = path.resolve(cwd);\n const root = path.parse(dir).root;\n\n while (true) {\n const candidate = path.join(dir, \".noumen\", \"config.json\");\n try {\n const raw = fs.readFileSync(candidate, \"utf-8\");\n return JSON.parse(raw) as CliConfig;\n } catch {\n // not found or invalid — keep walking\n }\n const parent = path.dirname(dir);\n if (parent === dir || dir === root) break;\n dir = parent;\n }\n\n return {};\n}\n\n/**\n * Load config with layering: global (~/.noumen/config.json) < project < flags.\n * Project-level values override global values.\n */\nexport function loadCliConfig(cwd: string): CliConfig {\n const global = loadGlobalConfig();\n const project = loadProjectConfig(cwd);\n return { ...global, ...project };\n}\n\nexport interface MergedConfig extends CliConfig {\n cwd: string;\n json?: boolean;\n quiet?: boolean;\n verbose?: boolean;\n headless?: boolean;\n prompt?: string;\n noSandbox?: boolean;\n sandboxAllowWrite?: string;\n sandboxAllowDomain?: string;\n}\n\n/**\n * Merge CLI flags over the config file values. Flags take precedence.\n */\nexport function mergeConfig(\n config: CliConfig,\n flags: Record<string, unknown>,\n): MergedConfig {\n const cwd = (flags.cwd as string) ?? process.cwd();\n return {\n ...config,\n ...(flags.provider !== undefined && { provider: flags.provider as string }),\n ...(flags.model !== undefined && { model: flags.model as string }),\n ...(flags.apiKey !== undefined && { apiKey: flags.apiKey as string }),\n ...(flags.baseUrl !== undefined && { baseURL: flags.baseUrl as string }),\n ...(flags.permission !== undefined && { permissions: flags.permission as string }),\n ...(flags.thinking !== undefined && { thinking: flags.thinking as string }),\n ...(flags.maxTurns !== undefined && { maxTurns: flags.maxTurns as number }),\n ...(flags.systemPrompt !== undefined && { systemPrompt: flags.systemPrompt as string }),\n cwd,\n json: flags.json as boolean | undefined,\n quiet: flags.quiet as boolean | undefined,\n verbose: flags.verbose as boolean | undefined,\n headless: flags.headless as boolean | undefined,\n prompt: flags.prompt as string | undefined,\n noSandbox: flags.sandbox === false ? true : undefined,\n sandboxAllowWrite: flags.sandboxAllowWrite as string | undefined,\n sandboxAllowDomain: flags.sandboxAllowDomain as string | undefined,\n };\n}\n","import * as readline from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport type { Agent } from \"../agent.js\";\nimport type { Thread } from \"../thread.js\";\nimport type { MergedConfig } from \"./config.js\";\nimport { renderEvent, createRenderState, promptPermission, isVisibleEvent } from \"./render.js\";\nimport { DEFAULT_MODELS, createProvider, SUPPORTED_PROVIDERS, type ProviderName } from \"./provider-factory.js\";\nimport { startSpinner } from \"./spinner.js\";\n\nexport async function startRepl(\n code: Agent,\n config: MergedConfig,\n): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stderr,\n terminal: true,\n });\n\n let thread = code.createThread({\n userInputHandler: (q) => promptPermission(rl, \"agent\", q).then((ok) => ok ? \"yes\" : \"no\"),\n });\n\n let runningTurn = false;\n let currentThread: Thread = thread;\n\n const sigintHandler = () => {\n if (runningTurn) {\n currentThread.abort();\n runningTurn = false;\n process.stderr.write(chalk.yellow(\"\\n Cancelled.\\n\\n\"));\n } else {\n process.stderr.write(chalk.dim(\"\\nGoodbye.\\n\"));\n rl.close();\n process.exit(0);\n }\n };\n process.on(\"SIGINT\", sigintHandler);\n\n printWelcome(config);\n\n try {\n while (true) {\n let input: string;\n try {\n input = await rl.question(chalk.blue(\"> \"));\n } catch {\n break;\n }\n\n if (!input.trim()) continue;\n\n if (input.startsWith(\"/\")) {\n const result = await handleSlashCommand(\n input,\n thread,\n code,\n config,\n rl,\n );\n if (result === \"quit\") break;\n if (result === \"new\") {\n thread = code.createThread({\n userInputHandler: (q) => promptPermission(rl, \"agent\", q).then((ok) => ok ? \"yes\" : \"no\"),\n });\n currentThread = thread;\n }\n continue;\n }\n\n const state = createRenderState();\n const runOpts = config.maxTurns ? { maxTurns: config.maxTurns } : undefined;\n\n const spinner =\n !config.json && !config.quiet ? startSpinner(\"Thinking\") : null;\n\n runningTurn = true;\n try {\n for await (const event of thread.run(input, runOpts)) {\n if (!state.showedActivity && spinner && isVisibleEvent(event, config)) {\n spinner.stop();\n state.showedActivity = true;\n }\n renderEvent(event, config, state);\n }\n } catch (err) {\n if ((err as Error)?.name === \"AbortError\") {\n // already handled by SIGINT handler\n } else {\n throw err;\n }\n } finally {\n spinner?.stop();\n runningTurn = false;\n }\n\n if (state.accumulatedText && !state.accumulatedText.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n } finally {\n process.removeListener(\"SIGINT\", sigintHandler);\n rl.close();\n }\n}\n\nfunction printWelcome(config: MergedConfig): void {\n const provider = config.provider ?? \"auto\";\n const model = config.model ?? DEFAULT_MODELS[provider] ?? \"default\";\n process.stderr.write(\n chalk.bold(\"noumen\") +\n chalk.dim(` — ${provider}/${model}`) +\n \"\\n\" +\n chalk.dim(\"Type a message to begin. /help for commands, Ctrl+C to cancel.\") +\n \"\\n\\n\",\n );\n}\n\ntype SlashResult = \"continue\" | \"quit\" | \"new\";\n\nasync function handleSlashCommand(\n input: string,\n thread: Thread,\n code: Agent,\n config: MergedConfig,\n _rl: readline.Interface,\n): Promise<SlashResult> {\n const [cmd] = input.trim().split(/\\s+/);\n\n switch (cmd) {\n case \"/quit\":\n case \"/exit\":\n case \"/q\":\n process.stderr.write(chalk.dim(\"Goodbye.\\n\"));\n return \"quit\";\n\n case \"/new\":\n process.stderr.write(chalk.dim(\"Starting new conversation.\\n\\n\"));\n return \"new\";\n\n case \"/session\":\n process.stderr.write(chalk.dim(`Session: ${thread.sessionId}\\n`));\n return \"continue\";\n\n case \"/cost\": {\n const summary = code.getCostSummary();\n if (summary) {\n process.stderr.write(\n chalk.dim(\n `Cost: $${summary.totalCostUSD.toFixed(4)} | ` +\n `Input: ${summary.totalInputTokens} tokens | ` +\n `Output: ${summary.totalOutputTokens} tokens\\n`,\n ),\n );\n } else {\n process.stderr.write(chalk.dim(\"Cost tracking not enabled.\\n\"));\n }\n return \"continue\";\n }\n\n case \"/sessions\": {\n const sessions = await code.listSessions();\n if (sessions.length === 0) {\n process.stderr.write(chalk.dim(\"No saved sessions.\\n\"));\n } else {\n for (const s of sessions.slice(0, 20)) {\n process.stderr.write(\n chalk.dim(\n ` ${s.sessionId.slice(0, 8)} ${s.createdAt ?? \"\"} ${s.messageCount ?? 0} messages\\n`,\n ),\n );\n }\n }\n return \"continue\";\n }\n\n case \"/model\": {\n const arg = input.trim().split(/\\s+/).slice(1).join(\" \");\n if (!arg) {\n process.stderr.write(chalk.dim(`Current model: ${thread.getModel()}\\n`));\n } else {\n thread.setModel(arg);\n process.stderr.write(chalk.dim(`Model set to ${arg}\\n`));\n }\n return \"continue\";\n }\n\n case \"/provider\": {\n const parts = input.trim().split(/\\s+/).slice(1);\n const providerName = parts[0];\n const modelArg = parts[1];\n if (!providerName) {\n process.stderr.write(\n chalk.dim(`Current: ${config.provider ?? \"auto\"}/${thread.getModel()}\\n`) +\n chalk.dim(`Available: ${SUPPORTED_PROVIDERS.join(\", \")}\\n`),\n );\n return \"continue\";\n }\n if (!(SUPPORTED_PROVIDERS as readonly string[]).includes(providerName)) {\n process.stderr.write(chalk.red(`Unknown provider: ${providerName}. Available: ${SUPPORTED_PROVIDERS.join(\", \")}\\n`));\n return \"continue\";\n }\n try {\n const model = modelArg ?? DEFAULT_MODELS[providerName];\n const provider = await createProvider(providerName as ProviderName, {\n apiKey: config.apiKey,\n model,\n baseURL: config.baseURL,\n });\n thread.setProvider(provider, model);\n config.provider = providerName;\n config.model = model;\n process.stderr.write(chalk.dim(`Switched to ${providerName}/${model}\\n`));\n } catch (err) {\n process.stderr.write(chalk.red(`Failed to switch: ${(err as Error).message}\\n`));\n }\n return \"continue\";\n }\n\n case \"/verbose\":\n config.verbose = !config.verbose;\n process.stderr.write(\n chalk.dim(`Verbose mode: ${config.verbose ? \"on\" : \"off\"}\\n`),\n );\n return \"continue\";\n\n case \"/help\":\n process.stderr.write(\n chalk.dim(\n [\n \"Commands:\",\n \" /quit, /exit Exit the REPL\",\n \" /new Start a new conversation\",\n \" /model [name] Show or change the model\",\n \" /provider [name] Show or switch provider (and model)\",\n \" /session Show current session ID\",\n \" /sessions List saved sessions\",\n \" /cost Show token usage and cost\",\n \" /verbose Toggle verbose output\",\n \" /help Show this help\",\n \"\",\n \"Shortcuts:\",\n \" Ctrl+C Cancel current turn / exit when idle\",\n \"\",\n ].join(\"\\n\"),\n ),\n );\n return \"continue\";\n\n default:\n process.stderr.write(\n chalk.yellow(`Unknown command: ${cmd}. Try /help\\n`),\n );\n return \"continue\";\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as readline from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport { SUPPORTED_PROVIDERS, DEFAULT_MODELS, isOllamaRunning, ollamaBaseURL } from \"./provider-factory.js\";\n\nconst PERMISSION_MODES = [\"default\", \"plan\", \"acceptEdits\", \"auto\", \"bypassPermissions\"];\n\nexport async function runInit(): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n process.stdout.write(chalk.bold(\"noumen init\") + \"\\n\\n\");\n\n const provider = await askChoice(\n rl,\n \"Provider\",\n SUPPORTED_PROVIDERS,\n \"anthropic\",\n );\n\n let defaultModel = DEFAULT_MODELS[provider] ?? \"\";\n\n if (provider === \"ollama\") {\n const ollamaModels = await listOllamaModels();\n if (ollamaModels.length > 0) {\n process.stdout.write(chalk.dim(` Available models: ${ollamaModels.join(\", \")}\\n`));\n if (ollamaModels.includes(defaultModel)) {\n // keep the default\n } else {\n defaultModel = ollamaModels[0];\n }\n } else {\n process.stdout.write(\n chalk.yellow(\n `\\n Ollama doesn't appear to be running at ${ollamaBaseURL()}.\\n` +\n ` Install it from https://ollama.com, then run:\\n` +\n ` ollama pull ${defaultModel}\\n` +\n ` ollama serve\\n\\n`,\n ),\n );\n }\n }\n\n const model = await askDefault(rl, \"Model\", defaultModel);\n\n const permissions = await askChoice(\n rl,\n \"Permission mode\",\n PERMISSION_MODES,\n \"default\",\n );\n\n const config: Record<string, unknown> = { provider };\n if (model !== defaultModel) config.model = model;\n if (permissions !== \"default\") config.permissions = permissions;\n\n const dir = path.join(process.cwd(), \".noumen\");\n fs.mkdirSync(dir, { recursive: true });\n\n const configPath = path.join(dir, \"config.json\");\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n process.stdout.write(chalk.green(` Created ${configPath}\\n`));\n\n const noumenMdPath = path.join(process.cwd(), \"NOUMEN.md\");\n if (!fs.existsSync(noumenMdPath)) {\n const create = await askDefault(rl, \"Create NOUMEN.md?\", \"Y\");\n if (create.toLowerCase() === \"y\" || create.toLowerCase() === \"yes\") {\n fs.writeFileSync(noumenMdPath, NOUMEN_MD_TEMPLATE);\n process.stdout.write(chalk.green(` Created ${noumenMdPath}\\n`));\n }\n }\n\n process.stdout.write(\n \"\\n\" + chalk.dim(\"Run `noumen` to start a session.\") + \"\\n\",\n );\n } finally {\n rl.close();\n }\n}\n\nasync function listOllamaModels(): Promise<string[]> {\n if (!(await isOllamaRunning())) return [];\n try {\n const res = await fetch(`${ollamaBaseURL()}/api/tags`, {\n signal: AbortSignal.timeout(2000),\n });\n if (!res.ok) return [];\n const data = (await res.json()) as { models?: Array<{ name: string }> };\n return (data.models ?? []).map((m) => m.name);\n } catch {\n return [];\n }\n}\n\nasync function askChoice(\n rl: readline.Interface,\n label: string,\n choices: string[],\n defaultValue: string,\n): Promise<string> {\n const hint = choices.join(\", \");\n const answer = await rl.question(\n ` ${label} (${hint}) [${chalk.bold(defaultValue)}]: `,\n );\n const trimmed = answer.trim();\n if (!trimmed) return defaultValue;\n if (choices.includes(trimmed)) return trimmed;\n process.stdout.write(chalk.yellow(` Invalid choice, using ${defaultValue}\\n`));\n return defaultValue;\n}\n\nasync function askDefault(\n rl: readline.Interface,\n label: string,\n defaultValue: string,\n): Promise<string> {\n const answer = await rl.question(\n ` ${label} [${chalk.bold(defaultValue)}]: `,\n );\n return answer.trim() || defaultValue;\n}\n\nconst NOUMEN_MD_TEMPLATE = `# Project Instructions\n\nAdd project-specific instructions for the AI agent here.\nThese instructions are loaded automatically when running noumen in this directory.\n\n## Guidelines\n\n- Describe your project's coding conventions\n- Note important architectural decisions\n- List files or patterns the agent should be aware of\n`;\n"],"mappings":"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","names":["chalk","fs","path","readline","chalk","chalk","os","chalk","createInterface","SUPPORTED_PROVIDERS","isOllamaRunning","ollamaBaseURL","DEFAULT_MODELS","startSpinner","isVisibleEvent"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/config.ts","../../src/cli/repl.ts","../../src/cli/init.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loadCliConfig, mergeConfig, type MergedConfig } from \"./config.js\";\nimport { createProvider, detectProvider, type ProviderName } from \"./provider-factory.js\";\nimport { startRepl } from \"./repl.js\";\nimport { renderEvent, createRenderState, promptPermission } from \"./render.js\";\nimport { runInit } from \"./init.js\";\nimport * as os from \"node:os\";\nimport { Agent, LocalSandbox, UnsandboxedLocal, type Sandbox, type DiagnoseResult, type DiagnoseCheckResult } from \"../index.js\";\nimport type { ThinkingConfig } from \"../thinking/types.js\";\nimport type { PermissionMode } from \"../permissions/types.js\";\n\nconst VERSION = \"0.2.0\";\n\nasync function listLocalOllamaModels(baseURL: string): Promise<string[]> {\n try {\n const res = await fetch(`${baseURL}/api/tags`, {\n signal: AbortSignal.timeout(2000),\n });\n if (!res.ok) return [];\n const data = (await res.json()) as { models?: Array<{ name: string }> };\n return (data.models ?? []).map((m) => m.name);\n } catch {\n return [];\n }\n}\n\nfunction parseThinking(level: string | undefined): ThinkingConfig | undefined {\n if (!level || level === \"off\") return { type: \"disabled\" };\n const budgets: Record<string, number> = {\n low: 1024,\n medium: 10240,\n high: 32768,\n };\n const budget = budgets[level];\n if (budget) return { type: \"enabled\", budgetTokens: budget };\n return undefined;\n}\n\n/**\n * Create the CLI sandbox. Defaults to OS-level sandboxed `LocalSandbox`.\n * Use `--no-sandbox` to explicitly opt out.\n */\nfunction createCliSandbox(config: MergedConfig): Sandbox {\n if (config.noSandbox) {\n return UnsandboxedLocal({ cwd: config.cwd });\n }\n\n const sandboxOpts: import(\"../index.js\").LocalSandboxOptions = {\n cwd: config.cwd,\n };\n\n const allowWrite = config.sandboxAllowWrite\n ? (config.sandboxAllowWrite as string).split(\",\").map((s: string) => s.trim())\n : undefined;\n const allowDomains = config.sandboxAllowDomain\n ? (config.sandboxAllowDomain as string).split(\",\").map((s: string) => s.trim())\n : undefined;\n\n if (allowWrite || allowDomains) {\n sandboxOpts.sandbox = {\n filesystem: allowWrite ? { allowWrite: [config.cwd, ...allowWrite] } : undefined,\n network: allowDomains ? { allowedDomains: allowDomains } : undefined,\n };\n }\n\n return LocalSandbox(sandboxOpts);\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n return Buffer.concat(chunks).toString(\"utf-8\").trim();\n}\n\nasync function main(): Promise<void> {\n const program = new Command(\"noumen\")\n .version(VERSION)\n .description(\"AI coding agent — bring your own provider\")\n .option(\"-p, --provider <name>\", \"openai | anthropic | gemini | openrouter | bedrock | vertex | ollama\")\n .option(\"-m, --model <model>\", \"model name\")\n .option(\"--api-key <key>\", \"API key (overrides env vars)\")\n .option(\"--base-url <url>\", \"override provider base URL\")\n .option(\"--cwd <dir>\", \"working directory\")\n .option(\"--permission <mode>\", \"permission mode (default, plan, acceptEdits, auto, bypassPermissions, dontAsk)\")\n .option(\"--thinking <level>\", \"thinking level: off, low, medium, high\")\n .option(\"--max-turns <n>\", \"max agent turns\", parseInt)\n .option(\"--json\", \"emit JSONL stream events to stdout\")\n .option(\"--quiet\", \"only output final text\")\n .option(\"--verbose\", \"show tool calls and thinking\")\n .option(\"--headless\", \"NDJSON stdin/stdout protocol for programmatic control\")\n .option(\"--no-sandbox\", \"disable OS-level sandboxing (use UnsandboxedLocal)\")\n .option(\"--sandbox-allow-write <paths>\", \"comma-separated paths to allow writing in sandbox\")\n .option(\"--sandbox-allow-domain <domains>\", \"comma-separated domains to allow in sandbox\")\n .option(\"-c, --prompt <text>\", \"one-shot prompt (non-interactive)\")\n .argument(\"[prompt...]\", \"inline prompt\")\n .allowExcessArguments(true)\n .action(async (args: string[]) => {\n const opts = program.opts();\n\n if (args.length > 0 && !opts.prompt) {\n opts.prompt = args.join(\" \");\n }\n\n if (!process.stdin.isTTY && !opts.prompt) {\n opts.prompt = await readStdin();\n if (!opts.prompt) {\n process.stderr.write(chalk.red(\"No input provided.\\n\"));\n process.exit(1);\n }\n }\n\n const cwd = opts.cwd ?? process.cwd();\n const config = loadCliConfig(cwd);\n const merged = mergeConfig(config, opts);\n\n await runAgent(merged);\n });\n\n program\n .command(\"init\")\n .description(\"create .noumen/config.json in the current directory\")\n .action(async () => {\n await runInit();\n process.exit(0);\n });\n\n program\n .command(\"sessions\")\n .description(\"list past sessions\")\n .action(async () => {\n await listSessions();\n process.exit(0);\n });\n\n program\n .command(\"resume <session-id>\")\n .description(\"resume a previous session\")\n .action(async (sessionId: string) => {\n await resumeSession(sessionId);\n });\n\n program\n .command(\"doctor\")\n .description(\"run health checks on provider, sandbox, MCP, and LSP\")\n .action(async () => {\n await runDoctor();\n });\n\n await program.parseAsync(process.argv);\n}\n\nasync function runAgent(config: MergedConfig): Promise<void> {\n const providerName: ProviderName | undefined =\n (config.provider as ProviderName | undefined) ?? await detectProvider();\n\n if (!providerName) {\n if (!process.stdin.isTTY) {\n process.stderr.write(chalk.red(\"No provider specified.\\n\"));\n process.exit(1);\n }\n process.stderr.write(\n chalk.bold(\"Welcome to noumen!\\n\\n\") +\n chalk.dim(\"No provider detected. Let's set one up.\\n\\n\"),\n );\n\n const { createInterface } = await import(\"node:readline/promises\");\n const rl = createInterface({ input: process.stdin, output: process.stderr, terminal: true });\n\n try {\n const { SUPPORTED_PROVIDERS, isOllamaRunning, ollamaBaseURL } = await import(\"./provider-factory.js\");\n const providerAnswer = await rl.question(\n ` Provider (${SUPPORTED_PROVIDERS.join(\", \")}) [${chalk.bold(\"ollama\")}]: `,\n );\n const picked = providerAnswer.trim() || \"ollama\";\n if (!(SUPPORTED_PROVIDERS as readonly string[]).includes(picked)) {\n process.stderr.write(chalk.red(`Unknown provider: ${picked}\\n`));\n process.exit(1);\n }\n\n if (picked === \"ollama\") {\n if (!(await isOllamaRunning())) {\n process.stderr.write(\n chalk.yellow(`\\n Ollama doesn't appear to be running at ${ollamaBaseURL()}.\\n`) +\n chalk.yellow(` Install it from https://ollama.com, then run:\\n\\n`) +\n ` ${chalk.cyan(\"ollama pull qwen2.5-coder:32b\")}\\n` +\n ` ${chalk.cyan(\"ollama serve\")}\\n\\n` +\n chalk.yellow(` Then re-run noumen.\\n`),\n );\n rl.close();\n process.exit(1);\n }\n\n const models = await listLocalOllamaModels(ollamaBaseURL());\n if (models.length > 0) {\n process.stderr.write(chalk.dim(` Available models: ${models.join(\", \")}\\n`));\n const defaultModel = models.includes(\"qwen2.5-coder:32b\") ? \"qwen2.5-coder:32b\" : models[0];\n const modelAnswer = await rl.question(\n ` Model [${chalk.bold(defaultModel)}]: `,\n );\n config.model = modelAnswer.trim() || defaultModel;\n }\n }\n\n const needsKey = ![\"bedrock\", \"vertex\", \"ollama\"].includes(picked);\n let apiKey: string | undefined;\n if (needsKey) {\n const keyAnswer = await rl.question(` API key: `);\n apiKey = keyAnswer.trim();\n if (!apiKey) {\n process.stderr.write(chalk.red(\"API key is required.\\n\"));\n process.exit(1);\n }\n }\n\n rl.close();\n config.provider = picked;\n if (apiKey) config.apiKey = apiKey;\n } catch {\n rl.close();\n process.exit(1);\n }\n\n return runAgent(config);\n }\n\n if (!config.model) {\n const { DEFAULT_MODELS } = await import(\"./provider-factory.js\");\n if (providerName === \"ollama\") {\n const { ollamaBaseURL } = await import(\"./provider-factory.js\");\n const models = await listLocalOllamaModels(ollamaBaseURL());\n const preferred = DEFAULT_MODELS[providerName];\n config.model = models.includes(preferred) ? preferred : models[0] ?? preferred;\n } else {\n config.model = DEFAULT_MODELS[providerName];\n }\n }\n\n const provider = await createProvider(providerName, {\n apiKey: config.apiKey,\n model: config.model,\n baseURL: config.baseURL,\n });\n\n const thinking = parseThinking(config.thinking);\n const permissionMode = (config.permissions ?? \"default\") as PermissionMode;\n\n const agent = new Agent({\n provider: provider,\n sandbox: createCliSandbox(config),\n options: {\n cwd: config.cwd,\n model: config.model,\n systemPrompt: config.systemPrompt,\n permissions: {\n mode: permissionMode,\n },\n thinking,\n autoCompact: config.autoCompact ?? true,\n enableSubagents: config.enableSubagents ?? true,\n enableTasks: config.enableTasks ?? false,\n enablePlanMode: config.enablePlanMode ?? true,\n enableWorktrees: config.enableWorktrees ?? false,\n mcpServers: config.mcpServers,\n lsp: config.lsp,\n hooks: config.hooks,\n webSearch: config.webSearch,\n sessionDir: config.sessionDir ?? \".noumen/sessions\",\n projectContext: { cwd: config.cwd, homeDir: os.homedir() },\n costTracking: { enabled: true },\n retry: true,\n },\n });\n\n if (config.headless) {\n const { runHeadless } = await import(\"./headless.js\");\n await runHeadless(agent, config);\n return;\n }\n\n await agent.init();\n\n try {\n if (config.prompt) {\n await runOneShot(agent, config);\n } else {\n if (!process.stdin.isTTY) {\n process.stderr.write(\n chalk.red(\"Interactive mode requires a TTY. Use -c or pipe input.\\n\"),\n );\n process.exit(1);\n }\n await startRepl(agent, config, () => agent.close());\n }\n } finally {\n await agent.close();\n }\n}\n\nasync function runOneShot(agent: Agent, config: MergedConfig): Promise<void> {\n const { startSpinner } = await import(\"./spinner.js\");\n const { isVisibleEvent } = await import(\"./render.js\");\n const thread = await agent.createThread();\n const state = createRenderState();\n const runOpts = config.maxTurns ? { maxTurns: config.maxTurns } : undefined;\n\n const spinner =\n !config.json && !config.quiet ? startSpinner(\"Thinking\") : null;\n\n try {\n for await (const event of thread.run(config.prompt!, runOpts)) {\n if (!state.showedActivity && spinner && isVisibleEvent(event, config)) {\n spinner.stop();\n state.showedActivity = true;\n }\n renderEvent(event, config, state);\n }\n } finally {\n spinner?.stop();\n }\n\n if (config.quiet && state.accumulatedText) {\n process.stdout.write(state.accumulatedText);\n if (!state.accumulatedText.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n } else if (state.accumulatedText && !state.accumulatedText.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n}\n\nasync function listSessions(): Promise<void> {\n const cwd = process.cwd();\n const config = loadCliConfig(cwd);\n const merged = mergeConfig(config, { cwd });\n\n const providerName: ProviderName | undefined = (merged.provider as ProviderName | undefined) ?? await detectProvider();\n if (!providerName) {\n process.stderr.write(chalk.red(\"No provider configured. Run `noumen init` first.\\n\"));\n process.exit(1);\n }\n\n const provider = await createProvider(providerName, {\n apiKey: merged.apiKey,\n model: merged.model,\n baseURL: merged.baseURL,\n });\n\n const agent = new Agent({\n provider: provider,\n sandbox: UnsandboxedLocal({ cwd }),\n options: { cwd, sessionDir: merged.sessionDir ?? \".noumen/sessions\" },\n });\n\n const sessions = await agent.listSessions();\n if (sessions.length === 0) {\n process.stdout.write(chalk.dim(\"No saved sessions.\\n\"));\n return;\n }\n\n process.stdout.write(chalk.bold(\"Sessions:\\n\"));\n for (const s of sessions) {\n const title = s.title ? chalk.white(` ${s.title}`) : \"\";\n process.stdout.write(\n ` ${chalk.cyan(s.sessionId.slice(0, 8))} ${chalk.dim(s.createdAt)} ${chalk.dim(`${s.messageCount} msgs`)}${title}\\n`,\n );\n }\n}\n\nasync function resumeSession(sessionId: string): Promise<void> {\n const cwd = process.cwd();\n const config = loadCliConfig(cwd);\n const merged = mergeConfig(config, { cwd });\n\n const providerName: ProviderName | undefined = (merged.provider as ProviderName | undefined) ?? await detectProvider();\n if (!providerName) {\n process.stderr.write(chalk.red(\"No provider configured. Run `noumen init` first.\\n\"));\n process.exit(1);\n }\n\n const provider = await createProvider(providerName, {\n apiKey: merged.apiKey,\n model: merged.model,\n baseURL: merged.baseURL,\n });\n\n const thinking = parseThinking(merged.thinking);\n const permissionMode = (merged.permissions ?? \"default\") as PermissionMode;\n\n const agent = new Agent({\n provider: provider,\n sandbox: createCliSandbox(merged),\n options: {\n cwd,\n model: merged.model,\n permissions: { mode: permissionMode },\n thinking,\n autoCompact: merged.autoCompact ?? true,\n enableSubagents: merged.enableSubagents ?? true,\n enablePlanMode: merged.enablePlanMode ?? true,\n mcpServers: merged.mcpServers,\n lsp: merged.lsp,\n hooks: merged.hooks,\n sessionDir: merged.sessionDir ?? \".noumen/sessions\",\n projectContext: { cwd, homeDir: os.homedir() },\n costTracking: { enabled: true },\n retry: true,\n },\n });\n\n await agent.init();\n\n // Match full session ID from partial prefix\n const sessions = await agent.listSessions();\n const match = sessions.find(\n (s) => s.sessionId === sessionId || s.sessionId.startsWith(sessionId),\n );\n\n if (!match) {\n process.stderr.write(chalk.red(`Session not found: ${sessionId}\\n`));\n process.exit(1);\n }\n\n process.stderr.write(\n chalk.dim(`Resuming session ${match.sessionId.slice(0, 8)}...\\n\\n`),\n );\n\n const { createInterface } = await import(\"node:readline/promises\");\n const rl = createInterface({ input: process.stdin, output: process.stderr, terminal: true });\n\n const thread = await agent.resumeThread(match.sessionId);\n\n // Enter REPL with the resumed thread\n const { renderEvent: render, createRenderState: makeState } = await import(\"./render.js\");\n\n process.stderr.write(chalk.dim(\"Session resumed. Type a message to continue.\\n\\n\"));\n\n try {\n while (true) {\n let input: string;\n try {\n input = await rl.question(chalk.blue(\"> \"));\n } catch {\n break;\n }\n if (!input.trim()) continue;\n if (input.trim() === \"/quit\" || input.trim() === \"/exit\") break;\n\n const state = makeState();\n for await (const event of thread.run(input)) {\n render(event, merged, state);\n }\n if (state.accumulatedText && !state.accumulatedText.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n } finally {\n rl.close();\n await agent.close();\n }\n}\n\nasync function runDoctor(): Promise<void> {\n const cwd = process.cwd();\n const config = loadCliConfig(cwd);\n const merged = mergeConfig(config, { cwd });\n\n const providerName: ProviderName | undefined = (merged.provider as ProviderName | undefined) ?? await detectProvider();\n if (!providerName) {\n process.stderr.write(chalk.red(\"No provider configured. Run `noumen init` first.\\n\"));\n process.exit(1);\n }\n\n const provider = await createProvider(providerName, {\n apiKey: merged.apiKey,\n model: merged.model,\n baseURL: merged.baseURL,\n });\n\n const agent = new Agent({\n provider: provider,\n sandbox: createCliSandbox(merged),\n options: {\n cwd,\n model: merged.model,\n mcpServers: merged.mcpServers,\n lsp: merged.lsp,\n sessionDir: merged.sessionDir ?? \".noumen/sessions\",\n },\n });\n\n await agent.init();\n\n process.stderr.write(chalk.bold(\"\\nnoumen doctor\\n\\n\"));\n const result = await agent.diagnose();\n printDiagnoseResult(result);\n await agent.close();\n process.exit(result.overall ? 0 : 1);\n}\n\nfunction formatCheckLine(label: string, check: DiagnoseCheckResult, extra?: string): string {\n const icon = check.ok ? chalk.green(\"✓\") : chalk.red(\"✗\");\n const timing = check.latencyMs > 0 ? chalk.dim(` (${check.latencyMs}ms)`) : \"\";\n const suffix = extra ? chalk.dim(` ${extra}`) : \"\";\n const errMsg = check.error ? chalk.red(` ${check.error}`) : \"\";\n const warnMsg = !check.error && check.warning ? chalk.yellow(` ${check.warning}`) : \"\";\n return ` ${icon} ${label}${timing}${suffix}${errMsg}${warnMsg}\\n`;\n}\n\nfunction printDiagnoseResult(r: DiagnoseResult): void {\n const modelLabel = r.provider.model ? ` (${r.provider.model})` : \"\";\n process.stderr.write(formatCheckLine(`Provider${modelLabel}`, r.provider));\n process.stderr.write(formatCheckLine(\"Sandbox: filesystem\", r.sandbox.fs));\n process.stderr.write(formatCheckLine(\"Sandbox: shell\", r.sandbox.computer));\n process.stderr.write(formatCheckLine(\n \"Sandbox: OS-level (sandbox-runtime)\",\n r.sandboxRuntime,\n r.sandboxRuntime.platform,\n ));\n\n for (const [name, check] of Object.entries(r.mcp)) {\n const parts: string[] = [];\n if (check.status) parts.push(check.status);\n if (check.toolCount != null) parts.push(`${check.toolCount} tools`);\n const extra = parts.length ? parts.join(\", \") : undefined;\n process.stderr.write(formatCheckLine(`MCP: ${name}`, check, extra));\n }\n\n for (const [name, check] of Object.entries(r.lsp)) {\n const extra = check.state ?? undefined;\n process.stderr.write(formatCheckLine(`LSP: ${name}`, check, extra));\n }\n\n process.stderr.write(\"\\n\");\n if (r.overall) {\n process.stderr.write(` ${chalk.green(\"Overall: healthy\")}\\n\\n`);\n } else {\n process.stderr.write(` ${chalk.red(\"Overall: unhealthy\")}\\n\\n`);\n }\n}\n\nmain().catch((err) => {\n process.stderr.write(chalk.red(`Fatal: ${err.message}\\n`));\n process.exit(1);\n});\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport type { McpServerConfig } from \"../mcp/types.js\";\nimport type { LspServerConfig } from \"../lsp/types.js\";\nimport type { HookDefinition } from \"../hooks/types.js\";\nimport type { WebSearchConfig } from \"../tools/web-search.js\";\n\nexport interface CliConfig {\n provider?: string;\n model?: string;\n apiKey?: string;\n baseURL?: string;\n permissions?: string;\n thinking?: string;\n sandbox?: string;\n mcpServers?: Record<string, McpServerConfig>;\n lsp?: Record<string, LspServerConfig>;\n hooks?: HookDefinition[];\n autoCompact?: boolean;\n enableSubagents?: boolean;\n enableTasks?: boolean;\n enablePlanMode?: boolean;\n enableWorktrees?: boolean;\n webSearch?: WebSearchConfig;\n costLimit?: number;\n maxTurns?: number;\n systemPrompt?: string;\n sessionDir?: string;\n}\n\n/**\n * Load global config from ~/.noumen/config.json.\n * Returns empty object if not found or invalid.\n */\nexport function loadGlobalConfig(): CliConfig {\n const globalPath = path.join(os.homedir(), \".noumen\", \"config.json\");\n try {\n const raw = fs.readFileSync(globalPath, \"utf-8\");\n return JSON.parse(raw) as CliConfig;\n } catch {\n return {};\n }\n}\n\n/**\n * Walk up from `cwd` looking for `.noumen/config.json`.\n * Returns parsed config or empty object if none found.\n */\nfunction loadProjectConfig(cwd: string): CliConfig {\n let dir = path.resolve(cwd);\n const root = path.parse(dir).root;\n\n while (true) {\n const candidate = path.join(dir, \".noumen\", \"config.json\");\n try {\n const raw = fs.readFileSync(candidate, \"utf-8\");\n return JSON.parse(raw) as CliConfig;\n } catch {\n // not found or invalid — keep walking\n }\n const parent = path.dirname(dir);\n if (parent === dir || dir === root) break;\n dir = parent;\n }\n\n return {};\n}\n\n/**\n * Load config with layering: global (~/.noumen/config.json) < project < flags.\n * Project-level values override global values.\n */\nexport function loadCliConfig(cwd: string): CliConfig {\n const global = loadGlobalConfig();\n const project = loadProjectConfig(cwd);\n return { ...global, ...project };\n}\n\nexport interface MergedConfig extends CliConfig {\n cwd: string;\n json?: boolean;\n quiet?: boolean;\n verbose?: boolean;\n headless?: boolean;\n prompt?: string;\n noSandbox?: boolean;\n sandboxAllowWrite?: string;\n sandboxAllowDomain?: string;\n}\n\n/**\n * Merge CLI flags over the config file values. Flags take precedence.\n */\nexport function mergeConfig(\n config: CliConfig,\n flags: Record<string, unknown>,\n): MergedConfig {\n const cwd = (flags.cwd as string) ?? process.cwd();\n return {\n ...config,\n ...(flags.provider !== undefined && { provider: flags.provider as string }),\n ...(flags.model !== undefined && { model: flags.model as string }),\n ...(flags.apiKey !== undefined && { apiKey: flags.apiKey as string }),\n ...(flags.baseUrl !== undefined && { baseURL: flags.baseUrl as string }),\n ...(flags.permission !== undefined && { permissions: flags.permission as string }),\n ...(flags.thinking !== undefined && { thinking: flags.thinking as string }),\n ...(flags.maxTurns !== undefined && { maxTurns: flags.maxTurns as number }),\n ...(flags.systemPrompt !== undefined && { systemPrompt: flags.systemPrompt as string }),\n cwd,\n json: flags.json as boolean | undefined,\n quiet: flags.quiet as boolean | undefined,\n verbose: flags.verbose as boolean | undefined,\n headless: flags.headless as boolean | undefined,\n prompt: flags.prompt as string | undefined,\n noSandbox: flags.sandbox === false ? true : undefined,\n sandboxAllowWrite: flags.sandboxAllowWrite as string | undefined,\n sandboxAllowDomain: flags.sandboxAllowDomain as string | undefined,\n };\n}\n","import * as readline from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport type { Agent } from \"../agent.js\";\nimport type { Thread } from \"../thread.js\";\nimport type { MergedConfig } from \"./config.js\";\nimport { renderEvent, createRenderState, promptPermission, isVisibleEvent } from \"./render.js\";\nimport { DEFAULT_MODELS, createProvider, SUPPORTED_PROVIDERS, type ProviderName } from \"./provider-factory.js\";\nimport { startSpinner } from \"./spinner.js\";\n\nexport async function startRepl(\n code: Agent,\n config: MergedConfig,\n cleanup?: () => Promise<void>,\n): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stderr,\n terminal: true,\n });\n\n let thread = await code.createThread({\n userInputHandler: (q) => promptPermission(rl, \"agent\", q).then((ok) => ok ? \"yes\" : \"no\"),\n });\n\n let runningTurn = false;\n let currentThread: Thread = thread;\n\n const sigintHandler = () => {\n if (runningTurn) {\n currentThread.abort();\n runningTurn = false;\n process.stderr.write(chalk.yellow(\"\\n Cancelled.\\n\\n\"));\n } else {\n process.stderr.write(chalk.dim(\"\\nGoodbye.\\n\"));\n rl.close();\n cleanup?.().catch(() => {}).finally(() => process.exit(0));\n }\n };\n process.on(\"SIGINT\", sigintHandler);\n\n printWelcome(config);\n\n try {\n while (true) {\n let input: string;\n try {\n input = await rl.question(chalk.blue(\"> \"));\n } catch {\n break;\n }\n\n if (!input.trim()) continue;\n\n if (input.startsWith(\"/\")) {\n const result = await handleSlashCommand(\n input,\n thread,\n code,\n config,\n rl,\n );\n if (result === \"quit\") break;\n if (result === \"new\") {\n thread = await code.createThread({\n userInputHandler: (q) => promptPermission(rl, \"agent\", q).then((ok) => ok ? \"yes\" : \"no\"),\n });\n currentThread = thread;\n }\n continue;\n }\n\n const state = createRenderState();\n const runOpts = config.maxTurns ? { maxTurns: config.maxTurns } : undefined;\n\n const spinner =\n !config.json && !config.quiet ? startSpinner(\"Thinking\") : null;\n\n runningTurn = true;\n try {\n for await (const event of thread.run(input, runOpts)) {\n if (!state.showedActivity && spinner && isVisibleEvent(event, config)) {\n spinner.stop();\n state.showedActivity = true;\n }\n renderEvent(event, config, state);\n }\n } catch (err) {\n if ((err as Error)?.name === \"AbortError\") {\n // already handled by SIGINT handler\n } else {\n throw err;\n }\n } finally {\n spinner?.stop();\n runningTurn = false;\n }\n\n if (state.accumulatedText && !state.accumulatedText.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n } finally {\n process.removeListener(\"SIGINT\", sigintHandler);\n rl.close();\n }\n}\n\nfunction printWelcome(config: MergedConfig): void {\n const provider = config.provider ?? \"auto\";\n const model = config.model ?? DEFAULT_MODELS[provider] ?? \"default\";\n process.stderr.write(\n chalk.bold(\"noumen\") +\n chalk.dim(` — ${provider}/${model}`) +\n \"\\n\" +\n chalk.dim(\"Type a message to begin. /help for commands, Ctrl+C to cancel.\") +\n \"\\n\\n\",\n );\n}\n\ntype SlashResult = \"continue\" | \"quit\" | \"new\";\n\nasync function handleSlashCommand(\n input: string,\n thread: Thread,\n code: Agent,\n config: MergedConfig,\n _rl: readline.Interface,\n): Promise<SlashResult> {\n const [cmd] = input.trim().split(/\\s+/);\n\n switch (cmd) {\n case \"/quit\":\n case \"/exit\":\n case \"/q\":\n process.stderr.write(chalk.dim(\"Goodbye.\\n\"));\n return \"quit\";\n\n case \"/new\":\n process.stderr.write(chalk.dim(\"Starting new conversation.\\n\\n\"));\n return \"new\";\n\n case \"/session\":\n process.stderr.write(chalk.dim(`Session: ${thread.sessionId}\\n`));\n return \"continue\";\n\n case \"/cost\": {\n const summary = code.getCostSummary();\n if (summary) {\n process.stderr.write(\n chalk.dim(\n `Cost: $${summary.totalCostUSD.toFixed(4)} | ` +\n `Input: ${summary.totalInputTokens} tokens | ` +\n `Output: ${summary.totalOutputTokens} tokens\\n`,\n ),\n );\n } else {\n process.stderr.write(chalk.dim(\"Cost tracking not enabled.\\n\"));\n }\n return \"continue\";\n }\n\n case \"/sessions\": {\n const sessions = await code.listSessions();\n if (sessions.length === 0) {\n process.stderr.write(chalk.dim(\"No saved sessions.\\n\"));\n } else {\n for (const s of sessions.slice(0, 20)) {\n process.stderr.write(\n chalk.dim(\n ` ${s.sessionId.slice(0, 8)} ${s.createdAt ?? \"\"} ${s.messageCount ?? 0} messages\\n`,\n ),\n );\n }\n }\n return \"continue\";\n }\n\n case \"/model\": {\n const arg = input.trim().split(/\\s+/).slice(1).join(\" \");\n if (!arg) {\n process.stderr.write(chalk.dim(`Current model: ${thread.getModel()}\\n`));\n } else {\n thread.setModel(arg);\n process.stderr.write(chalk.dim(`Model set to ${arg}\\n`));\n }\n return \"continue\";\n }\n\n case \"/provider\": {\n const parts = input.trim().split(/\\s+/).slice(1);\n const providerName = parts[0];\n const modelArg = parts[1];\n if (!providerName) {\n process.stderr.write(\n chalk.dim(`Current: ${config.provider ?? \"auto\"}/${thread.getModel()}\\n`) +\n chalk.dim(`Available: ${SUPPORTED_PROVIDERS.join(\", \")}\\n`),\n );\n return \"continue\";\n }\n if (!(SUPPORTED_PROVIDERS as readonly string[]).includes(providerName)) {\n process.stderr.write(chalk.red(`Unknown provider: ${providerName}. Available: ${SUPPORTED_PROVIDERS.join(\", \")}\\n`));\n return \"continue\";\n }\n try {\n const model = modelArg ?? DEFAULT_MODELS[providerName];\n const provider = await createProvider(providerName as ProviderName, {\n apiKey: config.apiKey,\n model,\n baseURL: config.baseURL,\n });\n thread.setProvider(provider, model);\n config.provider = providerName;\n config.model = model;\n process.stderr.write(chalk.dim(`Switched to ${providerName}/${model}\\n`));\n } catch (err) {\n process.stderr.write(chalk.red(`Failed to switch: ${(err as Error).message}\\n`));\n }\n return \"continue\";\n }\n\n case \"/verbose\":\n config.verbose = !config.verbose;\n process.stderr.write(\n chalk.dim(`Verbose mode: ${config.verbose ? \"on\" : \"off\"}\\n`),\n );\n return \"continue\";\n\n case \"/help\":\n process.stderr.write(\n chalk.dim(\n [\n \"Commands:\",\n \" /quit, /exit Exit the REPL\",\n \" /new Start a new conversation\",\n \" /model [name] Show or change the model\",\n \" /provider [name] Show or switch provider (and model)\",\n \" /session Show current session ID\",\n \" /sessions List saved sessions\",\n \" /cost Show token usage and cost\",\n \" /verbose Toggle verbose output\",\n \" /help Show this help\",\n \"\",\n \"Shortcuts:\",\n \" Ctrl+C Cancel current turn / exit when idle\",\n \"\",\n ].join(\"\\n\"),\n ),\n );\n return \"continue\";\n\n default:\n process.stderr.write(\n chalk.yellow(`Unknown command: ${cmd}. Try /help\\n`),\n );\n return \"continue\";\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as readline from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport { SUPPORTED_PROVIDERS, DEFAULT_MODELS, isOllamaRunning, ollamaBaseURL } from \"./provider-factory.js\";\n\nconst PERMISSION_MODES = [\"default\", \"plan\", \"acceptEdits\", \"auto\", \"bypassPermissions\"];\n\nexport async function runInit(): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n process.stdout.write(chalk.bold(\"noumen init\") + \"\\n\\n\");\n\n const provider = await askChoice(\n rl,\n \"Provider\",\n SUPPORTED_PROVIDERS,\n \"anthropic\",\n );\n\n let defaultModel = DEFAULT_MODELS[provider] ?? \"\";\n\n if (provider === \"ollama\") {\n const ollamaModels = await listOllamaModels();\n if (ollamaModels.length > 0) {\n process.stdout.write(chalk.dim(` Available models: ${ollamaModels.join(\", \")}\\n`));\n if (ollamaModels.includes(defaultModel)) {\n // keep the default\n } else {\n defaultModel = ollamaModels[0];\n }\n } else {\n process.stdout.write(\n chalk.yellow(\n `\\n Ollama doesn't appear to be running at ${ollamaBaseURL()}.\\n` +\n ` Install it from https://ollama.com, then run:\\n` +\n ` ollama pull ${defaultModel}\\n` +\n ` ollama serve\\n\\n`,\n ),\n );\n }\n }\n\n const model = await askDefault(rl, \"Model\", defaultModel);\n\n const permissions = await askChoice(\n rl,\n \"Permission mode\",\n PERMISSION_MODES,\n \"default\",\n );\n\n const config: Record<string, unknown> = { provider };\n if (model !== defaultModel) config.model = model;\n if (permissions !== \"default\") config.permissions = permissions;\n\n const dir = path.join(process.cwd(), \".noumen\");\n fs.mkdirSync(dir, { recursive: true });\n\n const configPath = path.join(dir, \"config.json\");\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n process.stdout.write(chalk.green(` Created ${configPath}\\n`));\n\n const noumenMdPath = path.join(process.cwd(), \"NOUMEN.md\");\n if (!fs.existsSync(noumenMdPath)) {\n const create = await askDefault(rl, \"Create NOUMEN.md?\", \"Y\");\n if (create.toLowerCase() === \"y\" || create.toLowerCase() === \"yes\") {\n fs.writeFileSync(noumenMdPath, NOUMEN_MD_TEMPLATE);\n process.stdout.write(chalk.green(` Created ${noumenMdPath}\\n`));\n }\n }\n\n process.stdout.write(\n \"\\n\" + chalk.dim(\"Run `noumen` to start a session.\") + \"\\n\",\n );\n } finally {\n rl.close();\n }\n}\n\nasync function listOllamaModels(): Promise<string[]> {\n if (!(await isOllamaRunning())) return [];\n try {\n const res = await fetch(`${ollamaBaseURL()}/api/tags`, {\n signal: AbortSignal.timeout(2000),\n });\n if (!res.ok) return [];\n const data = (await res.json()) as { models?: Array<{ name: string }> };\n return (data.models ?? []).map((m) => m.name);\n } catch {\n return [];\n }\n}\n\nasync function askChoice(\n rl: readline.Interface,\n label: string,\n choices: string[],\n defaultValue: string,\n): Promise<string> {\n const hint = choices.join(\", \");\n const answer = await rl.question(\n ` ${label} (${hint}) [${chalk.bold(defaultValue)}]: `,\n );\n const trimmed = answer.trim();\n if (!trimmed) return defaultValue;\n if (choices.includes(trimmed)) return trimmed;\n process.stdout.write(chalk.yellow(` Invalid choice, using ${defaultValue}\\n`));\n return defaultValue;\n}\n\nasync function askDefault(\n rl: readline.Interface,\n label: string,\n defaultValue: string,\n): Promise<string> {\n const answer = await rl.question(\n ` ${label} [${chalk.bold(defaultValue)}]: `,\n );\n return answer.trim() || defaultValue;\n}\n\nconst NOUMEN_MD_TEMPLATE = `# Project Instructions\n\nAdd project-specific instructions for the AI agent here.\nThese instructions are loaded automatically when running noumen in this directory.\n\n## Guidelines\n\n- Describe your project's coding conventions\n- Note important architectural decisions\n- List files or patterns the agent should be aware of\n`;\n"],"mappings":"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","names":["chalk","fs","path","readline","chalk","chalk","os","chalk","createInterface","SUPPORTED_PROVIDERS","isOllamaRunning","ollamaBaseURL","DEFAULT_MODELS","startSpinner","isVisibleEvent"]}
@@ -1,5 +1,5 @@
1
- import { S as StreamEvent } from '../types-3c88cRKH.js';
2
- import { P as PermissionResponse } from '../types-DwdzmXfs.js';
1
+ import { S as StreamEvent } from '../types-LrU4LRmX.js';
2
+ import { P as PermissionResponse } from '../types-CD0rUKKT.js';
3
3
 
4
4
  interface ClientOptions {
5
5
  /** Base URL of the noumen server, e.g. "http://localhost:3001". */
@@ -67,7 +67,7 @@ async function runHeadless(code, _config) {
67
67
  existing.running = true;
68
68
  thread = existing.thread;
69
69
  } else {
70
- thread = code.createThread({
70
+ thread = await code.createThread({
71
71
  sessionId,
72
72
  permissionHandler,
73
73
  userInputHandler
@@ -93,8 +93,7 @@ async function runHeadless(code, _config) {
93
93
  emit({ type: "error", error: { message: e.message, name: e.name }, sessionId });
94
94
  }
95
95
  } finally {
96
- const entry = sessions.get(sessionId);
97
- if (entry) entry.running = false;
96
+ sessions.delete(sessionId);
98
97
  emit({ type: "session_done", sessionId });
99
98
  }
100
99
  })();
@@ -140,4 +139,4 @@ async function runHeadless(code, _config) {
140
139
  export {
141
140
  runHeadless
142
141
  };
143
- //# sourceMappingURL=headless-Q7XHHZIW.js.map
142
+ //# sourceMappingURL=headless-FFU2DESQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/headless.ts"],"sourcesContent":["import * as readline from \"node:readline\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Agent } from \"../agent.js\";\nimport type { Thread } from \"../thread.js\";\nimport type { StreamEvent } from \"../session/types.js\";\nimport type { PermissionResponse } from \"../permissions/types.js\";\nimport type { MergedConfig } from \"./config.js\";\n\ninterface PromiseResolver<T> {\n resolve: (value: T) => void;\n reject: (err: Error) => void;\n}\n\ninterface SessionEntry {\n thread: Thread;\n abort: AbortController;\n pendingPermission: PromiseResolver<PermissionResponse> | null;\n pendingInput: PromiseResolver<string> | null;\n running: boolean;\n}\n\nfunction emit(obj: Record<string, unknown>): void {\n process.stdout.write(JSON.stringify(obj) + \"\\n\");\n}\n\nfunction serializeEvent(event: StreamEvent): Record<string, unknown> {\n if (event.type === \"error\") {\n return { type: \"error\", error: { message: event.error.message, name: event.error.name } };\n }\n if (event.type === \"retry_exhausted\") {\n return { ...event, error: { message: event.error.message, name: event.error.name } };\n }\n if (event.type === \"retry_attempt\") {\n return { ...event, error: { message: event.error.message, name: event.error.name } };\n }\n return event as unknown as Record<string, unknown>;\n}\n\n/**\n * Run the agent in headless mode: bidirectional NDJSON over stdin/stdout.\n *\n * Inbound commands (stdin, one JSON per line):\n * { type: \"prompt\", text, sessionId?, maxTurns? }\n * { type: \"permission_response\", sessionId, allow, updatedInput? }\n * { type: \"input_response\", sessionId, answer }\n * { type: \"abort\", sessionId }\n *\n * Outbound events (stdout, one JSON per line):\n * { type: \"ready\" }\n * { type: \"session_created\", sessionId }\n * { type: \"session_done\", sessionId }\n * All StreamEvent types with an added `sessionId` field\n */\nexport async function runHeadless(code: Agent, _config: MergedConfig): Promise<void> {\n await code.init();\n\n const sessions = new Map<string, SessionEntry>();\n\n emit({ type: \"ready\" });\n\n const rl = readline.createInterface({ input: process.stdin, terminal: false });\n\n for await (const line of rl) {\n if (!line.trim()) continue;\n\n let cmd: Record<string, unknown>;\n try {\n cmd = JSON.parse(line);\n } catch {\n emit({ type: \"error\", error: { message: \"Invalid JSON\", name: \"ParseError\" } });\n continue;\n }\n\n const cmdType = cmd.type as string;\n\n if (cmdType === \"prompt\") {\n const text = cmd.text as string;\n if (!text) {\n emit({ type: \"error\", error: { message: \"Missing required field: text\", name: \"ValidationError\" } });\n continue;\n }\n\n const sessionId = (cmd.sessionId as string) ?? randomUUID();\n const existing = sessions.get(sessionId);\n\n if (existing?.running) {\n emit({ type: \"error\", error: { message: \"Session is still running\", name: \"ConflictError\" }, sessionId });\n continue;\n }\n\n const abort = new AbortController();\n\n const permissionHandler = (req: import(\"../permissions/types.js\").PermissionRequest): Promise<PermissionResponse> => {\n const entry = sessions.get(sessionId);\n if (!entry) return Promise.reject(new Error(\"Session not found\"));\n return new Promise<PermissionResponse>((resolve, reject) => {\n entry.pendingPermission = { resolve, reject };\n });\n };\n\n const userInputHandler = (question: string): Promise<string> => {\n const entry = sessions.get(sessionId);\n if (!entry) return Promise.reject(new Error(\"Session not found\"));\n emit({ ...({} as Record<string, unknown>), type: \"user_input_request\", sessionId, question });\n return new Promise<string>((resolve, reject) => {\n entry.pendingInput = { resolve, reject };\n });\n };\n\n let thread: Thread;\n if (existing) {\n existing.abort = abort;\n existing.running = true;\n thread = existing.thread;\n } else {\n thread = await code.createThread({\n sessionId,\n permissionHandler,\n userInputHandler,\n });\n sessions.set(sessionId, {\n thread,\n abort,\n pendingPermission: null,\n pendingInput: null,\n running: true,\n });\n }\n\n emit({ type: \"session_created\", sessionId });\n\n const maxTurns = cmd.maxTurns as number | undefined;\n\n (async () => {\n try {\n for await (const event of thread.run(text, { signal: abort.signal, maxTurns })) {\n emit({ ...serializeEvent(event), sessionId });\n }\n } catch (err) {\n if ((err as Error).name !== \"AbortError\") {\n const e = err instanceof Error ? err : new Error(String(err));\n emit({ type: \"error\", error: { message: e.message, name: e.name }, sessionId });\n }\n } finally {\n sessions.delete(sessionId);\n emit({ type: \"session_done\", sessionId });\n }\n })();\n\n continue;\n }\n\n if (cmdType === \"permission_response\") {\n const sessionId = cmd.sessionId as string;\n const entry = sessions.get(sessionId);\n if (!entry?.pendingPermission) continue;\n const { sessionId: _sid, type: _type, ...response } = cmd;\n entry.pendingPermission.resolve(response as unknown as PermissionResponse);\n entry.pendingPermission = null;\n continue;\n }\n\n if (cmdType === \"input_response\") {\n const sessionId = cmd.sessionId as string;\n const entry = sessions.get(sessionId);\n if (!entry?.pendingInput) continue;\n entry.pendingInput.resolve((cmd.answer as string) ?? \"\");\n entry.pendingInput = null;\n continue;\n }\n\n if (cmdType === \"abort\") {\n const sessionId = cmd.sessionId as string;\n const entry = sessions.get(sessionId);\n if (entry) {\n entry.abort.abort();\n if (entry.pendingPermission) {\n entry.pendingPermission.reject(new Error(\"Session aborted\"));\n entry.pendingPermission = null;\n }\n if (entry.pendingInput) {\n entry.pendingInput.reject(new Error(\"Session aborted\"));\n entry.pendingInput = null;\n }\n }\n continue;\n }\n\n emit({ type: \"error\", error: { message: `Unknown command type: ${cmdType}`, name: \"ValidationError\" } });\n }\n\n await code.close();\n}\n"],"mappings":"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","names":[]}