@gaberrb/polypus 0.4.19 → 0.4.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/add-agent.ts","../src/core/config/schema.ts","../src/core/config/store.ts","../src/core/i18n/index.ts","../src/core/providers/defaults.ts","../src/cli/commands/remove-agent.ts","../src/cli/commands/list-agents.ts","../src/cli/commands/run.ts","../src/core/providers/anthropic.ts","../src/core/providers/openai-compatible.ts","../src/core/providers/registry.ts","../src/core/permissions/modes.ts","../src/core/permissions/allowlist.ts","../src/core/permissions/policy.ts","../src/core/permissions/diff.ts","../src/core/protocol/system-prompt.ts","../src/core/protocol/native.ts","../src/core/protocol/parser.ts","../src/core/protocol/emulated.ts","../src/core/tools/edit-file.ts","../src/core/tools/list-dir.ts","../src/core/tools/read-file.ts","../src/core/tools/run-command.ts","../src/core/tools/search-file.ts","../src/core/tools/types.ts","../src/core/tools/write-file.ts","../src/core/tools/registry.ts","../src/core/agent/correction.ts","../src/core/agent/project-context.ts","../src/core/agent/compaction.ts","../src/core/agent/hooks.ts","../src/core/agent/loop.ts","../src/core/context/mentions.ts","../src/core/agent/verify.ts","../src/core/agent/usage.ts","../src/core/providers/openrouter.ts","../src/core/agent/session-store.ts","../src/core/tools/custom.ts","../src/core/mcp/index.ts","../src/core/mcp/client.ts","../src/cli/commands/json-output.ts","../src/ui/repl.ts","../src/ui/wizard.ts","../src/core/providers/ollama.ts","../src/ui/banner.ts","../src/core/version.ts","../src/ui/line-reader.ts","../src/ui/paste.ts","../src/cli/commands/swarm.ts","../src/core/git/worktree.ts","../src/core/agent/worker.ts","../src/core/agent/orchestrator.ts","../src/core/agent/concurrency.ts","../src/ui/swarm-view.ts","../src/ui/cancel.ts","../src/ui/spinner.ts","../src/cli/commands/setup.ts","../src/cli/commands/init.ts","../src/core/scaffold/init.ts","../src/core/scaffold/templates.ts","../src/cli/commands/models.ts","../src/cli/commands/usage.ts","../src/cli/commands/sessions.ts","../src/cli/commands/estimate.ts","../src/core/agent/estimate.ts","../src/cli/commands/prd.ts","../src/core/agent/prd.ts","../src/core/agent/free-provider.ts","../src/cli/commands/cli-io.ts","../src/cli/commands/review.ts","../src/core/agent/review.ts","../src/core/config/dotenv.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { addAgent } from \"./commands/add-agent.js\";\nimport { removeAgent } from \"./commands/remove-agent.js\";\nimport { listAgents } from \"./commands/list-agents.js\";\nimport { run } from \"./commands/run.js\";\nimport { setup } from \"./commands/setup.js\";\nimport { init } from \"./commands/init.js\";\nimport { swarm } from \"./commands/swarm.js\";\nimport { models } from \"./commands/models.js\";\nimport { usage } from \"./commands/usage.js\";\nimport { sessions } from \"./commands/sessions.js\";\nimport { estimate } from \"./commands/estimate.js\";\nimport { prd } from \"./commands/prd.js\";\nimport { review } from \"./commands/review.js\";\nimport { join } from \"node:path\";\nimport { configDir, loadConfig } from \"../core/config/store.js\";\nimport { loadDotenv } from \"../core/config/dotenv.js\";\nimport { pickLocale, setLocale, t } from \"../core/i18n/index.js\";\nimport { banner } from \"../ui/banner.js\";\nimport { VERSION } from \"../core/version.js\";\n\n/** Entry point for bare `polypus`: onboard on first run, then start interactive mode. */\nasync function launchInteractive(): Promise<void> {\n const config = await loadConfig();\n if (config.agents.length === 0) {\n console.log(banner());\n console.log(\" \" + pc.yellow(t(\"welcome.firstRun\")) + \"\\n\");\n await setup();\n }\n await run(undefined, {});\n}\n\n/** Read --lang from argv before commander parses, so help text is localized too. */\nfunction flagLocale(argv: string[]): string | undefined {\n const i = argv.indexOf(\"--lang\");\n if (i !== -1 && argv[i + 1]) return argv[i + 1];\n const eq = argv.find((a) => a.startsWith(\"--lang=\"));\n return eq?.split(\"=\")[1];\n}\n\nasync function resolveLocale(): Promise<void> {\n let configLocale: string | undefined;\n try {\n configLocale = (await loadConfig()).locale;\n } catch {\n /* ignore invalid/missing config for locale purposes */\n }\n setLocale(pickLocale({ flag: flagLocale(process.argv), config: configLocale }));\n}\n\nfunction buildProgram(): Command {\n const program = new Command();\n\n program\n .name(\"polypus\")\n .description(t(\"cli.description\"))\n .version(VERSION)\n .option(\"--lang <locale>\", t(\"cli.opt.lang\"))\n // No subcommand → launch the interactive experience (Claude/Devin-style).\n .action(() => launchInteractive());\n\n program\n .command(\"setup\")\n .description(t(\"cli.cmd.setup\"))\n .action(() => setup());\n\n program\n .command(\"init\")\n .option(\"--force\", t(\"cli.opt.force\"))\n .description(t(\"cli.cmd.init\"))\n .action((opts) => init(opts));\n\n program\n .command(\"add-agent\")\n .argument(\"<name>\", t(\"cli.arg.addAgentName\"))\n .requiredOption(\"--provider <provider>\", t(\"cli.opt.provider\"))\n .requiredOption(\"--model <model>\", t(\"cli.opt.model\"))\n .option(\"--api-key <key>\", t(\"cli.opt.apiKey\"))\n .option(\"--base-url <url>\", t(\"cli.opt.baseUrl\"))\n .option(\"--tool-mode <mode>\", t(\"cli.opt.toolMode\"), \"auto\")\n .option(\"--set-default\", t(\"cli.opt.setDefault\"))\n .description(t(\"cli.cmd.addAgent\"))\n .action((name, opts) => addAgent(name, opts));\n\n program\n .command(\"remove-agent\")\n .argument(\"<name>\", t(\"cli.arg.removeAgentName\"))\n .description(t(\"cli.cmd.removeAgent\"))\n .action((name) => removeAgent(name));\n\n program\n .command(\"list-agents\")\n .alias(\"agents\")\n .description(t(\"cli.cmd.listAgents\"))\n .action(() => listAgents());\n\n program\n .command(\"run\")\n .argument(\"[task]\", t(\"cli.arg.runTask\"))\n .option(\"--agent <name>\", t(\"cli.opt.agent\"))\n .option(\"--mode <mode>\", t(\"cli.opt.mode\"))\n .option(\"--max-steps <n>\", t(\"cli.opt.maxSteps\"))\n .option(\"--json\", t(\"cli.opt.json\"))\n .option(\"--verify\", t(\"cli.opt.verify\"))\n .option(\"--budget <usd>\", t(\"cli.opt.budget\"))\n .option(\"--continue\", t(\"cli.opt.continue\"))\n .option(\"--resume <id>\", t(\"cli.opt.resume\"))\n .description(t(\"cli.cmd.run\"))\n .action((task, opts) => run(task, opts));\n\n program\n .command(\"swarm\")\n .argument(\"<task>\", t(\"cli.arg.swarmTask\"))\n .option(\"--agents <names>\", t(\"cli.opt.agents\"))\n .option(\"--max-subtasks <n>\", t(\"cli.opt.maxSubtasks\"))\n .description(t(\"cli.cmd.swarm\"))\n .action((task, opts) => swarm(task, opts));\n\n program\n .command(\"models\")\n .option(\"--search <text>\", t(\"cli.opt.search\"))\n .option(\"--tools\", t(\"cli.opt.toolsOnly\"))\n .option(\"--free\", t(\"cli.opt.free\"))\n .option(\"--max-price <usd>\", t(\"cli.opt.maxPrice\"))\n .option(\"--sort <order>\", t(\"cli.opt.sort\"))\n .option(\"--limit <n>\", t(\"cli.opt.limit\"))\n .description(t(\"cli.cmd.models\"))\n .action((opts) => models(opts));\n\n program\n .command(\"usage\")\n .description(t(\"cli.cmd.usage\"))\n .action(() => usage());\n\n program\n .command(\"estimate\")\n .argument(\"<task>\", t(\"cli.arg.estimateTask\"))\n .option(\"--agent <name>\", t(\"cli.opt.agent\"))\n .option(\"--json\", t(\"cli.opt.json\"))\n .description(t(\"cli.cmd.estimate\"))\n .action((task, opts) => estimate(task, opts));\n\n program\n .command(\"sessions\")\n .description(t(\"cli.cmd.sessions\"))\n .action(() => sessions());\n\n program\n .command(\"prd\")\n .argument(\"<issue>\", t(\"cli.arg.prdIssue\"))\n .option(\"--out <file>\", t(\"cli.opt.out\"))\n .option(\"--model <model>\", t(\"cli.opt.model\"))\n .option(\"--input <file>\", t(\"cli.opt.input\"))\n .description(t(\"cli.cmd.prd\"))\n .action((issue, opts) => prd(issue, opts));\n\n program\n .command(\"review\")\n .argument(\"<pr>\", t(\"cli.arg.reviewPr\"))\n .option(\"--out <file>\", t(\"cli.opt.out\"))\n .option(\"--model <model>\", t(\"cli.opt.model\"))\n .option(\"--input <file>\", t(\"cli.opt.input\"))\n .description(t(\"cli.cmd.review\"))\n .action((pr, opts) => review(pr, opts));\n\n return program;\n}\n\nasync function main() {\n try {\n // Pick up secrets from ~/.polypus/.env and ./.env (does not override real env).\n loadDotenv([join(configDir(), \".env\"), join(process.cwd(), \".env\")]);\n await resolveLocale();\n await buildProgram().parseAsync(process.argv);\n } catch (err) {\n console.error(pc.red(`✗ ${(err as Error).message}`));\n process.exitCode = 1;\n }\n}\n\nvoid main();\n","import pc from \"picocolors\";\nimport { AgentConfig, ProviderKind, ToolMode } from \"../../core/config/schema.js\";\nimport { findAgent, loadConfig, saveConfig } from \"../../core/config/store.js\";\nimport { DEFAULT_BASE_URL, REQUIRES_API_KEY } from \"../../core/providers/defaults.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\nexport interface AddAgentOptions {\n provider: string;\n model: string;\n apiKey?: string;\n baseUrl?: string;\n toolMode?: string;\n setDefault?: boolean;\n}\n\n/** `polypus add-agent <name> --provider <p> --model <m> [--api-key ...] [--base-url ...]` */\nexport async function addAgent(name: string, opts: AddAgentOptions): Promise<void> {\n const config = await loadConfig();\n\n if (findAgent(config, name)) {\n throw new Error(t(\"agent.exists\", { name }));\n }\n\n const provider = ProviderKind.parse(opts.provider);\n const baseUrl = opts.baseUrl ?? DEFAULT_BASE_URL[provider];\n if (!baseUrl) {\n throw new Error(t(\"agent.needBaseUrl\", { provider }));\n }\n if (REQUIRES_API_KEY[provider] && !opts.apiKey) {\n throw new Error(t(\"agent.needApiKey\", { provider }));\n }\n\n const agent = AgentConfig.parse({\n name,\n provider,\n model: opts.model,\n apiKey: opts.apiKey,\n baseUrl,\n toolMode: ToolMode.parse(opts.toolMode ?? \"auto\"),\n });\n\n config.agents.push(agent);\n if (opts.setDefault || config.agents.length === 1) {\n config.defaultAgent = name;\n }\n await saveConfig(config);\n\n console.log(\n pc.green(t(\"agent.added\", { name: pc.bold(name) })) +\n ` (${provider} · ${opts.model})` +\n (config.defaultAgent === name ? pc.dim(` [${t(\"common.default\")}]`) : \"\"),\n );\n}\n","import { z } from \"zod\";\n\n/** Built-in provider kinds. Everything except `anthropic` is OpenAI-compatible. */\nexport const ProviderKind = z.enum([\n \"openrouter\",\n \"ollama\",\n \"openai-compatible\",\n \"anthropic\",\n]);\nexport type ProviderKind = z.infer<typeof ProviderKind>;\n\n/**\n * How the harness should drive tool-calling for an agent.\n * - `auto`: probe the provider/model and decide (native if available, else emulated).\n * - `native`: use the provider's function-calling API.\n * - `emulated`: inject the XML tool protocol into the prompt and parse the text output.\n */\nexport const ToolMode = z.enum([\"auto\", \"native\", \"emulated\"]);\nexport type ToolMode = z.infer<typeof ToolMode>;\n\nexport const PermissionMode = z.enum([\"plan\", \"review\", \"bypass\"]);\nexport type PermissionMode = z.infer<typeof PermissionMode>;\n\nexport const AgentConfig = z.object({\n /** Unique, human-friendly identifier used by add-agent/remove-agent and orchestration. */\n name: z.string().min(1),\n provider: ProviderKind,\n /** Override the provider's default base URL (required for `openai-compatible`). */\n baseUrl: z.string().url().optional(),\n model: z.string().min(1),\n /**\n * API key. Prefer an env reference like \"${OPENROUTER_API_KEY}\" over an inline secret.\n * Optional because local providers (Ollama) do not need one.\n */\n apiKey: z.string().optional(),\n toolMode: ToolMode.default(\"auto\"),\n});\nexport type AgentConfig = z.infer<typeof AgentConfig>;\n\nexport const Permissions = z.object({\n mode: PermissionMode.default(\"review\"),\n /** Glob patterns of paths the agent may read/write, relative to the workspace root. */\n allow: z.array(z.string()).default([\"**/*\"]),\n /** Glob patterns that are always denied, even if they match `allow`. */\n deny: z.array(z.string()).default([\".git/**\", \".polypus/**\", \"**/.env\"]),\n /** Shell commands (matched by prefix) the agent may run without per-call escalation. */\n allowedCommands: z.array(z.string()).default([]),\n});\nexport type Permissions = z.infer<typeof Permissions>;\n\nexport const Locale = z.enum([\"pt-BR\", \"en\"]);\nexport type Locale = z.infer<typeof Locale>;\n\nexport const PolypusConfig = z.object({\n version: z.literal(1).default(1),\n /** Interface language. Defaults to pt-BR. */\n locale: Locale.default(\"pt-BR\"),\n defaultAgent: z.string().optional(),\n agents: z.array(AgentConfig).default([]),\n permissions: Permissions.default({}),\n});\nexport type PolypusConfig = z.infer<typeof PolypusConfig>;\n\nexport const DEFAULT_CONFIG: PolypusConfig = PolypusConfig.parse({});\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n AgentConfig,\n DEFAULT_CONFIG,\n PolypusConfig,\n} from \"./schema.js\";\nimport { t } from \"../i18n/index.js\";\n\n/** Directory where Polypus keeps its config. Override with POLYPUS_HOME. */\nexport function configDir(): string {\n return process.env.POLYPUS_HOME ?? join(homedir(), \".polypus\");\n}\n\nexport function configPath(): string {\n return join(configDir(), \"config.json\");\n}\n\n/** Load config from disk, falling back to defaults if it does not exist yet. */\nexport async function loadConfig(): Promise<PolypusConfig> {\n const path = configPath();\n if (!existsSync(path)) return structuredClone(DEFAULT_CONFIG);\n let raw: unknown;\n try {\n raw = JSON.parse(await readFile(path, \"utf8\"));\n } catch (err) {\n throw new Error(\n `Failed to parse config at ${path}: ${(err as Error).message}`,\n );\n }\n const parsed = PolypusConfig.safeParse(raw);\n if (!parsed.success) {\n throw new Error(\n `Invalid config at ${path}:\\n${parsed.error.issues\n .map((i) => ` - ${i.path.join(\".\") || \"<root>\"}: ${i.message}`)\n .join(\"\\n\")}`,\n );\n }\n return parsed.data;\n}\n\n/** Persist config to disk (pretty-printed), creating the directory if needed. */\nexport async function saveConfig(config: PolypusConfig): Promise<void> {\n await mkdir(configDir(), { recursive: true });\n const validated = PolypusConfig.parse(config);\n await writeFile(configPath(), JSON.stringify(validated, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport function findAgent(\n config: PolypusConfig,\n name: string,\n): AgentConfig | undefined {\n return config.agents.find((a) => a.name === name);\n}\n\n/**\n * Resolve the agent to use: explicit name → default → the only agent.\n * Throws a helpful error otherwise.\n */\nexport function resolveAgent(\n config: PolypusConfig,\n name?: string,\n): AgentConfig {\n if (name) {\n const agent = findAgent(config, name);\n if (!agent) {\n throw new Error(\n t(\"agent.noneKnown\", {\n name,\n names: config.agents.map((a) => a.name).join(\", \") || \"(none)\",\n }),\n );\n }\n return agent;\n }\n if (config.defaultAgent) {\n const agent = findAgent(config, config.defaultAgent);\n if (agent) return agent;\n }\n if (config.agents.length === 1) return config.agents[0]!;\n if (config.agents.length === 0) {\n throw new Error(t(\"agent.noneConfigured\"));\n }\n throw new Error(\n t(\"agent.multipleNoDefault\", { names: config.agents.map((a) => a.name).join(\", \") }),\n );\n}\n\n/**\n * Resolve a configured secret value. Supports \"${ENV_VAR}\" references so that\n * keys are not stored inline. Returns undefined when nothing is configured.\n */\nexport function resolveSecret(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const match = /^\\$\\{([A-Z0-9_]+)\\}$/i.exec(value.trim());\n if (match) {\n const env = process.env[match[1]!];\n if (!env) {\n throw new Error(\n `Config references env var ${match[1]} but it is not set in the environment.`,\n );\n }\n return env;\n }\n return value;\n}\n","/** Minimal zero-dependency i18n. Default locale is pt-BR; English is available. */\n\nexport const LOCALES = [\"pt-BR\", \"en\"] as const;\nexport type Locale = (typeof LOCALES)[number];\nexport const DEFAULT_LOCALE: Locale = \"pt-BR\";\n\n/** Human-readable names used by the agent prompt and the wizard. */\nexport const LOCALE_NAMES: Record<Locale, string> = {\n \"pt-BR\": \"Português (Brasil)\",\n en: \"English\",\n};\n\ntype Catalog = Record<string, string>;\n\nconst en: Catalog = {\n // generic\n \"common.default\": \"default\",\n \"common.keySet\": \"key set\",\n \"common.noKey\": \"no key\",\n\n // cli descriptions\n \"cli.description\":\n \"Agentic coding harness that makes any AI API generate and apply code — OpenRouter, Ollama, and any OpenAI-compatible endpoint.\",\n \"cli.opt.lang\": \"interface language: pt-BR | en\",\n \"cli.cmd.setup\": \"Interactive setup wizard (configure agents, keys, permissions)\",\n \"cli.cmd.init\": \"Scaffold a .poly/ workspace (agents.md, skills, SDD spec template, README)\",\n \"cli.opt.force\": \"overwrite files that already exist\",\n \"cli.cmd.addAgent\": \"Register a new agent (API key + model)\",\n \"cli.cmd.removeAgent\": \"Remove a configured agent\",\n \"cli.cmd.listAgents\": \"List configured agents\",\n \"cli.cmd.run\": \"Run a coding task with an agent\",\n \"cli.cmd.swarm\":\n \"Split a task across multiple agents working in parallel git worktrees (requires 3+ configured agents)\",\n \"cli.cmd.models\": \"Browse OpenRouter models (price, context, tool support)\",\n \"cli.cmd.prd\": \"Generate a PRD from a GitHub issue (uses a free OpenRouter model)\",\n \"cli.arg.prdIssue\": \"issue number to turn into a PRD\",\n \"cli.cmd.review\": \"Review a pull request diff (uses a free OpenRouter model)\",\n \"cli.arg.reviewPr\": \"pull request number to review\",\n \"cli.opt.out\": \"write output to this file instead of stdout\",\n \"cli.opt.input\": 'read input from a file (or \"-\" for stdin) instead of calling gh',\n \"prd.wrote\": \"✓ PRD written to {path}\",\n \"review.wrote\": \"✓ Review written to {path}\",\n \"cli.invalidRef\": \"Invalid number '{ref}': expected a numeric issue/PR number.\",\n \"cli.stdinTty\": \"--input - expects piped stdin, but none was provided.\",\n \"cli.opt.search\": \"filter by id/name substring\",\n \"cli.opt.toolsOnly\": \"only models that support tool-calling\",\n \"cli.opt.free\": \"only free models\",\n \"cli.opt.maxPrice\": \"max prompt price (USD per 1M tokens)\",\n \"cli.opt.sort\": \"price | price-desc | context | name\",\n \"cli.opt.limit\": \"max rows to show\",\n \"cli.arg.addAgentName\": \"unique name for the agent\",\n \"cli.opt.provider\": \"openrouter | ollama | openai-compatible | anthropic\",\n \"cli.opt.model\": \"model id, e.g. anthropic/claude-3.5-sonnet or llama3.1\",\n \"cli.opt.apiKey\": 'API key or env reference like \"${OPENROUTER_API_KEY}\"',\n \"cli.opt.baseUrl\": \"override the provider base URL\",\n \"cli.opt.toolMode\": \"auto | native | emulated\",\n \"cli.opt.setDefault\": \"make this the default agent\",\n \"cli.arg.removeAgentName\": \"name of the agent to remove\",\n \"cli.arg.runTask\": \"task for the agent; omit to start an interactive session\",\n \"cli.opt.agent\": \"which configured agent to use\",\n \"cli.opt.mode\": \"plan | review | bypass (overrides config)\",\n \"cli.opt.maxSteps\": \"maximum agent steps\",\n \"cli.opt.json\": \"headless mode: emit a single JSON object (steps, tool calls, files changed, usage) instead of the TUI — use with --mode bypass\",\n \"cli.opt.verify\": \"after the agent finishes, run project checks (typecheck/build/test) and iterate until they pass\",\n \"cli.opt.budget\": \"stop the run when the estimated session cost reaches this USD amount (OpenRouter pricing)\",\n \"cli.cmd.usage\": \"Show token/cost analytics aggregated per day\",\n \"cli.cmd.estimate\": \"Estimate the effort/cost to implement a task (no changes made)\",\n \"cli.arg.estimateTask\": \"task to estimate\",\n \"cli.cmd.sessions\": \"List saved sessions that can be resumed\",\n \"cli.opt.continue\": \"resume the most recent saved session\",\n \"cli.opt.resume\": \"resume a specific saved session by id\",\n \"cli.arg.swarmTask\": \"high-level task to split across agents\",\n \"cli.opt.agents\": \"comma-separated agent names (default: all configured)\",\n \"cli.opt.maxSubtasks\": \"maximum number of parallel subtasks\",\n\n // agents\n \"agent.exists\": 'An agent named \"{name}\" already exists. Use remove-agent first to replace it.',\n \"agent.needBaseUrl\": 'Provider \"{provider}\" requires --base-url.',\n \"agent.needApiKey\":\n 'Provider \"{provider}\" requires an API key. Pass --api-key \"${ENV_VAR}\" (recommended) or a literal value.',\n \"agent.added\": \"✓ Added agent {name}\",\n \"agent.removed\": \"✓ Removed agent {name}\",\n \"agent.notFound\": 'No agent named \"{name}\".',\n \"agent.none\": \"No agents configured. Run `polypus setup` or `polypus add-agent`.\",\n \"agent.listHeader\": \"Agents:\",\n \"agent.permLine\": \"Permissions: mode={mode}, allow=[{allow}]\",\n \"agent.noneKnown\": 'No agent named \"{name}\". Known agents: {names}',\n \"agent.needAnthropicKey\": 'Agent \"{name}\" (anthropic) requires an API key.',\n \"agent.noBaseUrl\": 'Agent \"{name}\" has no base URL configured.',\n \"agent.noneConfigured\": \"No agents configured. Run `polypus setup` or `polypus add-agent` first.\",\n \"agent.multipleNoDefault\":\n \"Multiple agents configured but no default set. Pass --agent <name> or set a default. Agents: {names}\",\n\n // run / loop\n \"run.status\":\n \"agent={name} provider={provider} model={model} tool-mode={toolMode} permission-mode={mode}\",\n \"run.done\": \"✓ Done ({steps} steps).\",\n \"run.stopped\":\n \"⚠ Stopped after {steps} steps without a finish signal. You can continue with another instruction.\",\n \"run.confirm\": \"Allow {summary}?\",\n \"run.reprompt\": \"↻ no tool call — reinforcing instructions (attempt {attempt})\",\n \"run.autocorrect\": \"↻ tool failed — auto-correcting with extra context\",\n \"run.cancelled\": \"■ cancelled\",\n \"compaction.done\": \"context compacted: ~{before} → ~{after} tokens\",\n \"tools.customLoaded\": \"loaded custom tool(s): {names}\",\n \"mcp.connected\": \"connected MCP server(s): {servers} ({n} tool(s))\",\n \"run.jsonNeedsTask\": \"--json requires a task argument (headless mode has no interactive REPL).\",\n \"review.approveAll\": \"approve all\",\n \"review.reject\": \"reject\",\n \"review.pickHunks\": \"pick hunks…\",\n \"review.selectHunks\": \"Select the hunks to apply (space to toggle, enter to confirm)\",\n \"verify.running\": \"verifying (running project checks)\",\n \"verify.noChecks\": \"no verification checks detected (no package.json scripts) — skipping\",\n \"verify.passed\": \"verification passed\",\n \"verify.failed\": \"{n} check(s) failed — handing the output back to the agent (attempt {attempt})\",\n \"verify.giveUp\": \"{n} check(s) still failing after the retry budget — stopping\",\n \"budget.session\": \"session spend: {spent} / budget {budget}\",\n \"budget.hit\": \"■ stopped: estimated cost reached the budget of {budget}\",\n\n // usage analytics\n \"usage.header\": \"Usage (tokens / estimated cost) per day:\",\n \"usage.empty\": \"No usage recorded yet. Run a task to start tracking.\",\n \"usage.total\": \"total\",\n \"usage.runs\": \"runs\",\n\n // estimate\n \"estimate.header\": \"Effort estimate:\",\n \"estimate.complexity\": \"complexity\",\n \"estimate.steps\": \"steps\",\n \"estimate.tokens\": \"tokens\",\n \"estimate.cost\": \"estimated cost\",\n\n // sessions\n \"sessions.header\": \"Saved sessions (most recent first):\",\n \"sessions.empty\": \"No saved sessions yet.\",\n \"sessions.hint\": \"Resume with `polypus run --continue` or `polypus run --resume <id>`.\",\n \"sessions.notFound\": 'No saved session with id \"{id}\".',\n \"sessions.noneToContinue\": \"No previous session to continue — starting fresh.\",\n \"sessions.resumed\": \"↺ resumed session {id} ({n} messages)\",\n\n // repl\n \"repl.welcome\": \"Polypus interactive session.\",\n \"repl.welcomeHint\": \" Type /help for commands, /exit to quit.\",\n \"repl.modeChanged\": \"mode → {mode}\",\n \"repl.allowAdded\": \"allow-list += {glob}\",\n \"repl.allowShow\": \"mode={mode} allow=[{allow}]\",\n \"repl.historyCleared\": \"history cleared\",\n \"repl.unknown\": \"Unknown command /{cmd}. Type /help.\",\n \"repl.pasted\": \"[Pasted text #{id} +{lines} lines]\",\n \"repl.agentSwitched\": \"active agent → {name}\",\n \"repl.switchedTo\": \"active agent is now {name}\",\n \"repl.noAgentsLeft\": \"No agents left. Use /add to create one.\",\n \"repl.needName\": \"Usage: {usage}\",\n \"repl.help\": [\n \"Slash commands:\",\n \" /agents list configured agents\",\n \" /agent <name> switch the active agent\",\n \" /add add a new agent (wizard)\",\n \" /remove <name> remove an agent\",\n \" /plan switch to plan mode (read-only)\",\n \" /review switch to review mode (confirm each action)\",\n \" /bypass switch to bypass mode (auto-approve)\",\n \" /swarm <task> run a task as a parallel swarm (needs 3+ agents)\",\n \" /allow <glob> add a path glob to the allow-list\",\n \" /allow show the current allow-list and mode\",\n \" /reset clear the conversation history\",\n \" /sessions list saved sessions you can resume\",\n \" /resume <id> resume a saved session\",\n \" /help show this help\",\n \" /exit quit\",\n \"Anything else is sent to the agent as a task.\",\n ].join(\"\\n\"),\n\n // swarm\n \"swarm.noAgents\": \"No agents configured. Run `polypus setup` or `polypus add-agent` first.\",\n \"swarm.needsAgents\":\n \"Swarm mode needs at least {min} configured agents (you have {have}). Add more with `polypus add-agent`, or use `polypus run` for a single agent.\",\n \"swarm.status\": \"swarm agents=[{agents}] workspace={workspace}\",\n \"swarm.bypassNote\":\n \"Workers run in bypass mode inside isolated git worktrees; branches are merged at the end.\",\n \"swarm.cancelling\": \"cancelling swarm — finishing in-flight workers, then merging what committed…\",\n \"swarm.decomposed\": \"Decomposed into {n} subtask(s):\",\n \"swarm.workerStart\": \"▶ {id} started by {agent}\",\n \"swarm.workerDone\": \"✓ {id} done\",\n \"swarm.workerStopped\": \"… {id} stopped\",\n \"swarm.workerMeta\": \" ({steps} steps, {changes})\",\n \"swarm.changesCommitted\": \"changes committed\",\n \"swarm.noChanges\": \"no changes\",\n \"swarm.merged\": \" merged {branch}\",\n \"swarm.mergeConflict\": \" conflict merging {branch}\",\n \"swarm.summary\": \"Summary:\",\n \"swarm.allMerged\": \"✓ All committed branches merged cleanly.\",\n \"swarm.view.header\": \"Swarm · orchestrator [{lead}]\",\n \"swarm.view.decomposing\": \"splitting the task…\",\n \"swarm.view.pending\": \"queued\",\n \"swarm.view.running\": \"running\",\n \"swarm.view.done\": \"done\",\n \"swarm.view.stopped\": \"stopped\",\n \"swarm.view.conflict\": \"conflict\",\n \"swarm.view.step\": \"step {n}\",\n \"swarm.view.steps\": \"{n} steps\",\n \"swarm.conflictsHeader\": \"⚠ {n} branch(es) had merge conflicts (kept for inspection):\",\n \"swarm.statusDone\": \"done\",\n \"swarm.statusIncomplete\": \"incomplete\",\n \"swarm.timeout\": \"⚠ Session timeout reached. Operation aborted.\",\n\n // init\n \"init.created\": \"✓ .poly scaffolded:\",\n \"init.skipped\": \"Kept (already existed):\",\n \"init.allExist\": \"Nothing to do — .poly already has these files:\",\n \"init.forceHint\": \"Run `polypus init --force` to overwrite them.\",\n \"init.tip\": \"Tip: edit .poly/agents.md — Polypus loads it into the agent's context automatically.\",\n\n // wizard\n \"wizard.title\": \" polypus setup \",\n \"wizard.intro\": [\n \"Polypus drives any AI API to read and write code in this kind of project.\",\n \"You can add several agents (different keys/models) and they can work in parallel.\",\n \"Tip: reference API keys via environment variables instead of pasting them here.\",\n ].join(\"\\n\"),\n \"wizard.welcome\": \"Welcome\",\n \"wizard.cancelled\": \"Setup cancelled.\",\n \"wizard.language\": \"Interface language\",\n \"wizard.addAnother\": \"Add another agent?\",\n \"wizard.defaultAgent\": \"Default agent\",\n \"wizard.permMode\": \"Default permission mode\",\n \"wizard.permReview\": \"review — confirm each file write / command (safe default)\",\n \"wizard.permPlan\": \"plan — read-only, propose changes\",\n \"wizard.permBypass\": \"bypass — auto-approve everything (use with care)\",\n \"wizard.allowPaths\": \"Editable paths (comma-separated globs)\",\n \"wizard.saved\": \"Saved {n} agent(s) to {path}\",\n \"wizard.next\": 'Run `polypus run \"your task\"` to start, or `polypus run` for an interactive session.',\n \"wizard.provider\": \"Provider\",\n \"wizard.providerOpenrouter\": \"OpenRouter (hosted, many models)\",\n \"wizard.providerOllama\": \"Ollama (local models)\",\n \"wizard.providerCompatible\": \"OpenAI-compatible (custom base URL)\",\n \"wizard.providerAnthropic\": \"Anthropic (Claude)\",\n \"wizard.agentName\": \"Agent name\",\n \"wizard.required\": \"Required\",\n \"wizard.nameTaken\": \"An agent with this name already exists\",\n \"wizard.modelId\": \"Model id\",\n \"wizard.ollamaDetecting\": \"Detecting models on your local Ollama…\",\n \"wizard.ollamaFound\": \"Found {n} local Ollama model(s)\",\n \"wizard.ollamaNone\": \"Ollama not reachable — type the model id manually\",\n \"wizard.ollamaPick\": \"Model (detected on your Ollama)\",\n \"wizard.ollamaOther\": \"Other (type it manually)\",\n \"wizard.orError\": \"Could not reach OpenRouter — type the model id manually\",\n \"wizard.orSearch\": \"Search by id/name (optional)\",\n \"wizard.orFilters\": \"Filters (space to toggle, enter to confirm)\",\n \"wizard.orToolsOnly\": \"Only models with native tools\",\n \"wizard.orFreeOnly\": \"Only free models\",\n \"wizard.orSort\": \"Sort by\",\n \"wizard.orSortPrice\": \"price — cheapest first\",\n \"wizard.orSortPriceDesc\": \"price — most expensive first\",\n \"wizard.orSortContext\": \"context length\",\n \"wizard.orSortName\": \"name\",\n \"wizard.orPick\": \"Pick a model ({n} matches)\",\n \"wizard.orRefilter\": \"↻ change filters\",\n \"wizard.orManual\": \"✎ type the model id manually\",\n \"wizard.orNone\": \"No models match — adjust the filters\",\n \"wizard.baseUrl\": \"Base URL\",\n \"wizard.baseUrlRequired\": \"Required for openai-compatible\",\n \"wizard.toolMode\": \"Tool-calling mode\",\n \"wizard.toolAuto\": \"auto — native for hosted, emulated for local (recommended)\",\n \"wizard.toolNative\": \"native — provider function-calling\",\n \"wizard.toolEmulated\": \"emulated — XML tool protocol in the prompt (works without tool support)\",\n \"wizard.keyNotNeeded\": \"{provider} usually needs no API key. Add one anyway?\",\n \"wizard.apiKey\": \"API key\",\n \"wizard.keyEnv\": \"Reference an environment variable (recommended)\",\n \"wizard.keyInline\": \"Enter it now (stored in the config file)\",\n \"wizard.keySkip\": \"Skip for now\",\n \"wizard.envName\": \"Environment variable name\",\n \"wizard.envInvalid\": \"Use letters, digits, underscores\",\n \"wizard.keyPrompt\": \"API key (stored in plain text in the config file)\",\n\n // models browser\n \"models.fetching\": \"Fetching OpenRouter models…\",\n \"models.fetchError\": \"Could not fetch models: {msg}\",\n \"models.none\": \"No models match the filters.\",\n \"models.shown\": \"Showing {shown} of {total} models\",\n \"models.legend\": \"🛠 = native tools · prices = USD per 1M tokens (in/out)\",\n \"models.colTools\": \"TOOLS\",\n \"models.colPrice\": \"PRICE in/out\",\n \"models.colCtx\": \"CONTEXT\",\n \"models.colModel\": \"MODEL\",\n\n // live status\n \"ui.thinking\": \"thinking\",\n \"ui.running\": \"running {tool}\",\n \"ui.tokens\": \"{total} tokens (in {in} / out {out})\",\n \"ui.tokensShort\": \"{total} tok\",\n\n // welcome / interactive UI\n \"welcome.tagline\": \"agentic harness — make any AI write code\",\n \"welcome.agent\": \"agent\",\n \"welcome.model\": \"model\",\n \"welcome.mode\": \"mode\",\n \"welcome.workspace\": \"folder\",\n \"welcome.hints\": \"Type your task and press Enter · ESC cancels · /help · /exit\",\n \"welcome.firstRun\": \"No agents configured yet — let's set you up.\",\n\n // agent system prompt\n \"prompt.language\": \"Communicate with the user in {language}.\",\n \"prompt.projectInstructions\":\n \"Project-specific operating instructions follow, loaded from `.poly/agents.md`. Treat them as authoritative for how to work in THIS repo. Paths they reference (e.g. skills/*.md, ../context.md, ../rules.md) are relative to the `.poly/` directory — read those files when relevant before acting:\",\n\n // @-mentions\n \"mentions.injectedHeader\": \"Referenced files (@-mentions)\",\n \"mentions.dirHeader\": \"@{path} (directory listing)\",\n \"mentions.notFound\": \"(could not resolve @{path}: not found or outside the allow-list)\",\n\n // safety policy\n \"policy.blockedCommand\": \"blocked by safety policy ({reason}) — refusing in all modes\",\n \"policy.secretFound\":\n \"write blocked: a possible secret ({kind}) was found on line {line}. Remove it or load it from an environment variable instead of hard-coding it.\",\n};\n\nconst ptBR: Catalog = {\n \"common.default\": \"padrão\",\n \"common.keySet\": \"com chave\",\n \"common.noKey\": \"sem chave\",\n\n \"cli.description\":\n \"Harness agêntico que faz qualquer API de IA gerar e aplicar código — OpenRouter, Ollama e qualquer endpoint compatível com OpenAI.\",\n \"cli.opt.lang\": \"idioma da interface: pt-BR | en\",\n \"cli.cmd.setup\": \"Assistente de configuração interativo (agentes, chaves, permissões)\",\n \"cli.cmd.init\": \"Cria um workspace .poly/ (agents.md, skills, template de spec SDD, README)\",\n \"cli.opt.force\": \"sobrescreve arquivos que já existem\",\n \"cli.cmd.addAgent\": \"Cadastra um novo agente (chave de API + modelo)\",\n \"cli.cmd.removeAgent\": \"Remove um agente configurado\",\n \"cli.cmd.listAgents\": \"Lista os agentes configurados\",\n \"cli.cmd.run\": \"Executa uma tarefa de código com um agente\",\n \"cli.cmd.swarm\":\n \"Divide uma tarefa entre vários agentes em git worktrees paralelas (requer 3+ agentes configurados)\",\n \"cli.cmd.models\": \"Explora os modelos do OpenRouter (preço, contexto, suporte a tools)\",\n \"cli.cmd.prd\": \"Gera um PRD a partir de uma issue do GitHub (usa um modelo gratuito do OpenRouter)\",\n \"cli.arg.prdIssue\": \"número da issue para transformar em PRD\",\n \"cli.cmd.review\": \"Revisa o diff de um pull request (usa um modelo gratuito do OpenRouter)\",\n \"cli.arg.reviewPr\": \"número do pull request a revisar\",\n \"cli.opt.out\": \"grava a saída neste arquivo em vez do stdout\",\n \"cli.opt.input\": 'lê a entrada de um arquivo (ou \"-\" para stdin) em vez de chamar o gh',\n \"prd.wrote\": \"✓ PRD gravado em {path}\",\n \"review.wrote\": \"✓ Review gravado em {path}\",\n \"cli.invalidRef\": \"Número inválido '{ref}': esperado um número de issue/PR.\",\n \"cli.stdinTty\": \"--input - espera entrada via pipe (stdin), mas nenhuma foi fornecida.\",\n \"cli.opt.search\": \"filtra por trecho do id/nome\",\n \"cli.opt.toolsOnly\": \"apenas modelos com suporte a tool-calling\",\n \"cli.opt.free\": \"apenas modelos gratuitos\",\n \"cli.opt.maxPrice\": \"preço máximo de entrada (USD por 1M tokens)\",\n \"cli.opt.sort\": \"price | price-desc | context | name\",\n \"cli.opt.limit\": \"máximo de linhas a exibir\",\n \"cli.arg.addAgentName\": \"nome único para o agente\",\n \"cli.opt.provider\": \"openrouter | ollama | openai-compatible | anthropic\",\n \"cli.opt.model\": \"id do modelo, ex.: anthropic/claude-3.5-sonnet ou llama3.1\",\n \"cli.opt.apiKey\": 'chave de API ou referência de env como \"${OPENROUTER_API_KEY}\"',\n \"cli.opt.baseUrl\": \"sobrescreve a URL base do provider\",\n \"cli.opt.toolMode\": \"auto | native | emulated\",\n \"cli.opt.setDefault\": \"define como agente padrão\",\n \"cli.arg.removeAgentName\": \"nome do agente a remover\",\n \"cli.arg.runTask\": \"tarefa para o agente; omita para iniciar uma sessão interativa\",\n \"cli.opt.agent\": \"qual agente configurado usar\",\n \"cli.opt.mode\": \"plan | review | bypass (sobrescreve a config)\",\n \"cli.opt.maxSteps\": \"número máximo de passos do agente\",\n \"cli.opt.json\": \"modo headless: emite um único objeto JSON (passos, tool calls, arquivos alterados, uso) em vez da TUI — use com --mode bypass\",\n \"cli.opt.verify\": \"após o agente terminar, roda as checagens do projeto (typecheck/build/test) e itera até passar\",\n \"cli.opt.budget\": \"interrompe a execução quando o custo estimado da sessão atingir este valor em USD (preços do OpenRouter)\",\n \"cli.cmd.usage\": \"Mostra analytics de tokens/custo agregados por dia\",\n \"cli.cmd.estimate\": \"Estima o esforço/custo para implementar uma tarefa (sem alterar nada)\",\n \"cli.arg.estimateTask\": \"tarefa a estimar\",\n \"cli.cmd.sessions\": \"Lista as sessões salvas que podem ser retomadas\",\n \"cli.opt.continue\": \"retoma a sessão salva mais recente\",\n \"cli.opt.resume\": \"retoma uma sessão salva específica pelo id\",\n \"cli.arg.swarmTask\": \"tarefa de alto nível para dividir entre os agentes\",\n \"cli.opt.agents\": \"nomes de agentes separados por vírgula (padrão: todos)\",\n \"cli.opt.maxSubtasks\": \"número máximo de subtarefas paralelas\",\n\n \"agent.exists\": 'Já existe um agente chamado \"{name}\". Use remove-agent antes para substituí-lo.',\n \"agent.needBaseUrl\": 'O provider \"{provider}\" exige --base-url.',\n \"agent.needApiKey\":\n 'O provider \"{provider}\" exige uma chave de API. Passe --api-key \"${ENV_VAR}\" (recomendado) ou um valor literal.',\n \"agent.added\": \"✓ Agente {name} adicionado\",\n \"agent.removed\": \"✓ Agente {name} removido\",\n \"agent.notFound\": 'Não existe agente chamado \"{name}\".',\n \"agent.none\": \"Nenhum agente configurado. Rode `polypus setup` ou `polypus add-agent`.\",\n \"agent.listHeader\": \"Agentes:\",\n \"agent.permLine\": \"Permissões: modo={mode}, allow=[{allow}]\",\n \"agent.noneKnown\": 'Não existe agente chamado \"{name}\". Agentes conhecidos: {names}',\n \"agent.needAnthropicKey\": 'O agente \"{name}\" (anthropic) exige uma chave de API.',\n \"agent.noBaseUrl\": 'O agente \"{name}\" não tem URL base configurada.',\n \"agent.noneConfigured\": \"Nenhum agente configurado. Rode `polypus setup` ou `polypus add-agent` primeiro.\",\n \"agent.multipleNoDefault\":\n \"Vários agentes configurados mas sem padrão definido. Passe --agent <nome> ou defina um padrão. Agentes: {names}\",\n\n \"run.status\":\n \"agente={name} provider={provider} modelo={model} tool-mode={toolMode} modo-permissão={mode}\",\n \"run.done\": \"✓ Concluído ({steps} passos).\",\n \"run.stopped\":\n \"⚠ Parou após {steps} passos sem sinal de conclusão. Você pode continuar com outra instrução.\",\n \"run.confirm\": \"Permitir {summary}?\",\n \"run.reprompt\": \"↻ nenhuma chamada de tool — reforçando instruções (tentativa {attempt})\",\n \"run.autocorrect\": \"↻ tool falhou — autocorrigindo com contexto extra\",\n \"run.cancelled\": \"■ cancelado\",\n \"compaction.done\": \"contexto compactado: ~{before} → ~{after} tokens\",\n \"tools.customLoaded\": \"tool(s) customizada(s) carregada(s): {names}\",\n \"mcp.connected\": \"servidor(es) MCP conectado(s): {servers} ({n} tool(s))\",\n \"run.jsonNeedsTask\": \"--json exige um argumento de tarefa (o modo headless não tem REPL interativo).\",\n \"review.approveAll\": \"aprovar tudo\",\n \"review.reject\": \"rejeitar\",\n \"review.pickHunks\": \"escolher hunks…\",\n \"review.selectHunks\": \"Selecione os hunks a aplicar (espaço alterna, enter confirma)\",\n \"verify.running\": \"verificando (rodando as checagens do projeto)\",\n \"verify.noChecks\": \"nenhuma checagem detectada (sem scripts no package.json) — pulando\",\n \"verify.passed\": \"verificação passou\",\n \"verify.failed\": \"{n} checagem(ns) falharam — devolvendo a saída ao agente (tentativa {attempt})\",\n \"verify.giveUp\": \"{n} checagem(ns) ainda falhando após o limite de tentativas — parando\",\n \"budget.session\": \"gasto da sessão: {spent} / orçamento {budget}\",\n \"budget.hit\": \"■ interrompido: o custo estimado atingiu o orçamento de {budget}\",\n\n // usage analytics\n \"usage.header\": \"Uso (tokens / custo estimado) por dia:\",\n \"usage.empty\": \"Nenhum uso registrado ainda. Rode uma tarefa para começar a medir.\",\n \"usage.total\": \"total\",\n \"usage.runs\": \"execuções\",\n\n // estimate\n \"estimate.header\": \"Estimativa de esforço:\",\n \"estimate.complexity\": \"complexidade\",\n \"estimate.steps\": \"passos\",\n \"estimate.tokens\": \"tokens\",\n \"estimate.cost\": \"custo estimado\",\n\n // sessions\n \"sessions.header\": \"Sessões salvas (mais recentes primeiro):\",\n \"sessions.empty\": \"Nenhuma sessão salva ainda.\",\n \"sessions.hint\": \"Retome com `polypus run --continue` ou `polypus run --resume <id>`.\",\n \"sessions.notFound\": 'Nenhuma sessão salva com id \"{id}\".',\n \"sessions.noneToContinue\": \"Nenhuma sessão anterior para continuar — começando do zero.\",\n \"sessions.resumed\": \"↺ sessão {id} retomada ({n} mensagens)\",\n\n \"repl.welcome\": \"Sessão interativa do Polypus.\",\n \"repl.welcomeHint\": \" Digite /help para comandos, /exit para sair.\",\n \"repl.modeChanged\": \"modo → {mode}\",\n \"repl.allowAdded\": \"allow-list += {glob}\",\n \"repl.allowShow\": \"modo={mode} allow=[{allow}]\",\n \"repl.historyCleared\": \"histórico limpo\",\n \"repl.unknown\": \"Comando desconhecido /{cmd}. Digite /help.\",\n \"repl.pasted\": \"[Texto colado #{id} +{lines} linhas]\",\n \"repl.agentSwitched\": \"agente ativo → {name}\",\n \"repl.switchedTo\": \"agente ativo agora é {name}\",\n \"repl.noAgentsLeft\": \"Nenhum agente restante. Use /add para criar um.\",\n \"repl.needName\": \"Uso: {usage}\",\n \"repl.help\": [\n \"Comandos de barra:\",\n \" /agents lista os agentes configurados\",\n \" /agent <nome> troca o agente ativo\",\n \" /add adiciona um novo agente (wizard)\",\n \" /remove <nome> remove um agente\",\n \" /plan muda para o modo plan (somente leitura)\",\n \" /review muda para o modo review (confirma cada ação)\",\n \" /bypass muda para o modo bypass (aprova automaticamente)\",\n \" /swarm <task> roda a tarefa como swarm paralelo (requer 3+ agentes)\",\n \" /allow <glob> adiciona um glob de caminho à allow-list\",\n \" /allow mostra a allow-list e o modo atuais\",\n \" /reset limpa o histórico da conversa\",\n \" /sessions lista as sessões salvas que você pode retomar\",\n \" /resume <id> retoma uma sessão salva\",\n \" /help mostra esta ajuda\",\n \" /exit sair\",\n \"Qualquer outra coisa é enviada ao agente como tarefa.\",\n ].join(\"\\n\"),\n\n \"swarm.noAgents\": \"Nenhum agente configurado. Rode `polypus setup` ou `polypus add-agent` primeiro.\",\n \"swarm.needsAgents\":\n \"O modo swarm precisa de pelo menos {min} agentes configurados (você tem {have}). Adicione mais com `polypus add-agent`, ou use `polypus run` para um agente só.\",\n \"swarm.status\": \"swarm agentes=[{agents}] workspace={workspace}\",\n \"swarm.bypassNote\":\n \"Os workers rodam em modo bypass dentro de git worktrees isoladas; os branches são mesclados no final.\",\n \"swarm.cancelling\": \"cancelando o swarm — encerrando os workers em andamento e mesclando o que commitou…\",\n \"swarm.decomposed\": \"Dividido em {n} subtarefa(s):\",\n \"swarm.workerStart\": \"▶ {id} iniciada por {agent}\",\n \"swarm.workerDone\": \"✓ {id} concluída\",\n \"swarm.workerStopped\": \"… {id} parou\",\n \"swarm.workerMeta\": \" ({steps} passos, {changes})\",\n \"swarm.changesCommitted\": \"alterações commitadas\",\n \"swarm.noChanges\": \"sem alterações\",\n \"swarm.merged\": \" mesclado {branch}\",\n \"swarm.mergeConflict\": \" conflito ao mesclar {branch}\",\n \"swarm.summary\": \"Resumo:\",\n \"swarm.allMerged\": \"✓ Todos os branches commitados foram mesclados sem conflito.\",\n \"swarm.view.header\": \"Swarm · orquestrador [{lead}]\",\n \"swarm.view.decomposing\": \"dividindo a tarefa…\",\n \"swarm.view.pending\": \"na fila\",\n \"swarm.view.running\": \"executando\",\n \"swarm.view.done\": \"concluído\",\n \"swarm.view.stopped\": \"parado\",\n \"swarm.view.conflict\": \"conflito\",\n \"swarm.view.step\": \"passo {n}\",\n \"swarm.view.steps\": \"{n} passos\",\n \"swarm.conflictsHeader\": \"⚠ {n} branch(es) tiveram conflitos de merge (mantidos para inspeção):\",\n \"swarm.statusDone\": \"ok\",\n \"swarm.statusIncomplete\": \"incompleta\",\n \"swarm.timeout\": \"⚠ O tempo máximo da sessão foi atingido. A operação foi interrompida.\",\n\n // init\n \"init.created\": \"✓ .poly criado:\",\n \"init.skipped\": \"Mantidos (já existiam):\",\n \"init.allExist\": \"Nada a fazer — o .poly já tem estes arquivos:\",\n \"init.forceHint\": \"Rode `polypus init --force` para sobrescrevê-los.\",\n \"init.tip\": \"Dica: edite o .poly/agents.md — o Polypus carrega ele no contexto do agente automaticamente.\",\n\n \"wizard.title\": \" configuração do polypus \",\n \"wizard.intro\": [\n \"O Polypus comanda qualquer API de IA para ler e escrever código neste tipo de projeto.\",\n \"Você pode adicionar vários agentes (chaves/modelos diferentes) e eles trabalham em paralelo.\",\n \"Dica: referencie chaves de API por variáveis de ambiente em vez de colá-las aqui.\",\n ].join(\"\\n\"),\n \"wizard.welcome\": \"Bem-vindo\",\n \"wizard.cancelled\": \"Configuração cancelada.\",\n \"wizard.language\": \"Idioma da interface\",\n \"wizard.addAnother\": \"Adicionar outro agente?\",\n \"wizard.defaultAgent\": \"Agente padrão\",\n \"wizard.permMode\": \"Modo de permissão padrão\",\n \"wizard.permReview\": \"review — confirma cada escrita/comando (padrão seguro)\",\n \"wizard.permPlan\": \"plan — somente leitura, propõe mudanças\",\n \"wizard.permBypass\": \"bypass — aprova tudo automaticamente (use com cuidado)\",\n \"wizard.allowPaths\": \"Caminhos editáveis (globs separados por vírgula)\",\n \"wizard.saved\": \"{n} agente(s) salvos em {path}\",\n \"wizard.next\": 'Rode `polypus run \"sua tarefa\"` para começar, ou `polypus run` para uma sessão interativa.',\n \"wizard.provider\": \"Provider\",\n \"wizard.providerOpenrouter\": \"OpenRouter (hospedado, muitos modelos)\",\n \"wizard.providerOllama\": \"Ollama (modelos locais)\",\n \"wizard.providerCompatible\": \"Compatível com OpenAI (URL base customizada)\",\n \"wizard.providerAnthropic\": \"Anthropic (Claude)\",\n \"wizard.agentName\": \"Nome do agente\",\n \"wizard.required\": \"Obrigatório\",\n \"wizard.nameTaken\": \"Já existe um agente com esse nome\",\n \"wizard.modelId\": \"Id do modelo\",\n \"wizard.ollamaDetecting\": \"Detectando modelos no seu Ollama local…\",\n \"wizard.ollamaFound\": \"{n} modelo(s) do Ollama encontrado(s)\",\n \"wizard.ollamaNone\": \"Ollama não acessível — digite o id do modelo manualmente\",\n \"wizard.ollamaPick\": \"Modelo (detectado no seu Ollama)\",\n \"wizard.ollamaOther\": \"Outro (digitar manualmente)\",\n \"wizard.orError\": \"Não foi possível acessar o OpenRouter — digite o id do modelo manualmente\",\n \"wizard.orSearch\": \"Buscar por id/nome (opcional)\",\n \"wizard.orFilters\": \"Filtros (espaço alterna, enter confirma)\",\n \"wizard.orToolsOnly\": \"Apenas modelos com tools nativas\",\n \"wizard.orFreeOnly\": \"Apenas modelos gratuitos\",\n \"wizard.orSort\": \"Ordenar por\",\n \"wizard.orSortPrice\": \"preço — mais baratos primeiro\",\n \"wizard.orSortPriceDesc\": \"preço — mais caros primeiro\",\n \"wizard.orSortContext\": \"tamanho do contexto\",\n \"wizard.orSortName\": \"nome\",\n \"wizard.orPick\": \"Escolha um modelo ({n} resultados)\",\n \"wizard.orRefilter\": \"↻ mudar filtros\",\n \"wizard.orManual\": \"✎ digitar o id do modelo manualmente\",\n \"wizard.orNone\": \"Nenhum modelo corresponde — ajuste os filtros\",\n \"wizard.baseUrl\": \"URL base\",\n \"wizard.baseUrlRequired\": \"Obrigatório para openai-compatible\",\n \"wizard.toolMode\": \"Modo de tool-calling\",\n \"wizard.toolAuto\": \"auto — nativo para hospedados, emulado para locais (recomendado)\",\n \"wizard.toolNative\": \"native — function-calling do provider\",\n \"wizard.toolEmulated\": \"emulated — protocolo XML de tools no prompt (funciona sem suporte a tools)\",\n \"wizard.keyNotNeeded\": \"{provider} normalmente não precisa de chave. Adicionar mesmo assim?\",\n \"wizard.apiKey\": \"Chave de API\",\n \"wizard.keyEnv\": \"Referenciar uma variável de ambiente (recomendado)\",\n \"wizard.keyInline\": \"Digitar agora (armazenada no arquivo de config)\",\n \"wizard.keySkip\": \"Pular por enquanto\",\n \"wizard.envName\": \"Nome da variável de ambiente\",\n \"wizard.envInvalid\": \"Use letras, dígitos e sublinhados\",\n \"wizard.keyPrompt\": \"Chave de API (armazenada em texto puro no arquivo de config)\",\n\n \"prompt.language\": \"Comunique-se com o usuário em {language}.\",\n \"prompt.projectInstructions\":\n \"Seguem instruções operacionais específicas do projeto, carregadas de `.poly/agents.md`. Trate-as como autoritativas para trabalhar NESTE repositório. Os caminhos que elas citam (ex.: skills/*.md, ../context.md, ../rules.md) são relativos à pasta `.poly/` — leia esses arquivos quando relevante antes de agir:\",\n\n // @-mentions\n \"mentions.injectedHeader\": \"Arquivos referenciados (@-mentions)\",\n \"mentions.dirHeader\": \"@{path} (conteúdo do diretório)\",\n \"mentions.notFound\": \"(não foi possível resolver @{path}: não encontrado ou fora da allow-list)\",\n\n // safety policy\n \"policy.blockedCommand\": \"bloqueado pela política de segurança ({reason}) — recusado em todos os modos\",\n \"policy.secretFound\":\n \"escrita bloqueada: possível segredo ({kind}) encontrado na linha {line}. Remova-o ou carregue de uma variável de ambiente em vez de fixá-lo no código.\",\n\n \"models.fetching\": \"Buscando modelos do OpenRouter…\",\n \"models.fetchError\": \"Não foi possível buscar modelos: {msg}\",\n \"models.none\": \"Nenhum modelo corresponde aos filtros.\",\n \"models.shown\": \"Mostrando {shown} de {total} modelos\",\n \"models.legend\": \"🛠 = tools nativas · preços = USD por 1M tokens (entrada/saída)\",\n \"models.colTools\": \"TOOLS\",\n \"models.colPrice\": \"PREÇO ent/saí\",\n \"models.colCtx\": \"CONTEXTO\",\n \"models.colModel\": \"MODELO\",\n\n \"ui.thinking\": \"pensando\",\n \"ui.running\": \"executando {tool}\",\n \"ui.tokens\": \"{total} tokens (entrada {in} / saída {out})\",\n \"ui.tokensShort\": \"{total} tok\",\n\n \"welcome.tagline\": \"harness agêntico — faça qualquer IA escrever código\",\n \"welcome.agent\": \"agente\",\n \"welcome.model\": \"modelo\",\n \"welcome.mode\": \"modo\",\n \"welcome.workspace\": \"pasta\",\n \"welcome.hints\": \"Digite sua tarefa e tecle Enter · ESC cancela · /help · /exit\",\n \"welcome.firstRun\": \"Nenhum agente configurado ainda — vamos te configurar.\",\n};\n\nconst CATALOGS: Record<Locale, Catalog> = { en, \"pt-BR\": ptBR };\n\nlet currentLocale: Locale = DEFAULT_LOCALE;\n\nexport function setLocale(locale: Locale): void {\n currentLocale = locale;\n}\n\nexport function getLocale(): Locale {\n return currentLocale;\n}\n\nexport function isLocale(value: unknown): value is Locale {\n return typeof value === \"string\" && (LOCALES as readonly string[]).includes(value);\n}\n\n/**\n * Resolve the active locale by precedence: explicit flag > POLYPUS_LANG env >\n * config value > default (pt-BR). Invalid values are ignored.\n */\nexport function pickLocale(opts: { flag?: string; config?: string }): Locale {\n const candidates = [opts.flag, process.env.POLYPUS_LANG, opts.config];\n for (const c of candidates) {\n if (isLocale(c)) return c;\n }\n return DEFAULT_LOCALE;\n}\n\n/** Translate a key, interpolating {placeholders}. Falls back to English, then the key. */\nexport function t(key: string, params?: Record<string, string | number>): string {\n const template = CATALOGS[currentLocale][key] ?? en[key] ?? key;\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, name: string) =>\n name in params ? String(params[name]) : `{${name}}`,\n );\n}\n","import type { ProviderKind } from \"../config/schema.js\";\n\n/** Default base URL per provider. `openai-compatible` has none — the user must supply one. */\nexport const DEFAULT_BASE_URL: Record<ProviderKind, string | undefined> = {\n openrouter: \"https://openrouter.ai/api/v1\",\n ollama: \"http://localhost:11434/v1\",\n \"openai-compatible\": undefined,\n anthropic: \"https://api.anthropic.com\",\n};\n\n/** Whether a provider typically requires an API key (local Ollama does not). */\nexport const REQUIRES_API_KEY: Record<ProviderKind, boolean> = {\n openrouter: true,\n ollama: false,\n \"openai-compatible\": false,\n anthropic: true,\n};\n\n/** Conventional env var name to suggest for a provider's key during setup. */\nexport const SUGGESTED_KEY_ENV: Record<ProviderKind, string | undefined> = {\n openrouter: \"OPENROUTER_API_KEY\",\n ollama: undefined,\n \"openai-compatible\": \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n};\n","import pc from \"picocolors\";\nimport { findAgent, loadConfig, saveConfig } from \"../../core/config/store.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\n/** `polypus remove-agent <name>` */\nexport async function removeAgent(name: string): Promise<void> {\n const config = await loadConfig();\n if (!findAgent(config, name)) {\n throw new Error(t(\"agent.notFound\", { name }));\n }\n config.agents = config.agents.filter((a) => a.name !== name);\n if (config.defaultAgent === name) {\n config.defaultAgent = config.agents[0]?.name;\n }\n await saveConfig(config);\n console.log(pc.green(t(\"agent.removed\", { name: pc.bold(name) })));\n}\n","import pc from \"picocolors\";\nimport { loadConfig } from \"../../core/config/store.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\n/** `polypus list-agents` */\nexport async function listAgents(): Promise<void> {\n const config = await loadConfig();\n if (config.agents.length === 0) {\n console.log(pc.yellow(t(\"agent.none\")));\n return;\n }\n console.log(pc.bold(t(\"agent.listHeader\")));\n for (const a of config.agents) {\n const isDefault = config.defaultAgent === a.name;\n const key = pc.dim(` · ${a.apiKey ? t(\"common.keySet\") : t(\"common.noKey\")}`);\n console.log(\n ` ${isDefault ? pc.green(\"●\") : pc.dim(\"○\")} ${pc.bold(a.name)} ` +\n pc.dim(`(${a.provider} · ${a.model} · ${a.toolMode})`) +\n key +\n (isDefault ? pc.green(` [${t(\"common.default\")}]`) : \"\"),\n );\n }\n console.log(\n pc.dim(\n \"\\n\" + t(\"agent.permLine\", { mode: config.permissions.mode, allow: config.permissions.allow.join(\", \") }),\n ),\n );\n}\n","import pc from \"picocolors\";\nimport * as p from \"@clack/prompts\";\nimport type { PermissionMode } from \"../../core/config/schema.js\";\nimport { loadConfig, resolveAgent } from \"../../core/config/store.js\";\nimport { createProvider } from \"../../core/providers/registry.js\";\nimport { PermissionEngine, type ConfirmRequest, type ConfirmResult } from \"../../core/permissions/modes.js\";\nimport { hunkLabel, type Hunk } from \"../../core/permissions/diff.js\";\nimport { runAgent, type AgentEvents, type RunResult } from \"../../core/agent/loop.js\";\nimport { resolveMentions } from \"../../core/context/mentions.js\";\nimport { buildVerifyFeedback, detectChecks, runChecks } from \"../../core/agent/verify.js\";\nimport {\n estimateCost,\n fmtUsd,\n recordUsage,\n resolveModelPricing,\n type ModelPricing,\n} from \"../../core/agent/usage.js\";\nimport {\n deriveTitle,\n latestSession,\n loadSession,\n newSessionId,\n saveSession,\n type SessionRecord,\n} from \"../../core/agent/session-store.js\";\nimport { loadHooks } from \"../../core/agent/hooks.js\";\nimport { loadCustomTools } from \"../../core/tools/custom.js\";\nimport { loadMcpTools } from \"../../core/mcp/index.js\";\nimport { createJsonCollector } from \"./json-output.js\";\nimport type { Message } from \"../../core/providers/types.js\";\nimport { startRepl, type ReplContext } from \"../../ui/repl.js\";\nimport { runSwarmSession } from \"./swarm.js\";\nimport { printWelcome } from \"../../ui/banner.js\";\nimport { Spinner } from \"../../ui/spinner.js\";\nimport { t } from \"../../core/i18n/index.js\";\nimport { listenForCancel } from \"../../ui/cancel.js\";\n\nexport interface RunOptions {\n agent?: string;\n mode?: string;\n maxSteps?: string;\n /** Headless mode: emit a single JSON object instead of the colored TUI. */\n json?: boolean;\n /** After the agent finishes, run project checks and iterate until they pass. */\n verify?: boolean;\n /** Abort the run when the estimated session cost reaches this USD amount. */\n budget?: string;\n /** Resume the most recently saved session. */\n continue?: boolean;\n /** Resume a specific saved session by id. */\n resume?: string;\n}\n\n/** How many times the agent may re-try to make the verification checks pass. */\nconst MAX_VERIFY_FIXES = 3;\n\n/**\n * Token threshold above which old history is auto-compacted. Defaults to 120k,\n * overridable via POLYPUS_COMPACT_THRESHOLD; POLYPUS_NO_COMPACT disables it.\n */\nfunction compactionThreshold(): number {\n if (process.env.POLYPUS_NO_COMPACT) return 0;\n const v = Number(process.env.POLYPUS_COMPACT_THRESHOLD);\n return Number.isFinite(v) && v > 0 ? v : 120_000;\n}\n\n/** `polypus run [task]` — one-shot if a task is given, otherwise an interactive REPL. */\nexport async function run(task: string | undefined, opts: RunOptions): Promise<void> {\n let config = await loadConfig();\n const workspace = process.cwd();\n\n // Resume/continue: seed from a saved session.\n let seeded: SessionRecord | undefined;\n if (opts.resume) {\n seeded = await loadSession(opts.resume);\n if (!seeded) throw new Error(t(\"sessions.notFound\", { id: opts.resume }));\n } else if (opts.continue) {\n seeded = await latestSession();\n if (!seeded && !opts.json) console.log(pc.dim(t(\"sessions.noneToContinue\")));\n }\n\n const agentConfig = resolveAgent(config, opts.agent ?? seeded?.agentName);\n\n const session: SessionState = {\n id: seeded?.id ?? newSessionId(),\n title: seeded?.title ?? \"\",\n agentName: agentConfig.name,\n mode: (opts.mode as PermissionMode) ?? seeded?.mode ?? config.permissions.mode,\n allow: config.permissions.allow,\n deny: config.permissions.deny,\n allowedCommands: config.permissions.allowedCommands,\n maxSteps: opts.maxSteps ? Number(opts.maxSteps) : undefined,\n history: seeded?.messages ?? [],\n budget: opts.budget ? Number(opts.budget) : undefined,\n costUsd: 0,\n };\n\n if (seeded && !opts.json) {\n console.log(pc.dim(t(\"sessions.resumed\", { id: seeded.id, n: seeded.messages.length })));\n }\n\n // Resolve the active agent freshly each run so /agent, /add and /remove work.\n const runTask = async (taskText: string): Promise<void> => {\n const active = resolveAgent(config, session.agentName);\n const resolved = createProvider(active);\n await executeTask(taskText, resolved, workspace, session);\n };\n\n if (opts.json && !task) throw new Error(t(\"run.jsonNeedsTask\"));\n\n if (task) {\n const resolved = createProvider(agentConfig);\n if (!opts.json) {\n console.log(\n pc.dim(\n t(\"run.status\", {\n name: resolved.config.name,\n provider: resolved.config.provider,\n model: resolved.config.model,\n toolMode: resolved.toolMode,\n mode: session.mode,\n }),\n ),\n );\n }\n await executeTask(task, resolved, workspace, session, opts.json ?? false, opts.verify ?? false);\n if (session.budget !== undefined && !opts.json) {\n console.log(pc.dim(t(\"budget.session\", { spent: fmtUsd(session.costUsd), budget: fmtUsd(session.budget) })));\n }\n return;\n }\n\n // Interactive: full welcome screen with the animated banner.\n const resolved = createProvider(agentConfig);\n await printWelcome({\n agentName: resolved.config.name,\n provider: resolved.config.provider,\n model: resolved.config.model,\n toolMode: resolved.toolMode,\n mode: session.mode,\n workspace,\n });\n\n const ctx: ReplContext = {\n session,\n runTask,\n runSwarm: (taskText) => runSwarmSession(taskText, config, { workspace }),\n getConfig: () => config,\n reload: async () => {\n config = await loadConfig();\n },\n };\n await startRepl(ctx);\n}\n\nexport interface SessionState {\n /** Stable id used to persist/resume this session. */\n id: string;\n /** Short human title (first task), for `polypus sessions`. */\n title: string;\n /** Name of the currently active agent (switchable via /agent). */\n agentName: string;\n mode: PermissionMode;\n allow: string[];\n deny: string[];\n allowedCommands: string[];\n maxSteps?: number;\n history: Message[];\n /** Optional USD spend cap for the whole session (from --budget). */\n budget?: number;\n /** Estimated USD spent so far this session. */\n costUsd: number;\n}\n\nasync function executeTask(\n task: string,\n resolved: ReturnType<typeof createProvider>,\n workspace: string,\n session: SessionState,\n json = false,\n verify = false,\n): Promise<void> {\n // Inject @file / @dir mentions into the task as explicit context before sending.\n const mention = await resolveMentions(task, {\n workspace,\n allow: session.allow,\n deny: session.deny,\n });\n if (mention.injected.length > 0) {\n task = mention.task;\n if (!json) console.log(pc.dim(`↳ @ ${mention.injected.join(\", \")}`));\n }\n\n const spinner = new Spinner();\n const controller = new AbortController();\n const cancel = listenForCancel(controller); // ESC / Ctrl+C aborts the task\n const collector = json ? createJsonCollector() : undefined;\n\n // Cost estimation + budget enforcement (no-op when pricing is unknown).\n const pricing = await resolveModelPricing(resolved.config);\n let budgetHit = false;\n const baseEvents = collector ? collector.events : renderEvents(spinner);\n const events: AgentEvents = {\n ...baseEvents,\n onUsage(u) {\n baseEvents.onUsage?.(u);\n if (session.budget !== undefined && pricing && !controller.signal.aborted) {\n if (session.costUsd + estimateCost(u, pricing) >= session.budget) {\n budgetHit = true;\n controller.abort();\n }\n }\n },\n };\n\n const permissions = new PermissionEngine({\n mode: session.mode,\n policy: { workspace, allow: session.allow, deny: session.deny },\n allowedCommands: session.allowedCommands,\n // Headless runs have no TTY for confirmations — use --mode bypass instead.\n confirm: json\n ? async () => false\n : async (req) => {\n spinner.stop();\n cancel.pause(); // hand stdin to the clack prompt\n const ok = await confirmAction(req);\n cancel.resume();\n return ok;\n },\n });\n\n // Load user-declared custom tools and hooks from .poly/ (if any), plus any\n // MCP servers (external tool servers) declared in .poly/mcp.json.\n const [customTools, hooks, mcp] = await Promise.all([\n loadCustomTools(workspace),\n loadHooks(workspace),\n loadMcpTools(workspace),\n ]);\n const extraTools = [...customTools, ...mcp.tools];\n if (!json && customTools.length > 0) {\n console.log(pc.dim(t(\"tools.customLoaded\", { names: customTools.map((tl) => tl.spec.name).join(\", \") })));\n }\n if (!json && mcp.servers.length > 0) {\n console.log(pc.dim(t(\"mcp.connected\", { servers: mcp.servers.join(\", \"), n: mcp.tools.length })));\n }\n\n const runOnce = (taskText: string): Promise<RunResult> =>\n runAgent({\n task: taskText,\n workspace,\n agent: resolved,\n permissions,\n promptContext: { workspace, mode: session.mode, allow: session.allow },\n history: session.history,\n maxSteps: session.maxSteps,\n compactThresholdTokens: compactionThreshold(),\n extraTools,\n hooks,\n signal: controller.signal,\n events,\n });\n\n if (!json) spinner.start(t(\"ui.thinking\"));\n let result: RunResult;\n try {\n result = await runOnce(task);\n session.history = result.messages;\n\n // Test-driven verification: run project checks and feed failures back to\n // the agent until they pass or the retry budget is exhausted.\n if (verify && result.reason === \"finished\" && !controller.signal.aborted) {\n result = await runVerification(runOnce, workspace, session, spinner, json, controller.signal, result);\n }\n } finally {\n spinner.stop();\n cancel.dispose();\n await mcp.close(); // shut down any spawned MCP servers\n }\n\n // Persist the conversation so it can be resumed (secrets are redacted on save).\n if (!session.title) session.title = deriveTitle(session.history);\n await saveSession({\n id: session.id,\n updatedAt: new Date().toISOString(),\n title: session.title,\n agentName: session.agentName,\n mode: session.mode,\n messages: session.history,\n }).catch(() => {/* best-effort persistence */});\n\n // Account for estimated spend and persist analytics (best-effort).\n const runCost = pricing ? estimateCost(result.usage, pricing) : 0;\n session.costUsd += runCost;\n await recordUsage({\n ts: new Date().toISOString(),\n agent: resolved.config.name,\n provider: resolved.config.provider,\n model: resolved.config.model,\n promptTokens: result.usage.promptTokens,\n completionTokens: result.usage.completionTokens,\n costUsd: runCost,\n });\n\n if (collector) {\n process.stdout.write(JSON.stringify(collector.build(result)) + \"\\n\");\n return;\n }\n\n if (budgetHit) {\n console.log(pc.yellow(\"\\n\" + t(\"budget.hit\", { budget: fmtUsd(session.budget ?? 0) })));\n }\n\n if (result.reason === \"finished\") {\n console.log(pc.green(\"\\n\" + t(\"run.done\", { steps: result.steps })) + (result.summary ? ` ${result.summary}` : \"\"));\n } else if (result.reason === \"cancelled\") {\n console.log(pc.dim(\"\\n\" + t(\"run.cancelled\")));\n } else if (result.reason === \"stalled\" || result.reason === \"maxsteps\") {\n console.log(pc.yellow(\"\\n\" + t(\"run.stopped\", { steps: result.steps })));\n }\n // \"reply\" → the assistant simply talked to the user; nothing more to print.\n\n if (result.usage.promptTokens || result.usage.completionTokens) {\n const total = result.usage.promptTokens + result.usage.completionTokens;\n const tokensLine = t(\"ui.tokens\", {\n total: fmtTokens(total),\n in: fmtTokens(result.usage.promptTokens),\n out: fmtTokens(result.usage.completionTokens),\n });\n const cost = pricing ? ` · ~${fmtUsd(runCost)}` : \"\";\n console.log(pc.dim(\"↳ \" + tokensLine + cost));\n }\n}\n\n/** Compact token count, e.g. 1234 → \"1.2k\". */\nfunction fmtTokens(n: number): string {\n return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n\nasync function confirmAction(req: ConfirmRequest): Promise<ConfirmResult> {\n // Writes in review mode: show the real diff and allow approve-all / reject /\n // (when there is more than one hunk) per-hunk selection.\n if (req.kind === \"write\" && req.hunks && req.hunks.length > 0) {\n renderDiff(req.hunks);\n const options = [\n { value: \"approve\", label: t(\"review.approveAll\") },\n { value: \"reject\", label: t(\"review.reject\") },\n ...(req.hunks.length > 1 ? [{ value: \"hunks\", label: t(\"review.pickHunks\") }] : []),\n ];\n const choice = await p.select({ message: t(\"run.confirm\", { summary: req.summary }), options });\n if (p.isCancel(choice) || choice === \"reject\") return false;\n if (choice === \"approve\") return true;\n\n const selected = await p.multiselect({\n message: t(\"review.selectHunks\"),\n options: req.hunks.map((h, i) => ({ value: i, label: hunkLabel(h) })),\n required: false,\n });\n if (p.isCancel(selected)) return false;\n return selected as number[];\n }\n\n if (req.preview) console.log(pc.dim(req.preview));\n const answer = await p.confirm({ message: t(\"run.confirm\", { summary: req.summary }) });\n if (p.isCancel(answer)) return false;\n return answer === true;\n}\n\n/**\n * Run the project's verification checks; on failure feed the output back to the\n * agent and re-run, up to MAX_VERIFY_FIXES times. Returns the latest run result.\n */\nasync function runVerification(\n runOnce: (task: string) => Promise<RunResult>,\n workspace: string,\n session: SessionState,\n spinner: Spinner,\n json: boolean,\n signal: AbortSignal,\n initial: RunResult,\n): Promise<RunResult> {\n const checks = await detectChecks(workspace);\n if (checks.length === 0) {\n if (!json) console.log(pc.dim(t(\"verify.noChecks\")));\n return initial;\n }\n let result = initial;\n for (let fix = 0; ; fix++) {\n if (signal.aborted) return result;\n if (!json) spinner.start(t(\"verify.running\"));\n const results = await runChecks(workspace, checks);\n spinner.stop();\n const failed = results.filter((r) => !r.ok);\n if (failed.length === 0) {\n if (!json) console.log(pc.green(\"✓ \" + t(\"verify.passed\")));\n return result;\n }\n if (fix >= MAX_VERIFY_FIXES) {\n if (!json) console.log(pc.yellow(\"⚠ \" + t(\"verify.giveUp\", { n: failed.length })));\n return result;\n }\n if (!json) {\n console.log(pc.yellow(\"✗ \" + t(\"verify.failed\", { n: failed.length, attempt: fix + 1 })));\n }\n if (!json) spinner.start(t(\"ui.thinking\"));\n result = await runOnce(buildVerifyFeedback(failed));\n spinner.stop();\n session.history = result.messages;\n }\n}\n\n/** Print a colored unified diff for the hunks of a pending write. */\nfunction renderDiff(hunks: Hunk[]): void {\n for (const h of hunks) {\n console.log(pc.cyan(`@@ -${h.oldStart + 1},${h.oldCount} +${h.newStart + 1},${h.newCount} @@`));\n for (const l of h.lines) {\n if (l.type === \"+\") console.log(pc.green(`+${l.text}`));\n else if (l.type === \"-\") console.log(pc.red(`-${l.text}`));\n else console.log(pc.dim(` ${l.text}`));\n }\n }\n}\n\nfunction renderEvents(spinner: Spinner): AgentEvents {\n // Tracks whether the current step already streamed text live, so onAssistantText\n // doesn't reprint it — it just closes the line.\n let streamed = false;\n return {\n onStep() {\n streamed = false;\n spinner.start(t(\"ui.thinking\"));\n },\n onUsage(usage) {\n const total = usage.promptTokens + usage.completionTokens;\n if (total > 0) spinner.setSuffix(t(\"ui.tokensShort\", { total: fmtTokens(total) }));\n },\n onAssistantDelta(chunk) {\n spinner.stop();\n process.stdout.write(pc.cyan(chunk));\n streamed = true;\n },\n onAssistantText(text) {\n spinner.stop();\n if (streamed) {\n process.stdout.write(\"\\n\"); // close the streamed line; already printed\n return;\n }\n if (text.trim()) console.log(pc.cyan(text.trim()));\n },\n onToolCall(call) {\n spinner.stop();\n const arg = call.name === \"run_command\" ? call.arguments.command : call.arguments.path;\n console.log(pc.dim(` → ${call.name}${arg ? ` ${String(arg)}` : \"\"}`));\n spinner.start(t(\"ui.running\", { tool: call.name }));\n },\n onToolResult(_call, result) {\n spinner.stop();\n const head = result.output.split(\"\\n\")[0] ?? \"\";\n console.log((result.ok ? pc.green(\" ✓ \") : pc.red(\" ✗ \")) + pc.dim(head.slice(0, 120)));\n },\n onReprompt(attempt) {\n spinner.stop();\n console.log(pc.yellow(\" \" + t(\"run.reprompt\", { attempt })));\n },\n onCompaction(before, after) {\n spinner.stop();\n console.log(pc.dim(\"↯ \" + t(\"compaction.done\", { before: fmtTokens(before), after: fmtTokens(after) })));\n },\n onCorrection() {\n spinner.stop();\n console.log(pc.yellow(\" ↻ \" + t(\"run.autocorrect\")));\n },\n };\n}\n","import type {\n ChatRequest,\n ChatResponse,\n Message,\n Provider,\n ToolCall,\n} from \"./types.js\";\n\nexport interface AnthropicOptions {\n name: string;\n model: string;\n baseURL: string;\n apiKey: string;\n timeoutMs?: number;\n}\n\ninterface AnthropicBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: Record<string, unknown>;\n tool_use_id?: string;\n content?: unknown;\n}\n\n/** Minimal native provider for the Anthropic Messages API (no SDK dependency). */\nexport class AnthropicProvider implements Provider {\n readonly name: string;\n readonly model: string;\n private readonly baseURL: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n\n constructor(opts: AnthropicOptions) {\n this.name = opts.name;\n this.model = opts.model;\n this.baseURL = opts.baseURL.replace(/\\/$/, \"\");\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 120_000;\n }\n\n async chat(req: ChatRequest): Promise<ChatResponse> {\n const system = req.messages\n .filter((m) => m.role === \"system\")\n .map((m) => m.content)\n .join(\"\\n\\n\");\n\n const messages = groupMessages(req.messages.filter((m) => m.role !== \"system\"));\n\n const body = {\n model: this.model,\n max_tokens: req.params?.maxTokens ?? 8192,\n temperature: req.params?.temperature,\n ...(system ? { system } : {}),\n messages,\n ...(req.tools && req.tools.length > 0\n ? {\n tools: req.tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.parameters,\n })),\n }\n : {}),\n };\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n // Forward an external abort (e.g. user pressed ESC) to this request.\n if (req.signal) {\n if (req.signal.aborted) controller.abort();\n else req.signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n let res: Response;\n try {\n res = await fetch(`${this.baseURL}/v1/messages`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Anthropic API ${res.status}: ${text.slice(0, 500)}`);\n }\n\n const data = (await res.json()) as {\n content: AnthropicBlock[];\n stop_reason?: string;\n usage?: { input_tokens?: number; output_tokens?: number };\n };\n\n const text = data.content\n .filter((b) => b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\"\");\n const toolCalls: ToolCall[] = data.content\n .filter((b) => b.type === \"tool_use\")\n .map((b) => ({\n id: b.id ?? \"\",\n name: b.name ?? \"\",\n arguments: b.input ?? {},\n }));\n\n return {\n content: text,\n toolCalls,\n finishReason: data.stop_reason ?? \"stop\",\n usage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n }\n : undefined,\n };\n }\n}\n\n/**\n * Convert our flat message list into Anthropic's block format, grouping\n * consecutive tool results into one user turn so roles alternate correctly.\n */\nfunction groupMessages(\n messages: Message[],\n): Array<{ role: \"user\" | \"assistant\"; content: AnthropicBlock[] }> {\n const out: Array<{ role: \"user\" | \"assistant\"; content: AnthropicBlock[] }> = [];\n\n for (const m of messages) {\n if (m.role === \"tool\") {\n const block: AnthropicBlock = {\n type: \"tool_result\",\n tool_use_id: m.toolCallId ?? \"\",\n content: m.content,\n };\n const last = out[out.length - 1];\n if (last && last.role === \"user\") last.content.push(block);\n else out.push({ role: \"user\", content: [block] });\n continue;\n }\n\n if (m.role === \"assistant\") {\n const blocks: AnthropicBlock[] = [];\n if (m.content) blocks.push({ type: \"text\", text: m.content });\n for (const tc of m.toolCalls ?? []) {\n blocks.push({ type: \"tool_use\", id: tc.id, name: tc.name, input: tc.arguments });\n }\n out.push({ role: \"assistant\", content: blocks });\n continue;\n }\n\n // user\n out.push({ role: \"user\", content: [{ type: \"text\", text: m.content }] });\n }\n\n return out;\n}\n","import OpenAI from \"openai\";\nimport type {\n ChatRequest,\n ChatResponse,\n Message,\n Provider,\n ToolCall,\n} from \"./types.js\";\n\nexport interface OpenAICompatibleOptions {\n name: string;\n model: string;\n baseURL: string;\n apiKey?: string;\n timeoutMs?: number;\n maxRetries?: number;\n}\n\n/**\n * Provider for any OpenAI-compatible Chat Completions endpoint.\n * Covers OpenRouter, Ollama (`/v1`), and generic gateways. Native tool-calling\n * is used when `tools` are supplied; the emulated path simply omits them.\n */\nexport class OpenAICompatibleProvider implements Provider {\n readonly name: string;\n readonly model: string;\n private readonly client: OpenAI;\n\n constructor(opts: OpenAICompatibleOptions) {\n this.name = opts.name;\n this.model = opts.model;\n this.client = new OpenAI({\n baseURL: opts.baseURL,\n // Ollama accepts any non-empty key; OpenRouter requires a real one.\n apiKey: opts.apiKey ?? \"polypus-no-key\",\n timeout: opts.timeoutMs ?? 120_000,\n maxRetries: opts.maxRetries ?? 2,\n });\n }\n\n async chat(req: ChatRequest): Promise<ChatResponse> {\n const messages = req.messages.map(toOpenAIMessage);\n const tools = req.tools?.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n }));\n const base = {\n model: this.model,\n messages,\n ...(tools && tools.length > 0 ? { tools } : {}),\n temperature: req.params?.temperature,\n // Generous default so large files aren't truncated mid tool-call.\n max_tokens: req.params?.maxTokens ?? 8192,\n };\n\n // Streaming path: emit text chunks live while aggregating the full response.\n if (req.onDelta) {\n const stream = await this.client.chat.completions.create(\n { ...base, stream: true, stream_options: { include_usage: true } },\n { signal: req.signal },\n );\n const agg = await aggregateStream(stream as AsyncIterable<StreamChunk>, req.onDelta);\n return {\n content: agg.content,\n toolCalls: agg.toolCalls.map((tc, i) => ({\n id: tc.id || `call_${i}`,\n name: tc.name,\n arguments: safeParseArgs(tc.arguments),\n })),\n finishReason: agg.finishReason || \"stop\",\n usage: agg.usage,\n };\n }\n\n const completion = await this.client.chat.completions.create(\n { ...base },\n { signal: req.signal },\n );\n\n const choice = completion.choices[0];\n const msg = choice?.message;\n const toolCalls: ToolCall[] = (msg?.tool_calls ?? []).map((tc, i) => ({\n id: tc.id || `call_${i}`,\n name: tc.function.name,\n arguments: safeParseArgs(tc.function.arguments),\n }));\n\n return {\n content: msg?.content ?? \"\",\n toolCalls,\n finishReason: choice?.finish_reason ?? \"stop\",\n usage: completion.usage\n ? {\n promptTokens: completion.usage.prompt_tokens,\n completionTokens: completion.usage.completion_tokens,\n }\n : undefined,\n };\n }\n}\n\n/** Minimal shape of an OpenAI streaming chunk (only the fields we read). */\nexport interface StreamChunk {\n choices?: Array<{\n delta?: {\n content?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number } | null;\n}\n\nexport interface AggregatedStream {\n content: string;\n toolCalls: Array<{ id: string; name: string; arguments: string }>;\n finishReason: string;\n usage?: { promptTokens?: number; completionTokens?: number };\n}\n\n/**\n * Consume an OpenAI-style chat stream, calling `onDelta` for each text chunk and\n * aggregating content, tool-call deltas (by index), finish reason, and usage.\n * Pure (no SDK dependency) so it can be unit-tested with a mocked iterable.\n */\nexport async function aggregateStream(\n stream: AsyncIterable<StreamChunk>,\n onDelta?: (chunk: string) => void,\n): Promise<AggregatedStream> {\n let content = \"\";\n let finishReason = \"\";\n let usage: AggregatedStream[\"usage\"];\n const toolAcc: Array<{ id: string; name: string; arguments: string }> = [];\n\n for await (const chunk of stream) {\n const choice = chunk.choices?.[0];\n const delta = choice?.delta;\n if (delta?.content) {\n content += delta.content;\n onDelta?.(delta.content);\n }\n for (const tc of delta?.tool_calls ?? []) {\n const slot = (toolAcc[tc.index] ??= { id: \"\", name: \"\", arguments: \"\" });\n if (tc.id) slot.id = tc.id;\n if (tc.function?.name) slot.name = tc.function.name;\n if (tc.function?.arguments) slot.arguments += tc.function.arguments;\n }\n if (choice?.finish_reason) finishReason = choice.finish_reason;\n if (chunk.usage) {\n usage = {\n promptTokens: chunk.usage.prompt_tokens,\n completionTokens: chunk.usage.completion_tokens,\n };\n }\n }\n\n return { content, finishReason, usage, toolCalls: toolAcc.filter(Boolean) };\n}\n\nfunction toOpenAIMessage(m: Message): OpenAI.Chat.ChatCompletionMessageParam {\n switch (m.role) {\n case \"tool\":\n return {\n role: \"tool\",\n content: m.content,\n tool_call_id: m.toolCallId ?? \"\",\n };\n case \"assistant\":\n return {\n role: \"assistant\",\n content: m.content || null,\n ...(m.toolCalls && m.toolCalls.length > 0\n ? {\n tool_calls: m.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n },\n })),\n }\n : {}),\n };\n case \"system\":\n return { role: \"system\", content: m.content };\n default:\n return { role: \"user\", content: m.content };\n }\n}\n\nfunction safeParseArgs(raw: string): Record<string, unknown> {\n if (!raw || !raw.trim()) return {};\n try {\n const parsed = JSON.parse(raw);\n if (typeof parsed === \"object\" && parsed !== null) return parsed as Record<string, unknown>;\n return { value: parsed };\n } catch {\n // Models often emit invalid JSON for large code payloads (unescaped quotes/\n // newlines in 'content'). Recover the common string fields heuristically.\n return recoverArgs(raw);\n }\n}\n\nconst SHORT_FIELDS = [\"path\", \"command\", \"summary\"] as const;\nconst LONG_FIELDS = [\"content\", \"replace\", \"search\"] as const;\n\n/** Best-effort extraction of known tool arguments from malformed JSON. */\nfunction recoverArgs(raw: string): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of SHORT_FIELDS) {\n const m = new RegExp(`\"${key}\"\\\\s*:\\\\s*\"((?:[^\"\\\\\\\\]|\\\\\\\\.)*)\"`).exec(raw);\n if (m) out[key] = unescapeJsonString(m[1]!);\n }\n // Long fields may contain unescaped quotes/newlines: capture from the key up\n // to the last double-quote in the payload (the closing quote before `}`).\n for (const key of LONG_FIELDS) {\n const opener = new RegExp(`\"${key}\"\\\\s*:\\\\s*\"`).exec(raw);\n if (!opener) continue;\n const from = opener.index + opener[0].length;\n const end = raw.lastIndexOf('\"');\n if (end > from) out[key] = unescapeJsonString(raw.slice(from, end));\n }\n if (Object.keys(out).length === 0) out._raw = raw;\n return out;\n}\n\n/** Exposed for unit tests. */\nexport const __test_safeParseArgs = safeParseArgs;\n\nfunction unescapeJsonString(s: string): string {\n return s\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\r/g, \"\\r\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\//g, \"/\")\n .replace(/\\\\\\\\/g, \"\\\\\");\n}\n","import type { AgentConfig } from \"../config/schema.js\";\nimport { resolveSecret } from \"../config/store.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { DEFAULT_BASE_URL } from \"./defaults.js\";\nimport { OpenAICompatibleProvider } from \"./openai-compatible.js\";\nimport type { Provider } from \"./types.js\";\nimport { t } from \"../i18n/index.js\";\n\nexport type ResolvedToolMode = \"native\" | \"emulated\";\n\nexport interface ResolvedAgent {\n config: AgentConfig;\n provider: Provider;\n toolMode: ResolvedToolMode;\n}\n\n/**\n * Resolve `auto` to a concrete tool path. Cloud providers generally expose\n * function-calling, while local models (Ollama) are frequently base models\n * without it — so emulated is the safer default there. Users can force either\n * with `--tool-mode`.\n */\nexport function resolveToolMode(agent: AgentConfig): ResolvedToolMode {\n if (agent.toolMode !== \"auto\") return agent.toolMode;\n return agent.provider === \"ollama\" ? \"emulated\" : \"native\";\n}\n\nexport function createProvider(agent: AgentConfig): ResolvedAgent {\n const apiKey = resolveSecret(agent.apiKey);\n const baseURL = agent.baseUrl ?? DEFAULT_BASE_URL[agent.provider];\n if (!baseURL) {\n throw new Error(t(\"agent.noBaseUrl\", { name: agent.name }));\n }\n\n let provider: Provider;\n if (agent.provider === \"anthropic\") {\n if (!apiKey) throw new Error(t(\"agent.needAnthropicKey\", { name: agent.name }));\n provider = new AnthropicProvider({\n name: agent.name,\n model: agent.model,\n baseURL,\n apiKey,\n });\n } else {\n provider = new OpenAICompatibleProvider({\n name: agent.name,\n model: agent.model,\n baseURL,\n apiKey,\n });\n }\n\n return { config: agent, provider, toolMode: resolveToolMode(agent) };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { PermissionMode } from \"../config/schema.js\";\nimport { checkPath, isCommandPreApproved, type PathPolicy } from \"./allowlist.js\";\nimport { scanSecrets, screenCommand } from \"./policy.js\";\nimport { computeHunks, type Hunk } from \"./diff.js\";\nimport { applyHunks } from \"./diff.js\";\nimport { t } from \"../i18n/index.js\";\n\nexport interface ConfirmRequest {\n kind: \"write\" | \"command\";\n summary: string;\n preview?: string;\n /** For writes in review mode: the change split into hunks, for diff/hunk approval. */\n hunks?: Hunk[];\n}\n\n/**\n * Result of a confirmation: `true` = approve all, `false` = reject, or an array\n * of approved hunk indexes (a subset approval for a write).\n */\nexport type ConfirmResult = boolean | number[];\n\nexport type ConfirmFn = (req: ConfirmRequest) => Promise<ConfirmResult>;\n\nexport interface Decision {\n allowed: boolean;\n reason?: string;\n /** When present, the exact content the caller should write (a subset-of-hunks result). */\n content?: string;\n}\n\nexport interface PermissionEngineOptions {\n mode: PermissionMode;\n policy: PathPolicy;\n allowedCommands: string[];\n /** Invoked in `review` mode to ask the user. Defaults to deny if absent. */\n confirm?: ConfirmFn;\n}\n\n/** Central authority for whether a file write or command may proceed. */\nexport class PermissionEngine {\n constructor(private readonly opts: PermissionEngineOptions) {}\n\n get mode(): PermissionMode {\n return this.opts.mode;\n }\n\n /** Reads are allowed in every mode as long as the path is within the allow-list. */\n authorizeRead(target: string): Decision {\n const d = checkPath(this.opts.policy, target);\n return d.allowed ? { allowed: true } : { allowed: false, reason: d.reason };\n }\n\n async authorizeWrite(target: string, preview?: string, content?: string): Promise<Decision> {\n const d = checkPath(this.opts.policy, target);\n if (!d.allowed) return { allowed: false, reason: d.reason };\n\n // Read the current file (if any) so we can diff and scan only added lines.\n let oldContent = \"\";\n try {\n oldContent = await readFile(resolve(this.opts.policy.workspace, target), \"utf8\");\n } catch {\n /* new file — no old content */\n }\n const hunks = content !== undefined ? computeHunks(oldContent, content) : [];\n const added = hunks\n .flatMap((h) => h.lines.filter((l) => l.type === \"+\").map((l) => l.text))\n .join(\"\\n\");\n\n // Block hard-coded secrets in the added content before any mode gating —\n // applies even in bypass. Pre-existing secrets are not re-flagged.\n const findings = scanSecrets(hunks.length > 0 ? added : content ?? preview ?? \"\");\n if (findings.length > 0) {\n const first = findings[0]!;\n return {\n allowed: false,\n reason: t(\"policy.secretFound\", { kind: first.kind, line: first.line }),\n };\n }\n\n if (this.opts.mode === \"plan\") {\n return { allowed: false, reason: \"plan mode: file modifications are disabled\" };\n }\n if (this.opts.mode === \"bypass\") return { allowed: true };\n\n const res = await this.ask({ kind: \"write\", summary: `write ${d.rel}`, preview, hunks });\n if (res === true) return { allowed: true };\n if (res === false) return { allowed: false, reason: \"rejected by user\" };\n\n // A subset of hunk indexes was approved.\n const approved = new Set(res);\n if (approved.size === 0) return { allowed: false, reason: \"rejected by user\" };\n if (approved.size === hunks.length) return { allowed: true };\n return { allowed: true, content: applyHunks(oldContent, hunks, approved) };\n }\n\n async authorizeCommand(command: string): Promise<Decision> {\n // Destructive commands are blocked in every mode, including bypass.\n const screen = screenCommand(command);\n if (screen.blocked) {\n return { allowed: false, reason: t(\"policy.blockedCommand\", { reason: screen.reason ?? \"\" }) };\n }\n if (this.opts.mode === \"plan\") {\n return { allowed: false, reason: \"plan mode: running commands is disabled\" };\n }\n if (this.opts.mode === \"bypass\") return { allowed: true };\n if (isCommandPreApproved(this.opts.allowedCommands, command)) return { allowed: true };\n\n const res = await this.ask({ kind: \"command\", summary: `run: ${command}` });\n return res === true ? { allowed: true } : { allowed: false, reason: \"rejected by user\" };\n }\n\n private async ask(req: ConfirmRequest): Promise<ConfirmResult> {\n if (!this.opts.confirm) return false;\n return this.opts.confirm(req);\n }\n}\n","import { isAbsolute, relative, resolve, sep } from \"node:path\";\n\n/**\n * Convert a glob to a RegExp. Supports `**` (any path segments, including none),\n * `*` (within a segment), and `?` (single non-slash char). Paths are matched in\n * POSIX form (forward slashes).\n */\nexport function globToRegExp(glob: string): RegExp {\n let re = \"\";\n for (let i = 0; i < glob.length; i++) {\n const c = glob[i]!;\n if (c === \"*\") {\n if (glob[i + 1] === \"*\") {\n // `**` — any sequence including slashes; swallow an optional following slash.\n re += \".*\";\n i++;\n if (glob[i + 1] === \"/\") i++;\n } else {\n re += \"[^/]*\";\n }\n } else if (c === \"?\") {\n re += \"[^/]\";\n } else if (\".+^${}()|[]\\\\\".includes(c)) {\n re += \"\\\\\" + c;\n } else {\n re += c;\n }\n }\n return new RegExp(`^${re}$`);\n}\n\n/** Normalize an OS path to a POSIX-style relative path for glob matching. */\nexport function toPosix(p: string): string {\n return p.split(sep).join(\"/\");\n}\n\nexport interface PathPolicy {\n workspace: string;\n allow: string[];\n deny: string[];\n}\n\nexport interface PathDecision {\n allowed: boolean;\n reason?: string;\n /** Workspace-relative POSIX path. */\n rel: string;\n}\n\n/**\n * Decide whether a path may be accessed. Rejects paths outside the workspace,\n * then applies deny globs (which win) and allow globs.\n */\nexport function checkPath(policy: PathPolicy, target: string): PathDecision {\n const abs = isAbsolute(target) ? target : resolve(policy.workspace, target);\n const rel = toPosix(relative(policy.workspace, abs));\n\n if (rel === \"\" || rel.startsWith(\"..\") || isAbsolute(rel)) {\n return { allowed: false, rel, reason: \"path escapes the workspace\" };\n }\n for (const d of policy.deny) {\n if (globToRegExp(d).test(rel)) {\n return { allowed: false, rel, reason: `denied by deny-list pattern \"${d}\"` };\n }\n }\n for (const a of policy.allow) {\n if (globToRegExp(a).test(rel)) return { allowed: true, rel };\n }\n return { allowed: false, rel, reason: \"not in the allow-list\" };\n}\n\n/** A command is pre-approved when it starts with one of the allowed prefixes. */\nexport function isCommandPreApproved(allowedCommands: string[], command: string): boolean {\n const c = command.trim();\n return allowedCommands.some((prefix) => c === prefix || c.startsWith(prefix.trim() + \" \"));\n}\n","/**\n * Safety policy shared by the permission engine: a deny-list of obviously\n * destructive shell commands, and a scanner for hard-coded secrets in file\n * writes. Both are deliberately conservative (specific patterns) to keep false\n * positives low while catching the dangerous/leaky cases.\n */\n\nexport interface CommandScreen {\n blocked: boolean;\n reason?: string;\n}\n\n/** Patterns that are almost never legitimate from an autonomous agent. */\nconst DANGEROUS_COMMANDS: { re: RegExp; reason: string }[] = [\n { re: /--no-preserve-root/i, reason: \"rm --no-preserve-root\" },\n { re: /:\\(\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;\\s*:/, reason: \"fork bomb\" },\n { re: /\\bmkfs(\\.\\w+)?\\b/i, reason: \"filesystem format (mkfs)\" },\n { re: /\\bdd\\b[^\\n]*\\bof=\\/dev\\/(sd|nvme|hd|disk)/i, reason: \"dd writing to a raw disk device\" },\n { re: />\\s*\\/dev\\/(sd|nvme|hd|disk)/i, reason: \"redirect to a raw disk device\" },\n { re: /\\bchmod\\s+(-[a-z]*\\s+)*-?R?\\s*777\\s+\\//i, reason: \"chmod 777 on /\" },\n { re: /\\b(curl|wget)\\b[^\\n|]*\\|\\s*(sudo\\s+)?(sh|bash|zsh)\\b/i, reason: \"piping a downloaded script straight into a shell\" },\n];\n\n/** A recursive+force `rm` aimed at root, home, or a bare glob — catastrophic. */\nfunction isDangerousRm(command: string): boolean {\n if (!/\\brm\\b/i.test(command)) return false;\n const recursive =\n /(?:^|\\s)-[a-z]*r[a-z]*f/i.test(command) ||\n /(?:^|\\s)-[a-z]*f[a-z]*r/i.test(command) ||\n (/(?:^|\\s)-[a-z]*r\\b/i.test(command) && /(?:^|\\s)-[a-z]*f\\b/i.test(command));\n if (!recursive) return false;\n // Target is bare root, /*, ~, $HOME, or a lone * (whole working dir).\n return /(?:\\s|^)(?:\\/\\*|\\/|~|\\$HOME|\\*)(?:\\s|$)/.test(command);\n}\n\n/** Decide whether a shell command is too dangerous to run in any mode. */\nexport function screenCommand(command: string): CommandScreen {\n if (isDangerousRm(command)) {\n return { blocked: true, reason: \"recursive force-delete of / ~ or *\" };\n }\n for (const { re, reason } of DANGEROUS_COMMANDS) {\n if (re.test(command)) return { blocked: true, reason };\n }\n return { blocked: false };\n}\n\nexport interface SecretFinding {\n line: number;\n kind: string;\n}\n\nconst SECRET_PATTERNS: { re: RegExp; kind: string }[] = [\n { re: /-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/, kind: \"private key block\" },\n { re: /\\bAKIA[0-9A-Z]{16}\\b/, kind: \"AWS access key id\" },\n { re: /\\bgh[pousr]_[A-Za-z0-9]{36,}\\b/, kind: \"GitHub token\" },\n { re: /\\bxox[baprs]-[A-Za-z0-9-]{10,}\\b/, kind: \"Slack token\" },\n { re: /\\bsk-[A-Za-z0-9]{32,}\\b/, kind: \"OpenAI-style secret key\" },\n { re: /\\bAIza[0-9A-Za-z_-]{35}\\b/, kind: \"Google API key\" },\n];\n\n/** Replace any secrets in the text with a redaction marker (best-effort). */\nexport function redactSecrets(text: string): string {\n let out = text;\n for (const { re } of SECRET_PATTERNS) {\n out = out.replace(new RegExp(re.source, re.flags.includes(\"g\") ? re.flags : re.flags + \"g\"), \"[redacted]\");\n }\n return out;\n}\n\n/** Scan text for hard-coded secrets. Returns one finding per matching line. */\nexport function scanSecrets(text: string): SecretFinding[] {\n const findings: SecretFinding[] = [];\n const lines = text.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n for (const { re, kind } of SECRET_PATTERNS) {\n if (re.test(lines[i]!)) {\n findings.push({ line: i + 1, kind });\n break; // one finding per line is enough to block\n }\n }\n }\n return findings;\n}\n","/**\n * Minimal line-based diff (LCS) grouped into hunks, used to show the real change\n * in `review` mode and to let the user approve a subset of hunks. Dependency-free.\n */\n\nexport type DiffLineType = \" \" | \"-\" | \"+\";\n\nexport interface DiffLine {\n type: DiffLineType;\n text: string;\n}\n\nexport interface Hunk {\n /** 0-based index of the first old-file line this hunk covers. */\n oldStart: number;\n /** Number of old-file lines this hunk covers (context + removed). */\n oldCount: number;\n /** 0-based index of the first new-file line this hunk covers. */\n newStart: number;\n /** Number of new-file lines this hunk produces (context + added). */\n newCount: number;\n lines: DiffLine[];\n}\n\nconst CONTEXT = 3;\n\nfunction splitLines(text: string): string[] {\n return text === \"\" ? [] : text.split(\"\\n\");\n}\n\n/** Longest-common-subsequence table over two line arrays. */\nfunction lcsOps(a: string[], b: string[]): DiffLine[] {\n const n = a.length;\n const m = b.length;\n const dp: number[][] = Array.from({ length: n + 1 }, () => new Array<number>(m + 1).fill(0));\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n dp[i]![j] = a[i] === b[j] ? dp[i + 1]![j + 1]! + 1 : Math.max(dp[i + 1]![j]!, dp[i]![j + 1]!);\n }\n }\n const out: DiffLine[] = [];\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n out.push({ type: \" \", text: a[i]! });\n i++;\n j++;\n } else if (dp[i + 1]![j]! >= dp[i]![j + 1]!) {\n out.push({ type: \"-\", text: a[i]! });\n i++;\n } else {\n out.push({ type: \"+\", text: b[j]! });\n j++;\n }\n }\n while (i < n) out.push({ type: \"-\", text: a[i++]! });\n while (j < m) out.push({ type: \"+\", text: b[j++]! });\n return out;\n}\n\n/** Compute the hunks (changed regions with surrounding context) between two texts. */\nexport function computeHunks(oldText: string, newText: string): Hunk[] {\n const a = splitLines(oldText);\n const b = splitLines(newText);\n const ops = lcsOps(a, b);\n\n // Mark which positions in the op list are changes; expand by CONTEXT.\n const isChange = ops.map((o) => o.type !== \" \");\n const keep = new Array<boolean>(ops.length).fill(false);\n for (let k = 0; k < ops.length; k++) {\n if (isChange[k]) {\n for (let c = Math.max(0, k - CONTEXT); c <= Math.min(ops.length - 1, k + CONTEXT); c++) {\n keep[c] = true;\n }\n }\n }\n\n const hunks: Hunk[] = [];\n let oldLine = 0;\n let newLine = 0;\n let k = 0;\n while (k < ops.length) {\n const op = ops[k]!;\n if (!keep[k]) {\n if (op.type !== \"+\") oldLine++;\n if (op.type !== \"-\") newLine++;\n k++;\n continue;\n }\n // Start a hunk; consume the contiguous kept run.\n const oldStart = oldLine;\n const newStart = newLine;\n const lines: DiffLine[] = [];\n let oldCount = 0;\n let newCount = 0;\n while (k < ops.length && keep[k]) {\n const cur = ops[k]!;\n lines.push(cur);\n if (cur.type !== \"+\") {\n oldLine++;\n oldCount++;\n }\n if (cur.type !== \"-\") {\n newLine++;\n newCount++;\n }\n k++;\n }\n hunks.push({ oldStart, oldCount, newStart, newCount, lines });\n }\n return hunks;\n}\n\n/**\n * Reconstruct a file from its old text, applying only the approved hunks.\n * Unapproved hunks keep the original lines. `approved` is a set of hunk indexes.\n */\nexport function applyHunks(oldText: string, hunks: Hunk[], approved: Set<number>): string {\n const a = splitLines(oldText);\n const out: string[] = [];\n let oldIdx = 0;\n hunks.forEach((hunk, idx) => {\n while (oldIdx < hunk.oldStart) out.push(a[oldIdx++]!);\n if (approved.has(idx)) {\n for (const l of hunk.lines) if (l.type !== \"-\") out.push(l.text);\n } else {\n for (const l of hunk.lines) if (l.type !== \"+\") out.push(l.text);\n }\n oldIdx = hunk.oldStart + hunk.oldCount;\n });\n while (oldIdx < a.length) out.push(a[oldIdx++]!);\n return out.join(\"\\n\");\n}\n\n/** A short one-line label for a hunk, used in the selection prompt. */\nexport function hunkLabel(hunk: Hunk): string {\n const added = hunk.lines.filter((l) => l.type === \"+\").length;\n const removed = hunk.lines.filter((l) => l.type === \"-\").length;\n const firstChange = hunk.lines.find((l) => l.type !== \" \");\n const preview = firstChange ? firstChange.text.trim().slice(0, 50) : \"\";\n return `@@ -${hunk.oldStart + 1},${hunk.oldCount} +${hunk.newStart + 1},${hunk.newCount} @@ (+${added}/-${removed}) ${preview}`;\n}\n","import type { ToolSpec } from \"../providers/types.js\";\nimport type { PermissionMode } from \"../config/schema.js\";\nimport { getLocale, LOCALE_NAMES, t } from \"../i18n/index.js\";\n\nexport interface PromptContext {\n workspace: string;\n mode: PermissionMode;\n allow: string[];\n /** Extra agent-specific instructions (e.g. a subtask brief from the orchestrator). */\n briefing?: string;\n /** Project operating instructions loaded from `.poly/agents.md` (or `AGENTS.md`). */\n projectInstructions?: string;\n}\n\n/** Shared role/permission preamble used by both the native and emulated paths. */\nfunction basePreamble(ctx: PromptContext): string {\n const modeLine =\n ctx.mode === \"plan\"\n ? \"You are in PLAN mode: investigate and propose changes, but do NOT modify files or run commands. Describe the plan and call `finish`.\"\n : ctx.mode === \"review\"\n ? \"You are in REVIEW mode: each file write and command will be shown to the user for approval before it runs.\"\n : \"You are in BYPASS mode: actions are applied automatically.\";\n\n return [\n \"You are Polypus, an autonomous coding agent working inside a real project directory.\",\n \"\",\n `Workspace (current working directory): ${ctx.workspace}`,\n `Editable paths (glob allow-list): ${ctx.allow.join(\", \")}`,\n modeLine,\n \"\",\n \"IMPORTANT — you have real permission to act:\",\n \"- YES, you ARE allowed to create, read, and modify files in this workspace.\",\n \"- YES, you ARE allowed to run shell commands (subject to the permission mode above).\",\n \"- Do not ask for permission and do not say you cannot edit files — you can. Just emit the tool calls.\",\n \"- Make the changes directly. When the task is fully done, call the `finish` tool with a short summary.\",\n t(\"prompt.language\", { language: LOCALE_NAMES[getLocale()] }),\n ctx.projectInstructions ? `\\n${t(\"prompt.projectInstructions\")}\\n\\n${ctx.projectInstructions}` : \"\",\n ctx.briefing ? `\\nYour assigned task:\\n${ctx.briefing}` : \"\",\n ].join(\"\\n\");\n}\n\nexport function buildNativeSystemPrompt(ctx: PromptContext): string {\n return [\n basePreamble(ctx),\n \"\",\n \"Use the provided tools/functions to read and edit files and run commands. Prefer small, targeted edits.\",\n ].join(\"\\n\");\n}\n\n/** Render the parameter names of a tool from its JSON schema for the prompt. */\nfunction describeParams(tool: ToolSpec): string {\n const props = (tool.parameters as { properties?: Record<string, { description?: string }> }).properties ?? {};\n const required = new Set(\n ((tool.parameters as { required?: string[] }).required ?? []),\n );\n const lines = Object.entries(props).map(\n ([k, v]) =>\n ` <arg name=\"${k}\">…</arg> ${required.has(k) ? \"(required)\" : \"(optional)\"} ${v.description ?? \"\"}`.trimEnd(),\n );\n return lines.length > 0 ? lines.join(\"\\n\") : \" (no arguments)\";\n}\n\nexport function buildEmulatedSystemPrompt(tools: ToolSpec[], ctx: PromptContext): string {\n const toolDocs = tools\n .map(\n (t) =>\n `- ${t.name}: ${t.description}\\n Call it like:\\n <polypus:tool name=\"${t.name}\">\\n${describeParams(t)}\\n </polypus:tool>`,\n )\n .join(\"\\n\\n\");\n\n return [\n basePreamble(ctx),\n \"\",\n \"This model has no native tool API, so you act by emitting tool calls as XML blocks.\",\n \"STRICT OUTPUT RULES:\",\n '- To act, output one or more <polypus:tool name=\"...\"> blocks and NOTHING else (no markdown code fences around them).',\n \"- Put file contents or code directly inside the relevant <arg> — angle brackets in code are fine.\",\n \"- You may include one or more tool blocks per turn. After you receive the results, continue.\",\n \"- When the entire task is complete, emit a finish call:\",\n ' <polypus:tool name=\"finish\"><arg name=\"summary\">what you did</arg></polypus:tool>',\n \"\",\n \"Available tools:\",\n \"\",\n toolDocs,\n ].join(\"\\n\");\n}\n\n/** Reinforcement message re-sent when the model produced no tool call (the \"yes, you can\" nudge). */\nexport function buildReprompt(): string {\n return [\n \"You did not emit any tool call. Remember: you ARE allowed and expected to act now.\",\n \"Do NOT explain that you cannot edit files — you can.\",\n 'Respond ONLY with one or more <polypus:tool name=\"...\"> blocks to make the change,',\n 'or with <polypus:tool name=\"finish\"><arg name=\"summary\">…</arg></polypus:tool> if the task is already complete.',\n ].join(\"\\n\");\n}\n","import type { ChatResponse, Message, ToolCall, ToolSpec } from \"../providers/types.js\";\nimport type { ProtocolDriver } from \"./driver.js\";\nimport { buildNativeSystemPrompt, type PromptContext } from \"./system-prompt.js\";\n\n/** Driver for providers with native function-calling. */\nexport class NativeDriver implements ProtocolDriver {\n readonly kind = \"native\" as const;\n\n constructor(private readonly tools: ToolSpec[]) {}\n\n systemPrompt(ctx: PromptContext): string {\n return buildNativeSystemPrompt(ctx);\n }\n\n providerTools(): ToolSpec[] | undefined {\n return this.tools;\n }\n\n parse(response: ChatResponse): { toolCalls: ToolCall[]; text: string } {\n return { toolCalls: response.toolCalls, text: response.content };\n }\n\n assistantMessage(response: ChatResponse, toolCalls: ToolCall[]): Message {\n return { role: \"assistant\", content: response.content, toolCalls };\n }\n\n toolResultMessage(call: ToolCall, resultText: string): Message {\n return { role: \"tool\", toolCallId: call.id, name: call.name, content: resultText };\n }\n\n repromptMessage(): Message {\n return {\n role: \"user\",\n content:\n \"You did not call any tool. Use the available tools to act now, or call `finish` if the task is complete.\",\n };\n }\n}\n","import type { ToolCall } from \"../providers/types.js\";\n\n/**\n * Tolerant parser for the emulated XML tool protocol. Extracts blocks of the form:\n *\n * <polypus:tool name=\"write_file\">\n * <arg name=\"path\">src/index.ts</arg>\n * <arg name=\"content\">...code...</arg>\n * </polypus:tool>\n *\n * Arg values may contain `<` and `>` (code). Values are read up to the last\n * </arg> before the next sibling <arg ...> (or the end of the tool block), which\n * tolerates angle brackets inside code without a strict XML parser.\n */\nconst TOOL_OPEN = /<polypus:tool\\s+name=\"([^\"]+)\"\\s*>/g;\nconst TOOL_CLOSE = \"</polypus:tool>\";\nconst ARG_OPEN = /<arg\\s+name=\"([^\"]+)\"\\s*>/g;\n\nexport interface ParseResult {\n toolCalls: ToolCall[];\n /** Text outside of any tool block (model reasoning / prose). */\n text: string;\n}\n\n/**\n * Parse emulated tool calls. `knownToolNames` enables a tolerant fallback for\n * the shorthand form some models drift to (e.g. `<finish>...</finish>` instead\n * of `<polypus:tool name=\"finish\">`).\n */\nexport function parseEmulatedToolCalls(\n output: string,\n knownToolNames: string[] = [],\n): ParseResult {\n const toolCalls: ToolCall[] = [];\n const proseParts: string[] = [];\n let cursor = 0;\n let callIndex = 0;\n\n TOOL_OPEN.lastIndex = 0;\n let open: RegExpExecArray | null;\n while ((open = TOOL_OPEN.exec(output))) {\n const name = open[1]!;\n const blockStart = open.index + open[0].length;\n const closeIdx = output.indexOf(TOOL_CLOSE, blockStart);\n if (closeIdx === -1) break; // unterminated block; bail out tolerantly\n\n proseParts.push(output.slice(cursor, open.index));\n const block = output.slice(blockStart, closeIdx);\n toolCalls.push({\n id: `emu_${callIndex++}`,\n name: name.trim(),\n arguments: parseArgs(block),\n });\n\n cursor = closeIdx + TOOL_CLOSE.length;\n TOOL_OPEN.lastIndex = cursor;\n }\n proseParts.push(output.slice(cursor));\n\n let text = proseParts.join(\"\").trim();\n\n // Strip orphan open/close tags that weak models sometimes leave dangling.\n text = text.replace(/<\\/?polypus:tool[^>]*>/g, \"\").trim();\n\n // Tolerant fallbacks for known tool names that weak models drift toward.\n if (knownToolNames.length > 0) {\n for (const name of knownToolNames) {\n const n = escapeName(name);\n\n // (a) Tag shorthand: <finish>...</finish>\n const tagRe = new RegExp(`<${n}(?:\\\\s[^>]*)?>([\\\\s\\\\S]*?)</${n}>`, \"g\");\n let m: RegExpExecArray | null;\n while ((m = tagRe.exec(text))) {\n toolCalls.push({ id: `emu_${callIndex++}`, name, arguments: parseArgs(m[1]!) });\n }\n text = text.replace(tagRe, \"\").trim();\n\n // (b) Label form: `finish:` followed by one or more <arg> blocks.\n const labelRe = new RegExp(\n `(?:^|\\\\n)[ \\\\t]*${n}[ \\\\t]*:?[ \\\\t]*\\\\n?((?:[ \\\\t]*<arg\\\\b[\\\\s\\\\S]*?</arg>[ \\\\t]*\\\\n?)+)`,\n \"g\",\n );\n while ((m = labelRe.exec(text))) {\n toolCalls.push({ id: `emu_${callIndex++}`, name, arguments: parseArgs(m[1]!) });\n }\n text = text.replace(labelRe, \"\").trim();\n }\n }\n\n return { toolCalls, text };\n}\n\nfunction escapeName(name: string): string {\n return name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction parseArgs(block: string): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n ARG_OPEN.lastIndex = 0;\n\n const matches: Array<{ name: string; valueStart: number }> = [];\n let m: RegExpExecArray | null;\n while ((m = ARG_OPEN.exec(block))) {\n matches.push({ name: m[1]!, valueStart: m.index + m[0].length });\n }\n\n for (let i = 0; i < matches.length; i++) {\n const current = matches[i]!;\n const next = matches[i + 1];\n const region = block.slice(current.valueStart, next ? next.valueStart : block.length);\n args[current.name.trim()] = trimArgValue(stripLastCloseTag(region));\n }\n return args;\n}\n\n/**\n * Keep only what precedes this arg's closing </arg>. For a non-final arg the\n * region also contains the next <arg ...> opener after the close tag; using the\n * last </arg> before that opener correctly isolates the current value.\n */\nfunction stripLastCloseTag(region: string): string {\n const idx = region.lastIndexOf(\"</arg>\");\n return idx === -1 ? region : region.slice(0, idx);\n}\n\n/** Trim a single leading/trailing newline that models tend to add around block values. */\nfunction trimArgValue(value: string): string {\n return value.replace(/^\\r?\\n/, \"\").replace(/\\r?\\n[ \\t]*$/, \"\");\n}\n","import type { ChatResponse, Message, ToolCall, ToolSpec } from \"../providers/types.js\";\nimport type { ProtocolDriver } from \"./driver.js\";\nimport { NativeDriver } from \"./native.js\";\nimport { parseEmulatedToolCalls } from \"./parser.js\";\nimport {\n buildEmulatedSystemPrompt,\n buildReprompt,\n type PromptContext,\n} from \"./system-prompt.js\";\n\n/** Driver for models without native tool-calling: tools are encoded as XML in the prompt. */\nexport class EmulatedDriver implements ProtocolDriver {\n readonly kind = \"emulated\" as const;\n\n constructor(private readonly tools: ToolSpec[]) {}\n\n systemPrompt(ctx: PromptContext): string {\n return buildEmulatedSystemPrompt(this.tools, ctx);\n }\n\n providerTools(): ToolSpec[] | undefined {\n return undefined; // encoded in the system prompt instead\n }\n\n parse(response: ChatResponse): { toolCalls: ToolCall[]; text: string } {\n return parseEmulatedToolCalls(\n response.content,\n this.tools.map((t) => t.name),\n );\n }\n\n assistantMessage(response: ChatResponse): Message {\n // Keep the raw output (including the XML) so the model sees its own actions.\n return { role: \"assistant\", content: response.content };\n }\n\n toolResultMessage(call: ToolCall, resultText: string): Message {\n // Emulated models don't understand the `tool` role; feed results back as user text.\n return {\n role: \"user\",\n content: `<polypus:tool_result name=\"${call.name}\">\\n${resultText}\\n</polypus:tool_result>`,\n };\n }\n\n repromptMessage(): Message {\n return { role: \"user\", content: buildReprompt() };\n }\n}\n\nexport function makeDriver(\n kind: \"native\" | \"emulated\",\n tools: ToolSpec[],\n): ProtocolDriver {\n return kind === \"native\" ? new NativeDriver(tools) : new EmulatedDriver(tools);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst Args = z.object({\n path: z.string().min(1),\n search: z.string().min(1),\n replace: z.string(),\n});\n\nexport const editFileTool: Tool = {\n mutating: true,\n spec: {\n name: \"edit_file\",\n description:\n \"Replace an exact snippet in a file. 'search' must match the existing text verbatim and uniquely.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Workspace-relative file path\" },\n search: { type: \"string\", description: \"Exact text to find (must be unique in the file)\" },\n replace: { type: \"string\", description: \"Text to replace it with\" },\n },\n required: [\"path\", \"search\", \"replace\"],\n },\n },\n async run(rawArgs, ctx) {\n const args = Args.safeParse(rawArgs);\n if (!args.success) {\n return {\n ok: false,\n output:\n \"edit_file needs three arguments: 'path', 'search' (exact text to find), and 'replace'. \" +\n \"Resend the tool call with all three filled in.\",\n };\n }\n\n const abs = resolve(ctx.workspace, args.data.path);\n let content: string;\n try {\n content = await readFile(abs, \"utf8\");\n } catch (err) {\n return { ok: false, output: `Could not read file to edit: ${(err as Error).message}` };\n }\n\n const occurrences = content.split(args.data.search).length - 1;\n if (occurrences === 0) {\n return { ok: false, output: \"The 'search' text was not found. Re-read the file and try an exact snippet.\" };\n }\n if (occurrences > 1) {\n return {\n ok: false,\n output: `The 'search' text matched ${occurrences} times; it must be unique. Include more surrounding context.`,\n };\n }\n\n const updated = content.replace(args.data.search, args.data.replace);\n const decision = await ctx.permissions.authorizeWrite(\n args.data.path,\n `- ${firstLine(args.data.search)}\\n+ ${firstLine(args.data.replace)}`,\n updated,\n );\n if (!decision.allowed) return { ok: false, output: `Edit denied: ${decision.reason}` };\n\n // decision.content is set when the user approved only some hunks in review mode.\n try {\n await writeFile(abs, decision.content ?? updated, \"utf8\");\n return { ok: true, output: `Edited ${args.data.path}.` };\n } catch (err) {\n return { ok: false, output: `Could not write edit: ${(err as Error).message}` };\n }\n },\n};\n\nfunction firstLine(s: string): string {\n return s.split(\"\\n\")[0] ?? \"\";\n}\n","import { readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst Args = z.object({ path: z.string().default(\".\") });\n\nexport const listDirTool: Tool = {\n mutating: false,\n spec: {\n name: \"list_dir\",\n description: \"List files and subdirectories of a workspace directory.\",\n parameters: {\n type: \"object\",\n properties: { path: { type: \"string\", description: \"Workspace-relative directory (default '.')\" } },\n },\n },\n async run(rawArgs, ctx) {\n const args = Args.safeParse(rawArgs);\n const path = args.success ? args.data.path : \".\";\n\n const decision = ctx.permissions.authorizeRead(path === \".\" ? \".\" : path);\n // Listing the workspace root itself is always permitted.\n if (path !== \".\" && !decision.allowed) {\n return { ok: false, output: `List denied: ${decision.reason}` };\n }\n\n try {\n const entries = await readdir(resolve(ctx.workspace, path), { withFileTypes: true });\n const lines = entries\n .map((e) => (e.isDirectory() ? `${e.name}/` : e.name))\n .sort();\n return { ok: true, output: lines.length ? lines.join(\"\\n\") : \"(empty)\" };\n } catch (err) {\n return { ok: false, output: `Could not list directory: ${(err as Error).message}` };\n }\n },\n};\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst Args = z.object({ path: z.string().min(1) });\nconst MAX_CHARS = 60_000;\n\nexport const readFileTool: Tool = {\n mutating: false,\n spec: {\n name: \"read_file\",\n description: \"Read the contents of a file in the workspace.\",\n parameters: {\n type: \"object\",\n properties: { path: { type: \"string\", description: \"Workspace-relative file path\" } },\n required: [\"path\"],\n },\n },\n async run(rawArgs, ctx) {\n const args = Args.safeParse(rawArgs);\n if (!args.success) return { ok: false, output: \"Invalid args: 'path' is required.\" };\n\n const decision = ctx.permissions.authorizeRead(args.data.path);\n if (!decision.allowed) return { ok: false, output: `Read denied: ${decision.reason}` };\n\n try {\n const content = await readFile(resolve(ctx.workspace, args.data.path), \"utf8\");\n const truncated = content.length > MAX_CHARS;\n return {\n ok: true,\n output: (truncated ? content.slice(0, MAX_CHARS) + \"\\n…[truncated]\" : content),\n };\n } catch (err) {\n return { ok: false, output: `Could not read file: ${(err as Error).message}` };\n }\n },\n};\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst execAsync = promisify(exec);\nconst Args = z.object({ command: z.string().min(1) });\nconst MAX_OUTPUT = 20_000;\n\nexport const runCommandTool: Tool = {\n mutating: true,\n spec: {\n name: \"run_command\",\n description: \"Run a shell command in the workspace and return its combined stdout/stderr.\",\n parameters: {\n type: \"object\",\n properties: { command: { type: \"string\", description: \"Shell command to execute\" } },\n required: [\"command\"],\n },\n },\n async run(rawArgs, ctx) {\n const args = Args.safeParse(rawArgs);\n if (!args.success) return { ok: false, output: \"Invalid args: 'command' is required.\" };\n\n const decision = await ctx.permissions.authorizeCommand(args.data.command);\n if (!decision.allowed) return { ok: false, output: `Command denied: ${decision.reason}` };\n\n try {\n const { stdout, stderr } = await execAsync(args.data.command, {\n cwd: ctx.workspace,\n timeout: 120_000,\n maxBuffer: 10 * 1024 * 1024,\n windowsHide: true,\n });\n return { ok: true, output: clamp(`${stdout}${stderr ? `\\n[stderr]\\n${stderr}` : \"\"}`.trim() || \"(no output)\") };\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string; code?: number };\n const body = `${e.stdout ?? \"\"}${e.stderr ?? \"\"}`.trim();\n return {\n ok: false,\n output: clamp(`Command failed (exit ${e.code ?? \"?\"}): ${e.message}\\n${body}`),\n };\n }\n },\n};\n\nfunction clamp(s: string): string {\n return s.length > MAX_OUTPUT ? s.slice(0, MAX_OUTPUT) + \"\\n…[truncated]\" : s;\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { globToRegExp, toPosix } from \"../permissions/allowlist.js\";\nimport type { Tool } from \"./types.js\";\n\nconst Args = z.object({\n query: z.string().min(1),\n path: z.string().optional(),\n glob: z.string().optional(),\n max_results: z.number().int().positive().max(1000).optional(),\n});\n\nconst DEFAULT_MAX_RESULTS = 50;\nconst MAX_OUTPUT = 20_000;\nconst MAX_FILE_BYTES = 2_000_000; // skip very large files\nconst SNIPPET_CHARS = 200;\nconst NUL = String.fromCharCode(0);\n/** Directories never worth walking (large, machine-generated, or VCS internals). */\nconst SKIP_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \".next\", \"coverage\", \".turbo\"]);\n\nexport const searchTool: Tool = {\n mutating: false,\n spec: {\n name: \"search\",\n description:\n \"Search file contents by regular expression across the workspace (like grep/ripgrep). \" +\n \"Returns matches as 'path:line: snippet'. Respects the allow/deny-list and skips \" +\n \"node_modules/.git. Use this to find where a symbol is defined or used instead of \" +\n \"reading files blindly.\",\n parameters: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Regular expression to match against each line\" },\n path: { type: \"string\", description: \"Workspace-relative directory to search in (default '.')\" },\n glob: {\n type: \"string\",\n description: \"Optional glob to limit files, e.g. 'src/**/*.ts'\",\n },\n max_results: {\n type: \"number\",\n description: `Maximum number of matches to return (default ${DEFAULT_MAX_RESULTS})`,\n },\n },\n required: [\"query\"],\n },\n },\n async run(rawArgs, ctx) {\n const parsed = Args.safeParse(rawArgs);\n if (!parsed.success) return { ok: false, output: \"Invalid args: 'query' is required.\" };\n const { query, path = \".\", glob, max_results } = parsed.data;\n\n let regex: RegExp;\n try {\n regex = new RegExp(query);\n } catch (err) {\n return { ok: false, output: `Invalid regular expression: ${(err as Error).message}` };\n }\n\n // The search root may be the workspace itself ('.') or a subdirectory; the\n // subdirectory must pass the read allow-list.\n if (path !== \".\") {\n const decision = ctx.permissions.authorizeRead(path);\n if (!decision.allowed) return { ok: false, output: `Search denied: ${decision.reason}` };\n }\n\n const globRe = glob ? globToRegExp(glob) : undefined;\n const limit = max_results ?? DEFAULT_MAX_RESULTS;\n const root = resolve(ctx.workspace, path);\n const matches: string[] = [];\n let truncated = false;\n\n const walk = async (dir: string): Promise<void> => {\n if (matches.length >= limit) return;\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return; // unreadable directory — skip\n }\n for (const entry of entries) {\n if (matches.length >= limit) return;\n const abs = join(dir, entry.name);\n const rel = toPosix(abs.slice(ctx.workspace.length + 1));\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n await walk(abs);\n continue;\n }\n if (!entry.isFile()) continue;\n if (globRe && !globRe.test(rel)) continue;\n // Content exposure is gated by the same allow/deny-list as read_file.\n if (!ctx.permissions.authorizeRead(rel).allowed) continue;\n\n try {\n const info = await stat(abs);\n if (info.size > MAX_FILE_BYTES) continue;\n const content = await readFile(abs, \"utf8\");\n if (content.includes(NUL)) continue; // looks binary\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n if (matches.length >= limit) {\n truncated = true;\n return;\n }\n if (regex.test(lines[i]!)) {\n const snippet = lines[i]!.trim().slice(0, SNIPPET_CHARS);\n matches.push(`${rel}:${i + 1}: ${snippet}`);\n }\n }\n } catch {\n // unreadable / non-utf8 file — skip\n }\n }\n };\n\n await walk(root);\n\n if (matches.length === 0) {\n return { ok: true, output: `No matches for /${query}/${glob ? ` in ${glob}` : \"\"}.` };\n }\n const header = `${matches.length}${truncated ? \"+\" : \"\"} match(es) for /${query}/:`;\n const body = [header, ...matches].join(\"\\n\");\n return {\n ok: true,\n output: body.length > MAX_OUTPUT ? body.slice(0, MAX_OUTPUT) + \"\\n…[truncated]\" : body,\n };\n },\n};\n","import type { ToolSpec } from \"../providers/types.js\";\nimport type { PermissionEngine } from \"../permissions/modes.js\";\n\nexport interface ToolContext {\n workspace: string;\n permissions: PermissionEngine;\n}\n\nexport interface ToolResult {\n ok: boolean;\n /** Text fed back to the model describing the outcome. */\n output: string;\n}\n\nexport interface Tool {\n spec: ToolSpec;\n /** True if the tool changes the workspace or runs commands (gated by permission mode). */\n mutating: boolean;\n run(args: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult>;\n}\n\n/** Sentinel tool the model calls to signal completion; intercepted by the loop. */\nexport const FINISH_TOOL: ToolSpec = {\n name: \"finish\",\n description: \"Call when the task is fully complete. Provide a short summary of what was done.\",\n parameters: {\n type: \"object\",\n properties: {\n summary: { type: \"string\", description: \"Summary of the work completed\" },\n },\n required: [\"summary\"],\n },\n};\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst Args = z.object({ path: z.string().min(1), content: z.string() });\n\nexport const writeFileTool: Tool = {\n mutating: true,\n spec: {\n name: \"write_file\",\n description: \"Create or overwrite a file with the given content.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Workspace-relative file path\" },\n content: { type: \"string\", description: \"Full file content\" },\n },\n required: [\"path\", \"content\"],\n },\n },\n async run(rawArgs, ctx) {\n const args = Args.safeParse(rawArgs);\n if (!args.success) {\n const got = Object.keys(rawArgs ?? {});\n return {\n ok: false,\n output:\n \"write_file needs two arguments: 'path' (the file path) and 'content' (the complete file text). \" +\n `Received: [${got.join(\", \") || \"none\"}]. Resend the tool call with BOTH arguments filled in, ` +\n \"and keep the file small enough to fit in one message.\",\n };\n }\n\n const preview = previewContent(args.data.content);\n const decision = await ctx.permissions.authorizeWrite(args.data.path, preview, args.data.content);\n if (!decision.allowed) return { ok: false, output: `Write denied: ${decision.reason}` };\n\n // decision.content is set when the user approved only some hunks in review mode.\n const finalContent = decision.content ?? args.data.content;\n try {\n const abs = resolve(ctx.workspace, args.data.path);\n await mkdir(dirname(abs), { recursive: true });\n await writeFile(abs, finalContent, \"utf8\");\n const lines = finalContent.split(\"\\n\").length;\n return { ok: true, output: `Wrote ${args.data.path} (${lines} lines).` };\n } catch (err) {\n return { ok: false, output: `Could not write file: ${(err as Error).message}` };\n }\n },\n};\n\nfunction previewContent(content: string): string {\n const lines = content.split(\"\\n\");\n return lines.length > 40 ? lines.slice(0, 40).join(\"\\n\") + \"\\n…\" : content;\n}\n","import type { ToolSpec } from \"../providers/types.js\";\nimport { editFileTool } from \"./edit-file.js\";\nimport { listDirTool } from \"./list-dir.js\";\nimport { readFileTool } from \"./read-file.js\";\nimport { runCommandTool } from \"./run-command.js\";\nimport { searchTool } from \"./search-file.js\";\nimport { FINISH_TOOL, type Tool } from \"./types.js\";\nimport { writeFileTool } from \"./write-file.js\";\n\n/** All executable tools, keyed by name. `finish` is intercepted by the loop, not run here. */\nexport const TOOLS: Record<string, Tool> = {\n [readFileTool.spec.name]: readFileTool,\n [listDirTool.spec.name]: listDirTool,\n [searchTool.spec.name]: searchTool,\n [writeFileTool.spec.name]: writeFileTool,\n [editFileTool.spec.name]: editFileTool,\n [runCommandTool.spec.name]: runCommandTool,\n};\n\n/** Tool specs advertised to the model, including the `finish` sentinel. */\nexport function toolSpecs(): ToolSpec[] {\n return [...Object.values(TOOLS).map((t) => t.spec), FINISH_TOOL];\n}\n\nexport function getTool(name: string): Tool | undefined {\n return TOOLS[name];\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport type { Provider, ToolCall, ToolSpec } from \"../providers/types.js\";\n\n/**\n * Auto-correction layer. When a tool call fails, the raw error is often too\n * terse for the model to recover from, so it keeps re-issuing the same broken\n * call until the loop stalls. `buildCorrection` turns that failure into an\n * instructive message: it explains the likely cause AND attaches the missing\n * context (e.g. the real file contents for an edit that did not match) so the\n * model can fix its own call on the next step.\n *\n * Strategy is hybrid: deterministic rules handle the common, recognizable\n * failures cheaply; anything unrecognized may escalate to a single \"fixer\" LLM\n * call (provided by the caller) to produce guidance.\n */\n\n/** Escalation hook: a secondary LLM call that diagnoses an unrecognized error. */\nexport type Escalator = (info: {\n call: ToolCall;\n output: string;\n toolSpec?: ToolSpec;\n}) => Promise<string | null>;\n\nexport interface CorrectionDeps {\n workspace: string;\n /** Editable glob allow-list (from the prompt context). */\n allow: string[];\n /** Spec of the tool that failed, used to restate its schema on bad args. */\n toolSpec?: ToolSpec;\n /** The model's response was cut off at the token limit (finishReason length/max_tokens). */\n truncated?: boolean;\n /** Optional LLM fixer, invoked only when no deterministic rule matches. */\n escalate?: Escalator;\n}\n\n/**\n * Guidance for a response that hit the output token limit. The most common\n * real-world cause of a `write_file` failing with only `path` (Issue #25): the\n * model emitted a huge file, got cut off mid tool-call, and `content` never\n * arrived. Telling it to split the file is what actually breaks the loop.\n */\nexport function truncationGuidance(toolName?: string): string {\n const fileHint =\n toolName === \"write_file\" || toolName === \"edit_file\"\n ? \" Write large files in parts: create the file with the first chunk via write_file, then append the rest with edit_file in the next steps.\"\n : \"\";\n return [\n \"AUTO-CORRECTION — your previous response was cut off at the output token limit,\",\n \"so the tool call was incomplete (e.g. 'content' missing or partial).\",\n \"Do NOT resend the same large output — produce a smaller one this time.\" + fileHint,\n ].join(\"\\n\");\n}\n\n/**\n * Build corrective guidance to append to a failed tool result, or `null` when\n * there is nothing useful to add. Never replaces the original error — the loop\n * appends this so the model sees both.\n */\nexport async function buildCorrection(\n call: ToolCall,\n output: string,\n deps: CorrectionDeps,\n): Promise<string | null> {\n const deterministic = await deterministicCorrection(call, output, deps);\n if (deterministic) return deterministic;\n if (deps.escalate) return deps.escalate({ call, output, toolSpec: deps.toolSpec });\n return null;\n}\n\nasync function deterministicCorrection(\n call: ToolCall,\n output: string,\n deps: CorrectionDeps,\n): Promise<string | null> {\n // Truncation takes priority: a failed call after a cut-off response is almost\n // always the cause, and restating the schema (below) would just loop.\n if (deps.truncated) return truncationGuidance(call.name);\n\n const path = typeof call.arguments.path === \"string\" ? call.arguments.path : undefined;\n\n // edit_file: the 'search' snippet was not found in the file.\n if (call.name === \"edit_file\" && /was not found/i.test(output) && path) {\n const search = typeof call.arguments.search === \"string\" ? call.arguments.search : \"\";\n const snippet = await snippetNearSearch(deps.workspace, path, search);\n if (snippet) {\n return [\n \"AUTO-CORRECTION — the 'search' text does not exist verbatim in the file.\",\n \"Here is the file's actual content (line-numbered). Copy the 'search' value EXACTLY\",\n \"from these lines (including indentation and whitespace), then resend edit_file:\",\n \"\",\n snippet,\n ].join(\"\\n\");\n }\n }\n\n // edit_file: the 'search' snippet matched more than once.\n if (call.name === \"edit_file\" && /matched \\d+ times/i.test(output) && path) {\n const search = typeof call.arguments.search === \"string\" ? call.arguments.search : \"\";\n const lines = await occurrenceLines(deps.workspace, path, search);\n if (lines.length > 0) {\n return [\n \"AUTO-CORRECTION — the 'search' text is not unique; it appears at lines \" +\n `${lines.join(\", \")}.`,\n \"Add more surrounding lines to 'search' so it matches exactly one location, then resend.\",\n ].join(\"\\n\");\n }\n }\n\n // Missing file or parent directory (ENOENT) on read or write.\n if (/ENOENT|no such file/i.test(output) && path) {\n const listing = await listNearest(deps.workspace, path);\n if (listing) {\n return [\n \"AUTO-CORRECTION — that path does not exist. Nearby existing entries:\",\n \"\",\n listing,\n \"\",\n \"Use list_dir to confirm the correct path, or create the parent directory first.\",\n ].join(\"\\n\");\n }\n }\n\n // Permission denied: the path is outside the editable allow-list.\n if (/denied|not allowed/i.test(output)) {\n return [\n \"AUTO-CORRECTION — this action was blocked by the permission policy.\",\n `Editable paths (glob allow-list): ${deps.allow.join(\", \") || \"(none)\"}.`,\n \"Target a path inside the allow-list, or stop and report that the change is out of scope.\",\n ].join(\"\\n\");\n }\n\n // Invalid / missing arguments: restate the exact schema of the tool.\n if (deps.toolSpec && /needs .* arguments|Invalid|required|Resend the tool call/i.test(output)) {\n return [\n \"AUTO-CORRECTION — the call had missing or invalid arguments. Expected schema:\",\n \"\",\n formatSchema(deps.toolSpec),\n \"\",\n \"Resend the tool call with every required argument filled in.\",\n ].join(\"\\n\");\n }\n\n return null;\n}\n\n/** A single LLM fixer call. Returns plain corrective guidance, or null. */\nexport function makeLLMEscalator(provider: Provider): Escalator {\n return async ({ call, output, toolSpec }) => {\n const prompt = [\n \"A tool call just failed. Diagnose WHY in one or two sentences, then give a concrete,\",\n \"actionable instruction for how to correct the call. Do not apologize and do not call any tool.\",\n \"\",\n `Tool: ${call.name}`,\n `Arguments: ${JSON.stringify(call.arguments)}`,\n `Error: ${output}`,\n toolSpec ? `Schema: ${JSON.stringify(toolSpec.parameters)}` : \"\",\n ].join(\"\\n\");\n try {\n const res = await provider.chat({\n messages: [\n { role: \"system\", content: \"You are a debugging assistant for an autonomous coding agent.\" },\n { role: \"user\", content: prompt },\n ],\n params: { maxTokens: 400 },\n });\n const text = res.content.trim();\n return text ? `AUTO-CORRECTION (diagnosis):\\n${text}` : null;\n } catch {\n return null;\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// helpers\n\nasync function readWorkspaceFile(workspace: string, path: string): Promise<string | null> {\n try {\n return await readFile(resolve(workspace, path), \"utf8\");\n } catch {\n return null;\n }\n}\n\n/** Number lines 1-based and keep a window around `center` (0-based line index). */\nfunction numberedWindow(content: string, center: number, radius: number): string {\n const lines = content.split(\"\\n\");\n const start = Math.max(0, center - radius);\n const end = Math.min(lines.length, center + radius + 1);\n const width = String(end).length;\n return lines\n .slice(start, end)\n .map((line, i) => `${String(start + i + 1).padStart(width, \" \")} | ${line}`)\n .join(\"\\n\");\n}\n\n/** Show file content around the line that best matches the failed 'search'. */\nasync function snippetNearSearch(\n workspace: string,\n path: string,\n search: string,\n): Promise<string | null> {\n const content = await readWorkspaceFile(workspace, path);\n if (content === null) return null;\n const lines = content.split(\"\\n\");\n const anchor = bestAnchorLine(lines, search);\n return numberedWindow(content, anchor >= 0 ? anchor : 0, 6);\n}\n\n/** Pick the file line that shares the most words with the search's first real line. */\nfunction bestAnchorLine(lines: string[], search: string): number {\n const target = search.split(\"\\n\").map((l) => l.trim()).find((l) => l.length > 0);\n if (!target) return -1;\n const targetWords = new Set(tokens(target));\n let best = -1;\n let bestScore = 0;\n lines.forEach((line, i) => {\n if (line.includes(target)) {\n if (bestScore < Number.MAX_SAFE_INTEGER) {\n best = i;\n bestScore = Number.MAX_SAFE_INTEGER;\n }\n return;\n }\n const score = tokens(line).filter((w) => targetWords.has(w)).length;\n if (score > bestScore) {\n best = i;\n bestScore = score;\n }\n });\n return best;\n}\n\nfunction tokens(s: string): string[] {\n return s.split(/\\W+/).filter((w) => w.length > 0);\n}\n\n/** 1-based line numbers where `search` starts inside the file. */\nasync function occurrenceLines(workspace: string, path: string, search: string): Promise<number[]> {\n const content = await readWorkspaceFile(workspace, path);\n if (content === null || search.length === 0) return [];\n const out: number[] = [];\n let from = 0;\n for (;;) {\n const idx = content.indexOf(search, from);\n if (idx === -1) break;\n out.push(content.slice(0, idx).split(\"\\n\").length);\n from = idx + search.length;\n }\n return out;\n}\n\n/** List the contents of the nearest existing ancestor directory of `path`. */\nasync function listNearest(workspace: string, path: string): Promise<string | null> {\n let dir = dirname(resolve(workspace, path));\n for (let i = 0; i < 8; i++) {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n const rel = dir === resolve(workspace) ? \".\" : dir;\n const names = entries.slice(0, 40).map((e) => (e.isDirectory() ? `${e.name}/` : e.name));\n return `${rel}:\\n ${names.join(\" \") || \"(empty)\"}`;\n } catch {\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n }\n return null;\n}\n\n/** Render a tool's JSON-schema parameters as a readable required/optional list. */\nfunction formatSchema(spec: ToolSpec): string {\n const props =\n (spec.parameters as { properties?: Record<string, { type?: string; description?: string }> }).properties ?? {};\n const required = new Set((spec.parameters as { required?: string[] }).required ?? []);\n const lines = Object.entries(props).map(\n ([name, v]) =>\n ` - ${name} (${v.type ?? \"any\"}, ${required.has(name) ? \"required\" : \"optional\"})` +\n (v.description ? `: ${v.description}` : \"\"),\n );\n return lines.join(\"\\n\") || \" (no parameters)\";\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/** Where project operating instructions live, in priority order (workspace-relative). */\nconst INSTRUCTION_FILES = [join(\".poly\", \"agents.md\"), \"AGENTS.md\"];\n\n/** Hard cap so a large instructions file can't blow up the context window. */\nconst MAX_CHARS = 8000;\n\n/**\n * Load project-specific operating instructions to inject into the agent's system\n * prompt — the polypus equivalent of an `AGENTS.md`/`CLAUDE.md`. Reads the first\n * file that exists from {@link INSTRUCTION_FILES}, trims it, and caps the length.\n * Returns `undefined` when no instructions file is present (the common case for\n * throwaway swarm worktrees, which don't carry the gitignored `.poly/`).\n */\nexport async function loadProjectInstructions(workspace: string): Promise<string | undefined> {\n for (const rel of INSTRUCTION_FILES) {\n try {\n const raw = (await readFile(join(workspace, rel), \"utf8\")).trim();\n if (!raw) continue;\n return raw.length > MAX_CHARS ? raw.slice(0, MAX_CHARS) + \"\\n…(truncated)\" : raw;\n } catch {\n /* file missing/unreadable — try the next candidate */\n }\n }\n return undefined;\n}\n","import type { ResolvedAgent } from \"../providers/registry.js\";\nimport type { Message } from \"../providers/types.js\";\n\n/** Rough token estimate when the provider does not report usage (~4 chars/token). */\nexport function estimateTokens(messages: Message[]): number {\n let chars = 0;\n for (const m of messages) chars += m.content.length;\n return Math.ceil(chars / 4);\n}\n\n/** How many of the most recent messages to keep verbatim after compaction. */\nconst RECENT_KEEP = 8;\n/** Minimum number of old messages worth summarizing (below this, skip). */\nconst MIN_TO_COMPACT = 4;\n/** Cap the text handed to the summarizer so the summary call itself stays small. */\nconst MAX_SUMMARY_INPUT = 40_000;\n\n/**\n * Pick a cut index so the kept tail never starts mid tool-round: not on a tool\n * result, and not right after an assistant message that still has pending tool\n * calls (which would orphan those results for native providers).\n */\nexport function findSafeCut(messages: Message[], desiredKeep = RECENT_KEEP): number {\n let cut = Math.max(1, messages.length - desiredKeep);\n while (\n cut < messages.length &&\n (messages[cut]!.role === \"tool\" ||\n (messages[cut - 1]?.role === \"assistant\" && (messages[cut - 1]!.toolCalls?.length ?? 0) > 0))\n ) {\n cut++;\n }\n return cut;\n}\n\nfunction serialize(messages: Message[]): string {\n const text = messages\n .map((m) => {\n const tools = m.toolCalls?.length ? ` [called: ${m.toolCalls.map((c) => c.name).join(\", \")}]` : \"\";\n return `${m.role}${tools}: ${m.content}`;\n })\n .join(\"\\n\\n\");\n return text.length > MAX_SUMMARY_INPUT ? text.slice(-MAX_SUMMARY_INPUT) : text;\n}\n\n/**\n * Summarize the older middle of a conversation into a single message, preserving\n * the system prompt and the most recent messages. Returns the original array\n * (unchanged) when there is too little to compact or the cut is unsafe.\n */\nexport async function compactHistory(\n messages: Message[],\n agent: ResolvedAgent,\n signal?: AbortSignal,\n): Promise<Message[]> {\n if (messages.length === 0) return messages;\n const system = messages[0]!.role === \"system\" ? messages[0]! : undefined;\n const startIdx = system ? 1 : 0;\n\n const cut = findSafeCut(messages);\n if (cut >= messages.length) return messages; // no safe tail to keep\n const middle = messages.slice(startIdx, cut);\n if (middle.length < MIN_TO_COMPACT) return messages;\n const tail = messages.slice(cut);\n\n const summary = await agent.provider.chat({\n messages: [\n {\n role: \"system\",\n content:\n \"You compress a coding agent's conversation so it can continue with less context. \" +\n \"Summarize the messages below into a concise but information-dense brief that preserves: \" +\n \"the original task and goal, key decisions, files created/edited and why, important command/test \" +\n \"outputs, and any remaining TODOs or open problems. Use terse bullet points. Do not invent details.\",\n },\n { role: \"user\", content: serialize(middle) },\n ],\n signal,\n });\n\n const summaryMessage: Message = {\n role: \"user\",\n content: `[Summary of earlier conversation, compacted to save context]\\n${summary.content.trim()}`,\n };\n\n return system ? [system, summaryMessage, ...tail] : [summaryMessage, ...tail];\n}\n","import { exec } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport type { ToolCall } from \"../providers/types.js\";\n\nconst execAsync = promisify(exec);\nconst HOOK_TIMEOUT = 120_000;\n\nconst HooksSchema = z.object({\n /** Shell command run after a successful write_file. `{path}` is substituted. */\n afterWrite: z.string().optional(),\n /** Shell command run after a successful edit_file. `{path}` is substituted. */\n afterEdit: z.string().optional(),\n /** Shell command run after any successful mutating tool. `{tool}`/`{path}` substituted. */\n afterTool: z.string().optional(),\n /** Block run_command when the command contains any of these substrings. */\n beforeCommand: z.object({ deny: z.array(z.string()).default([]) }).optional(),\n});\n\nexport type HooksConfig = z.infer<typeof HooksSchema>;\n\n/** Load `.poly/hooks.json` for a workspace, or undefined if absent/invalid. */\nexport async function loadHooks(workspace: string): Promise<HooksConfig | undefined> {\n try {\n const raw = await readFile(join(workspace, \".poly\", \"hooks.json\"), \"utf8\");\n const parsed = HooksSchema.safeParse(JSON.parse(raw));\n return parsed.success ? parsed.data : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Decide whether a command is blocked by the user's beforeCommand deny-list. */\nexport function screenCommandHook(hooks: HooksConfig | undefined, command: string): { blocked: boolean; reason?: string } {\n const deny = hooks?.beforeCommand?.deny ?? [];\n for (const needle of deny) {\n if (needle && command.includes(needle)) {\n return { blocked: true, reason: `matches deny rule \"${needle}\"` };\n }\n }\n return { blocked: false };\n}\n\nfunction substitute(template: string, call: ToolCall): string {\n const path = typeof call.arguments.path === \"string\" ? call.arguments.path : \"\";\n return template.replace(/\\{path\\}/g, path).replace(/\\{tool\\}/g, call.name);\n}\n\n/**\n * Run post-tool hooks for a successful mutating tool call. Returns a short note\n * to append to the tool result (e.g. \"↪ hook afterWrite ok\"), or undefined.\n */\nexport async function runAfterHook(\n hooks: HooksConfig | undefined,\n call: ToolCall,\n workspace: string,\n): Promise<string | undefined> {\n if (!hooks) return undefined;\n const commands: { label: string; cmd: string }[] = [];\n if (call.name === \"write_file\" && hooks.afterWrite) commands.push({ label: \"afterWrite\", cmd: hooks.afterWrite });\n if (call.name === \"edit_file\" && hooks.afterEdit) commands.push({ label: \"afterEdit\", cmd: hooks.afterEdit });\n if (hooks.afterTool) commands.push({ label: \"afterTool\", cmd: hooks.afterTool });\n if (commands.length === 0) return undefined;\n\n const notes: string[] = [];\n for (const { label, cmd } of commands) {\n const resolved = substitute(cmd, call);\n try {\n await execAsync(resolved, { cwd: workspace, timeout: HOOK_TIMEOUT, windowsHide: true });\n notes.push(`↪ hook ${label} ok`);\n } catch (err) {\n notes.push(`↪ hook ${label} failed: ${(err as Error).message.split(\"\\n\")[0]}`);\n }\n }\n return notes.join(\"\\n\");\n}\n","import { makeDriver } from \"../protocol/emulated.js\";\nimport type { PromptContext } from \"../protocol/system-prompt.js\";\nimport type { PermissionEngine } from \"../permissions/modes.js\";\nimport type { ResolvedAgent } from \"../providers/registry.js\";\nimport type { ChatParams, Message, ToolCall } from \"../providers/types.js\";\nimport { getTool, toolSpecs } from \"../tools/registry.js\";\nimport type { Tool, ToolResult } from \"../tools/types.js\";\nimport { buildCorrection, makeLLMEscalator, truncationGuidance } from \"./correction.js\";\nimport { loadProjectInstructions } from \"./project-context.js\";\nimport { compactHistory, estimateTokens } from \"./compaction.js\";\nimport { runAfterHook, screenCommandHook, type HooksConfig } from \"./hooks.js\";\n\nexport interface Usage {\n promptTokens: number;\n completionTokens: number;\n}\n\nexport interface AgentEvents {\n onAssistantText?(text: string): void;\n /** Fired for each streamed text chunk (native mode only) before onAssistantText. */\n onAssistantDelta?(text: string): void;\n onToolCall?(call: ToolCall): void;\n onToolResult?(call: ToolCall, result: ToolResult): void;\n onReprompt?(attempt: number): void;\n /** Fired when auto-correction enriches a failed tool result with guidance. */\n onCorrection?(call: ToolCall, guidance: string): void;\n onStep?(step: number): void;\n /** Cumulative token usage so far this run. */\n onUsage?(usage: Usage): void;\n /** Fired when old history is summarized to free up context (token counts). */\n onCompaction?(before: number, after: number): void;\n}\n\nexport interface RunOptions {\n task: string;\n workspace: string;\n agent: ResolvedAgent;\n permissions: PermissionEngine;\n promptContext: PromptContext;\n params?: ChatParams;\n maxSteps?: number;\n maxReprompts?: number;\n /** Stop after this many consecutive identical tool failures (default 3). */\n maxToolRetries?: number;\n /** Enrich failed tool results with corrective guidance so the model can self-heal (default true). */\n autoCorrect?: boolean;\n /** Summarize old history when the prompt grows past this many tokens (0 disables). */\n compactThresholdTokens?: number;\n /** User-declared custom tools (from `.poly/tools/*.json`) available to the agent. */\n extraTools?: Tool[];\n /** Pre/post-tool hooks (from `.poly/hooks.json`). */\n hooks?: HooksConfig;\n /** Abort the run (e.g. user pressed ESC). */\n signal?: AbortSignal;\n events?: AgentEvents;\n /** Seed history (used to continue an interactive session). */\n history?: Message[];\n}\n\nexport type RunReason = \"finished\" | \"reply\" | \"stalled\" | \"maxsteps\" | \"cancelled\";\n\nexport interface RunResult {\n finished: boolean;\n /** Why the turn ended: completed, a plain conversational reply, a stall, or step limit. */\n reason: RunReason;\n summary?: string;\n steps: number;\n messages: Message[];\n usage: Usage;\n}\n\n/**\n * Heuristic: does a no-tool-call response look like the model refusing or merely\n * promising action (a stall worth nudging), as opposed to normal conversation?\n */\nfunction looksLikeStall(text: string): boolean {\n const lc = text.toLowerCase();\n const markers = [\n \"i can't\", \"i cannot\", \"i can not\", \"i'm unable\", \"i am unable\", \"unable to\",\n \"cannot create\", \"can't create\", \"cannot write\", \"can't write\", \"not allowed\",\n \"i'll create\", \"i will create\", \"let me create\", \"i'll write\", \"i will write\",\n \"não posso\", \"nao posso\", \"não consigo\", \"nao consigo\", \"não tenho permiss\",\n \"nao tenho permiss\", \"não é possível\", \"nao e possivel\", \"vou criar\", \"irei criar\",\n \"vou escrever\", \"deixe-me\", \"deixa eu\",\n ];\n return markers.some((m) => lc.includes(m));\n}\n\n/** Drive one task to completion (or until limits are hit). */\nexport async function runAgent(opts: RunOptions): Promise<RunResult> {\n const { agent, permissions, events } = opts;\n const maxSteps = opts.maxSteps ?? 30;\n const maxReprompts = opts.maxReprompts ?? 3;\n\n // Merge user-declared custom tools with the built-ins (finish stays last).\n const extra = opts.extraTools ?? [];\n const extraByName = new Map(extra.map((tl) => [tl.spec.name, tl]));\n const baseSpecs = toolSpecs();\n const finishSpec = baseSpecs[baseSpecs.length - 1]!;\n const allSpecs = [...baseSpecs.slice(0, -1), ...extra.map((tl) => tl.spec), finishSpec];\n const resolveTool = (name: string): Tool | undefined => extraByName.get(name) ?? getTool(name);\n\n const driver = makeDriver(agent.toolMode, allSpecs);\n const ctx = { workspace: opts.workspace, permissions };\n\n const seeding = !(opts.history && opts.history.length > 0);\n // On a fresh conversation, auto-load project operating instructions\n // (.poly/agents.md / AGENTS.md) into the system prompt unless the caller\n // already supplied them. Continued sessions keep the original system message.\n const promptContext =\n seeding && opts.promptContext.projectInstructions === undefined\n ? { ...opts.promptContext, projectInstructions: await loadProjectInstructions(opts.workspace) }\n : opts.promptContext;\n\n const messages: Message[] = seeding\n ? [\n { role: \"system\", content: driver.systemPrompt(promptContext) },\n { role: \"user\", content: opts.task },\n ]\n : [...opts.history!, { role: \"user\", content: opts.task }];\n\n let consecutiveNoTool = 0;\n let lastFailSig = \"\";\n let failStreak = 0;\n const maxToolRetries = opts.maxToolRetries ?? 3;\n const autoCorrect = opts.autoCorrect ?? true;\n const usage: Usage = { promptTokens: 0, completionTokens: 0 };\n const compactThreshold = opts.compactThresholdTokens ?? 0;\n let lastPromptTokens = 0;\n\n for (let step = 1; step <= maxSteps; step++) {\n if (opts.signal?.aborted) return { finished: false, reason: \"cancelled\", steps: step - 1, messages, usage };\n events?.onStep?.(step);\n\n // Auto-compact: when the prompt grows past the threshold, summarize old\n // history into one message, preserving the system prompt and recent turns.\n if (compactThreshold > 0) {\n const current = lastPromptTokens || estimateTokens(messages);\n if (current >= compactThreshold) {\n const compacted = await compactHistory(messages, agent, opts.signal);\n if (compacted.length < messages.length) {\n messages.splice(0, messages.length, ...compacted);\n lastPromptTokens = estimateTokens(messages);\n events?.onCompaction?.(current, lastPromptTokens);\n }\n }\n }\n\n // Stream live tokens only in native mode (emulated would leak raw XML) and\n // only when a consumer is listening (e.g. not in --json mode).\n const wantDelta = driver.kind === \"native\" && typeof events?.onAssistantDelta === \"function\";\n\n let response;\n try {\n response = await agent.provider.chat({\n messages,\n tools: driver.providerTools(),\n params: opts.params,\n signal: opts.signal,\n onDelta: wantDelta ? (chunk) => events!.onAssistantDelta!(chunk) : undefined,\n });\n } catch (err) {\n if (opts.signal?.aborted) return { finished: false, reason: \"cancelled\", steps: step, messages, usage };\n throw err;\n }\n usage.promptTokens += response.usage?.promptTokens ?? 0;\n usage.completionTokens += response.usage?.completionTokens ?? 0;\n lastPromptTokens = response.usage?.promptTokens ?? estimateTokens(messages);\n events?.onUsage?.(usage);\n const { toolCalls, text } = driver.parse(response);\n messages.push(driver.assistantMessage(response, toolCalls));\n if (text) events?.onAssistantText?.(text);\n\n // The model's output was cut off at the token limit — its tool call (if any)\n // is incomplete. Surfaced as guidance so it can recover by splitting output.\n const truncated = response.finishReason === \"length\" || response.finishReason === \"max_tokens\";\n\n if (toolCalls.length === 0) {\n // Cut off before producing any tool call (e.g. a half-written file dump).\n if (truncated && autoCorrect) {\n if (consecutiveNoTool < maxReprompts) {\n consecutiveNoTool++;\n const guidance = truncationGuidance();\n events?.onCorrection?.({ id: \"trunc\", name: \"\", arguments: {} }, guidance);\n messages.push({ role: \"user\", content: guidance });\n continue;\n }\n return { finished: false, reason: \"stalled\", steps: step, messages, usage };\n }\n const stalled = text.trim().length === 0 || looksLikeStall(text);\n if (stalled) {\n // The \"yes, you can act\" reinforcement loop for models that refuse/stall.\n if (consecutiveNoTool < maxReprompts) {\n consecutiveNoTool++;\n events?.onReprompt?.(consecutiveNoTool);\n messages.push(driver.repromptMessage());\n continue;\n }\n return { finished: false, reason: \"stalled\", steps: step, messages, usage };\n }\n // A normal conversational reply — hand control back to the user, no nagging.\n return { finished: false, reason: \"reply\", steps: step, messages, usage };\n }\n consecutiveNoTool = 0;\n\n for (const call of toolCalls) {\n if (opts.signal?.aborted) return { finished: false, reason: \"cancelled\", steps: step, messages, usage };\n events?.onToolCall?.(call);\n\n if (call.name === \"finish\") {\n const summary = String(call.arguments.summary ?? \"\").trim();\n return { finished: true, reason: \"finished\", summary, steps: step, messages, usage };\n }\n\n const tool = resolveTool(call.name);\n // Pre-tool hook: the user's beforeCommand deny-list can block a command.\n const hookScreen =\n call.name === \"run_command\"\n ? screenCommandHook(opts.hooks, String(call.arguments.command ?? \"\"))\n : { blocked: false as const };\n\n let result: ToolResult;\n if (hookScreen.blocked) {\n result = { ok: false, output: `Command blocked by hook: ${hookScreen.reason}` };\n } else if (tool) {\n result = await tool.run(call.arguments, ctx);\n // Post-tool hook: e.g. format a file after a successful write/edit.\n if (result.ok) {\n const note = await runAfterHook(opts.hooks, call, opts.workspace);\n if (note) result = { ...result, output: `${result.output}\\n${note}` };\n }\n } else {\n result = { ok: false, output: `Unknown tool \"${call.name}\". Available: ${allSpecs.map((t) => t.name).join(\", \")}` };\n }\n\n events?.onToolResult?.(call, result);\n\n const sig = `${call.name}:${JSON.stringify(call.arguments)}`;\n let resultText = result.output;\n // Auto-correction: on failure, enrich the raw error with its likely cause\n // and the missing context so the model can fix its own call instead of\n // looping on it until the stall guard trips.\n if (!result.ok && autoCorrect) {\n const guidance = await buildCorrection(call, result.output, {\n workspace: opts.workspace,\n allow: opts.promptContext.allow,\n toolSpec: tool?.spec,\n truncated,\n // Only spend a fixer-LLM call once the model has already repeated a\n // failing call — the first failure gets deterministic help for free.\n escalate: sig === lastFailSig ? makeLLMEscalator(agent.provider) : undefined,\n });\n if (guidance) {\n resultText = `${result.output}\\n\\n${guidance}`;\n events?.onCorrection?.(call, guidance);\n }\n } else if (result.ok && truncated && autoCorrect) {\n // The call \"succeeded\" but the response was cut off, so the written file\n // is likely incomplete — flag it so the model can finish/repair it.\n const guidance = truncationGuidance(call.name);\n resultText = `${result.output}\\n\\n${guidance}`;\n events?.onCorrection?.(call, guidance);\n }\n messages.push(driver.toolResultMessage(call, resultText));\n\n // Break out of a loop where the same tool call keeps failing identically.\n if (result.ok) {\n failStreak = 0;\n lastFailSig = \"\";\n } else {\n failStreak = sig === lastFailSig ? failStreak + 1 : 1;\n lastFailSig = sig;\n if (failStreak >= maxToolRetries) {\n return { finished: false, reason: \"stalled\", steps: step, messages, usage };\n }\n }\n }\n }\n\n return { finished: false, reason: \"maxsteps\", steps: maxSteps, messages, usage };\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { checkPath, type PathPolicy } from \"../permissions/allowlist.js\";\nimport { t } from \"../i18n/index.js\";\n\n/** Max characters injected per referenced file (truncated beyond this). */\nconst MAX_FILE_CHARS = 10_000;\n\n/**\n * Matches `@path` mentions: an `@` at the start or after whitespace, followed by\n * a path-like token (letters, digits, `. / _ -`). A trailing `/` marks a directory.\n */\nconst MENTION_RE = /(?:^|\\s)@([\\w./-]+)/g;\n\nexport interface MentionResult {\n /** The task text with a \"Referenced files\" block appended (unchanged if no valid mentions). */\n task: string;\n /** Workspace-relative paths that were resolved and injected. */\n injected: string[];\n}\n\n/**\n * Resolve `@file` / `@dir/` mentions in a task and append their contents/listing\n * as explicit context. Paths are resolved against the allow-list; missing or\n * denied ones are skipped (noted inline). `@symbol` lookups are out of scope\n * until a repository index exists.\n */\nexport async function resolveMentions(task: string, policy: PathPolicy): Promise<MentionResult> {\n const tokens = [...task.matchAll(MENTION_RE)].map((m) => m[1]!);\n const unique = [...new Set(tokens)];\n if (unique.length === 0) return { task, injected: [] };\n\n const blocks: string[] = [];\n const injected: string[] = [];\n\n for (const token of unique) {\n const decision = checkPath(policy, token);\n if (!decision.allowed) {\n blocks.push(`## @${token}\\n${t(\"mentions.notFound\", { path: token })}`);\n continue;\n }\n const abs = resolve(policy.workspace, token);\n try {\n const info = await stat(abs);\n if (info.isDirectory()) {\n const entries = await readdir(abs, { withFileTypes: true });\n const listing = entries\n .map((e) => (e.isDirectory() ? `${e.name}/` : e.name))\n .sort()\n .join(\"\\n\");\n blocks.push(`## ${t(\"mentions.dirHeader\", { path: decision.rel })}\\n${listing || \"(empty)\"}`);\n injected.push(decision.rel);\n } else {\n const raw = await readFile(abs, \"utf8\");\n const content = raw.length > MAX_FILE_CHARS ? raw.slice(0, MAX_FILE_CHARS) + \"\\n…[truncated]\" : raw;\n blocks.push(`## @${decision.rel}\\n\\`\\`\\`\\n${content}\\n\\`\\`\\``);\n injected.push(decision.rel);\n }\n } catch {\n blocks.push(`## @${token}\\n${t(\"mentions.notFound\", { path: token })}`);\n }\n }\n\n if (injected.length === 0) return { task, injected: [] };\n\n const augmented = `${task}\\n\\n--- ${t(\"mentions.injectedHeader\")} ---\\n\\n${blocks.join(\"\\n\\n\")}`;\n return { task: augmented, injected };\n}\n","import { exec } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst execAsync = promisify(exec);\nconst MAX_OUTPUT = 8_000;\n\nexport interface CheckResult {\n command: string;\n ok: boolean;\n output: string;\n}\n\n/** npm scripts we treat as verification checks, in the order they should run. */\nconst CHECK_SCRIPTS = [\"typecheck\", \"build\", \"test\"] as const;\n\n/**\n * Detect verification commands for a workspace. Today this reads `package.json`\n * scripts and picks the standard checks (`typecheck`, `build`, `test`). Returns\n * an empty array when there is nothing sensible to run.\n */\nexport async function detectChecks(workspace: string): Promise<string[]> {\n try {\n const raw = await readFile(resolve(workspace, \"package.json\"), \"utf8\");\n const scripts = (JSON.parse(raw) as { scripts?: Record<string, string> }).scripts ?? {};\n return CHECK_SCRIPTS.filter((s) => typeof scripts[s] === \"string\").map((s) => `npm run ${s}`);\n } catch {\n return [];\n }\n}\n\n/** Run the given commands in the workspace, capturing pass/fail and output. */\nexport async function runChecks(workspace: string, commands: string[]): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n for (const command of commands) {\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: workspace,\n timeout: 300_000,\n maxBuffer: 10 * 1024 * 1024,\n windowsHide: true,\n });\n results.push({ command, ok: true, output: clamp(`${stdout}${stderr ? `\\n${stderr}` : \"\"}`.trim()) });\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string };\n const body = `${e.stdout ?? \"\"}${e.stderr ?? \"\"}`.trim() || e.message;\n results.push({ command, ok: false, output: clamp(body) });\n }\n }\n return results;\n}\n\n/** Build the corrective message fed back to the agent when checks fail. */\nexport function buildVerifyFeedback(failed: CheckResult[]): string {\n const blocks = failed\n .map((f) => `$ ${f.command}\\n${f.output}`)\n .join(\"\\n\\n\");\n return [\n \"Verification failed. The following checks did not pass:\",\n \"\",\n blocks,\n \"\",\n \"Fix the underlying problem in the code (do not disable or skip the checks), then call `finish`.\",\n ].join(\"\\n\");\n}\n\nfunction clamp(s: string): string {\n return s.length > MAX_OUTPUT ? s.slice(-MAX_OUTPUT) : s;\n}\n","import { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { AgentConfig } from \"../config/schema.js\";\nimport { configDir, resolveSecret } from \"../config/store.js\";\nimport { listOpenRouterModels, type OpenRouterModel } from \"../providers/openrouter.js\";\nimport type { Usage } from \"./loop.js\";\n\n/** USD per 1M tokens, prompt and completion. */\nexport interface ModelPricing {\n promptPrice: number;\n completionPrice: number;\n}\n\nlet catalogCache: Promise<OpenRouterModel[]> | undefined;\n\n/**\n * Resolve per-token pricing for an agent's model. Currently only OpenRouter\n * advertises a public price catalog; other providers return undefined (cost is\n * simply not estimated). Network/parse failures degrade to undefined.\n */\nexport async function resolveModelPricing(agent: AgentConfig): Promise<ModelPricing | undefined> {\n if (agent.provider !== \"openrouter\") return undefined;\n try {\n catalogCache ??= listOpenRouterModels(resolveSecret(agent.apiKey));\n const models = await catalogCache;\n const m = models.find((x) => x.id === agent.model);\n if (!m || m.promptPrice < 0 || m.completionPrice < 0) return undefined;\n return { promptPrice: m.promptPrice, completionPrice: m.completionPrice };\n } catch {\n return undefined;\n }\n}\n\n/** Estimate the USD cost of a token usage given per-1M pricing. */\nexport function estimateCost(usage: Usage, pricing: ModelPricing): number {\n return (\n (usage.promptTokens / 1_000_000) * pricing.promptPrice +\n (usage.completionTokens / 1_000_000) * pricing.completionPrice\n );\n}\n\n/** Format a USD amount compactly, with extra precision for sub-cent costs. */\nexport function fmtUsd(n: number): string {\n if (n <= 0) return \"US$0.00\";\n if (n < 0.01) return `US$${n.toFixed(4)}`;\n return `US$${n.toFixed(2)}`;\n}\n\nexport function usagePath(): string {\n return join(configDir(), \"usage.jsonl\");\n}\n\nexport interface UsageEntry {\n ts: string;\n agent: string;\n provider: string;\n model: string;\n promptTokens: number;\n completionTokens: number;\n costUsd: number;\n}\n\n/** Append a usage record to ~/.polypus/usage.jsonl (best-effort; never throws). */\nexport async function recordUsage(entry: UsageEntry): Promise<void> {\n try {\n await mkdir(configDir(), { recursive: true });\n await appendFile(usagePath(), JSON.stringify(entry) + \"\\n\", \"utf8\");\n } catch {\n /* analytics are best-effort — ignore write failures */\n }\n}\n\nexport interface UsageBucket {\n date: string;\n promptTokens: number;\n completionTokens: number;\n costUsd: number;\n runs: number;\n}\n\n/** Aggregate the usage log by calendar day, plus a grand total. */\nexport async function aggregateUsage(): Promise<{ days: UsageBucket[]; total: UsageBucket }> {\n let text = \"\";\n try {\n text = await readFile(usagePath(), \"utf8\");\n } catch {\n return { days: [], total: emptyBucket(\"total\") };\n }\n const byDay = new Map<string, UsageBucket>();\n const total = emptyBucket(\"total\");\n for (const line of text.split(\"\\n\")) {\n if (!line.trim()) continue;\n let e: UsageEntry;\n try {\n e = JSON.parse(line) as UsageEntry;\n } catch {\n continue;\n }\n const date = (e.ts ?? \"\").slice(0, 10) || \"unknown\";\n const bucket = byDay.get(date) ?? emptyBucket(date);\n accumulate(bucket, e);\n byDay.set(date, bucket);\n accumulate(total, e);\n }\n const days = [...byDay.values()].sort((a, b) => a.date.localeCompare(b.date));\n return { days, total };\n}\n\nfunction emptyBucket(date: string): UsageBucket {\n return { date, promptTokens: 0, completionTokens: 0, costUsd: 0, runs: 0 };\n}\n\nfunction accumulate(bucket: UsageBucket, e: UsageEntry): void {\n bucket.promptTokens += e.promptTokens ?? 0;\n bucket.completionTokens += e.completionTokens ?? 0;\n bucket.costUsd += e.costUsd ?? 0;\n bucket.runs += 1;\n}\n","/** Discovery + filtering for OpenRouter's public model catalog. */\n\nconst MODELS_URL = \"https://openrouter.ai/api/v1/models\";\n\nexport interface OpenRouterModel {\n id: string;\n name: string;\n /** USD per 1M prompt tokens. */\n promptPrice: number;\n /** USD per 1M completion tokens. */\n completionPrice: number;\n contextLength: number;\n /** True when the model advertises native tool/function-calling. */\n supportsTools: boolean;\n /** True when both prompt and completion are free. */\n free: boolean;\n}\n\ninterface RawModel {\n id?: string;\n name?: string;\n context_length?: number;\n pricing?: { prompt?: string; completion?: string };\n supported_parameters?: string[];\n}\n\n/**\n * Fetch the OpenRouter model catalog. The endpoint is public; an API key is\n * optional. Throws on network/HTTP errors so callers can show a message.\n */\nexport async function listOpenRouterModels(\n apiKey?: string,\n timeoutMs = 8000,\n): Promise<OpenRouterModel[]> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(MODELS_URL, {\n signal: controller.signal,\n headers: apiKey ? { authorization: `Bearer ${apiKey}` } : {},\n });\n if (!res.ok) throw new Error(`OpenRouter ${res.status}: ${await res.text().catch(() => \"\")}`);\n const data = (await res.json()) as { data?: RawModel[] };\n return (data.data ?? []).map(normalize).filter((m) => m.id.length > 0);\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction normalize(m: RawModel): OpenRouterModel {\n const promptPrice = toPerMillion(m.pricing?.prompt);\n const completionPrice = toPerMillion(m.pricing?.completion);\n return {\n id: m.id ?? \"\",\n name: m.name ?? m.id ?? \"\",\n promptPrice,\n completionPrice,\n contextLength: m.context_length ?? 0,\n supportsTools: (m.supported_parameters ?? []).includes(\"tools\"),\n free: promptPrice === 0 && completionPrice === 0,\n };\n}\n\n/** OpenRouter prices are USD per token (string). Convert to USD per 1M tokens. */\nfunction toPerMillion(price: string | undefined): number {\n const n = Number(price ?? \"0\");\n return Number.isFinite(n) ? n * 1_000_000 : 0;\n}\n\nexport type ModelSort = \"price\" | \"price-desc\" | \"context\" | \"name\";\n\nexport interface ModelFilter {\n search?: string;\n /** \"any\" | \"tools\" (only with tools) | \"no-tools\" (only without). */\n tools?: \"any\" | \"tools\" | \"no-tools\";\n freeOnly?: boolean;\n /** Max prompt price in USD per 1M tokens. */\n maxPrice?: number;\n sort?: ModelSort;\n}\n\n/** Apply filters + sorting to a model list (pure; safe to call repeatedly). */\nexport function filterModels(models: OpenRouterModel[], f: ModelFilter): OpenRouterModel[] {\n const term = f.search?.trim().toLowerCase();\n let out = models.filter((m) => {\n if (term && !m.id.toLowerCase().includes(term) && !m.name.toLowerCase().includes(term)) {\n return false;\n }\n if (f.tools === \"tools\" && !m.supportsTools) return false;\n if (f.tools === \"no-tools\" && m.supportsTools) return false;\n if (f.freeOnly && !m.free) return false;\n // Negative price = variable/\"auto\" router pricing → excluded when capping price.\n if (f.maxPrice !== undefined && (m.promptPrice < 0 || m.promptPrice > f.maxPrice)) return false;\n return true;\n });\n\n // Variable-priced models sort to the end of price-based ordering.\n const key = (m: OpenRouterModel) => (m.promptPrice < 0 ? Number.POSITIVE_INFINITY : m.promptPrice);\n const sort = f.sort ?? \"price\";\n out = out.sort((a, b) => {\n switch (sort) {\n case \"price-desc\":\n return key(b) - key(a);\n case \"context\":\n return b.contextLength - a.contextLength;\n case \"name\":\n return a.id.localeCompare(b.id);\n default:\n return key(a) - key(b);\n }\n });\n return out;\n}\n\n/** Format a price (USD per 1M tokens) compactly, e.g. \"$3\", \"$0.15\", \"free\". */\nexport function fmtPrice(perMillion: number): string {\n if (perMillion < 0) return \"var\";\n if (perMillion === 0) return \"free\";\n if (perMillion < 1) return `$${perMillion.toFixed(2)}`;\n if (perMillion < 100) return `$${perMillion.toFixed(perMillion % 1 ? 1 : 0)}`;\n return `$${Math.round(perMillion)}`;\n}\n\n/** Format a context length, e.g. \"200k\", \"1M\", \"1.5M\". */\nexport function fmtContext(n: number): string {\n if (n >= 1_000_000) return `${Math.round(n / 100_000) / 10}M`;\n if (n >= 1000) return `${Math.round(n / 1000)}k`;\n return String(n);\n}\n","import { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PermissionMode } from \"../config/schema.js\";\nimport { configDir } from \"../config/store.js\";\nimport { redactSecrets } from \"../permissions/policy.js\";\nimport type { Message } from \"../providers/types.js\";\n\nexport interface SessionRecord {\n id: string;\n /** ISO timestamp of the last update. */\n updatedAt: string;\n /** Short title (the first user task), for listings. */\n title: string;\n agentName: string;\n mode: PermissionMode;\n messages: Message[];\n}\n\nexport interface SessionSummary {\n id: string;\n updatedAt: string;\n title: string;\n agentName: string;\n mode: PermissionMode;\n messageCount: number;\n}\n\nexport function sessionsDir(): string {\n return join(configDir(), \"sessions\");\n}\n\n/** Create a sortable, filesystem-safe session id from the current time. */\nexport function newSessionId(): string {\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const rand = Math.random().toString(36).slice(2, 6);\n return `${stamp}-${rand}`;\n}\n\nfunction sessionPath(id: string): string {\n return join(sessionsDir(), `${id}.json`);\n}\n\n/** Persist a session, redacting obvious secrets from message contents. */\nexport async function saveSession(record: SessionRecord): Promise<void> {\n await mkdir(sessionsDir(), { recursive: true });\n const safe: SessionRecord = {\n ...record,\n messages: record.messages.map((m) => ({ ...m, content: redactSecrets(m.content) })),\n };\n await writeFile(sessionPath(record.id), JSON.stringify(safe, null, 2) + \"\\n\", \"utf8\");\n}\n\n/** Load a session by id, or undefined if it does not exist / is unreadable. */\nexport async function loadSession(id: string): Promise<SessionRecord | undefined> {\n try {\n return JSON.parse(await readFile(sessionPath(id), \"utf8\")) as SessionRecord;\n } catch {\n return undefined;\n }\n}\n\n/** List saved sessions, most recently updated first. */\nexport async function listSessions(): Promise<SessionSummary[]> {\n let files: string[];\n try {\n files = (await readdir(sessionsDir())).filter((f) => f.endsWith(\".json\"));\n } catch {\n return [];\n }\n const summaries: SessionSummary[] = [];\n for (const f of files) {\n try {\n const r = JSON.parse(await readFile(join(sessionsDir(), f), \"utf8\")) as SessionRecord;\n summaries.push({\n id: r.id,\n updatedAt: r.updatedAt,\n title: r.title,\n agentName: r.agentName,\n mode: r.mode,\n messageCount: r.messages?.length ?? 0,\n });\n } catch {\n /* skip corrupt session files */\n }\n }\n return summaries.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n}\n\n/** The most recently updated session, if any (used by `run --continue`). */\nexport async function latestSession(): Promise<SessionRecord | undefined> {\n const [latest] = await listSessions();\n return latest ? loadSession(latest.id) : undefined;\n}\n\n/** Derive a short title from the first user message of a history. */\nexport function deriveTitle(messages: Message[]): string {\n const firstUser = messages.find((m) => m.role === \"user\");\n const text = (firstUser?.content ?? \"\").replace(/\\s+/g, \" \").trim();\n return text.length > 60 ? text.slice(0, 60) + \"…\" : text || \"(untitled)\";\n}\n","import { exec } from \"node:child_process\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_OUTPUT = 20_000;\n\nconst CustomToolSchema = z.object({\n name: z.string().min(1).regex(/^[a-z][a-z0-9_]*$/i, \"tool name must be alphanumeric/underscore\"),\n description: z.string().min(1),\n /** JSON-schema object for the tool parameters (advertised to the model). */\n parameters: z.record(z.unknown()).optional(),\n /** Shell command template; `{argName}` placeholders are filled from the call arguments. */\n command: z.string().min(1),\n});\n\nexport type CustomToolDef = z.infer<typeof CustomToolSchema>;\n\n/** Build an executable Tool from a declarative definition. Runs through the permission engine. */\nexport function makeCommandTool(def: CustomToolDef): Tool {\n return {\n mutating: true,\n spec: {\n name: def.name,\n description: def.description,\n parameters: (def.parameters as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n },\n async run(rawArgs, ctx) {\n const command = fillTemplate(def.command, rawArgs);\n const decision = await ctx.permissions.authorizeCommand(command);\n if (!decision.allowed) return { ok: false, output: `Command denied: ${decision.reason}` };\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: ctx.workspace,\n timeout: 120_000,\n maxBuffer: 10 * 1024 * 1024,\n windowsHide: true,\n });\n return { ok: true, output: clamp(`${stdout}${stderr ? `\\n[stderr]\\n${stderr}` : \"\"}`.trim() || \"(no output)\") };\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string; code?: number };\n return {\n ok: false,\n output: clamp(`Command failed (exit ${e.code ?? \"?\"}): ${e.message}\\n${e.stdout ?? \"\"}${e.stderr ?? \"\"}`),\n };\n }\n },\n };\n}\n\n/** Load custom tools declared in `.poly/tools/*.json`. Invalid files are skipped. */\nexport async function loadCustomTools(workspace: string): Promise<Tool[]> {\n let files: string[];\n try {\n files = (await readdir(join(workspace, \".poly\", \"tools\"))).filter((f) => f.endsWith(\".json\"));\n } catch {\n return [];\n }\n const tools: Tool[] = [];\n for (const f of files) {\n try {\n const raw = await readFile(join(workspace, \".poly\", \"tools\", f), \"utf8\");\n const parsed = CustomToolSchema.safeParse(JSON.parse(raw));\n if (parsed.success) tools.push(makeCommandTool(parsed.data));\n } catch {\n /* skip malformed tool file */\n }\n }\n return tools;\n}\n\n/** Replace `{arg}` placeholders with the matching string argument values. */\nfunction fillTemplate(template: string, args: Record<string, unknown>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n const v = args[key];\n return v === undefined || v === null ? \"\" : String(v);\n });\n}\n\nfunction clamp(s: string): string {\n return s.length > MAX_OUTPUT ? s.slice(0, MAX_OUTPUT) + \"\\n…[truncated]\" : s;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../tools/types.js\";\nimport { McpClient } from \"./client.js\";\n\nconst ServerSchema = z.object({\n command: z.string().min(1),\n args: z.array(z.string()).default([]),\n env: z.record(z.string()).default({}),\n});\nconst McpConfigSchema = z.object({\n mcpServers: z.record(ServerSchema).default({}),\n});\n\nexport type McpServerConfig = z.infer<typeof ServerSchema>;\n\nconst MAX_OUTPUT = 20_000;\n\nexport interface LoadedMcp {\n /** External tools, namespaced `mcp__<server>__<tool>`, ready for the agent loop. */\n tools: Tool[];\n /** Server names that connected. */\n servers: string[];\n /** Shut down every spawned MCP server. */\n close: () => Promise<void>;\n}\n\n/**\n * Load and connect the MCP servers declared in `.poly/mcp.json`, returning their\n * tools wrapped as Polypus tools. Servers that fail to start are skipped (never\n * throws). Tool names are namespaced to avoid clashes with built-ins/each other.\n */\nexport async function loadMcpTools(workspace: string): Promise<LoadedMcp> {\n let raw: string;\n try {\n raw = await readFile(join(workspace, \".poly\", \"mcp.json\"), \"utf8\");\n } catch {\n return { tools: [], servers: [], close: async () => {} };\n }\n const parsed = McpConfigSchema.safeParse(safeJson(raw));\n if (!parsed.success) return { tools: [], servers: [], close: async () => {} };\n\n const clients: McpClient[] = [];\n const tools: Tool[] = [];\n const servers: string[] = [];\n\n for (const [name, cfg] of Object.entries(parsed.data.mcpServers)) {\n const client = new McpClient(cfg.command, cfg.args, cfg.env);\n try {\n await client.initialize();\n const defs = await client.listTools();\n for (const def of defs) tools.push(wrapTool(name, client, def.name, def.description, def.inputSchema));\n clients.push(client);\n servers.push(name);\n } catch {\n await client.close().catch(() => {});\n }\n }\n\n return {\n tools,\n servers,\n close: async () => {\n await Promise.all(clients.map((c) => c.close().catch(() => {})));\n },\n };\n}\n\nfunction wrapTool(\n server: string,\n client: McpClient,\n toolName: string,\n description: string | undefined,\n inputSchema: Record<string, unknown> | undefined,\n): Tool {\n return {\n mutating: true,\n spec: {\n name: `mcp__${server}__${toolName}`,\n description: `[MCP:${server}] ${description ?? toolName}`,\n parameters: inputSchema ?? { type: \"object\", properties: {} },\n },\n async run(args, ctx) {\n // External MCP tools can have side effects; disable them in read-only plan mode.\n if (ctx.permissions.mode === \"plan\") {\n return { ok: false, output: \"plan mode: external MCP tools are disabled\" };\n }\n const { ok, text } = await client.callTool(toolName, args);\n return { ok, output: text.length > MAX_OUTPUT ? text.slice(0, MAX_OUTPUT) + \"\\n…[truncated]\" : text };\n },\n };\n}\n\nfunction safeJson(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return {};\n }\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\n\n/** A tool advertised by an MCP server. */\nexport interface McpToolDef {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (err: Error) => void;\n}\n\nconst PROTOCOL_VERSION = \"2024-11-05\";\n\n/**\n * Minimal MCP client over the stdio transport: newline-delimited JSON-RPC 2.0.\n * Supports the bits Polypus needs — `initialize`, `tools/list`, `tools/call` —\n * with no external dependency. Spawn → initialize() → listTools()/callTool() → close().\n */\nexport class McpClient {\n private proc?: ChildProcessWithoutNullStreams;\n private nextId = 1;\n private readonly pending = new Map<number, PendingRequest>();\n private buffer = \"\";\n private closed = false;\n\n constructor(\n private readonly command: string,\n private readonly args: string[] = [],\n private readonly env: Record<string, string> = {},\n ) {}\n\n /** Spawn the server and perform the initialize handshake. */\n async initialize(timeoutMs = 20_000): Promise<void> {\n this.proc = spawn(this.command, this.args, {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, ...this.env },\n windowsHide: true,\n }) as ChildProcessWithoutNullStreams;\n\n this.proc.stdout.setEncoding(\"utf8\");\n this.proc.stdout.on(\"data\", (chunk: string) => this.onData(chunk));\n this.proc.on(\"exit\", () => this.failAll(new Error(\"MCP server process exited\")));\n this.proc.on(\"error\", (err) => this.failAll(err));\n\n await this.request(\n \"initialize\",\n {\n protocolVersion: PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: { name: \"polypus\", version: \"1\" },\n },\n timeoutMs,\n );\n // Per the spec, tell the server we're ready (notification — no response).\n this.notify(\"notifications/initialized\");\n }\n\n /** List the tools the server exposes. */\n async listTools(): Promise<McpToolDef[]> {\n const res = (await this.request(\"tools/list\", {})) as { tools?: McpToolDef[] };\n return res.tools ?? [];\n }\n\n /** Call a tool and return its textual output. */\n async callTool(name: string, args: Record<string, unknown>): Promise<{ ok: boolean; text: string }> {\n try {\n const res = (await this.request(\"tools/call\", { name, arguments: args })) as {\n content?: Array<{ type: string; text?: string }>;\n isError?: boolean;\n };\n const text = (res.content ?? [])\n .map((c) => (c.type === \"text\" ? (c.text ?? \"\") : `[${c.type}]`))\n .join(\"\\n\")\n .trim();\n return { ok: !res.isError, text: text || \"(no output)\" };\n } catch (err) {\n return { ok: false, text: `MCP call failed: ${(err as Error).message}` };\n }\n }\n\n /** Terminate the server process. */\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.failAll(new Error(\"MCP client closed\"));\n this.proc?.kill();\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n let nl: number;\n while ((nl = this.buffer.indexOf(\"\\n\")) !== -1) {\n const line = this.buffer.slice(0, nl).trim();\n this.buffer = this.buffer.slice(nl + 1);\n if (!line) continue;\n let msg: { id?: number; result?: unknown; error?: { message?: string } };\n try {\n msg = JSON.parse(line);\n } catch {\n continue; // ignore non-JSON lines (some servers log to stdout)\n }\n if (typeof msg.id !== \"number\") continue; // notification / unrelated\n const p = this.pending.get(msg.id);\n if (!p) continue;\n this.pending.delete(msg.id);\n if (msg.error) p.reject(new Error(msg.error.message ?? \"MCP error\"));\n else p.resolve(msg.result);\n }\n }\n\n private request(method: string, params: unknown, timeoutMs = 20_000): Promise<unknown> {\n if (!this.proc) return Promise.reject(new Error(\"MCP client not initialized\"));\n const id = this.nextId++;\n const payload = JSON.stringify({ jsonrpc: \"2.0\", id, method, params }) + \"\\n\";\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`MCP request \"${method}\" timed out`));\n }, timeoutMs);\n this.pending.set(id, {\n resolve: (v) => {\n clearTimeout(timer);\n resolve(v);\n },\n reject: (e) => {\n clearTimeout(timer);\n reject(e);\n },\n });\n this.proc!.stdin.write(payload);\n });\n }\n\n private notify(method: string, params: unknown = {}): void {\n this.proc?.stdin.write(JSON.stringify({ jsonrpc: \"2.0\", method, params }) + \"\\n\");\n }\n\n private failAll(err: Error): void {\n for (const [, p] of this.pending) p.reject(err);\n this.pending.clear();\n }\n}\n","import type { AgentEvents, RunResult } from \"../../core/agent/loop.js\";\n\nexport interface JsonEvent {\n type: \"step\" | \"assistant\" | \"tool_call\" | \"tool_result\" | \"correction\" | \"reprompt\" | \"compaction\";\n [key: string]: unknown;\n}\n\nexport interface JsonCollector {\n /** AgentEvents that record a structured log instead of rendering to a TTY. */\n events: AgentEvents;\n /** Build the final JSON payload from the run result plus the collected log. */\n build(result: RunResult): {\n result: {\n reason: RunResult[\"reason\"];\n finished: boolean;\n steps: number;\n summary?: string;\n filesChanged: string[];\n usage: RunResult[\"usage\"];\n };\n events: JsonEvent[];\n };\n}\n\nconst OUTPUT_PREVIEW = 500;\n\n/**\n * Collect agent events into a stable JSON contract for headless/CI use\n * (`polypus run \"<task>\" --json`). `filesChanged` is derived from successful\n * `write_file`/`edit_file` calls.\n */\nexport function createJsonCollector(): JsonCollector {\n const log: JsonEvent[] = [];\n const filesChanged = new Set<string>();\n\n const events: AgentEvents = {\n onStep(step) {\n log.push({ type: \"step\", step });\n },\n onAssistantText(text) {\n if (text.trim()) log.push({ type: \"assistant\", text });\n },\n onToolCall(call) {\n log.push({ type: \"tool_call\", name: call.name, arguments: call.arguments });\n },\n onToolResult(call, result) {\n log.push({\n type: \"tool_result\",\n name: call.name,\n ok: result.ok,\n output: result.output.slice(0, OUTPUT_PREVIEW),\n });\n if (result.ok && (call.name === \"write_file\" || call.name === \"edit_file\")) {\n const path = call.arguments.path;\n if (typeof path === \"string\") filesChanged.add(path);\n }\n },\n onCorrection(call) {\n log.push({ type: \"correction\", name: call.name });\n },\n onReprompt(attempt) {\n log.push({ type: \"reprompt\", attempt });\n },\n onCompaction(before, after) {\n log.push({ type: \"compaction\", before, after });\n },\n onUsage() {\n /* usage is summarised in the final result, not per-event */\n },\n };\n\n return {\n events,\n build(result) {\n return {\n result: {\n reason: result.reason,\n finished: result.finished,\n steps: result.steps,\n summary: result.summary,\n filesChanged: [...filesChanged],\n usage: result.usage,\n },\n events: log,\n };\n },\n };\n}\n","import pc from \"picocolors\";\nimport type { SessionState } from \"../cli/commands/run.js\";\nimport type { PermissionMode, PolypusConfig } from \"../core/config/schema.js\";\nimport { findAgent, loadConfig, saveConfig } from \"../core/config/store.js\";\nimport { addAgentInteractive } from \"./wizard.js\";\nimport { listSessions, loadSession } from \"../core/agent/session-store.js\";\nimport { t } from \"../core/i18n/index.js\";\nimport { promptLabel } from \"./banner.js\";\nimport { readLine } from \"./line-reader.js\";\n\nexport interface ReplContext {\n session: SessionState;\n /** Run a task with the currently active agent. */\n runTask(task: string): Promise<void>;\n /** Run a task as a swarm across the configured agents (parallel worktrees). */\n runSwarm(task: string): Promise<void>;\n /** Current in-memory config. */\n getConfig(): PolypusConfig;\n /** Re-read config from disk (after add/remove). */\n reload(): Promise<void>;\n}\n\n/**\n * Interactive session loop. A fresh readline is opened only to read each line\n * and closed before any work runs — tasks (review-mode confirmations) and the\n * /add wizard use @clack/prompts, which needs sole control of stdin. Keeping a\n * persistent readline open across those would corrupt stdin and drop the REPL.\n */\nexport async function startRepl(ctx: ReplContext): Promise<void> {\n for (;;) {\n const line = await readLine(promptLabel(ctx.session.mode));\n if (line === null) break; // EOF / Ctrl+D\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n if (!trimmed.startsWith(\"/\")) {\n await ctx.runTask(trimmed);\n continue;\n }\n\n const [cmd = \"\", ...rest] = trimmed.slice(1).split(/\\s+/);\n const arg = rest.join(\" \").trim();\n\n if (cmd === \"exit\" || cmd === \"quit\") break;\n\n if (cmd === \"add\") {\n const name = await addAgentInteractive().catch((e) => {\n console.log(pc.red(`✗ ${(e as Error).message}`));\n return undefined;\n });\n await ctx.reload();\n if (name) {\n ctx.session.agentName = name;\n console.log(pc.green(t(\"repl.switchedTo\", { name })));\n }\n continue;\n }\n\n await handleCommand(cmd, arg, ctx);\n }\n}\n\nasync function handleCommand(cmd: string, arg: string, ctx: ReplContext): Promise<void> {\n const { session } = ctx;\n\n switch (cmd) {\n case \"help\":\n console.log(t(\"repl.help\"));\n return;\n\n case \"plan\":\n case \"review\":\n case \"bypass\":\n session.mode = cmd as PermissionMode;\n console.log(pc.dim(t(\"repl.modeChanged\", { mode: cmd })));\n return;\n\n case \"allow\":\n if (arg) {\n session.allow = [...session.allow, arg];\n console.log(pc.dim(t(\"repl.allowAdded\", { glob: arg })));\n } else {\n console.log(pc.dim(t(\"repl.allowShow\", { mode: session.mode, allow: session.allow.join(\", \") })));\n }\n return;\n\n case \"reset\":\n session.history = [];\n console.log(pc.dim(t(\"repl.historyCleared\")));\n return;\n\n case \"sessions\": {\n const all = await listSessions();\n if (all.length === 0) {\n console.log(pc.yellow(t(\"sessions.empty\")));\n return;\n }\n console.log(pc.bold(t(\"sessions.header\")));\n for (const s of all) {\n console.log(` ${pc.cyan(s.id)} ${pc.dim(`[${s.messageCount} msgs]`)} ${s.title}`);\n }\n return;\n }\n\n case \"resume\": {\n if (!arg) {\n console.log(pc.yellow(t(\"repl.needName\", { usage: \"/resume <id>\" })));\n return;\n }\n const record = await loadSession(arg);\n if (!record) {\n console.log(pc.red(t(\"sessions.notFound\", { id: arg })));\n return;\n }\n session.id = record.id;\n session.title = record.title;\n session.agentName = record.agentName;\n session.mode = record.mode;\n session.history = record.messages;\n console.log(pc.green(t(\"sessions.resumed\", { id: record.id, n: record.messages.length })));\n return;\n }\n\n case \"swarm\": {\n if (!arg) {\n console.log(pc.yellow(t(\"repl.needName\", { usage: \"/swarm <task>\" })));\n return;\n }\n try {\n await ctx.runSwarm(arg);\n } catch (e) {\n console.log(pc.red(`✗ ${(e as Error).message}`));\n }\n return;\n }\n\n case \"agents\":\n printAgents(ctx.getConfig(), session.agentName);\n return;\n\n case \"agent\": {\n if (!arg) {\n console.log(pc.yellow(t(\"repl.needName\", { usage: \"/agent <name>\" })));\n return;\n }\n if (!findAgent(ctx.getConfig(), arg)) {\n console.log(pc.red(t(\"agent.notFound\", { name: arg })));\n return;\n }\n session.agentName = arg;\n console.log(pc.green(t(\"repl.agentSwitched\", { name: arg })));\n return;\n }\n\n case \"remove\": {\n if (!arg) {\n console.log(pc.yellow(t(\"repl.needName\", { usage: \"/remove <name>\" })));\n return;\n }\n await removeAgent(arg, ctx);\n return;\n }\n\n default:\n console.log(pc.yellow(t(\"repl.unknown\", { cmd })));\n }\n}\n\nfunction printAgents(config: PolypusConfig, activeName: string): void {\n if (config.agents.length === 0) {\n console.log(pc.yellow(t(\"agent.none\")));\n return;\n }\n console.log(pc.bold(t(\"agent.listHeader\")));\n for (const a of config.agents) {\n const active = a.name === activeName;\n console.log(\n ` ${active ? pc.green(\"●\") : pc.dim(\"○\")} ${pc.bold(a.name)} ` +\n pc.dim(`(${a.provider} · ${a.model} · ${a.toolMode})`) +\n (config.defaultAgent === a.name ? pc.dim(` [${t(\"common.default\")}]`) : \"\"),\n );\n }\n}\n\nasync function removeAgent(name: string, ctx: ReplContext): Promise<void> {\n const config = await loadConfig();\n if (!findAgent(config, name)) {\n console.log(pc.red(t(\"agent.notFound\", { name })));\n return;\n }\n config.agents = config.agents.filter((a) => a.name !== name);\n if (config.defaultAgent === name) config.defaultAgent = config.agents[0]?.name;\n await saveConfig(config);\n await ctx.reload();\n console.log(pc.green(t(\"agent.removed\", { name })));\n\n // If the active agent was removed, fall back to another one.\n if (ctx.session.agentName === name) {\n const next = config.defaultAgent ?? config.agents[0]?.name;\n if (next) {\n ctx.session.agentName = next;\n console.log(pc.dim(t(\"repl.switchedTo\", { name: next })));\n } else {\n console.log(pc.yellow(t(\"repl.noAgentsLeft\")));\n }\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { AgentConfig, Locale, PermissionMode, ProviderKind, ToolMode } from \"../core/config/schema.js\";\nimport { configPath, loadConfig, saveConfig } from \"../core/config/store.js\";\nimport {\n DEFAULT_BASE_URL,\n REQUIRES_API_KEY,\n SUGGESTED_KEY_ENV,\n} from \"../core/providers/defaults.js\";\nimport { listOllamaModels } from \"../core/providers/ollama.js\";\nimport {\n filterModels,\n fmtContext,\n fmtPrice,\n listOpenRouterModels,\n type ModelSort,\n} from \"../core/providers/openrouter.js\";\nimport { LOCALE_NAMES, LOCALES, setLocale, t } from \"../core/i18n/index.js\";\n\nfunction bail(value: unknown): void {\n if (p.isCancel(value)) {\n p.cancel(t(\"wizard.cancelled\"));\n process.exit(0);\n }\n}\n\n/** Interactive onboarding: pick a language, configure agents, permissions, and a default. */\nexport async function runWizard(): Promise<void> {\n const config = await loadConfig();\n\n // Language first, so the rest of the wizard speaks the user's language.\n const locale = await p.select({\n message: \"Interface language / Idioma da interface\",\n options: LOCALES.map((l) => ({ value: l, label: LOCALE_NAMES[l] })),\n initialValue: config.locale,\n });\n bail(locale);\n config.locale = Locale.parse(locale);\n setLocale(config.locale);\n\n p.intro(pc.bgCyan(pc.black(t(\"wizard.title\"))));\n p.note(t(\"wizard.intro\"), t(\"wizard.welcome\"));\n\n for (;;) {\n const agent = await promptAgent(config.agents.map((a) => a.name));\n config.agents.push(agent);\n\n const again = await p.confirm({ message: t(\"wizard.addAnother\"), initialValue: false });\n bail(again);\n if (!again) break;\n }\n\n if (config.agents.length > 1) {\n const def = await p.select({\n message: t(\"wizard.defaultAgent\"),\n options: config.agents.map((a) => ({ value: a.name, label: a.name })),\n });\n bail(def);\n config.defaultAgent = def as string;\n } else {\n config.defaultAgent = config.agents[0]?.name;\n }\n\n const mode = await p.select({\n message: t(\"wizard.permMode\"),\n options: [\n { value: \"review\", label: t(\"wizard.permReview\") },\n { value: \"plan\", label: t(\"wizard.permPlan\") },\n { value: \"bypass\", label: t(\"wizard.permBypass\") },\n ],\n initialValue: \"review\",\n });\n bail(mode);\n config.permissions.mode = PermissionMode.parse(mode);\n\n const allow = await p.text({\n message: t(\"wizard.allowPaths\"),\n initialValue: config.permissions.allow.join(\", \"),\n placeholder: \"**/*\",\n });\n bail(allow);\n config.permissions.allow = String(allow)\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n await saveConfig(config);\n p.outro(pc.green(t(\"wizard.saved\", { n: config.agents.length, path: configPath() })));\n console.log(pc.dim(t(\"wizard.next\")));\n}\n\n/**\n * Interactively add a single agent and persist it (used by the REPL `/add`).\n * Returns the new agent's name, or undefined if cancelled.\n */\nexport async function addAgentInteractive(): Promise<string | undefined> {\n const config = await loadConfig();\n const agent = await promptAgent(config.agents.map((a) => a.name));\n config.agents.push(agent);\n if (!config.defaultAgent) config.defaultAgent = agent.name;\n await saveConfig(config);\n return agent.name;\n}\n\nasync function promptAgent(existingNames: string[]): Promise<AgentConfig> {\n const provider = await p.select({\n message: t(\"wizard.provider\"),\n options: [\n { value: \"openrouter\", label: t(\"wizard.providerOpenrouter\") },\n { value: \"ollama\", label: t(\"wizard.providerOllama\") },\n { value: \"openai-compatible\", label: t(\"wizard.providerCompatible\") },\n { value: \"anthropic\", label: t(\"wizard.providerAnthropic\") },\n ],\n });\n bail(provider);\n const providerKind = ProviderKind.parse(provider);\n\n const name = await p.text({\n message: t(\"wizard.agentName\"),\n placeholder: providerKind,\n validate: (v) => {\n if (!v.trim()) return t(\"wizard.required\");\n if (existingNames.includes(v.trim())) return t(\"wizard.nameTaken\");\n return undefined;\n },\n });\n bail(name);\n\n const model = await promptModel(providerKind);\n\n let baseUrl = DEFAULT_BASE_URL[providerKind];\n if (providerKind === \"openai-compatible\") {\n const b = await p.text({\n message: t(\"wizard.baseUrl\"),\n placeholder: \"https://my-gateway.example.com/v1\",\n validate: (v) => (v.trim() ? undefined : t(\"wizard.baseUrlRequired\")),\n });\n bail(b);\n baseUrl = String(b).trim();\n }\n\n const apiKey = await promptApiKey(providerKind);\n\n const toolMode = await p.select({\n message: t(\"wizard.toolMode\"),\n options: [\n { value: \"auto\", label: t(\"wizard.toolAuto\") },\n { value: \"native\", label: t(\"wizard.toolNative\") },\n { value: \"emulated\", label: t(\"wizard.toolEmulated\") },\n ],\n initialValue: \"auto\",\n });\n bail(toolMode);\n\n return AgentConfig.parse({\n name: String(name).trim(),\n provider: providerKind,\n model: String(model).trim(),\n baseUrl,\n apiKey,\n toolMode: ToolMode.parse(toolMode),\n });\n}\n\nconst OTHER = \"__other__\";\nconst REFILTER = \"__refilter__\";\nconst MANUAL = \"__manual__\";\n\n/** Prompt for a model id. For Ollama, detect installed models and offer a picker. */\nasync function promptModel(provider: ProviderKind): Promise<string> {\n if (provider === \"openrouter\") {\n const picked = await browseOpenRouter();\n if (picked) return picked;\n }\n\n if (provider === \"ollama\") {\n const spin = p.spinner();\n spin.start(t(\"wizard.ollamaDetecting\"));\n const models = await listOllamaModels();\n spin.stop(models.length ? t(\"wizard.ollamaFound\", { n: models.length }) : t(\"wizard.ollamaNone\"));\n\n if (models.length > 0) {\n const choice = await p.select({\n message: t(\"wizard.ollamaPick\"),\n options: [\n ...models.map((m) => ({ value: m, label: m })),\n { value: OTHER, label: t(\"wizard.ollamaOther\") },\n ],\n });\n bail(choice);\n if (choice !== OTHER) return choice as string;\n }\n }\n\n const placeholder =\n provider === \"openrouter\"\n ? \"anthropic/claude-3.5-sonnet\"\n : provider === \"ollama\"\n ? \"llama3.1:8b\"\n : provider === \"anthropic\"\n ? \"claude-3-5-sonnet-latest\"\n : \"gpt-4o-mini\";\n\n const model = await p.text({\n message: t(\"wizard.modelId\"),\n placeholder,\n validate: (v) => (v.trim() ? undefined : t(\"wizard.required\")),\n });\n bail(model);\n return String(model).trim();\n}\n\n/**\n * Interactive OpenRouter model browser: fetch the catalog, then loop over\n * search + filters + sort, showing a rich picker. Returns the chosen id, or\n * undefined to fall back to manual text entry.\n */\nasync function browseOpenRouter(): Promise<string | undefined> {\n const spin = p.spinner();\n spin.start(t(\"models.fetching\"));\n let all;\n try {\n all = await listOpenRouterModels(process.env.OPENROUTER_API_KEY);\n spin.stop(t(\"models.shown\", { shown: all.length, total: all.length }));\n } catch {\n spin.stop(t(\"wizard.orError\"));\n return undefined;\n }\n\n for (;;) {\n const search = await p.text({ message: t(\"wizard.orSearch\"), placeholder: \"claude, qwen, gpt…\" });\n bail(search);\n\n const flags = await p.multiselect({\n message: t(\"wizard.orFilters\"),\n options: [\n { value: \"tools\", label: t(\"wizard.orToolsOnly\") },\n { value: \"free\", label: t(\"wizard.orFreeOnly\") },\n ],\n initialValues: [\"tools\"],\n required: false,\n });\n bail(flags);\n\n const sort = await p.select({\n message: t(\"wizard.orSort\"),\n initialValue: \"price\",\n options: [\n { value: \"price\", label: t(\"wizard.orSortPrice\") },\n { value: \"price-desc\", label: t(\"wizard.orSortPriceDesc\") },\n { value: \"context\", label: t(\"wizard.orSortContext\") },\n { value: \"name\", label: t(\"wizard.orSortName\") },\n ],\n });\n bail(sort);\n\n const flagList = flags as string[];\n const results = filterModels(all, {\n search: String(search ?? \"\"),\n tools: flagList.includes(\"tools\") ? \"tools\" : \"any\",\n freeOnly: flagList.includes(\"free\"),\n sort: sort as ModelSort,\n });\n\n if (results.length === 0) {\n p.note(t(\"wizard.orNone\"));\n continue;\n }\n\n const choice = await p.select({\n message: t(\"wizard.orPick\", { n: results.length }),\n maxItems: 12,\n options: [\n ...results.slice(0, 40).map((m) => ({\n value: m.id,\n label: m.id,\n hint: `${fmtPrice(m.promptPrice)}/${fmtPrice(m.completionPrice)}${m.supportsTools ? \" · 🛠\" : \"\"} · ${fmtContext(m.contextLength)}`,\n })),\n { value: REFILTER, label: t(\"wizard.orRefilter\") },\n { value: MANUAL, label: t(\"wizard.orManual\") },\n ],\n });\n bail(choice);\n\n if (choice === REFILTER) continue;\n if (choice === MANUAL) return undefined;\n return choice as string;\n }\n}\n\nasync function promptApiKey(provider: ProviderKind): Promise<string | undefined> {\n if (!REQUIRES_API_KEY[provider]) {\n const need = await p.confirm({\n message: t(\"wizard.keyNotNeeded\", { provider }),\n initialValue: false,\n });\n bail(need);\n if (!need) return undefined;\n }\n\n const method = await p.select({\n message: t(\"wizard.apiKey\"),\n options: [\n { value: \"env\", label: t(\"wizard.keyEnv\") },\n { value: \"inline\", label: t(\"wizard.keyInline\") },\n { value: \"none\", label: t(\"wizard.keySkip\") },\n ],\n initialValue: \"env\",\n });\n bail(method);\n\n if (method === \"none\") return undefined;\n\n if (method === \"env\") {\n const envName = await p.text({\n message: t(\"wizard.envName\"),\n initialValue: SUGGESTED_KEY_ENV[provider] ?? \"OPENAI_API_KEY\",\n validate: (v) => (/^[A-Z0-9_]+$/i.test(v.trim()) ? undefined : t(\"wizard.envInvalid\")),\n });\n bail(envName);\n return `\\${${String(envName).trim()}}`;\n }\n\n const key = await p.password({\n message: t(\"wizard.keyPrompt\"),\n validate: (v) => (v.trim() ? undefined : t(\"wizard.required\")),\n });\n bail(key);\n return String(key).trim();\n}\n","/** Discovery helpers for a local Ollama instance. */\n\nfunction normalizeHost(host: string): string {\n let h = host.trim().replace(/\\/v1\\/?$/, \"\").replace(/\\/$/, \"\");\n if (!/^https?:\\/\\//.test(h)) h = `http://${h}`;\n return h;\n}\n\n/** Default Ollama host, honoring the OLLAMA_HOST env var. */\nexport function ollamaHost(): string {\n return normalizeHost(process.env.OLLAMA_HOST ?? \"http://localhost:11434\");\n}\n\n/**\n * List models installed on a reachable Ollama instance (via /api/tags).\n * Returns [] when Ollama is not running or the request fails/times out.\n */\nexport async function listOllamaModels(\n host: string = ollamaHost(),\n timeoutMs = 2000,\n): Promise<string[]> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(`${normalizeHost(host)}/api/tags`, { signal: controller.signal });\n if (!res.ok) return [];\n const data = (await res.json()) as { models?: Array<{ name?: string }> };\n return (data.models ?? [])\n .map((m) => m.name)\n .filter((n): n is string => Boolean(n));\n } catch {\n return [];\n } finally {\n clearTimeout(timer);\n }\n}\n","import pc from \"picocolors\";\nimport { t } from \"../core/i18n/index.js\";\nimport { VERSION } from \"../core/version.js\";\n\nconst RESET = \"\\x1b[0m\";\nconst useColor =\n (Boolean(process.stdout.isTTY) || Boolean(process.env.FORCE_COLOR)) && !process.env.NO_COLOR;\nconst animated =\n Boolean(process.stdout.isTTY) && !process.env.NO_COLOR && !process.env.POLYPUS_NO_ANIM;\n\n/** Author / social links shown on startup. */\nconst AUTHOR = {\n name: \"Gabriel Rios\",\n github: \"github.com/GaberRB\",\n linkedin: \"linkedin.com/in/gabriel-riosb\",\n};\n\n/** Build a 24-bit truecolor wrapper, no-op when colors are disabled. */\nfunction rgb(r: number, g: number, b: number, bold = false): (s: string) => string {\n return (s: string) =>\n useColor ? `\\x1b[${bold ? \"1;\" : \"\"}38;2;${r};${g};${b}m${s}${RESET}` : s;\n}\n\n// Violet gradient (light → deep) plus white glasses and pink cheeks.\nconst c0 = rgb(224, 209, 255);\nconst c1 = rgb(199, 176, 253);\nconst c2 = rgb(171, 142, 250);\nconst c3 = rgb(146, 102, 245);\nconst c4 = rgb(122, 74, 222);\nconst lens = rgb(255, 255, 255, true);\nconst blush = rgb(255, 138, 190, true);\nconst GRAD = [c0, c1, c1, c2, c2, c2, c3, c3, c3, c4, c4];\n\n// Cute kawaii octopus with round glasses, a smile, rosy cheeks and long\n// chubby tentacles ending in little curls.\n// '◉' white lenses · '(' ')' glasses frames · '‿' smile · '♥' blush.\nconst ART = [\n \" ▄▄▄▄▄▄▄▄▄▄ \",\n \" ▟██████████████▙ \",\n \" ████████████████████ \",\n \" ██♥ (◉) ‿ (◉) ♥██ \",\n \" ████████████████████ \",\n \" ▜████████████████▛ \",\n \" ██ ██ ██ ██ ██ \",\n \" ██ ██ ██ ██ ██ \",\n \" ██ ██ ██ ██ ██ \",\n \" ╰╝ ╚╝ ╚╝ ╚╝ ╚╮ \",\n];\n\n// Alternate tentacle curls for the \"coming alive\" wiggle on startup.\nconst TENTACLE_FRAMES = [\n \" ╰╝ ╚╝ ╚╝ ╚╝ ╚╮ \",\n \" ╚╮ ╰╝ ╚╝ ╰╝ ╚╝ \",\n \" ╰╝ ╚╝ ╰╝ ╚╝ ╚╮ \",\n];\n\nconst WIDTH = Math.max(...[...ART].map((l) => [...l].length));\n\nfunction center(line: string): string {\n const pad = WIDTH - [...line].length;\n const left = Math.floor(pad / 2);\n return \" \".repeat(left) + line + \" \".repeat(pad - left);\n}\n\n// Filled 5-row block font for the wordmark. Each glyph is 6 columns wide.\nconst GLYPHS: Record<string, string[]> = {\n P: [\"██████\", \"██ ██\", \"██████\", \"██ \", \"██ \"],\n O: [\"██████\", \"██ ██\", \"██ ██\", \"██ ██\", \"██████\"],\n L: [\"██ \", \"██ \", \"██ \", \"██ \", \"██████\"],\n Y: [\"██ ██\", \"██ ██\", \" ████ \", \" ██ \", \" ██ \"],\n U: [\"██ ██\", \"██ ██\", \"██ ██\", \"██ ██\", \"██████\"],\n S: [\"██████\", \"██ \", \"██████\", \" ██\", \"██████\"],\n};\n\nconst WORD_GRAD = [\n rgb(199, 176, 253, true),\n rgb(171, 142, 250, true),\n rgb(171, 142, 250, true),\n rgb(146, 102, 245, true),\n rgb(146, 102, 245, true),\n];\n\n/** Filled block letters, one colored string per row (vertical gradient). */\nfunction wordmarkLines(text: string): string[] {\n const letters = [...text].map((ch) => GLYPHS[ch]).filter(Boolean) as string[][];\n return [0, 1, 2, 3, 4].map((row) =>\n (WORD_GRAD[row] ?? c3)(letters.map((g) => g[row]).join(\" \")),\n );\n}\n\nfunction colorChar(rowIdx: number, ch: string): string {\n if (ch === \" \") return ch;\n if (ch === \"◉\" || ch === \"(\" || ch === \")\") return lens(ch);\n if (ch === \"♥\") return blush(ch);\n if (ch === \"‿\") return c0(ch);\n return (GRAD[rowIdx] ?? c3)(ch);\n}\n\n/** Center + color one octopus row (any string), tinted as the given gradient row. */\nfunction renderArtRow(rowIdx: number, line: string): string {\n return [...center(line)].map((ch) => colorChar(rowIdx, ch)).join(\"\");\n}\n\nconst tagline = (): string => c1(t(\"welcome.tagline\")) + pc.dim(` v${VERSION}`);\n\nfunction authorLine(): string {\n return (\n pc.dim(\"by \") +\n c2(AUTHOR.name) +\n pc.dim(\" · \") +\n c1(AUTHOR.github) +\n pc.dim(\" · \") +\n c1(AUTHOR.linkedin)\n );\n}\n\n/** The full static banner (octopus + wordmark + tagline + author). */\nexport function banner(): string {\n const art = ART.map((line, i) => renderArtRow(i, line)).join(\"\\n\");\n const word = wordmarkLines(\"POLYPUS\").join(\"\\n\");\n return `\\n${art}\\n\\n${word}\\n\\n ${tagline()}\\n ${authorLine()}\\n`;\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\n\n/**\n * Animated startup: the octopus draws itself in line by line, wiggles its\n * tentacles to \"come alive\", then the wordmark, tagline and author appear.\n * Falls back to the static banner when not attached to a TTY.\n */\nasync function animateIntro(): Promise<void> {\n if (!animated) {\n console.log(banner());\n return;\n }\n\n process.stdout.write(\"\\n\");\n for (let i = 0; i < ART.length; i++) {\n console.log(renderArtRow(i, ART[i]!));\n await sleep(45);\n }\n\n // Wiggle the just-drawn tentacle line in place.\n const last = ART.length - 1;\n for (let k = 0; k < 6; k++) {\n const frame = renderArtRow(last, TENTACLE_FRAMES[k % TENTACLE_FRAMES.length]!);\n process.stdout.write(`\\x1b[1A\\r\\x1b[K${frame}\\n`);\n await sleep(85);\n }\n\n process.stdout.write(\"\\n\");\n for (const line of wordmarkLines(\"POLYPUS\")) {\n console.log(line);\n await sleep(40);\n }\n\n process.stdout.write(\"\\n\");\n console.log(\" \" + tagline());\n await sleep(140);\n console.log(\" \" + authorLine());\n console.log(\"\");\n}\n\nexport interface WelcomeInfo {\n agentName: string;\n provider: string;\n model: string;\n toolMode: string;\n mode: string;\n workspace: string;\n}\n\n/** Animate the intro, then print the colored session info panel and hints. */\nexport async function printWelcome(info: WelcomeInfo): Promise<void> {\n await animateIntro();\n\n const bar = c2(\"│ \");\n const label = (s: string) => pc.dim(s.padEnd(8));\n const rule = c3(\" \" + \"─\".repeat(46));\n\n console.log(rule);\n console.log(\" \" + bar + label(t(\"welcome.agent\")) + pc.bold(info.agentName));\n console.log(\n \" \" + bar + label(t(\"welcome.model\")) +\n `${info.model} ` + pc.dim(`(${info.provider} · ${info.toolMode})`),\n );\n console.log(\" \" + bar + label(t(\"welcome.mode\")) + modeColor(info.mode));\n console.log(\" \" + bar + label(t(\"welcome.workspace\")) + pc.dim(info.workspace));\n console.log(rule);\n console.log(\" \" + pc.dim(t(\"welcome.hints\")) + \"\\n\");\n}\n\nfunction modeColor(mode: string): string {\n if (mode === \"bypass\") return pc.yellow(mode);\n if (mode === \"plan\") return pc.cyan(mode);\n return pc.green(mode);\n}\n\n/** Styled REPL prompt, e.g. \"🐙 polypus(review) › \". */\nexport function promptLabel(mode: string): string {\n return c2(\"🐙 polypus\") + pc.dim(`(${mode})`) + c3(\" › \");\n}\n","import { createRequire } from \"node:module\";\n\n/**\n * Single source of truth for the CLI version, read from package.json at runtime.\n * Tries the bundled path first (dist/index.js → repo root) and falls back to the\n * source-tree path (src/core → repo root), so it resolves both from the tsup\n * bundle and when running from source (tests). Each candidate's version field is\n * validated so a stray package.json higher up the tree can't yield `undefined`.\n */\nfunction resolveVersion(): string {\n const require = createRequire(import.meta.url);\n for (const rel of [\"../package.json\", \"../../package.json\"]) {\n try {\n const version = (require(rel) as { version?: unknown }).version;\n if (typeof version === \"string\" && version.length > 0) return version;\n } catch {\n /* try the next candidate path */\n }\n }\n return \"0.0.0\";\n}\n\nexport const VERSION: string = resolveVersion();\n","import * as readline from \"node:readline/promises\";\nimport { PassThrough } from \"node:stream\";\nimport { stdin, stdout } from \"node:process\";\nimport { PasteStore, PasteFilter } from \"./paste.js\";\nimport { t } from \"../core/i18n/index.js\";\n\nconst ENABLE_BRACKETED_PASTE = \"\\x1b[?2004h\";\nconst DISABLE_BRACKETED_PASTE = \"\\x1b[?2004l\";\n\n/**\n * Read a single line from the user. On a TTY, enables bracketed paste so a large\n * multi-line paste is shown compactly as `[Pasted text #N +M lines]` while the\n * full text is preserved and returned. Falls back to a plain readline when stdin\n * is not a TTY (pipes, tests). Returns `null` on EOF / Ctrl+C.\n */\nexport async function readLine(prompt: string): Promise<string | null> {\n if (!stdin.isTTY) {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n try {\n return await rl.question(prompt);\n } catch {\n return null;\n } finally {\n rl.close();\n }\n }\n return readLineTTY(prompt);\n}\n\nasync function readLineTTY(prompt: string): Promise<string | null> {\n const store = new PasteStore((id, lines) => t(\"repl.pasted\", { id, lines }));\n const filter = new PasteFilter(store);\n\n // The real TTY is driven in raw mode by us; readline does the line editing and\n // echo on a proxy stream (terminal:true) fed with paste-filtered input.\n const proxy = new PassThrough();\n const rl = readline.createInterface({ input: proxy, output: stdout, terminal: true });\n const onData = (buf: Buffer): void => {\n proxy.write(filter.push(buf.toString(\"utf8\")));\n };\n\n stdout.write(ENABLE_BRACKETED_PASTE);\n stdin.setRawMode(true);\n stdin.resume();\n stdin.on(\"data\", onData);\n\n try {\n const line = await new Promise<string | null>((resolve) => {\n rl.question(prompt).then(resolve, () => resolve(null));\n rl.on(\"SIGINT\", () => resolve(null));\n rl.on(\"close\", () => resolve(null));\n });\n return line === null ? null : store.expand(line);\n } finally {\n stdin.off(\"data\", onData);\n if (stdin.isTTY) stdin.setRawMode(false);\n stdout.write(DISABLE_BRACKETED_PASTE);\n rl.close();\n }\n}\n","/**\n * Bracketed-paste handling for the REPL. When a terminal has bracketed paste\n * enabled (`ESC[?2004h`), pasted text arrives wrapped in `ESC[200~ … ESC[201~`.\n * We capture multi-line pastes as a single unit, show a compact placeholder like\n * `[Pasted text #1 +16 lines]`, and keep the full text so the agent still sees it.\n */\n\nexport const PASTE_START = \"\\x1b[200~\";\nexport const PASTE_END = \"\\x1b[201~\";\n\n/** Holds full pasted texts keyed by the placeholder shown in their place. */\nexport class PasteStore {\n private seq = 0;\n private readonly map = new Map<string, string>();\n\n /** `format(id, lines)` builds the placeholder (localized by the caller). */\n constructor(private readonly format: (id: number, lines: number) => string) {}\n\n /** Register pasted text, returning the placeholder to display in its place. */\n add(text: string): string {\n const lines = text.split(/\\r\\n|\\r|\\n/).length;\n const placeholder = this.format(++this.seq, lines);\n this.map.set(placeholder, text);\n return placeholder;\n }\n\n /** Replace any known placeholders in `line` with their full pasted text. */\n expand(line: string): string {\n let out = line;\n for (const [placeholder, full] of this.map) {\n if (out.includes(placeholder)) out = out.split(placeholder).join(full);\n }\n return out;\n }\n\n get size(): number {\n return this.map.size;\n }\n}\n\n/**\n * Streaming filter: feed it raw input chunks and it returns the text to forward\n * to the line editor, with multi-line pastes replaced by placeholders. Tolerates\n * paste markers split across chunk boundaries.\n */\nexport class PasteFilter {\n private buf = \"\";\n private inPaste = false;\n private pasteBuf = \"\";\n\n constructor(private readonly store: PasteStore) {}\n\n push(chunk: string): string {\n this.buf += chunk;\n let out = \"\";\n for (;;) {\n if (!this.inPaste) {\n const i = this.buf.indexOf(PASTE_START);\n if (i === -1) {\n const keep = partialSuffix(this.buf, PASTE_START);\n out += this.buf.slice(0, this.buf.length - keep);\n this.buf = this.buf.slice(this.buf.length - keep);\n return out;\n }\n out += this.buf.slice(0, i);\n this.buf = this.buf.slice(i + PASTE_START.length);\n this.inPaste = true;\n } else {\n const j = this.buf.indexOf(PASTE_END);\n if (j === -1) {\n const keep = partialSuffix(this.buf, PASTE_END);\n this.pasteBuf += this.buf.slice(0, this.buf.length - keep);\n this.buf = this.buf.slice(this.buf.length - keep);\n return out;\n }\n this.pasteBuf += this.buf.slice(0, j);\n this.buf = this.buf.slice(j + PASTE_END.length);\n this.inPaste = false;\n out += this.emit(this.pasteBuf);\n this.pasteBuf = \"\";\n }\n }\n }\n\n /** Multi-line pastes become a placeholder; single-line pastes pass through. */\n private emit(text: string): string {\n return /\\r|\\n/.test(text) ? this.store.add(text) : text;\n }\n}\n\n/** Length of the longest suffix of `s` that is a proper prefix of `marker`. */\nfunction partialSuffix(s: string, marker: string): number {\n const max = Math.min(s.length, marker.length - 1);\n for (let n = max; n > 0; n--) {\n if (s.slice(s.length - n) === marker.slice(0, n)) return n;\n }\n return 0;\n}\n","import pc from \"picocolors\";\nimport { loadConfig } from \"../../core/config/store.js\";\nimport { createProvider, type ResolvedAgent } from \"../../core/providers/registry.js\";\nimport { runSwarm } from \"../../core/agent/orchestrator.js\";\nimport { recommendConcurrency, idleTimeoutMs, overallTimeoutMs } from \"../../core/agent/concurrency.js\";\nimport { SwarmView, describeToolCall } from \"../../ui/swarm-view.js\";\nimport { listenForCancel } from \"../../ui/cancel.js\";\nimport { t } from \"../../core/i18n/index.js\";\nimport type { PolypusConfig } from \"../../core/config/schema.js\";\n\nexport interface SwarmCliOptions {\n agents?: string;\n maxSubtasks?: string;\n}\n\n/** Minimum number of configured agents for swarm mode to be worthwhile. */\nexport const MIN_SWARM_AGENTS = 3;\n\n/** Swarm only pays off when there are several agents to spread subtasks across. */\nexport function canSwarm(agentCount: number): boolean {\n return agentCount >= MIN_SWARM_AGENTS;\n}\n\nexport interface SwarmSessionOptions {\n /** Subset of agent names to use; defaults to all configured agents. */\n agents?: string[];\n maxSubtasks?: number;\n /** Workspace to run in; defaults to the current working directory. */\n workspace?: string;\n}\n\n/**\n * Decompose and run a task across agents in parallel worktrees, rendering the\n * live dashboard and a final report. Shared by the `polypus swarm` CLI command\n * and the REPL `/swarm` command. Enforces the 3+ agent gate.\n */\nexport async function runSwarmSession(\n task: string,\n config: PolypusConfig,\n opts: SwarmSessionOptions = {},\n): Promise<void> {\n // Gate: swarm is for 3+ agents; with fewer it degenerates into a single-agent run.\n if (!canSwarm(config.agents.length)) {\n throw new Error(t(\"swarm.needsAgents\", { min: MIN_SWARM_AGENTS, have: config.agents.length }));\n }\n\n const workspace = opts.workspace ?? process.cwd();\n const selected = opts.agents?.length ? opts.agents : config.agents.map((a) => a.name);\n if (selected.length === 0) {\n throw new Error(t(\"swarm.noAgents\"));\n }\n\n const resolved: ResolvedAgent[] = selected.map((name) => {\n const a = config.agents.find((x) => x.name === name);\n if (!a) throw new Error(t(\"agent.notFound\", { name }));\n return createProvider(a);\n });\n\n console.log(\n pc.dim(t(\"swarm.status\", { agents: resolved.map((a) => a.config.name).join(\", \"), workspace })),\n );\n console.log(pc.yellow(t(\"swarm.bypassNote\") + \"\\n\"));\n\n // ESC / Ctrl+C cancels: committed workers still merge, the rest are aborted.\n const controller = new AbortController();\n const cancel = listenForCancel(controller);\n controller.signal.addEventListener(\"abort\", () => console.log(pc.dim(\"\\n\" + t(\"swarm.cancelling\"))), {\n once: true,\n });\n\n const view = new SwarmView(resolved[0]!.config.name);\n view.start();\n let result;\n const sessionTimeout = setTimeout(() => {\n controller.abort();\n console.log(pc.red(t(\"swarm.timeout\")));\n }, overallTimeoutMs());\n try {\n result = await runSwarm({\n task,\n workspace,\n agents: resolved,\n allow: config.permissions.allow,\n deny: config.permissions.deny,\n maxSubtasks: opts.maxSubtasks,\n concurrency: recommendConcurrency(resolved),\n idleTimeoutMs: idleTimeoutMs(),\n signal: controller.signal,\n events: {\n onDecomposed: (subtasks) => view.setSubtasks(subtasks),\n onWorkerStart: (subtask, agentName) => view.workerStart(subtask.id, agentName),\n onWorkerDone: (outcome) => view.workerDone(outcome),\n onMerge: (merge) => view.merge(merge),\n workerEvents: (subtask) => ({\n onToolCall: (call) => view.workerAction(subtask.id, describeToolCall(call)),\n onStep: (step) => view.workerStep(subtask.id, step),\n }),\n },\n });\n } finally {\n clearTimeout(sessionTimeout);\n view.stop();\n cancel.dispose();\n }\n console.log(\"\");\n\n // Final report.\n console.log(pc.bold(\"\\n\" + t(\"swarm.summary\")));\n for (const o of result.outcomes) {\n const status = o.finished ? pc.green(t(\"swarm.statusDone\")) : pc.yellow(t(\"swarm.statusIncomplete\"));\n const committed = o.committed ? \"\" : pc.dim(` (${t(\"swarm.noChanges\")})`);\n console.log(` ${pc.bold(o.subtask.id)} [${o.agentName}] ${status}${committed} — ${o.subtask.title}`);\n }\n const conflicts = result.merges.filter((m) => !m.ok);\n if (conflicts.length > 0) {\n console.log(pc.red(\"\\n\" + t(\"swarm.conflictsHeader\", { n: conflicts.length })));\n for (const m of conflicts) {\n console.log(pc.red(` ${m.branch}: ${m.conflicts.join(\", \")}`));\n }\n } else {\n console.log(pc.green(\"\\n\" + t(\"swarm.allMerged\")));\n }\n}\n\n/** `polypus swarm <task>` — load config, parse CLI options and run the session. */\nexport async function swarm(task: string, opts: SwarmCliOptions): Promise<void> {\n const config = await loadConfig();\n await runSwarmSession(task, config, {\n agents: opts.agents\n ? opts.agents.split(\",\").map((s) => s.trim()).filter(Boolean)\n : undefined,\n maxSubtasks: opts.maxSubtasks ? Number(opts.maxSubtasks) : undefined,\n });\n}\n","import { mkdtemp } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { simpleGit, type SimpleGit } from \"simple-git\";\n\nexport interface Worktree {\n path: string;\n branch: string;\n}\n\nexport interface MergeResult {\n branch: string;\n ok: boolean;\n conflicts: string[];\n}\n\n/** Ensure the workspace is a git repo with at least one commit (worktrees need a base ref). */\nexport async function ensureRepo(workspace: string): Promise<SimpleGit> {\n const git = simpleGit(workspace);\n if (!(await git.checkIsRepo())) {\n await git.init();\n }\n const identity = await identityArgs(git);\n // A fresh repo has no HEAD; create an empty initial commit so we can branch.\n const hasHead = await git\n .raw([\"rev-parse\", \"--verify\", \"HEAD\"])\n .then(() => true)\n .catch(() => false);\n if (!hasHead) {\n await git.raw([...identity, \"commit\", \"--allow-empty\", \"-m\", \"polypus: initial commit\"]);\n }\n return git;\n}\n\n/**\n * Provide a fallback committer identity only when the repo/global config has\n * none, so we never override a user's configured name/email.\n */\nasync function identityArgs(git: SimpleGit): Promise<string[]> {\n const email = await git.raw([\"config\", \"user.email\"]).catch(() => \"\");\n if (email.trim()) return [];\n return [\"-c\", \"user.email=polypus@local\", \"-c\", \"user.name=Polypus\"];\n}\n\n/** Create an isolated worktree on a new branch off the current HEAD. */\nexport async function createWorktree(\n git: SimpleGit,\n label: string,\n): Promise<Worktree> {\n const branch = `polypus/${label}-${Date.now().toString(36)}`;\n const path = await mkdtemp(join(tmpdir(), \"polypus-wt-\"));\n await git.raw([\"worktree\", \"add\", \"-b\", branch, path, \"HEAD\"]);\n return { path, branch };\n}\n\n/** Stage and commit everything a worker produced in its worktree. */\nexport async function commitWorktree(wt: Worktree, message: string): Promise<boolean> {\n const wtGit = simpleGit(wt.path);\n await wtGit.add([\"-A\"]);\n const status = await wtGit.status();\n if (status.staged.length === 0 && status.files.length === 0) return false;\n const identity = await identityArgs(wtGit);\n await wtGit.raw([...identity, \"commit\", \"-m\", message]);\n return true;\n}\n\n/** Merge a worker branch into the workspace's current branch, reporting conflicts. */\nexport async function mergeWorktreeBranch(\n git: SimpleGit,\n branch: string,\n): Promise<MergeResult> {\n try {\n const identity = await identityArgs(git);\n await git.raw([...identity, \"merge\", \"--no-edit\", branch]);\n return { branch, ok: true, conflicts: [] };\n } catch (err) {\n // simple-git throws on conflict; collect conflicted files and abort cleanly.\n const status = await git.status().catch(() => undefined);\n const conflicts = status?.conflicted ?? [];\n await git.raw([\"merge\", \"--abort\"]).catch(() => undefined);\n if (conflicts.length === 0) {\n // Not a conflict — rethrow the original error.\n throw err;\n }\n return { branch, ok: false, conflicts };\n }\n}\n\n/** Remove a worktree and delete its branch. */\nexport async function removeWorktree(git: SimpleGit, wt: Worktree): Promise<void> {\n await git.raw([\"worktree\", \"remove\", wt.path, \"--force\"]).catch(() => undefined);\n await git.raw([\"branch\", \"-D\", wt.branch]).catch(() => undefined);\n}\n","import { runAgent, type AgentEvents } from \"./loop.js\";\nimport { commitWorktree, type Worktree } from \"../git/worktree.js\";\nimport { PermissionEngine } from \"../permissions/modes.js\";\nimport type { ResolvedAgent } from \"../providers/registry.js\";\n\nexport interface Subtask {\n id: string;\n title: string;\n brief: string;\n}\n\nexport interface WorkerOutcome {\n subtask: Subtask;\n agentName: string;\n branch: string;\n finished: boolean;\n summary?: string;\n committed: boolean;\n steps: number;\n}\n\n/**\n * Run one subtask to completion inside an isolated worktree. Workers run in\n * `bypass` mode because the worktree is throwaway and merges are reviewed later.\n */\nexport async function runWorker(\n subtask: Subtask,\n agent: ResolvedAgent,\n wt: Worktree,\n allow: string[],\n deny: string[],\n events?: AgentEvents,\n signal?: AbortSignal,\n): Promise<WorkerOutcome> {\n const permissions = new PermissionEngine({\n mode: \"bypass\",\n policy: { workspace: wt.path, allow, deny },\n allowedCommands: [],\n });\n\n const result = await runAgent({\n task: subtask.brief,\n workspace: wt.path,\n agent,\n permissions,\n promptContext: { workspace: wt.path, mode: \"bypass\", allow, briefing: subtask.brief },\n events,\n signal,\n });\n\n // Don't commit a worker that was cancelled/timed out mid-step — its worktree\n // may hold half-applied changes we don't want to merge.\n const committed =\n result.reason === \"cancelled\"\n ? false\n : await commitWorktree(wt, `polypus(${subtask.id}): ${subtask.title}`);\n\n return {\n subtask,\n agentName: agent.config.name,\n branch: wt.branch,\n finished: result.finished,\n summary: result.summary,\n committed,\n steps: result.steps,\n };\n}\n","import type { ResolvedAgent } from \"../providers/registry.js\";\nimport {\n createWorktree,\n ensureRepo,\n mergeWorktreeBranch,\n removeWorktree,\n type MergeResult,\n type Worktree,\n} from \"../git/worktree.js\";\nimport { runWorker, type Subtask, type WorkerOutcome } from \"./worker.js\";\nimport type { AgentEvents } from \"./loop.js\";\n\nexport interface SwarmOptions {\n task: string;\n workspace: string;\n agents: ResolvedAgent[];\n allow: string[];\n deny: string[];\n maxSubtasks?: number;\n /** Max workers running at once. Defaults to the number of agents. */\n concurrency?: number;\n /** Abort a worker that makes no progress (no step) for this long. 0 disables. */\n idleTimeoutMs?: number;\n /** Cancel the whole swarm (e.g. user pressed ESC). */\n signal?: AbortSignal;\n events?: SwarmEvents;\n}\n\nexport interface SwarmEvents {\n onDecomposed?(subtasks: Subtask[]): void;\n onWorkerStart?(subtask: Subtask, agentName: string): void;\n onWorkerDone?(outcome: WorkerOutcome): void;\n onMerge?(result: MergeResult): void;\n workerEvents?(subtask: Subtask): AgentEvents | undefined;\n}\n\nexport interface SwarmResult {\n subtasks: Subtask[];\n outcomes: WorkerOutcome[];\n merges: MergeResult[];\n}\n\n/**\n * Decompose a task with the lead agent, run each subtask in a parallel worker\n * (each in its own git worktree, bounded by `concurrency`), then merge the\n * branches sequentially. Cancellable via `signal`; a worker that stalls past\n * `idleTimeoutMs` is aborted without sinking the run. Workers never reject —\n * a failed/aborted worker yields an unfinished outcome — so the committed ones\n * still merge, even after cancellation.\n */\nexport async function runSwarm(opts: SwarmOptions): Promise<SwarmResult> {\n const lead = opts.agents[0];\n if (!lead) throw new Error(\"Swarm requires at least one agent.\");\n\n const maxSubtasks = opts.maxSubtasks ?? Math.max(opts.agents.length, 2);\n const concurrency = Math.max(1, opts.concurrency ?? opts.agents.length);\n const idleTimeoutMs = opts.idleTimeoutMs ?? 0;\n const git = await ensureRepo(opts.workspace);\n\n const subtasks = await decompose(lead, opts.task, maxSubtasks, opts.signal);\n opts.events?.onDecomposed?.(subtasks);\n\n // Create worktrees sequentially (concurrent `git worktree add` can hit index\n // locks), then run the workers through a bounded pool.\n const worktrees: Worktree[] = [];\n for (const subtask of subtasks) {\n worktrees.push(await createWorktree(git, subtask.id));\n }\n\n const runOne = (subtask: Subtask, i: number): Promise<WorkerOutcome> =>\n guardedWorker(subtask, opts.agents[i % opts.agents.length]!, worktrees[i]!, {\n allow: opts.allow,\n deny: opts.deny,\n idleTimeoutMs,\n signal: opts.signal,\n events: opts.events,\n });\n const outcomes = await runPool(subtasks, concurrency, runOne);\n\n // Merge sequentially so conflicts are attributed to a specific branch. Runs\n // even after cancellation, so committed workers aren't thrown away.\n const merges: MergeResult[] = [];\n for (const outcome of outcomes) {\n if (!outcome.committed) continue;\n const merge = await mergeWorktreeBranch(git, outcome.branch);\n merges.push(merge);\n opts.events?.onMerge?.(merge);\n }\n\n // Clean up worktrees and branches that merged cleanly; keep conflicted branches for inspection.\n const conflicted = new Set(merges.filter((m) => !m.ok).map((m) => m.branch));\n for (const wt of worktrees) {\n if (conflicted.has(wt.branch)) {\n await git.raw([\"worktree\", \"remove\", wt.path, \"--force\"]).catch(() => undefined);\n } else {\n await removeWorktree(git, wt);\n }\n }\n\n return { subtasks, outcomes, merges };\n}\n\ninterface GuardOptions {\n allow: string[];\n deny: string[];\n idleTimeoutMs: number;\n signal?: AbortSignal;\n events?: SwarmEvents;\n}\n\n/**\n * Run a single worker with its own abort controller, wired to the global signal\n * and an idle-timeout watchdog (reset on each step). Never rejects: any error or\n * abort yields an unfinished outcome.\n */\nasync function guardedWorker(\n subtask: Subtask,\n agent: ResolvedAgent,\n wt: Worktree,\n opts: GuardOptions,\n): Promise<WorkerOutcome> {\n const ac = new AbortController();\n const onAbort = (): void => ac.abort();\n if (opts.signal) {\n if (opts.signal.aborted) ac.abort();\n else opts.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n const resetIdle = (): void => {\n if (opts.idleTimeoutMs <= 0) return;\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => ac.abort(), opts.idleTimeoutMs);\n idleTimer.unref?.();\n };\n\n const base = opts.events?.workerEvents?.(subtask);\n const events: AgentEvents = {\n ...base,\n onStep: (n) => {\n resetIdle();\n base?.onStep?.(n);\n },\n };\n\n opts.events?.onWorkerStart?.(subtask, agent.config.name);\n resetIdle();\n\n let outcome: WorkerOutcome;\n try {\n outcome = await runWorker(subtask, agent, wt, opts.allow, opts.deny, events, ac.signal);\n } catch {\n outcome = {\n subtask,\n agentName: agent.config.name,\n branch: wt.branch,\n finished: false,\n committed: false,\n steps: 0,\n };\n } finally {\n if (idleTimer) clearTimeout(idleTimer);\n opts.signal?.removeEventListener(\"abort\", onAbort);\n }\n opts.events?.onWorkerDone?.(outcome);\n return outcome;\n}\n\n/** Run `fn` over `items` with at most `limit` in flight; preserves result order. */\nasync function runPool<T, R>(\n items: T[],\n limit: number,\n fn: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n let next = 0;\n const worker = async (): Promise<void> => {\n for (;;) {\n const i = next++;\n if (i >= items.length) return;\n results[i] = await fn(items[i]!, i);\n }\n };\n await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));\n return results;\n}\n\nconst DECOMPOSE_SYSTEM = [\n \"You are a tech lead splitting a coding task into independent subtasks that can be done in parallel.\",\n \"Return ONLY a JSON array. Each item: {\\\"title\\\": string, \\\"brief\\\": string}.\",\n \"Make subtasks touch DIFFERENT files/areas to minimize merge conflicts.\",\n \"Keep the list small (prefer 2-4 items). Each brief must be self-contained and actionable.\",\n].join(\"\\n\");\n\n/** Ask the lead agent to split the task into subtasks; fall back to a single subtask. */\nasync function decompose(\n lead: ResolvedAgent,\n task: string,\n maxSubtasks: number,\n signal?: AbortSignal,\n): Promise<Subtask[]> {\n try {\n const res = await lead.provider.chat({\n messages: [\n { role: \"system\", content: DECOMPOSE_SYSTEM },\n { role: \"user\", content: `Task:\\n${task}\\n\\nReturn at most ${maxSubtasks} subtasks as a JSON array.` },\n ],\n params: { temperature: 0 },\n signal,\n });\n const parsed = extractJsonArray(res.content);\n if (parsed && parsed.length > 0) {\n return parsed.slice(0, maxSubtasks).map((item, i) => ({\n id: `t${i + 1}`,\n title: String(item.title ?? `subtask ${i + 1}`),\n brief: String(item.brief ?? item.title ?? task),\n }));\n }\n } catch {\n /* fall through to single-subtask mode */\n }\n return [{ id: \"t1\", title: \"task\", brief: task }];\n}\n\nfunction extractJsonArray(text: string): Array<{ title?: string; brief?: string }> | null {\n const start = text.indexOf(\"[\");\n const end = text.lastIndexOf(\"]\");\n if (start === -1 || end <= start) return null;\n try {\n const parsed = JSON.parse(text.slice(start, end + 1));\n return Array.isArray(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n","import type { ResolvedAgent } from \"../providers/registry.js\";\n\n/**\n * How many workers may hit a single Ollama endpoint at once. Local Ollama serves\n * one or two models at a time and thrashes under more, so we cap it low to avoid\n * the contention that froze a 5-agent swarm. Tune here.\n */\nexport const OLLAMA_ENDPOINT_CONCURRENCY = 2;\n\n/** Default idle timeout (ms) before a worker that stops making progress is aborted. */\nexport const DEFAULT_IDLE_TIMEOUT_MS = 300_000;\n\nfunction endpointKey(agent: ResolvedAgent): string {\n return `${agent.config.provider}:${agent.config.baseUrl ?? \"default\"}`;\n}\n\n/**\n * Recommend how many workers to run concurrently for a set of agents. Hosted\n * providers parallelize freely (capacity = agents on that endpoint), while each\n * Ollama endpoint is capped at {@link OLLAMA_ENDPOINT_CONCURRENCY}. Capacities\n * sum across distinct endpoints. Always at least 1.\n */\nexport function recommendConcurrency(agents: ResolvedAgent[]): number {\n const perEndpoint = new Map<string, number>();\n for (const a of agents) {\n perEndpoint.set(endpointKey(a), (perEndpoint.get(endpointKey(a)) ?? 0) + 1);\n }\n let total = 0;\n for (const [key, count] of perEndpoint) {\n total += key.startsWith(\"ollama:\") ? Math.min(count, OLLAMA_ENDPOINT_CONCURRENCY) : count;\n }\n return Math.max(1, total);\n}\n\n/** Idle timeout from env (`POLYPUS_SWARM_IDLE_TIMEOUT_MS`) or the default. */\nexport function idleTimeoutMs(): number {\n const raw = Number(process.env.POLYPUS_SWARM_IDLE_TIMEOUT_MS);\n return Number.isFinite(raw) && raw > 0 ? raw : DEFAULT_IDLE_TIMEOUT_MS;\n}\n\n/** Overall timeout (ms) for the entire swarm session from env (`POLYPUS_SWARM_OVERALL_TIMEOUT_MS`) or the default. */\nexport function overallTimeoutMs(): number {\n const raw = Number(process.env.POLYPUS_SWARM_OVERALL_TIMEOUT_MS);\n return Number.isFinite(raw) && raw > 0 ? raw : 3_600_000; // Default: 1 hour\n}\n","import type { ToolCall } from \"../core/providers/types.js\";\nimport type { Subtask, WorkerOutcome } from \"../core/agent/worker.js\";\nimport type { MergeResult } from \"../core/git/worktree.js\";\nimport { t } from \"../core/i18n/index.js\";\n\nconst RESET = \"\\x1b[0m\";\nconst FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\ntype Status = \"pending\" | \"running\" | \"done\" | \"stopped\";\n\ninterface WorkerState {\n id: string;\n title: string;\n agent: string;\n status: Status;\n action: string;\n steps: number;\n branch?: string;\n merge?: \"ok\" | \"conflict\";\n}\n\nexport interface SwarmViewOptions {\n /** Animate + redraw in place. Defaults to whether stdout is a TTY. */\n tty?: boolean;\n /** Emit ANSI colors. Defaults to `tty` (disable for tests/plain output). */\n color?: boolean;\n /** Where to write (defaults to process.stdout). */\n sink?: (s: string) => void;\n}\n\n/** One-line summary of a tool call for the live view, e.g. `read_file src/x.ts`. */\nexport function describeToolCall(call: ToolCall): string {\n const raw = call.name === \"run_command\" ? call.arguments.command : call.arguments.path;\n const arg = typeof raw === \"string\" ? raw : \"\";\n const short = arg.length > 40 ? arg.slice(0, 39) + \"…\" : arg;\n return short ? `${call.name} ${short}` : call.name;\n}\n\n/**\n * Live, multi-line dashboard for the swarm: an orchestrator header plus one row\n * per worker showing its current action, step count and a spinner. Redraws in\n * place on a TTY; falls back to discrete event lines when piped.\n */\nexport class SwarmView {\n private readonly tty: boolean;\n private readonly color: boolean;\n private readonly write: (s: string) => void;\n private readonly workers = new Map<string, WorkerState>();\n private order: string[] = [];\n private phase: \"decomposing\" | \"running\" | \"done\" = \"decomposing\";\n private frame = 0;\n private lastLines = 0;\n private timer: NodeJS.Timeout | undefined;\n\n constructor(private readonly leadName: string, opts: SwarmViewOptions = {}) {\n this.tty = opts.tty ?? (Boolean(process.stdout.isTTY) && !process.env.NO_COLOR);\n this.color = opts.color ?? this.tty;\n this.write = opts.sink ?? ((s) => process.stdout.write(s));\n }\n\n start(): void {\n if (!this.tty) {\n this.write(`🐙 ${t(\"swarm.view.header\", { lead: this.leadName })} — ${t(\"swarm.view.decomposing\")}\\n`);\n return;\n }\n this.flush();\n this.timer = setInterval(() => {\n this.frame = (this.frame + 1) % FRAMES.length;\n this.flush();\n }, 110);\n this.timer.unref?.();\n }\n\n setSubtasks(subtasks: Subtask[]): void {\n this.phase = \"running\";\n for (const s of subtasks) {\n this.workers.set(s.id, { id: s.id, title: s.title, agent: \"\", status: \"pending\", action: \"\", steps: 0 });\n this.order.push(s.id);\n }\n if (!this.tty) {\n this.write(` ${t(\"swarm.decomposed\", { n: subtasks.length })}\\n`);\n for (const s of subtasks) this.write(` ${s.id}: ${s.title}\\n`);\n }\n this.flush();\n }\n\n workerStart(id: string, agent: string): void {\n const w = this.workers.get(id);\n if (!w) return;\n w.agent = agent;\n w.status = \"running\";\n if (!this.tty) this.write(` ▶ ${id} [${agent}] ${w.title}\\n`);\n this.flush();\n }\n\n workerAction(id: string, action: string): void {\n const w = this.workers.get(id);\n if (!w) return;\n w.action = action;\n this.flush();\n }\n\n workerStep(id: string, n: number): void {\n const w = this.workers.get(id);\n if (!w) return;\n w.steps = n;\n this.flush();\n }\n\n workerDone(o: WorkerOutcome): void {\n const w = this.workers.get(o.subtask.id);\n if (!w) return;\n w.status = o.finished ? \"done\" : \"stopped\";\n w.steps = o.steps;\n w.branch = o.branch;\n w.action = \"\";\n if (!this.tty) {\n const tag = o.finished ? \"✓\" : \"■\";\n const changes = o.committed ? t(\"swarm.changesCommitted\") : t(\"swarm.noChanges\");\n this.write(` ${tag} ${o.subtask.id} (${t(\"swarm.view.steps\", { n: o.steps })}, ${changes})\\n`);\n }\n this.flush();\n }\n\n merge(r: MergeResult): void {\n for (const w of this.workers.values()) {\n if (w.branch === r.branch) w.merge = r.ok ? \"ok\" : \"conflict\";\n }\n if (!this.tty) {\n this.write(r.ok ? ` ⤵ ${t(\"swarm.merged\", { branch: r.branch })}\\n` : ` ✗ ${t(\"swarm.mergeConflict\", { branch: r.branch })}\\n`);\n }\n this.flush();\n }\n\n stop(): void {\n this.phase = \"done\";\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n this.flush(); // leave the final frame on screen\n }\n\n /** Content lines of the dashboard (no cursor control). Exposed for tests. */\n frameLines(): string[] {\n const spin = this.dim(FRAMES[this.frame]!);\n const lead = `🐙 ${t(\"swarm.view.header\", { lead: this.leadName })}`;\n const lines: string[] = [];\n\n if (this.phase === \"decomposing\") {\n lines.push(`${spin} ${lead}`);\n lines.push(\" \" + this.dim(t(\"swarm.view.decomposing\")));\n return lines;\n }\n\n lines.push(`${this.phase === \"running\" ? spin : \" \"} ${lead}`);\n lines.push(\"\");\n for (const id of this.order) {\n const w = this.workers.get(id)!;\n lines.push(this.row(w, spin));\n }\n return lines;\n }\n\n // -------------------------------------------------------------------------\n\n private row(w: WorkerState, spin: string): string {\n const icon =\n w.status === \"running\" ? spin\n : w.status === \"done\" ? this.c(\"✓\", \"32\")\n : w.status === \"stopped\" ? this.c(\"■\", \"33\")\n : this.dim(\"·\");\n const status = this.statusLabel(w);\n const meta =\n w.steps > 0\n ? this.dim(\" · \" + (w.status === \"running\"\n ? t(\"swarm.view.step\", { n: w.steps })\n : t(\"swarm.view.steps\", { n: w.steps })))\n : \"\";\n const action = w.action ? w.action : this.dim(\"—\");\n return ` ${icon} ${pad(w.id, 4)} ${pad(status, 12)} ${pad(`[${w.agent}]`, 14)} ${action}${meta}`;\n }\n\n private statusLabel(w: WorkerState): string {\n if (w.merge === \"conflict\") return this.c(t(\"swarm.view.conflict\"), \"31\");\n if (w.status === \"running\") return this.c(t(\"swarm.view.running\"), \"36\");\n if (w.status === \"done\") return this.c(t(\"swarm.view.done\"), \"32\");\n if (w.status === \"stopped\") return this.c(t(\"swarm.view.stopped\"), \"33\");\n return this.dim(t(\"swarm.view.pending\"));\n }\n\n /** Redraw the block in place (TTY) by clearing the previous frame first. */\n private flush(): void {\n if (!this.tty) return;\n const lines = this.frameLines();\n let s = \"\";\n if (this.lastLines > 0) s += `\\x1b[${this.lastLines}A`; // up to block top\n s += \"\\x1b[0J\"; // clear from cursor to end of screen\n s += lines.join(\"\\n\") + \"\\n\";\n this.write(s);\n this.lastLines = lines.length;\n }\n\n private c(s: string, code: string): string {\n return this.color ? `\\x1b[${code}m${s}${RESET}` : s;\n }\n private dim(s: string): string {\n return this.color ? `\\x1b[2m${s}${RESET}` : s;\n }\n}\n\nfunction pad(s: string, n: number): string {\n return s.length >= n ? s : s + \" \".repeat(n - s.length);\n}\n","export interface CancelListener {\n /** Temporarily stop listening (e.g. to hand stdin to a clack prompt). */\n pause(): void;\n /** Resume listening after a pause. */\n resume(): void;\n /** Stop listening and restore the terminal. */\n dispose(): void;\n}\n\n/**\n * While a long task runs, listen on raw stdin for ESC (0x1b) or Ctrl+C (0x03)\n * and abort the controller. `pause()`/`resume()` let a clack confirmation borrow\n * stdin. No-op when stdin is not a TTY (pipes, tests). Shared by `polypus run`\n * and `polypus swarm`.\n */\nexport function listenForCancel(controller: AbortController): CancelListener {\n const stdin = process.stdin;\n if (!stdin.isTTY) return { pause() {}, resume() {}, dispose() {} };\n\n const onData = (buf: Buffer): void => {\n // Only a lone ESC / Ctrl+C — multi-byte sequences (arrow keys) are ignored.\n if (buf.length === 1 && (buf[0] === 0x1b || buf[0] === 0x03)) controller.abort();\n };\n\n let active = false;\n const attach = (): void => {\n if (active) return;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.on(\"data\", onData);\n active = true;\n };\n const detach = (): void => {\n if (!active) return;\n stdin.off(\"data\", onData);\n stdin.setRawMode(false);\n stdin.pause();\n active = false;\n };\n\n attach();\n return { pause: detach, resume: attach, dispose: detach };\n}\n","const RESET = \"\\x1b[0m\";\nconst isTTY = Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;\nconst FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst violet = (s: string) => (isTTY ? `\\x1b[38;2;167;139;250m${s}${RESET}` : s);\nconst dim = (s: string) => (isTTY ? `\\x1b[2m${s}${RESET}` : s);\n\n/**\n * Single-line animated \"thinking\" indicator with an octopus icon and elapsed\n * time, e.g. `⠹ 🐙 pensando… (3s)`. No-op when stdout is not a TTY so piped\n * output and logs stay clean.\n */\nexport class Spinner {\n private timer: NodeJS.Timeout | undefined;\n private frame = 0;\n private startedAt = 0;\n private label = \"\";\n private suffix = \"\";\n\n /** Extra dim text appended after the elapsed time (e.g. token count). */\n setSuffix(suffix: string): void {\n this.suffix = suffix;\n }\n\n /** Start (or, if already running, just update the label). */\n start(label: string): void {\n this.label = label;\n if (!isTTY) return;\n if (this.timer) return; // already animating; label updated above\n this.startedAt = Date.now();\n this.render();\n this.timer = setInterval(() => this.render(), 90);\n // Avoid keeping the process alive solely for the spinner.\n this.timer.unref?.();\n }\n\n /** Erase the spinner line and stop animating. */\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n if (isTTY) process.stdout.write(\"\\r\\x1b[K\");\n }\n\n private render(): void {\n const f = violet(FRAMES[this.frame = (this.frame + 1) % FRAMES.length]!);\n const secs = Math.floor((Date.now() - this.startedAt) / 1000);\n const time = secs > 0 ? dim(` (${secs}s)`) : \"\";\n const suffix = this.suffix ? dim(` · ${this.suffix}`) : \"\";\n process.stdout.write(`\\r\\x1b[K${f} 🐙 ${dim(this.label + \"…\")}${time}${suffix}`);\n }\n}\n","import { runWizard } from \"../../ui/wizard.js\";\n\n/** `polypus setup` — interactive onboarding wizard. */\nexport async function setup(): Promise<void> {\n await runWizard();\n}\n","import pc from \"picocolors\";\nimport { scaffoldPoly } from \"../../core/scaffold/init.js\";\nimport { getLocale, t } from \"../../core/i18n/index.js\";\n\nexport interface InitOptions {\n force?: boolean;\n}\n\n/** `polypus init` — scaffold a `.poly/` workspace in the current directory. */\nexport async function init(opts: InitOptions): Promise<void> {\n const { created, skipped } = await scaffoldPoly(process.cwd(), {\n force: Boolean(opts.force),\n locale: getLocale(),\n });\n\n if (created.length === 0) {\n console.log(pc.yellow(t(\"init.allExist\")));\n for (const f of skipped) console.log(pc.dim(` ${f}`));\n console.log(pc.dim(t(\"init.forceHint\")));\n return;\n }\n\n console.log(pc.green(t(\"init.created\")));\n for (const f of created) console.log(pc.dim(` ${f}`));\n if (skipped.length > 0) {\n console.log(pc.dim(t(\"init.skipped\")));\n for (const f of skipped) console.log(pc.dim(` ${f}`));\n }\n console.log(\"\\n\" + t(\"init.tip\"));\n}\n","import { mkdir, writeFile, access } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { Locale } from \"../i18n/index.js\";\nimport { polyTemplates } from \"./templates.js\";\n\nexport interface ScaffoldResult {\n /** Files written, as `.poly/`-prefixed forward-slash paths. */\n created: string[];\n /** Files left untouched because they already existed (without `--force`). */\n skipped: string[];\n}\n\n/**\n * Scaffold the `.poly/` workspace in `workspace`. Idempotent: existing files are\n * preserved unless `force` is set. Creates parent directories as needed.\n */\nexport async function scaffoldPoly(\n workspace: string,\n opts: { force?: boolean; locale: Locale },\n): Promise<ScaffoldResult> {\n const templates = polyTemplates(opts.locale);\n const created: string[] = [];\n const skipped: string[] = [];\n\n for (const [rel, content] of Object.entries(templates)) {\n const display = `.poly/${rel}`;\n const abs = join(workspace, \".poly\", ...rel.split(\"/\"));\n if (!opts.force && (await exists(abs))) {\n skipped.push(display);\n continue;\n }\n await mkdir(dirname(abs), { recursive: true });\n await writeFile(abs, content, \"utf8\");\n created.push(display);\n }\n\n return { created, skipped };\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","import type { Locale } from \"../i18n/index.js\";\n\n/**\n * The files written by `polypus init`, keyed by their path relative to `.poly/`.\n * Content is locale-aware so a scaffolded workspace reads naturally in the user's\n * language. Keep these lean — they are starting points, not exhaustive docs.\n */\nexport function polyTemplates(locale: Locale): Record<string, string> {\n return locale === \"pt-BR\" ? PT : EN;\n}\n\nconst EN: Record<string, string> = {\n \"agents.md\": `# agents.md — how an AI agent operates this repo\n\n> Local workspace under \\`.poly/\\`. Conditions any AI agent (Polypus, Claude, …)\n> to work the way this project expects. **Polypus loads this file automatically**\n> into the agent's system prompt on every run, so keep it accurate and lean.\n\n## Role\n\nYou implement changes end to end — from understanding the task to a reviewable\nresult — respecting the rules below.\n\n## Golden rules\n\n1. Green before a PR: the project builds, type-checks and tests pass.\n2. Keep docs/changelog in sync with behavior changes.\n3. Confirm before irreversible actions (publishing, deleting, force-pushing).\n4. Small, targeted changes over broad rewrites.\n\n## Skills index\n\n| Skill | When to use |\n|-------|-------------|\n| [skills/coding.md](skills/coding.md) | Technical standards for any code change |\n| [skills/spec-driven.md](skills/spec-driven.md) | Write a spec before non-trivial work |\n\n## Environment\n\n- Describe the OS, shell, package manager and any tooling the agent needs.\n- Note where credentials/CLIs live and how commands are run.\n`,\n\n \"README.md\": `# .poly — your project's AI operating manual\n\n\\`.poly/\\` is a small, local workspace that teaches AI agents how to work in THIS\nrepository. Gitignore it to keep it personal, or commit it to standardize the\nworkflow across your team.\n\n## What's inside\n\n- **\\`agents.md\\`** — the entry point: role, golden rules and an index of skills.\n Polypus loads it automatically into the agent's system prompt on every run.\n- **\\`skills/\\`** — focused how-to guides the agent reads when relevant.\n- **\\`templates/spec.md\\`** — a lean Spec-Driven Development (SDD) template.\n\n## How it works\n\n1. You describe a task to the agent.\n2. The agent reads \\`agents.md\\`, follows the golden rules and opens the skills it needs.\n3. For non-trivial work, it writes a spec first from \\`templates/spec.md\\`.\n\n## Extend it\n\n- Edit \\`agents.md\\` to encode your conventions.\n- Add one skill file per recurring workflow (releases, reviews, migrations…).\n- Reference new skills from \\`agents.md\\` so the agent can discover them.\n\nRegenerate any missing files with \\`polypus init\\` (existing files are preserved;\nuse \\`--force\\` to overwrite).\n`,\n\n \"skills/coding.md\": `# skill: coding\n\nTechnical standards for changes in this repo.\n\n## Principles\n\n- Match the style, naming and structure of the surrounding code.\n- Prefer small, targeted edits over broad rewrites.\n- Add or update tests with every behavior change.\n\n## Checklist before opening a PR\n\n- [ ] Builds and type-checks\n- [ ] Tests pass\n- [ ] Docs / changelog updated when behavior changed\n`,\n\n \"skills/spec-driven.md\": `# skill: spec-driven development\n\nFor anything non-trivial, write a short spec BEFORE coding.\n\n## Flow\n\n1. Copy \\`templates/spec.md\\` into your issue (or \\`specs/<slug>.md\\`).\n2. Fill **Why / What / Acceptance criteria / Out of scope**.\n3. Get a thumbs-up, then implement to the acceptance criteria.\n4. Keep the spec updated if scope changes.\n\nLean by design: if a section is empty, delete it.\n`,\n\n \"templates/spec.md\": `# Spec: <title>\n\n> Status: draft · Owner: <name> · Updated: <yyyy-mm-dd>\n\n## Why\n\nWhat problem are we solving, and for whom? Why now?\n\n## What\n\nThe change in plain terms — the behavior a user will actually see.\n\n## Acceptance criteria\n\n- [ ] Observable outcome 1\n- [ ] Observable outcome 2\n\n## Out of scope\n\n- Things we are explicitly NOT doing here.\n\n## Notes / open questions\n\n- …\n`,\n};\n\nconst PT: Record<string, string> = {\n \"agents.md\": `# agents.md — como um agente de IA opera este repositório\n\n> Workspace local em \\`.poly/\\`. Condiciona qualquer agente de IA (Polypus, Claude…)\n> a trabalhar do jeito que este projeto espera. **O Polypus carrega este arquivo\n> automaticamente** no system prompt do agente a cada execução — mantenha-o\n> preciso e enxuto.\n\n## Papel\n\nVocê implementa mudanças de ponta a ponta — do entendimento da tarefa a um\nresultado revisável — respeitando as regras abaixo.\n\n## Regras de ouro\n\n1. Verde antes do PR: o projeto builda, passa no type-check e nos testes.\n2. Mantenha docs/changelog em sincronia com mudanças de comportamento.\n3. Confirme antes de ações irreversíveis (publicar, deletar, force-push).\n4. Mudanças pequenas e focadas em vez de reescritas amplas.\n\n## Índice de skills\n\n| Skill | Quando usar |\n|-------|-------------|\n| [skills/coding.md](skills/coding.md) | Padrões técnicos para qualquer mudança de código |\n| [skills/spec-driven.md](skills/spec-driven.md) | Escrever um spec antes de trabalho não-trivial |\n\n## Ambiente\n\n- Descreva SO, shell, gerenciador de pacotes e ferramentas que o agente precisa.\n- Anote onde ficam credenciais/CLIs e como os comandos são executados.\n`,\n\n \"README.md\": `# .poly — o manual de operação de IA do seu projeto\n\nO \\`.poly/\\` é um workspace local e pequeno que ensina agentes de IA a trabalhar\nNESTE repositório. Coloque no .gitignore para mantê-lo pessoal, ou commite para\npadronizar o fluxo entre o time.\n\n## O que tem dentro\n\n- **\\`agents.md\\`** — o ponto de entrada: papel, regras de ouro e um índice de skills.\n O Polypus carrega ele automaticamente no system prompt do agente a cada execução.\n- **\\`skills/\\`** — guias práticos e focados que o agente lê quando relevante.\n- **\\`templates/spec.md\\`** — um template enxuto de Spec-Driven Development (SDD).\n\n## Como funciona\n\n1. Você descreve uma tarefa ao agente.\n2. O agente lê o \\`agents.md\\`, segue as regras de ouro e abre as skills necessárias.\n3. Para trabalho não-trivial, escreve um spec primeiro a partir de \\`templates/spec.md\\`.\n\n## Como estender\n\n- Edite o \\`agents.md\\` para codificar suas convenções.\n- Adicione um arquivo de skill por fluxo recorrente (releases, reviews, migrações…).\n- Referencie as novas skills no \\`agents.md\\` para o agente descobri-las.\n\nRegenere arquivos que faltarem com \\`polypus init\\` (os existentes são preservados;\nuse \\`--force\\` para sobrescrever).\n`,\n\n \"skills/coding.md\": `# skill: coding\n\nPadrões técnicos para mudanças neste repositório.\n\n## Princípios\n\n- Siga o estilo, a nomenclatura e a estrutura do código ao redor.\n- Prefira edições pequenas e focadas a reescritas amplas.\n- Adicione ou atualize testes a cada mudança de comportamento.\n\n## Checklist antes de abrir um PR\n\n- [ ] Builda e passa no type-check\n- [ ] Testes passam\n- [ ] Docs / changelog atualizados quando o comportamento mudou\n`,\n\n \"skills/spec-driven.md\": `# skill: spec-driven development\n\nPara qualquer coisa não-trivial, escreva um spec curto ANTES de codar.\n\n## Fluxo\n\n1. Copie \\`templates/spec.md\\` para a issue (ou \\`specs/<slug>.md\\`).\n2. Preencha **Por quê / O quê / Critérios de aceite / Fora de escopo**.\n3. Valide com um \"ok\", então implemente até os critérios de aceite.\n4. Mantenha o spec atualizado se o escopo mudar.\n\nEnxuto por design: se uma seção ficar vazia, apague-a.\n`,\n\n \"templates/spec.md\": `# Spec: <título>\n\n> Status: rascunho · Dono: <nome> · Atualizado: <aaaa-mm-dd>\n\n## Por quê\n\nQue problema estamos resolvendo, e para quem? Por que agora?\n\n## O quê\n\nA mudança em termos simples — o comportamento que o usuário vai realmente ver.\n\n## Critérios de aceite\n\n- [ ] Resultado observável 1\n- [ ] Resultado observável 2\n\n## Fora de escopo\n\n- Coisas que explicitamente NÃO faremos aqui.\n\n## Notas / dúvidas em aberto\n\n- …\n`,\n};\n","import pc from \"picocolors\";\nimport * as p from \"@clack/prompts\";\nimport { loadConfig, resolveSecret } from \"../../core/config/store.js\";\nimport {\n filterModels,\n fmtContext,\n fmtPrice,\n listOpenRouterModels,\n type ModelSort,\n type OpenRouterModel,\n} from \"../../core/providers/openrouter.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\nexport interface ModelsCliOptions {\n search?: string;\n tools?: boolean;\n free?: boolean;\n maxPrice?: string;\n sort?: string;\n limit?: string;\n}\n\n/** `polypus models` — list OpenRouter models with filters. */\nexport async function models(opts: ModelsCliOptions): Promise<void> {\n const apiKey = await resolveOpenRouterKey();\n\n const spin = p.spinner();\n spin.start(t(\"models.fetching\"));\n let all: OpenRouterModel[];\n try {\n all = await listOpenRouterModels(apiKey);\n spin.stop(pc.green(\"✓ OpenRouter\"));\n } catch (err) {\n spin.stop(pc.red(t(\"models.fetchError\", { msg: (err as Error).message })), 2);\n return;\n }\n\n const filtered = filterModels(all, {\n search: opts.search,\n tools: opts.tools ? \"tools\" : \"any\",\n freeOnly: Boolean(opts.free),\n maxPrice: opts.maxPrice !== undefined ? Number(opts.maxPrice) : undefined,\n sort: (opts.sort as ModelSort) ?? \"price\",\n });\n\n const limit = opts.limit ? Number(opts.limit) : 30;\n printModelsTable(filtered, limit, all.length);\n}\n\n/** Render a colored, aligned table of models. Exported for reuse by the wizard. */\nexport function printModelsTable(models: OpenRouterModel[], limit: number, total: number): void {\n console.log(pc.dim(t(\"models.legend\")));\n if (models.length === 0) {\n console.log(pc.yellow(t(\"models.none\")));\n return;\n }\n\n const rows = models.slice(0, limit);\n console.log(\n \" \" +\n pc.dim(t(\"models.colTools\").padEnd(6)) +\n pc.dim(t(\"models.colPrice\").padEnd(16)) +\n pc.dim(t(\"models.colCtx\").padEnd(9)) +\n pc.dim(t(\"models.colModel\")),\n );\n for (const m of rows) {\n console.log(\" \" + modelRow(m));\n }\n console.log(pc.dim(\"\\n\" + t(\"models.shown\", { shown: rows.length, total })));\n}\n\nfunction modelRow(m: OpenRouterModel): string {\n const tools = m.supportsTools ? pc.green(\"🛠\".padEnd(5)) : pc.dim(\"—\".padEnd(5));\n const price = `${fmtPrice(m.promptPrice)}/${fmtPrice(m.completionPrice)}`;\n const priceColored = (m.free ? pc.green : pc.yellow)(price.padEnd(16));\n const ctx = pc.cyan(fmtContext(m.contextLength).padEnd(9));\n return `${tools} ${priceColored}${ctx}${pc.bold(m.id)}`;\n}\n\n/** Best-effort OpenRouter key: env first, then a configured openrouter agent. */\nasync function resolveOpenRouterKey(): Promise<string | undefined> {\n if (process.env.OPENROUTER_API_KEY) return process.env.OPENROUTER_API_KEY;\n try {\n const config = await loadConfig();\n const agent = config.agents.find((a) => a.provider === \"openrouter\" && a.apiKey);\n return agent ? resolveSecret(agent.apiKey) : undefined;\n } catch {\n return undefined;\n }\n}\n","import pc from \"picocolors\";\nimport { aggregateUsage, fmtUsd, type UsageBucket } from \"../../core/agent/usage.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\n/** `polypus usage` — aggregate token/cost analytics per day from the usage log. */\nexport async function usage(): Promise<void> {\n const { days, total } = await aggregateUsage();\n if (days.length === 0) {\n console.log(pc.yellow(t(\"usage.empty\")));\n return;\n }\n console.log(pc.bold(t(\"usage.header\")));\n for (const d of days) console.log(\" \" + formatRow(d));\n console.log(pc.dim(\" \" + \"─\".repeat(40)));\n console.log(\" \" + pc.bold(formatRow({ ...total, date: t(\"usage.total\") })));\n}\n\nfunction formatRow(b: UsageBucket): string {\n const tokens = fmtTokens(b.promptTokens + b.completionTokens);\n return `${b.date.padEnd(12)} ${tokens.padStart(7)} tok ${fmtUsd(b.costUsd).padStart(10)} (${b.runs} ${t(\"usage.runs\")})`;\n}\n\nfunction fmtTokens(n: number): string {\n return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n","import pc from \"picocolors\";\nimport { listSessions } from \"../../core/agent/session-store.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\n/** `polypus sessions` — list saved sessions that can be resumed. */\nexport async function sessions(): Promise<void> {\n const all = await listSessions();\n if (all.length === 0) {\n console.log(pc.yellow(t(\"sessions.empty\")));\n return;\n }\n console.log(pc.bold(t(\"sessions.header\")));\n for (const s of all) {\n const when = s.updatedAt.replace(\"T\", \" \").slice(0, 16);\n console.log(\n ` ${pc.cyan(s.id)} ${pc.dim(when)} ${pc.dim(`[${s.agentName} · ${s.mode} · ${s.messageCount} msgs]`)}`,\n );\n console.log(` ${s.title}`);\n }\n console.log(pc.dim(\"\\n\" + t(\"sessions.hint\")));\n}\n","import pc from \"picocolors\";\nimport { loadConfig, resolveAgent } from \"../../core/config/store.js\";\nimport { createProvider } from \"../../core/providers/registry.js\";\nimport { estimateTask } from \"../../core/agent/estimate.js\";\nimport { resolveModelPricing } from \"../../core/agent/usage.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\nexport interface EstimateOptions {\n agent?: string;\n json?: boolean;\n}\n\n/** `polypus estimate \"<task>\"` — estimate effort/cost without implementing anything. */\nexport async function estimate(task: string, opts: EstimateOptions): Promise<void> {\n const config = await loadConfig();\n const agentConfig = resolveAgent(config, opts.agent);\n const resolved = createProvider(agentConfig);\n const pricing = await resolveModelPricing(resolved.config);\n const est = await estimateTask(task, resolved, pricing);\n\n if (opts.json) {\n process.stdout.write(JSON.stringify({ estimate: est }) + \"\\n\");\n return;\n }\n\n console.log(pc.bold(t(\"estimate.header\")));\n console.log(` ${t(\"estimate.complexity\")}: ${pc.cyan(est.complexity)}`);\n console.log(` ${t(\"estimate.steps\")}: ~${est.estimatedSteps}`);\n console.log(` ${t(\"estimate.tokens\")}: ~${fmtTokens(est.estimatedTokens)}`);\n console.log(` ${t(\"estimate.cost\")}: ${pc.green(est.costLabel)}`);\n if (est.rationale) console.log(pc.dim(` ${est.rationale}`));\n if (est.risks) console.log(pc.dim(` ⚠ ${est.risks}`));\n}\n\nfunction fmtTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n","import type { ResolvedAgent } from \"../providers/registry.js\";\nimport { estimateCost, fmtUsd, type ModelPricing } from \"./usage.js\";\n\nexport type Complexity = \"low\" | \"medium\" | \"high\";\n\nexport interface TaskEstimate {\n complexity: Complexity;\n /** Estimated number of agent steps (tool round-trips) to finish. */\n estimatedSteps: number;\n /** Estimated total tokens across the whole run (prompt + completion, summed). */\n estimatedTokens: number;\n rationale: string;\n risks: string;\n /** Estimated USD cost, when model pricing is known. */\n costUsd?: number;\n /** Human-readable cost (or \"unknown\" when pricing is unavailable). */\n costLabel: string;\n}\n\nconst SYSTEM = [\n \"You estimate the effort for an autonomous coding agent (a ReAct loop that reads/edits files\",\n \"and runs commands over several steps) to implement a software task in an existing repo.\",\n \"Account for the loop re-sending growing context each step. Be realistic, not optimistic.\",\n \"Return ONLY a JSON object, no prose, with exactly these keys:\",\n '{\"complexity\":\"low|medium|high\",\"estimatedSteps\":<int>,\"estimatedTokens\":<int total across all steps>,',\n '\"rationale\":\"<one sentence>\",\"risks\":\"<one sentence>\"}',\n].join(\" \");\n\n/** Extract the first balanced JSON object from a string (tolerant of surrounding prose). */\nfunction extractJsonObject(text: string): Record<string, unknown> | undefined {\n const start = text.indexOf(\"{\");\n if (start === -1) return undefined;\n let depth = 0;\n for (let i = start; i < text.length; i++) {\n if (text[i] === \"{\") depth++;\n else if (text[i] === \"}\" && --depth === 0) {\n try {\n return JSON.parse(text.slice(start, i + 1)) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n }\n }\n return undefined;\n}\n\nfunction clampInt(value: unknown, min: number, max: number, fallback: number): number {\n const n = Math.round(Number(value));\n if (!Number.isFinite(n)) return fallback;\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Ask the agent to estimate the effort/cost of a task (one model call, no tools).\n * The model estimates steps and total tokens; cost is computed deterministically\n * from the model's pricing (assuming an agent loop is ~80% prompt / 20% completion).\n */\nexport async function estimateTask(\n task: string,\n agent: ResolvedAgent,\n pricing?: ModelPricing,\n): Promise<TaskEstimate> {\n const res = await agent.provider.chat({\n messages: [\n { role: \"system\", content: SYSTEM },\n { role: \"user\", content: `Task:\\n${task}` },\n ],\n params: { temperature: 0 },\n });\n const parsed = extractJsonObject(res.content) ?? {};\n\n const complexity: Complexity = [\"low\", \"medium\", \"high\"].includes(parsed.complexity as string)\n ? (parsed.complexity as Complexity)\n : \"medium\";\n const estimatedSteps = clampInt(parsed.estimatedSteps, 1, 300, 30);\n const estimatedTokens = clampInt(parsed.estimatedTokens, 1_000, 20_000_000, 80_000);\n const rationale = typeof parsed.rationale === \"string\" ? parsed.rationale : \"\";\n const risks = typeof parsed.risks === \"string\" ? parsed.risks : \"\";\n\n let costUsd: number | undefined;\n let costLabel = \"unknown (no pricing for this model)\";\n if (pricing) {\n costUsd = estimateCost(\n { promptTokens: Math.round(estimatedTokens * 0.8), completionTokens: Math.round(estimatedTokens * 0.2) },\n pricing,\n );\n costLabel = fmtUsd(costUsd);\n }\n\n return { complexity, estimatedSteps, estimatedTokens, rationale, risks, costUsd, costLabel };\n}\n","import { writeFile, readFile } from \"node:fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport pc from \"picocolors\";\nimport { generatePrd, type IssueInput } from \"../../core/agent/prd.js\";\nimport { resolveFreeProvider, DEFAULT_PRD_MODEL, withRetry } from \"../../core/agent/free-provider.js\";\nimport { numericRef, readStdin, stripBom, readProjectGuide } from \"./cli-io.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\nconst exec = promisify(execFile);\n\nexport interface PrdCliOptions {\n out?: string;\n model?: string;\n /** Read the issue JSON from a file (or \"-\" for stdin) instead of calling gh. */\n input?: string;\n}\n\n/** `polypus prd <issue#>` — generate a PRD from a GitHub issue (non-interactive). */\nexport async function prd(issueRef: string, opts: PrdCliOptions): Promise<void> {\n const issue = await loadIssue(issueRef, opts.input);\n const { provider } = resolveFreeProvider(opts.model ?? DEFAULT_PRD_MODEL);\n\n // Ground the PRD in the project's living summary so output fits the codebase.\n const guide = readProjectGuide([\"context.md\"]);\n const markdown = await withRetry(() => generatePrd(issue, provider, guide));\n\n if (opts.out) {\n await writeFile(opts.out, markdown + \"\\n\", \"utf8\");\n console.error(pc.green(t(\"prd.wrote\", { path: opts.out })));\n } else {\n process.stdout.write(markdown + \"\\n\");\n }\n}\n\n/** Load the issue from --input (JSON file/stdin) or by shelling out to `gh`. */\nasync function loadIssue(issueRef: string, input?: string): Promise<IssueInput> {\n if (input) {\n const raw = input === \"-\" ? await readStdin() : await readFile(input, \"utf8\");\n return normalize(JSON.parse(stripBom(raw)));\n }\n const num = numericRef(issueRef);\n const { stdout } = await exec(\"gh\", [\"issue\", \"view\", num, \"--json\", \"number,title,body,comments\"]);\n const data = normalize(JSON.parse(stdout));\n data.number ??= Number(num);\n return data;\n}\n\n/** Map gh's JSON shape (comments[].author.login) onto IssueInput. */\nfunction normalize(raw: {\n number?: number;\n title?: string;\n body?: string;\n comments?: { author?: { login?: string }; body?: string }[];\n}): IssueInput {\n return {\n number: raw.number,\n title: raw.title ?? \"\",\n body: raw.body ?? \"\",\n comments: (raw.comments ?? []).map((c) => ({ author: c.author?.login, body: c.body ?? \"\" })),\n };\n}\n\n","import type { Message, Provider } from \"../providers/types.js\";\n\nexport interface IssueInput {\n number?: number;\n title: string;\n body: string;\n /** Issue comments, oldest first. */\n comments?: { author?: string; body: string }[];\n}\n\nconst SYSTEM = [\n \"You are a product analyst. You turn a GitHub issue into a concise, structured PRD\",\n \"(Product Requirements Document) in Markdown.\",\n \"Rules:\",\n \"- Use ONLY information present in the issue and its comments. Do NOT invent scope,\",\n \" numbers, deadlines, or stakeholders. If something is unknown, write 'A definir'.\",\n \"- Be objective and short; prefer bullet points over prose.\",\n \"- Write in the same language as the issue (Portuguese if the issue is in Portuguese).\",\n].join(\"\\n\");\n\n/** Build the PRD prompt body from an issue. Exported for testing/inspection. */\nexport function buildPrdPrompt(issue: IssueInput): string {\n const comments = (issue.comments ?? [])\n .map((c, i) => `Comentário ${i + 1}${c.author ? ` (@${c.author})` : \"\"}:\\n${c.body}`)\n .join(\"\\n\\n\");\n return [\n `Issue${issue.number ? ` #${issue.number}` : \"\"}: ${issue.title}`,\n \"\",\n \"Corpo:\",\n issue.body || \"(vazio)\",\n comments ? `\\n${comments}` : \"\",\n \"\",\n \"Gere um PRD com EXATAMENTE estas seções (H2 com ##):\",\n \"## Contexto / Problema\",\n \"## Objetivo\",\n \"## Escopo (in / out)\",\n \"## Requisitos funcionais\",\n \"## Critérios de aceite\",\n \"## Riscos e alternativas\",\n ].join(\"\\n\");\n}\n\n/**\n * Generate a PRD from an issue with a single (no-tool) chat call. Robust on the\n * small free OpenRouter models since input is one issue and output is a document.\n */\nexport async function generatePrd(\n issue: IssueInput,\n provider: Provider,\n projectContext?: string,\n): Promise<string> {\n const messages: Message[] = [{ role: \"system\", content: SYSTEM }];\n if (projectContext) {\n messages.push({\n role: \"system\",\n content: `Project context (for grounding; do not restate verbatim):\\n${projectContext}`,\n });\n }\n messages.push({ role: \"user\", content: buildPrdPrompt(issue) });\n const res = await provider.chat({\n messages,\n params: { maxTokens: 2000, temperature: 0.2 },\n });\n const text = res.content.trim();\n if (!text) throw new Error(\"The model returned an empty PRD.\");\n return text;\n}\n","import type { AgentConfig } from \"../config/schema.js\";\nimport { createProvider, type ResolvedAgent } from \"../providers/registry.js\";\n\n/**\n * Build an OpenRouter provider on demand, keyed off `OPENROUTER_API_KEY` in the\n * environment. Used by the non-interactive `prd` and `review` commands (locally\n * and in CI) so they need no configured agent — just the secret.\n *\n * The model defaults to a free OpenRouter model; callers pass an explicit model\n * (CLI `--model` or a `POLYPUS_*_MODEL` env override) to change it.\n */\nexport function resolveFreeProvider(model: string): ResolvedAgent {\n if (!process.env.OPENROUTER_API_KEY) {\n throw new Error(\n \"OPENROUTER_API_KEY is not set. Export it (or add it as a repo secret in CI) before running this command.\",\n );\n }\n const config: AgentConfig = {\n name: \"openrouter-free\",\n provider: \"openrouter\",\n model,\n apiKey: \"${OPENROUTER_API_KEY}\",\n toolMode: \"native\",\n };\n return createProvider(config);\n}\n\n/** Default free models per task; overridable via env then CLI `--model`. */\nexport const DEFAULT_PRD_MODEL = process.env.POLYPUS_PRD_MODEL ?? \"openai/gpt-oss-120b:free\";\nexport const DEFAULT_REVIEW_MODEL = process.env.POLYPUS_REVIEW_MODEL ?? \"openai/gpt-oss-120b:free\";\n\n/**\n * Retry a flaky call with exponential backoff. Free OpenRouter models are\n * heavily rate-limited (HTTP 429), so a couple of retries make the CLI/CI runs\n * far more reliable. Only transient errors (429, 5xx, network) are retried.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n opts: { attempts?: number; baseMs?: number } = {},\n): Promise<T> {\n const attempts = opts.attempts ?? 4;\n const baseMs = opts.baseMs ?? 2000;\n let lastErr: unknown;\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n const msg = (err as Error)?.message ?? \"\";\n const transient = /\\b429\\b|\\b5\\d\\d\\b|rate|timeout|ETIMEDOUT|ECONNRESET|EAI_AGAIN/i.test(msg);\n if (!transient || i === attempts - 1) throw err;\n await new Promise((r) => setTimeout(r, baseMs * 2 ** i));\n }\n }\n throw lastErr;\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { t } from \"../../core/i18n/index.js\";\n\n/** Max chars of project guide files fed to the PRD/review bots (keeps prompts bounded). */\nconst GUIDE_MAX = 12_000;\n\n/**\n * Read project guide files (e.g. `context.md`, `rules.md`) from the workspace\n * to ground the PRD/review bots. Returns undefined when none exist, and caps the\n * combined size so a large file can't blow the model's context window.\n */\nexport function readProjectGuide(files: string[]): string | undefined {\n const parts: string[] = [];\n for (const file of files) {\n try {\n const path = resolve(process.cwd(), file);\n if (existsSync(path)) parts.push(`# ${file}\\n${readFileSync(path, \"utf8\").trim()}`);\n } catch {\n /* ignore unreadable files */\n }\n }\n if (parts.length === 0) return undefined;\n const joined = parts.join(\"\\n\\n\");\n return joined.length > GUIDE_MAX ? joined.slice(0, GUIDE_MAX) + \"\\n…(truncated)\" : joined;\n}\n\n/** Strip a leading `#` and assert the ref is a bare issue/PR number. */\nexport function numericRef(ref: string): string {\n const num = ref.replace(/^#/, \"\");\n if (!/^\\d+$/.test(num)) throw new Error(t(\"cli.invalidRef\", { ref }));\n return num;\n}\n\n/**\n * Read all of stdin as UTF-8. Fails fast when stdin is a TTY (i.e. `--input -`\n * was passed with no pipe), which would otherwise hang waiting for input.\n */\nexport async function readStdin(): Promise<string> {\n if (process.stdin.isTTY) throw new Error(t(\"cli.stdinTty\"));\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\n/** Drop a leading UTF-8 BOM that some shells/files prepend, which breaks JSON.parse. */\nexport function stripBom(s: string): string {\n return s.charCodeAt(0) === 0xfeff ? s.slice(1) : s;\n}\n","import { writeFile, readFile } from \"node:fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport pc from \"picocolors\";\nimport { reviewDiff, type PrMeta } from \"../../core/agent/review.js\";\nimport { resolveFreeProvider, DEFAULT_REVIEW_MODEL, withRetry } from \"../../core/agent/free-provider.js\";\nimport { numericRef, readStdin, readProjectGuide } from \"./cli-io.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\nconst exec = promisify(execFile);\n\nexport interface ReviewCliOptions {\n out?: string;\n model?: string;\n /** Read the diff from a file (or \"-\" for stdin) instead of calling gh. */\n input?: string;\n}\n\n/** `polypus review <pr#>` — review a PR diff with a free model (non-interactive). */\nexport async function review(prRef: string, opts: ReviewCliOptions): Promise<void> {\n const num = opts.input ? prRef.replace(/^#/, \"\") : numericRef(prRef);\n const diff = await loadDiff(num, opts.input);\n const meta = await loadMeta(num, opts.input);\n const { provider } = resolveFreeProvider(opts.model ?? DEFAULT_REVIEW_MODEL);\n\n // Review against the project's conventions and summary when available.\n const guide = readProjectGuide([\"rules.md\", \"context.md\"]);\n const markdown = await withRetry(() => reviewDiff(diff, meta, provider, guide));\n\n if (opts.out) {\n await writeFile(opts.out, markdown + \"\\n\", \"utf8\");\n console.error(pc.green(t(\"review.wrote\", { path: opts.out })));\n } else {\n process.stdout.write(markdown + \"\\n\");\n }\n}\n\n/** Diff from --input (file/stdin) or `gh pr diff`. */\nasync function loadDiff(num: string, input?: string): Promise<string> {\n if (input) return input === \"-\" ? readStdin() : readFile(input, \"utf8\");\n const { stdout } = await exec(\"gh\", [\"pr\", \"diff\", num]);\n return stdout;\n}\n\n/** PR title/body from `gh pr view`; skipped (placeholder) when reading --input. */\nasync function loadMeta(num: string, input?: string): Promise<PrMeta> {\n if (input) return { number: Number(num) || undefined, title: `PR ${num}`, body: \"\" };\n const { stdout } = await exec(\"gh\", [\"pr\", \"view\", num, \"--json\", \"number,title,body\"]);\n const raw = JSON.parse(stdout) as { number?: number; title?: string; body?: string };\n return { number: raw.number, title: raw.title ?? \"\", body: raw.body ?? \"\" };\n}\n","import type { Message, Provider } from \"../providers/types.js\";\n\nexport interface PrMeta {\n number?: number;\n title: string;\n body: string;\n}\n\n/**\n * Diffs above this many chars are truncated so they fit a free model's context.\n * Override with POLYPUS_MAX_DIFF_CHARS for models with a smaller window.\n */\nexport const MAX_DIFF_CHARS = Number(process.env.POLYPUS_MAX_DIFF_CHARS) || 60_000;\n\nconst SYSTEM = [\n \"You are a senior code reviewer. Review the pull request diff below and report\",\n \"concrete findings in Markdown.\",\n \"Rules:\",\n \"- Focus on correctness bugs, security risks, and clear, actionable improvements.\",\n \"- Reference file paths (and line hints when visible) so findings are easy to locate.\",\n \"- Be concise. Skip style nitpicks unless they hide a real problem.\",\n \"- If there are no relevant problems, say so briefly instead of inventing issues.\",\n \"- Write in the same language as the PR description (Portuguese if it is in Portuguese).\",\n].join(\"\\n\");\n\n/** Clip an oversized diff, keeping the head and noting how much was dropped. */\nexport function clampDiff(diff: string, max = MAX_DIFF_CHARS): string {\n if (diff.length <= max) return diff;\n const dropped = diff.length - max;\n return `${diff.slice(0, max)}\\n\\n… [diff truncado: ${dropped} caracteres omitidos para caber no contexto do modelo]`;\n}\n\n/** Build the review prompt body. Exported for testing/inspection. */\nexport function buildReviewPrompt(diff: string, meta: PrMeta): string {\n return [\n `PR${meta.number ? ` #${meta.number}` : \"\"}: ${meta.title}`,\n \"\",\n \"Descrição:\",\n meta.body || \"(vazia)\",\n \"\",\n \"Diff:\",\n \"```diff\",\n clampDiff(diff),\n \"```\",\n \"\",\n \"Liste os achados agrupados por severidade (🔴 bug, 🟡 atenção, 🟢 sugestão).\",\n ].join(\"\\n\");\n}\n\n/**\n * Review a PR diff with a single (no-tool) chat call. Returns Markdown suitable\n * for posting as a PR comment.\n */\nexport async function reviewDiff(\n diff: string,\n meta: PrMeta,\n provider: Provider,\n projectGuide?: string,\n): Promise<string> {\n if (!diff.trim()) return \"_Sem alterações no diff para revisar._\";\n const messages: Message[] = [{ role: \"system\", content: SYSTEM }];\n if (projectGuide) {\n messages.push({\n role: \"system\",\n content: `Project context and conventions to review against:\\n${projectGuide}`,\n });\n }\n messages.push({ role: \"user\", content: buildReviewPrompt(diff, meta) });\n const res = await provider.chat({\n messages,\n params: { maxTokens: 1500, temperature: 0.2 },\n });\n const text = res.content.trim();\n if (!text) throw new Error(\"The model returned an empty review.\");\n return text;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\n\n/**\n * Minimal .env loader. Reads simple KEY=VALUE lines and sets them on\n * process.env *without* overriding variables already present in the real\n * environment. This lets Polypus pick up keys (e.g. OPENROUTER_API_KEY) from\n * ~/.polypus/.env regardless of how the OS propagates user env vars to shells.\n */\nexport function loadDotenv(paths: string[]): void {\n for (const path of paths) {\n if (!existsSync(path)) continue;\n let text: string;\n try {\n text = readFileSync(path, \"utf8\");\n } catch {\n continue;\n }\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const eq = line.indexOf(\"=\");\n if (eq === -1) continue;\n const key = line.slice(0, eq).trim();\n let value = line.slice(eq + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (key && process.env[key] === undefined) process.env[key] = value;\n }\n }\n}\n"],"mappings":"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","names":["pc","pc","pc","pc","pc","pc","p","t","text","t","usage","readFile","resolve","p","text","text","i","j","k","readFile","resolve","t","text","t","readFile","writeFile","resolve","z","resolve","z","Args","readFile","resolve","z","Args","z","Args","stdout","readdir","readFile","join","resolve","z","Args","z","MAX_OUTPUT","resolve","readdir","join","readFile","mkdir","writeFile","resolve","z","Args","t","readFile","readdir","dirname","resolve","text","center","readFile","join","MAX_CHARS","text","exec","readFile","join","promisify","z","execAsync","text","usage","note","t","readdir","readFile","stat","resolve","tokens","resolve","stat","readdir","readFile","exec","readFile","resolve","promisify","execAsync","MAX_OUTPUT","stdout","clamp","mkdir","readFile","join","models","models","usage","join","mkdir","text","readFile","mkdir","readFile","readdir","writeFile","join","join","mkdir","writeFile","readFile","readdir","text","exec","readFile","readdir","join","promisify","z","execAsync","MAX_OUTPUT","stdout","clamp","readFile","join","z","text","p","resolve","z","MAX_OUTPUT","readFile","join","text","text","pc","pc","pc","models","pc","require","pad","text","pc","text","resolve","pc","removeAgent","pc","join","idleTimeoutMs","text","RESET","stdin","pc","cancel","RESET","FRAMES","pc","resolved","spinner","cancel","usage","text","pc","mkdir","writeFile","dirname","join","join","mkdir","dirname","writeFile","pc","pc","p","pc","models","pc","pc","tokens","fmtTokens","pc","pc","pc","text","pc","fmtTokens","writeFile","readFile","promisify","pc","SYSTEM","text","existsSync","resolve","resolve","existsSync","exec","promisify","writeFile","pc","readFile","normalize","stdout","writeFile","readFile","execFile","promisify","pc","SYSTEM","text","exec","promisify","execFile","writeFile","pc","readFile","stdout","join","existsSync","readFileSync","text","pc","join"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/add-agent.ts","../src/core/config/schema.ts","../src/core/config/store.ts","../src/core/i18n/index.ts","../src/core/providers/defaults.ts","../src/cli/commands/remove-agent.ts","../src/cli/commands/list-agents.ts","../src/cli/commands/run.ts","../src/core/providers/anthropic.ts","../src/core/providers/openai-compatible.ts","../src/core/providers/registry.ts","../src/core/permissions/modes.ts","../src/core/permissions/allowlist.ts","../src/core/permissions/policy.ts","../src/core/permissions/diff.ts","../src/core/protocol/system-prompt.ts","../src/core/protocol/native.ts","../src/core/protocol/parser.ts","../src/core/protocol/emulated.ts","../src/core/tools/edit-file.ts","../src/core/tools/list-dir.ts","../src/core/tools/read-file.ts","../src/core/tools/run-command.ts","../src/core/tools/search-file.ts","../src/core/tools/types.ts","../src/core/tools/write-file.ts","../src/core/tools/registry.ts","../src/core/agent/correction.ts","../src/core/agent/project-context.ts","../src/core/agent/compaction.ts","../src/core/agent/hooks.ts","../src/core/agent/loop.ts","../src/core/context/mentions.ts","../src/core/agent/verify.ts","../src/core/agent/usage.ts","../src/core/providers/openrouter.ts","../src/core/agent/session-store.ts","../src/core/tools/custom.ts","../src/core/mcp/index.ts","../src/core/mcp/client.ts","../src/cli/commands/json-output.ts","../src/ui/repl.ts","../src/ui/wizard.ts","../src/core/providers/ollama.ts","../src/ui/banner.ts","../src/core/version.ts","../src/ui/line-reader.ts","../src/ui/paste.ts","../src/cli/commands/swarm.ts","../src/core/git/worktree.ts","../src/core/agent/worker.ts","../src/core/agent/orchestrator.ts","../src/core/agent/concurrency.ts","../src/ui/swarm-view.ts","../src/ui/cancel.ts","../src/ui/spinner.ts","../src/cli/commands/setup.ts","../src/cli/commands/init.ts","../src/core/scaffold/init.ts","../src/core/scaffold/templates.ts","../src/cli/commands/models.ts","../src/cli/commands/usage.ts","../src/cli/commands/sessions.ts","../src/cli/commands/estimate.ts","../src/core/agent/estimate.ts","../src/cli/commands/prd.ts","../src/core/agent/prd.ts","../src/core/agent/free-provider.ts","../src/cli/commands/cli-io.ts","../src/cli/commands/review.ts","../src/core/agent/review.ts","../src/core/config/dotenv.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { addAgent } from \"./commands/add-agent.js\";\nimport { removeAgent } from \"./commands/remove-agent.js\";\nimport { listAgents } from \"./commands/list-agents.js\";\nimport { run } from \"./commands/run.js\";\nimport { setup } from \"./commands/setup.js\";\nimport { init } from \"./commands/init.js\";\nimport { swarm } from \"./commands/swarm.js\";\nimport { models } from \"./commands/models.js\";\nimport { usage } from \"./commands/usage.js\";\nimport { sessions } from \"./commands/sessions.js\";\nimport { estimate } from \"./commands/estimate.js\";\nimport { prd } from \"./commands/prd.js\";\nimport { review } from \"./commands/review.js\";\nimport { join } from \"node:path\";\nimport { configDir, loadConfig } from \"../core/config/store.js\";\nimport { loadDotenv } from \"../core/config/dotenv.js\";\nimport { pickLocale, setLocale, t } from \"../core/i18n/index.js\";\nimport { banner } from \"../ui/banner.js\";\nimport { VERSION } from \"../core/version.js\";\n\n/** Entry point for bare `polypus`: onboard on first run, then start interactive mode. */\nasync function launchInteractive(): Promise<void> {\n const config = await loadConfig();\n if (config.agents.length === 0) {\n console.log(banner());\n console.log(\" \" + pc.yellow(t(\"welcome.firstRun\")) + \"\\n\");\n await setup();\n }\n await run(undefined, {});\n}\n\n/** Read --lang from argv before commander parses, so help text is localized too. */\nfunction flagLocale(argv: string[]): string | undefined {\n const i = argv.indexOf(\"--lang\");\n if (i !== -1 && argv[i + 1]) return argv[i + 1];\n const eq = argv.find((a) => a.startsWith(\"--lang=\"));\n return eq?.split(\"=\")[1];\n}\n\nasync function resolveLocale(): Promise<void> {\n let configLocale: string | undefined;\n try {\n configLocale = (await loadConfig()).locale;\n } catch {\n /* ignore invalid/missing config for locale purposes */\n }\n setLocale(pickLocale({ flag: flagLocale(process.argv), config: configLocale }));\n}\n\nfunction buildProgram(): Command {\n const program = new Command();\n\n program\n .name(\"polypus\")\n .description(t(\"cli.description\"))\n .version(VERSION)\n .option(\"--lang <locale>\", t(\"cli.opt.lang\"))\n // No subcommand → launch the interactive experience (Claude/Devin-style).\n .action(() => launchInteractive());\n\n program\n .command(\"setup\")\n .description(t(\"cli.cmd.setup\"))\n .action(() => setup());\n\n program\n .command(\"init\")\n .option(\"--force\", t(\"cli.opt.force\"))\n .description(t(\"cli.cmd.init\"))\n .action((opts) => init(opts));\n\n program\n .command(\"add-agent\")\n .argument(\"<name>\", t(\"cli.arg.addAgentName\"))\n .requiredOption(\"--provider <provider>\", t(\"cli.opt.provider\"))\n .requiredOption(\"--model <model>\", t(\"cli.opt.model\"))\n .option(\"--api-key <key>\", t(\"cli.opt.apiKey\"))\n .option(\"--base-url <url>\", t(\"cli.opt.baseUrl\"))\n .option(\"--tool-mode <mode>\", t(\"cli.opt.toolMode\"), \"auto\")\n .option(\"--set-default\", t(\"cli.opt.setDefault\"))\n .description(t(\"cli.cmd.addAgent\"))\n .action((name, opts) => addAgent(name, opts));\n\n program\n .command(\"remove-agent\")\n .argument(\"<name>\", t(\"cli.arg.removeAgentName\"))\n .description(t(\"cli.cmd.removeAgent\"))\n .action((name) => removeAgent(name));\n\n program\n .command(\"list-agents\")\n .alias(\"agents\")\n .description(t(\"cli.cmd.listAgents\"))\n .action(() => listAgents());\n\n program\n .command(\"run\")\n .argument(\"[task]\", t(\"cli.arg.runTask\"))\n .option(\"--agent <name>\", t(\"cli.opt.agent\"))\n .option(\"--mode <mode>\", t(\"cli.opt.mode\"))\n .option(\"--max-steps <n>\", t(\"cli.opt.maxSteps\"))\n .option(\"--json\", t(\"cli.opt.json\"))\n .option(\"--verify\", t(\"cli.opt.verify\"))\n .option(\"--budget <usd>\", t(\"cli.opt.budget\"))\n .option(\"--continue\", t(\"cli.opt.continue\"))\n .option(\"--resume <id>\", t(\"cli.opt.resume\"))\n .description(t(\"cli.cmd.run\"))\n .action((task, opts) => run(task, opts));\n\n program\n .command(\"swarm\")\n .argument(\"<task>\", t(\"cli.arg.swarmTask\"))\n .option(\"--agents <names>\", t(\"cli.opt.agents\"))\n .option(\"--max-subtasks <n>\", t(\"cli.opt.maxSubtasks\"))\n .description(t(\"cli.cmd.swarm\"))\n .action((task, opts) => swarm(task, opts));\n\n program\n .command(\"models\")\n .option(\"--search <text>\", t(\"cli.opt.search\"))\n .option(\"--tools\", t(\"cli.opt.toolsOnly\"))\n .option(\"--free\", t(\"cli.opt.free\"))\n .option(\"--max-price <usd>\", t(\"cli.opt.maxPrice\"))\n .option(\"--sort <order>\", t(\"cli.opt.sort\"))\n .option(\"--limit <n>\", t(\"cli.opt.limit\"))\n .description(t(\"cli.cmd.models\"))\n .action((opts) => models(opts));\n\n program\n .command(\"usage\")\n .description(t(\"cli.cmd.usage\"))\n .action(() => usage());\n\n program\n .command(\"estimate\")\n .argument(\"<task>\", t(\"cli.arg.estimateTask\"))\n .option(\"--agent <name>\", t(\"cli.opt.agent\"))\n .option(\"--json\", t(\"cli.opt.json\"))\n .description(t(\"cli.cmd.estimate\"))\n .action((task, opts) => estimate(task, opts));\n\n program\n .command(\"sessions\")\n .description(t(\"cli.cmd.sessions\"))\n .action(() => sessions());\n\n program\n .command(\"prd\")\n .argument(\"<issue>\", t(\"cli.arg.prdIssue\"))\n .option(\"--out <file>\", t(\"cli.opt.out\"))\n .option(\"--model <model>\", t(\"cli.opt.model\"))\n .option(\"--input <file>\", t(\"cli.opt.input\"))\n .description(t(\"cli.cmd.prd\"))\n .action((issue, opts) => prd(issue, opts));\n\n program\n .command(\"review\")\n .argument(\"<pr>\", t(\"cli.arg.reviewPr\"))\n .option(\"--out <file>\", t(\"cli.opt.out\"))\n .option(\"--model <model>\", t(\"cli.opt.model\"))\n .option(\"--input <file>\", t(\"cli.opt.input\"))\n .description(t(\"cli.cmd.review\"))\n .action((pr, opts) => review(pr, opts));\n\n return program;\n}\n\nasync function main() {\n try {\n // Pick up secrets from ~/.polypus/.env and ./.env (does not override real env).\n loadDotenv([join(configDir(), \".env\"), join(process.cwd(), \".env\")]);\n await resolveLocale();\n await buildProgram().parseAsync(process.argv);\n } catch (err) {\n console.error(pc.red(`✗ ${(err as Error).message}`));\n process.exitCode = 1;\n }\n}\n\nvoid main();\n","import pc from \"picocolors\";\nimport { AgentConfig, ProviderKind, ToolMode } from \"../../core/config/schema.js\";\nimport { findAgent, loadConfig, saveConfig } from \"../../core/config/store.js\";\nimport { DEFAULT_BASE_URL, REQUIRES_API_KEY } from \"../../core/providers/defaults.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\nexport interface AddAgentOptions {\n provider: string;\n model: string;\n apiKey?: string;\n baseUrl?: string;\n toolMode?: string;\n setDefault?: boolean;\n}\n\n/** `polypus add-agent <name> --provider <p> --model <m> [--api-key ...] [--base-url ...]` */\nexport async function addAgent(name: string, opts: AddAgentOptions): Promise<void> {\n const config = await loadConfig();\n\n if (findAgent(config, name)) {\n throw new Error(t(\"agent.exists\", { name }));\n }\n\n const provider = ProviderKind.parse(opts.provider);\n const baseUrl = opts.baseUrl ?? DEFAULT_BASE_URL[provider];\n if (!baseUrl) {\n throw new Error(t(\"agent.needBaseUrl\", { provider }));\n }\n if (REQUIRES_API_KEY[provider] && !opts.apiKey) {\n throw new Error(t(\"agent.needApiKey\", { provider }));\n }\n\n const agent = AgentConfig.parse({\n name,\n provider,\n model: opts.model,\n apiKey: opts.apiKey,\n baseUrl,\n toolMode: ToolMode.parse(opts.toolMode ?? \"auto\"),\n });\n\n config.agents.push(agent);\n if (opts.setDefault || config.agents.length === 1) {\n config.defaultAgent = name;\n }\n await saveConfig(config);\n\n console.log(\n pc.green(t(\"agent.added\", { name: pc.bold(name) })) +\n ` (${provider} · ${opts.model})` +\n (config.defaultAgent === name ? pc.dim(` [${t(\"common.default\")}]`) : \"\"),\n );\n}\n","import { z } from \"zod\";\n\n/** Built-in provider kinds. Everything except `anthropic` is OpenAI-compatible. */\nexport const ProviderKind = z.enum([\n \"openrouter\",\n \"ollama\",\n \"openai-compatible\",\n \"anthropic\",\n]);\nexport type ProviderKind = z.infer<typeof ProviderKind>;\n\n/**\n * How the harness should drive tool-calling for an agent.\n * - `auto`: probe the provider/model and decide (native if available, else emulated).\n * - `native`: use the provider's function-calling API.\n * - `emulated`: inject the XML tool protocol into the prompt and parse the text output.\n */\nexport const ToolMode = z.enum([\"auto\", \"native\", \"emulated\"]);\nexport type ToolMode = z.infer<typeof ToolMode>;\n\nexport const PermissionMode = z.enum([\"plan\", \"review\", \"bypass\"]);\nexport type PermissionMode = z.infer<typeof PermissionMode>;\n\nexport const AgentConfig = z.object({\n /** Unique, human-friendly identifier used by add-agent/remove-agent and orchestration. */\n name: z.string().min(1),\n provider: ProviderKind,\n /** Override the provider's default base URL (required for `openai-compatible`). */\n baseUrl: z.string().url().optional(),\n model: z.string().min(1),\n /**\n * API key. Prefer an env reference like \"${OPENROUTER_API_KEY}\" over an inline secret.\n * Optional because local providers (Ollama) do not need one.\n */\n apiKey: z.string().optional(),\n toolMode: ToolMode.default(\"auto\"),\n});\nexport type AgentConfig = z.infer<typeof AgentConfig>;\n\nexport const Permissions = z.object({\n mode: PermissionMode.default(\"review\"),\n /** Glob patterns of paths the agent may read/write, relative to the workspace root. */\n allow: z.array(z.string()).default([\"**/*\"]),\n /** Glob patterns that are always denied, even if they match `allow`. */\n deny: z.array(z.string()).default([\".git/**\", \".polypus/**\", \"**/.env\"]),\n /** Shell commands (matched by prefix) the agent may run without per-call escalation. */\n allowedCommands: z.array(z.string()).default([]),\n});\nexport type Permissions = z.infer<typeof Permissions>;\n\nexport const Locale = z.enum([\"pt-BR\", \"en\"]);\nexport type Locale = z.infer<typeof Locale>;\n\nexport const PolypusConfig = z.object({\n version: z.literal(1).default(1),\n /** Interface language. Defaults to pt-BR. */\n locale: Locale.default(\"pt-BR\"),\n defaultAgent: z.string().optional(),\n agents: z.array(AgentConfig).default([]),\n permissions: Permissions.default({}),\n});\nexport type PolypusConfig = z.infer<typeof PolypusConfig>;\n\nexport const DEFAULT_CONFIG: PolypusConfig = PolypusConfig.parse({});\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n AgentConfig,\n DEFAULT_CONFIG,\n PolypusConfig,\n} from \"./schema.js\";\nimport { t } from \"../i18n/index.js\";\n\n/** Directory where Polypus keeps its config. Override with POLYPUS_HOME. */\nexport function configDir(): string {\n return process.env.POLYPUS_HOME ?? join(homedir(), \".polypus\");\n}\n\nexport function configPath(): string {\n return join(configDir(), \"config.json\");\n}\n\n/** Load config from disk, falling back to defaults if it does not exist yet. */\nexport async function loadConfig(): Promise<PolypusConfig> {\n const path = configPath();\n if (!existsSync(path)) return structuredClone(DEFAULT_CONFIG);\n let raw: unknown;\n try {\n raw = JSON.parse(await readFile(path, \"utf8\"));\n } catch (err) {\n throw new Error(\n `Failed to parse config at ${path}: ${(err as Error).message}`,\n );\n }\n const parsed = PolypusConfig.safeParse(raw);\n if (!parsed.success) {\n throw new Error(\n `Invalid config at ${path}:\\n${parsed.error.issues\n .map((i) => ` - ${i.path.join(\".\") || \"<root>\"}: ${i.message}`)\n .join(\"\\n\")}`,\n );\n }\n return parsed.data;\n}\n\n/** Persist config to disk (pretty-printed), creating the directory if needed. */\nexport async function saveConfig(config: PolypusConfig): Promise<void> {\n await mkdir(configDir(), { recursive: true });\n const validated = PolypusConfig.parse(config);\n await writeFile(configPath(), JSON.stringify(validated, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport function findAgent(\n config: PolypusConfig,\n name: string,\n): AgentConfig | undefined {\n return config.agents.find((a) => a.name === name);\n}\n\n/**\n * Resolve the agent to use: explicit name → default → the only agent.\n * Throws a helpful error otherwise.\n */\nexport function resolveAgent(\n config: PolypusConfig,\n name?: string,\n): AgentConfig {\n if (name) {\n const agent = findAgent(config, name);\n if (!agent) {\n throw new Error(\n t(\"agent.noneKnown\", {\n name,\n names: config.agents.map((a) => a.name).join(\", \") || \"(none)\",\n }),\n );\n }\n return agent;\n }\n if (config.defaultAgent) {\n const agent = findAgent(config, config.defaultAgent);\n if (agent) return agent;\n }\n if (config.agents.length === 1) return config.agents[0]!;\n if (config.agents.length === 0) {\n throw new Error(t(\"agent.noneConfigured\"));\n }\n throw new Error(\n t(\"agent.multipleNoDefault\", { names: config.agents.map((a) => a.name).join(\", \") }),\n );\n}\n\n/**\n * Resolve a configured secret value. Supports \"${ENV_VAR}\" references so that\n * keys are not stored inline. Returns undefined when nothing is configured.\n */\nexport function resolveSecret(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const match = /^\\$\\{([A-Z0-9_]+)\\}$/i.exec(value.trim());\n if (match) {\n const env = process.env[match[1]!];\n if (!env) {\n throw new Error(\n `Config references env var ${match[1]} but it is not set in the environment.`,\n );\n }\n return env;\n }\n return value;\n}\n","/** Minimal zero-dependency i18n. Default locale is pt-BR; English is available. */\n\nexport const LOCALES = [\"pt-BR\", \"en\"] as const;\nexport type Locale = (typeof LOCALES)[number];\nexport const DEFAULT_LOCALE: Locale = \"pt-BR\";\n\n/** Human-readable names used by the agent prompt and the wizard. */\nexport const LOCALE_NAMES: Record<Locale, string> = {\n \"pt-BR\": \"Português (Brasil)\",\n en: \"English\",\n};\n\ntype Catalog = Record<string, string>;\n\nconst en: Catalog = {\n // generic\n \"common.default\": \"default\",\n \"common.keySet\": \"key set\",\n \"common.noKey\": \"no key\",\n\n // cli descriptions\n \"cli.description\":\n \"Agentic coding harness that makes any AI API generate and apply code — OpenRouter, Ollama, and any OpenAI-compatible endpoint.\",\n \"cli.opt.lang\": \"interface language: pt-BR | en\",\n \"cli.cmd.setup\": \"Interactive setup wizard (configure agents, keys, permissions)\",\n \"cli.cmd.init\": \"Scaffold a .poly/ workspace (agents.md, skills, SDD spec template, README)\",\n \"cli.opt.force\": \"overwrite files that already exist\",\n \"cli.cmd.addAgent\": \"Register a new agent (API key + model)\",\n \"cli.cmd.removeAgent\": \"Remove a configured agent\",\n \"cli.cmd.listAgents\": \"List configured agents\",\n \"cli.cmd.run\": \"Run a coding task with an agent\",\n \"cli.cmd.swarm\":\n \"Split a task across multiple agents working in parallel git worktrees (requires 3+ configured agents)\",\n \"cli.cmd.models\": \"Browse OpenRouter models (price, context, tool support)\",\n \"cli.cmd.prd\": \"Generate a PRD from a GitHub issue (uses a free OpenRouter model)\",\n \"cli.arg.prdIssue\": \"issue number to turn into a PRD\",\n \"cli.cmd.review\": \"Review a pull request diff (uses a free OpenRouter model)\",\n \"cli.arg.reviewPr\": \"pull request number to review\",\n \"cli.opt.out\": \"write output to this file instead of stdout\",\n \"cli.opt.input\": 'read input from a file (or \"-\" for stdin) instead of calling gh',\n \"prd.wrote\": \"✓ PRD written to {path}\",\n \"review.wrote\": \"✓ Review written to {path}\",\n \"cli.invalidRef\": \"Invalid number '{ref}': expected a numeric issue/PR number.\",\n \"cli.stdinTty\": \"--input - expects piped stdin, but none was provided.\",\n \"cli.opt.search\": \"filter by id/name substring\",\n \"cli.opt.toolsOnly\": \"only models that support tool-calling\",\n \"cli.opt.free\": \"only free models\",\n \"cli.opt.maxPrice\": \"max prompt price (USD per 1M tokens)\",\n \"cli.opt.sort\": \"price | price-desc | context | name\",\n \"cli.opt.limit\": \"max rows to show\",\n \"cli.arg.addAgentName\": \"unique name for the agent\",\n \"cli.opt.provider\": \"openrouter | ollama | openai-compatible | anthropic\",\n \"cli.opt.model\": \"model id, e.g. anthropic/claude-3.5-sonnet or llama3.1\",\n \"cli.opt.apiKey\": 'API key or env reference like \"${OPENROUTER_API_KEY}\"',\n \"cli.opt.baseUrl\": \"override the provider base URL\",\n \"cli.opt.toolMode\": \"auto | native | emulated\",\n \"cli.opt.setDefault\": \"make this the default agent\",\n \"cli.arg.removeAgentName\": \"name of the agent to remove\",\n \"cli.arg.runTask\": \"task for the agent; omit to start an interactive session\",\n \"cli.opt.agent\": \"which configured agent to use\",\n \"cli.opt.mode\": \"plan | review | bypass (overrides config)\",\n \"cli.opt.maxSteps\": \"maximum agent steps\",\n \"cli.opt.json\": \"headless mode: emit a single JSON object (steps, tool calls, files changed, usage) instead of the TUI — use with --mode bypass\",\n \"cli.opt.verify\": \"after the agent finishes, run project checks (typecheck/build/test) and iterate until they pass\",\n \"cli.opt.budget\": \"stop the run when the estimated session cost reaches this USD amount (OpenRouter pricing)\",\n \"cli.cmd.usage\": \"Show token/cost analytics aggregated per day\",\n \"cli.cmd.estimate\": \"Estimate the effort/cost to implement a task (no changes made)\",\n \"cli.arg.estimateTask\": \"task to estimate\",\n \"cli.cmd.sessions\": \"List saved sessions that can be resumed\",\n \"cli.opt.continue\": \"resume the most recent saved session\",\n \"cli.opt.resume\": \"resume a specific saved session by id\",\n \"cli.arg.swarmTask\": \"high-level task to split across agents\",\n \"cli.opt.agents\": \"comma-separated agent names (default: all configured)\",\n \"cli.opt.maxSubtasks\": \"maximum number of parallel subtasks\",\n\n // agents\n \"agent.exists\": 'An agent named \"{name}\" already exists. Use remove-agent first to replace it.',\n \"agent.needBaseUrl\": 'Provider \"{provider}\" requires --base-url.',\n \"agent.needApiKey\":\n 'Provider \"{provider}\" requires an API key. Pass --api-key \"${ENV_VAR}\" (recommended) or a literal value.',\n \"agent.added\": \"✓ Added agent {name}\",\n \"agent.removed\": \"✓ Removed agent {name}\",\n \"agent.notFound\": 'No agent named \"{name}\".',\n \"agent.none\": \"No agents configured. Run `polypus setup` or `polypus add-agent`.\",\n \"agent.listHeader\": \"Agents:\",\n \"agent.permLine\": \"Permissions: mode={mode}, allow=[{allow}]\",\n \"agent.noneKnown\": 'No agent named \"{name}\". Known agents: {names}',\n \"agent.needAnthropicKey\": 'Agent \"{name}\" (anthropic) requires an API key.',\n \"agent.noBaseUrl\": 'Agent \"{name}\" has no base URL configured.',\n \"agent.noneConfigured\": \"No agents configured. Run `polypus setup` or `polypus add-agent` first.\",\n \"agent.multipleNoDefault\":\n \"Multiple agents configured but no default set. Pass --agent <name> or set a default. Agents: {names}\",\n\n // run / loop\n \"run.status\":\n \"agent={name} provider={provider} model={model} tool-mode={toolMode} permission-mode={mode}\",\n \"run.done\": \"✓ Done ({steps} steps).\",\n \"run.stopped\":\n \"⚠ Stopped after {steps} steps without a finish signal. You can continue with another instruction.\",\n \"run.confirm\": \"Allow {summary}?\",\n \"run.reprompt\": \"↻ no tool call — reinforcing instructions (attempt {attempt})\",\n \"run.autocorrect\": \"↻ tool failed — auto-correcting with extra context\",\n \"run.cancelled\": \"■ cancelled\",\n \"compaction.done\": \"context compacted: ~{before} → ~{after} tokens\",\n \"tools.customLoaded\": \"loaded custom tool(s): {names}\",\n \"mcp.connected\": \"connected MCP server(s): {servers} ({n} tool(s))\",\n \"run.jsonNeedsTask\": \"--json requires a task argument (headless mode has no interactive REPL).\",\n \"review.approveAll\": \"approve all\",\n \"review.reject\": \"reject\",\n \"review.pickHunks\": \"pick hunks…\",\n \"review.selectHunks\": \"Select the hunks to apply (space to toggle, enter to confirm)\",\n \"verify.running\": \"verifying (running project checks)\",\n \"verify.noChecks\": \"no verification checks detected (no package.json scripts) — skipping\",\n \"verify.passed\": \"verification passed\",\n \"verify.failed\": \"{n} check(s) failed — handing the output back to the agent (attempt {attempt})\",\n \"verify.giveUp\": \"{n} check(s) still failing after the retry budget — stopping\",\n \"budget.session\": \"session spend: {spent} / budget {budget}\",\n \"budget.hit\": \"■ stopped: estimated cost reached the budget of {budget}\",\n\n // usage analytics\n \"usage.header\": \"Usage (tokens / estimated cost) per day:\",\n \"usage.empty\": \"No usage recorded yet. Run a task to start tracking.\",\n \"usage.total\": \"total\",\n \"usage.runs\": \"runs\",\n\n // estimate\n \"estimate.header\": \"Effort estimate:\",\n \"estimate.complexity\": \"complexity\",\n \"estimate.steps\": \"steps\",\n \"estimate.tokens\": \"tokens\",\n \"estimate.cost\": \"estimated cost\",\n\n // sessions\n \"sessions.header\": \"Saved sessions (most recent first):\",\n \"sessions.empty\": \"No saved sessions yet.\",\n \"sessions.hint\": \"Resume with `polypus run --continue` or `polypus run --resume <id>`.\",\n \"sessions.notFound\": 'No saved session with id \"{id}\".',\n \"sessions.noneToContinue\": \"No previous session to continue — starting fresh.\",\n \"sessions.resumed\": \"↺ resumed session {id} ({n} messages)\",\n\n // repl\n \"repl.welcome\": \"Polypus interactive session.\",\n \"repl.welcomeHint\": \" Type /help for commands, /exit to quit.\",\n \"repl.modeChanged\": \"mode → {mode}\",\n \"repl.allowAdded\": \"allow-list += {glob}\",\n \"repl.allowShow\": \"mode={mode} allow=[{allow}]\",\n \"repl.historyCleared\": \"history cleared\",\n \"repl.unknown\": \"Unknown command /{cmd}. Type /help.\",\n \"repl.pasted\": \"[Pasted text #{id} +{lines} lines]\",\n \"repl.agentSwitched\": \"active agent → {name}\",\n \"repl.switchedTo\": \"active agent is now {name}\",\n \"repl.noAgentsLeft\": \"No agents left. Use /add to create one.\",\n \"repl.needName\": \"Usage: {usage}\",\n \"repl.help\": [\n \"Slash commands:\",\n \" /agents list configured agents\",\n \" /agent <name> switch the active agent\",\n \" /add add a new agent (wizard)\",\n \" /remove <name> remove an agent\",\n \" /plan switch to plan mode (read-only)\",\n \" /review switch to review mode (confirm each action)\",\n \" /bypass switch to bypass mode (auto-approve)\",\n \" /swarm <task> run a task as a parallel swarm (needs 3+ agents)\",\n \" /allow <glob> add a path glob to the allow-list\",\n \" /allow show the current allow-list and mode\",\n \" /reset clear the conversation history\",\n \" /sessions list saved sessions you can resume\",\n \" /resume <id> resume a saved session\",\n \" /help show this help\",\n \" /exit quit\",\n \"Anything else is sent to the agent as a task.\",\n ].join(\"\\n\"),\n\n // swarm\n \"swarm.noAgents\": \"No agents configured. Run `polypus setup` or `polypus add-agent` first.\",\n \"swarm.needsAgents\":\n \"Swarm mode needs at least {min} configured agent (you have {have}). Add more with `polypus add-agent`, or use `polypus run` for a single agent.\",\n \"swarm.status\": \"swarm agents=[{agents}] workspace={workspace}\",\n \"swarm.bypassNote\":\n \"Workers run in bypass mode inside isolated git worktrees; branches are merged at the end.\",\n \"swarm.cancelling\": \"cancelling swarm — finishing in-flight workers, then merging what committed…\",\n \"swarm.decomposed\": \"Decomposed into {n} subtask(s):\",\n \"swarm.workerStart\": \"▶ {id} started by {agent}\",\n \"swarm.workerDone\": \"✓ {id} done\",\n \"swarm.workerStopped\": \"… {id} stopped\",\n \"swarm.workerMeta\": \" ({steps} steps, {changes})\",\n \"swarm.changesCommitted\": \"changes committed\",\n \"swarm.noChanges\": \"no changes\",\n \"swarm.merged\": \" merged {branch}\",\n \"swarm.mergeConflict\": \" conflict merging {branch}\",\n \"swarm.summary\": \"Summary:\",\n \"swarm.allMerged\": \"✓ All committed branches merged cleanly.\",\n \"swarm.view.header\": \"Swarm · orchestrator [{lead}]\",\n \"swarm.view.decomposing\": \"splitting the task…\",\n \"swarm.view.pending\": \"queued\",\n \"swarm.view.running\": \"running\",\n \"swarm.view.done\": \"done\",\n \"swarm.view.stopped\": \"stopped\",\n \"swarm.view.conflict\": \"conflict\",\n \"swarm.view.step\": \"step {n}\",\n \"swarm.view.steps\": \"{n} steps\",\n \"swarm.conflictsHeader\": \"⚠ {n} branch(es) had merge conflicts (kept for inspection):\",\n \"swarm.statusDone\": \"done\",\n \"swarm.statusIncomplete\": \"incomplete\",\n \"swarm.timeout\": \"⚠ Session timeout reached. Operation aborted.\",\n\n // init\n \"init.created\": \"✓ .poly scaffolded:\",\n \"init.skipped\": \"Kept (already existed):\",\n \"init.allExist\": \"Nothing to do — .poly already has these files:\",\n \"init.forceHint\": \"Run `polypus init --force` to overwrite them.\",\n \"init.tip\": \"Tip: edit .poly/agents.md — Polypus loads it into the agent's context automatically.\",\n\n // wizard\n \"wizard.title\": \" polypus setup \",\n \"wizard.intro\": [\n \"Polypus drives any AI API to read and write code in this kind of project.\",\n \"You can add several agents (different keys/models) and they can work in parallel.\",\n \"Tip: reference API keys via environment variables instead of pasting them here.\",\n ].join(\"\\n\"),\n \"wizard.welcome\": \"Welcome\",\n \"wizard.cancelled\": \"Setup cancelled.\",\n \"wizard.language\": \"Interface language\",\n \"wizard.addAnother\": \"Add another agent?\",\n \"wizard.defaultAgent\": \"Default agent\",\n \"wizard.permMode\": \"Default permission mode\",\n \"wizard.permReview\": \"review — confirm each file write / command (safe default)\",\n \"wizard.permPlan\": \"plan — read-only, propose changes\",\n \"wizard.permBypass\": \"bypass — auto-approve everything (use with care)\",\n \"wizard.allowPaths\": \"Editable paths (comma-separated globs)\",\n \"wizard.saved\": \"Saved {n} agent(s) to {path}\",\n \"wizard.next\": 'Run `polypus run \"your task\"` to start, or `polypus run` for an interactive session.',\n \"wizard.provider\": \"Provider\",\n \"wizard.providerOpenrouter\": \"OpenRouter (hosted, many models)\",\n \"wizard.providerOllama\": \"Ollama (local models)\",\n \"wizard.providerCompatible\": \"OpenAI-compatible (custom base URL)\",\n \"wizard.providerAnthropic\": \"Anthropic (Claude)\",\n \"wizard.agentName\": \"Agent name\",\n \"wizard.required\": \"Required\",\n \"wizard.nameTaken\": \"An agent with this name already exists\",\n \"wizard.modelId\": \"Model id\",\n \"wizard.ollamaDetecting\": \"Detecting models on your local Ollama…\",\n \"wizard.ollamaFound\": \"Found {n} local Ollama model(s)\",\n \"wizard.ollamaNone\": \"Ollama not reachable — type the model id manually\",\n \"wizard.ollamaPick\": \"Model (detected on your Ollama)\",\n \"wizard.ollamaOther\": \"Other (type it manually)\",\n \"wizard.orError\": \"Could not reach OpenRouter — type the model id manually\",\n \"wizard.orSearch\": \"Search by id/name (optional)\",\n \"wizard.orFilters\": \"Filters (space to toggle, enter to confirm)\",\n \"wizard.orToolsOnly\": \"Only models with native tools\",\n \"wizard.orFreeOnly\": \"Only free models\",\n \"wizard.orSort\": \"Sort by\",\n \"wizard.orSortPrice\": \"price — cheapest first\",\n \"wizard.orSortPriceDesc\": \"price — most expensive first\",\n \"wizard.orSortContext\": \"context length\",\n \"wizard.orSortName\": \"name\",\n \"wizard.orPick\": \"Pick a model ({n} matches)\",\n \"wizard.orRefilter\": \"↻ change filters\",\n \"wizard.orManual\": \"✎ type the model id manually\",\n \"wizard.orNone\": \"No models match — adjust the filters\",\n \"wizard.baseUrl\": \"Base URL\",\n \"wizard.baseUrlRequired\": \"Required for openai-compatible\",\n \"wizard.toolMode\": \"Tool-calling mode\",\n \"wizard.toolAuto\": \"auto — native for hosted, emulated for local (recommended)\",\n \"wizard.toolNative\": \"native — provider function-calling\",\n \"wizard.toolEmulated\": \"emulated — XML tool protocol in the prompt (works without tool support)\",\n \"wizard.keyNotNeeded\": \"{provider} usually needs no API key. Add one anyway?\",\n \"wizard.apiKey\": \"API key\",\n \"wizard.keyEnv\": \"Reference an environment variable (recommended)\",\n \"wizard.keyInline\": \"Enter it now (stored in the config file)\",\n \"wizard.keySkip\": \"Skip for now\",\n \"wizard.envName\": \"Environment variable name\",\n \"wizard.envInvalid\": \"Use letters, digits, underscores\",\n \"wizard.keyPrompt\": \"API key (stored in plain text in the config file)\",\n\n // models browser\n \"models.fetching\": \"Fetching OpenRouter models…\",\n \"models.fetchError\": \"Could not fetch models: {msg}\",\n \"models.none\": \"No models match the filters.\",\n \"models.shown\": \"Showing {shown} of {total} models\",\n \"models.legend\": \"🛠 = native tools · prices = USD per 1M tokens (in/out)\",\n \"models.colTools\": \"TOOLS\",\n \"models.colPrice\": \"PRICE in/out\",\n \"models.colCtx\": \"CONTEXT\",\n \"models.colModel\": \"MODEL\",\n\n // live status\n \"ui.thinking\": \"thinking\",\n \"ui.running\": \"running {tool}\",\n \"ui.tokens\": \"{total} tokens (in {in} / out {out})\",\n \"ui.tokensShort\": \"{total} tok\",\n\n // welcome / interactive UI\n \"welcome.tagline\": \"agentic harness — make any AI write code\",\n \"welcome.agent\": \"agent\",\n \"welcome.model\": \"model\",\n \"welcome.mode\": \"mode\",\n \"welcome.workspace\": \"folder\",\n \"welcome.hints\": \"Type your task and press Enter · ESC cancels · /help · /exit\",\n \"welcome.firstRun\": \"No agents configured yet — let's set you up.\",\n\n // agent system prompt\n \"prompt.language\": \"Communicate with the user in {language}.\",\n \"prompt.projectInstructions\":\n \"Project-specific operating instructions follow, loaded from `.poly/agents.md`. Treat them as authoritative for how to work in THIS repo. Paths they reference (e.g. skills/*.md, ../context.md, ../rules.md) are relative to the `.poly/` directory — read those files when relevant before acting:\",\n\n // @-mentions\n \"mentions.injectedHeader\": \"Referenced files (@-mentions)\",\n \"mentions.dirHeader\": \"@{path} (directory listing)\",\n \"mentions.notFound\": \"(could not resolve @{path}: not found or outside the allow-list)\",\n\n // safety policy\n \"policy.blockedCommand\": \"blocked by safety policy ({reason}) — refusing in all modes\",\n \"policy.secretFound\":\n \"write blocked: a possible secret ({kind}) was found on line {line}. Remove it or load it from an environment variable instead of hard-coding it.\",\n};\n\nconst ptBR: Catalog = {\n \"common.default\": \"padrão\",\n \"common.keySet\": \"com chave\",\n \"common.noKey\": \"sem chave\",\n\n \"cli.description\":\n \"Harness agêntico que faz qualquer API de IA gerar e aplicar código — OpenRouter, Ollama e qualquer endpoint compatível com OpenAI.\",\n \"cli.opt.lang\": \"idioma da interface: pt-BR | en\",\n \"cli.cmd.setup\": \"Assistente de configuração interativo (agentes, chaves, permissões)\",\n \"cli.cmd.init\": \"Cria um workspace .poly/ (agents.md, skills, template de spec SDD, README)\",\n \"cli.opt.force\": \"sobrescreve arquivos que já existem\",\n \"cli.cmd.addAgent\": \"Cadastra um novo agente (chave de API + modelo)\",\n \"cli.cmd.removeAgent\": \"Remove um agente configurado\",\n \"cli.cmd.listAgents\": \"Lista os agentes configurados\",\n \"cli.cmd.run\": \"Executa uma tarefa de código com um agente\",\n \"cli.cmd.swarm\":\n \"Divide uma tarefa entre vários agentes em git worktrees paralelas (requer 3+ agentes configurados)\",\n \"cli.cmd.models\": \"Explora os modelos do OpenRouter (preço, contexto, suporte a tools)\",\n \"cli.cmd.prd\": \"Gera um PRD a partir de uma issue do GitHub (usa um modelo gratuito do OpenRouter)\",\n \"cli.arg.prdIssue\": \"número da issue para transformar em PRD\",\n \"cli.cmd.review\": \"Revisa o diff de um pull request (usa um modelo gratuito do OpenRouter)\",\n \"cli.arg.reviewPr\": \"número do pull request a revisar\",\n \"cli.opt.out\": \"grava a saída neste arquivo em vez do stdout\",\n \"cli.opt.input\": 'lê a entrada de um arquivo (ou \"-\" para stdin) em vez de chamar o gh',\n \"prd.wrote\": \"✓ PRD gravado em {path}\",\n \"review.wrote\": \"✓ Review gravado em {path}\",\n \"cli.invalidRef\": \"Número inválido '{ref}': esperado um número de issue/PR.\",\n \"cli.stdinTty\": \"--input - espera entrada via pipe (stdin), mas nenhuma foi fornecida.\",\n \"cli.opt.search\": \"filtra por trecho do id/nome\",\n \"cli.opt.toolsOnly\": \"apenas modelos com suporte a tool-calling\",\n \"cli.opt.free\": \"apenas modelos gratuitos\",\n \"cli.opt.maxPrice\": \"preço máximo de entrada (USD por 1M tokens)\",\n \"cli.opt.sort\": \"price | price-desc | context | name\",\n \"cli.opt.limit\": \"máximo de linhas a exibir\",\n \"cli.arg.addAgentName\": \"nome único para o agente\",\n \"cli.opt.provider\": \"openrouter | ollama | openai-compatible | anthropic\",\n \"cli.opt.model\": \"id do modelo, ex.: anthropic/claude-3.5-sonnet ou llama3.1\",\n \"cli.opt.apiKey\": 'chave de API ou referência de env como \"${OPENROUTER_API_KEY}\"',\n \"cli.opt.baseUrl\": \"sobrescreve a URL base do provider\",\n \"cli.opt.toolMode\": \"auto | native | emulated\",\n \"cli.opt.setDefault\": \"define como agente padrão\",\n \"cli.arg.removeAgentName\": \"nome do agente a remover\",\n \"cli.arg.runTask\": \"tarefa para o agente; omita para iniciar uma sessão interativa\",\n \"cli.opt.agent\": \"qual agente configurado usar\",\n \"cli.opt.mode\": \"plan | review | bypass (sobrescreve a config)\",\n \"cli.opt.maxSteps\": \"número máximo de passos do agente\",\n \"cli.opt.json\": \"modo headless: emite um único objeto JSON (passos, tool calls, arquivos alterados, uso) em vez da TUI — use com --mode bypass\",\n \"cli.opt.verify\": \"após o agente terminar, roda as checagens do projeto (typecheck/build/test) e itera até passar\",\n \"cli.opt.budget\": \"interrompe a execução quando o custo estimado da sessão atingir este valor em USD (preços do OpenRouter)\",\n \"cli.cmd.usage\": \"Mostra analytics de tokens/custo agregados por dia\",\n \"cli.cmd.estimate\": \"Estima o esforço/custo para implementar uma tarefa (sem alterar nada)\",\n \"cli.arg.estimateTask\": \"tarefa a estimar\",\n \"cli.cmd.sessions\": \"Lista as sessões salvas que podem ser retomadas\",\n \"cli.opt.continue\": \"retoma a sessão salva mais recente\",\n \"cli.opt.resume\": \"retoma uma sessão salva específica pelo id\",\n \"cli.arg.swarmTask\": \"tarefa de alto nível para dividir entre os agentes\",\n \"cli.opt.agents\": \"nomes de agentes separados por vírgula (padrão: todos)\",\n \"cli.opt.maxSubtasks\": \"número máximo de subtarefas paralelas\",\n\n \"agent.exists\": 'Já existe um agente chamado \"{name}\". Use remove-agent antes para substituí-lo.',\n \"agent.needBaseUrl\": 'O provider \"{provider}\" exige --base-url.',\n \"agent.needApiKey\":\n 'O provider \"{provider}\" exige uma chave de API. Passe --api-key \"${ENV_VAR}\" (recomendado) ou um valor literal.',\n \"agent.added\": \"✓ Agente {name} adicionado\",\n \"agent.removed\": \"✓ Agente {name} removido\",\n \"agent.notFound\": 'Não existe agente chamado \"{name}\".',\n \"agent.none\": \"Nenhum agente configurado. Rode `polypus setup` ou `polypus add-agent`.\",\n \"agent.listHeader\": \"Agentes:\",\n \"agent.permLine\": \"Permissões: modo={mode}, allow=[{allow}]\",\n \"agent.noneKnown\": 'Não existe agente chamado \"{name}\". Agentes conhecidos: {names}',\n \"agent.needAnthropicKey\": 'O agente \"{name}\" (anthropic) exige uma chave de API.',\n \"agent.noBaseUrl\": 'O agente \"{name}\" não tem URL base configurada.',\n \"agent.noneConfigured\": \"Nenhum agente configurado. Rode `polypus setup` ou `polypus add-agent` primeiro.\",\n \"agent.multipleNoDefault\":\n \"Vários agentes configurados mas sem padrão definido. Passe --agent <nome> ou defina um padrão. Agentes: {names}\",\n\n \"run.status\":\n \"agente={name} provider={provider} modelo={model} tool-mode={toolMode} modo-permissão={mode}\",\n \"run.done\": \"✓ Concluído ({steps} passos).\",\n \"run.stopped\":\n \"⚠ Parou após {steps} passos sem sinal de conclusão. Você pode continuar com outra instrução.\",\n \"run.confirm\": \"Permitir {summary}?\",\n \"run.reprompt\": \"↻ nenhuma chamada de tool — reforçando instruções (tentativa {attempt})\",\n \"run.autocorrect\": \"↻ tool falhou — autocorrigindo com contexto extra\",\n \"run.cancelled\": \"■ cancelado\",\n \"compaction.done\": \"contexto compactado: ~{before} → ~{after} tokens\",\n \"tools.customLoaded\": \"tool(s) customizada(s) carregada(s): {names}\",\n \"mcp.connected\": \"servidor(es) MCP conectado(s): {servers} ({n} tool(s))\",\n \"run.jsonNeedsTask\": \"--json exige um argumento de tarefa (o modo headless não tem REPL interativo).\",\n \"review.approveAll\": \"aprovar tudo\",\n \"review.reject\": \"rejeitar\",\n \"review.pickHunks\": \"escolher hunks…\",\n \"review.selectHunks\": \"Selecione os hunks a aplicar (espaço alterna, enter confirma)\",\n \"verify.running\": \"verificando (rodando as checagens do projeto)\",\n \"verify.noChecks\": \"nenhuma checagem detectada (sem scripts no package.json) — pulando\",\n \"verify.passed\": \"verificação passou\",\n \"verify.failed\": \"{n} checagem(ns) falharam — devolvendo a saída ao agente (tentativa {attempt})\",\n \"verify.giveUp\": \"{n} checagem(ns) ainda falhando após o limite de tentativas — parando\",\n \"budget.session\": \"gasto da sessão: {spent} / orçamento {budget}\",\n \"budget.hit\": \"■ interrompido: o custo estimado atingiu o orçamento de {budget}\",\n\n // usage analytics\n \"usage.header\": \"Uso (tokens / custo estimado) por dia:\",\n \"usage.empty\": \"Nenhum uso registrado ainda. Rode uma tarefa para começar a medir.\",\n \"usage.total\": \"total\",\n \"usage.runs\": \"execuções\",\n\n // estimate\n \"estimate.header\": \"Estimativa de esforço:\",\n \"estimate.complexity\": \"complexidade\",\n \"estimate.steps\": \"passos\",\n \"estimate.tokens\": \"tokens\",\n \"estimate.cost\": \"custo estimado\",\n\n // sessions\n \"sessions.header\": \"Sessões salvas (mais recentes primeiro):\",\n \"sessions.empty\": \"Nenhuma sessão salva ainda.\",\n \"sessions.hint\": \"Retome com `polypus run --continue` ou `polypus run --resume <id>`.\",\n \"sessions.notFound\": 'Nenhuma sessão salva com id \"{id}\".',\n \"sessions.noneToContinue\": \"Nenhuma sessão anterior para continuar — começando do zero.\",\n \"sessions.resumed\": \"↺ sessão {id} retomada ({n} mensagens)\",\n\n \"repl.welcome\": \"Sessão interativa do Polypus.\",\n \"repl.welcomeHint\": \" Digite /help para comandos, /exit para sair.\",\n \"repl.modeChanged\": \"modo → {mode}\",\n \"repl.allowAdded\": \"allow-list += {glob}\",\n \"repl.allowShow\": \"modo={mode} allow=[{allow}]\",\n \"repl.historyCleared\": \"histórico limpo\",\n \"repl.unknown\": \"Comando desconhecido /{cmd}. Digite /help.\",\n \"repl.pasted\": \"[Texto colado #{id} +{lines} linhas]\",\n \"repl.agentSwitched\": \"agente ativo → {name}\",\n \"repl.switchedTo\": \"agente ativo agora é {name}\",\n \"repl.noAgentsLeft\": \"Nenhum agente restante. Use /add para criar um.\",\n \"repl.needName\": \"Uso: {usage}\",\n \"repl.help\": [\n \"Comandos de barra:\",\n \" /agents lista os agentes configurados\",\n \" /agent <nome> troca o agente ativo\",\n \" /add adiciona um novo agente (wizard)\",\n \" /remove <nome> remove um agente\",\n \" /plan muda para o modo plan (somente leitura)\",\n \" /review muda para o modo review (confirma cada ação)\",\n \" /bypass muda para o modo bypass (aprova automaticamente)\",\n \" /swarm <task> roda a tarefa como swarm paralelo (requer 3+ agentes)\",\n \" /allow <glob> adiciona um glob de caminho à allow-list\",\n \" /allow mostra a allow-list e o modo atuais\",\n \" /reset limpa o histórico da conversa\",\n \" /sessions lista as sessões salvas que você pode retomar\",\n \" /resume <id> retoma uma sessão salva\",\n \" /help mostra esta ajuda\",\n \" /exit sair\",\n \"Qualquer outra coisa é enviada ao agente como tarefa.\",\n ].join(\"\\n\"),\n\n \"swarm.noAgents\": \"Nenhum agente configurado. Rode `polypus setup` ou `polypus add-agent` primeiro.\",\n \"swarm.needsAgents\":\n \"O modo swarm precisa de pelo menos {min} agente configurado (você tem {have}). Adicione mais com `polypus add-agent`, ou use `polypus run` para um agente só.\",\n \"swarm.status\": \"swarm agentes=[{agents}] workspace={workspace}\",\n \"swarm.bypassNote\":\n \"Os workers rodam em modo bypass dentro de git worktrees isoladas; os branches são mesclados no final.\",\n \"swarm.cancelling\": \"cancelando o swarm — encerrando os workers em andamento e mesclando o que commitou…\",\n \"swarm.decomposed\": \"Dividido em {n} subtarefa(s):\",\n \"swarm.workerStart\": \"▶ {id} iniciada por {agent}\",\n \"swarm.workerDone\": \"✓ {id} concluída\",\n \"swarm.workerStopped\": \"… {id} parou\",\n \"swarm.workerMeta\": \" ({steps} passos, {changes})\",\n \"swarm.changesCommitted\": \"alterações commitadas\",\n \"swarm.noChanges\": \"sem alterações\",\n \"swarm.merged\": \" mesclado {branch}\",\n \"swarm.mergeConflict\": \" conflito ao mesclar {branch}\",\n \"swarm.summary\": \"Resumo:\",\n \"swarm.allMerged\": \"✓ Todos os branches commitados foram mesclados sem conflito.\",\n \"swarm.view.header\": \"Swarm · orquestrador [{lead}]\",\n \"swarm.view.decomposing\": \"dividindo a tarefa…\",\n \"swarm.view.pending\": \"na fila\",\n \"swarm.view.running\": \"executando\",\n \"swarm.view.done\": \"concluído\",\n \"swarm.view.stopped\": \"parado\",\n \"swarm.view.conflict\": \"conflito\",\n \"swarm.view.step\": \"passo {n}\",\n \"swarm.view.steps\": \"{n} passos\",\n \"swarm.conflictsHeader\": \"⚠ {n} branch(es) tiveram conflitos de merge (mantidos para inspeção):\",\n \"swarm.statusDone\": \"ok\",\n \"swarm.statusIncomplete\": \"incompleta\",\n \"swarm.timeout\": \"⚠ O tempo máximo da sessão foi atingido. A operação foi interrompida.\",\n\n // init\n \"init.created\": \"✓ .poly criado:\",\n \"init.skipped\": \"Mantidos (já existiam):\",\n \"init.allExist\": \"Nada a fazer — o .poly já tem estes arquivos:\",\n \"init.forceHint\": \"Rode `polypus init --force` para sobrescrevê-los.\",\n \"init.tip\": \"Dica: edite o .poly/agents.md — o Polypus carrega ele no contexto do agente automaticamente.\",\n\n \"wizard.title\": \" configuração do polypus \",\n \"wizard.intro\": [\n \"O Polypus comanda qualquer API de IA para ler e escrever código neste tipo de projeto.\",\n \"Você pode adicionar vários agentes (chaves/modelos diferentes) e eles trabalham em paralelo.\",\n \"Dica: referencie chaves de API por variáveis de ambiente em vez de colá-las aqui.\",\n ].join(\"\\n\"),\n \"wizard.welcome\": \"Bem-vindo\",\n \"wizard.cancelled\": \"Configuração cancelada.\",\n \"wizard.language\": \"Idioma da interface\",\n \"wizard.addAnother\": \"Adicionar outro agente?\",\n \"wizard.defaultAgent\": \"Agente padrão\",\n \"wizard.permMode\": \"Modo de permissão padrão\",\n \"wizard.permReview\": \"review — confirma cada escrita/comando (padrão seguro)\",\n \"wizard.permPlan\": \"plan — somente leitura, propõe mudanças\",\n \"wizard.permBypass\": \"bypass — aprova tudo automaticamente (use com cuidado)\",\n \"wizard.allowPaths\": \"Caminhos editáveis (globs separados por vírgula)\",\n \"wizard.saved\": \"{n} agente(s) salvos em {path}\",\n \"wizard.next\": 'Rode `polypus run \"sua tarefa\"` para começar, ou `polypus run` para uma sessão interativa.',\n \"wizard.provider\": \"Provider\",\n \"wizard.providerOpenrouter\": \"OpenRouter (hospedado, muitos modelos)\",\n \"wizard.providerOllama\": \"Ollama (modelos locais)\",\n \"wizard.providerCompatible\": \"Compatível com OpenAI (URL base customizada)\",\n \"wizard.providerAnthropic\": \"Anthropic (Claude)\",\n \"wizard.agentName\": \"Nome do agente\",\n \"wizard.required\": \"Obrigatório\",\n \"wizard.nameTaken\": \"Já existe um agente com esse nome\",\n \"wizard.modelId\": \"Id do modelo\",\n \"wizard.ollamaDetecting\": \"Detectando modelos no seu Ollama local…\",\n \"wizard.ollamaFound\": \"{n} modelo(s) do Ollama encontrado(s)\",\n \"wizard.ollamaNone\": \"Ollama não acessível — digite o id do modelo manualmente\",\n \"wizard.ollamaPick\": \"Modelo (detectado no seu Ollama)\",\n \"wizard.ollamaOther\": \"Outro (digitar manualmente)\",\n \"wizard.orError\": \"Não foi possível acessar o OpenRouter — digite o id do modelo manualmente\",\n \"wizard.orSearch\": \"Buscar por id/nome (opcional)\",\n \"wizard.orFilters\": \"Filtros (espaço alterna, enter confirma)\",\n \"wizard.orToolsOnly\": \"Apenas modelos com tools nativas\",\n \"wizard.orFreeOnly\": \"Apenas modelos gratuitos\",\n \"wizard.orSort\": \"Ordenar por\",\n \"wizard.orSortPrice\": \"preço — mais baratos primeiro\",\n \"wizard.orSortPriceDesc\": \"preço — mais caros primeiro\",\n \"wizard.orSortContext\": \"tamanho do contexto\",\n \"wizard.orSortName\": \"nome\",\n \"wizard.orPick\": \"Escolha um modelo ({n} resultados)\",\n \"wizard.orRefilter\": \"↻ mudar filtros\",\n \"wizard.orManual\": \"✎ digitar o id do modelo manualmente\",\n \"wizard.orNone\": \"Nenhum modelo corresponde — ajuste os filtros\",\n \"wizard.baseUrl\": \"URL base\",\n \"wizard.baseUrlRequired\": \"Obrigatório para openai-compatible\",\n \"wizard.toolMode\": \"Modo de tool-calling\",\n \"wizard.toolAuto\": \"auto — nativo para hospedados, emulado para locais (recomendado)\",\n \"wizard.toolNative\": \"native — function-calling do provider\",\n \"wizard.toolEmulated\": \"emulated — protocolo XML de tools no prompt (funciona sem suporte a tools)\",\n \"wizard.keyNotNeeded\": \"{provider} normalmente não precisa de chave. Adicionar mesmo assim?\",\n \"wizard.apiKey\": \"Chave de API\",\n \"wizard.keyEnv\": \"Referenciar uma variável de ambiente (recomendado)\",\n \"wizard.keyInline\": \"Digitar agora (armazenada no arquivo de config)\",\n \"wizard.keySkip\": \"Pular por enquanto\",\n \"wizard.envName\": \"Nome da variável de ambiente\",\n \"wizard.envInvalid\": \"Use letras, dígitos e sublinhados\",\n \"wizard.keyPrompt\": \"Chave de API (armazenada em texto puro no arquivo de config)\",\n\n \"prompt.language\": \"Comunique-se com o usuário em {language}.\",\n \"prompt.projectInstructions\":\n \"Seguem instruções operacionais específicas do projeto, carregadas de `.poly/agents.md`. Trate-as como autoritativas para trabalhar NESTE repositório. Os caminhos que elas citam (ex.: skills/*.md, ../context.md, ../rules.md) são relativos à pasta `.poly/` — leia esses arquivos quando relevante antes de agir:\",\n\n // @-mentions\n \"mentions.injectedHeader\": \"Arquivos referenciados (@-mentions)\",\n \"mentions.dirHeader\": \"@{path} (conteúdo do diretório)\",\n \"mentions.notFound\": \"(não foi possível resolver @{path}: não encontrado ou fora da allow-list)\",\n\n // safety policy\n \"policy.blockedCommand\": \"bloqueado pela política de segurança ({reason}) — recusado em todos os modos\",\n \"policy.secretFound\":\n \"escrita bloqueada: possível segredo ({kind}) encontrado na linha {line}. Remova-o ou carregue de uma variável de ambiente em vez de fixá-lo no código.\",\n\n \"models.fetching\": \"Buscando modelos do OpenRouter…\",\n \"models.fetchError\": \"Não foi possível buscar modelos: {msg}\",\n \"models.none\": \"Nenhum modelo corresponde aos filtros.\",\n \"models.shown\": \"Mostrando {shown} de {total} modelos\",\n \"models.legend\": \"🛠 = tools nativas · preços = USD por 1M tokens (entrada/saída)\",\n \"models.colTools\": \"TOOLS\",\n \"models.colPrice\": \"PREÇO ent/saí\",\n \"models.colCtx\": \"CONTEXTO\",\n \"models.colModel\": \"MODELO\",\n\n \"ui.thinking\": \"pensando\",\n \"ui.running\": \"executando {tool}\",\n \"ui.tokens\": \"{total} tokens (entrada {in} / saída {out})\",\n \"ui.tokensShort\": \"{total} tok\",\n\n \"welcome.tagline\": \"harness agêntico — faça qualquer IA escrever código\",\n \"welcome.agent\": \"agente\",\n \"welcome.model\": \"modelo\",\n \"welcome.mode\": \"modo\",\n \"welcome.workspace\": \"pasta\",\n \"welcome.hints\": \"Digite sua tarefa e tecle Enter · ESC cancela · /help · /exit\",\n \"welcome.firstRun\": \"Nenhum agente configurado ainda — vamos te configurar.\",\n};\n\nconst CATALOGS: Record<Locale, Catalog> = { en, \"pt-BR\": ptBR };\n\nlet currentLocale: Locale = DEFAULT_LOCALE;\n\nexport function setLocale(locale: Locale): void {\n currentLocale = locale;\n}\n\nexport function getLocale(): Locale {\n return currentLocale;\n}\n\nexport function isLocale(value: unknown): value is Locale {\n return typeof value === \"string\" && (LOCALES as readonly string[]).includes(value);\n}\n\n/**\n * Resolve the active locale by precedence: explicit flag > POLYPUS_LANG env >\n * config value > default (pt-BR). Invalid values are ignored.\n */\nexport function pickLocale(opts: { flag?: string; config?: string }): Locale {\n const candidates = [opts.flag, process.env.POLYPUS_LANG, opts.config];\n for (const c of candidates) {\n if (isLocale(c)) return c;\n }\n return DEFAULT_LOCALE;\n}\n\n/** Translate a key, interpolating {placeholders}. Falls back to English, then the key. */\nexport function t(key: string, params?: Record<string, string | number>): string {\n const template = CATALOGS[currentLocale][key] ?? en[key] ?? key;\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, name: string) =>\n name in params ? String(params[name]) : `{${name}}`,\n );\n}\n","import type { ProviderKind } from \"../config/schema.js\";\n\n/** Default base URL per provider. `openai-compatible` has none — the user must supply one. */\nexport const DEFAULT_BASE_URL: Record<ProviderKind, string | undefined> = {\n openrouter: \"https://openrouter.ai/api/v1\",\n ollama: \"http://localhost:11434/v1\",\n \"openai-compatible\": undefined,\n anthropic: \"https://api.anthropic.com\",\n};\n\n/** Whether a provider typically requires an API key (local Ollama does not). */\nexport const REQUIRES_API_KEY: Record<ProviderKind, boolean> = {\n openrouter: true,\n ollama: false,\n \"openai-compatible\": false,\n anthropic: true,\n};\n\n/** Conventional env var name to suggest for a provider's key during setup. */\nexport const SUGGESTED_KEY_ENV: Record<ProviderKind, string | undefined> = {\n openrouter: \"OPENROUTER_API_KEY\",\n ollama: undefined,\n \"openai-compatible\": \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n};\n","import pc from \"picocolors\";\nimport { findAgent, loadConfig, saveConfig } from \"../../core/config/store.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\n/** `polypus remove-agent <name>` */\nexport async function removeAgent(name: string): Promise<void> {\n const config = await loadConfig();\n if (!findAgent(config, name)) {\n throw new Error(t(\"agent.notFound\", { name }));\n }\n config.agents = config.agents.filter((a) => a.name !== name);\n if (config.defaultAgent === name) {\n config.defaultAgent = config.agents[0]?.name;\n }\n await saveConfig(config);\n console.log(pc.green(t(\"agent.removed\", { name: pc.bold(name) })));\n}\n","import pc from \"picocolors\";\nimport { loadConfig } from \"../../core/config/store.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\n/** `polypus list-agents` */\nexport async function listAgents(): Promise<void> {\n const config = await loadConfig();\n if (config.agents.length === 0) {\n console.log(pc.yellow(t(\"agent.none\")));\n return;\n }\n console.log(pc.bold(t(\"agent.listHeader\")));\n for (const a of config.agents) {\n const isDefault = config.defaultAgent === a.name;\n const key = pc.dim(` · ${a.apiKey ? t(\"common.keySet\") : t(\"common.noKey\")}`);\n console.log(\n ` ${isDefault ? pc.green(\"●\") : pc.dim(\"○\")} ${pc.bold(a.name)} ` +\n pc.dim(`(${a.provider} · ${a.model} · ${a.toolMode})`) +\n key +\n (isDefault ? pc.green(` [${t(\"common.default\")}]`) : \"\"),\n );\n }\n console.log(\n pc.dim(\n \"\\n\" + t(\"agent.permLine\", { mode: config.permissions.mode, allow: config.permissions.allow.join(\", \") }),\n ),\n );\n}\n","import pc from \"picocolors\";\nimport * as p from \"@clack/prompts\";\nimport type { PermissionMode } from \"../../core/config/schema.js\";\nimport { loadConfig, resolveAgent } from \"../../core/config/store.js\";\nimport { createProvider } from \"../../core/providers/registry.js\";\nimport { PermissionEngine, type ConfirmRequest, type ConfirmResult } from \"../../core/permissions/modes.js\";\nimport { hunkLabel, type Hunk } from \"../../core/permissions/diff.js\";\nimport { runAgent, type AgentEvents, type RunResult } from \"../../core/agent/loop.js\";\nimport { resolveMentions } from \"../../core/context/mentions.js\";\nimport { buildVerifyFeedback, detectChecks, runChecks } from \"../../core/agent/verify.js\";\nimport {\n estimateCost,\n fmtUsd,\n recordUsage,\n resolveModelPricing,\n type ModelPricing,\n} from \"../../core/agent/usage.js\";\nimport {\n deriveTitle,\n latestSession,\n loadSession,\n newSessionId,\n saveSession,\n type SessionRecord,\n} from \"../../core/agent/session-store.js\";\nimport { loadHooks } from \"../../core/agent/hooks.js\";\nimport { loadCustomTools } from \"../../core/tools/custom.js\";\nimport { loadMcpTools } from \"../../core/mcp/index.js\";\nimport { createJsonCollector } from \"./json-output.js\";\nimport type { Message } from \"../../core/providers/types.js\";\nimport { startRepl, type ReplContext } from \"../../ui/repl.js\";\nimport { runSwarmSession } from \"./swarm.js\";\nimport { printWelcome } from \"../../ui/banner.js\";\nimport { Spinner } from \"../../ui/spinner.js\";\nimport { t } from \"../../core/i18n/index.js\";\nimport { listenForCancel } from \"../../ui/cancel.js\";\n\nexport interface RunOptions {\n agent?: string;\n mode?: string;\n maxSteps?: string;\n /** Headless mode: emit a single JSON object instead of the colored TUI. */\n json?: boolean;\n /** After the agent finishes, run project checks and iterate until they pass. */\n verify?: boolean;\n /** Abort the run when the estimated session cost reaches this USD amount. */\n budget?: string;\n /** Resume the most recently saved session. */\n continue?: boolean;\n /** Resume a specific saved session by id. */\n resume?: string;\n}\n\n/** How many times the agent may re-try to make the verification checks pass. */\nconst MAX_VERIFY_FIXES = 3;\n\n/**\n * Token threshold above which old history is auto-compacted. Defaults to 120k,\n * overridable via POLYPUS_COMPACT_THRESHOLD; POLYPUS_NO_COMPACT disables it.\n */\nfunction compactionThreshold(): number {\n if (process.env.POLYPUS_NO_COMPACT) return 0;\n const v = Number(process.env.POLYPUS_COMPACT_THRESHOLD);\n return Number.isFinite(v) && v > 0 ? v : 120_000;\n}\n\n/** `polypus run [task]` — one-shot if a task is given, otherwise an interactive REPL. */\nexport async function run(task: string | undefined, opts: RunOptions): Promise<void> {\n let config = await loadConfig();\n const workspace = process.cwd();\n\n // Resume/continue: seed from a saved session.\n let seeded: SessionRecord | undefined;\n if (opts.resume) {\n seeded = await loadSession(opts.resume);\n if (!seeded) throw new Error(t(\"sessions.notFound\", { id: opts.resume }));\n } else if (opts.continue) {\n seeded = await latestSession();\n if (!seeded && !opts.json) console.log(pc.dim(t(\"sessions.noneToContinue\")));\n }\n\n const agentConfig = resolveAgent(config, opts.agent ?? seeded?.agentName);\n\n const session: SessionState = {\n id: seeded?.id ?? newSessionId(),\n title: seeded?.title ?? \"\",\n agentName: agentConfig.name,\n mode: (opts.mode as PermissionMode) ?? seeded?.mode ?? config.permissions.mode,\n allow: config.permissions.allow,\n deny: config.permissions.deny,\n allowedCommands: config.permissions.allowedCommands,\n maxSteps: opts.maxSteps ? Number(opts.maxSteps) : undefined,\n history: seeded?.messages ?? [],\n budget: opts.budget ? Number(opts.budget) : undefined,\n costUsd: 0,\n };\n\n if (seeded && !opts.json) {\n console.log(pc.dim(t(\"sessions.resumed\", { id: seeded.id, n: seeded.messages.length })));\n }\n\n // Resolve the active agent freshly each run so /agent, /add and /remove work.\n const runTask = async (taskText: string): Promise<void> => {\n const active = resolveAgent(config, session.agentName);\n const resolved = createProvider(active);\n await executeTask(taskText, resolved, workspace, session);\n };\n\n if (opts.json && !task) throw new Error(t(\"run.jsonNeedsTask\"));\n\n if (task) {\n const resolved = createProvider(agentConfig);\n if (!opts.json) {\n console.log(\n pc.dim(\n t(\"run.status\", {\n name: resolved.config.name,\n provider: resolved.config.provider,\n model: resolved.config.model,\n toolMode: resolved.toolMode,\n mode: session.mode,\n }),\n ),\n );\n }\n await executeTask(task, resolved, workspace, session, opts.json ?? false, opts.verify ?? false);\n if (session.budget !== undefined && !opts.json) {\n console.log(pc.dim(t(\"budget.session\", { spent: fmtUsd(session.costUsd), budget: fmtUsd(session.budget) })));\n }\n return;\n }\n\n // Interactive: full welcome screen with the animated banner.\n const resolved = createProvider(agentConfig);\n await printWelcome({\n agentName: resolved.config.name,\n provider: resolved.config.provider,\n model: resolved.config.model,\n toolMode: resolved.toolMode,\n mode: session.mode,\n workspace,\n });\n\n const ctx: ReplContext = {\n session,\n runTask,\n runSwarm: (taskText) => runSwarmSession(taskText, config, { workspace }),\n getConfig: () => config,\n reload: async () => {\n config = await loadConfig();\n },\n };\n await startRepl(ctx);\n}\n\nexport interface SessionState {\n /** Stable id used to persist/resume this session. */\n id: string;\n /** Short human title (first task), for `polypus sessions`. */\n title: string;\n /** Name of the currently active agent (switchable via /agent). */\n agentName: string;\n mode: PermissionMode;\n allow: string[];\n deny: string[];\n allowedCommands: string[];\n maxSteps?: number;\n history: Message[];\n /** Optional USD spend cap for the whole session (from --budget). */\n budget?: number;\n /** Estimated USD spent so far this session. */\n costUsd: number;\n}\n\nasync function executeTask(\n task: string,\n resolved: ReturnType<typeof createProvider>,\n workspace: string,\n session: SessionState,\n json = false,\n verify = false,\n): Promise<void> {\n // Inject @file / @dir mentions into the task as explicit context before sending.\n const mention = await resolveMentions(task, {\n workspace,\n allow: session.allow,\n deny: session.deny,\n });\n if (mention.injected.length > 0) {\n task = mention.task;\n if (!json) console.log(pc.dim(`↳ @ ${mention.injected.join(\", \")}`));\n }\n\n const spinner = new Spinner();\n const controller = new AbortController();\n const cancel = listenForCancel(controller); // ESC / Ctrl+C aborts the task\n const collector = json ? createJsonCollector() : undefined;\n\n // Cost estimation + budget enforcement (no-op when pricing is unknown).\n const pricing = await resolveModelPricing(resolved.config);\n let budgetHit = false;\n const baseEvents = collector ? collector.events : renderEvents(spinner);\n const events: AgentEvents = {\n ...baseEvents,\n onUsage(u) {\n baseEvents.onUsage?.(u);\n if (session.budget !== undefined && pricing && !controller.signal.aborted) {\n if (session.costUsd + estimateCost(u, pricing) >= session.budget) {\n budgetHit = true;\n controller.abort();\n }\n }\n },\n };\n\n const permissions = new PermissionEngine({\n mode: session.mode,\n policy: { workspace, allow: session.allow, deny: session.deny },\n allowedCommands: session.allowedCommands,\n // Headless runs have no TTY for confirmations — use --mode bypass instead.\n confirm: json\n ? async () => false\n : async (req) => {\n spinner.stop();\n cancel.pause(); // hand stdin to the clack prompt\n const ok = await confirmAction(req);\n cancel.resume();\n return ok;\n },\n });\n\n // Load user-declared custom tools and hooks from .poly/ (if any), plus any\n // MCP servers (external tool servers) declared in .poly/mcp.json.\n const [customTools, hooks, mcp] = await Promise.all([\n loadCustomTools(workspace),\n loadHooks(workspace),\n loadMcpTools(workspace),\n ]);\n const extraTools = [...customTools, ...mcp.tools];\n if (!json && customTools.length > 0) {\n console.log(pc.dim(t(\"tools.customLoaded\", { names: customTools.map((tl) => tl.spec.name).join(\", \") })));\n }\n if (!json && mcp.servers.length > 0) {\n console.log(pc.dim(t(\"mcp.connected\", { servers: mcp.servers.join(\", \"), n: mcp.tools.length })));\n }\n\n const runOnce = (taskText: string): Promise<RunResult> =>\n runAgent({\n task: taskText,\n workspace,\n agent: resolved,\n permissions,\n promptContext: { workspace, mode: session.mode, allow: session.allow },\n history: session.history,\n maxSteps: session.maxSteps,\n compactThresholdTokens: compactionThreshold(),\n extraTools,\n hooks,\n signal: controller.signal,\n events,\n });\n\n if (!json) spinner.start(t(\"ui.thinking\"));\n let result: RunResult;\n try {\n result = await runOnce(task);\n session.history = result.messages;\n\n // Test-driven verification: run project checks and feed failures back to\n // the agent until they pass or the retry budget is exhausted.\n if (verify && result.reason === \"finished\" && !controller.signal.aborted) {\n result = await runVerification(runOnce, workspace, session, spinner, json, controller.signal, result);\n }\n } finally {\n spinner.stop();\n cancel.dispose();\n await mcp.close(); // shut down any spawned MCP servers\n }\n\n // Persist the conversation so it can be resumed (secrets are redacted on save).\n if (!session.title) session.title = deriveTitle(session.history);\n await saveSession({\n id: session.id,\n updatedAt: new Date().toISOString(),\n title: session.title,\n agentName: session.agentName,\n mode: session.mode,\n messages: session.history,\n }).catch(() => {/* best-effort persistence */});\n\n // Account for estimated spend and persist analytics (best-effort).\n const runCost = pricing ? estimateCost(result.usage, pricing) : 0;\n session.costUsd += runCost;\n await recordUsage({\n ts: new Date().toISOString(),\n agent: resolved.config.name,\n provider: resolved.config.provider,\n model: resolved.config.model,\n promptTokens: result.usage.promptTokens,\n completionTokens: result.usage.completionTokens,\n costUsd: runCost,\n });\n\n if (collector) {\n process.stdout.write(JSON.stringify(collector.build(result)) + \"\\n\");\n return;\n }\n\n if (budgetHit) {\n console.log(pc.yellow(\"\\n\" + t(\"budget.hit\", { budget: fmtUsd(session.budget ?? 0) })));\n }\n\n if (result.reason === \"finished\") {\n console.log(pc.green(\"\\n\" + t(\"run.done\", { steps: result.steps })) + (result.summary ? ` ${result.summary}` : \"\"));\n } else if (result.reason === \"cancelled\") {\n console.log(pc.dim(\"\\n\" + t(\"run.cancelled\")));\n } else if (result.reason === \"stalled\" || result.reason === \"maxsteps\") {\n console.log(pc.yellow(\"\\n\" + t(\"run.stopped\", { steps: result.steps })));\n }\n // \"reply\" → the assistant simply talked to the user; nothing more to print.\n\n if (result.usage.promptTokens || result.usage.completionTokens) {\n const total = result.usage.promptTokens + result.usage.completionTokens;\n const tokensLine = t(\"ui.tokens\", {\n total: fmtTokens(total),\n in: fmtTokens(result.usage.promptTokens),\n out: fmtTokens(result.usage.completionTokens),\n });\n const cost = pricing ? ` · ~${fmtUsd(runCost)}` : \"\";\n console.log(pc.dim(\"↳ \" + tokensLine + cost));\n }\n}\n\n/** Compact token count, e.g. 1234 → \"1.2k\". */\nfunction fmtTokens(n: number): string {\n return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n\nasync function confirmAction(req: ConfirmRequest): Promise<ConfirmResult> {\n // Writes in review mode: show the real diff and allow approve-all / reject /\n // (when there is more than one hunk) per-hunk selection.\n if (req.kind === \"write\" && req.hunks && req.hunks.length > 0) {\n renderDiff(req.hunks);\n const options = [\n { value: \"approve\", label: t(\"review.approveAll\") },\n { value: \"reject\", label: t(\"review.reject\") },\n ...(req.hunks.length > 1 ? [{ value: \"hunks\", label: t(\"review.pickHunks\") }] : []),\n ];\n const choice = await p.select({ message: t(\"run.confirm\", { summary: req.summary }), options });\n if (p.isCancel(choice) || choice === \"reject\") return false;\n if (choice === \"approve\") return true;\n\n const selected = await p.multiselect({\n message: t(\"review.selectHunks\"),\n options: req.hunks.map((h, i) => ({ value: i, label: hunkLabel(h) })),\n required: false,\n });\n if (p.isCancel(selected)) return false;\n return selected as number[];\n }\n\n if (req.preview) console.log(pc.dim(req.preview));\n const answer = await p.confirm({ message: t(\"run.confirm\", { summary: req.summary }) });\n if (p.isCancel(answer)) return false;\n return answer === true;\n}\n\n/**\n * Run the project's verification checks; on failure feed the output back to the\n * agent and re-run, up to MAX_VERIFY_FIXES times. Returns the latest run result.\n */\nasync function runVerification(\n runOnce: (task: string) => Promise<RunResult>,\n workspace: string,\n session: SessionState,\n spinner: Spinner,\n json: boolean,\n signal: AbortSignal,\n initial: RunResult,\n): Promise<RunResult> {\n const checks = await detectChecks(workspace);\n if (checks.length === 0) {\n if (!json) console.log(pc.dim(t(\"verify.noChecks\")));\n return initial;\n }\n let result = initial;\n for (let fix = 0; ; fix++) {\n if (signal.aborted) return result;\n if (!json) spinner.start(t(\"verify.running\"));\n const results = await runChecks(workspace, checks);\n spinner.stop();\n const failed = results.filter((r) => !r.ok);\n if (failed.length === 0) {\n if (!json) console.log(pc.green(\"✓ \" + t(\"verify.passed\")));\n return result;\n }\n if (fix >= MAX_VERIFY_FIXES) {\n if (!json) console.log(pc.yellow(\"⚠ \" + t(\"verify.giveUp\", { n: failed.length })));\n return result;\n }\n if (!json) {\n console.log(pc.yellow(\"✗ \" + t(\"verify.failed\", { n: failed.length, attempt: fix + 1 })));\n }\n if (!json) spinner.start(t(\"ui.thinking\"));\n result = await runOnce(buildVerifyFeedback(failed));\n spinner.stop();\n session.history = result.messages;\n }\n}\n\n/** Print a colored unified diff for the hunks of a pending write. */\nfunction renderDiff(hunks: Hunk[]): void {\n for (const h of hunks) {\n console.log(pc.cyan(`@@ -${h.oldStart + 1},${h.oldCount} +${h.newStart + 1},${h.newCount} @@`));\n for (const l of h.lines) {\n if (l.type === \"+\") console.log(pc.green(`+${l.text}`));\n else if (l.type === \"-\") console.log(pc.red(`-${l.text}`));\n else console.log(pc.dim(` ${l.text}`));\n }\n }\n}\n\nfunction renderEvents(spinner: Spinner): AgentEvents {\n // Tracks whether the current step already streamed text live, so onAssistantText\n // doesn't reprint it — it just closes the line.\n let streamed = false;\n return {\n onStep() {\n streamed = false;\n spinner.start(t(\"ui.thinking\"));\n },\n onUsage(usage) {\n const total = usage.promptTokens + usage.completionTokens;\n if (total > 0) spinner.setSuffix(t(\"ui.tokensShort\", { total: fmtTokens(total) }));\n },\n onAssistantDelta(chunk) {\n spinner.stop();\n process.stdout.write(pc.cyan(chunk));\n streamed = true;\n },\n onAssistantText(text) {\n spinner.stop();\n if (streamed) {\n process.stdout.write(\"\\n\"); // close the streamed line; already printed\n return;\n }\n if (text.trim()) console.log(pc.cyan(text.trim()));\n },\n onToolCall(call) {\n spinner.stop();\n const arg = call.name === \"run_command\" ? call.arguments.command : call.arguments.path;\n console.log(pc.dim(` → ${call.name}${arg ? ` ${String(arg)}` : \"\"}`));\n spinner.start(t(\"ui.running\", { tool: call.name }));\n },\n onToolResult(_call, result) {\n spinner.stop();\n const head = result.output.split(\"\\n\")[0] ?? \"\";\n console.log((result.ok ? pc.green(\" ✓ \") : pc.red(\" ✗ \")) + pc.dim(head.slice(0, 120)));\n },\n onReprompt(attempt) {\n spinner.stop();\n console.log(pc.yellow(\" \" + t(\"run.reprompt\", { attempt })));\n },\n onCompaction(before, after) {\n spinner.stop();\n console.log(pc.dim(\"↯ \" + t(\"compaction.done\", { before: fmtTokens(before), after: fmtTokens(after) })));\n },\n onCorrection() {\n spinner.stop();\n console.log(pc.yellow(\" ↻ \" + t(\"run.autocorrect\")));\n },\n };\n}\n","import type {\n ChatRequest,\n ChatResponse,\n Message,\n Provider,\n ToolCall,\n} from \"./types.js\";\n\nexport interface AnthropicOptions {\n name: string;\n model: string;\n baseURL: string;\n apiKey: string;\n timeoutMs?: number;\n}\n\ninterface AnthropicBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: Record<string, unknown>;\n tool_use_id?: string;\n content?: unknown;\n}\n\n/** Minimal native provider for the Anthropic Messages API (no SDK dependency). */\nexport class AnthropicProvider implements Provider {\n readonly name: string;\n readonly model: string;\n private readonly baseURL: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n\n constructor(opts: AnthropicOptions) {\n this.name = opts.name;\n this.model = opts.model;\n this.baseURL = opts.baseURL.replace(/\\/$/, \"\");\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 120_000;\n }\n\n async chat(req: ChatRequest): Promise<ChatResponse> {\n const system = req.messages\n .filter((m) => m.role === \"system\")\n .map((m) => m.content)\n .join(\"\\n\\n\");\n\n const messages = groupMessages(req.messages.filter((m) => m.role !== \"system\"));\n\n const body = {\n model: this.model,\n max_tokens: req.params?.maxTokens ?? 8192,\n temperature: req.params?.temperature,\n ...(system ? { system } : {}),\n messages,\n ...(req.tools && req.tools.length > 0\n ? {\n tools: req.tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.parameters,\n })),\n }\n : {}),\n };\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n // Forward an external abort (e.g. user pressed ESC) to this request.\n if (req.signal) {\n if (req.signal.aborted) controller.abort();\n else req.signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n let res: Response;\n try {\n res = await fetch(`${this.baseURL}/v1/messages`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Anthropic API ${res.status}: ${text.slice(0, 500)}`);\n }\n\n const data = (await res.json()) as {\n content: AnthropicBlock[];\n stop_reason?: string;\n usage?: { input_tokens?: number; output_tokens?: number };\n };\n\n const text = data.content\n .filter((b) => b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\"\");\n const toolCalls: ToolCall[] = data.content\n .filter((b) => b.type === \"tool_use\")\n .map((b) => ({\n id: b.id ?? \"\",\n name: b.name ?? \"\",\n arguments: b.input ?? {},\n }));\n\n return {\n content: text,\n toolCalls,\n finishReason: data.stop_reason ?? \"stop\",\n usage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n }\n : undefined,\n };\n }\n}\n\n/**\n * Convert our flat message list into Anthropic's block format, grouping\n * consecutive tool results into one user turn so roles alternate correctly.\n */\nfunction groupMessages(\n messages: Message[],\n): Array<{ role: \"user\" | \"assistant\"; content: AnthropicBlock[] }> {\n const out: Array<{ role: \"user\" | \"assistant\"; content: AnthropicBlock[] }> = [];\n\n for (const m of messages) {\n if (m.role === \"tool\") {\n const block: AnthropicBlock = {\n type: \"tool_result\",\n tool_use_id: m.toolCallId ?? \"\",\n content: m.content,\n };\n const last = out[out.length - 1];\n if (last && last.role === \"user\") last.content.push(block);\n else out.push({ role: \"user\", content: [block] });\n continue;\n }\n\n if (m.role === \"assistant\") {\n const blocks: AnthropicBlock[] = [];\n if (m.content) blocks.push({ type: \"text\", text: m.content });\n for (const tc of m.toolCalls ?? []) {\n blocks.push({ type: \"tool_use\", id: tc.id, name: tc.name, input: tc.arguments });\n }\n out.push({ role: \"assistant\", content: blocks });\n continue;\n }\n\n // user\n out.push({ role: \"user\", content: [{ type: \"text\", text: m.content }] });\n }\n\n return out;\n}\n","import OpenAI from \"openai\";\nimport type {\n ChatRequest,\n ChatResponse,\n Message,\n Provider,\n ToolCall,\n} from \"./types.js\";\n\nexport interface OpenAICompatibleOptions {\n name: string;\n model: string;\n baseURL: string;\n apiKey?: string;\n timeoutMs?: number;\n maxRetries?: number;\n}\n\n/**\n * Provider for any OpenAI-compatible Chat Completions endpoint.\n * Covers OpenRouter, Ollama (`/v1`), and generic gateways. Native tool-calling\n * is used when `tools` are supplied; the emulated path simply omits them.\n */\nexport class OpenAICompatibleProvider implements Provider {\n readonly name: string;\n readonly model: string;\n private readonly client: OpenAI;\n\n constructor(opts: OpenAICompatibleOptions) {\n this.name = opts.name;\n this.model = opts.model;\n this.client = new OpenAI({\n baseURL: opts.baseURL,\n // Ollama accepts any non-empty key; OpenRouter requires a real one.\n apiKey: opts.apiKey ?? \"polypus-no-key\",\n timeout: opts.timeoutMs ?? 120_000,\n maxRetries: opts.maxRetries ?? 2,\n });\n }\n\n async chat(req: ChatRequest): Promise<ChatResponse> {\n const messages = req.messages.map(toOpenAIMessage);\n const tools = req.tools?.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n }));\n const base = {\n model: this.model,\n messages,\n ...(tools && tools.length > 0 ? { tools } : {}),\n temperature: req.params?.temperature,\n // Generous default so large files aren't truncated mid tool-call.\n max_tokens: req.params?.maxTokens ?? 8192,\n };\n\n // Streaming path: emit text chunks live while aggregating the full response.\n if (req.onDelta) {\n const stream = await this.client.chat.completions.create(\n { ...base, stream: true, stream_options: { include_usage: true } },\n { signal: req.signal },\n );\n const agg = await aggregateStream(stream as AsyncIterable<StreamChunk>, req.onDelta);\n return {\n content: agg.content,\n toolCalls: agg.toolCalls.map((tc, i) => ({\n id: tc.id || `call_${i}`,\n name: tc.name,\n arguments: safeParseArgs(tc.arguments),\n })),\n finishReason: agg.finishReason || \"stop\",\n usage: agg.usage,\n };\n }\n\n const completion = await this.client.chat.completions.create(\n { ...base },\n { signal: req.signal },\n );\n\n const choice = completion.choices[0];\n const msg = choice?.message;\n const toolCalls: ToolCall[] = (msg?.tool_calls ?? []).map((tc, i) => ({\n id: tc.id || `call_${i}`,\n name: tc.function.name,\n arguments: safeParseArgs(tc.function.arguments),\n }));\n\n return {\n content: msg?.content ?? \"\",\n toolCalls,\n finishReason: choice?.finish_reason ?? \"stop\",\n usage: completion.usage\n ? {\n promptTokens: completion.usage.prompt_tokens,\n completionTokens: completion.usage.completion_tokens,\n }\n : undefined,\n };\n }\n}\n\n/** Minimal shape of an OpenAI streaming chunk (only the fields we read). */\nexport interface StreamChunk {\n choices?: Array<{\n delta?: {\n content?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number } | null;\n}\n\nexport interface AggregatedStream {\n content: string;\n toolCalls: Array<{ id: string; name: string; arguments: string }>;\n finishReason: string;\n usage?: { promptTokens?: number; completionTokens?: number };\n}\n\n/**\n * Consume an OpenAI-style chat stream, calling `onDelta` for each text chunk and\n * aggregating content, tool-call deltas (by index), finish reason, and usage.\n * Pure (no SDK dependency) so it can be unit-tested with a mocked iterable.\n */\nexport async function aggregateStream(\n stream: AsyncIterable<StreamChunk>,\n onDelta?: (chunk: string) => void,\n): Promise<AggregatedStream> {\n let content = \"\";\n let finishReason = \"\";\n let usage: AggregatedStream[\"usage\"];\n const toolAcc: Array<{ id: string; name: string; arguments: string }> = [];\n\n for await (const chunk of stream) {\n const choice = chunk.choices?.[0];\n const delta = choice?.delta;\n if (delta?.content) {\n content += delta.content;\n onDelta?.(delta.content);\n }\n for (const tc of delta?.tool_calls ?? []) {\n const slot = (toolAcc[tc.index] ??= { id: \"\", name: \"\", arguments: \"\" });\n if (tc.id) slot.id = tc.id;\n if (tc.function?.name) slot.name = tc.function.name;\n if (tc.function?.arguments) slot.arguments += tc.function.arguments;\n }\n if (choice?.finish_reason) finishReason = choice.finish_reason;\n if (chunk.usage) {\n usage = {\n promptTokens: chunk.usage.prompt_tokens,\n completionTokens: chunk.usage.completion_tokens,\n };\n }\n }\n\n return { content, finishReason, usage, toolCalls: toolAcc.filter(Boolean) };\n}\n\nfunction toOpenAIMessage(m: Message): OpenAI.Chat.ChatCompletionMessageParam {\n switch (m.role) {\n case \"tool\":\n return {\n role: \"tool\",\n content: m.content,\n tool_call_id: m.toolCallId ?? \"\",\n };\n case \"assistant\":\n return {\n role: \"assistant\",\n content: m.content || null,\n ...(m.toolCalls && m.toolCalls.length > 0\n ? {\n tool_calls: m.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n },\n })),\n }\n : {}),\n };\n case \"system\":\n return { role: \"system\", content: m.content };\n default:\n return { role: \"user\", content: m.content };\n }\n}\n\nfunction safeParseArgs(raw: string): Record<string, unknown> {\n if (!raw || !raw.trim()) return {};\n try {\n const parsed = JSON.parse(raw);\n if (typeof parsed === \"object\" && parsed !== null) return parsed as Record<string, unknown>;\n return { value: parsed };\n } catch {\n // Models often emit invalid JSON for large code payloads (unescaped quotes/\n // newlines in 'content'). Recover the common string fields heuristically.\n return recoverArgs(raw);\n }\n}\n\nconst SHORT_FIELDS = [\"path\", \"command\", \"summary\"] as const;\nconst LONG_FIELDS = [\"content\", \"replace\", \"search\"] as const;\n\n/** Best-effort extraction of known tool arguments from malformed JSON. */\nfunction recoverArgs(raw: string): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of SHORT_FIELDS) {\n const m = new RegExp(`\"${key}\"\\\\s*:\\\\s*\"((?:[^\"\\\\\\\\]|\\\\\\\\.)*)\"`).exec(raw);\n if (m) out[key] = unescapeJsonString(m[1]!);\n }\n // Long fields may contain unescaped quotes/newlines: capture from the key up\n // to the last double-quote in the payload (the closing quote before `}`).\n for (const key of LONG_FIELDS) {\n const opener = new RegExp(`\"${key}\"\\\\s*:\\\\s*\"`).exec(raw);\n if (!opener) continue;\n const from = opener.index + opener[0].length;\n const end = raw.lastIndexOf('\"');\n if (end > from) out[key] = unescapeJsonString(raw.slice(from, end));\n }\n if (Object.keys(out).length === 0) out._raw = raw;\n return out;\n}\n\n/** Exposed for unit tests. */\nexport const __test_safeParseArgs = safeParseArgs;\n\nfunction unescapeJsonString(s: string): string {\n return s\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\r/g, \"\\r\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\//g, \"/\")\n .replace(/\\\\\\\\/g, \"\\\\\");\n}\n","import type { AgentConfig } from \"../config/schema.js\";\nimport { resolveSecret } from \"../config/store.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { DEFAULT_BASE_URL } from \"./defaults.js\";\nimport { OpenAICompatibleProvider } from \"./openai-compatible.js\";\nimport type { Provider } from \"./types.js\";\nimport { t } from \"../i18n/index.js\";\n\nexport type ResolvedToolMode = \"native\" | \"emulated\";\n\nexport interface ResolvedAgent {\n config: AgentConfig;\n provider: Provider;\n toolMode: ResolvedToolMode;\n}\n\n/**\n * Resolve `auto` to a concrete tool path. Cloud providers generally expose\n * function-calling, while local models (Ollama) are frequently base models\n * without it — so emulated is the safer default there. Users can force either\n * with `--tool-mode`.\n */\nexport function resolveToolMode(agent: AgentConfig): ResolvedToolMode {\n if (agent.toolMode !== \"auto\") return agent.toolMode;\n return agent.provider === \"ollama\" ? \"emulated\" : \"native\";\n}\n\nexport function createProvider(agent: AgentConfig): ResolvedAgent {\n const apiKey = resolveSecret(agent.apiKey);\n const baseURL = agent.baseUrl ?? DEFAULT_BASE_URL[agent.provider];\n if (!baseURL) {\n throw new Error(t(\"agent.noBaseUrl\", { name: agent.name }));\n }\n\n let provider: Provider;\n if (agent.provider === \"anthropic\") {\n if (!apiKey) throw new Error(t(\"agent.needAnthropicKey\", { name: agent.name }));\n provider = new AnthropicProvider({\n name: agent.name,\n model: agent.model,\n baseURL,\n apiKey,\n });\n } else {\n provider = new OpenAICompatibleProvider({\n name: agent.name,\n model: agent.model,\n baseURL,\n apiKey,\n });\n }\n\n return { config: agent, provider, toolMode: resolveToolMode(agent) };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { PermissionMode } from \"../config/schema.js\";\nimport { checkPath, isCommandPreApproved, type PathPolicy } from \"./allowlist.js\";\nimport { scanSecrets, screenCommand } from \"./policy.js\";\nimport { computeHunks, type Hunk } from \"./diff.js\";\nimport { applyHunks } from \"./diff.js\";\nimport { t } from \"../i18n/index.js\";\n\nexport interface ConfirmRequest {\n kind: \"write\" | \"command\";\n summary: string;\n preview?: string;\n /** For writes in review mode: the change split into hunks, for diff/hunk approval. */\n hunks?: Hunk[];\n}\n\n/**\n * Result of a confirmation: `true` = approve all, `false` = reject, or an array\n * of approved hunk indexes (a subset approval for a write).\n */\nexport type ConfirmResult = boolean | number[];\n\nexport type ConfirmFn = (req: ConfirmRequest) => Promise<ConfirmResult>;\n\nexport interface Decision {\n allowed: boolean;\n reason?: string;\n /** When present, the exact content the caller should write (a subset-of-hunks result). */\n content?: string;\n}\n\nexport interface PermissionEngineOptions {\n mode: PermissionMode;\n policy: PathPolicy;\n allowedCommands: string[];\n /** Invoked in `review` mode to ask the user. Defaults to deny if absent. */\n confirm?: ConfirmFn;\n}\n\n/** Central authority for whether a file write or command may proceed. */\nexport class PermissionEngine {\n constructor(private readonly opts: PermissionEngineOptions) {}\n\n get mode(): PermissionMode {\n return this.opts.mode;\n }\n\n /** Reads are allowed in every mode as long as the path is within the allow-list. */\n authorizeRead(target: string): Decision {\n const d = checkPath(this.opts.policy, target);\n return d.allowed ? { allowed: true } : { allowed: false, reason: d.reason };\n }\n\n async authorizeWrite(target: string, preview?: string, content?: string): Promise<Decision> {\n const d = checkPath(this.opts.policy, target);\n if (!d.allowed) return { allowed: false, reason: d.reason };\n\n // Read the current file (if any) so we can diff and scan only added lines.\n let oldContent = \"\";\n try {\n oldContent = await readFile(resolve(this.opts.policy.workspace, target), \"utf8\");\n } catch {\n /* new file — no old content */\n }\n const hunks = content !== undefined ? computeHunks(oldContent, content) : [];\n const added = hunks\n .flatMap((h) => h.lines.filter((l) => l.type === \"+\").map((l) => l.text))\n .join(\"\\n\");\n\n // Block hard-coded secrets in the added content before any mode gating —\n // applies even in bypass. Pre-existing secrets are not re-flagged.\n const findings = scanSecrets(hunks.length > 0 ? added : content ?? preview ?? \"\");\n if (findings.length > 0) {\n const first = findings[0]!;\n return {\n allowed: false,\n reason: t(\"policy.secretFound\", { kind: first.kind, line: first.line }),\n };\n }\n\n if (this.opts.mode === \"plan\") {\n return { allowed: false, reason: \"plan mode: file modifications are disabled\" };\n }\n if (this.opts.mode === \"bypass\") return { allowed: true };\n\n const res = await this.ask({ kind: \"write\", summary: `write ${d.rel}`, preview, hunks });\n if (res === true) return { allowed: true };\n if (res === false) return { allowed: false, reason: \"rejected by user\" };\n\n // A subset of hunk indexes was approved.\n const approved = new Set(res);\n if (approved.size === 0) return { allowed: false, reason: \"rejected by user\" };\n if (approved.size === hunks.length) return { allowed: true };\n return { allowed: true, content: applyHunks(oldContent, hunks, approved) };\n }\n\n async authorizeCommand(command: string): Promise<Decision> {\n // Destructive commands are blocked in every mode, including bypass.\n const screen = screenCommand(command);\n if (screen.blocked) {\n return { allowed: false, reason: t(\"policy.blockedCommand\", { reason: screen.reason ?? \"\" }) };\n }\n if (this.opts.mode === \"plan\") {\n return { allowed: false, reason: \"plan mode: running commands is disabled\" };\n }\n if (this.opts.mode === \"bypass\") return { allowed: true };\n if (isCommandPreApproved(this.opts.allowedCommands, command)) return { allowed: true };\n\n const res = await this.ask({ kind: \"command\", summary: `run: ${command}` });\n return res === true ? { allowed: true } : { allowed: false, reason: \"rejected by user\" };\n }\n\n private async ask(req: ConfirmRequest): Promise<ConfirmResult> {\n if (!this.opts.confirm) return false;\n return this.opts.confirm(req);\n }\n}\n","import { isAbsolute, relative, resolve, sep } from \"node:path\";\n\n/**\n * Convert a glob to a RegExp. Supports `**` (any path segments, including none),\n * `*` (within a segment), and `?` (single non-slash char). Paths are matched in\n * POSIX form (forward slashes).\n */\nexport function globToRegExp(glob: string): RegExp {\n let re = \"\";\n for (let i = 0; i < glob.length; i++) {\n const c = glob[i]!;\n if (c === \"*\") {\n if (glob[i + 1] === \"*\") {\n // `**` — any sequence including slashes; swallow an optional following slash.\n re += \".*\";\n i++;\n if (glob[i + 1] === \"/\") i++;\n } else {\n re += \"[^/]*\";\n }\n } else if (c === \"?\") {\n re += \"[^/]\";\n } else if (\".+^${}()|[]\\\\\".includes(c)) {\n re += \"\\\\\" + c;\n } else {\n re += c;\n }\n }\n return new RegExp(`^${re}$`);\n}\n\n/** Normalize an OS path to a POSIX-style relative path for glob matching. */\nexport function toPosix(p: string): string {\n return p.split(sep).join(\"/\");\n}\n\nexport interface PathPolicy {\n workspace: string;\n allow: string[];\n deny: string[];\n}\n\nexport interface PathDecision {\n allowed: boolean;\n reason?: string;\n /** Workspace-relative POSIX path. */\n rel: string;\n}\n\n/**\n * Decide whether a path may be accessed. Rejects paths outside the workspace,\n * then applies deny globs (which win) and allow globs.\n */\nexport function checkPath(policy: PathPolicy, target: string): PathDecision {\n const abs = isAbsolute(target) ? target : resolve(policy.workspace, target);\n const rel = toPosix(relative(policy.workspace, abs));\n\n if (rel === \"\" || rel.startsWith(\"..\") || isAbsolute(rel)) {\n return { allowed: false, rel, reason: \"path escapes the workspace\" };\n }\n for (const d of policy.deny) {\n if (globToRegExp(d).test(rel)) {\n return { allowed: false, rel, reason: `denied by deny-list pattern \"${d}\"` };\n }\n }\n for (const a of policy.allow) {\n if (globToRegExp(a).test(rel)) return { allowed: true, rel };\n }\n return { allowed: false, rel, reason: \"not in the allow-list\" };\n}\n\n/** A command is pre-approved when it starts with one of the allowed prefixes. */\nexport function isCommandPreApproved(allowedCommands: string[], command: string): boolean {\n const c = command.trim();\n return allowedCommands.some((prefix) => c === prefix || c.startsWith(prefix.trim() + \" \"));\n}\n","/**\n * Safety policy shared by the permission engine: a deny-list of obviously\n * destructive shell commands, and a scanner for hard-coded secrets in file\n * writes. Both are deliberately conservative (specific patterns) to keep false\n * positives low while catching the dangerous/leaky cases.\n */\n\nexport interface CommandScreen {\n blocked: boolean;\n reason?: string;\n}\n\n/** Patterns that are almost never legitimate from an autonomous agent. */\nconst DANGEROUS_COMMANDS: { re: RegExp; reason: string }[] = [\n { re: /--no-preserve-root/i, reason: \"rm --no-preserve-root\" },\n { re: /:\\(\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;\\s*:/, reason: \"fork bomb\" },\n { re: /\\bmkfs(\\.\\w+)?\\b/i, reason: \"filesystem format (mkfs)\" },\n { re: /\\bdd\\b[^\\n]*\\bof=\\/dev\\/(sd|nvme|hd|disk)/i, reason: \"dd writing to a raw disk device\" },\n { re: />\\s*\\/dev\\/(sd|nvme|hd|disk)/i, reason: \"redirect to a raw disk device\" },\n { re: /\\bchmod\\s+(-[a-z]*\\s+)*-?R?\\s*777\\s+\\//i, reason: \"chmod 777 on /\" },\n { re: /\\b(curl|wget)\\b[^\\n|]*\\|\\s*(sudo\\s+)?(sh|bash|zsh)\\b/i, reason: \"piping a downloaded script straight into a shell\" },\n];\n\n/** A recursive+force `rm` aimed at root, home, or a bare glob — catastrophic. */\nfunction isDangerousRm(command: string): boolean {\n if (!/\\brm\\b/i.test(command)) return false;\n const recursive =\n /(?:^|\\s)-[a-z]*r[a-z]*f/i.test(command) ||\n /(?:^|\\s)-[a-z]*f[a-z]*r/i.test(command) ||\n (/(?:^|\\s)-[a-z]*r\\b/i.test(command) && /(?:^|\\s)-[a-z]*f\\b/i.test(command));\n if (!recursive) return false;\n // Target is bare root, /*, ~, $HOME, or a lone * (whole working dir).\n return /(?:\\s|^)(?:\\/\\*|\\/|~|\\$HOME|\\*)(?:\\s|$)/.test(command);\n}\n\n/** Decide whether a shell command is too dangerous to run in any mode. */\nexport function screenCommand(command: string): CommandScreen {\n if (isDangerousRm(command)) {\n return { blocked: true, reason: \"recursive force-delete of / ~ or *\" };\n }\n for (const { re, reason } of DANGEROUS_COMMANDS) {\n if (re.test(command)) return { blocked: true, reason };\n }\n return { blocked: false };\n}\n\nexport interface SecretFinding {\n line: number;\n kind: string;\n}\n\nconst SECRET_PATTERNS: { re: RegExp; kind: string }[] = [\n { re: /-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/, kind: \"private key block\" },\n { re: /\\bAKIA[0-9A-Z]{16}\\b/, kind: \"AWS access key id\" },\n { re: /\\bgh[pousr]_[A-Za-z0-9]{36,}\\b/, kind: \"GitHub token\" },\n { re: /\\bxox[baprs]-[A-Za-z0-9-]{10,}\\b/, kind: \"Slack token\" },\n { re: /\\bsk-[A-Za-z0-9]{32,}\\b/, kind: \"OpenAI-style secret key\" },\n { re: /\\bAIza[0-9A-Za-z_-]{35}\\b/, kind: \"Google API key\" },\n];\n\n/** Replace any secrets in the text with a redaction marker (best-effort). */\nexport function redactSecrets(text: string): string {\n let out = text;\n for (const { re } of SECRET_PATTERNS) {\n out = out.replace(new RegExp(re.source, re.flags.includes(\"g\") ? re.flags : re.flags + \"g\"), \"[redacted]\");\n }\n return out;\n}\n\n/** Scan text for hard-coded secrets. Returns one finding per matching line. */\nexport function scanSecrets(text: string): SecretFinding[] {\n const findings: SecretFinding[] = [];\n const lines = text.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n for (const { re, kind } of SECRET_PATTERNS) {\n if (re.test(lines[i]!)) {\n findings.push({ line: i + 1, kind });\n break; // one finding per line is enough to block\n }\n }\n }\n return findings;\n}\n","/**\n * Minimal line-based diff (LCS) grouped into hunks, used to show the real change\n * in `review` mode and to let the user approve a subset of hunks. Dependency-free.\n */\n\nexport type DiffLineType = \" \" | \"-\" | \"+\";\n\nexport interface DiffLine {\n type: DiffLineType;\n text: string;\n}\n\nexport interface Hunk {\n /** 0-based index of the first old-file line this hunk covers. */\n oldStart: number;\n /** Number of old-file lines this hunk covers (context + removed). */\n oldCount: number;\n /** 0-based index of the first new-file line this hunk covers. */\n newStart: number;\n /** Number of new-file lines this hunk produces (context + added). */\n newCount: number;\n lines: DiffLine[];\n}\n\nconst CONTEXT = 3;\n\nfunction splitLines(text: string): string[] {\n return text === \"\" ? [] : text.split(\"\\n\");\n}\n\n/** Longest-common-subsequence table over two line arrays. */\nfunction lcsOps(a: string[], b: string[]): DiffLine[] {\n const n = a.length;\n const m = b.length;\n const dp: number[][] = Array.from({ length: n + 1 }, () => new Array<number>(m + 1).fill(0));\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n dp[i]![j] = a[i] === b[j] ? dp[i + 1]![j + 1]! + 1 : Math.max(dp[i + 1]![j]!, dp[i]![j + 1]!);\n }\n }\n const out: DiffLine[] = [];\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n out.push({ type: \" \", text: a[i]! });\n i++;\n j++;\n } else if (dp[i + 1]![j]! >= dp[i]![j + 1]!) {\n out.push({ type: \"-\", text: a[i]! });\n i++;\n } else {\n out.push({ type: \"+\", text: b[j]! });\n j++;\n }\n }\n while (i < n) out.push({ type: \"-\", text: a[i++]! });\n while (j < m) out.push({ type: \"+\", text: b[j++]! });\n return out;\n}\n\n/** Compute the hunks (changed regions with surrounding context) between two texts. */\nexport function computeHunks(oldText: string, newText: string): Hunk[] {\n const a = splitLines(oldText);\n const b = splitLines(newText);\n const ops = lcsOps(a, b);\n\n // Mark which positions in the op list are changes; expand by CONTEXT.\n const isChange = ops.map((o) => o.type !== \" \");\n const keep = new Array<boolean>(ops.length).fill(false);\n for (let k = 0; k < ops.length; k++) {\n if (isChange[k]) {\n for (let c = Math.max(0, k - CONTEXT); c <= Math.min(ops.length - 1, k + CONTEXT); c++) {\n keep[c] = true;\n }\n }\n }\n\n const hunks: Hunk[] = [];\n let oldLine = 0;\n let newLine = 0;\n let k = 0;\n while (k < ops.length) {\n const op = ops[k]!;\n if (!keep[k]) {\n if (op.type !== \"+\") oldLine++;\n if (op.type !== \"-\") newLine++;\n k++;\n continue;\n }\n // Start a hunk; consume the contiguous kept run.\n const oldStart = oldLine;\n const newStart = newLine;\n const lines: DiffLine[] = [];\n let oldCount = 0;\n let newCount = 0;\n while (k < ops.length && keep[k]) {\n const cur = ops[k]!;\n lines.push(cur);\n if (cur.type !== \"+\") {\n oldLine++;\n oldCount++;\n }\n if (cur.type !== \"-\") {\n newLine++;\n newCount++;\n }\n k++;\n }\n hunks.push({ oldStart, oldCount, newStart, newCount, lines });\n }\n return hunks;\n}\n\n/**\n * Reconstruct a file from its old text, applying only the approved hunks.\n * Unapproved hunks keep the original lines. `approved` is a set of hunk indexes.\n */\nexport function applyHunks(oldText: string, hunks: Hunk[], approved: Set<number>): string {\n const a = splitLines(oldText);\n const out: string[] = [];\n let oldIdx = 0;\n hunks.forEach((hunk, idx) => {\n while (oldIdx < hunk.oldStart) out.push(a[oldIdx++]!);\n if (approved.has(idx)) {\n for (const l of hunk.lines) if (l.type !== \"-\") out.push(l.text);\n } else {\n for (const l of hunk.lines) if (l.type !== \"+\") out.push(l.text);\n }\n oldIdx = hunk.oldStart + hunk.oldCount;\n });\n while (oldIdx < a.length) out.push(a[oldIdx++]!);\n return out.join(\"\\n\");\n}\n\n/** A short one-line label for a hunk, used in the selection prompt. */\nexport function hunkLabel(hunk: Hunk): string {\n const added = hunk.lines.filter((l) => l.type === \"+\").length;\n const removed = hunk.lines.filter((l) => l.type === \"-\").length;\n const firstChange = hunk.lines.find((l) => l.type !== \" \");\n const preview = firstChange ? firstChange.text.trim().slice(0, 50) : \"\";\n return `@@ -${hunk.oldStart + 1},${hunk.oldCount} +${hunk.newStart + 1},${hunk.newCount} @@ (+${added}/-${removed}) ${preview}`;\n}\n","import type { ToolSpec } from \"../providers/types.js\";\nimport type { PermissionMode } from \"../config/schema.js\";\nimport { getLocale, LOCALE_NAMES, t } from \"../i18n/index.js\";\n\nexport interface PromptContext {\n workspace: string;\n mode: PermissionMode;\n allow: string[];\n /** Extra agent-specific instructions (e.g. a subtask brief from the orchestrator). */\n briefing?: string;\n /** Project operating instructions loaded from `.poly/agents.md` (or `AGENTS.md`). */\n projectInstructions?: string;\n}\n\n/** Shared role/permission preamble used by both the native and emulated paths. */\nfunction basePreamble(ctx: PromptContext): string {\n const modeLine =\n ctx.mode === \"plan\"\n ? \"You are in PLAN mode: investigate and propose changes, but do NOT modify files or run commands. Describe the plan and call `finish`.\"\n : ctx.mode === \"review\"\n ? \"You are in REVIEW mode: each file write and command will be shown to the user for approval before it runs.\"\n : \"You are in BYPASS mode: actions are applied automatically.\";\n\n return [\n \"You are Polypus, an autonomous coding agent working inside a real project directory.\",\n \"\",\n `Workspace (current working directory): ${ctx.workspace}`,\n `Editable paths (glob allow-list): ${ctx.allow.join(\", \")}`,\n modeLine,\n \"\",\n \"IMPORTANT — you have real permission to act:\",\n \"- YES, you ARE allowed to create, read, and modify files in this workspace.\",\n \"- YES, you ARE allowed to run shell commands (subject to the permission mode above).\",\n \"- Do not ask for permission and do not say you cannot edit files — you can. Just emit the tool calls.\",\n \"- Make the changes directly. When the task is fully done, call the `finish` tool with a short summary.\",\n t(\"prompt.language\", { language: LOCALE_NAMES[getLocale()] }),\n ctx.projectInstructions ? `\\n${t(\"prompt.projectInstructions\")}\\n\\n${ctx.projectInstructions}` : \"\",\n ctx.briefing ? `\\nYour assigned task:\\n${ctx.briefing}` : \"\",\n ].join(\"\\n\");\n}\n\nexport function buildNativeSystemPrompt(ctx: PromptContext): string {\n return [\n basePreamble(ctx),\n \"\",\n \"Use the provided tools/functions to read and edit files and run commands. Prefer small, targeted edits.\",\n ].join(\"\\n\");\n}\n\n/** Render the parameter names of a tool from its JSON schema for the prompt. */\nfunction describeParams(tool: ToolSpec): string {\n const props = (tool.parameters as { properties?: Record<string, { description?: string }> }).properties ?? {};\n const required = new Set(\n ((tool.parameters as { required?: string[] }).required ?? []),\n );\n const lines = Object.entries(props).map(\n ([k, v]) =>\n ` <arg name=\"${k}\">…</arg> ${required.has(k) ? \"(required)\" : \"(optional)\"} ${v.description ?? \"\"}`.trimEnd(),\n );\n return lines.length > 0 ? lines.join(\"\\n\") : \" (no arguments)\";\n}\n\nexport function buildEmulatedSystemPrompt(tools: ToolSpec[], ctx: PromptContext): string {\n const toolDocs = tools\n .map(\n (t) =>\n `- ${t.name}: ${t.description}\\n Call it like:\\n <polypus:tool name=\"${t.name}\">\\n${describeParams(t)}\\n </polypus:tool>`,\n )\n .join(\"\\n\\n\");\n\n return [\n basePreamble(ctx),\n \"\",\n \"This model has no native tool API, so you act by emitting tool calls as XML blocks.\",\n \"STRICT OUTPUT RULES:\",\n '- To act, output one or more <polypus:tool name=\"...\"> blocks and NOTHING else (no markdown code fences around them).',\n \"- Put file contents or code directly inside the relevant <arg> — angle brackets in code are fine.\",\n \"- You may include one or more tool blocks per turn. After you receive the results, continue.\",\n \"- When the entire task is complete, emit a finish call:\",\n ' <polypus:tool name=\"finish\"><arg name=\"summary\">what you did</arg></polypus:tool>',\n \"\",\n \"Available tools:\",\n \"\",\n toolDocs,\n ].join(\"\\n\");\n}\n\n/** Reinforcement message re-sent when the model produced no tool call (the \"yes, you can\" nudge). */\nexport function buildReprompt(): string {\n return [\n \"You did not emit any tool call. Remember: you ARE allowed and expected to act now.\",\n \"Do NOT explain that you cannot edit files — you can.\",\n 'Respond ONLY with one or more <polypus:tool name=\"...\"> blocks to make the change,',\n 'or with <polypus:tool name=\"finish\"><arg name=\"summary\">…</arg></polypus:tool> if the task is already complete.',\n ].join(\"\\n\");\n}\n","import type { ChatResponse, Message, ToolCall, ToolSpec } from \"../providers/types.js\";\nimport type { ProtocolDriver } from \"./driver.js\";\nimport { buildNativeSystemPrompt, type PromptContext } from \"./system-prompt.js\";\n\n/** Driver for providers with native function-calling. */\nexport class NativeDriver implements ProtocolDriver {\n readonly kind = \"native\" as const;\n\n constructor(private readonly tools: ToolSpec[]) {}\n\n systemPrompt(ctx: PromptContext): string {\n return buildNativeSystemPrompt(ctx);\n }\n\n providerTools(): ToolSpec[] | undefined {\n return this.tools;\n }\n\n parse(response: ChatResponse): { toolCalls: ToolCall[]; text: string } {\n return { toolCalls: response.toolCalls, text: response.content };\n }\n\n assistantMessage(response: ChatResponse, toolCalls: ToolCall[]): Message {\n return { role: \"assistant\", content: response.content, toolCalls };\n }\n\n toolResultMessage(call: ToolCall, resultText: string): Message {\n return { role: \"tool\", toolCallId: call.id, name: call.name, content: resultText };\n }\n\n repromptMessage(): Message {\n return {\n role: \"user\",\n content:\n \"You did not call any tool. Use the available tools to act now, or call `finish` if the task is complete.\",\n };\n }\n}\n","import type { ToolCall } from \"../providers/types.js\";\n\n/**\n * Tolerant parser for the emulated XML tool protocol. Extracts blocks of the form:\n *\n * <polypus:tool name=\"write_file\">\n * <arg name=\"path\">src/index.ts</arg>\n * <arg name=\"content\">...code...</arg>\n * </polypus:tool>\n *\n * Arg values may contain `<` and `>` (code). Values are read up to the last\n * </arg> before the next sibling <arg ...> (or the end of the tool block), which\n * tolerates angle brackets inside code without a strict XML parser.\n */\nconst TOOL_OPEN = /<polypus:tool\\s+name=\"([^\"]+)\"\\s*>/g;\nconst TOOL_CLOSE = \"</polypus:tool>\";\nconst ARG_OPEN = /<arg\\s+name=\"([^\"]+)\"\\s*>/g;\n\nexport interface ParseResult {\n toolCalls: ToolCall[];\n /** Text outside of any tool block (model reasoning / prose). */\n text: string;\n}\n\n/**\n * Parse emulated tool calls. `knownToolNames` enables a tolerant fallback for\n * the shorthand form some models drift to (e.g. `<finish>...</finish>` instead\n * of `<polypus:tool name=\"finish\">`).\n */\nexport function parseEmulatedToolCalls(\n output: string,\n knownToolNames: string[] = [],\n): ParseResult {\n const toolCalls: ToolCall[] = [];\n const proseParts: string[] = [];\n let cursor = 0;\n let callIndex = 0;\n\n TOOL_OPEN.lastIndex = 0;\n let open: RegExpExecArray | null;\n while ((open = TOOL_OPEN.exec(output))) {\n const name = open[1]!;\n const blockStart = open.index + open[0].length;\n const closeIdx = output.indexOf(TOOL_CLOSE, blockStart);\n if (closeIdx === -1) break; // unterminated block; bail out tolerantly\n\n proseParts.push(output.slice(cursor, open.index));\n const block = output.slice(blockStart, closeIdx);\n toolCalls.push({\n id: `emu_${callIndex++}`,\n name: name.trim(),\n arguments: parseArgs(block),\n });\n\n cursor = closeIdx + TOOL_CLOSE.length;\n TOOL_OPEN.lastIndex = cursor;\n }\n proseParts.push(output.slice(cursor));\n\n let text = proseParts.join(\"\").trim();\n\n // Strip orphan open/close tags that weak models sometimes leave dangling.\n text = text.replace(/<\\/?polypus:tool[^>]*>/g, \"\").trim();\n\n // Tolerant fallbacks for known tool names that weak models drift toward.\n if (knownToolNames.length > 0) {\n for (const name of knownToolNames) {\n const n = escapeName(name);\n\n // (a) Tag shorthand: <finish>...</finish>\n const tagRe = new RegExp(`<${n}(?:\\\\s[^>]*)?>([\\\\s\\\\S]*?)</${n}>`, \"g\");\n let m: RegExpExecArray | null;\n while ((m = tagRe.exec(text))) {\n toolCalls.push({ id: `emu_${callIndex++}`, name, arguments: parseArgs(m[1]!) });\n }\n text = text.replace(tagRe, \"\").trim();\n\n // (b) Label form: `finish:` followed by one or more <arg> blocks.\n const labelRe = new RegExp(\n `(?:^|\\\\n)[ \\\\t]*${n}[ \\\\t]*:?[ \\\\t]*\\\\n?((?:[ \\\\t]*<arg\\\\b[\\\\s\\\\S]*?</arg>[ \\\\t]*\\\\n?)+)`,\n \"g\",\n );\n while ((m = labelRe.exec(text))) {\n toolCalls.push({ id: `emu_${callIndex++}`, name, arguments: parseArgs(m[1]!) });\n }\n text = text.replace(labelRe, \"\").trim();\n }\n }\n\n return { toolCalls, text };\n}\n\nfunction escapeName(name: string): string {\n return name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction parseArgs(block: string): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n ARG_OPEN.lastIndex = 0;\n\n const matches: Array<{ name: string; valueStart: number }> = [];\n let m: RegExpExecArray | null;\n while ((m = ARG_OPEN.exec(block))) {\n matches.push({ name: m[1]!, valueStart: m.index + m[0].length });\n }\n\n for (let i = 0; i < matches.length; i++) {\n const current = matches[i]!;\n const next = matches[i + 1];\n const region = block.slice(current.valueStart, next ? next.valueStart : block.length);\n args[current.name.trim()] = trimArgValue(stripLastCloseTag(region));\n }\n return args;\n}\n\n/**\n * Keep only what precedes this arg's closing </arg>. For a non-final arg the\n * region also contains the next <arg ...> opener after the close tag; using the\n * last </arg> before that opener correctly isolates the current value.\n */\nfunction stripLastCloseTag(region: string): string {\n const idx = region.lastIndexOf(\"</arg>\");\n return idx === -1 ? region : region.slice(0, idx);\n}\n\n/** Trim a single leading/trailing newline that models tend to add around block values. */\nfunction trimArgValue(value: string): string {\n return value.replace(/^\\r?\\n/, \"\").replace(/\\r?\\n[ \\t]*$/, \"\");\n}\n","import type { ChatResponse, Message, ToolCall, ToolSpec } from \"../providers/types.js\";\nimport type { ProtocolDriver } from \"./driver.js\";\nimport { NativeDriver } from \"./native.js\";\nimport { parseEmulatedToolCalls } from \"./parser.js\";\nimport {\n buildEmulatedSystemPrompt,\n buildReprompt,\n type PromptContext,\n} from \"./system-prompt.js\";\n\n/** Driver for models without native tool-calling: tools are encoded as XML in the prompt. */\nexport class EmulatedDriver implements ProtocolDriver {\n readonly kind = \"emulated\" as const;\n\n constructor(private readonly tools: ToolSpec[]) {}\n\n systemPrompt(ctx: PromptContext): string {\n return buildEmulatedSystemPrompt(this.tools, ctx);\n }\n\n providerTools(): ToolSpec[] | undefined {\n return undefined; // encoded in the system prompt instead\n }\n\n parse(response: ChatResponse): { toolCalls: ToolCall[]; text: string } {\n return parseEmulatedToolCalls(\n response.content,\n this.tools.map((t) => t.name),\n );\n }\n\n assistantMessage(response: ChatResponse): Message {\n // Keep the raw output (including the XML) so the model sees its own actions.\n return { role: \"assistant\", content: response.content };\n }\n\n toolResultMessage(call: ToolCall, resultText: string): Message {\n // Emulated models don't understand the `tool` role; feed results back as user text.\n return {\n role: \"user\",\n content: `<polypus:tool_result name=\"${call.name}\">\\n${resultText}\\n</polypus:tool_result>`,\n };\n }\n\n repromptMessage(): Message {\n return { role: \"user\", content: buildReprompt() };\n }\n}\n\nexport function makeDriver(\n kind: \"native\" | \"emulated\",\n tools: ToolSpec[],\n): ProtocolDriver {\n return kind === \"native\" ? new NativeDriver(tools) : new EmulatedDriver(tools);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst Args = z.object({\n path: z.string().min(1),\n search: z.string().min(1),\n replace: z.string(),\n});\n\nexport const editFileTool: Tool = {\n mutating: true,\n spec: {\n name: \"edit_file\",\n description:\n \"Replace an exact snippet in a file. 'search' must match the existing text verbatim and uniquely.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Workspace-relative file path\" },\n search: { type: \"string\", description: \"Exact text to find (must be unique in the file)\" },\n replace: { type: \"string\", description: \"Text to replace it with\" },\n },\n required: [\"path\", \"search\", \"replace\"],\n },\n },\n async run(rawArgs, ctx) {\n const args = Args.safeParse(rawArgs);\n if (!args.success) {\n return {\n ok: false,\n output:\n \"edit_file needs three arguments: 'path', 'search' (exact text to find), and 'replace'. \" +\n \"Resend the tool call with all three filled in.\",\n };\n }\n\n const abs = resolve(ctx.workspace, args.data.path);\n let content: string;\n try {\n content = await readFile(abs, \"utf8\");\n } catch (err) {\n return { ok: false, output: `Could not read file to edit: ${(err as Error).message}` };\n }\n\n const occurrences = content.split(args.data.search).length - 1;\n if (occurrences === 0) {\n return { ok: false, output: \"The 'search' text was not found. Re-read the file and try an exact snippet.\" };\n }\n if (occurrences > 1) {\n return {\n ok: false,\n output: `The 'search' text matched ${occurrences} times; it must be unique. Include more surrounding context.`,\n };\n }\n\n const updated = content.replace(args.data.search, args.data.replace);\n const decision = await ctx.permissions.authorizeWrite(\n args.data.path,\n `- ${firstLine(args.data.search)}\\n+ ${firstLine(args.data.replace)}`,\n updated,\n );\n if (!decision.allowed) return { ok: false, output: `Edit denied: ${decision.reason}` };\n\n // decision.content is set when the user approved only some hunks in review mode.\n try {\n await writeFile(abs, decision.content ?? updated, \"utf8\");\n return { ok: true, output: `Edited ${args.data.path}.` };\n } catch (err) {\n return { ok: false, output: `Could not write edit: ${(err as Error).message}` };\n }\n },\n};\n\nfunction firstLine(s: string): string {\n return s.split(\"\\n\")[0] ?? \"\";\n}\n","import { readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst Args = z.object({ path: z.string().default(\".\") });\n\nexport const listDirTool: Tool = {\n mutating: false,\n spec: {\n name: \"list_dir\",\n description: \"List files and subdirectories of a workspace directory.\",\n parameters: {\n type: \"object\",\n properties: { path: { type: \"string\", description: \"Workspace-relative directory (default '.')\" } },\n },\n },\n async run(rawArgs, ctx) {\n const args = Args.safeParse(rawArgs);\n const path = args.success ? args.data.path : \".\";\n\n const decision = ctx.permissions.authorizeRead(path === \".\" ? \".\" : path);\n // Listing the workspace root itself is always permitted.\n if (path !== \".\" && !decision.allowed) {\n return { ok: false, output: `List denied: ${decision.reason}` };\n }\n\n try {\n const entries = await readdir(resolve(ctx.workspace, path), { withFileTypes: true });\n const lines = entries\n .map((e) => (e.isDirectory() ? `${e.name}/` : e.name))\n .sort();\n return { ok: true, output: lines.length ? lines.join(\"\\n\") : \"(empty)\" };\n } catch (err) {\n return { ok: false, output: `Could not list directory: ${(err as Error).message}` };\n }\n },\n};\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst Args = z.object({ path: z.string().min(1) });\nconst MAX_CHARS = 60_000;\n\nexport const readFileTool: Tool = {\n mutating: false,\n spec: {\n name: \"read_file\",\n description: \"Read the contents of a file in the workspace.\",\n parameters: {\n type: \"object\",\n properties: { path: { type: \"string\", description: \"Workspace-relative file path\" } },\n required: [\"path\"],\n },\n },\n async run(rawArgs, ctx) {\n const args = Args.safeParse(rawArgs);\n if (!args.success) return { ok: false, output: \"Invalid args: 'path' is required.\" };\n\n const decision = ctx.permissions.authorizeRead(args.data.path);\n if (!decision.allowed) return { ok: false, output: `Read denied: ${decision.reason}` };\n\n try {\n const content = await readFile(resolve(ctx.workspace, args.data.path), \"utf8\");\n const truncated = content.length > MAX_CHARS;\n return {\n ok: true,\n output: (truncated ? content.slice(0, MAX_CHARS) + \"\\n…[truncated]\" : content),\n };\n } catch (err) {\n return { ok: false, output: `Could not read file: ${(err as Error).message}` };\n }\n },\n};\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst execAsync = promisify(exec);\nconst Args = z.object({ command: z.string().min(1) });\nconst MAX_OUTPUT = 20_000;\n\nexport const runCommandTool: Tool = {\n mutating: true,\n spec: {\n name: \"run_command\",\n description: \"Run a shell command in the workspace and return its combined stdout/stderr.\",\n parameters: {\n type: \"object\",\n properties: { command: { type: \"string\", description: \"Shell command to execute\" } },\n required: [\"command\"],\n },\n },\n async run(rawArgs, ctx) {\n const args = Args.safeParse(rawArgs);\n if (!args.success) return { ok: false, output: \"Invalid args: 'command' is required.\" };\n\n const decision = await ctx.permissions.authorizeCommand(args.data.command);\n if (!decision.allowed) return { ok: false, output: `Command denied: ${decision.reason}` };\n\n try {\n const { stdout, stderr } = await execAsync(args.data.command, {\n cwd: ctx.workspace,\n timeout: 120_000,\n maxBuffer: 10 * 1024 * 1024,\n windowsHide: true,\n });\n return { ok: true, output: clamp(`${stdout}${stderr ? `\\n[stderr]\\n${stderr}` : \"\"}`.trim() || \"(no output)\") };\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string; code?: number };\n const body = `${e.stdout ?? \"\"}${e.stderr ?? \"\"}`.trim();\n return {\n ok: false,\n output: clamp(`Command failed (exit ${e.code ?? \"?\"}): ${e.message}\\n${body}`),\n };\n }\n },\n};\n\nfunction clamp(s: string): string {\n return s.length > MAX_OUTPUT ? s.slice(0, MAX_OUTPUT) + \"\\n…[truncated]\" : s;\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { globToRegExp, toPosix } from \"../permissions/allowlist.js\";\nimport type { Tool } from \"./types.js\";\n\nconst Args = z.object({\n query: z.string().min(1),\n path: z.string().optional(),\n glob: z.string().optional(),\n max_results: z.number().int().positive().max(1000).optional(),\n});\n\nconst DEFAULT_MAX_RESULTS = 50;\nconst MAX_OUTPUT = 20_000;\nconst MAX_FILE_BYTES = 2_000_000; // skip very large files\nconst SNIPPET_CHARS = 200;\nconst NUL = String.fromCharCode(0);\n/** Directories never worth walking (large, machine-generated, or VCS internals). */\nconst SKIP_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \".next\", \"coverage\", \".turbo\"]);\n\nexport const searchTool: Tool = {\n mutating: false,\n spec: {\n name: \"search\",\n description:\n \"Search file contents by regular expression across the workspace (like grep/ripgrep). \" +\n \"Returns matches as 'path:line: snippet'. Respects the allow/deny-list and skips \" +\n \"node_modules/.git. Use this to find where a symbol is defined or used instead of \" +\n \"reading files blindly.\",\n parameters: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Regular expression to match against each line\" },\n path: { type: \"string\", description: \"Workspace-relative directory to search in (default '.')\" },\n glob: {\n type: \"string\",\n description: \"Optional glob to limit files, e.g. 'src/**/*.ts'\",\n },\n max_results: {\n type: \"number\",\n description: `Maximum number of matches to return (default ${DEFAULT_MAX_RESULTS})`,\n },\n },\n required: [\"query\"],\n },\n },\n async run(rawArgs, ctx) {\n const parsed = Args.safeParse(rawArgs);\n if (!parsed.success) return { ok: false, output: \"Invalid args: 'query' is required.\" };\n const { query, path = \".\", glob, max_results } = parsed.data;\n\n let regex: RegExp;\n try {\n regex = new RegExp(query);\n } catch (err) {\n return { ok: false, output: `Invalid regular expression: ${(err as Error).message}` };\n }\n\n // The search root may be the workspace itself ('.') or a subdirectory; the\n // subdirectory must pass the read allow-list.\n if (path !== \".\") {\n const decision = ctx.permissions.authorizeRead(path);\n if (!decision.allowed) return { ok: false, output: `Search denied: ${decision.reason}` };\n }\n\n const globRe = glob ? globToRegExp(glob) : undefined;\n const limit = max_results ?? DEFAULT_MAX_RESULTS;\n const root = resolve(ctx.workspace, path);\n const matches: string[] = [];\n let truncated = false;\n\n const walk = async (dir: string): Promise<void> => {\n if (matches.length >= limit) return;\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return; // unreadable directory — skip\n }\n for (const entry of entries) {\n if (matches.length >= limit) return;\n const abs = join(dir, entry.name);\n const rel = toPosix(abs.slice(ctx.workspace.length + 1));\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n await walk(abs);\n continue;\n }\n if (!entry.isFile()) continue;\n if (globRe && !globRe.test(rel)) continue;\n // Content exposure is gated by the same allow/deny-list as read_file.\n if (!ctx.permissions.authorizeRead(rel).allowed) continue;\n\n try {\n const info = await stat(abs);\n if (info.size > MAX_FILE_BYTES) continue;\n const content = await readFile(abs, \"utf8\");\n if (content.includes(NUL)) continue; // looks binary\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n if (matches.length >= limit) {\n truncated = true;\n return;\n }\n if (regex.test(lines[i]!)) {\n const snippet = lines[i]!.trim().slice(0, SNIPPET_CHARS);\n matches.push(`${rel}:${i + 1}: ${snippet}`);\n }\n }\n } catch {\n // unreadable / non-utf8 file — skip\n }\n }\n };\n\n await walk(root);\n\n if (matches.length === 0) {\n return { ok: true, output: `No matches for /${query}/${glob ? ` in ${glob}` : \"\"}.` };\n }\n const header = `${matches.length}${truncated ? \"+\" : \"\"} match(es) for /${query}/:`;\n const body = [header, ...matches].join(\"\\n\");\n return {\n ok: true,\n output: body.length > MAX_OUTPUT ? body.slice(0, MAX_OUTPUT) + \"\\n…[truncated]\" : body,\n };\n },\n};\n","import type { ToolSpec } from \"../providers/types.js\";\nimport type { PermissionEngine } from \"../permissions/modes.js\";\n\nexport interface ToolContext {\n workspace: string;\n permissions: PermissionEngine;\n}\n\nexport interface ToolResult {\n ok: boolean;\n /** Text fed back to the model describing the outcome. */\n output: string;\n}\n\nexport interface Tool {\n spec: ToolSpec;\n /** True if the tool changes the workspace or runs commands (gated by permission mode). */\n mutating: boolean;\n run(args: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult>;\n}\n\n/** Sentinel tool the model calls to signal completion; intercepted by the loop. */\nexport const FINISH_TOOL: ToolSpec = {\n name: \"finish\",\n description: \"Call when the task is fully complete. Provide a short summary of what was done.\",\n parameters: {\n type: \"object\",\n properties: {\n summary: { type: \"string\", description: \"Summary of the work completed\" },\n },\n required: [\"summary\"],\n },\n};\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst Args = z.object({ path: z.string().min(1), content: z.string() });\n\nexport const writeFileTool: Tool = {\n mutating: true,\n spec: {\n name: \"write_file\",\n description: \"Create or overwrite a file with the given content.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Workspace-relative file path\" },\n content: { type: \"string\", description: \"Full file content\" },\n },\n required: [\"path\", \"content\"],\n },\n },\n async run(rawArgs, ctx) {\n const args = Args.safeParse(rawArgs);\n if (!args.success) {\n const got = Object.keys(rawArgs ?? {});\n return {\n ok: false,\n output:\n \"write_file needs two arguments: 'path' (the file path) and 'content' (the complete file text). \" +\n `Received: [${got.join(\", \") || \"none\"}]. Resend the tool call with BOTH arguments filled in, ` +\n \"and keep the file small enough to fit in one message.\",\n };\n }\n\n const preview = previewContent(args.data.content);\n const decision = await ctx.permissions.authorizeWrite(args.data.path, preview, args.data.content);\n if (!decision.allowed) return { ok: false, output: `Write denied: ${decision.reason}` };\n\n // decision.content is set when the user approved only some hunks in review mode.\n const finalContent = decision.content ?? args.data.content;\n try {\n const abs = resolve(ctx.workspace, args.data.path);\n await mkdir(dirname(abs), { recursive: true });\n await writeFile(abs, finalContent, \"utf8\");\n const lines = finalContent.split(\"\\n\").length;\n return { ok: true, output: `Wrote ${args.data.path} (${lines} lines).` };\n } catch (err) {\n return { ok: false, output: `Could not write file: ${(err as Error).message}` };\n }\n },\n};\n\nfunction previewContent(content: string): string {\n const lines = content.split(\"\\n\");\n return lines.length > 40 ? lines.slice(0, 40).join(\"\\n\") + \"\\n…\" : content;\n}\n","import type { ToolSpec } from \"../providers/types.js\";\nimport { editFileTool } from \"./edit-file.js\";\nimport { listDirTool } from \"./list-dir.js\";\nimport { readFileTool } from \"./read-file.js\";\nimport { runCommandTool } from \"./run-command.js\";\nimport { searchTool } from \"./search-file.js\";\nimport { FINISH_TOOL, type Tool } from \"./types.js\";\nimport { writeFileTool } from \"./write-file.js\";\n\n/** All executable tools, keyed by name. `finish` is intercepted by the loop, not run here. */\nexport const TOOLS: Record<string, Tool> = {\n [readFileTool.spec.name]: readFileTool,\n [listDirTool.spec.name]: listDirTool,\n [searchTool.spec.name]: searchTool,\n [writeFileTool.spec.name]: writeFileTool,\n [editFileTool.spec.name]: editFileTool,\n [runCommandTool.spec.name]: runCommandTool,\n};\n\n/** Tool specs advertised to the model, including the `finish` sentinel. */\nexport function toolSpecs(): ToolSpec[] {\n return [...Object.values(TOOLS).map((t) => t.spec), FINISH_TOOL];\n}\n\nexport function getTool(name: string): Tool | undefined {\n return TOOLS[name];\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport type { Provider, ToolCall, ToolSpec } from \"../providers/types.js\";\n\n/**\n * Auto-correction layer. When a tool call fails, the raw error is often too\n * terse for the model to recover from, so it keeps re-issuing the same broken\n * call until the loop stalls. `buildCorrection` turns that failure into an\n * instructive message: it explains the likely cause AND attaches the missing\n * context (e.g. the real file contents for an edit that did not match) so the\n * model can fix its own call on the next step.\n *\n * Strategy is hybrid: deterministic rules handle the common, recognizable\n * failures cheaply; anything unrecognized may escalate to a single \"fixer\" LLM\n * call (provided by the caller) to produce guidance.\n */\n\n/** Escalation hook: a secondary LLM call that diagnoses an unrecognized error. */\nexport type Escalator = (info: {\n call: ToolCall;\n output: string;\n toolSpec?: ToolSpec;\n}) => Promise<string | null>;\n\nexport interface CorrectionDeps {\n workspace: string;\n /** Editable glob allow-list (from the prompt context). */\n allow: string[];\n /** Spec of the tool that failed, used to restate its schema on bad args. */\n toolSpec?: ToolSpec;\n /** The model's response was cut off at the token limit (finishReason length/max_tokens). */\n truncated?: boolean;\n /** Optional LLM fixer, invoked only when no deterministic rule matches. */\n escalate?: Escalator;\n}\n\n/**\n * Guidance for a response that hit the output token limit. The most common\n * real-world cause of a `write_file` failing with only `path` (Issue #25): the\n * model emitted a huge file, got cut off mid tool-call, and `content` never\n * arrived. Telling it to split the file is what actually breaks the loop.\n */\nexport function truncationGuidance(toolName?: string): string {\n const fileHint =\n toolName === \"write_file\" || toolName === \"edit_file\"\n ? \" Write large files in parts: create the file with the first chunk via write_file, then append the rest with edit_file in the next steps.\"\n : \"\";\n return [\n \"AUTO-CORRECTION — your previous response was cut off at the output token limit,\",\n \"so the tool call was incomplete (e.g. 'content' missing or partial).\",\n \"Do NOT resend the same large output — produce a smaller one this time.\" + fileHint,\n ].join(\"\\n\");\n}\n\n/**\n * Build corrective guidance to append to a failed tool result, or `null` when\n * there is nothing useful to add. Never replaces the original error — the loop\n * appends this so the model sees both.\n */\nexport async function buildCorrection(\n call: ToolCall,\n output: string,\n deps: CorrectionDeps,\n): Promise<string | null> {\n const deterministic = await deterministicCorrection(call, output, deps);\n if (deterministic) return deterministic;\n if (deps.escalate) return deps.escalate({ call, output, toolSpec: deps.toolSpec });\n return null;\n}\n\nasync function deterministicCorrection(\n call: ToolCall,\n output: string,\n deps: CorrectionDeps,\n): Promise<string | null> {\n // Truncation takes priority: a failed call after a cut-off response is almost\n // always the cause, and restating the schema (below) would just loop.\n if (deps.truncated) return truncationGuidance(call.name);\n\n const path = typeof call.arguments.path === \"string\" ? call.arguments.path : undefined;\n\n // edit_file: the 'search' snippet was not found in the file.\n if (call.name === \"edit_file\" && /was not found/i.test(output) && path) {\n const search = typeof call.arguments.search === \"string\" ? call.arguments.search : \"\";\n const snippet = await snippetNearSearch(deps.workspace, path, search);\n if (snippet) {\n return [\n \"AUTO-CORRECTION — the 'search' text does not exist verbatim in the file.\",\n \"Here is the file's actual content (line-numbered). Copy the 'search' value EXACTLY\",\n \"from these lines (including indentation and whitespace), then resend edit_file:\",\n \"\",\n snippet,\n ].join(\"\\n\");\n }\n }\n\n // edit_file: the 'search' snippet matched more than once.\n if (call.name === \"edit_file\" && /matched \\d+ times/i.test(output) && path) {\n const search = typeof call.arguments.search === \"string\" ? call.arguments.search : \"\";\n const lines = await occurrenceLines(deps.workspace, path, search);\n if (lines.length > 0) {\n return [\n \"AUTO-CORRECTION — the 'search' text is not unique; it appears at lines \" +\n `${lines.join(\", \")}.`,\n \"Add more surrounding lines to 'search' so it matches exactly one location, then resend.\",\n ].join(\"\\n\");\n }\n }\n\n // Missing file or parent directory (ENOENT) on read or write.\n if (/ENOENT|no such file/i.test(output) && path) {\n const listing = await listNearest(deps.workspace, path);\n if (listing) {\n return [\n \"AUTO-CORRECTION — that path does not exist. Nearby existing entries:\",\n \"\",\n listing,\n \"\",\n \"Use list_dir to confirm the correct path, or create the parent directory first.\",\n ].join(\"\\n\");\n }\n }\n\n // Permission denied: the path is outside the editable allow-list.\n if (/denied|not allowed/i.test(output)) {\n return [\n \"AUTO-CORRECTION — this action was blocked by the permission policy.\",\n `Editable paths (glob allow-list): ${deps.allow.join(\", \") || \"(none)\"}.`,\n \"Target a path inside the allow-list, or stop and report that the change is out of scope.\",\n ].join(\"\\n\");\n }\n\n // Invalid / missing arguments: restate the exact schema of the tool.\n if (deps.toolSpec && /needs .* arguments|Invalid|required|Resend the tool call/i.test(output)) {\n return [\n \"AUTO-CORRECTION — the call had missing or invalid arguments. Expected schema:\",\n \"\",\n formatSchema(deps.toolSpec),\n \"\",\n \"Resend the tool call with every required argument filled in.\",\n ].join(\"\\n\");\n }\n\n return null;\n}\n\n/** A single LLM fixer call. Returns plain corrective guidance, or null. */\nexport function makeLLMEscalator(provider: Provider): Escalator {\n return async ({ call, output, toolSpec }) => {\n const prompt = [\n \"A tool call just failed. Diagnose WHY in one or two sentences, then give a concrete,\",\n \"actionable instruction for how to correct the call. Do not apologize and do not call any tool.\",\n \"\",\n `Tool: ${call.name}`,\n `Arguments: ${JSON.stringify(call.arguments)}`,\n `Error: ${output}`,\n toolSpec ? `Schema: ${JSON.stringify(toolSpec.parameters)}` : \"\",\n ].join(\"\\n\");\n try {\n const res = await provider.chat({\n messages: [\n { role: \"system\", content: \"You are a debugging assistant for an autonomous coding agent.\" },\n { role: \"user\", content: prompt },\n ],\n params: { maxTokens: 400 },\n });\n const text = res.content.trim();\n return text ? `AUTO-CORRECTION (diagnosis):\\n${text}` : null;\n } catch {\n return null;\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// helpers\n\nasync function readWorkspaceFile(workspace: string, path: string): Promise<string | null> {\n try {\n return await readFile(resolve(workspace, path), \"utf8\");\n } catch {\n return null;\n }\n}\n\n/** Number lines 1-based and keep a window around `center` (0-based line index). */\nfunction numberedWindow(content: string, center: number, radius: number): string {\n const lines = content.split(\"\\n\");\n const start = Math.max(0, center - radius);\n const end = Math.min(lines.length, center + radius + 1);\n const width = String(end).length;\n return lines\n .slice(start, end)\n .map((line, i) => `${String(start + i + 1).padStart(width, \" \")} | ${line}`)\n .join(\"\\n\");\n}\n\n/** Show file content around the line that best matches the failed 'search'. */\nasync function snippetNearSearch(\n workspace: string,\n path: string,\n search: string,\n): Promise<string | null> {\n const content = await readWorkspaceFile(workspace, path);\n if (content === null) return null;\n const lines = content.split(\"\\n\");\n const anchor = bestAnchorLine(lines, search);\n return numberedWindow(content, anchor >= 0 ? anchor : 0, 6);\n}\n\n/** Pick the file line that shares the most words with the search's first real line. */\nfunction bestAnchorLine(lines: string[], search: string): number {\n const target = search.split(\"\\n\").map((l) => l.trim()).find((l) => l.length > 0);\n if (!target) return -1;\n const targetWords = new Set(tokens(target));\n let best = -1;\n let bestScore = 0;\n lines.forEach((line, i) => {\n if (line.includes(target)) {\n if (bestScore < Number.MAX_SAFE_INTEGER) {\n best = i;\n bestScore = Number.MAX_SAFE_INTEGER;\n }\n return;\n }\n const score = tokens(line).filter((w) => targetWords.has(w)).length;\n if (score > bestScore) {\n best = i;\n bestScore = score;\n }\n });\n return best;\n}\n\nfunction tokens(s: string): string[] {\n return s.split(/\\W+/).filter((w) => w.length > 0);\n}\n\n/** 1-based line numbers where `search` starts inside the file. */\nasync function occurrenceLines(workspace: string, path: string, search: string): Promise<number[]> {\n const content = await readWorkspaceFile(workspace, path);\n if (content === null || search.length === 0) return [];\n const out: number[] = [];\n let from = 0;\n for (;;) {\n const idx = content.indexOf(search, from);\n if (idx === -1) break;\n out.push(content.slice(0, idx).split(\"\\n\").length);\n from = idx + search.length;\n }\n return out;\n}\n\n/** List the contents of the nearest existing ancestor directory of `path`. */\nasync function listNearest(workspace: string, path: string): Promise<string | null> {\n let dir = dirname(resolve(workspace, path));\n for (let i = 0; i < 8; i++) {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n const rel = dir === resolve(workspace) ? \".\" : dir;\n const names = entries.slice(0, 40).map((e) => (e.isDirectory() ? `${e.name}/` : e.name));\n return `${rel}:\\n ${names.join(\" \") || \"(empty)\"}`;\n } catch {\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n }\n return null;\n}\n\n/** Render a tool's JSON-schema parameters as a readable required/optional list. */\nfunction formatSchema(spec: ToolSpec): string {\n const props =\n (spec.parameters as { properties?: Record<string, { type?: string; description?: string }> }).properties ?? {};\n const required = new Set((spec.parameters as { required?: string[] }).required ?? []);\n const lines = Object.entries(props).map(\n ([name, v]) =>\n ` - ${name} (${v.type ?? \"any\"}, ${required.has(name) ? \"required\" : \"optional\"})` +\n (v.description ? `: ${v.description}` : \"\"),\n );\n return lines.join(\"\\n\") || \" (no parameters)\";\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/** Where project operating instructions live, in priority order (workspace-relative). */\nconst INSTRUCTION_FILES = [join(\".poly\", \"agents.md\"), \"AGENTS.md\"];\n\n/** Hard cap so a large instructions file can't blow up the context window. */\nconst MAX_CHARS = 8000;\n\n/**\n * Load project-specific operating instructions to inject into the agent's system\n * prompt — the polypus equivalent of an `AGENTS.md`/`CLAUDE.md`. Reads the first\n * file that exists from {@link INSTRUCTION_FILES}, trims it, and caps the length.\n * Returns `undefined` when no instructions file is present (the common case for\n * throwaway swarm worktrees, which don't carry the gitignored `.poly/`).\n */\nexport async function loadProjectInstructions(workspace: string): Promise<string | undefined> {\n for (const rel of INSTRUCTION_FILES) {\n try {\n const raw = (await readFile(join(workspace, rel), \"utf8\")).trim();\n if (!raw) continue;\n return raw.length > MAX_CHARS ? raw.slice(0, MAX_CHARS) + \"\\n…(truncated)\" : raw;\n } catch {\n /* file missing/unreadable — try the next candidate */\n }\n }\n return undefined;\n}\n","import type { ResolvedAgent } from \"../providers/registry.js\";\nimport type { Message } from \"../providers/types.js\";\n\n/** Rough token estimate when the provider does not report usage (~4 chars/token). */\nexport function estimateTokens(messages: Message[]): number {\n let chars = 0;\n for (const m of messages) chars += m.content.length;\n return Math.ceil(chars / 4);\n}\n\n/** How many of the most recent messages to keep verbatim after compaction. */\nconst RECENT_KEEP = 8;\n/** Minimum number of old messages worth summarizing (below this, skip). */\nconst MIN_TO_COMPACT = 4;\n/** Cap the text handed to the summarizer so the summary call itself stays small. */\nconst MAX_SUMMARY_INPUT = 40_000;\n\n/**\n * Pick a cut index so the kept tail never starts mid tool-round: not on a tool\n * result, and not right after an assistant message that still has pending tool\n * calls (which would orphan those results for native providers).\n */\nexport function findSafeCut(messages: Message[], desiredKeep = RECENT_KEEP): number {\n let cut = Math.max(1, messages.length - desiredKeep);\n while (\n cut < messages.length &&\n (messages[cut]!.role === \"tool\" ||\n (messages[cut - 1]?.role === \"assistant\" && (messages[cut - 1]!.toolCalls?.length ?? 0) > 0))\n ) {\n cut++;\n }\n return cut;\n}\n\nfunction serialize(messages: Message[]): string {\n const text = messages\n .map((m) => {\n const tools = m.toolCalls?.length ? ` [called: ${m.toolCalls.map((c) => c.name).join(\", \")}]` : \"\";\n return `${m.role}${tools}: ${m.content}`;\n })\n .join(\"\\n\\n\");\n return text.length > MAX_SUMMARY_INPUT ? text.slice(-MAX_SUMMARY_INPUT) : text;\n}\n\n/**\n * Summarize the older middle of a conversation into a single message, preserving\n * the system prompt and the most recent messages. Returns the original array\n * (unchanged) when there is too little to compact or the cut is unsafe.\n */\nexport async function compactHistory(\n messages: Message[],\n agent: ResolvedAgent,\n signal?: AbortSignal,\n): Promise<Message[]> {\n if (messages.length === 0) return messages;\n const system = messages[0]!.role === \"system\" ? messages[0]! : undefined;\n const startIdx = system ? 1 : 0;\n\n const cut = findSafeCut(messages);\n if (cut >= messages.length) return messages; // no safe tail to keep\n const middle = messages.slice(startIdx, cut);\n if (middle.length < MIN_TO_COMPACT) return messages;\n const tail = messages.slice(cut);\n\n const summary = await agent.provider.chat({\n messages: [\n {\n role: \"system\",\n content:\n \"You compress a coding agent's conversation so it can continue with less context. \" +\n \"Summarize the messages below into a concise but information-dense brief that preserves: \" +\n \"the original task and goal, key decisions, files created/edited and why, important command/test \" +\n \"outputs, and any remaining TODOs or open problems. Use terse bullet points. Do not invent details.\",\n },\n { role: \"user\", content: serialize(middle) },\n ],\n signal,\n });\n\n const summaryMessage: Message = {\n role: \"user\",\n content: `[Summary of earlier conversation, compacted to save context]\\n${summary.content.trim()}`,\n };\n\n return system ? [system, summaryMessage, ...tail] : [summaryMessage, ...tail];\n}\n","import { exec } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport type { ToolCall } from \"../providers/types.js\";\n\nconst execAsync = promisify(exec);\nconst HOOK_TIMEOUT = 120_000;\n\nconst HooksSchema = z.object({\n /** Shell command run after a successful write_file. `{path}` is substituted. */\n afterWrite: z.string().optional(),\n /** Shell command run after a successful edit_file. `{path}` is substituted. */\n afterEdit: z.string().optional(),\n /** Shell command run after any successful mutating tool. `{tool}`/`{path}` substituted. */\n afterTool: z.string().optional(),\n /** Block run_command when the command contains any of these substrings. */\n beforeCommand: z.object({ deny: z.array(z.string()).default([]) }).optional(),\n});\n\nexport type HooksConfig = z.infer<typeof HooksSchema>;\n\n/** Load `.poly/hooks.json` for a workspace, or undefined if absent/invalid. */\nexport async function loadHooks(workspace: string): Promise<HooksConfig | undefined> {\n try {\n const raw = await readFile(join(workspace, \".poly\", \"hooks.json\"), \"utf8\");\n const parsed = HooksSchema.safeParse(JSON.parse(raw));\n return parsed.success ? parsed.data : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Decide whether a command is blocked by the user's beforeCommand deny-list. */\nexport function screenCommandHook(hooks: HooksConfig | undefined, command: string): { blocked: boolean; reason?: string } {\n const deny = hooks?.beforeCommand?.deny ?? [];\n for (const needle of deny) {\n if (needle && command.includes(needle)) {\n return { blocked: true, reason: `matches deny rule \"${needle}\"` };\n }\n }\n return { blocked: false };\n}\n\nfunction substitute(template: string, call: ToolCall): string {\n const path = typeof call.arguments.path === \"string\" ? call.arguments.path : \"\";\n return template.replace(/\\{path\\}/g, path).replace(/\\{tool\\}/g, call.name);\n}\n\n/**\n * Run post-tool hooks for a successful mutating tool call. Returns a short note\n * to append to the tool result (e.g. \"↪ hook afterWrite ok\"), or undefined.\n */\nexport async function runAfterHook(\n hooks: HooksConfig | undefined,\n call: ToolCall,\n workspace: string,\n): Promise<string | undefined> {\n if (!hooks) return undefined;\n const commands: { label: string; cmd: string }[] = [];\n if (call.name === \"write_file\" && hooks.afterWrite) commands.push({ label: \"afterWrite\", cmd: hooks.afterWrite });\n if (call.name === \"edit_file\" && hooks.afterEdit) commands.push({ label: \"afterEdit\", cmd: hooks.afterEdit });\n if (hooks.afterTool) commands.push({ label: \"afterTool\", cmd: hooks.afterTool });\n if (commands.length === 0) return undefined;\n\n const notes: string[] = [];\n for (const { label, cmd } of commands) {\n const resolved = substitute(cmd, call);\n try {\n await execAsync(resolved, { cwd: workspace, timeout: HOOK_TIMEOUT, windowsHide: true });\n notes.push(`↪ hook ${label} ok`);\n } catch (err) {\n notes.push(`↪ hook ${label} failed: ${(err as Error).message.split(\"\\n\")[0]}`);\n }\n }\n return notes.join(\"\\n\");\n}\n","import { makeDriver } from \"../protocol/emulated.js\";\nimport type { PromptContext } from \"../protocol/system-prompt.js\";\nimport type { PermissionEngine } from \"../permissions/modes.js\";\nimport type { ResolvedAgent } from \"../providers/registry.js\";\nimport type { ChatParams, Message, ToolCall } from \"../providers/types.js\";\nimport { getTool, toolSpecs } from \"../tools/registry.js\";\nimport type { Tool, ToolResult } from \"../tools/types.js\";\nimport { buildCorrection, makeLLMEscalator, truncationGuidance } from \"./correction.js\";\nimport { loadProjectInstructions } from \"./project-context.js\";\nimport { compactHistory, estimateTokens } from \"./compaction.js\";\nimport { runAfterHook, screenCommandHook, type HooksConfig } from \"./hooks.js\";\n\nexport interface Usage {\n promptTokens: number;\n completionTokens: number;\n}\n\nexport interface AgentEvents {\n onAssistantText?(text: string): void;\n /** Fired for each streamed text chunk (native mode only) before onAssistantText. */\n onAssistantDelta?(text: string): void;\n onToolCall?(call: ToolCall): void;\n onToolResult?(call: ToolCall, result: ToolResult): void;\n onReprompt?(attempt: number): void;\n /** Fired when auto-correction enriches a failed tool result with guidance. */\n onCorrection?(call: ToolCall, guidance: string): void;\n onStep?(step: number): void;\n /** Cumulative token usage so far this run. */\n onUsage?(usage: Usage): void;\n /** Fired when old history is summarized to free up context (token counts). */\n onCompaction?(before: number, after: number): void;\n}\n\nexport interface RunOptions {\n task: string;\n workspace: string;\n agent: ResolvedAgent;\n permissions: PermissionEngine;\n promptContext: PromptContext;\n params?: ChatParams;\n maxSteps?: number;\n maxReprompts?: number;\n /** Stop after this many consecutive identical tool failures (default 3). */\n maxToolRetries?: number;\n /** Enrich failed tool results with corrective guidance so the model can self-heal (default true). */\n autoCorrect?: boolean;\n /** Summarize old history when the prompt grows past this many tokens (0 disables). */\n compactThresholdTokens?: number;\n /** User-declared custom tools (from `.poly/tools/*.json`) available to the agent. */\n extraTools?: Tool[];\n /** Pre/post-tool hooks (from `.poly/hooks.json`). */\n hooks?: HooksConfig;\n /** Abort the run (e.g. user pressed ESC). */\n signal?: AbortSignal;\n events?: AgentEvents;\n /** Seed history (used to continue an interactive session). */\n history?: Message[];\n}\n\nexport type RunReason = \"finished\" | \"reply\" | \"stalled\" | \"maxsteps\" | \"cancelled\";\n\nexport interface RunResult {\n finished: boolean;\n /** Why the turn ended: completed, a plain conversational reply, a stall, or step limit. */\n reason: RunReason;\n summary?: string;\n steps: number;\n messages: Message[];\n usage: Usage;\n}\n\n/**\n * Heuristic: does a no-tool-call response look like the model refusing or merely\n * promising action (a stall worth nudging), as opposed to normal conversation?\n */\nfunction looksLikeStall(text: string): boolean {\n const lc = text.toLowerCase();\n const markers = [\n \"i can't\", \"i cannot\", \"i can not\", \"i'm unable\", \"i am unable\", \"unable to\",\n \"cannot create\", \"can't create\", \"cannot write\", \"can't write\", \"not allowed\",\n \"i'll create\", \"i will create\", \"let me create\", \"i'll write\", \"i will write\",\n \"não posso\", \"nao posso\", \"não consigo\", \"nao consigo\", \"não tenho permiss\",\n \"nao tenho permiss\", \"não é possível\", \"nao e possivel\", \"vou criar\", \"irei criar\",\n \"vou escrever\", \"deixe-me\", \"deixa eu\",\n ];\n return markers.some((m) => lc.includes(m));\n}\n\n/** Drive one task to completion (or until limits are hit). */\nexport async function runAgent(opts: RunOptions): Promise<RunResult> {\n const { agent, permissions, events } = opts;\n const maxSteps = opts.maxSteps ?? 30;\n const maxReprompts = opts.maxReprompts ?? 3;\n\n // Merge user-declared custom tools with the built-ins (finish stays last).\n const extra = opts.extraTools ?? [];\n const extraByName = new Map(extra.map((tl) => [tl.spec.name, tl]));\n const baseSpecs = toolSpecs();\n const finishSpec = baseSpecs[baseSpecs.length - 1]!;\n const allSpecs = [...baseSpecs.slice(0, -1), ...extra.map((tl) => tl.spec), finishSpec];\n const resolveTool = (name: string): Tool | undefined => extraByName.get(name) ?? getTool(name);\n\n const driver = makeDriver(agent.toolMode, allSpecs);\n const ctx = { workspace: opts.workspace, permissions };\n\n const seeding = !(opts.history && opts.history.length > 0);\n // On a fresh conversation, auto-load project operating instructions\n // (.poly/agents.md / AGENTS.md) into the system prompt unless the caller\n // already supplied them. Continued sessions keep the original system message.\n const promptContext =\n seeding && opts.promptContext.projectInstructions === undefined\n ? { ...opts.promptContext, projectInstructions: await loadProjectInstructions(opts.workspace) }\n : opts.promptContext;\n\n const messages: Message[] = seeding\n ? [\n { role: \"system\", content: driver.systemPrompt(promptContext) },\n { role: \"user\", content: opts.task },\n ]\n : [...opts.history!, { role: \"user\", content: opts.task }];\n\n let consecutiveNoTool = 0;\n let lastFailSig = \"\";\n let failStreak = 0;\n const maxToolRetries = opts.maxToolRetries ?? 3;\n const autoCorrect = opts.autoCorrect ?? true;\n const usage: Usage = { promptTokens: 0, completionTokens: 0 };\n const compactThreshold = opts.compactThresholdTokens ?? 0;\n let lastPromptTokens = 0;\n\n for (let step = 1; step <= maxSteps; step++) {\n if (opts.signal?.aborted) return { finished: false, reason: \"cancelled\", steps: step - 1, messages, usage };\n events?.onStep?.(step);\n\n // Auto-compact: when the prompt grows past the threshold, summarize old\n // history into one message, preserving the system prompt and recent turns.\n if (compactThreshold > 0) {\n const current = lastPromptTokens || estimateTokens(messages);\n if (current >= compactThreshold) {\n const compacted = await compactHistory(messages, agent, opts.signal);\n if (compacted.length < messages.length) {\n messages.splice(0, messages.length, ...compacted);\n lastPromptTokens = estimateTokens(messages);\n events?.onCompaction?.(current, lastPromptTokens);\n }\n }\n }\n\n // Stream live tokens only in native mode (emulated would leak raw XML) and\n // only when a consumer is listening (e.g. not in --json mode).\n const wantDelta = driver.kind === \"native\" && typeof events?.onAssistantDelta === \"function\";\n\n let response;\n try {\n response = await agent.provider.chat({\n messages,\n tools: driver.providerTools(),\n params: opts.params,\n signal: opts.signal,\n onDelta: wantDelta ? (chunk) => events!.onAssistantDelta!(chunk) : undefined,\n });\n } catch (err) {\n if (opts.signal?.aborted) return { finished: false, reason: \"cancelled\", steps: step, messages, usage };\n throw err;\n }\n usage.promptTokens += response.usage?.promptTokens ?? 0;\n usage.completionTokens += response.usage?.completionTokens ?? 0;\n lastPromptTokens = response.usage?.promptTokens ?? estimateTokens(messages);\n events?.onUsage?.(usage);\n const { toolCalls, text } = driver.parse(response);\n messages.push(driver.assistantMessage(response, toolCalls));\n if (text) events?.onAssistantText?.(text);\n\n // The model's output was cut off at the token limit — its tool call (if any)\n // is incomplete. Surfaced as guidance so it can recover by splitting output.\n const truncated = response.finishReason === \"length\" || response.finishReason === \"max_tokens\";\n\n if (toolCalls.length === 0) {\n // Cut off before producing any tool call (e.g. a half-written file dump).\n if (truncated && autoCorrect) {\n if (consecutiveNoTool < maxReprompts) {\n consecutiveNoTool++;\n const guidance = truncationGuidance();\n events?.onCorrection?.({ id: \"trunc\", name: \"\", arguments: {} }, guidance);\n messages.push({ role: \"user\", content: guidance });\n continue;\n }\n return { finished: false, reason: \"stalled\", steps: step, messages, usage };\n }\n const stalled = text.trim().length === 0 || looksLikeStall(text);\n if (stalled) {\n // The \"yes, you can act\" reinforcement loop for models that refuse/stall.\n if (consecutiveNoTool < maxReprompts) {\n consecutiveNoTool++;\n events?.onReprompt?.(consecutiveNoTool);\n messages.push(driver.repromptMessage());\n continue;\n }\n return { finished: false, reason: \"stalled\", steps: step, messages, usage };\n }\n // A normal conversational reply — hand control back to the user, no nagging.\n return { finished: false, reason: \"reply\", steps: step, messages, usage };\n }\n consecutiveNoTool = 0;\n\n for (const call of toolCalls) {\n if (opts.signal?.aborted) return { finished: false, reason: \"cancelled\", steps: step, messages, usage };\n events?.onToolCall?.(call);\n\n if (call.name === \"finish\") {\n const summary = String(call.arguments.summary ?? \"\").trim();\n return { finished: true, reason: \"finished\", summary, steps: step, messages, usage };\n }\n\n const tool = resolveTool(call.name);\n // Pre-tool hook: the user's beforeCommand deny-list can block a command.\n const hookScreen =\n call.name === \"run_command\"\n ? screenCommandHook(opts.hooks, String(call.arguments.command ?? \"\"))\n : { blocked: false as const };\n\n let result: ToolResult;\n if (hookScreen.blocked) {\n result = { ok: false, output: `Command blocked by hook: ${hookScreen.reason}` };\n } else if (tool) {\n result = await tool.run(call.arguments, ctx);\n // Post-tool hook: e.g. format a file after a successful write/edit.\n if (result.ok) {\n const note = await runAfterHook(opts.hooks, call, opts.workspace);\n if (note) result = { ...result, output: `${result.output}\\n${note}` };\n }\n } else {\n result = { ok: false, output: `Unknown tool \"${call.name}\". Available: ${allSpecs.map((t) => t.name).join(\", \")}` };\n }\n\n events?.onToolResult?.(call, result);\n\n const sig = `${call.name}:${JSON.stringify(call.arguments)}`;\n let resultText = result.output;\n // Auto-correction: on failure, enrich the raw error with its likely cause\n // and the missing context so the model can fix its own call instead of\n // looping on it until the stall guard trips.\n if (!result.ok && autoCorrect) {\n const guidance = await buildCorrection(call, result.output, {\n workspace: opts.workspace,\n allow: opts.promptContext.allow,\n toolSpec: tool?.spec,\n truncated,\n // Only spend a fixer-LLM call once the model has already repeated a\n // failing call — the first failure gets deterministic help for free.\n escalate: sig === lastFailSig ? makeLLMEscalator(agent.provider) : undefined,\n });\n if (guidance) {\n resultText = `${result.output}\\n\\n${guidance}`;\n events?.onCorrection?.(call, guidance);\n }\n } else if (result.ok && truncated && autoCorrect) {\n // The call \"succeeded\" but the response was cut off, so the written file\n // is likely incomplete — flag it so the model can finish/repair it.\n const guidance = truncationGuidance(call.name);\n resultText = `${result.output}\\n\\n${guidance}`;\n events?.onCorrection?.(call, guidance);\n }\n messages.push(driver.toolResultMessage(call, resultText));\n\n // Break out of a loop where the same tool call keeps failing identically.\n if (result.ok) {\n failStreak = 0;\n lastFailSig = \"\";\n } else {\n failStreak = sig === lastFailSig ? failStreak + 1 : 1;\n lastFailSig = sig;\n if (failStreak >= maxToolRetries) {\n return { finished: false, reason: \"stalled\", steps: step, messages, usage };\n }\n }\n }\n }\n\n return { finished: false, reason: \"maxsteps\", steps: maxSteps, messages, usage };\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { checkPath, type PathPolicy } from \"../permissions/allowlist.js\";\nimport { t } from \"../i18n/index.js\";\n\n/** Max characters injected per referenced file (truncated beyond this). */\nconst MAX_FILE_CHARS = 10_000;\n\n/**\n * Matches `@path` mentions: an `@` at the start or after whitespace, followed by\n * a path-like token (letters, digits, `. / _ -`). A trailing `/` marks a directory.\n */\nconst MENTION_RE = /(?:^|\\s)@([\\w./-]+)/g;\n\nexport interface MentionResult {\n /** The task text with a \"Referenced files\" block appended (unchanged if no valid mentions). */\n task: string;\n /** Workspace-relative paths that were resolved and injected. */\n injected: string[];\n}\n\n/**\n * Resolve `@file` / `@dir/` mentions in a task and append their contents/listing\n * as explicit context. Paths are resolved against the allow-list; missing or\n * denied ones are skipped (noted inline). `@symbol` lookups are out of scope\n * until a repository index exists.\n */\nexport async function resolveMentions(task: string, policy: PathPolicy): Promise<MentionResult> {\n const tokens = [...task.matchAll(MENTION_RE)].map((m) => m[1]!);\n const unique = [...new Set(tokens)];\n if (unique.length === 0) return { task, injected: [] };\n\n const blocks: string[] = [];\n const injected: string[] = [];\n\n for (const token of unique) {\n const decision = checkPath(policy, token);\n if (!decision.allowed) {\n blocks.push(`## @${token}\\n${t(\"mentions.notFound\", { path: token })}`);\n continue;\n }\n const abs = resolve(policy.workspace, token);\n try {\n const info = await stat(abs);\n if (info.isDirectory()) {\n const entries = await readdir(abs, { withFileTypes: true });\n const listing = entries\n .map((e) => (e.isDirectory() ? `${e.name}/` : e.name))\n .sort()\n .join(\"\\n\");\n blocks.push(`## ${t(\"mentions.dirHeader\", { path: decision.rel })}\\n${listing || \"(empty)\"}`);\n injected.push(decision.rel);\n } else {\n const raw = await readFile(abs, \"utf8\");\n const content = raw.length > MAX_FILE_CHARS ? raw.slice(0, MAX_FILE_CHARS) + \"\\n…[truncated]\" : raw;\n blocks.push(`## @${decision.rel}\\n\\`\\`\\`\\n${content}\\n\\`\\`\\``);\n injected.push(decision.rel);\n }\n } catch {\n blocks.push(`## @${token}\\n${t(\"mentions.notFound\", { path: token })}`);\n }\n }\n\n if (injected.length === 0) return { task, injected: [] };\n\n const augmented = `${task}\\n\\n--- ${t(\"mentions.injectedHeader\")} ---\\n\\n${blocks.join(\"\\n\\n\")}`;\n return { task: augmented, injected };\n}\n","import { exec } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst execAsync = promisify(exec);\nconst MAX_OUTPUT = 8_000;\n\nexport interface CheckResult {\n command: string;\n ok: boolean;\n output: string;\n}\n\n/** npm scripts we treat as verification checks, in the order they should run. */\nconst CHECK_SCRIPTS = [\"typecheck\", \"build\", \"test\"] as const;\n\n/**\n * Detect verification commands for a workspace. Today this reads `package.json`\n * scripts and picks the standard checks (`typecheck`, `build`, `test`). Returns\n * an empty array when there is nothing sensible to run.\n */\nexport async function detectChecks(workspace: string): Promise<string[]> {\n try {\n const raw = await readFile(resolve(workspace, \"package.json\"), \"utf8\");\n const scripts = (JSON.parse(raw) as { scripts?: Record<string, string> }).scripts ?? {};\n return CHECK_SCRIPTS.filter((s) => typeof scripts[s] === \"string\").map((s) => `npm run ${s}`);\n } catch {\n return [];\n }\n}\n\n/** Run the given commands in the workspace, capturing pass/fail and output. */\nexport async function runChecks(workspace: string, commands: string[]): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n for (const command of commands) {\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: workspace,\n timeout: 300_000,\n maxBuffer: 10 * 1024 * 1024,\n windowsHide: true,\n });\n results.push({ command, ok: true, output: clamp(`${stdout}${stderr ? `\\n${stderr}` : \"\"}`.trim()) });\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string };\n const body = `${e.stdout ?? \"\"}${e.stderr ?? \"\"}`.trim() || e.message;\n results.push({ command, ok: false, output: clamp(body) });\n }\n }\n return results;\n}\n\n/** Build the corrective message fed back to the agent when checks fail. */\nexport function buildVerifyFeedback(failed: CheckResult[]): string {\n const blocks = failed\n .map((f) => `$ ${f.command}\\n${f.output}`)\n .join(\"\\n\\n\");\n return [\n \"Verification failed. The following checks did not pass:\",\n \"\",\n blocks,\n \"\",\n \"Fix the underlying problem in the code (do not disable or skip the checks), then call `finish`.\",\n ].join(\"\\n\");\n}\n\nfunction clamp(s: string): string {\n return s.length > MAX_OUTPUT ? s.slice(-MAX_OUTPUT) : s;\n}\n","import { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { AgentConfig } from \"../config/schema.js\";\nimport { configDir, resolveSecret } from \"../config/store.js\";\nimport { listOpenRouterModels, type OpenRouterModel } from \"../providers/openrouter.js\";\nimport type { Usage } from \"./loop.js\";\n\n/** USD per 1M tokens, prompt and completion. */\nexport interface ModelPricing {\n promptPrice: number;\n completionPrice: number;\n}\n\nlet catalogCache: Promise<OpenRouterModel[]> | undefined;\n\n/**\n * Resolve per-token pricing for an agent's model. Currently only OpenRouter\n * advertises a public price catalog; other providers return undefined (cost is\n * simply not estimated). Network/parse failures degrade to undefined.\n */\nexport async function resolveModelPricing(agent: AgentConfig): Promise<ModelPricing | undefined> {\n if (agent.provider !== \"openrouter\") return undefined;\n try {\n catalogCache ??= listOpenRouterModels(resolveSecret(agent.apiKey));\n const models = await catalogCache;\n const m = models.find((x) => x.id === agent.model);\n if (!m || m.promptPrice < 0 || m.completionPrice < 0) return undefined;\n return { promptPrice: m.promptPrice, completionPrice: m.completionPrice };\n } catch {\n return undefined;\n }\n}\n\n/** Estimate the USD cost of a token usage given per-1M pricing. */\nexport function estimateCost(usage: Usage, pricing: ModelPricing): number {\n return (\n (usage.promptTokens / 1_000_000) * pricing.promptPrice +\n (usage.completionTokens / 1_000_000) * pricing.completionPrice\n );\n}\n\n/** Format a USD amount compactly, with extra precision for sub-cent costs. */\nexport function fmtUsd(n: number): string {\n if (n <= 0) return \"US$0.00\";\n if (n < 0.01) return `US$${n.toFixed(4)}`;\n return `US$${n.toFixed(2)}`;\n}\n\nexport function usagePath(): string {\n return join(configDir(), \"usage.jsonl\");\n}\n\nexport interface UsageEntry {\n ts: string;\n agent: string;\n provider: string;\n model: string;\n promptTokens: number;\n completionTokens: number;\n costUsd: number;\n}\n\n/** Append a usage record to ~/.polypus/usage.jsonl (best-effort; never throws). */\nexport async function recordUsage(entry: UsageEntry): Promise<void> {\n try {\n await mkdir(configDir(), { recursive: true });\n await appendFile(usagePath(), JSON.stringify(entry) + \"\\n\", \"utf8\");\n } catch {\n /* analytics are best-effort — ignore write failures */\n }\n}\n\nexport interface UsageBucket {\n date: string;\n promptTokens: number;\n completionTokens: number;\n costUsd: number;\n runs: number;\n}\n\n/** Aggregate the usage log by calendar day, plus a grand total. */\nexport async function aggregateUsage(): Promise<{ days: UsageBucket[]; total: UsageBucket }> {\n let text = \"\";\n try {\n text = await readFile(usagePath(), \"utf8\");\n } catch {\n return { days: [], total: emptyBucket(\"total\") };\n }\n const byDay = new Map<string, UsageBucket>();\n const total = emptyBucket(\"total\");\n for (const line of text.split(\"\\n\")) {\n if (!line.trim()) continue;\n let e: UsageEntry;\n try {\n e = JSON.parse(line) as UsageEntry;\n } catch {\n continue;\n }\n const date = (e.ts ?? \"\").slice(0, 10) || \"unknown\";\n const bucket = byDay.get(date) ?? emptyBucket(date);\n accumulate(bucket, e);\n byDay.set(date, bucket);\n accumulate(total, e);\n }\n const days = [...byDay.values()].sort((a, b) => a.date.localeCompare(b.date));\n return { days, total };\n}\n\nfunction emptyBucket(date: string): UsageBucket {\n return { date, promptTokens: 0, completionTokens: 0, costUsd: 0, runs: 0 };\n}\n\nfunction accumulate(bucket: UsageBucket, e: UsageEntry): void {\n bucket.promptTokens += e.promptTokens ?? 0;\n bucket.completionTokens += e.completionTokens ?? 0;\n bucket.costUsd += e.costUsd ?? 0;\n bucket.runs += 1;\n}\n","/** Discovery + filtering for OpenRouter's public model catalog. */\n\nconst MODELS_URL = \"https://openrouter.ai/api/v1/models\";\n\nexport interface OpenRouterModel {\n id: string;\n name: string;\n /** USD per 1M prompt tokens. */\n promptPrice: number;\n /** USD per 1M completion tokens. */\n completionPrice: number;\n contextLength: number;\n /** True when the model advertises native tool/function-calling. */\n supportsTools: boolean;\n /** True when both prompt and completion are free. */\n free: boolean;\n}\n\ninterface RawModel {\n id?: string;\n name?: string;\n context_length?: number;\n pricing?: { prompt?: string; completion?: string };\n supported_parameters?: string[];\n}\n\n/**\n * Fetch the OpenRouter model catalog. The endpoint is public; an API key is\n * optional. Throws on network/HTTP errors so callers can show a message.\n */\nexport async function listOpenRouterModels(\n apiKey?: string,\n timeoutMs = 8000,\n): Promise<OpenRouterModel[]> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(MODELS_URL, {\n signal: controller.signal,\n headers: apiKey ? { authorization: `Bearer ${apiKey}` } : {},\n });\n if (!res.ok) throw new Error(`OpenRouter ${res.status}: ${await res.text().catch(() => \"\")}`);\n const data = (await res.json()) as { data?: RawModel[] };\n return (data.data ?? []).map(normalize).filter((m) => m.id.length > 0);\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction normalize(m: RawModel): OpenRouterModel {\n const promptPrice = toPerMillion(m.pricing?.prompt);\n const completionPrice = toPerMillion(m.pricing?.completion);\n return {\n id: m.id ?? \"\",\n name: m.name ?? m.id ?? \"\",\n promptPrice,\n completionPrice,\n contextLength: m.context_length ?? 0,\n supportsTools: (m.supported_parameters ?? []).includes(\"tools\"),\n free: promptPrice === 0 && completionPrice === 0,\n };\n}\n\n/** OpenRouter prices are USD per token (string). Convert to USD per 1M tokens. */\nfunction toPerMillion(price: string | undefined): number {\n const n = Number(price ?? \"0\");\n return Number.isFinite(n) ? n * 1_000_000 : 0;\n}\n\nexport type ModelSort = \"price\" | \"price-desc\" | \"context\" | \"name\";\n\nexport interface ModelFilter {\n search?: string;\n /** \"any\" | \"tools\" (only with tools) | \"no-tools\" (only without). */\n tools?: \"any\" | \"tools\" | \"no-tools\";\n freeOnly?: boolean;\n /** Max prompt price in USD per 1M tokens. */\n maxPrice?: number;\n sort?: ModelSort;\n}\n\n/** Apply filters + sorting to a model list (pure; safe to call repeatedly). */\nexport function filterModels(models: OpenRouterModel[], f: ModelFilter): OpenRouterModel[] {\n const term = f.search?.trim().toLowerCase();\n let out = models.filter((m) => {\n if (term && !m.id.toLowerCase().includes(term) && !m.name.toLowerCase().includes(term)) {\n return false;\n }\n if (f.tools === \"tools\" && !m.supportsTools) return false;\n if (f.tools === \"no-tools\" && m.supportsTools) return false;\n if (f.freeOnly && !m.free) return false;\n // Negative price = variable/\"auto\" router pricing → excluded when capping price.\n if (f.maxPrice !== undefined && (m.promptPrice < 0 || m.promptPrice > f.maxPrice)) return false;\n return true;\n });\n\n // Variable-priced models sort to the end of price-based ordering.\n const key = (m: OpenRouterModel) => (m.promptPrice < 0 ? Number.POSITIVE_INFINITY : m.promptPrice);\n const sort = f.sort ?? \"price\";\n out = out.sort((a, b) => {\n switch (sort) {\n case \"price-desc\":\n return key(b) - key(a);\n case \"context\":\n return b.contextLength - a.contextLength;\n case \"name\":\n return a.id.localeCompare(b.id);\n default:\n return key(a) - key(b);\n }\n });\n return out;\n}\n\n/** Format a price (USD per 1M tokens) compactly, e.g. \"$3\", \"$0.15\", \"free\". */\nexport function fmtPrice(perMillion: number): string {\n if (perMillion < 0) return \"var\";\n if (perMillion === 0) return \"free\";\n if (perMillion < 1) return `$${perMillion.toFixed(2)}`;\n if (perMillion < 100) return `$${perMillion.toFixed(perMillion % 1 ? 1 : 0)}`;\n return `$${Math.round(perMillion)}`;\n}\n\n/** Format a context length, e.g. \"200k\", \"1M\", \"1.5M\". */\nexport function fmtContext(n: number): string {\n if (n >= 1_000_000) return `${Math.round(n / 100_000) / 10}M`;\n if (n >= 1000) return `${Math.round(n / 1000)}k`;\n return String(n);\n}\n","import { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PermissionMode } from \"../config/schema.js\";\nimport { configDir } from \"../config/store.js\";\nimport { redactSecrets } from \"../permissions/policy.js\";\nimport type { Message } from \"../providers/types.js\";\n\nexport interface SessionRecord {\n id: string;\n /** ISO timestamp of the last update. */\n updatedAt: string;\n /** Short title (the first user task), for listings. */\n title: string;\n agentName: string;\n mode: PermissionMode;\n messages: Message[];\n}\n\nexport interface SessionSummary {\n id: string;\n updatedAt: string;\n title: string;\n agentName: string;\n mode: PermissionMode;\n messageCount: number;\n}\n\nexport function sessionsDir(): string {\n return join(configDir(), \"sessions\");\n}\n\n/** Create a sortable, filesystem-safe session id from the current time. */\nexport function newSessionId(): string {\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const rand = Math.random().toString(36).slice(2, 6);\n return `${stamp}-${rand}`;\n}\n\nfunction sessionPath(id: string): string {\n return join(sessionsDir(), `${id}.json`);\n}\n\n/** Persist a session, redacting obvious secrets from message contents. */\nexport async function saveSession(record: SessionRecord): Promise<void> {\n await mkdir(sessionsDir(), { recursive: true });\n const safe: SessionRecord = {\n ...record,\n messages: record.messages.map((m) => ({ ...m, content: redactSecrets(m.content) })),\n };\n await writeFile(sessionPath(record.id), JSON.stringify(safe, null, 2) + \"\\n\", \"utf8\");\n}\n\n/** Load a session by id, or undefined if it does not exist / is unreadable. */\nexport async function loadSession(id: string): Promise<SessionRecord | undefined> {\n try {\n return JSON.parse(await readFile(sessionPath(id), \"utf8\")) as SessionRecord;\n } catch {\n return undefined;\n }\n}\n\n/** List saved sessions, most recently updated first. */\nexport async function listSessions(): Promise<SessionSummary[]> {\n let files: string[];\n try {\n files = (await readdir(sessionsDir())).filter((f) => f.endsWith(\".json\"));\n } catch {\n return [];\n }\n const summaries: SessionSummary[] = [];\n for (const f of files) {\n try {\n const r = JSON.parse(await readFile(join(sessionsDir(), f), \"utf8\")) as SessionRecord;\n summaries.push({\n id: r.id,\n updatedAt: r.updatedAt,\n title: r.title,\n agentName: r.agentName,\n mode: r.mode,\n messageCount: r.messages?.length ?? 0,\n });\n } catch {\n /* skip corrupt session files */\n }\n }\n return summaries.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n}\n\n/** The most recently updated session, if any (used by `run --continue`). */\nexport async function latestSession(): Promise<SessionRecord | undefined> {\n const [latest] = await listSessions();\n return latest ? loadSession(latest.id) : undefined;\n}\n\n/** Derive a short title from the first user message of a history. */\nexport function deriveTitle(messages: Message[]): string {\n const firstUser = messages.find((m) => m.role === \"user\");\n const text = (firstUser?.content ?? \"\").replace(/\\s+/g, \" \").trim();\n return text.length > 60 ? text.slice(0, 60) + \"…\" : text || \"(untitled)\";\n}\n","import { exec } from \"node:child_process\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_OUTPUT = 20_000;\n\nconst CustomToolSchema = z.object({\n name: z.string().min(1).regex(/^[a-z][a-z0-9_]*$/i, \"tool name must be alphanumeric/underscore\"),\n description: z.string().min(1),\n /** JSON-schema object for the tool parameters (advertised to the model). */\n parameters: z.record(z.unknown()).optional(),\n /** Shell command template; `{argName}` placeholders are filled from the call arguments. */\n command: z.string().min(1),\n});\n\nexport type CustomToolDef = z.infer<typeof CustomToolSchema>;\n\n/** Build an executable Tool from a declarative definition. Runs through the permission engine. */\nexport function makeCommandTool(def: CustomToolDef): Tool {\n return {\n mutating: true,\n spec: {\n name: def.name,\n description: def.description,\n parameters: (def.parameters as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n },\n async run(rawArgs, ctx) {\n const command = fillTemplate(def.command, rawArgs);\n const decision = await ctx.permissions.authorizeCommand(command);\n if (!decision.allowed) return { ok: false, output: `Command denied: ${decision.reason}` };\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: ctx.workspace,\n timeout: 120_000,\n maxBuffer: 10 * 1024 * 1024,\n windowsHide: true,\n });\n return { ok: true, output: clamp(`${stdout}${stderr ? `\\n[stderr]\\n${stderr}` : \"\"}`.trim() || \"(no output)\") };\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string; code?: number };\n return {\n ok: false,\n output: clamp(`Command failed (exit ${e.code ?? \"?\"}): ${e.message}\\n${e.stdout ?? \"\"}${e.stderr ?? \"\"}`),\n };\n }\n },\n };\n}\n\n/** Load custom tools declared in `.poly/tools/*.json`. Invalid files are skipped. */\nexport async function loadCustomTools(workspace: string): Promise<Tool[]> {\n let files: string[];\n try {\n files = (await readdir(join(workspace, \".poly\", \"tools\"))).filter((f) => f.endsWith(\".json\"));\n } catch {\n return [];\n }\n const tools: Tool[] = [];\n for (const f of files) {\n try {\n const raw = await readFile(join(workspace, \".poly\", \"tools\", f), \"utf8\");\n const parsed = CustomToolSchema.safeParse(JSON.parse(raw));\n if (parsed.success) tools.push(makeCommandTool(parsed.data));\n } catch {\n /* skip malformed tool file */\n }\n }\n return tools;\n}\n\n/** Replace `{arg}` placeholders with the matching string argument values. */\nfunction fillTemplate(template: string, args: Record<string, unknown>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n const v = args[key];\n return v === undefined || v === null ? \"\" : String(v);\n });\n}\n\nfunction clamp(s: string): string {\n return s.length > MAX_OUTPUT ? s.slice(0, MAX_OUTPUT) + \"\\n…[truncated]\" : s;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../tools/types.js\";\nimport { McpClient } from \"./client.js\";\n\nconst ServerSchema = z.object({\n command: z.string().min(1),\n args: z.array(z.string()).default([]),\n env: z.record(z.string()).default({}),\n});\nconst McpConfigSchema = z.object({\n mcpServers: z.record(ServerSchema).default({}),\n});\n\nexport type McpServerConfig = z.infer<typeof ServerSchema>;\n\nconst MAX_OUTPUT = 20_000;\n\nexport interface LoadedMcp {\n /** External tools, namespaced `mcp__<server>__<tool>`, ready for the agent loop. */\n tools: Tool[];\n /** Server names that connected. */\n servers: string[];\n /** Shut down every spawned MCP server. */\n close: () => Promise<void>;\n}\n\n/**\n * Load and connect the MCP servers declared in `.poly/mcp.json`, returning their\n * tools wrapped as Polypus tools. Servers that fail to start are skipped (never\n * throws). Tool names are namespaced to avoid clashes with built-ins/each other.\n */\nexport async function loadMcpTools(workspace: string): Promise<LoadedMcp> {\n let raw: string;\n try {\n raw = await readFile(join(workspace, \".poly\", \"mcp.json\"), \"utf8\");\n } catch {\n return { tools: [], servers: [], close: async () => {} };\n }\n const parsed = McpConfigSchema.safeParse(safeJson(raw));\n if (!parsed.success) return { tools: [], servers: [], close: async () => {} };\n\n const clients: McpClient[] = [];\n const tools: Tool[] = [];\n const servers: string[] = [];\n\n for (const [name, cfg] of Object.entries(parsed.data.mcpServers)) {\n const client = new McpClient(cfg.command, cfg.args, cfg.env);\n try {\n await client.initialize();\n const defs = await client.listTools();\n for (const def of defs) tools.push(wrapTool(name, client, def.name, def.description, def.inputSchema));\n clients.push(client);\n servers.push(name);\n } catch {\n await client.close().catch(() => {});\n }\n }\n\n return {\n tools,\n servers,\n close: async () => {\n await Promise.all(clients.map((c) => c.close().catch(() => {})));\n },\n };\n}\n\nfunction wrapTool(\n server: string,\n client: McpClient,\n toolName: string,\n description: string | undefined,\n inputSchema: Record<string, unknown> | undefined,\n): Tool {\n return {\n mutating: true,\n spec: {\n name: `mcp__${server}__${toolName}`,\n description: `[MCP:${server}] ${description ?? toolName}`,\n parameters: inputSchema ?? { type: \"object\", properties: {} },\n },\n async run(args, ctx) {\n // External MCP tools can have side effects; disable them in read-only plan mode.\n if (ctx.permissions.mode === \"plan\") {\n return { ok: false, output: \"plan mode: external MCP tools are disabled\" };\n }\n const { ok, text } = await client.callTool(toolName, args);\n return { ok, output: text.length > MAX_OUTPUT ? text.slice(0, MAX_OUTPUT) + \"\\n…[truncated]\" : text };\n },\n };\n}\n\nfunction safeJson(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return {};\n }\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\n\n/** A tool advertised by an MCP server. */\nexport interface McpToolDef {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (err: Error) => void;\n}\n\nconst PROTOCOL_VERSION = \"2024-11-05\";\n\n/**\n * Minimal MCP client over the stdio transport: newline-delimited JSON-RPC 2.0.\n * Supports the bits Polypus needs — `initialize`, `tools/list`, `tools/call` —\n * with no external dependency. Spawn → initialize() → listTools()/callTool() → close().\n */\nexport class McpClient {\n private proc?: ChildProcessWithoutNullStreams;\n private nextId = 1;\n private readonly pending = new Map<number, PendingRequest>();\n private buffer = \"\";\n private closed = false;\n\n constructor(\n private readonly command: string,\n private readonly args: string[] = [],\n private readonly env: Record<string, string> = {},\n ) {}\n\n /** Spawn the server and perform the initialize handshake. */\n async initialize(timeoutMs = 20_000): Promise<void> {\n this.proc = spawn(this.command, this.args, {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, ...this.env },\n windowsHide: true,\n }) as ChildProcessWithoutNullStreams;\n\n this.proc.stdout.setEncoding(\"utf8\");\n this.proc.stdout.on(\"data\", (chunk: string) => this.onData(chunk));\n this.proc.on(\"exit\", () => this.failAll(new Error(\"MCP server process exited\")));\n this.proc.on(\"error\", (err) => this.failAll(err));\n\n await this.request(\n \"initialize\",\n {\n protocolVersion: PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: { name: \"polypus\", version: \"1\" },\n },\n timeoutMs,\n );\n // Per the spec, tell the server we're ready (notification — no response).\n this.notify(\"notifications/initialized\");\n }\n\n /** List the tools the server exposes. */\n async listTools(): Promise<McpToolDef[]> {\n const res = (await this.request(\"tools/list\", {})) as { tools?: McpToolDef[] };\n return res.tools ?? [];\n }\n\n /** Call a tool and return its textual output. */\n async callTool(name: string, args: Record<string, unknown>): Promise<{ ok: boolean; text: string }> {\n try {\n const res = (await this.request(\"tools/call\", { name, arguments: args })) as {\n content?: Array<{ type: string; text?: string }>;\n isError?: boolean;\n };\n const text = (res.content ?? [])\n .map((c) => (c.type === \"text\" ? (c.text ?? \"\") : `[${c.type}]`))\n .join(\"\\n\")\n .trim();\n return { ok: !res.isError, text: text || \"(no output)\" };\n } catch (err) {\n return { ok: false, text: `MCP call failed: ${(err as Error).message}` };\n }\n }\n\n /** Terminate the server process. */\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.failAll(new Error(\"MCP client closed\"));\n this.proc?.kill();\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n let nl: number;\n while ((nl = this.buffer.indexOf(\"\\n\")) !== -1) {\n const line = this.buffer.slice(0, nl).trim();\n this.buffer = this.buffer.slice(nl + 1);\n if (!line) continue;\n let msg: { id?: number; result?: unknown; error?: { message?: string } };\n try {\n msg = JSON.parse(line);\n } catch {\n continue; // ignore non-JSON lines (some servers log to stdout)\n }\n if (typeof msg.id !== \"number\") continue; // notification / unrelated\n const p = this.pending.get(msg.id);\n if (!p) continue;\n this.pending.delete(msg.id);\n if (msg.error) p.reject(new Error(msg.error.message ?? \"MCP error\"));\n else p.resolve(msg.result);\n }\n }\n\n private request(method: string, params: unknown, timeoutMs = 20_000): Promise<unknown> {\n if (!this.proc) return Promise.reject(new Error(\"MCP client not initialized\"));\n const id = this.nextId++;\n const payload = JSON.stringify({ jsonrpc: \"2.0\", id, method, params }) + \"\\n\";\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`MCP request \"${method}\" timed out`));\n }, timeoutMs);\n this.pending.set(id, {\n resolve: (v) => {\n clearTimeout(timer);\n resolve(v);\n },\n reject: (e) => {\n clearTimeout(timer);\n reject(e);\n },\n });\n this.proc!.stdin.write(payload);\n });\n }\n\n private notify(method: string, params: unknown = {}): void {\n this.proc?.stdin.write(JSON.stringify({ jsonrpc: \"2.0\", method, params }) + \"\\n\");\n }\n\n private failAll(err: Error): void {\n for (const [, p] of this.pending) p.reject(err);\n this.pending.clear();\n }\n}\n","import type { AgentEvents, RunResult } from \"../../core/agent/loop.js\";\n\nexport interface JsonEvent {\n type: \"step\" | \"assistant\" | \"tool_call\" | \"tool_result\" | \"correction\" | \"reprompt\" | \"compaction\";\n [key: string]: unknown;\n}\n\nexport interface JsonCollector {\n /** AgentEvents that record a structured log instead of rendering to a TTY. */\n events: AgentEvents;\n /** Build the final JSON payload from the run result plus the collected log. */\n build(result: RunResult): {\n result: {\n reason: RunResult[\"reason\"];\n finished: boolean;\n steps: number;\n summary?: string;\n filesChanged: string[];\n usage: RunResult[\"usage\"];\n };\n events: JsonEvent[];\n };\n}\n\nconst OUTPUT_PREVIEW = 500;\n\n/**\n * Collect agent events into a stable JSON contract for headless/CI use\n * (`polypus run \"<task>\" --json`). `filesChanged` is derived from successful\n * `write_file`/`edit_file` calls.\n */\nexport function createJsonCollector(): JsonCollector {\n const log: JsonEvent[] = [];\n const filesChanged = new Set<string>();\n\n const events: AgentEvents = {\n onStep(step) {\n log.push({ type: \"step\", step });\n },\n onAssistantText(text) {\n if (text.trim()) log.push({ type: \"assistant\", text });\n },\n onToolCall(call) {\n log.push({ type: \"tool_call\", name: call.name, arguments: call.arguments });\n },\n onToolResult(call, result) {\n log.push({\n type: \"tool_result\",\n name: call.name,\n ok: result.ok,\n output: result.output.slice(0, OUTPUT_PREVIEW),\n });\n if (result.ok && (call.name === \"write_file\" || call.name === \"edit_file\")) {\n const path = call.arguments.path;\n if (typeof path === \"string\") filesChanged.add(path);\n }\n },\n onCorrection(call) {\n log.push({ type: \"correction\", name: call.name });\n },\n onReprompt(attempt) {\n log.push({ type: \"reprompt\", attempt });\n },\n onCompaction(before, after) {\n log.push({ type: \"compaction\", before, after });\n },\n onUsage() {\n /* usage is summarised in the final result, not per-event */\n },\n };\n\n return {\n events,\n build(result) {\n return {\n result: {\n reason: result.reason,\n finished: result.finished,\n steps: result.steps,\n summary: result.summary,\n filesChanged: [...filesChanged],\n usage: result.usage,\n },\n events: log,\n };\n },\n };\n}\n","import pc from \"picocolors\";\nimport type { SessionState } from \"../cli/commands/run.js\";\nimport type { PermissionMode, PolypusConfig } from \"../core/config/schema.js\";\nimport { findAgent, loadConfig, saveConfig } from \"../core/config/store.js\";\nimport { addAgentInteractive } from \"./wizard.js\";\nimport { listSessions, loadSession } from \"../core/agent/session-store.js\";\nimport { t } from \"../core/i18n/index.js\";\nimport { promptLabel } from \"./banner.js\";\nimport { readLine } from \"./line-reader.js\";\n\nexport interface ReplContext {\n session: SessionState;\n /** Run a task with the currently active agent. */\n runTask(task: string): Promise<void>;\n /** Run a task as a swarm across the configured agents (parallel worktrees). */\n runSwarm(task: string): Promise<void>;\n /** Current in-memory config. */\n getConfig(): PolypusConfig;\n /** Re-read config from disk (after add/remove). */\n reload(): Promise<void>;\n}\n\n/**\n * Interactive session loop. A fresh readline is opened only to read each line\n * and closed before any work runs — tasks (review-mode confirmations) and the\n * /add wizard use @clack/prompts, which needs sole control of stdin. Keeping a\n * persistent readline open across those would corrupt stdin and drop the REPL.\n */\nexport async function startRepl(ctx: ReplContext): Promise<void> {\n for (;;) {\n const line = await readLine(promptLabel(ctx.session.mode));\n if (line === null) break; // EOF / Ctrl+D\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n if (!trimmed.startsWith(\"/\")) {\n await ctx.runTask(trimmed);\n continue;\n }\n\n const [cmd = \"\", ...rest] = trimmed.slice(1).split(/\\s+/);\n const arg = rest.join(\" \").trim();\n\n if (cmd === \"exit\" || cmd === \"quit\") break;\n\n if (cmd === \"add\") {\n const name = await addAgentInteractive().catch((e) => {\n console.log(pc.red(`✗ ${(e as Error).message}`));\n return undefined;\n });\n await ctx.reload();\n if (name) {\n ctx.session.agentName = name;\n console.log(pc.green(t(\"repl.switchedTo\", { name })));\n }\n continue;\n }\n\n await handleCommand(cmd, arg, ctx);\n }\n}\n\nasync function handleCommand(cmd: string, arg: string, ctx: ReplContext): Promise<void> {\n const { session } = ctx;\n\n switch (cmd) {\n case \"help\":\n console.log(t(\"repl.help\"));\n return;\n\n case \"plan\":\n case \"review\":\n case \"bypass\":\n session.mode = cmd as PermissionMode;\n console.log(pc.dim(t(\"repl.modeChanged\", { mode: cmd })));\n return;\n\n case \"allow\":\n if (arg) {\n session.allow = [...session.allow, arg];\n console.log(pc.dim(t(\"repl.allowAdded\", { glob: arg })));\n } else {\n console.log(pc.dim(t(\"repl.allowShow\", { mode: session.mode, allow: session.allow.join(\", \") })));\n }\n return;\n\n case \"reset\":\n session.history = [];\n console.log(pc.dim(t(\"repl.historyCleared\")));\n return;\n\n case \"sessions\": {\n const all = await listSessions();\n if (all.length === 0) {\n console.log(pc.yellow(t(\"sessions.empty\")));\n return;\n }\n console.log(pc.bold(t(\"sessions.header\")));\n for (const s of all) {\n console.log(` ${pc.cyan(s.id)} ${pc.dim(`[${s.messageCount} msgs]`)} ${s.title}`);\n }\n return;\n }\n\n case \"resume\": {\n if (!arg) {\n console.log(pc.yellow(t(\"repl.needName\", { usage: \"/resume <id>\" })));\n return;\n }\n const record = await loadSession(arg);\n if (!record) {\n console.log(pc.red(t(\"sessions.notFound\", { id: arg })));\n return;\n }\n session.id = record.id;\n session.title = record.title;\n session.agentName = record.agentName;\n session.mode = record.mode;\n session.history = record.messages;\n console.log(pc.green(t(\"sessions.resumed\", { id: record.id, n: record.messages.length })));\n return;\n }\n\n case \"swarm\": {\n if (!arg) {\n console.log(pc.yellow(t(\"repl.needName\", { usage: \"/swarm <task>\" })));\n return;\n }\n try {\n await ctx.runSwarm(arg);\n } catch (e) {\n console.log(pc.red(`✗ ${(e as Error).message}`));\n }\n return;\n }\n\n case \"agents\":\n printAgents(ctx.getConfig(), session.agentName);\n return;\n\n case \"agent\": {\n if (!arg) {\n console.log(pc.yellow(t(\"repl.needName\", { usage: \"/agent <name>\" })));\n return;\n }\n if (!findAgent(ctx.getConfig(), arg)) {\n console.log(pc.red(t(\"agent.notFound\", { name: arg })));\n return;\n }\n session.agentName = arg;\n console.log(pc.green(t(\"repl.agentSwitched\", { name: arg })));\n return;\n }\n\n case \"remove\": {\n if (!arg) {\n console.log(pc.yellow(t(\"repl.needName\", { usage: \"/remove <name>\" })));\n return;\n }\n await removeAgent(arg, ctx);\n return;\n }\n\n default:\n console.log(pc.yellow(t(\"repl.unknown\", { cmd })));\n }\n}\n\nfunction printAgents(config: PolypusConfig, activeName: string): void {\n if (config.agents.length === 0) {\n console.log(pc.yellow(t(\"agent.none\")));\n return;\n }\n console.log(pc.bold(t(\"agent.listHeader\")));\n for (const a of config.agents) {\n const active = a.name === activeName;\n console.log(\n ` ${active ? pc.green(\"●\") : pc.dim(\"○\")} ${pc.bold(a.name)} ` +\n pc.dim(`(${a.provider} · ${a.model} · ${a.toolMode})`) +\n (config.defaultAgent === a.name ? pc.dim(` [${t(\"common.default\")}]`) : \"\"),\n );\n }\n}\n\nasync function removeAgent(name: string, ctx: ReplContext): Promise<void> {\n const config = await loadConfig();\n if (!findAgent(config, name)) {\n console.log(pc.red(t(\"agent.notFound\", { name })));\n return;\n }\n config.agents = config.agents.filter((a) => a.name !== name);\n if (config.defaultAgent === name) config.defaultAgent = config.agents[0]?.name;\n await saveConfig(config);\n await ctx.reload();\n console.log(pc.green(t(\"agent.removed\", { name })));\n\n // If the active agent was removed, fall back to another one.\n if (ctx.session.agentName === name) {\n const next = config.defaultAgent ?? config.agents[0]?.name;\n if (next) {\n ctx.session.agentName = next;\n console.log(pc.dim(t(\"repl.switchedTo\", { name: next })));\n } else {\n console.log(pc.yellow(t(\"repl.noAgentsLeft\")));\n }\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { AgentConfig, Locale, PermissionMode, ProviderKind, ToolMode } from \"../core/config/schema.js\";\nimport { configPath, loadConfig, saveConfig } from \"../core/config/store.js\";\nimport {\n DEFAULT_BASE_URL,\n REQUIRES_API_KEY,\n SUGGESTED_KEY_ENV,\n} from \"../core/providers/defaults.js\";\nimport { listOllamaModels } from \"../core/providers/ollama.js\";\nimport {\n filterModels,\n fmtContext,\n fmtPrice,\n listOpenRouterModels,\n type ModelSort,\n} from \"../core/providers/openrouter.js\";\nimport { LOCALE_NAMES, LOCALES, setLocale, t } from \"../core/i18n/index.js\";\n\nfunction bail(value: unknown): void {\n if (p.isCancel(value)) {\n p.cancel(t(\"wizard.cancelled\"));\n process.exit(0);\n }\n}\n\n/** Interactive onboarding: pick a language, configure agents, permissions, and a default. */\nexport async function runWizard(): Promise<void> {\n const config = await loadConfig();\n\n // Language first, so the rest of the wizard speaks the user's language.\n const locale = await p.select({\n message: \"Interface language / Idioma da interface\",\n options: LOCALES.map((l) => ({ value: l, label: LOCALE_NAMES[l] })),\n initialValue: config.locale,\n });\n bail(locale);\n config.locale = Locale.parse(locale);\n setLocale(config.locale);\n\n p.intro(pc.bgCyan(pc.black(t(\"wizard.title\"))));\n p.note(t(\"wizard.intro\"), t(\"wizard.welcome\"));\n\n for (;;) {\n const agent = await promptAgent(config.agents.map((a) => a.name));\n config.agents.push(agent);\n\n const again = await p.confirm({ message: t(\"wizard.addAnother\"), initialValue: false });\n bail(again);\n if (!again) break;\n }\n\n if (config.agents.length > 1) {\n const def = await p.select({\n message: t(\"wizard.defaultAgent\"),\n options: config.agents.map((a) => ({ value: a.name, label: a.name })),\n });\n bail(def);\n config.defaultAgent = def as string;\n } else {\n config.defaultAgent = config.agents[0]?.name;\n }\n\n const mode = await p.select({\n message: t(\"wizard.permMode\"),\n options: [\n { value: \"review\", label: t(\"wizard.permReview\") },\n { value: \"plan\", label: t(\"wizard.permPlan\") },\n { value: \"bypass\", label: t(\"wizard.permBypass\") },\n ],\n initialValue: \"review\",\n });\n bail(mode);\n config.permissions.mode = PermissionMode.parse(mode);\n\n const allow = await p.text({\n message: t(\"wizard.allowPaths\"),\n initialValue: config.permissions.allow.join(\", \"),\n placeholder: \"**/*\",\n });\n bail(allow);\n config.permissions.allow = String(allow)\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n await saveConfig(config);\n p.outro(pc.green(t(\"wizard.saved\", { n: config.agents.length, path: configPath() })));\n console.log(pc.dim(t(\"wizard.next\")));\n}\n\n/**\n * Interactively add a single agent and persist it (used by the REPL `/add`).\n * Returns the new agent's name, or undefined if cancelled.\n */\nexport async function addAgentInteractive(): Promise<string | undefined> {\n const config = await loadConfig();\n const agent = await promptAgent(config.agents.map((a) => a.name));\n config.agents.push(agent);\n if (!config.defaultAgent) config.defaultAgent = agent.name;\n await saveConfig(config);\n return agent.name;\n}\n\nasync function promptAgent(existingNames: string[]): Promise<AgentConfig> {\n const provider = await p.select({\n message: t(\"wizard.provider\"),\n options: [\n { value: \"openrouter\", label: t(\"wizard.providerOpenrouter\") },\n { value: \"ollama\", label: t(\"wizard.providerOllama\") },\n { value: \"openai-compatible\", label: t(\"wizard.providerCompatible\") },\n { value: \"anthropic\", label: t(\"wizard.providerAnthropic\") },\n ],\n });\n bail(provider);\n const providerKind = ProviderKind.parse(provider);\n\n const name = await p.text({\n message: t(\"wizard.agentName\"),\n placeholder: providerKind,\n validate: (v) => {\n if (!v.trim()) return t(\"wizard.required\");\n if (existingNames.includes(v.trim())) return t(\"wizard.nameTaken\");\n return undefined;\n },\n });\n bail(name);\n\n const model = await promptModel(providerKind);\n\n let baseUrl = DEFAULT_BASE_URL[providerKind];\n if (providerKind === \"openai-compatible\") {\n const b = await p.text({\n message: t(\"wizard.baseUrl\"),\n placeholder: \"https://my-gateway.example.com/v1\",\n validate: (v) => (v.trim() ? undefined : t(\"wizard.baseUrlRequired\")),\n });\n bail(b);\n baseUrl = String(b).trim();\n }\n\n const apiKey = await promptApiKey(providerKind);\n\n const toolMode = await p.select({\n message: t(\"wizard.toolMode\"),\n options: [\n { value: \"auto\", label: t(\"wizard.toolAuto\") },\n { value: \"native\", label: t(\"wizard.toolNative\") },\n { value: \"emulated\", label: t(\"wizard.toolEmulated\") },\n ],\n initialValue: \"auto\",\n });\n bail(toolMode);\n\n return AgentConfig.parse({\n name: String(name).trim(),\n provider: providerKind,\n model: String(model).trim(),\n baseUrl,\n apiKey,\n toolMode: ToolMode.parse(toolMode),\n });\n}\n\nconst OTHER = \"__other__\";\nconst REFILTER = \"__refilter__\";\nconst MANUAL = \"__manual__\";\n\n/** Prompt for a model id. For Ollama, detect installed models and offer a picker. */\nasync function promptModel(provider: ProviderKind): Promise<string> {\n if (provider === \"openrouter\") {\n const picked = await browseOpenRouter();\n if (picked) return picked;\n }\n\n if (provider === \"ollama\") {\n const spin = p.spinner();\n spin.start(t(\"wizard.ollamaDetecting\"));\n const models = await listOllamaModels();\n spin.stop(models.length ? t(\"wizard.ollamaFound\", { n: models.length }) : t(\"wizard.ollamaNone\"));\n\n if (models.length > 0) {\n const choice = await p.select({\n message: t(\"wizard.ollamaPick\"),\n options: [\n ...models.map((m) => ({ value: m, label: m })),\n { value: OTHER, label: t(\"wizard.ollamaOther\") },\n ],\n });\n bail(choice);\n if (choice !== OTHER) return choice as string;\n }\n }\n\n const placeholder =\n provider === \"openrouter\"\n ? \"anthropic/claude-3.5-sonnet\"\n : provider === \"ollama\"\n ? \"llama3.1:8b\"\n : provider === \"anthropic\"\n ? \"claude-3-5-sonnet-latest\"\n : \"gpt-4o-mini\";\n\n const model = await p.text({\n message: t(\"wizard.modelId\"),\n placeholder,\n validate: (v) => (v.trim() ? undefined : t(\"wizard.required\")),\n });\n bail(model);\n return String(model).trim();\n}\n\n/**\n * Interactive OpenRouter model browser: fetch the catalog, then loop over\n * search + filters + sort, showing a rich picker. Returns the chosen id, or\n * undefined to fall back to manual text entry.\n */\nasync function browseOpenRouter(): Promise<string | undefined> {\n const spin = p.spinner();\n spin.start(t(\"models.fetching\"));\n let all;\n try {\n all = await listOpenRouterModels(process.env.OPENROUTER_API_KEY);\n spin.stop(t(\"models.shown\", { shown: all.length, total: all.length }));\n } catch {\n spin.stop(t(\"wizard.orError\"));\n return undefined;\n }\n\n for (;;) {\n const search = await p.text({ message: t(\"wizard.orSearch\"), placeholder: \"claude, qwen, gpt…\" });\n bail(search);\n\n const flags = await p.multiselect({\n message: t(\"wizard.orFilters\"),\n options: [\n { value: \"tools\", label: t(\"wizard.orToolsOnly\") },\n { value: \"free\", label: t(\"wizard.orFreeOnly\") },\n ],\n initialValues: [\"tools\"],\n required: false,\n });\n bail(flags);\n\n const sort = await p.select({\n message: t(\"wizard.orSort\"),\n initialValue: \"price\",\n options: [\n { value: \"price\", label: t(\"wizard.orSortPrice\") },\n { value: \"price-desc\", label: t(\"wizard.orSortPriceDesc\") },\n { value: \"context\", label: t(\"wizard.orSortContext\") },\n { value: \"name\", label: t(\"wizard.orSortName\") },\n ],\n });\n bail(sort);\n\n const flagList = flags as string[];\n const results = filterModels(all, {\n search: String(search ?? \"\"),\n tools: flagList.includes(\"tools\") ? \"tools\" : \"any\",\n freeOnly: flagList.includes(\"free\"),\n sort: sort as ModelSort,\n });\n\n if (results.length === 0) {\n p.note(t(\"wizard.orNone\"));\n continue;\n }\n\n const choice = await p.select({\n message: t(\"wizard.orPick\", { n: results.length }),\n maxItems: 12,\n options: [\n ...results.slice(0, 40).map((m) => ({\n value: m.id,\n label: m.id,\n hint: `${fmtPrice(m.promptPrice)}/${fmtPrice(m.completionPrice)}${m.supportsTools ? \" · 🛠\" : \"\"} · ${fmtContext(m.contextLength)}`,\n })),\n { value: REFILTER, label: t(\"wizard.orRefilter\") },\n { value: MANUAL, label: t(\"wizard.orManual\") },\n ],\n });\n bail(choice);\n\n if (choice === REFILTER) continue;\n if (choice === MANUAL) return undefined;\n return choice as string;\n }\n}\n\nasync function promptApiKey(provider: ProviderKind): Promise<string | undefined> {\n if (!REQUIRES_API_KEY[provider]) {\n const need = await p.confirm({\n message: t(\"wizard.keyNotNeeded\", { provider }),\n initialValue: false,\n });\n bail(need);\n if (!need) return undefined;\n }\n\n const method = await p.select({\n message: t(\"wizard.apiKey\"),\n options: [\n { value: \"env\", label: t(\"wizard.keyEnv\") },\n { value: \"inline\", label: t(\"wizard.keyInline\") },\n { value: \"none\", label: t(\"wizard.keySkip\") },\n ],\n initialValue: \"env\",\n });\n bail(method);\n\n if (method === \"none\") return undefined;\n\n if (method === \"env\") {\n const envName = await p.text({\n message: t(\"wizard.envName\"),\n initialValue: SUGGESTED_KEY_ENV[provider] ?? \"OPENAI_API_KEY\",\n validate: (v) => (/^[A-Z0-9_]+$/i.test(v.trim()) ? undefined : t(\"wizard.envInvalid\")),\n });\n bail(envName);\n return `\\${${String(envName).trim()}}`;\n }\n\n const key = await p.password({\n message: t(\"wizard.keyPrompt\"),\n validate: (v) => (v.trim() ? undefined : t(\"wizard.required\")),\n });\n bail(key);\n return String(key).trim();\n}\n","/** Discovery helpers for a local Ollama instance. */\n\nfunction normalizeHost(host: string): string {\n let h = host.trim().replace(/\\/v1\\/?$/, \"\").replace(/\\/$/, \"\");\n if (!/^https?:\\/\\//.test(h)) h = `http://${h}`;\n return h;\n}\n\n/** Default Ollama host, honoring the OLLAMA_HOST env var. */\nexport function ollamaHost(): string {\n return normalizeHost(process.env.OLLAMA_HOST ?? \"http://localhost:11434\");\n}\n\n/**\n * List models installed on a reachable Ollama instance (via /api/tags).\n * Returns [] when Ollama is not running or the request fails/times out.\n */\nexport async function listOllamaModels(\n host: string = ollamaHost(),\n timeoutMs = 2000,\n): Promise<string[]> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(`${normalizeHost(host)}/api/tags`, { signal: controller.signal });\n if (!res.ok) return [];\n const data = (await res.json()) as { models?: Array<{ name?: string }> };\n return (data.models ?? [])\n .map((m) => m.name)\n .filter((n): n is string => Boolean(n));\n } catch {\n return [];\n } finally {\n clearTimeout(timer);\n }\n}\n","import pc from \"picocolors\";\nimport { t } from \"../core/i18n/index.js\";\nimport { VERSION } from \"../core/version.js\";\n\nconst RESET = \"\\x1b[0m\";\nconst useColor =\n (Boolean(process.stdout.isTTY) || Boolean(process.env.FORCE_COLOR)) && !process.env.NO_COLOR;\nconst animated =\n Boolean(process.stdout.isTTY) && !process.env.NO_COLOR && !process.env.POLYPUS_NO_ANIM;\n\n/** Author / social links shown on startup. */\nconst AUTHOR = {\n name: \"Gabriel Rios\",\n github: \"github.com/GaberRB\",\n linkedin: \"linkedin.com/in/gabriel-riosb\",\n};\n\n/** Build a 24-bit truecolor wrapper, no-op when colors are disabled. */\nfunction rgb(r: number, g: number, b: number, bold = false): (s: string) => string {\n return (s: string) =>\n useColor ? `\\x1b[${bold ? \"1;\" : \"\"}38;2;${r};${g};${b}m${s}${RESET}` : s;\n}\n\n// Violet gradient (light → deep) plus white glasses and pink cheeks.\nconst c0 = rgb(224, 209, 255);\nconst c1 = rgb(199, 176, 253);\nconst c2 = rgb(171, 142, 250);\nconst c3 = rgb(146, 102, 245);\nconst c4 = rgb(122, 74, 222);\nconst lens = rgb(255, 255, 255, true);\nconst blush = rgb(255, 138, 190, true);\nconst GRAD = [c0, c1, c1, c2, c2, c2, c3, c3, c3, c4, c4];\n\n// Cute kawaii octopus with round glasses, a smile, rosy cheeks and long\n// chubby tentacles ending in little curls.\n// '◉' white lenses · '(' ')' glasses frames · '‿' smile · '♥' blush.\nconst ART = [\n \" ▄▄▄▄▄▄▄▄▄▄ \",\n \" ▟██████████████▙ \",\n \" ████████████████████ \",\n \" ██♥ (◉) ‿ (◉) ♥██ \",\n \" ████████████████████ \",\n \" ▜████████████████▛ \",\n \" ██ ██ ██ ██ ██ \",\n \" ██ ██ ██ ██ ██ \",\n \" ██ ██ ██ ██ ██ \",\n \" ╰╝ ╚╝ ╚╝ ╚╝ ╚╮ \",\n];\n\n// Alternate tentacle curls for the \"coming alive\" wiggle on startup.\nconst TENTACLE_FRAMES = [\n \" ╰╝ ╚╝ ╚╝ ╚╝ ╚╮ \",\n \" ╚╮ ╰╝ ╚╝ ╰╝ ╚╝ \",\n \" ╰╝ ╚╝ ╰╝ ╚╝ ╚╮ \",\n];\n\nconst WIDTH = Math.max(...[...ART].map((l) => [...l].length));\n\nfunction center(line: string): string {\n const pad = WIDTH - [...line].length;\n const left = Math.floor(pad / 2);\n return \" \".repeat(left) + line + \" \".repeat(pad - left);\n}\n\n// Filled 5-row block font for the wordmark. Each glyph is 6 columns wide.\nconst GLYPHS: Record<string, string[]> = {\n P: [\"██████\", \"██ ██\", \"██████\", \"██ \", \"██ \"],\n O: [\"██████\", \"██ ██\", \"██ ██\", \"██ ██\", \"██████\"],\n L: [\"██ \", \"██ \", \"██ \", \"██ \", \"██████\"],\n Y: [\"██ ██\", \"██ ██\", \" ████ \", \" ██ \", \" ██ \"],\n U: [\"██ ██\", \"██ ██\", \"██ ██\", \"██ ██\", \"██████\"],\n S: [\"██████\", \"██ \", \"██████\", \" ██\", \"██████\"],\n};\n\nconst WORD_GRAD = [\n rgb(199, 176, 253, true),\n rgb(171, 142, 250, true),\n rgb(171, 142, 250, true),\n rgb(146, 102, 245, true),\n rgb(146, 102, 245, true),\n];\n\n/** Filled block letters, one colored string per row (vertical gradient). */\nfunction wordmarkLines(text: string): string[] {\n const letters = [...text].map((ch) => GLYPHS[ch]).filter(Boolean) as string[][];\n return [0, 1, 2, 3, 4].map((row) =>\n (WORD_GRAD[row] ?? c3)(letters.map((g) => g[row]).join(\" \")),\n );\n}\n\nfunction colorChar(rowIdx: number, ch: string): string {\n if (ch === \" \") return ch;\n if (ch === \"◉\" || ch === \"(\" || ch === \")\") return lens(ch);\n if (ch === \"♥\") return blush(ch);\n if (ch === \"‿\") return c0(ch);\n return (GRAD[rowIdx] ?? c3)(ch);\n}\n\n/** Center + color one octopus row (any string), tinted as the given gradient row. */\nfunction renderArtRow(rowIdx: number, line: string): string {\n return [...center(line)].map((ch) => colorChar(rowIdx, ch)).join(\"\");\n}\n\nconst tagline = (): string => c1(t(\"welcome.tagline\")) + pc.dim(` v${VERSION}`);\n\nfunction authorLine(): string {\n return (\n pc.dim(\"by \") +\n c2(AUTHOR.name) +\n pc.dim(\" · \") +\n c1(AUTHOR.github) +\n pc.dim(\" · \") +\n c1(AUTHOR.linkedin)\n );\n}\n\n/** The full static banner (octopus + wordmark + tagline + author). */\nexport function banner(): string {\n const art = ART.map((line, i) => renderArtRow(i, line)).join(\"\\n\");\n const word = wordmarkLines(\"POLYPUS\").join(\"\\n\");\n return `\\n${art}\\n\\n${word}\\n\\n ${tagline()}\\n ${authorLine()}\\n`;\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\n\n/**\n * Animated startup: the octopus draws itself in line by line, wiggles its\n * tentacles to \"come alive\", then the wordmark, tagline and author appear.\n * Falls back to the static banner when not attached to a TTY.\n */\nasync function animateIntro(): Promise<void> {\n if (!animated) {\n console.log(banner());\n return;\n }\n\n process.stdout.write(\"\\n\");\n for (let i = 0; i < ART.length; i++) {\n console.log(renderArtRow(i, ART[i]!));\n await sleep(45);\n }\n\n // Wiggle the just-drawn tentacle line in place.\n const last = ART.length - 1;\n for (let k = 0; k < 6; k++) {\n const frame = renderArtRow(last, TENTACLE_FRAMES[k % TENTACLE_FRAMES.length]!);\n process.stdout.write(`\\x1b[1A\\r\\x1b[K${frame}\\n`);\n await sleep(85);\n }\n\n process.stdout.write(\"\\n\");\n for (const line of wordmarkLines(\"POLYPUS\")) {\n console.log(line);\n await sleep(40);\n }\n\n process.stdout.write(\"\\n\");\n console.log(\" \" + tagline());\n await sleep(140);\n console.log(\" \" + authorLine());\n console.log(\"\");\n}\n\nexport interface WelcomeInfo {\n agentName: string;\n provider: string;\n model: string;\n toolMode: string;\n mode: string;\n workspace: string;\n}\n\n/** Animate the intro, then print the colored session info panel and hints. */\nexport async function printWelcome(info: WelcomeInfo): Promise<void> {\n await animateIntro();\n\n const bar = c2(\"│ \");\n const label = (s: string) => pc.dim(s.padEnd(8));\n const rule = c3(\" \" + \"─\".repeat(46));\n\n console.log(rule);\n console.log(\" \" + bar + label(t(\"welcome.agent\")) + pc.bold(info.agentName));\n console.log(\n \" \" + bar + label(t(\"welcome.model\")) +\n `${info.model} ` + pc.dim(`(${info.provider} · ${info.toolMode})`),\n );\n console.log(\" \" + bar + label(t(\"welcome.mode\")) + modeColor(info.mode));\n console.log(\" \" + bar + label(t(\"welcome.workspace\")) + pc.dim(info.workspace));\n console.log(rule);\n console.log(\" \" + pc.dim(t(\"welcome.hints\")) + \"\\n\");\n}\n\nfunction modeColor(mode: string): string {\n if (mode === \"bypass\") return pc.yellow(mode);\n if (mode === \"plan\") return pc.cyan(mode);\n return pc.green(mode);\n}\n\n/** Styled REPL prompt, e.g. \"🐙 polypus(review) › \". */\nexport function promptLabel(mode: string): string {\n return c2(\"🐙 polypus\") + pc.dim(`(${mode})`) + c3(\" › \");\n}\n","import { createRequire } from \"node:module\";\n\n/**\n * Single source of truth for the CLI version, read from package.json at runtime.\n * Tries the bundled path first (dist/index.js → repo root) and falls back to the\n * source-tree path (src/core → repo root), so it resolves both from the tsup\n * bundle and when running from source (tests). Each candidate's version field is\n * validated so a stray package.json higher up the tree can't yield `undefined`.\n */\nfunction resolveVersion(): string {\n const require = createRequire(import.meta.url);\n for (const rel of [\"../package.json\", \"../../package.json\"]) {\n try {\n const version = (require(rel) as { version?: unknown }).version;\n if (typeof version === \"string\" && version.length > 0) return version;\n } catch {\n /* try the next candidate path */\n }\n }\n return \"0.0.0\";\n}\n\nexport const VERSION: string = resolveVersion();\n","import * as readline from \"node:readline/promises\";\nimport { PassThrough } from \"node:stream\";\nimport { stdin, stdout } from \"node:process\";\nimport { PasteStore, PasteFilter } from \"./paste.js\";\nimport { t } from \"../core/i18n/index.js\";\n\nconst ENABLE_BRACKETED_PASTE = \"\\x1b[?2004h\";\nconst DISABLE_BRACKETED_PASTE = \"\\x1b[?2004l\";\n\n/**\n * Read a single line from the user. On a TTY, enables bracketed paste so a large\n * multi-line paste is shown compactly as `[Pasted text #N +M lines]` while the\n * full text is preserved and returned. Falls back to a plain readline when stdin\n * is not a TTY (pipes, tests). Returns `null` on EOF / Ctrl+C.\n */\nexport async function readLine(prompt: string): Promise<string | null> {\n if (!stdin.isTTY) {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n try {\n return await rl.question(prompt);\n } catch {\n return null;\n } finally {\n rl.close();\n }\n }\n return readLineTTY(prompt);\n}\n\nasync function readLineTTY(prompt: string): Promise<string | null> {\n const store = new PasteStore((id, lines) => t(\"repl.pasted\", { id, lines }));\n const filter = new PasteFilter(store);\n\n // The real TTY is driven in raw mode by us; readline does the line editing and\n // echo on a proxy stream (terminal:true) fed with paste-filtered input.\n const proxy = new PassThrough();\n const rl = readline.createInterface({ input: proxy, output: stdout, terminal: true });\n const onData = (buf: Buffer): void => {\n proxy.write(filter.push(buf.toString(\"utf8\")));\n };\n\n stdout.write(ENABLE_BRACKETED_PASTE);\n stdin.setRawMode(true);\n stdin.resume();\n stdin.on(\"data\", onData);\n\n try {\n const line = await new Promise<string | null>((resolve) => {\n rl.question(prompt).then(resolve, () => resolve(null));\n rl.on(\"SIGINT\", () => resolve(null));\n rl.on(\"close\", () => resolve(null));\n });\n return line === null ? null : store.expand(line);\n } finally {\n stdin.off(\"data\", onData);\n if (stdin.isTTY) stdin.setRawMode(false);\n stdout.write(DISABLE_BRACKETED_PASTE);\n rl.close();\n }\n}\n","/**\n * Bracketed-paste handling for the REPL. When a terminal has bracketed paste\n * enabled (`ESC[?2004h`), pasted text arrives wrapped in `ESC[200~ … ESC[201~`.\n * We capture multi-line pastes as a single unit, show a compact placeholder like\n * `[Pasted text #1 +16 lines]`, and keep the full text so the agent still sees it.\n */\n\nexport const PASTE_START = \"\\x1b[200~\";\nexport const PASTE_END = \"\\x1b[201~\";\n\n/** Holds full pasted texts keyed by the placeholder shown in their place. */\nexport class PasteStore {\n private seq = 0;\n private readonly map = new Map<string, string>();\n\n /** `format(id, lines)` builds the placeholder (localized by the caller). */\n constructor(private readonly format: (id: number, lines: number) => string) {}\n\n /** Register pasted text, returning the placeholder to display in its place. */\n add(text: string): string {\n const lines = text.split(/\\r\\n|\\r|\\n/).length;\n const placeholder = this.format(++this.seq, lines);\n this.map.set(placeholder, text);\n return placeholder;\n }\n\n /** Replace any known placeholders in `line` with their full pasted text. */\n expand(line: string): string {\n let out = line;\n for (const [placeholder, full] of this.map) {\n if (out.includes(placeholder)) out = out.split(placeholder).join(full);\n }\n return out;\n }\n\n get size(): number {\n return this.map.size;\n }\n}\n\n/**\n * Streaming filter: feed it raw input chunks and it returns the text to forward\n * to the line editor, with multi-line pastes replaced by placeholders. Tolerates\n * paste markers split across chunk boundaries.\n */\nexport class PasteFilter {\n private buf = \"\";\n private inPaste = false;\n private pasteBuf = \"\";\n\n constructor(private readonly store: PasteStore) {}\n\n push(chunk: string): string {\n this.buf += chunk;\n let out = \"\";\n for (;;) {\n if (!this.inPaste) {\n const i = this.buf.indexOf(PASTE_START);\n if (i === -1) {\n const keep = partialSuffix(this.buf, PASTE_START);\n out += this.buf.slice(0, this.buf.length - keep);\n this.buf = this.buf.slice(this.buf.length - keep);\n return out;\n }\n out += this.buf.slice(0, i);\n this.buf = this.buf.slice(i + PASTE_START.length);\n this.inPaste = true;\n } else {\n const j = this.buf.indexOf(PASTE_END);\n if (j === -1) {\n const keep = partialSuffix(this.buf, PASTE_END);\n this.pasteBuf += this.buf.slice(0, this.buf.length - keep);\n this.buf = this.buf.slice(this.buf.length - keep);\n return out;\n }\n this.pasteBuf += this.buf.slice(0, j);\n this.buf = this.buf.slice(j + PASTE_END.length);\n this.inPaste = false;\n out += this.emit(this.pasteBuf);\n this.pasteBuf = \"\";\n }\n }\n }\n\n /** Multi-line pastes become a placeholder; single-line pastes pass through. */\n private emit(text: string): string {\n return /\\r|\\n/.test(text) ? this.store.add(text) : text;\n }\n}\n\n/** Length of the longest suffix of `s` that is a proper prefix of `marker`. */\nfunction partialSuffix(s: string, marker: string): number {\n const max = Math.min(s.length, marker.length - 1);\n for (let n = max; n > 0; n--) {\n if (s.slice(s.length - n) === marker.slice(0, n)) return n;\n }\n return 0;\n}\n","import pc from \"picocolors\";\nimport { loadConfig } from \"../../core/config/store.js\";\nimport { createProvider, type ResolvedAgent } from \"../../core/providers/registry.js\";\nimport { runSwarm } from \"../../core/agent/orchestrator.js\";\nimport { recommendConcurrency, idleTimeoutMs, overallTimeoutMs } from \"../../core/agent/concurrency.js\";\nimport { SwarmView, describeToolCall } from \"../../ui/swarm-view.js\";\nimport { listenForCancel } from \"../../ui/cancel.js\";\nimport { t } from \"../../core/i18n/index.js\";\nimport type { PolypusConfig } from \"../../core/config/schema.js\";\n\nexport interface SwarmCliOptions {\n agents?: string;\n maxSubtasks?: string;\n}\n\n/** Minimum number of configured agents for swarm mode to be worthwhile. */\nexport const MIN_SWARM_AGENTS = 1;\n\n/** Swarm can run with one agent, which will fan out subtasks to parallel workers. */\nexport function canSwarm(agentCount: number): boolean {\n return agentCount >= MIN_SWARM_AGENTS;\n}\n\nexport interface SwarmSessionOptions {\n /** Subset of agent names to use; defaults to all configured agents. */\n agents?: string[];\n maxSubtasks?: number;\n /** Workspace to run in; defaults to the current working directory. */\n workspace?: string;\n}\n\n/**\n * Decompose and run a task across agents in parallel worktrees, rendering the\n * live dashboard and a final report. Shared by the `polypus swarm` CLI command\n * and the REPL `/swarm` command. Enforces the 3+ agent gate.\n */\nexport async function runSwarmSession(\n task: string,\n config: PolypusConfig,\n opts: SwarmSessionOptions = {},\n): Promise<void> {\n // Gate: swarm requires at least one agent.\n if (!canSwarm(config.agents.length)) {\n throw new Error(t(\"swarm.needsAgents\", { min: MIN_SWARM_AGENTS, have: config.agents.length }));\n }\n\n const workspace = opts.workspace ?? process.cwd();\n const selected = opts.agents?.length ? opts.agents : config.agents.map((a) => a.name);\n if (selected.length === 0) {\n throw new Error(t(\"swarm.noAgents\"));\n }\n\n const resolved: ResolvedAgent[] = selected.map((name) => {\n const a = config.agents.find((x) => x.name === name);\n if (!a) throw new Error(t(\"agent.notFound\", { name }));\n return createProvider(a);\n });\n\n console.log(\n pc.dim(t(\"swarm.status\", { agents: resolved.map((a) => a.config.name).join(\", \"), workspace })),\n );\n console.log(pc.yellow(t(\"swarm.bypassNote\") + \"\\n\"));\n\n // ESC / Ctrl+C cancels: committed workers still merge, the rest are aborted.\n const controller = new AbortController();\n const cancel = listenForCancel(controller);\n controller.signal.addEventListener(\"abort\", () => console.log(pc.dim(\"\\n\" + t(\"swarm.cancelling\"))), {\n once: true,\n });\n\n const view = new SwarmView(resolved[0]!.config.name);\n view.start();\n let result;\n const sessionTimeout = setTimeout(() => {\n controller.abort();\n console.log(pc.red(t(\"swarm.timeout\")));\n }, overallTimeoutMs());\n try {\n result = await runSwarm({\n task,\n workspace,\n agents: resolved,\n allow: config.permissions.allow,\n deny: config.permissions.deny,\n maxSubtasks: opts.maxSubtasks,\n concurrency: recommendConcurrency(resolved),\n idleTimeoutMs: idleTimeoutMs(),\n signal: controller.signal,\n events: {\n onDecomposed: (subtasks) => view.setSubtasks(subtasks),\n onWorkerStart: (subtask, agentName) => view.workerStart(subtask.id, agentName),\n onWorkerDone: (outcome) => view.workerDone(outcome),\n onMerge: (merge) => view.merge(merge),\n workerEvents: (subtask) => ({\n onToolCall: (call) => view.workerAction(subtask.id, describeToolCall(call)),\n onStep: (step) => view.workerStep(subtask.id, step),\n }),\n },\n });\n } finally {\n clearTimeout(sessionTimeout);\n view.stop();\n cancel.dispose();\n }\n console.log(\"\");\n\n // Final report.\n console.log(pc.bold(\"\\n\" + t(\"swarm.summary\")));\n for (const o of result.outcomes) {\n const status = o.finished ? pc.green(t(\"swarm.statusDone\")) : pc.yellow(t(\"swarm.statusIncomplete\"));\n const committed = o.committed ? \"\" : pc.dim(` (${t(\"swarm.noChanges\")})`);\n console.log(` ${pc.bold(o.subtask.id)} [${o.agentName}] ${status}${committed} — ${o.subtask.title}`);\n }\n const conflicts = result.merges.filter((m) => !m.ok);\n if (conflicts.length > 0) {\n console.log(pc.red(\"\\n\" + t(\"swarm.conflictsHeader\", { n: conflicts.length })));\n for (const m of conflicts) {\n console.log(pc.red(` ${m.branch}: ${m.conflicts.join(\", \")}`));\n }\n } else {\n console.log(pc.green(\"\\n\" + t(\"swarm.allMerged\")));\n }\n}\n\n/** `polypus swarm <task>` — load config, parse CLI options and run the session. */\nexport async function swarm(task: string, opts: SwarmCliOptions): Promise<void> {\n const config = await loadConfig();\n await runSwarmSession(task, config, {\n agents: opts.agents\n ? opts.agents.split(\",\").map((s) => s.trim()).filter(Boolean)\n : undefined,\n maxSubtasks: opts.maxSubtasks ? Number(opts.maxSubtasks) : undefined,\n });\n}\n","import { mkdtemp } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { simpleGit, type SimpleGit } from \"simple-git\";\n\nexport interface Worktree {\n path: string;\n branch: string;\n}\n\nexport interface MergeResult {\n branch: string;\n ok: boolean;\n conflicts: string[];\n}\n\n/** Ensure the workspace is a git repo with at least one commit (worktrees need a base ref). */\nexport async function ensureRepo(workspace: string): Promise<SimpleGit> {\n const git = simpleGit(workspace);\n if (!(await git.checkIsRepo())) {\n await git.init();\n }\n const identity = await identityArgs(git);\n // A fresh repo has no HEAD; create an empty initial commit so we can branch.\n const hasHead = await git\n .raw([\"rev-parse\", \"--verify\", \"HEAD\"])\n .then(() => true)\n .catch(() => false);\n if (!hasHead) {\n await git.raw([...identity, \"commit\", \"--allow-empty\", \"-m\", \"polypus: initial commit\"]);\n }\n return git;\n}\n\n/**\n * Provide a fallback committer identity only when the repo/global config has\n * none, so we never override a user's configured name/email.\n */\nasync function identityArgs(git: SimpleGit): Promise<string[]> {\n const email = await git.raw([\"config\", \"user.email\"]).catch(() => \"\");\n if (email.trim()) return [];\n return [\"-c\", \"user.email=polypus@local\", \"-c\", \"user.name=Polypus\"];\n}\n\n/** Create an isolated worktree on a new branch off the current HEAD. */\nexport async function createWorktree(\n git: SimpleGit,\n label: string,\n): Promise<Worktree> {\n const branch = `polypus/${label}-${Date.now().toString(36)}`;\n const path = await mkdtemp(join(tmpdir(), \"polypus-wt-\"));\n await git.raw([\"worktree\", \"add\", \"-b\", branch, path, \"HEAD\"]);\n return { path, branch };\n}\n\n/** Stage and commit everything a worker produced in its worktree. */\nexport async function commitWorktree(wt: Worktree, message: string): Promise<boolean> {\n const wtGit = simpleGit(wt.path);\n await wtGit.add([\"-A\"]);\n const status = await wtGit.status();\n if (status.staged.length === 0 && status.files.length === 0) return false;\n const identity = await identityArgs(wtGit);\n await wtGit.raw([...identity, \"commit\", \"-m\", message]);\n return true;\n}\n\n/** Merge a worker branch into the workspace's current branch, reporting conflicts. */\nexport async function mergeWorktreeBranch(\n git: SimpleGit,\n branch: string,\n): Promise<MergeResult> {\n try {\n const identity = await identityArgs(git);\n await git.raw([...identity, \"merge\", \"--no-edit\", branch]);\n return { branch, ok: true, conflicts: [] };\n } catch (err) {\n // simple-git throws on conflict; collect conflicted files and abort cleanly.\n const status = await git.status().catch(() => undefined);\n const conflicts = status?.conflicted ?? [];\n await git.raw([\"merge\", \"--abort\"]).catch(() => undefined);\n if (conflicts.length === 0) {\n // Not a conflict — rethrow the original error.\n throw err;\n }\n return { branch, ok: false, conflicts };\n }\n}\n\n/** Remove a worktree and delete its branch. */\nexport async function removeWorktree(git: SimpleGit, wt: Worktree): Promise<void> {\n await git.raw([\"worktree\", \"remove\", wt.path, \"--force\"]).catch(() => undefined);\n await git.raw([\"branch\", \"-D\", wt.branch]).catch(() => undefined);\n}\n","import { runAgent, type AgentEvents } from \"./loop.js\";\nimport { commitWorktree, type Worktree } from \"../git/worktree.js\";\nimport { PermissionEngine } from \"../permissions/modes.js\";\nimport type { ResolvedAgent } from \"../providers/registry.js\";\n\nexport interface Subtask {\n id: string;\n title: string;\n brief: string;\n}\n\nexport interface WorkerOutcome {\n subtask: Subtask;\n agentName: string;\n branch: string;\n finished: boolean;\n summary?: string;\n committed: boolean;\n steps: number;\n}\n\n/**\n * Run one subtask to completion inside an isolated worktree. Workers run in\n * `bypass` mode because the worktree is throwaway and merges are reviewed later.\n */\nexport async function runWorker(\n subtask: Subtask,\n agent: ResolvedAgent,\n wt: Worktree,\n allow: string[],\n deny: string[],\n events?: AgentEvents,\n signal?: AbortSignal,\n): Promise<WorkerOutcome> {\n const permissions = new PermissionEngine({\n mode: \"bypass\",\n policy: { workspace: wt.path, allow, deny },\n allowedCommands: [],\n });\n\n const result = await runAgent({\n task: subtask.brief,\n workspace: wt.path,\n agent,\n permissions,\n promptContext: { workspace: wt.path, mode: \"bypass\", allow, briefing: subtask.brief },\n events,\n signal,\n });\n\n // Don't commit a worker that was cancelled/timed out mid-step — its worktree\n // may hold half-applied changes we don't want to merge.\n const committed =\n result.reason === \"cancelled\"\n ? false\n : await commitWorktree(wt, `polypus(${subtask.id}): ${subtask.title}`);\n\n return {\n subtask,\n agentName: agent.config.name,\n branch: wt.branch,\n finished: result.finished,\n summary: result.summary,\n committed,\n steps: result.steps,\n };\n}\n","import type { ResolvedAgent } from \"../providers/registry.js\";\nimport {\n createWorktree,\n ensureRepo,\n mergeWorktreeBranch,\n removeWorktree,\n type MergeResult,\n type Worktree,\n} from \"../git/worktree.js\";\nimport { runWorker, type Subtask, type WorkerOutcome } from \"./worker.js\";\nimport type { AgentEvents } from \"./loop.js\";\n\nexport interface SwarmOptions {\n task: string;\n workspace: string;\n agents: ResolvedAgent[];\n allow: string[];\n deny: string[];\n maxSubtasks?: number;\n /** Max workers running at once. Defaults to the number of agents. */\n concurrency?: number;\n /** Abort a worker that makes no progress (no step) for this long. 0 disables. */\n idleTimeoutMs?: number;\n /** Cancel the whole swarm (e.g. user pressed ESC). */\n signal?: AbortSignal;\n events?: SwarmEvents;\n}\n\nexport interface SwarmEvents {\n onDecomposed?(subtasks: Subtask[]): void;\n onWorkerStart?(subtask: Subtask, agentName: string): void;\n onWorkerDone?(outcome: WorkerOutcome): void;\n onMerge?(result: MergeResult): void;\n workerEvents?(subtask: Subtask): AgentEvents | undefined;\n}\n\nexport interface SwarmResult {\n subtasks: Subtask[];\n outcomes: WorkerOutcome[];\n merges: MergeResult[];\n}\n\n/**\n * Decompose a task with the lead agent, run each subtask in a parallel worker\n * (each in its own git worktree, bounded by `concurrency`), then merge the\n * branches sequentially. Cancellable via `signal`; a worker that stalls past\n * `idleTimeoutMs` is aborted without sinking the run. Workers never reject —\n * a failed/aborted worker yields an unfinished outcome — so the committed ones\n * still merge, even after cancellation.\n */\nexport async function runSwarm(opts: SwarmOptions): Promise<SwarmResult> {\n const lead = opts.agents[0];\n if (!lead) throw new Error(\"Swarm requires at least one agent.\");\n\n const maxSubtasks = opts.maxSubtasks ?? Math.max(opts.agents.length, 2);\n const concurrency = Math.max(1, opts.concurrency ?? opts.agents.length);\n const idleTimeoutMs = opts.idleTimeoutMs ?? 0;\n const git = await ensureRepo(opts.workspace);\n\n const subtasks = await decompose(lead, opts.task, maxSubtasks, opts.signal);\n opts.events?.onDecomposed?.(subtasks);\n\n // Create worktrees sequentially (concurrent `git worktree add` can hit index\n // locks), then run the workers through a bounded pool.\n const worktrees: Worktree[] = [];\n for (const subtask of subtasks) {\n worktrees.push(await createWorktree(git, subtask.id));\n }\n\n const runOne = (subtask: Subtask, i: number): Promise<WorkerOutcome> =>\n guardedWorker(subtask, opts.agents[i % opts.agents.length]!, worktrees[i]!, {\n allow: opts.allow,\n deny: opts.deny,\n idleTimeoutMs,\n signal: opts.signal,\n events: opts.events,\n });\n const outcomes = await runPool(subtasks, concurrency, runOne);\n\n // Merge sequentially so conflicts are attributed to a specific branch. Runs\n // even after cancellation, so committed workers aren't thrown away.\n const merges: MergeResult[] = [];\n for (const outcome of outcomes) {\n if (!outcome.committed) continue;\n const merge = await mergeWorktreeBranch(git, outcome.branch);\n merges.push(merge);\n opts.events?.onMerge?.(merge);\n }\n\n // Clean up worktrees and branches that merged cleanly; keep conflicted branches for inspection.\n const conflicted = new Set(merges.filter((m) => !m.ok).map((m) => m.branch));\n for (const wt of worktrees) {\n if (conflicted.has(wt.branch)) {\n await git.raw([\"worktree\", \"remove\", wt.path, \"--force\"]).catch(() => undefined);\n } else {\n await removeWorktree(git, wt);\n }\n }\n\n return { subtasks, outcomes, merges };\n}\n\ninterface GuardOptions {\n allow: string[];\n deny: string[];\n idleTimeoutMs: number;\n signal?: AbortSignal;\n events?: SwarmEvents;\n}\n\n/**\n * Run a single worker with its own abort controller, wired to the global signal\n * and an idle-timeout watchdog (reset on each step). Never rejects: any error or\n * abort yields an unfinished outcome.\n */\nasync function guardedWorker(\n subtask: Subtask,\n agent: ResolvedAgent,\n wt: Worktree,\n opts: GuardOptions,\n): Promise<WorkerOutcome> {\n const ac = new AbortController();\n const onAbort = (): void => ac.abort();\n if (opts.signal) {\n if (opts.signal.aborted) ac.abort();\n else opts.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n const resetIdle = (): void => {\n if (opts.idleTimeoutMs <= 0) return;\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => ac.abort(), opts.idleTimeoutMs);\n idleTimer.unref?.();\n };\n\n const base = opts.events?.workerEvents?.(subtask);\n const events: AgentEvents = {\n ...base,\n onStep: (n) => {\n resetIdle();\n base?.onStep?.(n);\n },\n };\n\n opts.events?.onWorkerStart?.(subtask, agent.config.name);\n resetIdle();\n\n let outcome: WorkerOutcome;\n try {\n outcome = await runWorker(subtask, agent, wt, opts.allow, opts.deny, events, ac.signal);\n } catch {\n outcome = {\n subtask,\n agentName: agent.config.name,\n branch: wt.branch,\n finished: false,\n committed: false,\n steps: 0,\n };\n } finally {\n if (idleTimer) clearTimeout(idleTimer);\n opts.signal?.removeEventListener(\"abort\", onAbort);\n }\n opts.events?.onWorkerDone?.(outcome);\n return outcome;\n}\n\n/** Run `fn` over `items` with at most `limit` in flight; preserves result order. */\nasync function runPool<T, R>(\n items: T[],\n limit: number,\n fn: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n let next = 0;\n const worker = async (): Promise<void> => {\n for (;;) {\n const i = next++;\n if (i >= items.length) return;\n results[i] = await fn(items[i]!, i);\n }\n };\n await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));\n return results;\n}\n\nconst DECOMPOSE_SYSTEM = [\n \"You are a tech lead splitting a coding task into independent subtasks that can be done in parallel.\",\n \"Return ONLY a JSON array. Each item: {\\\"title\\\": string, \\\"brief\\\": string}.\",\n \"Make subtasks touch DIFFERENT files/areas to minimize merge conflicts.\",\n \"Keep the list small (prefer 2-4 items). Each brief must be self-contained and actionable.\",\n].join(\"\\n\");\n\n/** Ask the lead agent to split the task into subtasks; fall back to a single subtask. */\nasync function decompose(\n lead: ResolvedAgent,\n task: string,\n maxSubtasks: number,\n signal?: AbortSignal,\n): Promise<Subtask[]> {\n try {\n const res = await lead.provider.chat({\n messages: [\n { role: \"system\", content: DECOMPOSE_SYSTEM },\n { role: \"user\", content: `Task:\\n${task}\\n\\nReturn at most ${maxSubtasks} subtasks as a JSON array.` },\n ],\n params: { temperature: 0 },\n signal,\n });\n const parsed = extractJsonArray(res.content);\n if (parsed && parsed.length > 0) {\n return parsed.slice(0, maxSubtasks).map((item, i) => ({\n id: `t${i + 1}`,\n title: String(item.title ?? `subtask ${i + 1}`),\n brief: String(item.brief ?? item.title ?? task),\n }));\n }\n } catch {\n /* fall through to single-subtask mode */\n }\n return [{ id: \"t1\", title: \"task\", brief: task }];\n}\n\nfunction extractJsonArray(text: string): Array<{ title?: string; brief?: string }> | null {\n const start = text.indexOf(\"[\");\n const end = text.lastIndexOf(\"]\");\n if (start === -1 || end <= start) return null;\n try {\n const parsed = JSON.parse(text.slice(start, end + 1));\n return Array.isArray(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n","import type { ResolvedAgent } from \"../providers/registry.js\";\n\n/**\n * How many workers may hit a single Ollama endpoint at once. Local Ollama serves\n * one or two models at a time and thrashes under more, so we cap it low to avoid\n * the contention that froze a 5-agent swarm. Tune here.\n */\nexport const OLLAMA_ENDPOINT_CONCURRENCY = 2;\n\n/** Default idle timeout (ms) before a worker that stops making progress is aborted. */\nexport const DEFAULT_IDLE_TIMEOUT_MS = 300_000;\n\nfunction endpointKey(agent: ResolvedAgent): string {\n return `${agent.config.provider}:${agent.config.baseUrl ?? \"default\"}`;\n}\n\n/**\n * Recommend how many workers to run concurrently for a set of agents. Hosted\n * providers parallelize freely (capacity = agents on that endpoint), while each\n * Ollama endpoint is capped at {@link OLLAMA_ENDPOINT_CONCURRENCY}. Capacities\n * sum across distinct endpoints. Always at least 1.\n */\nexport function recommendConcurrency(agents: ResolvedAgent[]): number {\n const perEndpoint = new Map<string, number>();\n for (const a of agents) {\n perEndpoint.set(endpointKey(a), (perEndpoint.get(endpointKey(a)) ?? 0) + 1);\n }\n let total = 0;\n for (const [key, count] of perEndpoint) {\n total += key.startsWith(\"ollama:\") ? Math.min(count, OLLAMA_ENDPOINT_CONCURRENCY) : count;\n }\n return Math.max(1, total);\n}\n\n/** Idle timeout from env (`POLYPUS_SWARM_IDLE_TIMEOUT_MS`) or the default. */\nexport function idleTimeoutMs(): number {\n const raw = Number(process.env.POLYPUS_SWARM_IDLE_TIMEOUT_MS);\n return Number.isFinite(raw) && raw > 0 ? raw : DEFAULT_IDLE_TIMEOUT_MS;\n}\n\n/** Overall timeout (ms) for the entire swarm session from env (`POLYPUS_SWARM_OVERALL_TIMEOUT_MS`) or the default. */\nexport function overallTimeoutMs(): number {\n const raw = Number(process.env.POLYPUS_SWARM_OVERALL_TIMEOUT_MS);\n return Number.isFinite(raw) && raw > 0 ? raw : 3_600_000; // Default: 1 hour\n}\n","import type { ToolCall } from \"../core/providers/types.js\";\nimport type { Subtask, WorkerOutcome } from \"../core/agent/worker.js\";\nimport type { MergeResult } from \"../core/git/worktree.js\";\nimport { t } from \"../core/i18n/index.js\";\n\nconst RESET = \"\\x1b[0m\";\nconst FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\ntype Status = \"pending\" | \"running\" | \"done\" | \"stopped\";\n\ninterface WorkerState {\n id: string;\n title: string;\n agent: string;\n status: Status;\n action: string;\n steps: number;\n branch?: string;\n merge?: \"ok\" | \"conflict\";\n}\n\nexport interface SwarmViewOptions {\n /** Animate + redraw in place. Defaults to whether stdout is a TTY. */\n tty?: boolean;\n /** Emit ANSI colors. Defaults to `tty` (disable for tests/plain output). */\n color?: boolean;\n /** Where to write (defaults to process.stdout). */\n sink?: (s: string) => void;\n}\n\n/** One-line summary of a tool call for the live view, e.g. `read_file src/x.ts`. */\nexport function describeToolCall(call: ToolCall): string {\n const raw = call.name === \"run_command\" ? call.arguments.command : call.arguments.path;\n const arg = typeof raw === \"string\" ? raw : \"\";\n const short = arg.length > 40 ? arg.slice(0, 39) + \"…\" : arg;\n return short ? `${call.name} ${short}` : call.name;\n}\n\n/**\n * Live, multi-line dashboard for the swarm: an orchestrator header plus one row\n * per worker showing its current action, step count and a spinner. Redraws in\n * place on a TTY; falls back to discrete event lines when piped.\n */\nexport class SwarmView {\n private readonly tty: boolean;\n private readonly color: boolean;\n private readonly write: (s: string) => void;\n private readonly workers = new Map<string, WorkerState>();\n private order: string[] = [];\n private phase: \"decomposing\" | \"running\" | \"done\" = \"decomposing\";\n private frame = 0;\n private lastLines = 0;\n private timer: NodeJS.Timeout | undefined;\n\n constructor(private readonly leadName: string, opts: SwarmViewOptions = {}) {\n this.tty = opts.tty ?? (Boolean(process.stdout.isTTY) && !process.env.NO_COLOR);\n this.color = opts.color ?? this.tty;\n this.write = opts.sink ?? ((s) => process.stdout.write(s));\n }\n\n start(): void {\n if (!this.tty) {\n this.write(`🐙 ${t(\"swarm.view.header\", { lead: this.leadName })} — ${t(\"swarm.view.decomposing\")}\\n`);\n return;\n }\n this.flush();\n this.timer = setInterval(() => {\n this.frame = (this.frame + 1) % FRAMES.length;\n this.flush();\n }, 110);\n this.timer.unref?.();\n }\n\n setSubtasks(subtasks: Subtask[]): void {\n this.phase = \"running\";\n for (const s of subtasks) {\n this.workers.set(s.id, { id: s.id, title: s.title, agent: \"\", status: \"pending\", action: \"\", steps: 0 });\n this.order.push(s.id);\n }\n if (!this.tty) {\n this.write(` ${t(\"swarm.decomposed\", { n: subtasks.length })}\\n`);\n for (const s of subtasks) this.write(` ${s.id}: ${s.title}\\n`);\n }\n this.flush();\n }\n\n workerStart(id: string, agent: string): void {\n const w = this.workers.get(id);\n if (!w) return;\n w.agent = agent;\n w.status = \"running\";\n if (!this.tty) this.write(` ▶ ${id} [${agent}] ${w.title}\\n`);\n this.flush();\n }\n\n workerAction(id: string, action: string): void {\n const w = this.workers.get(id);\n if (!w) return;\n w.action = action;\n this.flush();\n }\n\n workerStep(id: string, n: number): void {\n const w = this.workers.get(id);\n if (!w) return;\n w.steps = n;\n this.flush();\n }\n\n workerDone(o: WorkerOutcome): void {\n const w = this.workers.get(o.subtask.id);\n if (!w) return;\n w.status = o.finished ? \"done\" : \"stopped\";\n w.steps = o.steps;\n w.branch = o.branch;\n w.action = \"\";\n if (!this.tty) {\n const tag = o.finished ? \"✓\" : \"■\";\n const changes = o.committed ? t(\"swarm.changesCommitted\") : t(\"swarm.noChanges\");\n this.write(` ${tag} ${o.subtask.id} (${t(\"swarm.view.steps\", { n: o.steps })}, ${changes})\\n`);\n }\n this.flush();\n }\n\n merge(r: MergeResult): void {\n for (const w of this.workers.values()) {\n if (w.branch === r.branch) w.merge = r.ok ? \"ok\" : \"conflict\";\n }\n if (!this.tty) {\n this.write(r.ok ? ` ⤵ ${t(\"swarm.merged\", { branch: r.branch })}\\n` : ` ✗ ${t(\"swarm.mergeConflict\", { branch: r.branch })}\\n`);\n }\n this.flush();\n }\n\n stop(): void {\n this.phase = \"done\";\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n this.flush(); // leave the final frame on screen\n }\n\n /** Content lines of the dashboard (no cursor control). Exposed for tests. */\n frameLines(): string[] {\n const spin = this.dim(FRAMES[this.frame]!);\n const lead = `🐙 ${t(\"swarm.view.header\", { lead: this.leadName })}`;\n const lines: string[] = [];\n\n if (this.phase === \"decomposing\") {\n lines.push(`${spin} ${lead}`);\n lines.push(\" \" + this.dim(t(\"swarm.view.decomposing\")));\n return lines;\n }\n\n lines.push(`${this.phase === \"running\" ? spin : \" \"} ${lead}`);\n lines.push(\"\");\n for (const id of this.order) {\n const w = this.workers.get(id)!;\n lines.push(this.row(w, spin));\n }\n return lines;\n }\n\n // -------------------------------------------------------------------------\n\n private row(w: WorkerState, spin: string): string {\n const icon =\n w.status === \"running\" ? spin\n : w.status === \"done\" ? this.c(\"✓\", \"32\")\n : w.status === \"stopped\" ? this.c(\"■\", \"33\")\n : this.dim(\"·\");\n const status = this.statusLabel(w);\n const meta =\n w.steps > 0\n ? this.dim(\" · \" + (w.status === \"running\"\n ? t(\"swarm.view.step\", { n: w.steps })\n : t(\"swarm.view.steps\", { n: w.steps })))\n : \"\";\n const action = w.action ? w.action : this.dim(\"—\");\n return ` ${icon} ${pad(w.id, 4)} ${pad(status, 12)} ${pad(`[${w.agent}]`, 14)} ${action}${meta}`;\n }\n\n private statusLabel(w: WorkerState): string {\n if (w.merge === \"conflict\") return this.c(t(\"swarm.view.conflict\"), \"31\");\n if (w.status === \"running\") return this.c(t(\"swarm.view.running\"), \"36\");\n if (w.status === \"done\") return this.c(t(\"swarm.view.done\"), \"32\");\n if (w.status === \"stopped\") return this.c(t(\"swarm.view.stopped\"), \"33\");\n return this.dim(t(\"swarm.view.pending\"));\n }\n\n /** Redraw the block in place (TTY) by clearing the previous frame first. */\n private flush(): void {\n if (!this.tty) return;\n const lines = this.frameLines();\n let s = \"\";\n if (this.lastLines > 0) s += `\\x1b[${this.lastLines}A`; // up to block top\n s += \"\\x1b[0J\"; // clear from cursor to end of screen\n s += lines.join(\"\\n\") + \"\\n\";\n this.write(s);\n this.lastLines = lines.length;\n }\n\n private c(s: string, code: string): string {\n return this.color ? `\\x1b[${code}m${s}${RESET}` : s;\n }\n private dim(s: string): string {\n return this.color ? `\\x1b[2m${s}${RESET}` : s;\n }\n}\n\nfunction pad(s: string, n: number): string {\n return s.length >= n ? s : s + \" \".repeat(n - s.length);\n}\n","export interface CancelListener {\n /** Temporarily stop listening (e.g. to hand stdin to a clack prompt). */\n pause(): void;\n /** Resume listening after a pause. */\n resume(): void;\n /** Stop listening and restore the terminal. */\n dispose(): void;\n}\n\n/**\n * While a long task runs, listen on raw stdin for ESC (0x1b) or Ctrl+C (0x03)\n * and abort the controller. `pause()`/`resume()` let a clack confirmation borrow\n * stdin. No-op when stdin is not a TTY (pipes, tests). Shared by `polypus run`\n * and `polypus swarm`.\n */\nexport function listenForCancel(controller: AbortController): CancelListener {\n const stdin = process.stdin;\n if (!stdin.isTTY) return { pause() {}, resume() {}, dispose() {} };\n\n const onData = (buf: Buffer): void => {\n // Only a lone ESC / Ctrl+C — multi-byte sequences (arrow keys) are ignored.\n if (buf.length === 1 && (buf[0] === 0x1b || buf[0] === 0x03)) controller.abort();\n };\n\n let active = false;\n const attach = (): void => {\n if (active) return;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.on(\"data\", onData);\n active = true;\n };\n const detach = (): void => {\n if (!active) return;\n stdin.off(\"data\", onData);\n stdin.setRawMode(false);\n stdin.pause();\n active = false;\n };\n\n attach();\n return { pause: detach, resume: attach, dispose: detach };\n}\n","const RESET = \"\\x1b[0m\";\nconst isTTY = Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;\nconst FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst violet = (s: string) => (isTTY ? `\\x1b[38;2;167;139;250m${s}${RESET}` : s);\nconst dim = (s: string) => (isTTY ? `\\x1b[2m${s}${RESET}` : s);\n\n/**\n * Single-line animated \"thinking\" indicator with an octopus icon and elapsed\n * time, e.g. `⠹ 🐙 pensando… (3s)`. No-op when stdout is not a TTY so piped\n * output and logs stay clean.\n */\nexport class Spinner {\n private timer: NodeJS.Timeout | undefined;\n private frame = 0;\n private startedAt = 0;\n private label = \"\";\n private suffix = \"\";\n\n /** Extra dim text appended after the elapsed time (e.g. token count). */\n setSuffix(suffix: string): void {\n this.suffix = suffix;\n }\n\n /** Start (or, if already running, just update the label). */\n start(label: string): void {\n this.label = label;\n if (!isTTY) return;\n if (this.timer) return; // already animating; label updated above\n this.startedAt = Date.now();\n this.render();\n this.timer = setInterval(() => this.render(), 90);\n // Avoid keeping the process alive solely for the spinner.\n this.timer.unref?.();\n }\n\n /** Erase the spinner line and stop animating. */\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n if (isTTY) process.stdout.write(\"\\r\\x1b[K\");\n }\n\n private render(): void {\n const f = violet(FRAMES[this.frame = (this.frame + 1) % FRAMES.length]!);\n const secs = Math.floor((Date.now() - this.startedAt) / 1000);\n const time = secs > 0 ? dim(` (${secs}s)`) : \"\";\n const suffix = this.suffix ? dim(` · ${this.suffix}`) : \"\";\n process.stdout.write(`\\r\\x1b[K${f} 🐙 ${dim(this.label + \"…\")}${time}${suffix}`);\n }\n}\n","import { runWizard } from \"../../ui/wizard.js\";\n\n/** `polypus setup` — interactive onboarding wizard. */\nexport async function setup(): Promise<void> {\n await runWizard();\n}\n","import pc from \"picocolors\";\nimport { scaffoldPoly } from \"../../core/scaffold/init.js\";\nimport { getLocale, t } from \"../../core/i18n/index.js\";\n\nexport interface InitOptions {\n force?: boolean;\n}\n\n/** `polypus init` — scaffold a `.poly/` workspace in the current directory. */\nexport async function init(opts: InitOptions): Promise<void> {\n const { created, skipped } = await scaffoldPoly(process.cwd(), {\n force: Boolean(opts.force),\n locale: getLocale(),\n });\n\n if (created.length === 0) {\n console.log(pc.yellow(t(\"init.allExist\")));\n for (const f of skipped) console.log(pc.dim(` ${f}`));\n console.log(pc.dim(t(\"init.forceHint\")));\n return;\n }\n\n console.log(pc.green(t(\"init.created\")));\n for (const f of created) console.log(pc.dim(` ${f}`));\n if (skipped.length > 0) {\n console.log(pc.dim(t(\"init.skipped\")));\n for (const f of skipped) console.log(pc.dim(` ${f}`));\n }\n console.log(\"\\n\" + t(\"init.tip\"));\n}\n","import { mkdir, writeFile, access } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { Locale } from \"../i18n/index.js\";\nimport { polyTemplates } from \"./templates.js\";\n\nexport interface ScaffoldResult {\n /** Files written, as `.poly/`-prefixed forward-slash paths. */\n created: string[];\n /** Files left untouched because they already existed (without `--force`). */\n skipped: string[];\n}\n\n/**\n * Scaffold the `.poly/` workspace in `workspace`. Idempotent: existing files are\n * preserved unless `force` is set. Creates parent directories as needed.\n */\nexport async function scaffoldPoly(\n workspace: string,\n opts: { force?: boolean; locale: Locale },\n): Promise<ScaffoldResult> {\n const templates = polyTemplates(opts.locale);\n const created: string[] = [];\n const skipped: string[] = [];\n\n for (const [rel, content] of Object.entries(templates)) {\n const display = `.poly/${rel}`;\n const abs = join(workspace, \".poly\", ...rel.split(\"/\"));\n if (!opts.force && (await exists(abs))) {\n skipped.push(display);\n continue;\n }\n await mkdir(dirname(abs), { recursive: true });\n await writeFile(abs, content, \"utf8\");\n created.push(display);\n }\n\n return { created, skipped };\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","import type { Locale } from \"../i18n/index.js\";\n\n/**\n * The files written by `polypus init`, keyed by their path relative to `.poly/`.\n * Content is locale-aware so a scaffolded workspace reads naturally in the user's\n * language. Keep these lean — they are starting points, not exhaustive docs.\n */\nexport function polyTemplates(locale: Locale): Record<string, string> {\n return locale === \"pt-BR\" ? PT : EN;\n}\n\nconst EN: Record<string, string> = {\n \"agents.md\": `# agents.md — how an AI agent operates this repo\n\n> Local workspace under \\`.poly/\\`. Conditions any AI agent (Polypus, Claude, …)\n> to work the way this project expects. **Polypus loads this file automatically**\n> into the agent's system prompt on every run, so keep it accurate and lean.\n\n## Role\n\nYou implement changes end to end — from understanding the task to a reviewable\nresult — respecting the rules below.\n\n## Golden rules\n\n1. Green before a PR: the project builds, type-checks and tests pass.\n2. Keep docs/changelog in sync with behavior changes.\n3. Confirm before irreversible actions (publishing, deleting, force-pushing).\n4. Small, targeted changes over broad rewrites.\n\n## Skills index\n\n| Skill | When to use |\n|-------|-------------|\n| [skills/coding.md](skills/coding.md) | Technical standards for any code change |\n| [skills/spec-driven.md](skills/spec-driven.md) | Write a spec before non-trivial work |\n\n## Environment\n\n- Describe the OS, shell, package manager and any tooling the agent needs.\n- Note where credentials/CLIs live and how commands are run.\n`,\n\n \"README.md\": `# .poly — your project's AI operating manual\n\n\\`.poly/\\` is a small, local workspace that teaches AI agents how to work in THIS\nrepository. Gitignore it to keep it personal, or commit it to standardize the\nworkflow across your team.\n\n## What's inside\n\n- **\\`agents.md\\`** — the entry point: role, golden rules and an index of skills.\n Polypus loads it automatically into the agent's system prompt on every run.\n- **\\`skills/\\`** — focused how-to guides the agent reads when relevant.\n- **\\`templates/spec.md\\`** — a lean Spec-Driven Development (SDD) template.\n\n## How it works\n\n1. You describe a task to the agent.\n2. The agent reads \\`agents.md\\`, follows the golden rules and opens the skills it needs.\n3. For non-trivial work, it writes a spec first from \\`templates/spec.md\\`.\n\n## Extend it\n\n- Edit \\`agents.md\\` to encode your conventions.\n- Add one skill file per recurring workflow (releases, reviews, migrations…).\n- Reference new skills from \\`agents.md\\` so the agent can discover them.\n\nRegenerate any missing files with \\`polypus init\\` (existing files are preserved;\nuse \\`--force\\` to overwrite).\n`,\n\n \"skills/coding.md\": `# skill: coding\n\nTechnical standards for changes in this repo.\n\n## Principles\n\n- Match the style, naming and structure of the surrounding code.\n- Prefer small, targeted edits over broad rewrites.\n- Add or update tests with every behavior change.\n\n## Checklist before opening a PR\n\n- [ ] Builds and type-checks\n- [ ] Tests pass\n- [ ] Docs / changelog updated when behavior changed\n`,\n\n \"skills/spec-driven.md\": `# skill: spec-driven development\n\nFor anything non-trivial, write a short spec BEFORE coding.\n\n## Flow\n\n1. Copy \\`templates/spec.md\\` into your issue (or \\`specs/<slug>.md\\`).\n2. Fill **Why / What / Acceptance criteria / Out of scope**.\n3. Get a thumbs-up, then implement to the acceptance criteria.\n4. Keep the spec updated if scope changes.\n\nLean by design: if a section is empty, delete it.\n`,\n\n \"templates/spec.md\": `# Spec: <title>\n\n> Status: draft · Owner: <name> · Updated: <yyyy-mm-dd>\n\n## Why\n\nWhat problem are we solving, and for whom? Why now?\n\n## What\n\nThe change in plain terms — the behavior a user will actually see.\n\n## Acceptance criteria\n\n- [ ] Observable outcome 1\n- [ ] Observable outcome 2\n\n## Out of scope\n\n- Things we are explicitly NOT doing here.\n\n## Notes / open questions\n\n- …\n`,\n};\n\nconst PT: Record<string, string> = {\n \"agents.md\": `# agents.md — como um agente de IA opera este repositório\n\n> Workspace local em \\`.poly/\\`. Condiciona qualquer agente de IA (Polypus, Claude…)\n> a trabalhar do jeito que este projeto espera. **O Polypus carrega este arquivo\n> automaticamente** no system prompt do agente a cada execução — mantenha-o\n> preciso e enxuto.\n\n## Papel\n\nVocê implementa mudanças de ponta a ponta — do entendimento da tarefa a um\nresultado revisável — respeitando as regras abaixo.\n\n## Regras de ouro\n\n1. Verde antes do PR: o projeto builda, passa no type-check e nos testes.\n2. Mantenha docs/changelog em sincronia com mudanças de comportamento.\n3. Confirme antes de ações irreversíveis (publicar, deletar, force-push).\n4. Mudanças pequenas e focadas em vez de reescritas amplas.\n\n## Índice de skills\n\n| Skill | Quando usar |\n|-------|-------------|\n| [skills/coding.md](skills/coding.md) | Padrões técnicos para qualquer mudança de código |\n| [skills/spec-driven.md](skills/spec-driven.md) | Escrever um spec antes de trabalho não-trivial |\n\n## Ambiente\n\n- Descreva SO, shell, gerenciador de pacotes e ferramentas que o agente precisa.\n- Anote onde ficam credenciais/CLIs e como os comandos são executados.\n`,\n\n \"README.md\": `# .poly — o manual de operação de IA do seu projeto\n\nO \\`.poly/\\` é um workspace local e pequeno que ensina agentes de IA a trabalhar\nNESTE repositório. Coloque no .gitignore para mantê-lo pessoal, ou commite para\npadronizar o fluxo entre o time.\n\n## O que tem dentro\n\n- **\\`agents.md\\`** — o ponto de entrada: papel, regras de ouro e um índice de skills.\n O Polypus carrega ele automaticamente no system prompt do agente a cada execução.\n- **\\`skills/\\`** — guias práticos e focados que o agente lê quando relevante.\n- **\\`templates/spec.md\\`** — um template enxuto de Spec-Driven Development (SDD).\n\n## Como funciona\n\n1. Você descreve uma tarefa ao agente.\n2. O agente lê o \\`agents.md\\`, segue as regras de ouro e abre as skills necessárias.\n3. Para trabalho não-trivial, escreve um spec primeiro a partir de \\`templates/spec.md\\`.\n\n## Como estender\n\n- Edite o \\`agents.md\\` para codificar suas convenções.\n- Adicione um arquivo de skill por fluxo recorrente (releases, reviews, migrações…).\n- Referencie as novas skills no \\`agents.md\\` para o agente descobri-las.\n\nRegenere arquivos que faltarem com \\`polypus init\\` (os existentes são preservados;\nuse \\`--force\\` para sobrescrever).\n`,\n\n \"skills/coding.md\": `# skill: coding\n\nPadrões técnicos para mudanças neste repositório.\n\n## Princípios\n\n- Siga o estilo, a nomenclatura e a estrutura do código ao redor.\n- Prefira edições pequenas e focadas a reescritas amplas.\n- Adicione ou atualize testes a cada mudança de comportamento.\n\n## Checklist antes de abrir um PR\n\n- [ ] Builda e passa no type-check\n- [ ] Testes passam\n- [ ] Docs / changelog atualizados quando o comportamento mudou\n`,\n\n \"skills/spec-driven.md\": `# skill: spec-driven development\n\nPara qualquer coisa não-trivial, escreva um spec curto ANTES de codar.\n\n## Fluxo\n\n1. Copie \\`templates/spec.md\\` para a issue (ou \\`specs/<slug>.md\\`).\n2. Preencha **Por quê / O quê / Critérios de aceite / Fora de escopo**.\n3. Valide com um \"ok\", então implemente até os critérios de aceite.\n4. Mantenha o spec atualizado se o escopo mudar.\n\nEnxuto por design: se uma seção ficar vazia, apague-a.\n`,\n\n \"templates/spec.md\": `# Spec: <título>\n\n> Status: rascunho · Dono: <nome> · Atualizado: <aaaa-mm-dd>\n\n## Por quê\n\nQue problema estamos resolvendo, e para quem? Por que agora?\n\n## O quê\n\nA mudança em termos simples — o comportamento que o usuário vai realmente ver.\n\n## Critérios de aceite\n\n- [ ] Resultado observável 1\n- [ ] Resultado observável 2\n\n## Fora de escopo\n\n- Coisas que explicitamente NÃO faremos aqui.\n\n## Notas / dúvidas em aberto\n\n- …\n`,\n};\n","import pc from \"picocolors\";\nimport * as p from \"@clack/prompts\";\nimport { loadConfig, resolveSecret } from \"../../core/config/store.js\";\nimport {\n filterModels,\n fmtContext,\n fmtPrice,\n listOpenRouterModels,\n type ModelSort,\n type OpenRouterModel,\n} from \"../../core/providers/openrouter.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\nexport interface ModelsCliOptions {\n search?: string;\n tools?: boolean;\n free?: boolean;\n maxPrice?: string;\n sort?: string;\n limit?: string;\n}\n\n/** `polypus models` — list OpenRouter models with filters. */\nexport async function models(opts: ModelsCliOptions): Promise<void> {\n const apiKey = await resolveOpenRouterKey();\n\n const spin = p.spinner();\n spin.start(t(\"models.fetching\"));\n let all: OpenRouterModel[];\n try {\n all = await listOpenRouterModels(apiKey);\n spin.stop(pc.green(\"✓ OpenRouter\"));\n } catch (err) {\n spin.stop(pc.red(t(\"models.fetchError\", { msg: (err as Error).message })), 2);\n return;\n }\n\n const filtered = filterModels(all, {\n search: opts.search,\n tools: opts.tools ? \"tools\" : \"any\",\n freeOnly: Boolean(opts.free),\n maxPrice: opts.maxPrice !== undefined ? Number(opts.maxPrice) : undefined,\n sort: (opts.sort as ModelSort) ?? \"price\",\n });\n\n const limit = opts.limit ? Number(opts.limit) : 30;\n printModelsTable(filtered, limit, all.length);\n}\n\n/** Render a colored, aligned table of models. Exported for reuse by the wizard. */\nexport function printModelsTable(models: OpenRouterModel[], limit: number, total: number): void {\n console.log(pc.dim(t(\"models.legend\")));\n if (models.length === 0) {\n console.log(pc.yellow(t(\"models.none\")));\n return;\n }\n\n const rows = models.slice(0, limit);\n console.log(\n \" \" +\n pc.dim(t(\"models.colTools\").padEnd(6)) +\n pc.dim(t(\"models.colPrice\").padEnd(16)) +\n pc.dim(t(\"models.colCtx\").padEnd(9)) +\n pc.dim(t(\"models.colModel\")),\n );\n for (const m of rows) {\n console.log(\" \" + modelRow(m));\n }\n console.log(pc.dim(\"\\n\" + t(\"models.shown\", { shown: rows.length, total })));\n}\n\nfunction modelRow(m: OpenRouterModel): string {\n const tools = m.supportsTools ? pc.green(\"🛠\".padEnd(5)) : pc.dim(\"—\".padEnd(5));\n const price = `${fmtPrice(m.promptPrice)}/${fmtPrice(m.completionPrice)}`;\n const priceColored = (m.free ? pc.green : pc.yellow)(price.padEnd(16));\n const ctx = pc.cyan(fmtContext(m.contextLength).padEnd(9));\n return `${tools} ${priceColored}${ctx}${pc.bold(m.id)}`;\n}\n\n/** Best-effort OpenRouter key: env first, then a configured openrouter agent. */\nasync function resolveOpenRouterKey(): Promise<string | undefined> {\n if (process.env.OPENROUTER_API_KEY) return process.env.OPENROUTER_API_KEY;\n try {\n const config = await loadConfig();\n const agent = config.agents.find((a) => a.provider === \"openrouter\" && a.apiKey);\n return agent ? resolveSecret(agent.apiKey) : undefined;\n } catch {\n return undefined;\n }\n}\n","import pc from \"picocolors\";\nimport { aggregateUsage, fmtUsd, type UsageBucket } from \"../../core/agent/usage.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\n/** `polypus usage` — aggregate token/cost analytics per day from the usage log. */\nexport async function usage(): Promise<void> {\n const { days, total } = await aggregateUsage();\n if (days.length === 0) {\n console.log(pc.yellow(t(\"usage.empty\")));\n return;\n }\n console.log(pc.bold(t(\"usage.header\")));\n for (const d of days) console.log(\" \" + formatRow(d));\n console.log(pc.dim(\" \" + \"─\".repeat(40)));\n console.log(\" \" + pc.bold(formatRow({ ...total, date: t(\"usage.total\") })));\n}\n\nfunction formatRow(b: UsageBucket): string {\n const tokens = fmtTokens(b.promptTokens + b.completionTokens);\n return `${b.date.padEnd(12)} ${tokens.padStart(7)} tok ${fmtUsd(b.costUsd).padStart(10)} (${b.runs} ${t(\"usage.runs\")})`;\n}\n\nfunction fmtTokens(n: number): string {\n return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n","import pc from \"picocolors\";\nimport { listSessions } from \"../../core/agent/session-store.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\n/** `polypus sessions` — list saved sessions that can be resumed. */\nexport async function sessions(): Promise<void> {\n const all = await listSessions();\n if (all.length === 0) {\n console.log(pc.yellow(t(\"sessions.empty\")));\n return;\n }\n console.log(pc.bold(t(\"sessions.header\")));\n for (const s of all) {\n const when = s.updatedAt.replace(\"T\", \" \").slice(0, 16);\n console.log(\n ` ${pc.cyan(s.id)} ${pc.dim(when)} ${pc.dim(`[${s.agentName} · ${s.mode} · ${s.messageCount} msgs]`)}`,\n );\n console.log(` ${s.title}`);\n }\n console.log(pc.dim(\"\\n\" + t(\"sessions.hint\")));\n}\n","import pc from \"picocolors\";\nimport { loadConfig, resolveAgent } from \"../../core/config/store.js\";\nimport { createProvider } from \"../../core/providers/registry.js\";\nimport { estimateTask } from \"../../core/agent/estimate.js\";\nimport { resolveModelPricing } from \"../../core/agent/usage.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\nexport interface EstimateOptions {\n agent?: string;\n json?: boolean;\n}\n\n/** `polypus estimate \"<task>\"` — estimate effort/cost without implementing anything. */\nexport async function estimate(task: string, opts: EstimateOptions): Promise<void> {\n const config = await loadConfig();\n const agentConfig = resolveAgent(config, opts.agent);\n const resolved = createProvider(agentConfig);\n const pricing = await resolveModelPricing(resolved.config);\n const est = await estimateTask(task, resolved, pricing);\n\n if (opts.json) {\n process.stdout.write(JSON.stringify({ estimate: est }) + \"\\n\");\n return;\n }\n\n console.log(pc.bold(t(\"estimate.header\")));\n console.log(` ${t(\"estimate.complexity\")}: ${pc.cyan(est.complexity)}`);\n console.log(` ${t(\"estimate.steps\")}: ~${est.estimatedSteps}`);\n console.log(` ${t(\"estimate.tokens\")}: ~${fmtTokens(est.estimatedTokens)}`);\n console.log(` ${t(\"estimate.cost\")}: ${pc.green(est.costLabel)}`);\n if (est.rationale) console.log(pc.dim(` ${est.rationale}`));\n if (est.risks) console.log(pc.dim(` ⚠ ${est.risks}`));\n}\n\nfunction fmtTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n","import type { ResolvedAgent } from \"../providers/registry.js\";\nimport { estimateCost, fmtUsd, type ModelPricing } from \"./usage.js\";\n\nexport type Complexity = \"low\" | \"medium\" | \"high\";\n\nexport interface TaskEstimate {\n complexity: Complexity;\n /** Estimated number of agent steps (tool round-trips) to finish. */\n estimatedSteps: number;\n /** Estimated total tokens across the whole run (prompt + completion, summed). */\n estimatedTokens: number;\n rationale: string;\n risks: string;\n /** Estimated USD cost, when model pricing is known. */\n costUsd?: number;\n /** Human-readable cost (or \"unknown\" when pricing is unavailable). */\n costLabel: string;\n}\n\nconst SYSTEM = [\n \"You estimate the effort for an autonomous coding agent (a ReAct loop that reads/edits files\",\n \"and runs commands over several steps) to implement a software task in an existing repo.\",\n \"Account for the loop re-sending growing context each step. Be realistic, not optimistic.\",\n \"Return ONLY a JSON object, no prose, with exactly these keys:\",\n '{\"complexity\":\"low|medium|high\",\"estimatedSteps\":<int>,\"estimatedTokens\":<int total across all steps>,',\n '\"rationale\":\"<one sentence>\",\"risks\":\"<one sentence>\"}',\n].join(\" \");\n\n/** Extract the first balanced JSON object from a string (tolerant of surrounding prose). */\nfunction extractJsonObject(text: string): Record<string, unknown> | undefined {\n const start = text.indexOf(\"{\");\n if (start === -1) return undefined;\n let depth = 0;\n for (let i = start; i < text.length; i++) {\n if (text[i] === \"{\") depth++;\n else if (text[i] === \"}\" && --depth === 0) {\n try {\n return JSON.parse(text.slice(start, i + 1)) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n }\n }\n return undefined;\n}\n\nfunction clampInt(value: unknown, min: number, max: number, fallback: number): number {\n const n = Math.round(Number(value));\n if (!Number.isFinite(n)) return fallback;\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Ask the agent to estimate the effort/cost of a task (one model call, no tools).\n * The model estimates steps and total tokens; cost is computed deterministically\n * from the model's pricing (assuming an agent loop is ~80% prompt / 20% completion).\n */\nexport async function estimateTask(\n task: string,\n agent: ResolvedAgent,\n pricing?: ModelPricing,\n): Promise<TaskEstimate> {\n const res = await agent.provider.chat({\n messages: [\n { role: \"system\", content: SYSTEM },\n { role: \"user\", content: `Task:\\n${task}` },\n ],\n params: { temperature: 0 },\n });\n const parsed = extractJsonObject(res.content) ?? {};\n\n const complexity: Complexity = [\"low\", \"medium\", \"high\"].includes(parsed.complexity as string)\n ? (parsed.complexity as Complexity)\n : \"medium\";\n const estimatedSteps = clampInt(parsed.estimatedSteps, 1, 300, 30);\n const estimatedTokens = clampInt(parsed.estimatedTokens, 1_000, 20_000_000, 80_000);\n const rationale = typeof parsed.rationale === \"string\" ? parsed.rationale : \"\";\n const risks = typeof parsed.risks === \"string\" ? parsed.risks : \"\";\n\n let costUsd: number | undefined;\n let costLabel = \"unknown (no pricing for this model)\";\n if (pricing) {\n costUsd = estimateCost(\n { promptTokens: Math.round(estimatedTokens * 0.8), completionTokens: Math.round(estimatedTokens * 0.2) },\n pricing,\n );\n costLabel = fmtUsd(costUsd);\n }\n\n return { complexity, estimatedSteps, estimatedTokens, rationale, risks, costUsd, costLabel };\n}\n","import { writeFile, readFile } from \"node:fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport pc from \"picocolors\";\nimport { generatePrd, type IssueInput } from \"../../core/agent/prd.js\";\nimport { resolveFreeProvider, DEFAULT_PRD_MODEL, withRetry } from \"../../core/agent/free-provider.js\";\nimport { numericRef, readStdin, stripBom, readProjectGuide } from \"./cli-io.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\nconst exec = promisify(execFile);\n\nexport interface PrdCliOptions {\n out?: string;\n model?: string;\n /** Read the issue JSON from a file (or \"-\" for stdin) instead of calling gh. */\n input?: string;\n}\n\n/** `polypus prd <issue#>` — generate a PRD from a GitHub issue (non-interactive). */\nexport async function prd(issueRef: string, opts: PrdCliOptions): Promise<void> {\n const issue = await loadIssue(issueRef, opts.input);\n const { provider } = resolveFreeProvider(opts.model ?? DEFAULT_PRD_MODEL);\n\n // Ground the PRD in the project's living summary so output fits the codebase.\n const guide = readProjectGuide([\"context.md\"]);\n const markdown = await withRetry(() => generatePrd(issue, provider, guide));\n\n if (opts.out) {\n await writeFile(opts.out, markdown + \"\\n\", \"utf8\");\n console.error(pc.green(t(\"prd.wrote\", { path: opts.out })));\n } else {\n process.stdout.write(markdown + \"\\n\");\n }\n}\n\n/** Load the issue from --input (JSON file/stdin) or by shelling out to `gh`. */\nasync function loadIssue(issueRef: string, input?: string): Promise<IssueInput> {\n if (input) {\n const raw = input === \"-\" ? await readStdin() : await readFile(input, \"utf8\");\n return normalize(JSON.parse(stripBom(raw)));\n }\n const num = numericRef(issueRef);\n const { stdout } = await exec(\"gh\", [\"issue\", \"view\", num, \"--json\", \"number,title,body,comments\"]);\n const data = normalize(JSON.parse(stdout));\n data.number ??= Number(num);\n return data;\n}\n\n/** Map gh's JSON shape (comments[].author.login) onto IssueInput. */\nfunction normalize(raw: {\n number?: number;\n title?: string;\n body?: string;\n comments?: { author?: { login?: string }; body?: string }[];\n}): IssueInput {\n return {\n number: raw.number,\n title: raw.title ?? \"\",\n body: raw.body ?? \"\",\n comments: (raw.comments ?? []).map((c) => ({ author: c.author?.login, body: c.body ?? \"\" })),\n };\n}\n\n","import type { Message, Provider } from \"../providers/types.js\";\n\nexport interface IssueInput {\n number?: number;\n title: string;\n body: string;\n /** Issue comments, oldest first. */\n comments?: { author?: string; body: string }[];\n}\n\nconst SYSTEM = [\n \"You are a product analyst. You turn a GitHub issue into a concise, structured PRD\",\n \"(Product Requirements Document) in Markdown.\",\n \"Rules:\",\n \"- Use ONLY information present in the issue and its comments. Do NOT invent scope,\",\n \" numbers, deadlines, or stakeholders. If something is unknown, write 'A definir'.\",\n \"- Be objective and short; prefer bullet points over prose.\",\n \"- Write in the same language as the issue (Portuguese if the issue is in Portuguese).\",\n].join(\"\\n\");\n\n/** Build the PRD prompt body from an issue. Exported for testing/inspection. */\nexport function buildPrdPrompt(issue: IssueInput): string {\n const comments = (issue.comments ?? [])\n .map((c, i) => `Comentário ${i + 1}${c.author ? ` (@${c.author})` : \"\"}:\\n${c.body}`)\n .join(\"\\n\\n\");\n return [\n `Issue${issue.number ? ` #${issue.number}` : \"\"}: ${issue.title}`,\n \"\",\n \"Corpo:\",\n issue.body || \"(vazio)\",\n comments ? `\\n${comments}` : \"\",\n \"\",\n \"Gere um PRD com EXATAMENTE estas seções (H2 com ##):\",\n \"## Contexto / Problema\",\n \"## Objetivo\",\n \"## Escopo (in / out)\",\n \"## Requisitos funcionais\",\n \"## Critérios de aceite\",\n \"## Riscos e alternativas\",\n ].join(\"\\n\");\n}\n\n/**\n * Generate a PRD from an issue with a single (no-tool) chat call. Robust on the\n * small free OpenRouter models since input is one issue and output is a document.\n */\nexport async function generatePrd(\n issue: IssueInput,\n provider: Provider,\n projectContext?: string,\n): Promise<string> {\n const messages: Message[] = [{ role: \"system\", content: SYSTEM }];\n if (projectContext) {\n messages.push({\n role: \"system\",\n content: `Project context (for grounding; do not restate verbatim):\\n${projectContext}`,\n });\n }\n messages.push({ role: \"user\", content: buildPrdPrompt(issue) });\n const res = await provider.chat({\n messages,\n params: { maxTokens: 2000, temperature: 0.2 },\n });\n const text = res.content.trim();\n if (!text) throw new Error(\"The model returned an empty PRD.\");\n return text;\n}\n","import type { AgentConfig } from \"../config/schema.js\";\nimport { createProvider, type ResolvedAgent } from \"../providers/registry.js\";\n\n/**\n * Build an OpenRouter provider on demand, keyed off `OPENROUTER_API_KEY` in the\n * environment. Used by the non-interactive `prd` and `review` commands (locally\n * and in CI) so they need no configured agent — just the secret.\n *\n * The model defaults to a free OpenRouter model; callers pass an explicit model\n * (CLI `--model` or a `POLYPUS_*_MODEL` env override) to change it.\n */\nexport function resolveFreeProvider(model: string): ResolvedAgent {\n if (!process.env.OPENROUTER_API_KEY) {\n throw new Error(\n \"OPENROUTER_API_KEY is not set. Export it (or add it as a repo secret in CI) before running this command.\",\n );\n }\n const config: AgentConfig = {\n name: \"openrouter-free\",\n provider: \"openrouter\",\n model,\n apiKey: \"${OPENROUTER_API_KEY}\",\n toolMode: \"native\",\n };\n return createProvider(config);\n}\n\n/** Default free models per task; overridable via env then CLI `--model`. */\nexport const DEFAULT_PRD_MODEL = process.env.POLYPUS_PRD_MODEL ?? \"openai/gpt-oss-120b:free\";\nexport const DEFAULT_REVIEW_MODEL = process.env.POLYPUS_REVIEW_MODEL ?? \"openai/gpt-oss-120b:free\";\n\n/**\n * Retry a flaky call with exponential backoff. Free OpenRouter models are\n * heavily rate-limited (HTTP 429), so a couple of retries make the CLI/CI runs\n * far more reliable. Only transient errors (429, 5xx, network) are retried.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n opts: { attempts?: number; baseMs?: number } = {},\n): Promise<T> {\n const attempts = opts.attempts ?? 4;\n const baseMs = opts.baseMs ?? 2000;\n let lastErr: unknown;\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n const msg = (err as Error)?.message ?? \"\";\n const transient = /\\b429\\b|\\b5\\d\\d\\b|rate|timeout|ETIMEDOUT|ECONNRESET|EAI_AGAIN/i.test(msg);\n if (!transient || i === attempts - 1) throw err;\n await new Promise((r) => setTimeout(r, baseMs * 2 ** i));\n }\n }\n throw lastErr;\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { t } from \"../../core/i18n/index.js\";\n\n/** Max chars of project guide files fed to the PRD/review bots (keeps prompts bounded). */\nconst GUIDE_MAX = 12_000;\n\n/**\n * Read project guide files (e.g. `context.md`, `rules.md`) from the workspace\n * to ground the PRD/review bots. Returns undefined when none exist, and caps the\n * combined size so a large file can't blow the model's context window.\n */\nexport function readProjectGuide(files: string[]): string | undefined {\n const parts: string[] = [];\n for (const file of files) {\n try {\n const path = resolve(process.cwd(), file);\n if (existsSync(path)) parts.push(`# ${file}\\n${readFileSync(path, \"utf8\").trim()}`);\n } catch {\n /* ignore unreadable files */\n }\n }\n if (parts.length === 0) return undefined;\n const joined = parts.join(\"\\n\\n\");\n return joined.length > GUIDE_MAX ? joined.slice(0, GUIDE_MAX) + \"\\n…(truncated)\" : joined;\n}\n\n/** Strip a leading `#` and assert the ref is a bare issue/PR number. */\nexport function numericRef(ref: string): string {\n const num = ref.replace(/^#/, \"\");\n if (!/^\\d+$/.test(num)) throw new Error(t(\"cli.invalidRef\", { ref }));\n return num;\n}\n\n/**\n * Read all of stdin as UTF-8. Fails fast when stdin is a TTY (i.e. `--input -`\n * was passed with no pipe), which would otherwise hang waiting for input.\n */\nexport async function readStdin(): Promise<string> {\n if (process.stdin.isTTY) throw new Error(t(\"cli.stdinTty\"));\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\n/** Drop a leading UTF-8 BOM that some shells/files prepend, which breaks JSON.parse. */\nexport function stripBom(s: string): string {\n return s.charCodeAt(0) === 0xfeff ? s.slice(1) : s;\n}\n","import { writeFile, readFile } from \"node:fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport pc from \"picocolors\";\nimport { reviewDiff, type PrMeta } from \"../../core/agent/review.js\";\nimport { resolveFreeProvider, DEFAULT_REVIEW_MODEL, withRetry } from \"../../core/agent/free-provider.js\";\nimport { numericRef, readStdin, readProjectGuide } from \"./cli-io.js\";\nimport { t } from \"../../core/i18n/index.js\";\n\nconst exec = promisify(execFile);\n\nexport interface ReviewCliOptions {\n out?: string;\n model?: string;\n /** Read the diff from a file (or \"-\" for stdin) instead of calling gh. */\n input?: string;\n}\n\n/** `polypus review <pr#>` — review a PR diff with a free model (non-interactive). */\nexport async function review(prRef: string, opts: ReviewCliOptions): Promise<void> {\n const num = opts.input ? prRef.replace(/^#/, \"\") : numericRef(prRef);\n const diff = await loadDiff(num, opts.input);\n const meta = await loadMeta(num, opts.input);\n const { provider } = resolveFreeProvider(opts.model ?? DEFAULT_REVIEW_MODEL);\n\n // Review against the project's conventions and summary when available.\n const guide = readProjectGuide([\"rules.md\", \"context.md\"]);\n const markdown = await withRetry(() => reviewDiff(diff, meta, provider, guide));\n\n if (opts.out) {\n await writeFile(opts.out, markdown + \"\\n\", \"utf8\");\n console.error(pc.green(t(\"review.wrote\", { path: opts.out })));\n } else {\n process.stdout.write(markdown + \"\\n\");\n }\n}\n\n/** Diff from --input (file/stdin) or `gh pr diff`. */\nasync function loadDiff(num: string, input?: string): Promise<string> {\n if (input) return input === \"-\" ? readStdin() : readFile(input, \"utf8\");\n const { stdout } = await exec(\"gh\", [\"pr\", \"diff\", num]);\n return stdout;\n}\n\n/** PR title/body from `gh pr view`; skipped (placeholder) when reading --input. */\nasync function loadMeta(num: string, input?: string): Promise<PrMeta> {\n if (input) return { number: Number(num) || undefined, title: `PR ${num}`, body: \"\" };\n const { stdout } = await exec(\"gh\", [\"pr\", \"view\", num, \"--json\", \"number,title,body\"]);\n const raw = JSON.parse(stdout) as { number?: number; title?: string; body?: string };\n return { number: raw.number, title: raw.title ?? \"\", body: raw.body ?? \"\" };\n}\n","import type { Message, Provider } from \"../providers/types.js\";\n\nexport interface PrMeta {\n number?: number;\n title: string;\n body: string;\n}\n\n/**\n * Diffs above this many chars are truncated so they fit a free model's context.\n * Override with POLYPUS_MAX_DIFF_CHARS for models with a smaller window.\n */\nexport const MAX_DIFF_CHARS = Number(process.env.POLYPUS_MAX_DIFF_CHARS) || 60_000;\n\nconst SYSTEM = [\n \"You are a senior code reviewer. Review the pull request diff below and report\",\n \"concrete findings in Markdown.\",\n \"Rules:\",\n \"- Focus on correctness bugs, security risks, and clear, actionable improvements.\",\n \"- Reference file paths (and line hints when visible) so findings are easy to locate.\",\n \"- Be concise. Skip style nitpicks unless they hide a real problem.\",\n \"- If there are no relevant problems, say so briefly instead of inventing issues.\",\n \"- Write in the same language as the PR description (Portuguese if it is in Portuguese).\",\n].join(\"\\n\");\n\n/** Clip an oversized diff, keeping the head and noting how much was dropped. */\nexport function clampDiff(diff: string, max = MAX_DIFF_CHARS): string {\n if (diff.length <= max) return diff;\n const dropped = diff.length - max;\n return `${diff.slice(0, max)}\\n\\n… [diff truncado: ${dropped} caracteres omitidos para caber no contexto do modelo]`;\n}\n\n/** Build the review prompt body. Exported for testing/inspection. */\nexport function buildReviewPrompt(diff: string, meta: PrMeta): string {\n return [\n `PR${meta.number ? ` #${meta.number}` : \"\"}: ${meta.title}`,\n \"\",\n \"Descrição:\",\n meta.body || \"(vazia)\",\n \"\",\n \"Diff:\",\n \"```diff\",\n clampDiff(diff),\n \"```\",\n \"\",\n \"Liste os achados agrupados por severidade (🔴 bug, 🟡 atenção, 🟢 sugestão).\",\n ].join(\"\\n\");\n}\n\n/**\n * Review a PR diff with a single (no-tool) chat call. Returns Markdown suitable\n * for posting as a PR comment.\n */\nexport async function reviewDiff(\n diff: string,\n meta: PrMeta,\n provider: Provider,\n projectGuide?: string,\n): Promise<string> {\n if (!diff.trim()) return \"_Sem alterações no diff para revisar._\";\n const messages: Message[] = [{ role: \"system\", content: SYSTEM }];\n if (projectGuide) {\n messages.push({\n role: \"system\",\n content: `Project context and conventions to review against:\\n${projectGuide}`,\n });\n }\n messages.push({ role: \"user\", content: buildReviewPrompt(diff, meta) });\n const res = await provider.chat({\n messages,\n params: { maxTokens: 1500, temperature: 0.2 },\n });\n const text = res.content.trim();\n if (!text) throw new Error(\"The model returned an empty review.\");\n return text;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\n\n/**\n * Minimal .env loader. Reads simple KEY=VALUE lines and sets them on\n * process.env *without* overriding variables already present in the real\n * environment. This lets Polypus pick up keys (e.g. OPENROUTER_API_KEY) from\n * ~/.polypus/.env regardless of how the OS propagates user env vars to shells.\n */\nexport function loadDotenv(paths: string[]): void {\n for (const path of paths) {\n if (!existsSync(path)) continue;\n let text: string;\n try {\n text = readFileSync(path, \"utf8\");\n } catch {\n continue;\n }\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const eq = line.indexOf(\"=\");\n if (eq === -1) continue;\n const key = line.slice(0, eq).trim();\n let value = line.slice(eq + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (key && process.env[key] === undefined) process.env[key] = value;\n }\n }\n}\n"],"mappings":"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","names":["pc","pc","pc","pc","pc","pc","p","t","text","t","usage","readFile","resolve","p","text","text","i","j","k","readFile","resolve","t","text","t","readFile","writeFile","resolve","z","resolve","z","Args","readFile","resolve","z","Args","z","Args","stdout","readdir","readFile","join","resolve","z","Args","z","MAX_OUTPUT","resolve","readdir","join","readFile","mkdir","writeFile","resolve","z","Args","t","readFile","readdir","dirname","resolve","text","center","readFile","join","MAX_CHARS","text","exec","readFile","join","promisify","z","execAsync","text","usage","note","t","readdir","readFile","stat","resolve","tokens","resolve","stat","readdir","readFile","exec","readFile","resolve","promisify","execAsync","MAX_OUTPUT","stdout","clamp","mkdir","readFile","join","models","models","usage","join","mkdir","text","readFile","mkdir","readFile","readdir","writeFile","join","join","mkdir","writeFile","readFile","readdir","text","exec","readFile","readdir","join","promisify","z","execAsync","MAX_OUTPUT","stdout","clamp","readFile","join","z","text","p","resolve","z","MAX_OUTPUT","readFile","join","text","text","pc","pc","pc","models","pc","require","pad","text","pc","text","resolve","pc","removeAgent","pc","join","idleTimeoutMs","text","RESET","stdin","pc","cancel","RESET","FRAMES","pc","resolved","spinner","cancel","usage","text","pc","mkdir","writeFile","dirname","join","join","mkdir","dirname","writeFile","pc","pc","p","pc","models","pc","pc","tokens","fmtTokens","pc","pc","pc","text","pc","fmtTokens","writeFile","readFile","promisify","pc","SYSTEM","text","existsSync","resolve","resolve","existsSync","exec","promisify","writeFile","pc","readFile","normalize","stdout","writeFile","readFile","execFile","promisify","pc","SYSTEM","text","exec","promisify","execFile","writeFile","pc","readFile","stdout","join","existsSync","readFileSync","text","pc","join"]}