tagteam 0.4.5 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -469,13 +469,13 @@ var AGENTS = {
469
469
  installUrl: "https://docs.anthropic.com/en/docs/claude-code",
470
470
  org: "Anthropic",
471
471
  profile: {
472
- strength: "architecture-implementation",
473
- role: "The Builder",
472
+ strength: "structure-synthesis",
473
+ role: "The Architect",
474
474
  focus: [
475
- "multi-file coherence and refactoring",
476
- "production-quality implementation",
477
- "design patterns and maintainability",
478
- "comprehensive working solutions"
475
+ "structural coherence and organization",
476
+ "concrete actionable proposals",
477
+ "practical feasibility and constraints",
478
+ "synthesizing competing requirements"
479
479
  ]
480
480
  },
481
481
  run: runClaude
@@ -488,13 +488,13 @@ var AGENTS = {
488
488
  installUrl: "https://github.com/openai/codex",
489
489
  org: "OpenAI",
490
490
  profile: {
491
- strength: "correctness-verification",
492
- role: "The Verifier",
491
+ strength: "rigor-verification",
492
+ role: "The Critic",
493
493
  focus: [
494
- "algorithmic correctness and edge cases",
495
- "test coverage and failure modes",
496
- "standards compliance and best practices",
497
- "performance characteristics and benchmarks"
494
+ "logical correctness and counterexamples",
495
+ "edge cases and failure modes",
496
+ "evidential standards and precision of definitions",
497
+ "identifying unsupported claims and assumptions"
498
498
  ]
499
499
  },
500
500
  run: runCodex
@@ -510,10 +510,10 @@ var AGENTS = {
510
510
  strength: "context-strategy",
511
511
  role: "The Strategist",
512
512
  focus: [
513
- "broad codebase context and upstream/downstream effects",
514
- "current ecosystem conventions and documentation",
515
- "architectural fit and scope assessment",
516
- "planning, decomposition, and tradeoff analysis"
513
+ "broader context and upstream/downstream implications",
514
+ "alternative framings and perspectives",
515
+ "scope assessment and tradeoff analysis",
516
+ "planning, decomposition, and long-term effects"
517
517
  ]
518
518
  },
519
519
  run: runGemini
@@ -521,20 +521,20 @@ var AGENTS = {
521
521
  };
522
522
  var PEER_ROLES = {
523
523
  "claude,codex": {
524
- claude: "Correctness & Standards \u2014 they verify edge cases, test coverage, and standards compliance",
525
- codex: "Architecture & Implementation \u2014 they propose complete solutions and assess structural coherence",
524
+ claude: "Rigor & Verification \u2014 they stress-test logic, find counterexamples, and demand evidence",
525
+ codex: "Structure & Synthesis \u2014 they propose coherent solutions, integrate constraints, and ensure feasibility",
526
526
  gemini: ""
527
527
  // not in this pair
528
528
  },
529
529
  "claude,gemini": {
530
- claude: "Strategic Context \u2014 they assess broad codebase fit, ecosystem conventions, and architectural tradeoffs",
531
- gemini: "Architecture & Implementation \u2014 they propose complete solutions and assess structural coherence",
530
+ claude: "Context & Strategy \u2014 they assess broader implications, alternative framings, and upstream/downstream effects",
531
+ gemini: "Structure & Synthesis \u2014 they propose coherent solutions, integrate constraints, and ensure feasibility",
532
532
  codex: ""
533
533
  // not in this pair
534
534
  },
535
535
  "codex,gemini": {
536
- codex: "Strategic Context \u2014 they assess broad codebase fit, ecosystem conventions, and architectural tradeoffs",
537
- gemini: "Correctness & Standards \u2014 they verify edge cases, test coverage, and standards compliance",
536
+ codex: "Context & Strategy \u2014 they assess broader implications, alternative framings, and upstream/downstream effects",
537
+ gemini: "Rigor & Verification \u2014 they stress-test logic, find counterexamples, and demand evidence",
538
538
  claude: ""
539
539
  // not in this pair
540
540
  }
@@ -807,7 +807,7 @@ function formatConversationHistory(messages) {
807
807
  }).join("\n\n");
808
808
  }
809
809
  function basePrompt() {
810
- return `You are one of two expert coding agents in a structured technical discussion.
810
+ return `You are one of two expert analysts in a structured discussion.
811
811
  You will independently analyze the problem, then engage in focused rounds of
812
812
  critique and refinement with your peer.
813
813
 
@@ -825,42 +825,41 @@ Ground rules:
825
825
  may reveal genuine blind spots in yours \u2014 and vice versa.`;
826
826
  }
827
827
  var ROLE_TEMPLATES = {
828
- claude: `Your role: Architecture & Implementation Reviewer.
828
+ claude: `Your role: Structure & Synthesis Analyst.
829
829
 
830
830
  Focus your analysis on:
831
- - Code structure, design patterns, and maintainability
832
- - Multi-file coherence \u2014 how changes ripple across the codebase
833
- - Production readiness \u2014 error handling, logging, edge cases in real usage
834
- - Proposing complete, working implementations (not just pseudocode)
831
+ - Structural coherence \u2014 how do the parts of the proposal fit together?
832
+ - Concrete actionable proposals \u2014 not just critique, but workable solutions
833
+ - Practical feasibility \u2014 what constraints exist and how to work within them?
834
+ - Synthesizing competing requirements into a coherent recommendation
835
835
 
836
- When you propose a solution, provide the actual implementation. When you
836
+ When you propose a solution, present it concretely with specifics. When you
837
837
  critique, point to specific structural issues and show what the fix looks
838
838
  like. Your peer's role is {peerRole} \u2014 they will stress-test your proposals
839
839
  from a different angle.`,
840
- codex: `Your role: Correctness & Standards Reviewer.
840
+ codex: `Your role: Rigor & Verification Analyst.
841
841
 
842
842
  Focus your analysis on:
843
- - Algorithmic correctness \u2014 does the logic actually work for all inputs?
844
- - Edge cases and failure modes \u2014 what breaks, what's untested?
845
- - Standards compliance \u2014 does this follow language/framework conventions?
846
- - Performance characteristics \u2014 time/space complexity, benchmarks
843
+ - Logical correctness \u2014 does the reasoning actually hold in all cases?
844
+ - Counterexamples and edge cases \u2014 what scenarios break the argument?
845
+ - Evidential standards \u2014 are claims supported by data, examples, or references?
846
+ - Precision of definitions \u2014 are key terms and assumptions clearly stated?
847
847
 
848
- When you critique, provide specific test cases or inputs that demonstrate
849
- the issue. When you propose alternatives, explain the correctness guarantees.
848
+ When you critique, provide specific counterexamples or scenarios that demonstrate
849
+ the issue. When you propose alternatives, explain the logical guarantees.
850
850
  Your peer's role is {peerRole} \u2014 they will focus on different aspects of the
851
851
  same problem.`,
852
- gemini: `Your role: Strategic Context Analyst.
852
+ gemini: `Your role: Context & Strategy Analyst.
853
853
 
854
854
  Focus your analysis on:
855
- - Broad codebase context \u2014 how does this change fit the larger system?
856
- - Current ecosystem conventions \u2014 what do the docs, community, and recent
857
- releases recommend?
855
+ - Broader context \u2014 how does this fit within the larger picture?
856
+ - Alternative framings \u2014 what perspectives or approaches are being overlooked?
858
857
  - Upstream and downstream effects \u2014 what will this break or enable elsewhere?
859
858
  - Scope and planning \u2014 is this the right approach at the right level of
860
859
  abstraction?
861
860
 
862
861
  When you critique, ground your position in the broader context your peer may
863
- be missing. When you propose alternatives, explain the architectural tradeoffs.
862
+ be missing. When you propose alternatives, explain the tradeoffs involved.
864
863
  Your peer's role is {peerRole} \u2014 they will focus on different aspects of the
865
864
  same problem.`
866
865
  };
@@ -888,7 +887,7 @@ For this round:
888
887
  2. What is the weakest point, or what claim lacks supporting evidence?
889
888
  3. Has your position changed? State one of: HELD / PARTIALLY_CHANGED / CHANGED
890
889
  \u2014 with explicit reasoning for why.
891
- 4. If proposing code, show the specific implementation and explain tradeoffs
890
+ 4. If proposing a solution, present it concretely and explain tradeoffs
892
891
  versus your peer's approach.
893
892
  5. Confidence in your current position: LOW | MEDIUM | HIGH
894
893
 
@@ -905,8 +904,8 @@ This is a structured discussion aimed at reaching a well-reasoned position
905
904
  through genuine deliberation.
906
905
 
907
906
  Additional rules for discussion mode:
908
- - Structure your arguments: STATE your claim, provide EVIDENCE (code examples,
909
- documentation, benchmarks), explain your REASONING connecting evidence to
907
+ - Structure your arguments: STATE your claim, provide EVIDENCE (specific examples,
908
+ data, references), explain your REASONING connecting evidence to
910
909
  claim, and note CAVEATS (when your claim doesn't hold).
911
910
  - Express confidence: end your response with CONFIDENCE: HIGH | MEDIUM | LOW
912
911
  and a one-line explanation of what would change your mind.
@@ -1112,11 +1111,12 @@ ${recentFiles}`);
1112
1111
  }
1113
1112
  return parts.join("\n\n");
1114
1113
  }
1115
- var EXPANSION_SYSTEM_PROMPT = `You are a prompt expansion assistant for a multi-agent coding tool. Your job is to rewrite terse user prompts into specific, actionable versions.
1114
+ var EXPANSION_SYSTEM_PROMPT = `You are a prompt expansion assistant for a multi-agent discussion tool. Your job is to rewrite terse user prompts into specific, actionable versions.
1116
1115
 
1117
1116
  Rules:
1118
1117
  - Preserve the user's intent exactly \u2014 do not add requirements they didn't ask for
1119
- - Make implicit context explicit using the project information provided
1118
+ - If project context is provided AND the prompt is related to it, enrich the prompt with project-specific details (file paths, dependencies, conventions)
1119
+ - If the prompt is unrelated to the project context (or no project context is available), expand based on the topic's own domain \u2014 add relevant domain terminology, clarify scope, and make implicit assumptions explicit
1120
1120
  - Keep the expanded prompt to 2-4 sentences
1121
1121
  - Output ONLY the expanded prompt, no preamble or explanation`;
1122
1122
  async function expandPrompt(prompt, agent, cwd, signal) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/ui.tsx","../src/agents/claude.ts","../src/agents/codex.ts","../src/agents/gemini.ts","../src/agents/registry.ts","../src/format.ts","../src/clipboard.ts","../src/gist.ts","../src/db/index.ts","../src/db/sessions.ts","../src/db/messages.ts","../src/prompts.ts","../src/discussion.ts","../src/expand.ts","../src/config-editor.tsx"],"sourcesContent":["import { Command } from \"commander\";\nimport { createRequire } from \"node:module\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport { loadConfig, setConfigValue } from \"./config.js\";\nimport { startApp, showTranscript, showTranscriptMarkdown, showSessionList } from \"./ui.js\";\nimport { startConfigEditor } from \"./config-editor.js\";\nimport type { AgentName } from \"./agents/types.js\";\nimport { getAgent, validateAgentPair } from \"./agents/registry.js\";\nimport {\n getMostRecentSession,\n getSession,\n getSessionByPrefix,\n listSessions,\n deleteSession,\n deleteAllSessions,\n} from \"./db/sessions.js\";\nimport { getMessages } from \"./db/messages.js\";\nimport { closeDb } from \"./db/index.js\";\n\nprocess.on(\"SIGTERM\", () => { closeDb(); process.exit(0); });\nprocess.on(\"SIGINT\", () => { closeDb(); process.exit(0); });\n\nfunction checkCli(name: string, installUrl: string): boolean {\n try {\n execSync(`${name} --version`, { stdio: \"ignore\" });\n return true;\n } catch {\n console.error(\n chalk.red(`\"${name}\" not found. Install it from: ${installUrl}`)\n );\n return false;\n }\n}\n\nfunction preflight(pair: [AgentName, AgentName]): void {\n let allFound = true;\n for (const agent of pair) {\n const descriptor = getAgent(agent);\n if (!checkCli(descriptor.cliBinary, descriptor.installUrl)) {\n allFound = false;\n }\n }\n if (!allFound) {\n process.exit(1);\n }\n}\n\nfunction resolveAgentPair(opts: any, config: ReturnType<typeof loadConfig>): [AgentName, AgentName] {\n if (opts.agents) {\n const names = opts.agents.split(\",\").map((s: string) => s.trim());\n return validateAgentPair(names);\n }\n return validateAgentPair(config.agents);\n}\n\nfunction resolveAgentModels(\n pair: [AgentName, AgentName],\n opts: any,\n config: ReturnType<typeof loadConfig>\n): Record<AgentName, string> {\n return {\n claude: opts.claudeModel ?? config.claude.model,\n codex: opts.codexModel ?? config.codex.model,\n gemini: opts.geminiModel ?? config.gemini.model,\n };\n}\n\nconst program = new Command();\n\nprogram\n .name(\"tagteam\")\n .description(\"Tag Team - Orchestrate AI agents collaboratively\")\n .version(createRequire(import.meta.url)(\"../package.json\").version)\n .option(\"--agents <pair>\", \"Agent pair to use (comma-separated, e.g. claude,gemini)\")\n .option(\"--claude-model <model>\", \"Claude model to use\")\n .option(\"--codex-model <model>\", \"Codex model to use\")\n .option(\"--gemini-model <model>\", \"Gemini model to use\")\n .argument(\"[prompt...]\", \"Prompt to send to both agents\")\n .action(async (promptParts: string[], opts) => {\n const config = loadConfig();\n const pair = resolveAgentPair(opts, config);\n preflight(pair);\n const prompt = promptParts.join(\" \") || undefined;\n\n const instance = startApp({\n initialPrompt: prompt,\n agents: pair,\n agentModels: resolveAgentModels(pair, opts, config),\n config,\n });\n\n await instance.waitUntilExit();\n });\n\n// Discuss - auto-loop until consensus\nprogram\n .command(\"discuss\")\n .description(\"Have agents discuss a topic until they reach consensus\")\n .argument(\"<prompt...>\", \"Topic to discuss\")\n .action(async (promptParts: string[]) => {\n const config = loadConfig();\n const parentOpts = program.opts();\n const pair = resolveAgentPair(parentOpts, config);\n preflight(pair);\n const prompt = promptParts.join(\" \");\n\n const instance = startApp({\n initialPrompt: prompt,\n agents: pair,\n agentModels: resolveAgentModels(pair, parentOpts, config),\n config,\n discuss: true,\n });\n\n await instance.waitUntilExit();\n });\n\n// Continue most recent session\nprogram\n .command(\"continue\")\n .description(\"Resume the most recent session\")\n .action(async () => {\n const config = loadConfig();\n const parentOpts = program.opts();\n const pair = resolveAgentPair(parentOpts, config);\n preflight(pair);\n const session = getMostRecentSession();\n\n if (!session) {\n console.log(chalk.red(\" No active sessions found.\"));\n process.exit(1);\n }\n\n const dbMessages = getMessages(session.id);\n const transcript = dbMessages.map((m) => ({\n id: `${m.round}-${m.role}`,\n role: m.role,\n content: m.content,\n round: m.round,\n }));\n\n const instance = startApp({\n sessionId: session.id,\n agents: pair,\n agentModels: resolveAgentModels(pair, parentOpts, config),\n config,\n showTranscript: transcript,\n });\n\n await instance.waitUntilExit();\n });\n\n// Resume a specific session\nprogram\n .command(\"resume [id]\")\n .description(\"Resume a session by ID, or pick interactively\")\n .action(async (id: string | undefined) => {\n const config = loadConfig();\n const parentOpts = program.opts();\n const pair = resolveAgentPair(parentOpts, config);\n preflight(pair);\n\n if (!id) {\n const sessions = listSessions(20);\n if (sessions.length === 0) {\n console.log(chalk.red(\" No sessions found.\"));\n process.exit(1);\n }\n\n console.log(chalk.bold(\"\\n Recent sessions:\\n\"));\n sessions.forEach((s, i) => {\n const sid = chalk.cyan(s.id.slice(0, 7));\n const title = s.title || chalk.dim(\"(untitled)\");\n const date = chalk.dim(s.updated_at);\n console.log(` ${chalk.dim(`${i + 1}.`)} ${sid} ${title} ${date}`);\n });\n console.log();\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise<void>((resolve) => {\n rl.question(\" Select session number: \", async (input) => {\n rl.close();\n const num = parseInt(input.trim(), 10);\n if (isNaN(num) || num < 1 || num > sessions.length) {\n console.log(chalk.red(\" Invalid selection.\"));\n closeDb();\n resolve();\n return;\n }\n\n const session = sessions[num - 1];\n const dbMessages = getMessages(session.id);\n const transcript = dbMessages.map((m) => ({\n id: `${m.round}-${m.role}`,\n role: m.role,\n content: m.content,\n round: m.round,\n }));\n\n const instance = startApp({\n sessionId: session.id,\n agents: pair,\n agentModels: resolveAgentModels(pair, parentOpts, config),\n config,\n showTranscript: transcript,\n });\n\n await instance.waitUntilExit();\n resolve();\n });\n });\n }\n\n const session = getSession(id) || getSessionByPrefix(id);\n if (!session) {\n console.log(chalk.red(` Session not found: ${id}`));\n process.exit(1);\n }\n\n const dbMessages = getMessages(session.id);\n const transcript = dbMessages.map((m) => ({\n id: `${m.round}-${m.role}`,\n role: m.role,\n content: m.content,\n round: m.round,\n }));\n\n const instance = startApp({\n sessionId: session.id,\n agents: pair,\n agentModels: resolveAgentModels(pair, parentOpts, config),\n config,\n showTranscript: transcript,\n });\n\n await instance.waitUntilExit();\n });\n\n// History\nconst historyCmd = program\n .command(\"history\")\n .description(\"List, remove, or clear sessions\")\n .option(\"-n, --limit <n>\", \"Number of sessions to show\", parseInt, 20)\n .action((opts) => {\n const sessions = listSessions(opts.limit);\n console.log(chalk.bold(\"\\n Recent sessions:\\n\"));\n showSessionList(sessions);\n console.log();\n closeDb();\n });\n\nhistoryCmd\n .command(\"rm <id>\")\n .description(\"Delete a session by ID or prefix\")\n .action((id: string) => {\n const session = getSession(id) || getSessionByPrefix(id);\n if (!session) {\n console.log(chalk.red(` Session not found: ${id}`));\n process.exit(1);\n }\n deleteSession(session.id);\n const sid = session.id.slice(0, 7);\n const title = session.title || \"(untitled)\";\n console.log(chalk.green(` Deleted session ${sid} — ${title}`));\n closeDb();\n });\n\nhistoryCmd\n .command(\"clear\")\n .description(\"Delete all sessions\")\n .action(async () => {\n const sessions = listSessions();\n if (sessions.length === 0) {\n console.log(chalk.yellow(\" No sessions to delete.\"));\n closeDb();\n return;\n }\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(\n chalk.yellow(` Delete all ${sessions.length} session(s)? [y/N] `),\n (answer) => {\n rl.close();\n if (answer.trim().toLowerCase() === \"y\") {\n deleteAllSessions();\n console.log(chalk.green(` Deleted ${sessions.length} session(s).`));\n } else {\n console.log(\" Cancelled.\");\n }\n closeDb();\n }\n );\n });\n\n// Show transcript\nprogram\n .command(\"show <id>\")\n .description(\"Print full transcript for a session\")\n .option(\"-m, --markdown\", \"Output as GitHub-compatible markdown\")\n .action((id: string, opts: { markdown?: boolean }) => {\n const session = getSession(id) || getSessionByPrefix(id);\n if (!session) {\n console.log(chalk.red(` Session not found: ${id}`));\n process.exit(1);\n }\n\n if (opts.markdown) {\n process.stdout.write(showTranscriptMarkdown(session.id));\n } else {\n showTranscript(session.id);\n }\n closeDb();\n });\n\n// Config commands\nconst configCmd = program\n .command(\"config\")\n .description(\"Manage configuration\")\n .action(async () => {\n const instance = startConfigEditor();\n await instance.waitUntilExit();\n });\n\nconfigCmd\n .command(\"edit\")\n .description(\"Interactively edit configuration\")\n .action(async () => {\n const instance = startConfigEditor();\n await instance.waitUntilExit();\n });\n\nconfigCmd\n .command(\"show\")\n .description(\"Show current configuration\")\n .action(() => {\n const config = loadConfig();\n console.log(chalk.bold(\"\\n Configuration:\\n\"));\n console.log(\n chalk.dim(\" agents = \") + chalk.white(config.agents.join(\", \"))\n );\n console.log(\n chalk.dim(\" claude.model = \") + chalk.white(config.claude.model)\n );\n console.log(\n chalk.dim(\" codex.model = \") + chalk.white(config.codex.model)\n );\n console.log(\n chalk.dim(\" gemini.model = \") + chalk.white(config.gemini.model)\n );\n console.log(\n chalk.dim(\" discussion.max_rounds = \") + chalk.white(String(config.discussion.max_rounds))\n );\n console.log(\n chalk.dim(\" expansion.enabled = \") + chalk.white(String(config.expansion.enabled))\n );\n console.log();\n });\n\nconfigCmd\n .command(\"set <key> <value>\")\n .description(\"Set a configuration value\")\n .action((key: string, value: string) => {\n try {\n setConfigValue(key, value);\n console.log(chalk.green(` Set ${key} = ${value}`));\n } catch (e: any) {\n console.log(chalk.red(` ${e.message}`));\n process.exit(1);\n }\n });\n\nprogram.parseAsync();\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse, stringify } from \"smol-toml\";\n\nexport interface TagTeamConfig {\n agents: [string, string];\n claude: {\n model: string;\n };\n codex: {\n model: string;\n };\n gemini: {\n model: string;\n };\n discussion: {\n max_rounds: number;\n };\n expansion: {\n enabled: boolean;\n };\n}\n\nconst DEFAULT_CONFIG: TagTeamConfig = {\n agents: [\"claude\", \"codex\"],\n claude: {\n model: \"sonnet\",\n },\n codex: {\n model: \"gpt-5.3-codex\",\n },\n gemini: {\n model: \"gemini-2.5-pro\",\n },\n discussion: {\n max_rounds: 5,\n },\n expansion: {\n enabled: false,\n },\n};\n\nexport function getConfigDir(): string {\n if (process.platform === \"win32\") {\n return join(\n process.env.APPDATA || join(homedir(), \"AppData\", \"Roaming\"),\n \"tagteam\"\n );\n }\n return join(homedir(), \".tagteam\");\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.toml\");\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nexport function loadConfig(): TagTeamConfig {\n const configPath = getConfigPath();\n\n if (!existsSync(configPath)) {\n return { ...DEFAULT_CONFIG };\n }\n\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = parse(raw) as any;\n return {\n agents: Array.isArray(parsed.agents) && parsed.agents.length === 2\n ? parsed.agents as [string, string]\n : [...DEFAULT_CONFIG.agents],\n claude: { ...DEFAULT_CONFIG.claude, ...parsed.claude },\n codex: { ...DEFAULT_CONFIG.codex, ...parsed.codex },\n gemini: { ...DEFAULT_CONFIG.gemini, ...parsed.gemini },\n discussion: { ...DEFAULT_CONFIG.discussion, ...parsed.discussion },\n expansion: { ...DEFAULT_CONFIG.expansion, ...parsed.expansion },\n };\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport function saveConfig(config: TagTeamConfig): void {\n ensureConfigDir();\n const configPath = getConfigPath();\n writeFileSync(configPath, stringify(config as any), \"utf-8\");\n}\n\nexport function setConfigValue(\n key: string,\n value: string\n): TagTeamConfig {\n const config = loadConfig();\n const parts = key.split(\".\");\n\n if (parts.length === 1) {\n switch (parts[0]) {\n case \"agents\":\n config.agents = value.split(\",\").map((s) => s.trim()) as [string, string];\n break;\n case \"claude_model\":\n config.claude.model = value;\n break;\n case \"codex_model\":\n config.codex.model = value;\n break;\n case \"gemini_model\":\n config.gemini.model = value;\n break;\n case \"discussion_max_rounds\":\n config.discussion.max_rounds = Number(value);\n break;\n case \"expansion_enabled\":\n config.expansion.enabled = value.toLowerCase() === \"true\";\n break;\n default:\n throw new Error(`Unknown config key: ${key}`);\n }\n } else if (parts.length === 2) {\n const [section, field] = parts;\n if (section === \"claude\" && field === \"model\") {\n config.claude.model = value;\n } else if (section === \"codex\" && field === \"model\") {\n config.codex.model = value;\n } else if (section === \"gemini\" && field === \"model\") {\n config.gemini.model = value;\n } else if (section === \"discussion\" && field === \"max_rounds\") {\n config.discussion.max_rounds = Number(value);\n } else if (section === \"expansion\" && field === \"enabled\") {\n config.expansion.enabled = value.toLowerCase() === \"true\";\n } else {\n throw new Error(`Unknown config key: ${key}`);\n }\n } else {\n throw new Error(`Invalid config key format: ${key}`);\n }\n\n saveConfig(config);\n return config;\n}\n","import React, { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { render, Box, Text, useApp, useInput, Static } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport Spinner from \"ink-spinner\";\nimport { marked } from \"marked\";\nimport { markedTerminal } from \"marked-terminal\";\nimport { nanoid } from \"nanoid\";\nimport type { AgentName, AgentResponse } from \"./agents/types.js\";\nimport { getAgent, getAllAgentNames, isValidAgentName } from \"./agents/registry.js\";\nimport { formatAsMarkdown } from \"./format.js\";\nimport { copyToClipboard } from \"./clipboard.js\";\nimport { createGist } from \"./gist.js\";\nimport { createSession, touchSession, updateSessionTitle } from \"./db/sessions.js\";\nimport { insertMessage, getMessages, deleteMessagesFromRound } from \"./db/messages.js\";\nimport { closeDb } from \"./db/index.js\";\nimport {\n collaborationSystemPrompt,\n discussionRoundPrompt,\n debateSystemPrompt,\n debateRoundPrompt,\n steelmanPrompt,\n directPrompt,\n formatConversationHistory,\n} from \"./prompts.js\";\nimport {\n parseRoundAnalysis,\n checkTermination,\n terminationMessage,\n shouldInjectSteelman,\n buildConversationContext,\n analysisToMetadata,\n type DiscussionState,\n} from \"./discussion.js\";\nimport { loadConfig } from \"./config.js\";\nimport type { TagTeamConfig } from \"./config.js\";\nimport { expandPrompt } from \"./expand.js\";\nimport { validateAgentPair } from \"./agents/registry.js\";\nimport { InlineConfigEditor } from \"./config-editor.js\";\n\nmarked.use(markedTerminal() as any);\n\n// --- Types ---\n\ninterface Message {\n id: string;\n role: string;\n content: string;\n round: number;\n error?: boolean;\n}\n\nexport interface AppProps {\n initialPrompt?: string;\n sessionId?: string;\n agents: [AgentName, AgentName];\n agentModels: Record<AgentName, string>;\n config: TagTeamConfig;\n showTranscript?: Message[];\n discuss?: boolean;\n}\n\ntype AppState = \"input\" | \"running\" | \"done\" | \"config\";\ntype Target = \"both\" | AgentName | [AgentName, AgentName];\n\ninterface ParsedInput {\n target: Target;\n prompt: string;\n discuss: boolean;\n}\n\nconst PAIR_SEPARATORS = /^(\\w+)\\s*(?:and|&|\\/|,)\\s*(\\w+)[\\s,]\\s*/i;\n\nfunction tryParsePair(text: string): { pair: [AgentName, AgentName]; rest: string } | null {\n const match = text.toLowerCase().match(PAIR_SEPARATORS);\n if (!match) return null;\n const [fullMatch, first, second] = match;\n if (isValidAgentName(first) && isValidAgentName(second) && first !== second) {\n return { pair: [first, second], rest: text.slice(fullMatch.length).trim() };\n }\n return null;\n}\n\nfunction parseInput(input: string): ParsedInput {\n const lower = input.toLowerCase();\n if (lower.startsWith(\"discuss \")) {\n const rest = input.slice(8).trim();\n // Check for \"discuss gemini and codex ...\"\n const adHoc = tryParsePair(rest);\n if (adHoc) {\n return { target: adHoc.pair, prompt: adHoc.rest, discuss: true };\n }\n return { target: \"both\", prompt: rest, discuss: true };\n }\n // Check for ad-hoc pair: \"gemini and codex ...\", \"gemini/codex ...\", etc.\n const adHoc = tryParsePair(input);\n if (adHoc) {\n // \"gemini and codex discuss ...\" — natural word order\n const adHocLower = adHoc.rest.toLowerCase();\n if (adHocLower.startsWith(\"discuss \")) {\n return { target: adHoc.pair, prompt: adHoc.rest.slice(8).trim(), discuss: true };\n }\n return { target: adHoc.pair, prompt: adHoc.rest, discuss: false };\n }\n // Check for single agent prefix\n for (const agent of getAllAgentNames()) {\n if (lower.startsWith(`${agent} `) || lower.startsWith(`${agent}, `)) {\n return { target: agent, prompt: input.slice(input.indexOf(\" \") + 1).trim(), discuss: false };\n }\n }\n return { target: \"both\", prompt: input, discuss: false };\n}\n\n// --- Components ---\n\nfunction RenderedMarkdown({ text }: { text: string }) {\n const rendered = useMemo(() => (marked.parse(text) as string).trimEnd(), [text]);\n return <Text>{rendered}</Text>;\n}\n\nconst AgentResponseBlock = React.memo(function AgentResponseBlock({\n agent,\n content,\n error,\n}: {\n agent: AgentName;\n content: string;\n error?: boolean;\n}) {\n const descriptor = getAgent(agent);\n\n if (error) {\n return (\n <Box flexDirection=\"column\" marginLeft={1} marginBottom={1}>\n <Text color=\"red\" bold>\n {descriptor.displayName} error:\n </Text>\n <Box marginLeft={1}>\n <Text color=\"red\">{content}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" marginLeft={1} marginBottom={1}>\n <Text color={descriptor.color} bold>\n {descriptor.displayName}:\n </Text>\n <Box marginLeft={1}>\n <RenderedMarkdown text={content} />\n </Box>\n </Box>\n );\n});\n\nfunction Header({ sessionId }: { sessionId: string }) {\n return (\n <Box marginBottom={1}>\n <Text dimColor>{\"── \"}</Text>\n <Text bold>Tag Team</Text>\n <Text dimColor>{\" ── session \"}</Text>\n <Text color=\"cyan\">{sessionId.slice(0, 7)}</Text>\n <Text dimColor>{\" \" + \"─\".repeat(35)}</Text>\n </Box>\n );\n}\n\nfunction QuickHelp() {\n const col = 38;\n const examples = [\n [\"ask anything\", \"sends to both agents\"],\n [\"gemini explain this\", \"sends to one agent\"],\n [\"discuss best approach\", \"multi-round debate\"],\n [\"gemini and codex discuss review app\", \"pick agents + debate\"],\n ];\n return (\n <Box flexDirection=\"column\" marginLeft={2} marginBottom={1}>\n {examples.map(([cmd, desc]) => (\n <Text key={cmd} dimColor>{cmd!.padEnd(col)}{\"→ \"}{desc}</Text>\n ))}\n <Text dimColor>{\"/help for more\"}</Text>\n </Box>\n );\n}\n\nconst UserMessage = React.memo(function UserMessage({ content }: { content: string }) {\n return (\n <Box marginLeft={1} marginBottom={1}>\n <Text bold color=\"white\">\n You:{\" \"}\n </Text>\n <Text>{content}</Text>\n </Box>\n );\n});\n\nconst ExpandedPromptBlock = React.memo(function ExpandedPromptBlock({ content }: { content: string }) {\n return (\n <Box flexDirection=\"column\" marginLeft={1} marginBottom={1}>\n <Text color=\"yellow\" dimColor>Expanded prompt:</Text>\n <Box marginLeft={2}>\n <Text>{content}</Text>\n </Box>\n </Box>\n );\n});\n\nfunction ThinkingIndicator({ agent }: { agent: AgentName }) {\n const descriptor = getAgent(agent);\n return (\n <Box marginLeft={1}>\n <Text color={descriptor.color}>\n <Spinner type=\"dots\" />\n </Text>\n <Text color={descriptor.color}> {descriptor.displayName} is thinking...</Text>\n </Box>\n );\n}\n\nfunction DiscussionStatus({ round, maxRounds }: { round: number; maxRounds: number }) {\n return (\n <Box marginLeft={1} marginBottom={1}>\n <Text color=\"yellow\" bold>\n Discussion round {round}/{maxRounds}\n </Text>\n </Box>\n );\n}\n\nfunction ConsensusReached() {\n return (\n <Box marginLeft={1} marginBottom={1}>\n <Text color=\"green\" bold>\n Consensus reached.\n </Text>\n </Box>\n );\n}\n\n// Session-scoped prompt history — persists across PromptInput mount/unmount cycles\nconst promptHistory: string[] = [];\n\ntype PromptControl = { setValue: (v: string) => void; getValue: () => string };\n\nfunction PromptInput({\n onSubmit,\n controlRef,\n}: {\n onSubmit: (value: string) => void;\n controlRef: React.MutableRefObject<PromptControl | null>;\n}) {\n const [value, setValue] = useState(\"\");\n const valueRef = useRef(\"\");\n valueRef.current = value;\n\n useEffect(() => {\n controlRef.current = { setValue, getValue: () => valueRef.current };\n return () => { controlRef.current = null; };\n }, [controlRef]);\n\n return (\n <Box marginLeft={1}>\n <Text bold color=\"white\">\n {\"> \"}\n </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={(submitted) => {\n if (submitted.trim()) {\n onSubmit(submitted.trim());\n setValue(\"\");\n }\n }}\n showCursor\n />\n </Box>\n );\n}\n\n// --- Main App ---\n\nfunction App({\n initialPrompt,\n sessionId: existingSessionId,\n agents: initialPair,\n agentModels: initialAgentModels,\n config: initialConfig,\n showTranscript,\n discuss: initialDiscuss,\n}: AppProps) {\n const { exit } = useApp();\n const [sessionId, setSessionId] = useState(() => existingSessionId ?? nanoid(12));\n const [messages, setMessages] = useState<Message[]>(showTranscript ?? []);\n const [state, setState] = useState<AppState>(\n initialPrompt ? \"running\" : \"input\"\n );\n const [pair, setPair] = useState<[AgentName, AgentName]>(initialPair);\n const [agentModels, setAgentModels] = useState<Record<AgentName, string>>(initialAgentModels);\n const [config, setConfig] = useState<TagTeamConfig>(initialConfig);\n const [thinkingAgents, setThinkingAgents] = useState<AgentName[]>([]);\n const [discussionRound, setDiscussionRound] = useState(0);\n const [consensusReached, setConsensusReached] = useState(false);\n const [expanding, setExpanding] = useState(false);\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n const [roundNum, setRoundNum] = useState(() => {\n if (showTranscript && showTranscript.length > 0) {\n return Math.max(...showTranscript.map((m) => m.round)) + 1;\n }\n return 0;\n });\n const [committedCount, setCommittedCount] = useState(showTranscript?.length ?? 0);\n const promptControlRef = useRef<PromptControl | null>(null);\n const historyIndexRef = useRef(-1);\n const savedInputRef = useRef(\"\");\n\n const sessionCreatedRef = useRef(!!existingSessionId);\n const ensureSession = (id: string) => {\n if (!sessionCreatedRef.current) {\n createSession(id, process.cwd());\n sessionCreatedRef.current = true;\n }\n };\n\n // Handle initial prompt\n useEffect(() => {\n if (initialPrompt && state === \"running\") {\n if (initialDiscuss) {\n runDiscussion(initialPrompt);\n } else {\n runRound(initialPrompt);\n }\n }\n }, []);\n\n const abortRef = useRef<AbortController | null>(null);\n const runningRoundRef = useRef<number | null>(null);\n\n // Keyboard handling (Ctrl+C, Escape, and prompt history navigation)\n useInput((input, key) => {\n if (key.ctrl && input === \"c\") {\n abortRef.current?.abort();\n closeDb();\n exit();\n }\n if (key.escape && state === \"running\") {\n abortRef.current?.abort();\n abortRef.current = null;\n\n // Remove the user prompt and any partial results from DB and state\n if (runningRoundRef.current !== null) {\n deleteMessagesFromRound(sessionId, runningRoundRef.current);\n const fromRound = runningRoundRef.current;\n const remaining = messages.filter((m) => m.round < fromRound);\n setMessages(remaining);\n setCommittedCount(remaining.length);\n runningRoundRef.current = null;\n }\n\n setThinkingAgents([]);\n setExpanding(false);\n setDiscussionRound(0);\n setStatusMessage(\"Interrupted.\");\n setState(\"input\");\n }\n // Up/down arrow prompt history (only when prompt is visible)\n if (state === \"input\" && key.upArrow && promptHistory.length > 0) {\n if (historyIndexRef.current === -1) {\n savedInputRef.current = promptControlRef.current?.getValue() ?? \"\";\n }\n const nextIndex = historyIndexRef.current === -1\n ? promptHistory.length - 1\n : Math.max(0, historyIndexRef.current - 1);\n historyIndexRef.current = nextIndex;\n promptControlRef.current?.setValue(promptHistory[nextIndex]);\n }\n if (state === \"input\" && key.downArrow && historyIndexRef.current !== -1) {\n if (historyIndexRef.current >= promptHistory.length - 1) {\n historyIndexRef.current = -1;\n promptControlRef.current?.setValue(savedInputRef.current);\n } else {\n const nextIndex = historyIndexRef.current + 1;\n historyIndexRef.current = nextIndex;\n promptControlRef.current?.setValue(promptHistory[nextIndex]);\n }\n }\n });\n\n // Run agents, save results, return new messages\n const runAgents = async (\n currentMessages: Message[],\n round: number,\n target: Target,\n promptOverride?: string,\n isDebate = false,\n systemPromptPerAgent?: Partial<Record<AgentName, string>>,\n ): Promise<Message[]> => {\n // Determine which agents to run\n const activeAgents: AgentName[] = Array.isArray(target)\n ? target\n : target === \"both\"\n ? [...pair]\n : [target];\n setThinkingAgents(activeAgents);\n\n const history = formatConversationHistory(\n currentMessages.map((m) => ({\n role: m.role,\n agent: isValidAgentName(m.role) ? m.role : undefined,\n content: m.content,\n }))\n );\n\n const cwd = process.cwd();\n const isFirstRound = round === 0 && !existingSessionId;\n\n const userPrompt = currentMessages[currentMessages.length - 1]?.content || \"\";\n const isSingleAgent = !Array.isArray(target) && target !== \"both\";\n // Use the ad-hoc pair for prompt context, or fall back to the configured pair\n const promptPair: [AgentName, AgentName] = Array.isArray(target) ? target : pair;\n\n const agentPrompt = (_agent: AgentName) => {\n if (promptOverride) return promptOverride;\n if (isSingleAgent) return userPrompt;\n if (isFirstRound) return userPrompt;\n return \"Provide your response for this round.\";\n };\n\n const agentSystemPrompt = (agent: AgentName) => {\n // Check per-agent override first (used by runDiscussion for steelman/context)\n if (systemPromptPerAgent?.[agent]) return systemPromptPerAgent[agent];\n if (isSingleAgent) {\n return history ? directPrompt(agent, history) : undefined;\n }\n if (isDebate) {\n if (isFirstRound) return debateSystemPrompt(agent, promptPair);\n return debateRoundPrompt(agent, history, promptPair);\n }\n if (isFirstRound) return collaborationSystemPrompt(agent, promptPair);\n return discussionRoundPrompt(agent, history, promptPair);\n };\n\n const ac = abortRef.current ?? new AbortController();\n abortRef.current = ac;\n\n const results: Array<{ agent: AgentName; result: PromiseSettledResult<AgentResponse> }> = [];\n const promises: Array<Promise<void>> = [];\n\n for (const agent of activeAgents) {\n const descriptor = getAgent(agent);\n promises.push(\n descriptor.run({\n prompt: agentPrompt(agent),\n systemPrompt: agentSystemPrompt(agent),\n model: agentModels[agent],\n cwd,\n signal: ac.signal,\n }).then(\n (value) => { results.push({ agent, result: { status: \"fulfilled\", value } }); },\n (reason) => { results.push({ agent, result: { status: \"rejected\", reason } }); }\n )\n );\n }\n\n await Promise.all(promises);\n abortRef.current = null;\n\n // If aborted, bail out — the Escape handler already reset UI state\n if (ac.signal.aborted) return [];\n\n setThinkingAgents([]);\n\n const newMessages: Message[] = [];\n\n for (const { agent, result } of results) {\n if (result.status === \"fulfilled\") {\n const resp = result.value;\n const msg: Message = {\n id: `${round}-${agent}`,\n role: agent,\n content: resp.error || resp.text,\n round,\n error: !!resp.error,\n };\n newMessages.push(msg);\n const metadata = isDebate && !resp.error\n ? analysisToMetadata(parseRoundAnalysis(agent, resp.text))\n : undefined;\n insertMessage({\n sessionId,\n role: agent,\n content: resp.error || resp.text,\n round,\n durationMs: resp.durationMs,\n metadata,\n });\n } else {\n const errorMsg = result.reason?.message || \"Failed to run\";\n const msg: Message = {\n id: `${round}-${agent}`,\n role: agent,\n content: errorMsg,\n round,\n error: true,\n };\n newMessages.push(msg);\n insertMessage({\n sessionId,\n role: agent,\n content: `[Error: ${errorMsg}]`,\n round,\n });\n }\n }\n\n return newMessages;\n };\n\n const runRound = async (rawInput: string) => {\n const { target, prompt, discuss } = parseInput(rawInput);\n\n if (discuss) {\n return runDiscussion(prompt, Array.isArray(target) ? target : undefined);\n }\n\n const currentRound = roundNum;\n runningRoundRef.current = currentRound;\n\n // Ensure session row exists and set title on first prompt\n ensureSession(sessionId);\n if (currentRound === 0) {\n const title = prompt.length > 60 ? prompt.slice(0, 57) + \"...\" : prompt;\n updateSessionTitle(sessionId, title);\n }\n\n // Add user message\n const userMsg: Message = {\n id: `${currentRound}-user`,\n role: \"user\",\n content: rawInput,\n round: currentRound,\n };\n setMessages((prev) => [...prev, userMsg]);\n insertMessage({\n sessionId,\n role: \"user\",\n content: rawInput,\n round: currentRound,\n });\n\n let allMessages = [...messages, userMsg];\n let effectivePrompt: string | undefined;\n\n // Expand the prompt on first round of a new session\n if (config.expansion.enabled && currentRound === 0 && !existingSessionId) {\n const ac = new AbortController();\n abortRef.current = ac;\n setExpanding(true);\n try {\n const result = await expandPrompt(prompt, pair[0], process.cwd(), ac.signal);\n if (result.expanded !== result.original) {\n const expandedMsg: Message = {\n id: `${currentRound}-expanded`,\n role: \"expanded\",\n content: result.expanded,\n round: currentRound,\n };\n setMessages((prev) => [...prev, expandedMsg]);\n insertMessage({\n sessionId,\n role: \"expanded\",\n content: result.expanded,\n round: currentRound,\n });\n allMessages = [...allMessages, expandedMsg];\n effectivePrompt = result.expanded;\n }\n } catch {\n // Silent fallback to original prompt\n } finally {\n setExpanding(false);\n }\n // If aborted during expansion, bail out\n if (ac.signal.aborted) return;\n }\n\n const newMessages = await runAgents(allMessages, currentRound, target, effectivePrompt);\n\n // If aborted, the Escape handler already cleaned up\n if (newMessages.length === 0) return;\n\n const expandedCount = effectivePrompt ? 1 : 0;\n setMessages((prev) => [...prev, ...newMessages]);\n setCommittedCount((prev) => prev + 1 + expandedCount + newMessages.length);\n setRoundNum(currentRound + 1);\n runningRoundRef.current = null;\n\n touchSession(sessionId);\n setState(\"input\");\n };\n\n const runDiscussion = async (prompt: string, adHocPair?: [AgentName, AgentName]) => {\n const discussionTarget: Target = adHocPair ?? \"both\";\n const activePair: [AgentName, AgentName] = adHocPair ?? pair;\n setConsensusReached(false);\n let currentRound = roundNum;\n runningRoundRef.current = currentRound;\n\n // Ensure session row exists and set title on first prompt\n ensureSession(sessionId);\n if (currentRound === 0) {\n const title = prompt.length > 60 ? prompt.slice(0, 57) + \"...\" : prompt;\n updateSessionTitle(sessionId, title);\n }\n\n // Add user message\n const userMsg: Message = {\n id: `${currentRound}-user`,\n role: \"user\",\n content: `discuss ${prompt}`,\n round: currentRound,\n };\n setMessages((prev) => [...prev, userMsg]);\n insertMessage({\n sessionId,\n role: \"user\",\n content: `discuss ${prompt}`,\n round: currentRound,\n });\n\n let allMessages = [...messages, userMsg];\n let effectivePrompt: string | undefined;\n\n // Expand the prompt on first round of a new session\n if (config.expansion.enabled && currentRound === 0 && !existingSessionId) {\n const ac = new AbortController();\n abortRef.current = ac;\n setExpanding(true);\n try {\n const result = await expandPrompt(prompt, activePair[0], process.cwd(), ac.signal);\n if (result.expanded !== result.original) {\n const expandedMsg: Message = {\n id: `${currentRound}-expanded`,\n role: \"expanded\",\n content: result.expanded,\n round: currentRound,\n };\n setMessages((prev) => [...prev, expandedMsg]);\n insertMessage({\n sessionId,\n role: \"expanded\",\n content: result.expanded,\n round: currentRound,\n });\n allMessages = [...allMessages, expandedMsg];\n effectivePrompt = result.expanded;\n }\n } catch {\n // Silent fallback to original prompt\n } finally {\n setExpanding(false);\n }\n // If aborted during expansion, bail out\n if (ac.signal.aborted) return;\n }\n\n // Initialize discussion state for orchestrator logic\n const discState: DiscussionState = {\n round: 0,\n analyses: [],\n terminated: false,\n };\n\n for (let disc = 1; disc <= config.discussion.max_rounds; disc++) {\n setDiscussionRound(disc);\n discState.round = disc;\n\n // Build per-agent system prompts based on round\n let perAgentPrompts: Partial<Record<AgentName, string>> | undefined;\n\n if (disc >= 2) {\n const context = buildConversationContext(\n allMessages.map((m) => ({\n role: m.role,\n agent: isValidAgentName(m.role) ? m.role : undefined,\n content: m.content,\n })),\n discState.analyses,\n disc,\n activePair,\n );\n\n perAgentPrompts = {};\n for (const agent of activePair) {\n let prompt_text = \"\";\n // Inject steelman in round 2\n if (shouldInjectSteelman(discState)) {\n prompt_text += steelmanPrompt();\n }\n prompt_text += debateRoundPrompt(agent, context, activePair);\n perAgentPrompts[agent] = prompt_text;\n }\n }\n\n const newMessages = await runAgents(\n allMessages,\n currentRound,\n discussionTarget,\n disc === 1 ? (effectivePrompt ?? prompt) : \"Provide your response for this round.\",\n true,\n perAgentPrompts,\n );\n\n // If aborted, stop the discussion loop\n if (newMessages.length === 0) break;\n\n setMessages((prev) => [...prev, ...newMessages]);\n // Commit completed round to Static (first round includes the user message + optional expanded)\n const expandedCount = disc === 1 && effectivePrompt ? 1 : 0;\n setCommittedCount((prev) => prev + (disc === 1 ? 1 : 0) + expandedCount + newMessages.length);\n allMessages = [...allMessages, ...newMessages];\n currentRound++;\n\n // Parse round analyses\n const roundAnalyses = activePair\n .map((agent) => {\n const msg = newMessages.find((m) => m.role === agent && !m.error);\n if (!msg) return null;\n return parseRoundAnalysis(agent, msg.content);\n })\n .filter((a): a is NonNullable<typeof a> => a !== null);\n\n discState.analyses.push(roundAnalyses);\n\n // Check termination\n const termResult = checkTermination(discState, config.discussion.max_rounds);\n if (termResult.terminated && termResult.reason) {\n discState.terminated = true;\n discState.terminationReason = termResult.reason;\n setStatusMessage(terminationMessage(termResult.reason));\n if (termResult.reason === \"mutual-consensus\") {\n setConsensusReached(true);\n }\n break;\n }\n }\n\n setRoundNum(currentRound);\n setDiscussionRound(0);\n runningRoundRef.current = null;\n touchSession(sessionId);\n setState(\"input\");\n };\n\n const handleSubmit = (value: string) => {\n setStatusMessage(null);\n promptHistory.push(value);\n historyIndexRef.current = -1;\n savedInputRef.current = \"\";\n\n if (value === \"/exit\") {\n closeDb();\n exit();\n return;\n }\n\n if (value === \"/help\") {\n setStatusMessage(\n [\n \"/help Show this help\",\n \"/config Edit configuration\",\n \"/new Start a new session\",\n \"/copy Copy conversation to clipboard\",\n \"/gist Create a private GitHub gist\",\n \"/exit Exit the app\",\n \"\",\n \"Esc Interrupt running agents\",\n ].join(\"\\n\")\n );\n return;\n }\n\n if (value === \"/config\") {\n setState(\"config\");\n return;\n }\n\n if (value === \"/new\") {\n const newId = nanoid(12);\n sessionCreatedRef.current = false;\n setSessionId(newId);\n setMessages([]);\n setCommittedCount(0);\n setRoundNum(0);\n setConsensusReached(false);\n setDiscussionRound(0);\n setStatusMessage(\"Started new session.\");\n return;\n }\n\n if (value === \"/copy\") {\n try {\n const md = formatAsMarkdown(messages);\n copyToClipboard(md);\n setStatusMessage(\"Copied conversation to clipboard.\");\n } catch {\n setStatusMessage(\"Failed to copy to clipboard.\");\n }\n return;\n }\n\n if (value === \"/gist\") {\n if (messages.length === 0) {\n setStatusMessage(\"Nothing to gist.\");\n return;\n }\n try {\n const md = formatAsMarkdown(messages);\n const filename = `tagteam-${sessionId.slice(0, 7)}.md`;\n const url = createGist(md, filename);\n setStatusMessage(`Gist created: ${url}`);\n } catch (e: any) {\n setStatusMessage(e.message || \"Failed to create gist.\");\n }\n return;\n }\n\n setConsensusReached(false);\n setState(\"running\");\n runRound(value);\n };\n\n const staticItems = useMemo<Message[]>(() => [\n { id: `header-${sessionId}`, role: '__header', content: '', round: -1 },\n ...messages.slice(0, committedCount),\n ], [sessionId, messages, committedCount]);\n\n return (\n <Box flexDirection=\"column\">\n {/* Finalized messages — rendered once, scroll up naturally */}\n <Static items={staticItems}>\n {(item) => {\n if (item.role === '__header') return <Header key={item.id} sessionId={sessionId} />;\n if (item.role === 'user') return <UserMessage key={item.id} content={item.content} />;\n if (item.role === 'expanded') return <ExpandedPromptBlock key={item.id} content={item.content} />;\n if (isValidAgentName(item.role)) return <AgentResponseBlock key={item.id} agent={item.role} content={item.content} error={item.error} />;\n return <Box key={item.id} />;\n }}\n </Static>\n\n {messages.length === 0 && state === \"input\" && <QuickHelp />}\n\n {/* Active messages — current round, not yet committed */}\n {messages.slice(committedCount).map((msg) => {\n if (msg.role === 'user') return <UserMessage key={msg.id} content={msg.content} />;\n if (msg.role === 'expanded') return <ExpandedPromptBlock key={msg.id} content={msg.content} />;\n if (isValidAgentName(msg.role)) return <AgentResponseBlock key={msg.id} agent={msg.role} content={msg.content} error={msg.error} />;\n return null;\n })}\n\n {expanding && (\n <Box marginLeft={1}>\n <Text color=\"yellow\"><Spinner type=\"dots\" /></Text>\n <Text color=\"yellow\"> Expanding prompt…</Text>\n </Box>\n )}\n\n {discussionRound > 0 && thinkingAgents.length > 0 && (\n <DiscussionStatus round={discussionRound} maxRounds={config.discussion.max_rounds} />\n )}\n\n {thinkingAgents.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {thinkingAgents.map((agent) => (\n <ThinkingIndicator key={agent} agent={agent} />\n ))}\n </Box>\n )}\n\n {consensusReached && <ConsensusReached />}\n\n {statusMessage && (\n <Box marginLeft={1}>\n <Text dimColor italic>{statusMessage}</Text>\n </Box>\n )}\n\n {state === \"config\" && (\n <InlineConfigEditor\n isActive={state === \"config\"}\n onClose={() => {\n const updated = loadConfig();\n setConfig(updated);\n try {\n setPair(validateAgentPair(updated.agents));\n } catch {\n // keep current pair if new config is invalid\n }\n setAgentModels((prev) => ({\n ...prev,\n claude: updated.claude.model,\n codex: updated.codex.model,\n gemini: updated.gemini.model,\n }));\n setState(\"input\");\n }}\n />\n )}\n\n {state === \"input\" && <PromptInput onSubmit={handleSubmit} controlRef={promptControlRef} />}\n </Box>\n );\n}\n\n// --- Entry points ---\n\nexport function startApp(props: AppProps) {\n return render(<App {...props} />);\n}\n\nexport function showTranscriptMarkdown(sessionId: string): string {\n const dbMessages = getMessages(sessionId);\n const messages = dbMessages.map((m) => ({\n role: m.role,\n content: m.content,\n round: m.round,\n }));\n return formatAsMarkdown(messages);\n}\n\nexport function showTranscript(sessionId: string): void {\n const dbMessages = getMessages(sessionId);\n const messages: Message[] = dbMessages.map((m) => ({\n id: `${m.round}-${m.role}`,\n role: m.role,\n content: m.content,\n round: m.round,\n }));\n\n const { unmount } = render(\n <Box flexDirection=\"column\">\n <Header sessionId={sessionId} />\n {messages.map((msg) => {\n if (msg.role === \"user\") {\n return <UserMessage key={msg.id} content={msg.content} />;\n }\n if (msg.role === \"expanded\") {\n return <ExpandedPromptBlock key={msg.id} content={msg.content} />;\n }\n if (isValidAgentName(msg.role)) {\n return (\n <AgentResponseBlock key={msg.id} agent={msg.role} content={msg.content} />\n );\n }\n return null;\n })}\n <Box>\n <Text dimColor>{\"─\".repeat(60)}</Text>\n </Box>\n </Box>\n );\n\n unmount();\n}\n\nexport function showSessionList(\n sessions: Array<{\n id: string;\n title: string | null;\n status: string;\n created_at: string;\n updated_at: string;\n }>\n): void {\n const { unmount } = render(\n <Box flexDirection=\"column\">\n {sessions.length === 0 ? (\n <Text dimColor> No sessions found.</Text>\n ) : (\n sessions.map((s) => (\n <Box key={s.id} marginLeft={1}>\n <Text color=\"cyan\">{s.id.slice(0, 7)}</Text>\n <Text>{\" \"}</Text>\n <Text>{s.title || \"(untitled)\"}</Text>\n <Text>{\" \"}</Text>\n <Text color={s.status === \"active\" ? \"green\" : undefined} dimColor={s.status !== \"active\"}>\n {s.status}\n </Text>\n <Text>{\" \"}</Text>\n <Text dimColor>{s.updated_at}</Text>\n </Box>\n ))\n )}\n </Box>\n );\n\n unmount();\n}\n","import { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport type { AgentEvent, AgentOptions, AgentResponse } from \"./types.js\";\n\n/**\n * Parse Claude Code's stream-json JSONL output into AgentEvents.\n *\n * Event format (one JSON object per line):\n * { type: \"system\", subtype: \"init\", ... }\n * { type: \"assistant\", message: { content: [{ type: \"text\", text }, { type: \"tool_use\", ... }] } }\n * { type: \"user\", message: { content: [{ type: \"tool_result\", ... }] } }\n * { type: \"result\", subtype: \"success\", result: \"final text\", ... }\n */\n\nasync function* streamClaude(\n options: AgentOptions\n): AsyncGenerator<AgentEvent> {\n const args = [\n \"-p\",\n \"--verbose\",\n \"--output-format\",\n \"stream-json\",\n \"--no-session-persistence\",\n ];\n\n if (options.systemPrompt) {\n args.push(\"--system-prompt\", options.systemPrompt);\n }\n if (options.model) {\n args.push(\"--model\", options.model);\n }\n\n args.push(options.prompt);\n\n const proc = spawn(\"claude\", args, {\n cwd: options.cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, CLAUDECODE: \"\" },\n });\n\n // Handle spawn errors (e.g., command not found)\n let spawnErrorMsg = \"\";\n proc.on(\"error\", (err) => {\n spawnErrorMsg = err.message;\n });\n\n // Abort support — kill the child process when signalled\n if (options.signal) {\n if (options.signal.aborted) {\n proc.kill();\n } else {\n options.signal.addEventListener(\"abort\", () => proc.kill(), { once: true });\n }\n }\n\n const rl = createInterface({ input: proc.stdout! });\n let gotResultText = false;\n\n for await (const line of rl) {\n if (!line.trim()) continue;\n\n let data: any;\n try {\n data = JSON.parse(line);\n } catch {\n continue;\n }\n\n if (data.type === \"assistant\" && data.message?.content) {\n for (const block of data.message.content) {\n if (block.type === \"text\" && block.text) {\n yield { type: \"text\", agent: \"claude\", content: block.text };\n gotResultText = true;\n } else if (block.type === \"tool_use\") {\n yield {\n type: \"tool_call\",\n agent: \"claude\",\n toolName: block.name,\n toolInput:\n typeof block.input === \"string\"\n ? block.input\n : JSON.stringify(block.input),\n };\n }\n }\n } else if (data.type === \"user\" && data.message?.content) {\n for (const block of data.message.content) {\n if (block.type === \"tool_result\") {\n const text =\n typeof block.content === \"string\"\n ? block.content\n : Array.isArray(block.content)\n ? block.content\n .filter((c: any) => c.type === \"text\")\n .map((c: any) => c.text)\n .join(\"\\n\")\n : \"\";\n if (text) {\n yield {\n type: \"tool_result\",\n agent: \"claude\",\n toolOutput: text,\n };\n }\n }\n }\n } else if (data.type === \"result\") {\n if (data.is_error) {\n yield {\n type: \"error\",\n agent: \"claude\",\n content: data.error || data.result || \"Unknown error\",\n };\n } else if (data.result && !gotResultText) {\n // Use result.result as fallback if no assistant text blocks were emitted\n yield { type: \"text\", agent: \"claude\", content: data.result };\n }\n }\n }\n\n // Wait for the process to exit\n await new Promise<void>((resolve) => {\n proc.on(\"close\", resolve);\n });\n\n if (spawnErrorMsg) {\n yield {\n type: \"error\",\n agent: \"claude\",\n content: `Failed to spawn claude: ${spawnErrorMsg}`,\n };\n }\n\n yield { type: \"done\", agent: \"claude\" };\n}\n\nexport async function runClaude(options: AgentOptions): Promise<AgentResponse> {\n const start = Date.now();\n const events: AgentEvent[] = [];\n const textParts: string[] = [];\n const errors: string[] = [];\n\n for await (const event of streamClaude(options)) {\n events.push(event);\n if (event.type === \"text\" && event.content) {\n textParts.push(event.content);\n } else if (event.type === \"error\" && event.content) {\n errors.push(event.content);\n }\n }\n\n return {\n agent: \"claude\",\n text: textParts.join(\"\"),\n events,\n durationMs: Date.now() - start,\n error: errors.length > 0 ? errors.join(\"\\n\") : undefined,\n };\n}\n","import { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport type { AgentEvent, AgentOptions, AgentResponse } from \"./types.js\";\n\n/**\n * Parse Codex CLI's exec --json JSONL output into AgentEvents.\n *\n * Event format (one JSON object per line):\n * { type: \"thread.started\", thread_id: \"...\" }\n * { type: \"turn.started\" }\n * { type: \"item.completed\", item: { type: \"agent_message\", text: \"...\" } }\n * { type: \"item.started\"|\"item.completed\", item: { type: \"command_execution\", command, aggregated_output, exit_code } }\n * { type: \"turn.completed\", usage: { ... } }\n */\n\nasync function* streamCodex(\n options: AgentOptions\n): AsyncGenerator<AgentEvent> {\n const args = [\"exec\", \"--json\", \"--full-auto\", \"--ephemeral\"];\n\n if (options.model) {\n args.push(\"-m\", options.model);\n }\n\n // Build the full prompt with system context prepended\n let fullPrompt = options.prompt;\n if (options.systemPrompt) {\n fullPrompt = `${options.systemPrompt}\\n\\n---\\n\\n${options.prompt}`;\n }\n\n args.push(fullPrompt);\n\n const proc = spawn(\"codex\", args, {\n cwd: options.cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n\n // Handle spawn errors (e.g., command not found)\n let spawnErrorMsg = \"\";\n proc.on(\"error\", (err) => {\n spawnErrorMsg = err.message;\n });\n\n // Abort support — kill the child process when signalled\n if (options.signal) {\n if (options.signal.aborted) {\n proc.kill();\n } else {\n options.signal.addEventListener(\"abort\", () => proc.kill(), { once: true });\n }\n }\n\n const rl = createInterface({ input: proc.stdout! });\n\n for await (const line of rl) {\n if (!line.trim()) continue;\n\n let data: any;\n try {\n data = JSON.parse(line);\n } catch {\n continue;\n }\n\n if (data.type === \"item.completed\" && data.item) {\n const item = data.item;\n\n if (item.type === \"agent_message\" && item.text) {\n yield { type: \"text\", agent: \"codex\", content: item.text };\n } else if (item.type === \"command_execution\") {\n yield {\n type: \"tool_call\",\n agent: \"codex\",\n toolName: \"command\",\n toolInput: item.command,\n };\n if (item.aggregated_output) {\n yield {\n type: \"tool_result\",\n agent: \"codex\",\n toolOutput: item.aggregated_output,\n };\n }\n } else if (item.type === \"file_change\" && item.changes) {\n const desc = item.changes\n .map((c: any) => `${c.kind}: ${c.path}`)\n .join(\", \");\n yield {\n type: \"tool_result\",\n agent: \"codex\",\n toolName: \"file_change\",\n toolOutput: desc,\n };\n } else if (item.type === \"error\") {\n yield {\n type: \"error\",\n agent: \"codex\",\n content: item.message || \"Unknown error\",\n };\n }\n } else if (data.type === \"turn.failed\") {\n yield {\n type: \"error\",\n agent: \"codex\",\n content: data.error?.message || \"Turn failed\",\n };\n } else if (data.type === \"error\") {\n yield {\n type: \"error\",\n agent: \"codex\",\n content: data.message || \"Stream error\",\n };\n }\n }\n\n // Wait for the process to exit\n await new Promise<void>((resolve) => {\n proc.on(\"close\", resolve);\n });\n\n if (spawnErrorMsg) {\n yield {\n type: \"error\",\n agent: \"codex\",\n content: `Failed to spawn codex: ${spawnErrorMsg}`,\n };\n }\n\n yield { type: \"done\", agent: \"codex\" };\n}\n\nexport async function runCodex(options: AgentOptions): Promise<AgentResponse> {\n const start = Date.now();\n const events: AgentEvent[] = [];\n const textParts: string[] = [];\n const errors: string[] = [];\n\n for await (const event of streamCodex(options)) {\n events.push(event);\n if (event.type === \"text\" && event.content) {\n textParts.push(event.content);\n } else if (event.type === \"error\" && event.content) {\n errors.push(event.content);\n }\n }\n\n return {\n agent: \"codex\",\n text: textParts.join(\"\"),\n events,\n durationMs: Date.now() - start,\n error: errors.length > 0 ? errors.join(\"\\n\") : undefined,\n };\n}\n","import { spawn } from \"node:child_process\";\nimport type { AgentEvent, AgentOptions, AgentResponse } from \"./types.js\";\n\n/**\n * Run the Gemini CLI and parse its JSON output into AgentEvents.\n *\n * Gemini CLI returns a single JSON blob (not streaming JSONL):\n * { response: \"text\", stats: {...}, error: \"...\" }\n *\n * No --system-prompt flag — prepend system prompt to user prompt (same as codex).\n * Flags: gemini -p \"prompt\" --output-format json -m model --yolo\n */\n\nasync function* streamGemini(\n options: AgentOptions\n): AsyncGenerator<AgentEvent> {\n const args = [\"-p\"];\n\n // Build the full prompt with system context prepended\n let fullPrompt = options.prompt;\n if (options.systemPrompt) {\n fullPrompt = `${options.systemPrompt}\\n\\n---\\n\\n${options.prompt}`;\n }\n\n args.push(fullPrompt, \"--output-format\", \"json\", \"--yolo\");\n\n if (options.model) {\n args.push(\"-m\", options.model);\n }\n\n const proc = spawn(\"gemini\", args, {\n cwd: options.cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n\n // Handle spawn errors (e.g., command not found)\n let spawnErrorMsg = \"\";\n proc.on(\"error\", (err) => {\n spawnErrorMsg = err.message;\n });\n\n // Abort support — kill the child process when signalled\n if (options.signal) {\n if (options.signal.aborted) {\n proc.kill();\n } else {\n options.signal.addEventListener(\"abort\", () => proc.kill(), { once: true });\n }\n }\n\n // Collect all stdout into a single buffer\n const chunks: Buffer[] = [];\n proc.stdout!.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n // Wait for the process to exit\n await new Promise<void>((resolve) => {\n proc.on(\"close\", resolve);\n });\n\n if (spawnErrorMsg) {\n yield {\n type: \"error\",\n agent: \"gemini\",\n content: `Failed to spawn gemini: ${spawnErrorMsg}`,\n };\n yield { type: \"done\", agent: \"gemini\" };\n return;\n }\n\n const stdout = Buffer.concat(chunks).toString(\"utf-8\").trim();\n\n if (!stdout) {\n yield { type: \"error\", agent: \"gemini\", content: \"No output from gemini\" };\n yield { type: \"done\", agent: \"gemini\" };\n return;\n }\n\n try {\n const data = JSON.parse(stdout);\n\n if (data.error) {\n yield { type: \"error\", agent: \"gemini\", content: data.error };\n } else if (data.response) {\n yield { type: \"text\", agent: \"gemini\", content: data.response };\n } else {\n yield { type: \"error\", agent: \"gemini\", content: \"Unexpected response format\" };\n }\n } catch {\n // If it's not JSON, treat the entire stdout as text\n yield { type: \"text\", agent: \"gemini\", content: stdout };\n }\n\n yield { type: \"done\", agent: \"gemini\" };\n}\n\nexport async function runGemini(options: AgentOptions): Promise<AgentResponse> {\n const start = Date.now();\n const events: AgentEvent[] = [];\n const textParts: string[] = [];\n const errors: string[] = [];\n\n for await (const event of streamGemini(options)) {\n events.push(event);\n if (event.type === \"text\" && event.content) {\n textParts.push(event.content);\n } else if (event.type === \"error\" && event.content) {\n errors.push(event.content);\n }\n }\n\n return {\n agent: \"gemini\",\n text: textParts.join(\"\"),\n events,\n durationMs: Date.now() - start,\n error: errors.length > 0 ? errors.join(\"\\n\") : undefined,\n };\n}\n","import type { AgentDescriptor, AgentName, AgentProfile } from \"./types.js\";\nimport { runClaude } from \"./claude.js\";\nimport { runCodex } from \"./codex.js\";\nimport { runGemini } from \"./gemini.js\";\n\nconst AGENTS: Record<AgentName, AgentDescriptor> = {\n claude: {\n name: \"claude\",\n displayName: \"Claude\",\n color: \"magenta\",\n cliBinary: \"claude\",\n installUrl: \"https://docs.anthropic.com/en/docs/claude-code\",\n org: \"Anthropic\",\n profile: {\n strength: \"architecture-implementation\",\n role: \"The Builder\",\n focus: [\n \"multi-file coherence and refactoring\",\n \"production-quality implementation\",\n \"design patterns and maintainability\",\n \"comprehensive working solutions\",\n ],\n },\n run: runClaude,\n },\n codex: {\n name: \"codex\",\n displayName: \"Codex\",\n color: \"green\",\n cliBinary: \"codex\",\n installUrl: \"https://github.com/openai/codex\",\n org: \"OpenAI\",\n profile: {\n strength: \"correctness-verification\",\n role: \"The Verifier\",\n focus: [\n \"algorithmic correctness and edge cases\",\n \"test coverage and failure modes\",\n \"standards compliance and best practices\",\n \"performance characteristics and benchmarks\",\n ],\n },\n run: runCodex,\n },\n gemini: {\n name: \"gemini\",\n displayName: \"Gemini\",\n color: \"blue\",\n cliBinary: \"gemini\",\n installUrl: \"https://github.com/google-gemini/gemini-cli\",\n org: \"Google\",\n profile: {\n strength: \"context-strategy\",\n role: \"The Strategist\",\n focus: [\n \"broad codebase context and upstream/downstream effects\",\n \"current ecosystem conventions and documentation\",\n \"architectural fit and scope assessment\",\n \"planning, decomposition, and tradeoff analysis\",\n ],\n },\n run: runGemini,\n },\n};\n\n// Anonymized peer role descriptions keyed by sorted pair string\nconst PEER_ROLES: Record<string, Record<AgentName, string>> = {\n \"claude,codex\": {\n claude: \"Correctness & Standards — they verify edge cases, test coverage, and standards compliance\",\n codex: \"Architecture & Implementation — they propose complete solutions and assess structural coherence\",\n gemini: \"\", // not in this pair\n },\n \"claude,gemini\": {\n claude: \"Strategic Context — they assess broad codebase fit, ecosystem conventions, and architectural tradeoffs\",\n gemini: \"Architecture & Implementation — they propose complete solutions and assess structural coherence\",\n codex: \"\", // not in this pair\n },\n \"codex,gemini\": {\n codex: \"Strategic Context — they assess broad codebase fit, ecosystem conventions, and architectural tradeoffs\",\n gemini: \"Correctness & Standards — they verify edge cases, test coverage, and standards compliance\",\n claude: \"\", // not in this pair\n },\n};\n\nexport function getAgent(name: AgentName): AgentDescriptor {\n return AGENTS[name];\n}\n\nexport function getAgentProfile(name: AgentName): AgentProfile {\n return AGENTS[name].profile;\n}\n\nexport function getPeerRoleDescription(agent: AgentName, pair: [AgentName, AgentName]): string {\n const key = [...pair].sort().join(\",\");\n return PEER_ROLES[key]?.[agent] ?? \"\";\n}\n\nexport function getAllAgentNames(): AgentName[] {\n return Object.keys(AGENTS) as AgentName[];\n}\n\nexport function isValidAgentName(name: string): name is AgentName {\n return name in AGENTS;\n}\n\nexport function validateAgentPair(pair: string[]): [AgentName, AgentName] {\n if (pair.length !== 2) {\n throw new Error(\"Agent pair must contain exactly 2 agents\");\n }\n if (pair[0] === pair[1]) {\n throw new Error(\"Agent pair must contain 2 distinct agents\");\n }\n for (const name of pair) {\n if (!isValidAgentName(name)) {\n throw new Error(`Unknown agent: \"${name}\". Valid agents: ${getAllAgentNames().join(\", \")}`);\n }\n }\n return pair as [AgentName, AgentName];\n}\n","import { getAgent, isValidAgentName } from \"./agents/registry.js\";\n\ninterface Message {\n role: string;\n content: string;\n error?: boolean;\n}\n\nexport function formatAsMarkdown(messages: Message[]): string {\n const parts: string[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") continue;\n\n if (msg.role === \"user\") {\n parts.push(`**You:** ${msg.content}`);\n } else if (isValidAgentName(msg.role)) {\n const name = getAgent(msg.role).displayName;\n if (msg.error) {\n parts.push(`**${name}:** *(error)*\\n\\n${msg.content}`);\n } else {\n parts.push(`**${name}:**\\n\\n${msg.content}`);\n }\n }\n }\n\n return parts.join(\"\\n\\n---\\n\\n\") + \"\\n\";\n}\n","import { execSync } from \"node:child_process\";\n\nexport function copyToClipboard(text: string): void {\n const platform = process.platform;\n\n let cmd: string;\n if (platform === \"darwin\") {\n cmd = \"pbcopy\";\n } else if (platform === \"win32\") {\n cmd = \"clip\";\n } else {\n // Linux — try xclip first, fall back to xsel\n let hasXclip = false;\n let hasXsel = false;\n try {\n execSync(\"which xclip\", { stdio: \"ignore\" });\n hasXclip = true;\n } catch {}\n if (!hasXclip) {\n try {\n execSync(\"which xsel\", { stdio: \"ignore\" });\n hasXsel = true;\n } catch {}\n }\n\n if (hasXclip) {\n cmd = \"xclip -selection clipboard\";\n } else if (hasXsel) {\n cmd = \"xsel --clipboard --input\";\n } else {\n throw new Error(\n \"Clipboard requires xclip or xsel. Install one with: sudo apt install xclip\"\n );\n }\n }\n\n try {\n execSync(cmd, { input: text, stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n } catch {\n throw new Error(\n `Failed to copy to clipboard using \"${cmd.split(\" \")[0]}\". Check that it is installed and working.`\n );\n }\n}\n","import { execSync } from \"node:child_process\";\n\nexport function createGist(content: string, filename: string): string {\n // Check gh is installed and authenticated\n try {\n execSync(\"gh auth status\", { stdio: \"ignore\" });\n } catch {\n // Distinguish between not installed and not authenticated\n try {\n execSync(\"which gh\", { stdio: \"ignore\" });\n } catch {\n throw new Error(\n \"gh CLI not found. Install it from https://cli.github.com\"\n );\n }\n throw new Error(\n \"gh CLI is not authenticated. Run: gh auth login\"\n );\n }\n\n try {\n const result = execSync(\n `gh gist create --filename \"${filename}\" -`,\n { input: content, stdio: [\"pipe\", \"pipe\", \"pipe\"], encoding: \"utf-8\" }\n );\n return result.trim();\n } catch (e: any) {\n const stderr = e.stderr?.toString().trim();\n throw new Error(stderr || \"Failed to create gist.\");\n }\n}\n","import Database from \"better-sqlite3\";\nimport { join } from \"node:path\";\nimport { getConfigDir, ensureConfigDir } from \"../config.js\";\n\nlet db: Database.Database | null = null;\n\nexport function getDbPath(): string {\n return join(getConfigDir(), \"tagteam.db\");\n}\n\nexport function getDb(): Database.Database {\n if (db) return db;\n\n ensureConfigDir();\n db = new Database(getDbPath());\n db.pragma(\"journal_mode = WAL\");\n db.pragma(\"foreign_keys = ON\");\n\n initSchema(db);\n return db;\n}\n\nfunction initSchema(db: Database.Database): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n title TEXT,\n working_dir TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n status TEXT NOT NULL DEFAULT 'active'\n );\n\n CREATE TABLE IF NOT EXISTS messages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL REFERENCES sessions(id),\n role TEXT NOT NULL,\n content TEXT NOT NULL,\n round INTEGER NOT NULL DEFAULT 0,\n duration_ms INTEGER,\n metadata TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id, id);\n `);\n}\n\nexport function closeDb(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n","import { getDb } from \"./index.js\";\n\nexport interface Session {\n id: string;\n title: string | null;\n working_dir: string;\n created_at: string;\n updated_at: string;\n status: string;\n}\n\nexport function createSession(\n id: string,\n workingDir: string\n): Session {\n const db = getDb();\n db.prepare(\n `INSERT INTO sessions (id, working_dir) VALUES (?, ?)`\n ).run(id, workingDir);\n\n return getSession(id)!;\n}\n\nexport function getSession(id: string): Session | undefined {\n const db = getDb();\n return db.prepare(`SELECT * FROM sessions WHERE id = ?`).get(id) as\n | Session\n | undefined;\n}\n\nexport function getSessionByPrefix(prefix: string): Session | undefined {\n const db = getDb();\n return db\n .prepare(`SELECT * FROM sessions WHERE id LIKE ? ORDER BY updated_at DESC LIMIT 1`)\n .get(`${prefix}%`) as Session | undefined;\n}\n\nexport function getMostRecentSession(): Session | undefined {\n const db = getDb();\n return db\n .prepare(\n `SELECT * FROM sessions WHERE status = 'active' ORDER BY updated_at DESC LIMIT 1`\n )\n .get() as Session | undefined;\n}\n\nexport function listSessions(limit = 20): Session[] {\n const db = getDb();\n return db\n .prepare(`SELECT * FROM sessions ORDER BY updated_at DESC LIMIT ?`)\n .all(limit) as Session[];\n}\n\nexport function updateSessionTitle(id: string, title: string): void {\n const db = getDb();\n db.prepare(\n `UPDATE sessions SET title = ?, updated_at = datetime('now') WHERE id = ?`\n ).run(title, id);\n}\n\nexport function touchSession(id: string): void {\n const db = getDb();\n db.prepare(`UPDATE sessions SET updated_at = datetime('now') WHERE id = ?`).run(\n id\n );\n}\n\nexport function deleteSession(id: string): void {\n const db = getDb();\n db.prepare(`DELETE FROM messages WHERE session_id = ?`).run(id);\n db.prepare(`DELETE FROM sessions WHERE id = ?`).run(id);\n}\n\nexport function deleteAllSessions(): void {\n const db = getDb();\n db.prepare(`DELETE FROM messages`).run();\n db.prepare(`DELETE FROM sessions`).run();\n}\n","import { getDb } from \"./index.js\";\n\nexport interface Message {\n id: number;\n session_id: string;\n role: string;\n content: string;\n round: number;\n duration_ms: number | null;\n metadata: string | null;\n created_at: string;\n}\n\nexport function insertMessage(params: {\n sessionId: string;\n role: string;\n content: string;\n round: number;\n durationMs?: number;\n metadata?: Record<string, unknown>;\n}): Message {\n const db = getDb();\n const result = db\n .prepare(\n `INSERT INTO messages (session_id, role, content, round, duration_ms, metadata)\n VALUES (?, ?, ?, ?, ?, ?)`\n )\n .run(\n params.sessionId,\n params.role,\n params.content,\n params.round,\n params.durationMs ?? null,\n params.metadata ? JSON.stringify(params.metadata) : null\n );\n\n return db\n .prepare(`SELECT * FROM messages WHERE id = ?`)\n .get(result.lastInsertRowid) as Message;\n}\n\nexport function getMessages(sessionId: string): Message[] {\n const db = getDb();\n return db\n .prepare(`SELECT * FROM messages WHERE session_id = ? ORDER BY id`)\n .all(sessionId) as Message[];\n}\n\nexport function deleteMessagesFromRound(\n sessionId: string,\n fromRound: number\n): void {\n const db = getDb();\n db.prepare(\n `DELETE FROM messages WHERE session_id = ? AND round >= ?`\n ).run(sessionId, fromRound);\n}","import type { AgentName } from \"./agents/types.js\";\nimport { getAgent, getAgentProfile, getPeerRoleDescription, isValidAgentName } from \"./agents/registry.js\";\n\nexport const CONSENSUS_MARKER = \"[CONSENSUS]\";\n\nexport function formatConversationHistory(\n messages: Array<{ role: string; agent?: AgentName; content: string }>\n): string {\n return messages\n .map((m) => {\n let label: string;\n if (m.role === \"user\") {\n label = \"User\";\n } else if (isValidAgentName(m.role)) {\n label = getAgent(m.role).displayName;\n } else if (m.agent && isValidAgentName(m.agent)) {\n label = getAgent(m.agent).displayName;\n } else {\n label = m.role;\n }\n return `[${label}]: ${m.content}`;\n })\n .join(\"\\n\\n\");\n}\n\n// --- Base prompt: anti-sycophancy rules, applies to all modes ---\n\nexport function basePrompt(): string {\n return `You are one of two expert coding agents in a structured technical discussion.\nYou will independently analyze the problem, then engage in focused rounds of\ncritique and refinement with your peer.\n\nGround rules:\n- You are evaluated on the ACCURACY and QUALITY of your final position, not\n on agreement with your peer.\n- When you change your position, you MUST name the specific argument that\n changed your mind and explain why your previous reasoning was flawed.\n Changing position without this justification is not acceptable.\n- Each response must either: (a) introduce new evidence or a new argument,\n (b) identify a specific logical flaw or unsupported claim in your peer's\n reasoning, or (c) concede a point with explicit justification. Restating\n or paraphrasing existing points is not acceptable.\n- Your peer is a different AI model with different training. Their perspective\n may reveal genuine blind spots in yours — and vice versa.`;\n}\n\n// --- Role prompt: model-specific focus + peer role description ---\n\nconst ROLE_TEMPLATES: Record<AgentName, string> = {\n claude: `Your role: Architecture & Implementation Reviewer.\n\nFocus your analysis on:\n- Code structure, design patterns, and maintainability\n- Multi-file coherence — how changes ripple across the codebase\n- Production readiness — error handling, logging, edge cases in real usage\n- Proposing complete, working implementations (not just pseudocode)\n\nWhen you propose a solution, provide the actual implementation. When you\ncritique, point to specific structural issues and show what the fix looks\nlike. Your peer's role is {peerRole} — they will stress-test your proposals\nfrom a different angle.`,\n\n codex: `Your role: Correctness & Standards Reviewer.\n\nFocus your analysis on:\n- Algorithmic correctness — does the logic actually work for all inputs?\n- Edge cases and failure modes — what breaks, what's untested?\n- Standards compliance — does this follow language/framework conventions?\n- Performance characteristics — time/space complexity, benchmarks\n\nWhen you critique, provide specific test cases or inputs that demonstrate\nthe issue. When you propose alternatives, explain the correctness guarantees.\nYour peer's role is {peerRole} — they will focus on different aspects of the\nsame problem.`,\n\n gemini: `Your role: Strategic Context Analyst.\n\nFocus your analysis on:\n- Broad codebase context — how does this change fit the larger system?\n- Current ecosystem conventions — what do the docs, community, and recent\n releases recommend?\n- Upstream and downstream effects — what will this break or enable elsewhere?\n- Scope and planning — is this the right approach at the right level of\n abstraction?\n\nWhen you critique, ground your position in the broader context your peer may\nbe missing. When you propose alternatives, explain the architectural tradeoffs.\nYour peer's role is {peerRole} — they will focus on different aspects of the\nsame problem.`,\n};\n\nexport function rolePrompt(agent: AgentName, pair: [AgentName, AgentName]): string {\n const template = ROLE_TEMPLATES[agent];\n const peerRole = getPeerRoleDescription(agent, pair);\n return template.replace(\"{peerRole}\", peerRole);\n}\n\n// --- Collaboration system prompt: normal mode, round 1 ---\n\nexport function collaborationSystemPrompt(agent: AgentName, pair: [AgentName, AgentName]): string {\n return `${basePrompt()}\n\n${rolePrompt(agent, pair)}`;\n}\n\n// --- Discussion round prompt: normal mode, rounds 2+ ---\n\nexport function discussionRoundPrompt(\n agent: AgentName,\n conversationContext: string,\n pair: [AgentName, AgentName]\n): string {\n return `${basePrompt()}\n\n${rolePrompt(agent, pair)}\n\nHere is the discussion so far:\n\n${conversationContext}\n\nFor this round:\n1. What is the strongest point in your peer's response?\n2. What is the weakest point, or what claim lacks supporting evidence?\n3. Has your position changed? State one of: HELD / PARTIALLY_CHANGED / CHANGED\n — with explicit reasoning for why.\n4. If proposing code, show the specific implementation and explain tradeoffs\n versus your peer's approach.\n5. Confidence in your current position: LOW | MEDIUM | HIGH\n\nCONFIDENCE: HIGH | MEDIUM | LOW\n\nKeep it concise. Do not restate points already established.`;\n}\n\n// --- Debate system prompt: discuss mode, round 1 ---\n\nexport function debateSystemPrompt(agent: AgentName, pair: [AgentName, AgentName]): string {\n return `${basePrompt()}\n\n${rolePrompt(agent, pair)}\n\nThis is a structured discussion aimed at reaching a well-reasoned position\nthrough genuine deliberation.\n\nAdditional rules for discussion mode:\n- Structure your arguments: STATE your claim, provide EVIDENCE (code examples,\n documentation, benchmarks), explain your REASONING connecting evidence to\n claim, and note CAVEATS (when your claim doesn't hold).\n- Express confidence: end your response with CONFIDENCE: HIGH | MEDIUM | LOW\n and a one-line explanation of what would change your mind.\n- Consensus signaling: when you believe you and your peer agree on all key\n points AND your confidence is HIGH, end your response with ${CONSENSUS_MARKER} on\n its own line. Only signal consensus when:\n (a) You can state the shared position in one sentence\n (b) You have HIGH confidence\n (c) You are not just deferring — you genuinely agree with the reasoning`;\n}\n\n// --- Debate round prompt: discuss mode, rounds 2+ ---\n\nexport function debateRoundPrompt(\n agent: AgentName,\n conversationContext: string,\n pair: [AgentName, AgentName]\n): string {\n return `${debateSystemPrompt(agent, pair)}\n\n${conversationContext}\n\nFor this round:\n1. Address your peer's strongest argument directly — do you accept it? Why or\n why not?\n2. If your peer identified a flaw in your reasoning, acknowledge it explicitly\n or defend with new evidence.\n3. State your current position with EVIDENCE and REASONING.\n4. CONFIDENCE: HIGH | MEDIUM | LOW — what specific evidence would change\n your remaining position?\n5. If consensus: state the shared position in one sentence, then ${CONSENSUS_MARKER}.\n\nPOSITION: HELD | PARTIALLY_CHANGED | CHANGED`;\n}\n\n// --- Steelman prompt: discuss mode, round 2 ---\n\nexport function steelmanPrompt(): string {\n return `You and your peer appear to largely agree after Round 1. Before confirming\nconsensus, steelman the opposing view:\n\n- What is the strongest argument AGAINST your shared position?\n- What context or edge case might make a different approach better?\n- Is there a tradeoff you're both overlooking?\n\nIf after considering the counterarguments you still hold your position, explain\nwhy the counterarguments don't apply here. Then proceed with your normal round\nresponse.\n\n`;\n}\n\n// --- Direct prompt: single-agent address ---\n\nexport function directPrompt(agent: AgentName, conversationHistory: string): string {\n const profile = getAgentProfile(agent);\n const focusAreas = profile.focus.map((f) => `- ${f}`).join(\"\\n\");\n\n return `You are being addressed directly in a multi-agent session. The user wants YOUR\nspecific perspective.\n\nHere is the conversation so far:\n${conversationHistory}\n\nRespond to the user's latest message. Focus on your area of expertise:\n${focusAreas}\n\nBe concise and direct.`;\n}\n","import type { AgentName } from \"./agents/types.js\";\nimport { formatConversationHistory } from \"./prompts.js\";\n\n// --- Types ---\n\nexport type ConfidenceLevel = \"LOW\" | \"MEDIUM\" | \"HIGH\";\nexport type PositionChange = \"HELD\" | \"PARTIALLY_CHANGED\" | \"CHANGED\";\nexport type TerminationReason = \"mutual-consensus\" | \"stale-no-progress\" | \"cyclic-swap\" | \"max-rounds\";\n\nexport interface RoundAnalysis {\n agent: AgentName;\n confidence: ConfidenceLevel;\n positionChange: PositionChange;\n signaledConsensus: boolean;\n hasNovelContent: boolean;\n}\n\nexport interface DiscussionState {\n round: number;\n analyses: RoundAnalysis[][]; // per discussion round\n terminated: boolean;\n terminationReason?: TerminationReason;\n}\n\n// --- Parsing ---\n\nconst CONFIDENCE_RE = /CONFIDENCE:\\s*(HIGH|MEDIUM|LOW)/i;\nconst POSITION_RE = /POSITION:\\s*(HELD|PARTIALLY_CHANGED|CHANGED)/i;\nconst CONSENSUS_RE = /\\[CONSENSUS\\]/;\n\nexport function parseRoundAnalysis(agent: AgentName, responseText: string): RoundAnalysis {\n const confidenceMatch = responseText.match(CONFIDENCE_RE);\n const positionMatch = responseText.match(POSITION_RE);\n const signaledConsensus = CONSENSUS_RE.test(responseText);\n\n // hasNovelContent: true if the response is substantial (more than just markers/boilerplate)\n // Strip out markers and whitespace, check if meaningful content remains\n const stripped = responseText\n .replace(CONFIDENCE_RE, \"\")\n .replace(POSITION_RE, \"\")\n .replace(CONSENSUS_RE, \"\")\n .trim();\n const hasNovelContent = stripped.length > 100;\n\n return {\n agent,\n confidence: (confidenceMatch?.[1]?.toUpperCase() as ConfidenceLevel) ?? \"MEDIUM\",\n positionChange: (positionMatch?.[1]?.toUpperCase() as PositionChange) ?? \"HELD\",\n signaledConsensus,\n hasNovelContent,\n };\n}\n\n// --- Termination detection ---\n\nexport function checkTermination(\n state: DiscussionState,\n maxRounds: number\n): { terminated: boolean; reason?: TerminationReason } {\n const { round, analyses } = state;\n\n // 1. Mutual consensus: both agents signaled [CONSENSUS] AND both HIGH confidence\n if (analyses.length > 0) {\n const latest = analyses[analyses.length - 1];\n if (latest && latest.length >= 2) {\n const allConsensus = latest.every((a) => a.signaledConsensus);\n const allHigh = latest.every((a) => a.confidence === \"HIGH\");\n if (allConsensus && allHigh) {\n return { terminated: true, reason: \"mutual-consensus\" };\n }\n }\n }\n\n // 2. Stale: two consecutive rounds where both agents HELD and no novel content\n if (analyses.length >= 2) {\n const prev = analyses[analyses.length - 2];\n const curr = analyses[analyses.length - 1];\n if (prev && curr && prev.length >= 2 && curr.length >= 2) {\n const prevStale = prev.every((a) => a.positionChange === \"HELD\" && !a.hasNovelContent);\n const currStale = curr.every((a) => a.positionChange === \"HELD\" && !a.hasNovelContent);\n if (prevStale && currStale) {\n return { terminated: true, reason: \"stale-no-progress\" };\n }\n }\n }\n\n // 3. Cyclic swap: both agents CHANGED in two consecutive rounds\n if (analyses.length >= 2) {\n const prev = analyses[analyses.length - 2];\n const curr = analyses[analyses.length - 1];\n if (prev && curr && prev.length >= 2 && curr.length >= 2) {\n const prevSwap = prev.every((a) => a.positionChange === \"CHANGED\");\n const currSwap = curr.every((a) => a.positionChange === \"CHANGED\");\n if (prevSwap && currSwap) {\n return { terminated: true, reason: \"cyclic-swap\" };\n }\n }\n }\n\n // 4. Max rounds\n if (round >= maxRounds) {\n return { terminated: true, reason: \"max-rounds\" };\n }\n\n return { terminated: false };\n}\n\n// --- Termination display messages ---\n\nexport function terminationMessage(reason: TerminationReason): string {\n switch (reason) {\n case \"mutual-consensus\":\n return \"Consensus reached.\";\n case \"stale-no-progress\":\n return \"Discussion stalled — no new arguments. Showing final positions.\";\n case \"cyclic-swap\":\n return \"Agents are trading positions. Showing both perspectives.\";\n case \"max-rounds\":\n return \"Maximum rounds reached. Showing final positions.\";\n }\n}\n\n// --- Steelman injection decision ---\n\nexport function shouldInjectSteelman(state: DiscussionState): boolean {\n // Always inject steelman prompt in round 2 (after round 1 completes)\n return state.round === 1 && state.analyses.length === 1;\n}\n\n// --- Context building ---\n\nexport function buildConversationContext(\n allMessages: Array<{ role: string; agent?: AgentName; content: string }>,\n analyses: RoundAnalysis[][],\n currentRound: number,\n _pair: [AgentName, AgentName]\n): string {\n // Rounds 1-2: full history\n if (currentRound <= 2) {\n return formatConversationHistory(allMessages);\n }\n\n // Round 3+: structured summary of earlier rounds + full text of latest round\n const summaryParts: string[] = [];\n\n // Summarize earlier rounds from analyses\n for (let i = 0; i < analyses.length - 1; i++) {\n const roundAnalyses = analyses[i];\n if (!roundAnalyses) continue;\n const roundSummary = roundAnalyses.map((a) => {\n return `${a.agent}: confidence=${a.confidence}, position=${a.positionChange}${a.signaledConsensus ? \", signaled consensus\" : \"\"}`;\n }).join(\"; \");\n summaryParts.push(`Round ${i + 1}: ${roundSummary}`);\n }\n\n // Get messages from the latest round only (last 2-3 messages: possibly user + 2 agents)\n // Find the boundary: messages for the latest discussion round\n const latestMessages = allMessages.slice(-3);\n\n const summary = summaryParts.length > 0\n ? `Previous rounds summary:\\n${summaryParts.join(\"\\n\")}\\n\\nLatest exchange:\\n${formatConversationHistory(latestMessages)}`\n : formatConversationHistory(allMessages);\n\n return summary;\n}\n\n// --- Metadata conversion ---\n\nexport function analysisToMetadata(analysis: RoundAnalysis): Record<string, unknown> {\n return {\n confidence: analysis.confidence,\n positionChange: analysis.positionChange,\n signaledConsensus: analysis.signaledConsensus,\n hasNovelContent: analysis.hasNovelContent,\n };\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport type { AgentName } from \"./agents/types.js\";\nimport { getAgent } from \"./agents/registry.js\";\n\nconst FAST_MODELS: Record<AgentName, string> = {\n claude: \"haiku\",\n gemini: \"gemini-2.0-flash\",\n codex: \"gpt-5.3-codex\",\n};\n\nexport interface ExpandResult {\n original: string;\n expanded: string;\n}\n\nfunction gatherProjectContext(cwd: string): string {\n const parts: string[] = [];\n\n try {\n const pkgPath = join(cwd, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const info: string[] = [];\n if (pkg.name) info.push(`name: ${pkg.name}`);\n if (pkg.description) info.push(`description: ${pkg.description}`);\n const deps = [\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.devDependencies ?? {}),\n ].slice(0, 15);\n if (deps.length > 0) info.push(`dependencies: ${deps.join(\", \")}`);\n if (info.length > 0) parts.push(`Project: ${info.join(\"; \")}`);\n }\n } catch {}\n\n try {\n const readmePath = join(cwd, \"README.md\");\n if (existsSync(readmePath)) {\n const readme = readFileSync(readmePath, \"utf-8\").slice(0, 500);\n parts.push(`README excerpt:\\n${readme}`);\n }\n } catch {}\n\n try {\n const recentFiles = execSync(\n \"git diff --name-only HEAD~5 2>/dev/null || ls -t | head -20\",\n { cwd, encoding: \"utf-8\", timeout: 3000 },\n ).trim();\n if (recentFiles) parts.push(`Recently changed files:\\n${recentFiles}`);\n } catch {}\n\n return parts.join(\"\\n\\n\");\n}\n\nconst EXPANSION_SYSTEM_PROMPT = `You are a prompt expansion assistant for a multi-agent coding tool. Your job is to rewrite terse user prompts into specific, actionable versions.\n\nRules:\n- Preserve the user's intent exactly — do not add requirements they didn't ask for\n- Make implicit context explicit using the project information provided\n- Keep the expanded prompt to 2-4 sentences\n- Output ONLY the expanded prompt, no preamble or explanation`;\n\nexport async function expandPrompt(\n prompt: string,\n agent: AgentName,\n cwd: string,\n signal?: AbortSignal,\n): Promise<ExpandResult> {\n try {\n const context = gatherProjectContext(cwd);\n const systemPrompt = context\n ? `${EXPANSION_SYSTEM_PROMPT}\\n\\nProject context:\\n${context}`\n : EXPANSION_SYSTEM_PROMPT;\n\n const descriptor = getAgent(agent);\n const response = await descriptor.run({\n prompt: `Expand this prompt:\\n\\n${prompt}`,\n systemPrompt,\n model: FAST_MODELS[agent],\n cwd,\n signal,\n });\n\n const expanded = response.text?.trim();\n if (!expanded) return { original: prompt, expanded: prompt };\n\n return { original: prompt, expanded };\n } catch {\n return { original: prompt, expanded: prompt };\n }\n}\n","import React, { useState } from \"react\";\nimport { render, Box, Text, useApp, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport { loadConfig, setConfigValue } from \"./config.js\";\nimport type { TagTeamConfig } from \"./config.js\";\nimport { validateAgentPair } from \"./agents/registry.js\";\n\ninterface ConfigField {\n key: string;\n label: string;\n get: (c: TagTeamConfig) => string;\n type: \"string\" | \"number\";\n validate?: (value: string) => string | null;\n}\n\nconst CONFIG_FIELDS: ConfigField[] = [\n {\n key: \"agents\",\n label: \"Agent pair\",\n get: (c) => c.agents.join(\", \"),\n type: \"string\",\n validate: (value) => {\n try {\n const names = value.split(\",\").map((s) => s.trim());\n validateAgentPair(names);\n return null;\n } catch (e: any) {\n return e.message;\n }\n },\n },\n {\n key: \"claude.model\",\n label: \"Claude model\",\n get: (c) => c.claude.model,\n type: \"string\",\n },\n {\n key: \"codex.model\",\n label: \"Codex model\",\n get: (c) => c.codex.model,\n type: \"string\",\n },\n {\n key: \"gemini.model\",\n label: \"Gemini model\",\n get: (c) => c.gemini.model,\n type: \"string\",\n },\n {\n key: \"discussion.max_rounds\",\n label: \"Discussion max rounds\",\n get: (c) => String(c.discussion.max_rounds),\n type: \"number\",\n },\n {\n key: \"expansion.enabled\",\n label: \"Prompt expansion\",\n get: (c) => String(c.expansion.enabled),\n type: \"string\",\n validate: (v) => (v !== \"true\" && v !== \"false\") ? \"Must be 'true' or 'false'\" : null,\n },\n];\n\nconst LABEL_WIDTH = Math.max(...CONFIG_FIELDS.map((f) => f.label.length));\n\ntype EditMode = \"select\" | \"edit\";\n\ninterface InlineConfigEditorProps {\n isActive: boolean;\n onClose: () => void;\n}\n\nexport function InlineConfigEditor({ isActive, onClose }: InlineConfigEditorProps) {\n const [config, setConfig] = useState(() => loadConfig());\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [mode, setMode] = useState<EditMode>(\"select\");\n const [editValue, setEditValue] = useState(\"\");\n const [savedMessage, setSavedMessage] = useState<string | null>(null);\n\n useInput(\n (input, key) => {\n if (key.upArrow) {\n setSavedMessage(null);\n setSelectedIndex((i) => (i > 0 ? i - 1 : CONFIG_FIELDS.length - 1));\n } else if (key.downArrow) {\n setSavedMessage(null);\n setSelectedIndex((i) => (i < CONFIG_FIELDS.length - 1 ? i + 1 : 0));\n } else if (key.return) {\n const field = CONFIG_FIELDS[selectedIndex];\n setEditValue(field.get(config));\n setSavedMessage(null);\n setMode(\"edit\");\n } else if (key.escape || input === \"q\") {\n onClose();\n }\n },\n { isActive: isActive && mode === \"select\" }\n );\n\n useInput(\n (_input, key) => {\n if (key.escape) {\n setMode(\"select\");\n }\n },\n { isActive: isActive && mode === \"edit\" }\n );\n\n const handleEditSubmit = (value: string) => {\n const field = CONFIG_FIELDS[selectedIndex];\n\n if (field.type === \"number\") {\n const n = Number(value);\n if (!Number.isInteger(n) || n < 1) {\n setSavedMessage(\"Error: must be a positive integer\");\n setMode(\"select\");\n return;\n }\n }\n\n if (field.validate) {\n const error = field.validate(value);\n if (error) {\n setSavedMessage(`Error: ${error}`);\n setMode(\"select\");\n return;\n }\n }\n\n try {\n const updated = setConfigValue(field.key, value);\n setConfig(updated);\n setSavedMessage(`Saved ${field.key} = ${value}`);\n } catch (e: any) {\n setSavedMessage(`Error: ${e.message}`);\n }\n\n setMode(\"select\");\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Configuration</Text>\n <Text dimColor> ── edit values inline</Text>\n </Box>\n\n {CONFIG_FIELDS.map((field, i) => {\n const selected = i === selectedIndex;\n const pointer = selected ? \"> \" : \" \";\n const currentValue = field.get(config);\n\n return (\n <Box key={field.key} marginLeft={1}>\n <Text color={selected ? \"cyan\" : undefined} bold={selected}>\n {pointer}\n {field.label.padEnd(LABEL_WIDTH)}\n </Text>\n <Text dimColor> = </Text>\n {mode === \"edit\" && selected ? (\n <TextInput\n value={editValue}\n onChange={setEditValue}\n onSubmit={handleEditSubmit}\n showCursor\n />\n ) : (\n <Text color=\"white\">{currentValue}</Text>\n )}\n </Box>\n );\n })}\n\n {savedMessage && (\n <Box marginTop={1} marginLeft={1}>\n <Text color={savedMessage.startsWith(\"Error\") ? \"red\" : \"green\"}>\n {savedMessage}\n </Text>\n </Box>\n )}\n\n <Box marginTop={1} marginLeft={1}>\n <Text dimColor>\n {mode === \"edit\"\n ? \"Enter save Esc cancel\"\n : \"↑↓ navigate Enter edit Esc/q quit\"}\n </Text>\n </Box>\n </Box>\n );\n}\n\n// Standalone entrypoint for `tagteam config edit`\nfunction StandaloneConfigEditor() {\n const { exit } = useApp();\n return <InlineConfigEditor isActive={true} onClose={exit} />;\n}\n\nexport function startConfigEditor() {\n return render(<StandaloneConfigEditor />);\n}\n"],"mappings":"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","names":["execSync","React","useState","render","Box","Text","useApp","useInput","TextInput","spawn","createInterface","spawn","execSync","join","join","db","db","db","readFileSync","existsSync","execSync","join","join","existsSync","readFileSync","execSync","jsx","jsxs","adHoc","Text","React","AgentResponseBlock","Box","UserMessage","ExpandedPromptBlock","useState","TextInput","showTranscript","useApp","useInput","render","execSync","session","dbMessages","transcript","instance"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/ui.tsx","../src/agents/claude.ts","../src/agents/codex.ts","../src/agents/gemini.ts","../src/agents/registry.ts","../src/format.ts","../src/clipboard.ts","../src/gist.ts","../src/db/index.ts","../src/db/sessions.ts","../src/db/messages.ts","../src/prompts.ts","../src/discussion.ts","../src/expand.ts","../src/config-editor.tsx"],"sourcesContent":["import { Command } from \"commander\";\nimport { createRequire } from \"node:module\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport { loadConfig, setConfigValue } from \"./config.js\";\nimport { startApp, showTranscript, showTranscriptMarkdown, showSessionList } from \"./ui.js\";\nimport { startConfigEditor } from \"./config-editor.js\";\nimport type { AgentName } from \"./agents/types.js\";\nimport { getAgent, validateAgentPair } from \"./agents/registry.js\";\nimport {\n getMostRecentSession,\n getSession,\n getSessionByPrefix,\n listSessions,\n deleteSession,\n deleteAllSessions,\n} from \"./db/sessions.js\";\nimport { getMessages } from \"./db/messages.js\";\nimport { closeDb } from \"./db/index.js\";\n\nprocess.on(\"SIGTERM\", () => { closeDb(); process.exit(0); });\nprocess.on(\"SIGINT\", () => { closeDb(); process.exit(0); });\n\nfunction checkCli(name: string, installUrl: string): boolean {\n try {\n execSync(`${name} --version`, { stdio: \"ignore\" });\n return true;\n } catch {\n console.error(\n chalk.red(`\"${name}\" not found. Install it from: ${installUrl}`)\n );\n return false;\n }\n}\n\nfunction preflight(pair: [AgentName, AgentName]): void {\n let allFound = true;\n for (const agent of pair) {\n const descriptor = getAgent(agent);\n if (!checkCli(descriptor.cliBinary, descriptor.installUrl)) {\n allFound = false;\n }\n }\n if (!allFound) {\n process.exit(1);\n }\n}\n\nfunction resolveAgentPair(opts: any, config: ReturnType<typeof loadConfig>): [AgentName, AgentName] {\n if (opts.agents) {\n const names = opts.agents.split(\",\").map((s: string) => s.trim());\n return validateAgentPair(names);\n }\n return validateAgentPair(config.agents);\n}\n\nfunction resolveAgentModels(\n pair: [AgentName, AgentName],\n opts: any,\n config: ReturnType<typeof loadConfig>\n): Record<AgentName, string> {\n return {\n claude: opts.claudeModel ?? config.claude.model,\n codex: opts.codexModel ?? config.codex.model,\n gemini: opts.geminiModel ?? config.gemini.model,\n };\n}\n\nconst program = new Command();\n\nprogram\n .name(\"tagteam\")\n .description(\"Tag Team - Orchestrate AI agents collaboratively\")\n .version(createRequire(import.meta.url)(\"../package.json\").version)\n .option(\"--agents <pair>\", \"Agent pair to use (comma-separated, e.g. claude,gemini)\")\n .option(\"--claude-model <model>\", \"Claude model to use\")\n .option(\"--codex-model <model>\", \"Codex model to use\")\n .option(\"--gemini-model <model>\", \"Gemini model to use\")\n .argument(\"[prompt...]\", \"Prompt to send to both agents\")\n .action(async (promptParts: string[], opts) => {\n const config = loadConfig();\n const pair = resolveAgentPair(opts, config);\n preflight(pair);\n const prompt = promptParts.join(\" \") || undefined;\n\n const instance = startApp({\n initialPrompt: prompt,\n agents: pair,\n agentModels: resolveAgentModels(pair, opts, config),\n config,\n });\n\n await instance.waitUntilExit();\n });\n\n// Discuss - auto-loop until consensus\nprogram\n .command(\"discuss\")\n .description(\"Have agents discuss a topic until they reach consensus\")\n .argument(\"<prompt...>\", \"Topic to discuss\")\n .action(async (promptParts: string[]) => {\n const config = loadConfig();\n const parentOpts = program.opts();\n const pair = resolveAgentPair(parentOpts, config);\n preflight(pair);\n const prompt = promptParts.join(\" \");\n\n const instance = startApp({\n initialPrompt: prompt,\n agents: pair,\n agentModels: resolveAgentModels(pair, parentOpts, config),\n config,\n discuss: true,\n });\n\n await instance.waitUntilExit();\n });\n\n// Continue most recent session\nprogram\n .command(\"continue\")\n .description(\"Resume the most recent session\")\n .action(async () => {\n const config = loadConfig();\n const parentOpts = program.opts();\n const pair = resolveAgentPair(parentOpts, config);\n preflight(pair);\n const session = getMostRecentSession();\n\n if (!session) {\n console.log(chalk.red(\" No active sessions found.\"));\n process.exit(1);\n }\n\n const dbMessages = getMessages(session.id);\n const transcript = dbMessages.map((m) => ({\n id: `${m.round}-${m.role}`,\n role: m.role,\n content: m.content,\n round: m.round,\n }));\n\n const instance = startApp({\n sessionId: session.id,\n agents: pair,\n agentModels: resolveAgentModels(pair, parentOpts, config),\n config,\n showTranscript: transcript,\n });\n\n await instance.waitUntilExit();\n });\n\n// Resume a specific session\nprogram\n .command(\"resume [id]\")\n .description(\"Resume a session by ID, or pick interactively\")\n .action(async (id: string | undefined) => {\n const config = loadConfig();\n const parentOpts = program.opts();\n const pair = resolveAgentPair(parentOpts, config);\n preflight(pair);\n\n if (!id) {\n const sessions = listSessions(20);\n if (sessions.length === 0) {\n console.log(chalk.red(\" No sessions found.\"));\n process.exit(1);\n }\n\n console.log(chalk.bold(\"\\n Recent sessions:\\n\"));\n sessions.forEach((s, i) => {\n const sid = chalk.cyan(s.id.slice(0, 7));\n const title = s.title || chalk.dim(\"(untitled)\");\n const date = chalk.dim(s.updated_at);\n console.log(` ${chalk.dim(`${i + 1}.`)} ${sid} ${title} ${date}`);\n });\n console.log();\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise<void>((resolve) => {\n rl.question(\" Select session number: \", async (input) => {\n rl.close();\n const num = parseInt(input.trim(), 10);\n if (isNaN(num) || num < 1 || num > sessions.length) {\n console.log(chalk.red(\" Invalid selection.\"));\n closeDb();\n resolve();\n return;\n }\n\n const session = sessions[num - 1];\n const dbMessages = getMessages(session.id);\n const transcript = dbMessages.map((m) => ({\n id: `${m.round}-${m.role}`,\n role: m.role,\n content: m.content,\n round: m.round,\n }));\n\n const instance = startApp({\n sessionId: session.id,\n agents: pair,\n agentModels: resolveAgentModels(pair, parentOpts, config),\n config,\n showTranscript: transcript,\n });\n\n await instance.waitUntilExit();\n resolve();\n });\n });\n }\n\n const session = getSession(id) || getSessionByPrefix(id);\n if (!session) {\n console.log(chalk.red(` Session not found: ${id}`));\n process.exit(1);\n }\n\n const dbMessages = getMessages(session.id);\n const transcript = dbMessages.map((m) => ({\n id: `${m.round}-${m.role}`,\n role: m.role,\n content: m.content,\n round: m.round,\n }));\n\n const instance = startApp({\n sessionId: session.id,\n agents: pair,\n agentModels: resolveAgentModels(pair, parentOpts, config),\n config,\n showTranscript: transcript,\n });\n\n await instance.waitUntilExit();\n });\n\n// History\nconst historyCmd = program\n .command(\"history\")\n .description(\"List, remove, or clear sessions\")\n .option(\"-n, --limit <n>\", \"Number of sessions to show\", parseInt, 20)\n .action((opts) => {\n const sessions = listSessions(opts.limit);\n console.log(chalk.bold(\"\\n Recent sessions:\\n\"));\n showSessionList(sessions);\n console.log();\n closeDb();\n });\n\nhistoryCmd\n .command(\"rm <id>\")\n .description(\"Delete a session by ID or prefix\")\n .action((id: string) => {\n const session = getSession(id) || getSessionByPrefix(id);\n if (!session) {\n console.log(chalk.red(` Session not found: ${id}`));\n process.exit(1);\n }\n deleteSession(session.id);\n const sid = session.id.slice(0, 7);\n const title = session.title || \"(untitled)\";\n console.log(chalk.green(` Deleted session ${sid} — ${title}`));\n closeDb();\n });\n\nhistoryCmd\n .command(\"clear\")\n .description(\"Delete all sessions\")\n .action(async () => {\n const sessions = listSessions();\n if (sessions.length === 0) {\n console.log(chalk.yellow(\" No sessions to delete.\"));\n closeDb();\n return;\n }\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(\n chalk.yellow(` Delete all ${sessions.length} session(s)? [y/N] `),\n (answer) => {\n rl.close();\n if (answer.trim().toLowerCase() === \"y\") {\n deleteAllSessions();\n console.log(chalk.green(` Deleted ${sessions.length} session(s).`));\n } else {\n console.log(\" Cancelled.\");\n }\n closeDb();\n }\n );\n });\n\n// Show transcript\nprogram\n .command(\"show <id>\")\n .description(\"Print full transcript for a session\")\n .option(\"-m, --markdown\", \"Output as GitHub-compatible markdown\")\n .action((id: string, opts: { markdown?: boolean }) => {\n const session = getSession(id) || getSessionByPrefix(id);\n if (!session) {\n console.log(chalk.red(` Session not found: ${id}`));\n process.exit(1);\n }\n\n if (opts.markdown) {\n process.stdout.write(showTranscriptMarkdown(session.id));\n } else {\n showTranscript(session.id);\n }\n closeDb();\n });\n\n// Config commands\nconst configCmd = program\n .command(\"config\")\n .description(\"Manage configuration\")\n .action(async () => {\n const instance = startConfigEditor();\n await instance.waitUntilExit();\n });\n\nconfigCmd\n .command(\"edit\")\n .description(\"Interactively edit configuration\")\n .action(async () => {\n const instance = startConfigEditor();\n await instance.waitUntilExit();\n });\n\nconfigCmd\n .command(\"show\")\n .description(\"Show current configuration\")\n .action(() => {\n const config = loadConfig();\n console.log(chalk.bold(\"\\n Configuration:\\n\"));\n console.log(\n chalk.dim(\" agents = \") + chalk.white(config.agents.join(\", \"))\n );\n console.log(\n chalk.dim(\" claude.model = \") + chalk.white(config.claude.model)\n );\n console.log(\n chalk.dim(\" codex.model = \") + chalk.white(config.codex.model)\n );\n console.log(\n chalk.dim(\" gemini.model = \") + chalk.white(config.gemini.model)\n );\n console.log(\n chalk.dim(\" discussion.max_rounds = \") + chalk.white(String(config.discussion.max_rounds))\n );\n console.log(\n chalk.dim(\" expansion.enabled = \") + chalk.white(String(config.expansion.enabled))\n );\n console.log();\n });\n\nconfigCmd\n .command(\"set <key> <value>\")\n .description(\"Set a configuration value\")\n .action((key: string, value: string) => {\n try {\n setConfigValue(key, value);\n console.log(chalk.green(` Set ${key} = ${value}`));\n } catch (e: any) {\n console.log(chalk.red(` ${e.message}`));\n process.exit(1);\n }\n });\n\nprogram.parseAsync();\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse, stringify } from \"smol-toml\";\n\nexport interface TagTeamConfig {\n agents: [string, string];\n claude: {\n model: string;\n };\n codex: {\n model: string;\n };\n gemini: {\n model: string;\n };\n discussion: {\n max_rounds: number;\n };\n expansion: {\n enabled: boolean;\n };\n}\n\nconst DEFAULT_CONFIG: TagTeamConfig = {\n agents: [\"claude\", \"codex\"],\n claude: {\n model: \"sonnet\",\n },\n codex: {\n model: \"gpt-5.3-codex\",\n },\n gemini: {\n model: \"gemini-2.5-pro\",\n },\n discussion: {\n max_rounds: 5,\n },\n expansion: {\n enabled: false,\n },\n};\n\nexport function getConfigDir(): string {\n if (process.platform === \"win32\") {\n return join(\n process.env.APPDATA || join(homedir(), \"AppData\", \"Roaming\"),\n \"tagteam\"\n );\n }\n return join(homedir(), \".tagteam\");\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.toml\");\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nexport function loadConfig(): TagTeamConfig {\n const configPath = getConfigPath();\n\n if (!existsSync(configPath)) {\n return { ...DEFAULT_CONFIG };\n }\n\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = parse(raw) as any;\n return {\n agents: Array.isArray(parsed.agents) && parsed.agents.length === 2\n ? parsed.agents as [string, string]\n : [...DEFAULT_CONFIG.agents],\n claude: { ...DEFAULT_CONFIG.claude, ...parsed.claude },\n codex: { ...DEFAULT_CONFIG.codex, ...parsed.codex },\n gemini: { ...DEFAULT_CONFIG.gemini, ...parsed.gemini },\n discussion: { ...DEFAULT_CONFIG.discussion, ...parsed.discussion },\n expansion: { ...DEFAULT_CONFIG.expansion, ...parsed.expansion },\n };\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport function saveConfig(config: TagTeamConfig): void {\n ensureConfigDir();\n const configPath = getConfigPath();\n writeFileSync(configPath, stringify(config as any), \"utf-8\");\n}\n\nexport function setConfigValue(\n key: string,\n value: string\n): TagTeamConfig {\n const config = loadConfig();\n const parts = key.split(\".\");\n\n if (parts.length === 1) {\n switch (parts[0]) {\n case \"agents\":\n config.agents = value.split(\",\").map((s) => s.trim()) as [string, string];\n break;\n case \"claude_model\":\n config.claude.model = value;\n break;\n case \"codex_model\":\n config.codex.model = value;\n break;\n case \"gemini_model\":\n config.gemini.model = value;\n break;\n case \"discussion_max_rounds\":\n config.discussion.max_rounds = Number(value);\n break;\n case \"expansion_enabled\":\n config.expansion.enabled = value.toLowerCase() === \"true\";\n break;\n default:\n throw new Error(`Unknown config key: ${key}`);\n }\n } else if (parts.length === 2) {\n const [section, field] = parts;\n if (section === \"claude\" && field === \"model\") {\n config.claude.model = value;\n } else if (section === \"codex\" && field === \"model\") {\n config.codex.model = value;\n } else if (section === \"gemini\" && field === \"model\") {\n config.gemini.model = value;\n } else if (section === \"discussion\" && field === \"max_rounds\") {\n config.discussion.max_rounds = Number(value);\n } else if (section === \"expansion\" && field === \"enabled\") {\n config.expansion.enabled = value.toLowerCase() === \"true\";\n } else {\n throw new Error(`Unknown config key: ${key}`);\n }\n } else {\n throw new Error(`Invalid config key format: ${key}`);\n }\n\n saveConfig(config);\n return config;\n}\n","import React, { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { render, Box, Text, useApp, useInput, Static } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport Spinner from \"ink-spinner\";\nimport { marked } from \"marked\";\nimport { markedTerminal } from \"marked-terminal\";\nimport { nanoid } from \"nanoid\";\nimport type { AgentName, AgentResponse } from \"./agents/types.js\";\nimport { getAgent, getAllAgentNames, isValidAgentName } from \"./agents/registry.js\";\nimport { formatAsMarkdown } from \"./format.js\";\nimport { copyToClipboard } from \"./clipboard.js\";\nimport { createGist } from \"./gist.js\";\nimport { createSession, touchSession, updateSessionTitle } from \"./db/sessions.js\";\nimport { insertMessage, getMessages, deleteMessagesFromRound } from \"./db/messages.js\";\nimport { closeDb } from \"./db/index.js\";\nimport {\n collaborationSystemPrompt,\n discussionRoundPrompt,\n debateSystemPrompt,\n debateRoundPrompt,\n steelmanPrompt,\n directPrompt,\n formatConversationHistory,\n} from \"./prompts.js\";\nimport {\n parseRoundAnalysis,\n checkTermination,\n terminationMessage,\n shouldInjectSteelman,\n buildConversationContext,\n analysisToMetadata,\n type DiscussionState,\n} from \"./discussion.js\";\nimport { loadConfig } from \"./config.js\";\nimport type { TagTeamConfig } from \"./config.js\";\nimport { expandPrompt } from \"./expand.js\";\nimport { validateAgentPair } from \"./agents/registry.js\";\nimport { InlineConfigEditor } from \"./config-editor.js\";\n\nmarked.use(markedTerminal() as any);\n\n// --- Types ---\n\ninterface Message {\n id: string;\n role: string;\n content: string;\n round: number;\n error?: boolean;\n}\n\nexport interface AppProps {\n initialPrompt?: string;\n sessionId?: string;\n agents: [AgentName, AgentName];\n agentModels: Record<AgentName, string>;\n config: TagTeamConfig;\n showTranscript?: Message[];\n discuss?: boolean;\n}\n\ntype AppState = \"input\" | \"running\" | \"done\" | \"config\";\ntype Target = \"both\" | AgentName | [AgentName, AgentName];\n\ninterface ParsedInput {\n target: Target;\n prompt: string;\n discuss: boolean;\n}\n\nconst PAIR_SEPARATORS = /^(\\w+)\\s*(?:and|&|\\/|,)\\s*(\\w+)[\\s,]\\s*/i;\n\nfunction tryParsePair(text: string): { pair: [AgentName, AgentName]; rest: string } | null {\n const match = text.toLowerCase().match(PAIR_SEPARATORS);\n if (!match) return null;\n const [fullMatch, first, second] = match;\n if (isValidAgentName(first) && isValidAgentName(second) && first !== second) {\n return { pair: [first, second], rest: text.slice(fullMatch.length).trim() };\n }\n return null;\n}\n\nfunction parseInput(input: string): ParsedInput {\n const lower = input.toLowerCase();\n if (lower.startsWith(\"discuss \")) {\n const rest = input.slice(8).trim();\n // Check for \"discuss gemini and codex ...\"\n const adHoc = tryParsePair(rest);\n if (adHoc) {\n return { target: adHoc.pair, prompt: adHoc.rest, discuss: true };\n }\n return { target: \"both\", prompt: rest, discuss: true };\n }\n // Check for ad-hoc pair: \"gemini and codex ...\", \"gemini/codex ...\", etc.\n const adHoc = tryParsePair(input);\n if (adHoc) {\n // \"gemini and codex discuss ...\" — natural word order\n const adHocLower = adHoc.rest.toLowerCase();\n if (adHocLower.startsWith(\"discuss \")) {\n return { target: adHoc.pair, prompt: adHoc.rest.slice(8).trim(), discuss: true };\n }\n return { target: adHoc.pair, prompt: adHoc.rest, discuss: false };\n }\n // Check for single agent prefix\n for (const agent of getAllAgentNames()) {\n if (lower.startsWith(`${agent} `) || lower.startsWith(`${agent}, `)) {\n return { target: agent, prompt: input.slice(input.indexOf(\" \") + 1).trim(), discuss: false };\n }\n }\n return { target: \"both\", prompt: input, discuss: false };\n}\n\n// --- Components ---\n\nfunction RenderedMarkdown({ text }: { text: string }) {\n const rendered = useMemo(() => (marked.parse(text) as string).trimEnd(), [text]);\n return <Text>{rendered}</Text>;\n}\n\nconst AgentResponseBlock = React.memo(function AgentResponseBlock({\n agent,\n content,\n error,\n}: {\n agent: AgentName;\n content: string;\n error?: boolean;\n}) {\n const descriptor = getAgent(agent);\n\n if (error) {\n return (\n <Box flexDirection=\"column\" marginLeft={1} marginBottom={1}>\n <Text color=\"red\" bold>\n {descriptor.displayName} error:\n </Text>\n <Box marginLeft={1}>\n <Text color=\"red\">{content}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" marginLeft={1} marginBottom={1}>\n <Text color={descriptor.color} bold>\n {descriptor.displayName}:\n </Text>\n <Box marginLeft={1}>\n <RenderedMarkdown text={content} />\n </Box>\n </Box>\n );\n});\n\nfunction Header({ sessionId }: { sessionId: string }) {\n return (\n <Box marginBottom={1}>\n <Text dimColor>{\"── \"}</Text>\n <Text bold>Tag Team</Text>\n <Text dimColor>{\" ── session \"}</Text>\n <Text color=\"cyan\">{sessionId.slice(0, 7)}</Text>\n <Text dimColor>{\" \" + \"─\".repeat(35)}</Text>\n </Box>\n );\n}\n\nfunction QuickHelp() {\n const col = 38;\n const examples = [\n [\"ask anything\", \"sends to both agents\"],\n [\"gemini explain this\", \"sends to one agent\"],\n [\"discuss best approach\", \"multi-round debate\"],\n [\"gemini and codex discuss review app\", \"pick agents + debate\"],\n ];\n return (\n <Box flexDirection=\"column\" marginLeft={2} marginBottom={1}>\n {examples.map(([cmd, desc]) => (\n <Text key={cmd} dimColor>{cmd!.padEnd(col)}{\"→ \"}{desc}</Text>\n ))}\n <Text dimColor>{\"/help for more\"}</Text>\n </Box>\n );\n}\n\nconst UserMessage = React.memo(function UserMessage({ content }: { content: string }) {\n return (\n <Box marginLeft={1} marginBottom={1}>\n <Text bold color=\"white\">\n You:{\" \"}\n </Text>\n <Text>{content}</Text>\n </Box>\n );\n});\n\nconst ExpandedPromptBlock = React.memo(function ExpandedPromptBlock({ content }: { content: string }) {\n return (\n <Box flexDirection=\"column\" marginLeft={1} marginBottom={1}>\n <Text color=\"yellow\" dimColor>Expanded prompt:</Text>\n <Box marginLeft={2}>\n <Text>{content}</Text>\n </Box>\n </Box>\n );\n});\n\nfunction ThinkingIndicator({ agent }: { agent: AgentName }) {\n const descriptor = getAgent(agent);\n return (\n <Box marginLeft={1}>\n <Text color={descriptor.color}>\n <Spinner type=\"dots\" />\n </Text>\n <Text color={descriptor.color}> {descriptor.displayName} is thinking...</Text>\n </Box>\n );\n}\n\nfunction DiscussionStatus({ round, maxRounds }: { round: number; maxRounds: number }) {\n return (\n <Box marginLeft={1} marginBottom={1}>\n <Text color=\"yellow\" bold>\n Discussion round {round}/{maxRounds}\n </Text>\n </Box>\n );\n}\n\nfunction ConsensusReached() {\n return (\n <Box marginLeft={1} marginBottom={1}>\n <Text color=\"green\" bold>\n Consensus reached.\n </Text>\n </Box>\n );\n}\n\n// Session-scoped prompt history — persists across PromptInput mount/unmount cycles\nconst promptHistory: string[] = [];\n\ntype PromptControl = { setValue: (v: string) => void; getValue: () => string };\n\nfunction PromptInput({\n onSubmit,\n controlRef,\n}: {\n onSubmit: (value: string) => void;\n controlRef: React.MutableRefObject<PromptControl | null>;\n}) {\n const [value, setValue] = useState(\"\");\n const valueRef = useRef(\"\");\n valueRef.current = value;\n\n useEffect(() => {\n controlRef.current = { setValue, getValue: () => valueRef.current };\n return () => { controlRef.current = null; };\n }, [controlRef]);\n\n return (\n <Box marginLeft={1}>\n <Text bold color=\"white\">\n {\"> \"}\n </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={(submitted) => {\n if (submitted.trim()) {\n onSubmit(submitted.trim());\n setValue(\"\");\n }\n }}\n showCursor\n />\n </Box>\n );\n}\n\n// --- Main App ---\n\nfunction App({\n initialPrompt,\n sessionId: existingSessionId,\n agents: initialPair,\n agentModels: initialAgentModels,\n config: initialConfig,\n showTranscript,\n discuss: initialDiscuss,\n}: AppProps) {\n const { exit } = useApp();\n const [sessionId, setSessionId] = useState(() => existingSessionId ?? nanoid(12));\n const [messages, setMessages] = useState<Message[]>(showTranscript ?? []);\n const [state, setState] = useState<AppState>(\n initialPrompt ? \"running\" : \"input\"\n );\n const [pair, setPair] = useState<[AgentName, AgentName]>(initialPair);\n const [agentModels, setAgentModels] = useState<Record<AgentName, string>>(initialAgentModels);\n const [config, setConfig] = useState<TagTeamConfig>(initialConfig);\n const [thinkingAgents, setThinkingAgents] = useState<AgentName[]>([]);\n const [discussionRound, setDiscussionRound] = useState(0);\n const [consensusReached, setConsensusReached] = useState(false);\n const [expanding, setExpanding] = useState(false);\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n const [roundNum, setRoundNum] = useState(() => {\n if (showTranscript && showTranscript.length > 0) {\n return Math.max(...showTranscript.map((m) => m.round)) + 1;\n }\n return 0;\n });\n const [committedCount, setCommittedCount] = useState(showTranscript?.length ?? 0);\n const promptControlRef = useRef<PromptControl | null>(null);\n const historyIndexRef = useRef(-1);\n const savedInputRef = useRef(\"\");\n\n const sessionCreatedRef = useRef(!!existingSessionId);\n const ensureSession = (id: string) => {\n if (!sessionCreatedRef.current) {\n createSession(id, process.cwd());\n sessionCreatedRef.current = true;\n }\n };\n\n // Handle initial prompt\n useEffect(() => {\n if (initialPrompt && state === \"running\") {\n if (initialDiscuss) {\n runDiscussion(initialPrompt);\n } else {\n runRound(initialPrompt);\n }\n }\n }, []);\n\n const abortRef = useRef<AbortController | null>(null);\n const runningRoundRef = useRef<number | null>(null);\n\n // Keyboard handling (Ctrl+C, Escape, and prompt history navigation)\n useInput((input, key) => {\n if (key.ctrl && input === \"c\") {\n abortRef.current?.abort();\n closeDb();\n exit();\n }\n if (key.escape && state === \"running\") {\n abortRef.current?.abort();\n abortRef.current = null;\n\n // Remove the user prompt and any partial results from DB and state\n if (runningRoundRef.current !== null) {\n deleteMessagesFromRound(sessionId, runningRoundRef.current);\n const fromRound = runningRoundRef.current;\n const remaining = messages.filter((m) => m.round < fromRound);\n setMessages(remaining);\n setCommittedCount(remaining.length);\n runningRoundRef.current = null;\n }\n\n setThinkingAgents([]);\n setExpanding(false);\n setDiscussionRound(0);\n setStatusMessage(\"Interrupted.\");\n setState(\"input\");\n }\n // Up/down arrow prompt history (only when prompt is visible)\n if (state === \"input\" && key.upArrow && promptHistory.length > 0) {\n if (historyIndexRef.current === -1) {\n savedInputRef.current = promptControlRef.current?.getValue() ?? \"\";\n }\n const nextIndex = historyIndexRef.current === -1\n ? promptHistory.length - 1\n : Math.max(0, historyIndexRef.current - 1);\n historyIndexRef.current = nextIndex;\n promptControlRef.current?.setValue(promptHistory[nextIndex]);\n }\n if (state === \"input\" && key.downArrow && historyIndexRef.current !== -1) {\n if (historyIndexRef.current >= promptHistory.length - 1) {\n historyIndexRef.current = -1;\n promptControlRef.current?.setValue(savedInputRef.current);\n } else {\n const nextIndex = historyIndexRef.current + 1;\n historyIndexRef.current = nextIndex;\n promptControlRef.current?.setValue(promptHistory[nextIndex]);\n }\n }\n });\n\n // Run agents, save results, return new messages\n const runAgents = async (\n currentMessages: Message[],\n round: number,\n target: Target,\n promptOverride?: string,\n isDebate = false,\n systemPromptPerAgent?: Partial<Record<AgentName, string>>,\n ): Promise<Message[]> => {\n // Determine which agents to run\n const activeAgents: AgentName[] = Array.isArray(target)\n ? target\n : target === \"both\"\n ? [...pair]\n : [target];\n setThinkingAgents(activeAgents);\n\n const history = formatConversationHistory(\n currentMessages.map((m) => ({\n role: m.role,\n agent: isValidAgentName(m.role) ? m.role : undefined,\n content: m.content,\n }))\n );\n\n const cwd = process.cwd();\n const isFirstRound = round === 0 && !existingSessionId;\n\n const userPrompt = currentMessages[currentMessages.length - 1]?.content || \"\";\n const isSingleAgent = !Array.isArray(target) && target !== \"both\";\n // Use the ad-hoc pair for prompt context, or fall back to the configured pair\n const promptPair: [AgentName, AgentName] = Array.isArray(target) ? target : pair;\n\n const agentPrompt = (_agent: AgentName) => {\n if (promptOverride) return promptOverride;\n if (isSingleAgent) return userPrompt;\n if (isFirstRound) return userPrompt;\n return \"Provide your response for this round.\";\n };\n\n const agentSystemPrompt = (agent: AgentName) => {\n // Check per-agent override first (used by runDiscussion for steelman/context)\n if (systemPromptPerAgent?.[agent]) return systemPromptPerAgent[agent];\n if (isSingleAgent) {\n return history ? directPrompt(agent, history) : undefined;\n }\n if (isDebate) {\n if (isFirstRound) return debateSystemPrompt(agent, promptPair);\n return debateRoundPrompt(agent, history, promptPair);\n }\n if (isFirstRound) return collaborationSystemPrompt(agent, promptPair);\n return discussionRoundPrompt(agent, history, promptPair);\n };\n\n const ac = abortRef.current ?? new AbortController();\n abortRef.current = ac;\n\n const results: Array<{ agent: AgentName; result: PromiseSettledResult<AgentResponse> }> = [];\n const promises: Array<Promise<void>> = [];\n\n for (const agent of activeAgents) {\n const descriptor = getAgent(agent);\n promises.push(\n descriptor.run({\n prompt: agentPrompt(agent),\n systemPrompt: agentSystemPrompt(agent),\n model: agentModels[agent],\n cwd,\n signal: ac.signal,\n }).then(\n (value) => { results.push({ agent, result: { status: \"fulfilled\", value } }); },\n (reason) => { results.push({ agent, result: { status: \"rejected\", reason } }); }\n )\n );\n }\n\n await Promise.all(promises);\n abortRef.current = null;\n\n // If aborted, bail out — the Escape handler already reset UI state\n if (ac.signal.aborted) return [];\n\n setThinkingAgents([]);\n\n const newMessages: Message[] = [];\n\n for (const { agent, result } of results) {\n if (result.status === \"fulfilled\") {\n const resp = result.value;\n const msg: Message = {\n id: `${round}-${agent}`,\n role: agent,\n content: resp.error || resp.text,\n round,\n error: !!resp.error,\n };\n newMessages.push(msg);\n const metadata = isDebate && !resp.error\n ? analysisToMetadata(parseRoundAnalysis(agent, resp.text))\n : undefined;\n insertMessage({\n sessionId,\n role: agent,\n content: resp.error || resp.text,\n round,\n durationMs: resp.durationMs,\n metadata,\n });\n } else {\n const errorMsg = result.reason?.message || \"Failed to run\";\n const msg: Message = {\n id: `${round}-${agent}`,\n role: agent,\n content: errorMsg,\n round,\n error: true,\n };\n newMessages.push(msg);\n insertMessage({\n sessionId,\n role: agent,\n content: `[Error: ${errorMsg}]`,\n round,\n });\n }\n }\n\n return newMessages;\n };\n\n const runRound = async (rawInput: string) => {\n const { target, prompt, discuss } = parseInput(rawInput);\n\n if (discuss) {\n return runDiscussion(prompt, Array.isArray(target) ? target : undefined);\n }\n\n const currentRound = roundNum;\n runningRoundRef.current = currentRound;\n\n // Ensure session row exists and set title on first prompt\n ensureSession(sessionId);\n if (currentRound === 0) {\n const title = prompt.length > 60 ? prompt.slice(0, 57) + \"...\" : prompt;\n updateSessionTitle(sessionId, title);\n }\n\n // Add user message\n const userMsg: Message = {\n id: `${currentRound}-user`,\n role: \"user\",\n content: rawInput,\n round: currentRound,\n };\n setMessages((prev) => [...prev, userMsg]);\n insertMessage({\n sessionId,\n role: \"user\",\n content: rawInput,\n round: currentRound,\n });\n\n let allMessages = [...messages, userMsg];\n let effectivePrompt: string | undefined;\n\n // Expand the prompt on first round of a new session\n if (config.expansion.enabled && currentRound === 0 && !existingSessionId) {\n const ac = new AbortController();\n abortRef.current = ac;\n setExpanding(true);\n try {\n const result = await expandPrompt(prompt, pair[0], process.cwd(), ac.signal);\n if (result.expanded !== result.original) {\n const expandedMsg: Message = {\n id: `${currentRound}-expanded`,\n role: \"expanded\",\n content: result.expanded,\n round: currentRound,\n };\n setMessages((prev) => [...prev, expandedMsg]);\n insertMessage({\n sessionId,\n role: \"expanded\",\n content: result.expanded,\n round: currentRound,\n });\n allMessages = [...allMessages, expandedMsg];\n effectivePrompt = result.expanded;\n }\n } catch {\n // Silent fallback to original prompt\n } finally {\n setExpanding(false);\n }\n // If aborted during expansion, bail out\n if (ac.signal.aborted) return;\n }\n\n const newMessages = await runAgents(allMessages, currentRound, target, effectivePrompt);\n\n // If aborted, the Escape handler already cleaned up\n if (newMessages.length === 0) return;\n\n const expandedCount = effectivePrompt ? 1 : 0;\n setMessages((prev) => [...prev, ...newMessages]);\n setCommittedCount((prev) => prev + 1 + expandedCount + newMessages.length);\n setRoundNum(currentRound + 1);\n runningRoundRef.current = null;\n\n touchSession(sessionId);\n setState(\"input\");\n };\n\n const runDiscussion = async (prompt: string, adHocPair?: [AgentName, AgentName]) => {\n const discussionTarget: Target = adHocPair ?? \"both\";\n const activePair: [AgentName, AgentName] = adHocPair ?? pair;\n setConsensusReached(false);\n let currentRound = roundNum;\n runningRoundRef.current = currentRound;\n\n // Ensure session row exists and set title on first prompt\n ensureSession(sessionId);\n if (currentRound === 0) {\n const title = prompt.length > 60 ? prompt.slice(0, 57) + \"...\" : prompt;\n updateSessionTitle(sessionId, title);\n }\n\n // Add user message\n const userMsg: Message = {\n id: `${currentRound}-user`,\n role: \"user\",\n content: `discuss ${prompt}`,\n round: currentRound,\n };\n setMessages((prev) => [...prev, userMsg]);\n insertMessage({\n sessionId,\n role: \"user\",\n content: `discuss ${prompt}`,\n round: currentRound,\n });\n\n let allMessages = [...messages, userMsg];\n let effectivePrompt: string | undefined;\n\n // Expand the prompt on first round of a new session\n if (config.expansion.enabled && currentRound === 0 && !existingSessionId) {\n const ac = new AbortController();\n abortRef.current = ac;\n setExpanding(true);\n try {\n const result = await expandPrompt(prompt, activePair[0], process.cwd(), ac.signal);\n if (result.expanded !== result.original) {\n const expandedMsg: Message = {\n id: `${currentRound}-expanded`,\n role: \"expanded\",\n content: result.expanded,\n round: currentRound,\n };\n setMessages((prev) => [...prev, expandedMsg]);\n insertMessage({\n sessionId,\n role: \"expanded\",\n content: result.expanded,\n round: currentRound,\n });\n allMessages = [...allMessages, expandedMsg];\n effectivePrompt = result.expanded;\n }\n } catch {\n // Silent fallback to original prompt\n } finally {\n setExpanding(false);\n }\n // If aborted during expansion, bail out\n if (ac.signal.aborted) return;\n }\n\n // Initialize discussion state for orchestrator logic\n const discState: DiscussionState = {\n round: 0,\n analyses: [],\n terminated: false,\n };\n\n for (let disc = 1; disc <= config.discussion.max_rounds; disc++) {\n setDiscussionRound(disc);\n discState.round = disc;\n\n // Build per-agent system prompts based on round\n let perAgentPrompts: Partial<Record<AgentName, string>> | undefined;\n\n if (disc >= 2) {\n const context = buildConversationContext(\n allMessages.map((m) => ({\n role: m.role,\n agent: isValidAgentName(m.role) ? m.role : undefined,\n content: m.content,\n })),\n discState.analyses,\n disc,\n activePair,\n );\n\n perAgentPrompts = {};\n for (const agent of activePair) {\n let prompt_text = \"\";\n // Inject steelman in round 2\n if (shouldInjectSteelman(discState)) {\n prompt_text += steelmanPrompt();\n }\n prompt_text += debateRoundPrompt(agent, context, activePair);\n perAgentPrompts[agent] = prompt_text;\n }\n }\n\n const newMessages = await runAgents(\n allMessages,\n currentRound,\n discussionTarget,\n disc === 1 ? (effectivePrompt ?? prompt) : \"Provide your response for this round.\",\n true,\n perAgentPrompts,\n );\n\n // If aborted, stop the discussion loop\n if (newMessages.length === 0) break;\n\n setMessages((prev) => [...prev, ...newMessages]);\n // Commit completed round to Static (first round includes the user message + optional expanded)\n const expandedCount = disc === 1 && effectivePrompt ? 1 : 0;\n setCommittedCount((prev) => prev + (disc === 1 ? 1 : 0) + expandedCount + newMessages.length);\n allMessages = [...allMessages, ...newMessages];\n currentRound++;\n\n // Parse round analyses\n const roundAnalyses = activePair\n .map((agent) => {\n const msg = newMessages.find((m) => m.role === agent && !m.error);\n if (!msg) return null;\n return parseRoundAnalysis(agent, msg.content);\n })\n .filter((a): a is NonNullable<typeof a> => a !== null);\n\n discState.analyses.push(roundAnalyses);\n\n // Check termination\n const termResult = checkTermination(discState, config.discussion.max_rounds);\n if (termResult.terminated && termResult.reason) {\n discState.terminated = true;\n discState.terminationReason = termResult.reason;\n setStatusMessage(terminationMessage(termResult.reason));\n if (termResult.reason === \"mutual-consensus\") {\n setConsensusReached(true);\n }\n break;\n }\n }\n\n setRoundNum(currentRound);\n setDiscussionRound(0);\n runningRoundRef.current = null;\n touchSession(sessionId);\n setState(\"input\");\n };\n\n const handleSubmit = (value: string) => {\n setStatusMessage(null);\n promptHistory.push(value);\n historyIndexRef.current = -1;\n savedInputRef.current = \"\";\n\n if (value === \"/exit\") {\n closeDb();\n exit();\n return;\n }\n\n if (value === \"/help\") {\n setStatusMessage(\n [\n \"/help Show this help\",\n \"/config Edit configuration\",\n \"/new Start a new session\",\n \"/copy Copy conversation to clipboard\",\n \"/gist Create a private GitHub gist\",\n \"/exit Exit the app\",\n \"\",\n \"Esc Interrupt running agents\",\n ].join(\"\\n\")\n );\n return;\n }\n\n if (value === \"/config\") {\n setState(\"config\");\n return;\n }\n\n if (value === \"/new\") {\n const newId = nanoid(12);\n sessionCreatedRef.current = false;\n setSessionId(newId);\n setMessages([]);\n setCommittedCount(0);\n setRoundNum(0);\n setConsensusReached(false);\n setDiscussionRound(0);\n setStatusMessage(\"Started new session.\");\n return;\n }\n\n if (value === \"/copy\") {\n try {\n const md = formatAsMarkdown(messages);\n copyToClipboard(md);\n setStatusMessage(\"Copied conversation to clipboard.\");\n } catch {\n setStatusMessage(\"Failed to copy to clipboard.\");\n }\n return;\n }\n\n if (value === \"/gist\") {\n if (messages.length === 0) {\n setStatusMessage(\"Nothing to gist.\");\n return;\n }\n try {\n const md = formatAsMarkdown(messages);\n const filename = `tagteam-${sessionId.slice(0, 7)}.md`;\n const url = createGist(md, filename);\n setStatusMessage(`Gist created: ${url}`);\n } catch (e: any) {\n setStatusMessage(e.message || \"Failed to create gist.\");\n }\n return;\n }\n\n setConsensusReached(false);\n setState(\"running\");\n runRound(value);\n };\n\n const staticItems = useMemo<Message[]>(() => [\n { id: `header-${sessionId}`, role: '__header', content: '', round: -1 },\n ...messages.slice(0, committedCount),\n ], [sessionId, messages, committedCount]);\n\n return (\n <Box flexDirection=\"column\">\n {/* Finalized messages — rendered once, scroll up naturally */}\n <Static items={staticItems}>\n {(item) => {\n if (item.role === '__header') return <Header key={item.id} sessionId={sessionId} />;\n if (item.role === 'user') return <UserMessage key={item.id} content={item.content} />;\n if (item.role === 'expanded') return <ExpandedPromptBlock key={item.id} content={item.content} />;\n if (isValidAgentName(item.role)) return <AgentResponseBlock key={item.id} agent={item.role} content={item.content} error={item.error} />;\n return <Box key={item.id} />;\n }}\n </Static>\n\n {messages.length === 0 && state === \"input\" && <QuickHelp />}\n\n {/* Active messages — current round, not yet committed */}\n {messages.slice(committedCount).map((msg) => {\n if (msg.role === 'user') return <UserMessage key={msg.id} content={msg.content} />;\n if (msg.role === 'expanded') return <ExpandedPromptBlock key={msg.id} content={msg.content} />;\n if (isValidAgentName(msg.role)) return <AgentResponseBlock key={msg.id} agent={msg.role} content={msg.content} error={msg.error} />;\n return null;\n })}\n\n {expanding && (\n <Box marginLeft={1}>\n <Text color=\"yellow\"><Spinner type=\"dots\" /></Text>\n <Text color=\"yellow\"> Expanding prompt…</Text>\n </Box>\n )}\n\n {discussionRound > 0 && thinkingAgents.length > 0 && (\n <DiscussionStatus round={discussionRound} maxRounds={config.discussion.max_rounds} />\n )}\n\n {thinkingAgents.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {thinkingAgents.map((agent) => (\n <ThinkingIndicator key={agent} agent={agent} />\n ))}\n </Box>\n )}\n\n {consensusReached && <ConsensusReached />}\n\n {statusMessage && (\n <Box marginLeft={1}>\n <Text dimColor italic>{statusMessage}</Text>\n </Box>\n )}\n\n {state === \"config\" && (\n <InlineConfigEditor\n isActive={state === \"config\"}\n onClose={() => {\n const updated = loadConfig();\n setConfig(updated);\n try {\n setPair(validateAgentPair(updated.agents));\n } catch {\n // keep current pair if new config is invalid\n }\n setAgentModels((prev) => ({\n ...prev,\n claude: updated.claude.model,\n codex: updated.codex.model,\n gemini: updated.gemini.model,\n }));\n setState(\"input\");\n }}\n />\n )}\n\n {state === \"input\" && <PromptInput onSubmit={handleSubmit} controlRef={promptControlRef} />}\n </Box>\n );\n}\n\n// --- Entry points ---\n\nexport function startApp(props: AppProps) {\n return render(<App {...props} />);\n}\n\nexport function showTranscriptMarkdown(sessionId: string): string {\n const dbMessages = getMessages(sessionId);\n const messages = dbMessages.map((m) => ({\n role: m.role,\n content: m.content,\n round: m.round,\n }));\n return formatAsMarkdown(messages);\n}\n\nexport function showTranscript(sessionId: string): void {\n const dbMessages = getMessages(sessionId);\n const messages: Message[] = dbMessages.map((m) => ({\n id: `${m.round}-${m.role}`,\n role: m.role,\n content: m.content,\n round: m.round,\n }));\n\n const { unmount } = render(\n <Box flexDirection=\"column\">\n <Header sessionId={sessionId} />\n {messages.map((msg) => {\n if (msg.role === \"user\") {\n return <UserMessage key={msg.id} content={msg.content} />;\n }\n if (msg.role === \"expanded\") {\n return <ExpandedPromptBlock key={msg.id} content={msg.content} />;\n }\n if (isValidAgentName(msg.role)) {\n return (\n <AgentResponseBlock key={msg.id} agent={msg.role} content={msg.content} />\n );\n }\n return null;\n })}\n <Box>\n <Text dimColor>{\"─\".repeat(60)}</Text>\n </Box>\n </Box>\n );\n\n unmount();\n}\n\nexport function showSessionList(\n sessions: Array<{\n id: string;\n title: string | null;\n status: string;\n created_at: string;\n updated_at: string;\n }>\n): void {\n const { unmount } = render(\n <Box flexDirection=\"column\">\n {sessions.length === 0 ? (\n <Text dimColor> No sessions found.</Text>\n ) : (\n sessions.map((s) => (\n <Box key={s.id} marginLeft={1}>\n <Text color=\"cyan\">{s.id.slice(0, 7)}</Text>\n <Text>{\" \"}</Text>\n <Text>{s.title || \"(untitled)\"}</Text>\n <Text>{\" \"}</Text>\n <Text color={s.status === \"active\" ? \"green\" : undefined} dimColor={s.status !== \"active\"}>\n {s.status}\n </Text>\n <Text>{\" \"}</Text>\n <Text dimColor>{s.updated_at}</Text>\n </Box>\n ))\n )}\n </Box>\n );\n\n unmount();\n}\n","import { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport type { AgentEvent, AgentOptions, AgentResponse } from \"./types.js\";\n\n/**\n * Parse Claude Code's stream-json JSONL output into AgentEvents.\n *\n * Event format (one JSON object per line):\n * { type: \"system\", subtype: \"init\", ... }\n * { type: \"assistant\", message: { content: [{ type: \"text\", text }, { type: \"tool_use\", ... }] } }\n * { type: \"user\", message: { content: [{ type: \"tool_result\", ... }] } }\n * { type: \"result\", subtype: \"success\", result: \"final text\", ... }\n */\n\nasync function* streamClaude(\n options: AgentOptions\n): AsyncGenerator<AgentEvent> {\n const args = [\n \"-p\",\n \"--verbose\",\n \"--output-format\",\n \"stream-json\",\n \"--no-session-persistence\",\n ];\n\n if (options.systemPrompt) {\n args.push(\"--system-prompt\", options.systemPrompt);\n }\n if (options.model) {\n args.push(\"--model\", options.model);\n }\n\n args.push(options.prompt);\n\n const proc = spawn(\"claude\", args, {\n cwd: options.cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, CLAUDECODE: \"\" },\n });\n\n // Handle spawn errors (e.g., command not found)\n let spawnErrorMsg = \"\";\n proc.on(\"error\", (err) => {\n spawnErrorMsg = err.message;\n });\n\n // Abort support — kill the child process when signalled\n if (options.signal) {\n if (options.signal.aborted) {\n proc.kill();\n } else {\n options.signal.addEventListener(\"abort\", () => proc.kill(), { once: true });\n }\n }\n\n const rl = createInterface({ input: proc.stdout! });\n let gotResultText = false;\n\n for await (const line of rl) {\n if (!line.trim()) continue;\n\n let data: any;\n try {\n data = JSON.parse(line);\n } catch {\n continue;\n }\n\n if (data.type === \"assistant\" && data.message?.content) {\n for (const block of data.message.content) {\n if (block.type === \"text\" && block.text) {\n yield { type: \"text\", agent: \"claude\", content: block.text };\n gotResultText = true;\n } else if (block.type === \"tool_use\") {\n yield {\n type: \"tool_call\",\n agent: \"claude\",\n toolName: block.name,\n toolInput:\n typeof block.input === \"string\"\n ? block.input\n : JSON.stringify(block.input),\n };\n }\n }\n } else if (data.type === \"user\" && data.message?.content) {\n for (const block of data.message.content) {\n if (block.type === \"tool_result\") {\n const text =\n typeof block.content === \"string\"\n ? block.content\n : Array.isArray(block.content)\n ? block.content\n .filter((c: any) => c.type === \"text\")\n .map((c: any) => c.text)\n .join(\"\\n\")\n : \"\";\n if (text) {\n yield {\n type: \"tool_result\",\n agent: \"claude\",\n toolOutput: text,\n };\n }\n }\n }\n } else if (data.type === \"result\") {\n if (data.is_error) {\n yield {\n type: \"error\",\n agent: \"claude\",\n content: data.error || data.result || \"Unknown error\",\n };\n } else if (data.result && !gotResultText) {\n // Use result.result as fallback if no assistant text blocks were emitted\n yield { type: \"text\", agent: \"claude\", content: data.result };\n }\n }\n }\n\n // Wait for the process to exit\n await new Promise<void>((resolve) => {\n proc.on(\"close\", resolve);\n });\n\n if (spawnErrorMsg) {\n yield {\n type: \"error\",\n agent: \"claude\",\n content: `Failed to spawn claude: ${spawnErrorMsg}`,\n };\n }\n\n yield { type: \"done\", agent: \"claude\" };\n}\n\nexport async function runClaude(options: AgentOptions): Promise<AgentResponse> {\n const start = Date.now();\n const events: AgentEvent[] = [];\n const textParts: string[] = [];\n const errors: string[] = [];\n\n for await (const event of streamClaude(options)) {\n events.push(event);\n if (event.type === \"text\" && event.content) {\n textParts.push(event.content);\n } else if (event.type === \"error\" && event.content) {\n errors.push(event.content);\n }\n }\n\n return {\n agent: \"claude\",\n text: textParts.join(\"\"),\n events,\n durationMs: Date.now() - start,\n error: errors.length > 0 ? errors.join(\"\\n\") : undefined,\n };\n}\n","import { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport type { AgentEvent, AgentOptions, AgentResponse } from \"./types.js\";\n\n/**\n * Parse Codex CLI's exec --json JSONL output into AgentEvents.\n *\n * Event format (one JSON object per line):\n * { type: \"thread.started\", thread_id: \"...\" }\n * { type: \"turn.started\" }\n * { type: \"item.completed\", item: { type: \"agent_message\", text: \"...\" } }\n * { type: \"item.started\"|\"item.completed\", item: { type: \"command_execution\", command, aggregated_output, exit_code } }\n * { type: \"turn.completed\", usage: { ... } }\n */\n\nasync function* streamCodex(\n options: AgentOptions\n): AsyncGenerator<AgentEvent> {\n const args = [\"exec\", \"--json\", \"--full-auto\", \"--ephemeral\"];\n\n if (options.model) {\n args.push(\"-m\", options.model);\n }\n\n // Build the full prompt with system context prepended\n let fullPrompt = options.prompt;\n if (options.systemPrompt) {\n fullPrompt = `${options.systemPrompt}\\n\\n---\\n\\n${options.prompt}`;\n }\n\n args.push(fullPrompt);\n\n const proc = spawn(\"codex\", args, {\n cwd: options.cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n\n // Handle spawn errors (e.g., command not found)\n let spawnErrorMsg = \"\";\n proc.on(\"error\", (err) => {\n spawnErrorMsg = err.message;\n });\n\n // Abort support — kill the child process when signalled\n if (options.signal) {\n if (options.signal.aborted) {\n proc.kill();\n } else {\n options.signal.addEventListener(\"abort\", () => proc.kill(), { once: true });\n }\n }\n\n const rl = createInterface({ input: proc.stdout! });\n\n for await (const line of rl) {\n if (!line.trim()) continue;\n\n let data: any;\n try {\n data = JSON.parse(line);\n } catch {\n continue;\n }\n\n if (data.type === \"item.completed\" && data.item) {\n const item = data.item;\n\n if (item.type === \"agent_message\" && item.text) {\n yield { type: \"text\", agent: \"codex\", content: item.text };\n } else if (item.type === \"command_execution\") {\n yield {\n type: \"tool_call\",\n agent: \"codex\",\n toolName: \"command\",\n toolInput: item.command,\n };\n if (item.aggregated_output) {\n yield {\n type: \"tool_result\",\n agent: \"codex\",\n toolOutput: item.aggregated_output,\n };\n }\n } else if (item.type === \"file_change\" && item.changes) {\n const desc = item.changes\n .map((c: any) => `${c.kind}: ${c.path}`)\n .join(\", \");\n yield {\n type: \"tool_result\",\n agent: \"codex\",\n toolName: \"file_change\",\n toolOutput: desc,\n };\n } else if (item.type === \"error\") {\n yield {\n type: \"error\",\n agent: \"codex\",\n content: item.message || \"Unknown error\",\n };\n }\n } else if (data.type === \"turn.failed\") {\n yield {\n type: \"error\",\n agent: \"codex\",\n content: data.error?.message || \"Turn failed\",\n };\n } else if (data.type === \"error\") {\n yield {\n type: \"error\",\n agent: \"codex\",\n content: data.message || \"Stream error\",\n };\n }\n }\n\n // Wait for the process to exit\n await new Promise<void>((resolve) => {\n proc.on(\"close\", resolve);\n });\n\n if (spawnErrorMsg) {\n yield {\n type: \"error\",\n agent: \"codex\",\n content: `Failed to spawn codex: ${spawnErrorMsg}`,\n };\n }\n\n yield { type: \"done\", agent: \"codex\" };\n}\n\nexport async function runCodex(options: AgentOptions): Promise<AgentResponse> {\n const start = Date.now();\n const events: AgentEvent[] = [];\n const textParts: string[] = [];\n const errors: string[] = [];\n\n for await (const event of streamCodex(options)) {\n events.push(event);\n if (event.type === \"text\" && event.content) {\n textParts.push(event.content);\n } else if (event.type === \"error\" && event.content) {\n errors.push(event.content);\n }\n }\n\n return {\n agent: \"codex\",\n text: textParts.join(\"\"),\n events,\n durationMs: Date.now() - start,\n error: errors.length > 0 ? errors.join(\"\\n\") : undefined,\n };\n}\n","import { spawn } from \"node:child_process\";\nimport type { AgentEvent, AgentOptions, AgentResponse } from \"./types.js\";\n\n/**\n * Run the Gemini CLI and parse its JSON output into AgentEvents.\n *\n * Gemini CLI returns a single JSON blob (not streaming JSONL):\n * { response: \"text\", stats: {...}, error: \"...\" }\n *\n * No --system-prompt flag — prepend system prompt to user prompt (same as codex).\n * Flags: gemini -p \"prompt\" --output-format json -m model --yolo\n */\n\nasync function* streamGemini(\n options: AgentOptions\n): AsyncGenerator<AgentEvent> {\n const args = [\"-p\"];\n\n // Build the full prompt with system context prepended\n let fullPrompt = options.prompt;\n if (options.systemPrompt) {\n fullPrompt = `${options.systemPrompt}\\n\\n---\\n\\n${options.prompt}`;\n }\n\n args.push(fullPrompt, \"--output-format\", \"json\", \"--yolo\");\n\n if (options.model) {\n args.push(\"-m\", options.model);\n }\n\n const proc = spawn(\"gemini\", args, {\n cwd: options.cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n\n // Handle spawn errors (e.g., command not found)\n let spawnErrorMsg = \"\";\n proc.on(\"error\", (err) => {\n spawnErrorMsg = err.message;\n });\n\n // Abort support — kill the child process when signalled\n if (options.signal) {\n if (options.signal.aborted) {\n proc.kill();\n } else {\n options.signal.addEventListener(\"abort\", () => proc.kill(), { once: true });\n }\n }\n\n // Collect all stdout into a single buffer\n const chunks: Buffer[] = [];\n proc.stdout!.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n // Wait for the process to exit\n await new Promise<void>((resolve) => {\n proc.on(\"close\", resolve);\n });\n\n if (spawnErrorMsg) {\n yield {\n type: \"error\",\n agent: \"gemini\",\n content: `Failed to spawn gemini: ${spawnErrorMsg}`,\n };\n yield { type: \"done\", agent: \"gemini\" };\n return;\n }\n\n const stdout = Buffer.concat(chunks).toString(\"utf-8\").trim();\n\n if (!stdout) {\n yield { type: \"error\", agent: \"gemini\", content: \"No output from gemini\" };\n yield { type: \"done\", agent: \"gemini\" };\n return;\n }\n\n try {\n const data = JSON.parse(stdout);\n\n if (data.error) {\n yield { type: \"error\", agent: \"gemini\", content: data.error };\n } else if (data.response) {\n yield { type: \"text\", agent: \"gemini\", content: data.response };\n } else {\n yield { type: \"error\", agent: \"gemini\", content: \"Unexpected response format\" };\n }\n } catch {\n // If it's not JSON, treat the entire stdout as text\n yield { type: \"text\", agent: \"gemini\", content: stdout };\n }\n\n yield { type: \"done\", agent: \"gemini\" };\n}\n\nexport async function runGemini(options: AgentOptions): Promise<AgentResponse> {\n const start = Date.now();\n const events: AgentEvent[] = [];\n const textParts: string[] = [];\n const errors: string[] = [];\n\n for await (const event of streamGemini(options)) {\n events.push(event);\n if (event.type === \"text\" && event.content) {\n textParts.push(event.content);\n } else if (event.type === \"error\" && event.content) {\n errors.push(event.content);\n }\n }\n\n return {\n agent: \"gemini\",\n text: textParts.join(\"\"),\n events,\n durationMs: Date.now() - start,\n error: errors.length > 0 ? errors.join(\"\\n\") : undefined,\n };\n}\n","import type { AgentDescriptor, AgentName, AgentProfile } from \"./types.js\";\nimport { runClaude } from \"./claude.js\";\nimport { runCodex } from \"./codex.js\";\nimport { runGemini } from \"./gemini.js\";\n\nconst AGENTS: Record<AgentName, AgentDescriptor> = {\n claude: {\n name: \"claude\",\n displayName: \"Claude\",\n color: \"magenta\",\n cliBinary: \"claude\",\n installUrl: \"https://docs.anthropic.com/en/docs/claude-code\",\n org: \"Anthropic\",\n profile: {\n strength: \"structure-synthesis\",\n role: \"The Architect\",\n focus: [\n \"structural coherence and organization\",\n \"concrete actionable proposals\",\n \"practical feasibility and constraints\",\n \"synthesizing competing requirements\",\n ],\n },\n run: runClaude,\n },\n codex: {\n name: \"codex\",\n displayName: \"Codex\",\n color: \"green\",\n cliBinary: \"codex\",\n installUrl: \"https://github.com/openai/codex\",\n org: \"OpenAI\",\n profile: {\n strength: \"rigor-verification\",\n role: \"The Critic\",\n focus: [\n \"logical correctness and counterexamples\",\n \"edge cases and failure modes\",\n \"evidential standards and precision of definitions\",\n \"identifying unsupported claims and assumptions\",\n ],\n },\n run: runCodex,\n },\n gemini: {\n name: \"gemini\",\n displayName: \"Gemini\",\n color: \"blue\",\n cliBinary: \"gemini\",\n installUrl: \"https://github.com/google-gemini/gemini-cli\",\n org: \"Google\",\n profile: {\n strength: \"context-strategy\",\n role: \"The Strategist\",\n focus: [\n \"broader context and upstream/downstream implications\",\n \"alternative framings and perspectives\",\n \"scope assessment and tradeoff analysis\",\n \"planning, decomposition, and long-term effects\",\n ],\n },\n run: runGemini,\n },\n};\n\n// Anonymized peer role descriptions keyed by sorted pair string\nconst PEER_ROLES: Record<string, Record<AgentName, string>> = {\n \"claude,codex\": {\n claude: \"Rigor & Verification — they stress-test logic, find counterexamples, and demand evidence\",\n codex: \"Structure & Synthesis — they propose coherent solutions, integrate constraints, and ensure feasibility\",\n gemini: \"\", // not in this pair\n },\n \"claude,gemini\": {\n claude: \"Context & Strategy — they assess broader implications, alternative framings, and upstream/downstream effects\",\n gemini: \"Structure & Synthesis — they propose coherent solutions, integrate constraints, and ensure feasibility\",\n codex: \"\", // not in this pair\n },\n \"codex,gemini\": {\n codex: \"Context & Strategy — they assess broader implications, alternative framings, and upstream/downstream effects\",\n gemini: \"Rigor & Verification — they stress-test logic, find counterexamples, and demand evidence\",\n claude: \"\", // not in this pair\n },\n};\n\nexport function getAgent(name: AgentName): AgentDescriptor {\n return AGENTS[name];\n}\n\nexport function getAgentProfile(name: AgentName): AgentProfile {\n return AGENTS[name].profile;\n}\n\nexport function getPeerRoleDescription(agent: AgentName, pair: [AgentName, AgentName]): string {\n const key = [...pair].sort().join(\",\");\n return PEER_ROLES[key]?.[agent] ?? \"\";\n}\n\nexport function getAllAgentNames(): AgentName[] {\n return Object.keys(AGENTS) as AgentName[];\n}\n\nexport function isValidAgentName(name: string): name is AgentName {\n return name in AGENTS;\n}\n\nexport function validateAgentPair(pair: string[]): [AgentName, AgentName] {\n if (pair.length !== 2) {\n throw new Error(\"Agent pair must contain exactly 2 agents\");\n }\n if (pair[0] === pair[1]) {\n throw new Error(\"Agent pair must contain 2 distinct agents\");\n }\n for (const name of pair) {\n if (!isValidAgentName(name)) {\n throw new Error(`Unknown agent: \"${name}\". Valid agents: ${getAllAgentNames().join(\", \")}`);\n }\n }\n return pair as [AgentName, AgentName];\n}\n","import { getAgent, isValidAgentName } from \"./agents/registry.js\";\n\ninterface Message {\n role: string;\n content: string;\n error?: boolean;\n}\n\nexport function formatAsMarkdown(messages: Message[]): string {\n const parts: string[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") continue;\n\n if (msg.role === \"user\") {\n parts.push(`**You:** ${msg.content}`);\n } else if (isValidAgentName(msg.role)) {\n const name = getAgent(msg.role).displayName;\n if (msg.error) {\n parts.push(`**${name}:** *(error)*\\n\\n${msg.content}`);\n } else {\n parts.push(`**${name}:**\\n\\n${msg.content}`);\n }\n }\n }\n\n return parts.join(\"\\n\\n---\\n\\n\") + \"\\n\";\n}\n","import { execSync } from \"node:child_process\";\n\nexport function copyToClipboard(text: string): void {\n const platform = process.platform;\n\n let cmd: string;\n if (platform === \"darwin\") {\n cmd = \"pbcopy\";\n } else if (platform === \"win32\") {\n cmd = \"clip\";\n } else {\n // Linux — try xclip first, fall back to xsel\n let hasXclip = false;\n let hasXsel = false;\n try {\n execSync(\"which xclip\", { stdio: \"ignore\" });\n hasXclip = true;\n } catch {}\n if (!hasXclip) {\n try {\n execSync(\"which xsel\", { stdio: \"ignore\" });\n hasXsel = true;\n } catch {}\n }\n\n if (hasXclip) {\n cmd = \"xclip -selection clipboard\";\n } else if (hasXsel) {\n cmd = \"xsel --clipboard --input\";\n } else {\n throw new Error(\n \"Clipboard requires xclip or xsel. Install one with: sudo apt install xclip\"\n );\n }\n }\n\n try {\n execSync(cmd, { input: text, stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n } catch {\n throw new Error(\n `Failed to copy to clipboard using \"${cmd.split(\" \")[0]}\". Check that it is installed and working.`\n );\n }\n}\n","import { execSync } from \"node:child_process\";\n\nexport function createGist(content: string, filename: string): string {\n // Check gh is installed and authenticated\n try {\n execSync(\"gh auth status\", { stdio: \"ignore\" });\n } catch {\n // Distinguish between not installed and not authenticated\n try {\n execSync(\"which gh\", { stdio: \"ignore\" });\n } catch {\n throw new Error(\n \"gh CLI not found. Install it from https://cli.github.com\"\n );\n }\n throw new Error(\n \"gh CLI is not authenticated. Run: gh auth login\"\n );\n }\n\n try {\n const result = execSync(\n `gh gist create --filename \"${filename}\" -`,\n { input: content, stdio: [\"pipe\", \"pipe\", \"pipe\"], encoding: \"utf-8\" }\n );\n return result.trim();\n } catch (e: any) {\n const stderr = e.stderr?.toString().trim();\n throw new Error(stderr || \"Failed to create gist.\");\n }\n}\n","import Database from \"better-sqlite3\";\nimport { join } from \"node:path\";\nimport { getConfigDir, ensureConfigDir } from \"../config.js\";\n\nlet db: Database.Database | null = null;\n\nexport function getDbPath(): string {\n return join(getConfigDir(), \"tagteam.db\");\n}\n\nexport function getDb(): Database.Database {\n if (db) return db;\n\n ensureConfigDir();\n db = new Database(getDbPath());\n db.pragma(\"journal_mode = WAL\");\n db.pragma(\"foreign_keys = ON\");\n\n initSchema(db);\n return db;\n}\n\nfunction initSchema(db: Database.Database): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n title TEXT,\n working_dir TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n status TEXT NOT NULL DEFAULT 'active'\n );\n\n CREATE TABLE IF NOT EXISTS messages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL REFERENCES sessions(id),\n role TEXT NOT NULL,\n content TEXT NOT NULL,\n round INTEGER NOT NULL DEFAULT 0,\n duration_ms INTEGER,\n metadata TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id, id);\n `);\n}\n\nexport function closeDb(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n","import { getDb } from \"./index.js\";\n\nexport interface Session {\n id: string;\n title: string | null;\n working_dir: string;\n created_at: string;\n updated_at: string;\n status: string;\n}\n\nexport function createSession(\n id: string,\n workingDir: string\n): Session {\n const db = getDb();\n db.prepare(\n `INSERT INTO sessions (id, working_dir) VALUES (?, ?)`\n ).run(id, workingDir);\n\n return getSession(id)!;\n}\n\nexport function getSession(id: string): Session | undefined {\n const db = getDb();\n return db.prepare(`SELECT * FROM sessions WHERE id = ?`).get(id) as\n | Session\n | undefined;\n}\n\nexport function getSessionByPrefix(prefix: string): Session | undefined {\n const db = getDb();\n return db\n .prepare(`SELECT * FROM sessions WHERE id LIKE ? ORDER BY updated_at DESC LIMIT 1`)\n .get(`${prefix}%`) as Session | undefined;\n}\n\nexport function getMostRecentSession(): Session | undefined {\n const db = getDb();\n return db\n .prepare(\n `SELECT * FROM sessions WHERE status = 'active' ORDER BY updated_at DESC LIMIT 1`\n )\n .get() as Session | undefined;\n}\n\nexport function listSessions(limit = 20): Session[] {\n const db = getDb();\n return db\n .prepare(`SELECT * FROM sessions ORDER BY updated_at DESC LIMIT ?`)\n .all(limit) as Session[];\n}\n\nexport function updateSessionTitle(id: string, title: string): void {\n const db = getDb();\n db.prepare(\n `UPDATE sessions SET title = ?, updated_at = datetime('now') WHERE id = ?`\n ).run(title, id);\n}\n\nexport function touchSession(id: string): void {\n const db = getDb();\n db.prepare(`UPDATE sessions SET updated_at = datetime('now') WHERE id = ?`).run(\n id\n );\n}\n\nexport function deleteSession(id: string): void {\n const db = getDb();\n db.prepare(`DELETE FROM messages WHERE session_id = ?`).run(id);\n db.prepare(`DELETE FROM sessions WHERE id = ?`).run(id);\n}\n\nexport function deleteAllSessions(): void {\n const db = getDb();\n db.prepare(`DELETE FROM messages`).run();\n db.prepare(`DELETE FROM sessions`).run();\n}\n","import { getDb } from \"./index.js\";\n\nexport interface Message {\n id: number;\n session_id: string;\n role: string;\n content: string;\n round: number;\n duration_ms: number | null;\n metadata: string | null;\n created_at: string;\n}\n\nexport function insertMessage(params: {\n sessionId: string;\n role: string;\n content: string;\n round: number;\n durationMs?: number;\n metadata?: Record<string, unknown>;\n}): Message {\n const db = getDb();\n const result = db\n .prepare(\n `INSERT INTO messages (session_id, role, content, round, duration_ms, metadata)\n VALUES (?, ?, ?, ?, ?, ?)`\n )\n .run(\n params.sessionId,\n params.role,\n params.content,\n params.round,\n params.durationMs ?? null,\n params.metadata ? JSON.stringify(params.metadata) : null\n );\n\n return db\n .prepare(`SELECT * FROM messages WHERE id = ?`)\n .get(result.lastInsertRowid) as Message;\n}\n\nexport function getMessages(sessionId: string): Message[] {\n const db = getDb();\n return db\n .prepare(`SELECT * FROM messages WHERE session_id = ? ORDER BY id`)\n .all(sessionId) as Message[];\n}\n\nexport function deleteMessagesFromRound(\n sessionId: string,\n fromRound: number\n): void {\n const db = getDb();\n db.prepare(\n `DELETE FROM messages WHERE session_id = ? AND round >= ?`\n ).run(sessionId, fromRound);\n}","import type { AgentName } from \"./agents/types.js\";\nimport { getAgent, getAgentProfile, getPeerRoleDescription, isValidAgentName } from \"./agents/registry.js\";\n\nexport const CONSENSUS_MARKER = \"[CONSENSUS]\";\n\nexport function formatConversationHistory(\n messages: Array<{ role: string; agent?: AgentName; content: string }>\n): string {\n return messages\n .map((m) => {\n let label: string;\n if (m.role === \"user\") {\n label = \"User\";\n } else if (isValidAgentName(m.role)) {\n label = getAgent(m.role).displayName;\n } else if (m.agent && isValidAgentName(m.agent)) {\n label = getAgent(m.agent).displayName;\n } else {\n label = m.role;\n }\n return `[${label}]: ${m.content}`;\n })\n .join(\"\\n\\n\");\n}\n\n// --- Base prompt: anti-sycophancy rules, applies to all modes ---\n\nexport function basePrompt(): string {\n return `You are one of two expert analysts in a structured discussion.\nYou will independently analyze the problem, then engage in focused rounds of\ncritique and refinement with your peer.\n\nGround rules:\n- You are evaluated on the ACCURACY and QUALITY of your final position, not\n on agreement with your peer.\n- When you change your position, you MUST name the specific argument that\n changed your mind and explain why your previous reasoning was flawed.\n Changing position without this justification is not acceptable.\n- Each response must either: (a) introduce new evidence or a new argument,\n (b) identify a specific logical flaw or unsupported claim in your peer's\n reasoning, or (c) concede a point with explicit justification. Restating\n or paraphrasing existing points is not acceptable.\n- Your peer is a different AI model with different training. Their perspective\n may reveal genuine blind spots in yours — and vice versa.`;\n}\n\n// --- Role prompt: model-specific focus + peer role description ---\n\nconst ROLE_TEMPLATES: Record<AgentName, string> = {\n claude: `Your role: Structure & Synthesis Analyst.\n\nFocus your analysis on:\n- Structural coherence — how do the parts of the proposal fit together?\n- Concrete actionable proposals — not just critique, but workable solutions\n- Practical feasibility — what constraints exist and how to work within them?\n- Synthesizing competing requirements into a coherent recommendation\n\nWhen you propose a solution, present it concretely with specifics. When you\ncritique, point to specific structural issues and show what the fix looks\nlike. Your peer's role is {peerRole} — they will stress-test your proposals\nfrom a different angle.`,\n\n codex: `Your role: Rigor & Verification Analyst.\n\nFocus your analysis on:\n- Logical correctness — does the reasoning actually hold in all cases?\n- Counterexamples and edge cases — what scenarios break the argument?\n- Evidential standards — are claims supported by data, examples, or references?\n- Precision of definitions — are key terms and assumptions clearly stated?\n\nWhen you critique, provide specific counterexamples or scenarios that demonstrate\nthe issue. When you propose alternatives, explain the logical guarantees.\nYour peer's role is {peerRole} — they will focus on different aspects of the\nsame problem.`,\n\n gemini: `Your role: Context & Strategy Analyst.\n\nFocus your analysis on:\n- Broader context — how does this fit within the larger picture?\n- Alternative framings — what perspectives or approaches are being overlooked?\n- Upstream and downstream effects — what will this break or enable elsewhere?\n- Scope and planning — is this the right approach at the right level of\n abstraction?\n\nWhen you critique, ground your position in the broader context your peer may\nbe missing. When you propose alternatives, explain the tradeoffs involved.\nYour peer's role is {peerRole} — they will focus on different aspects of the\nsame problem.`,\n};\n\nexport function rolePrompt(agent: AgentName, pair: [AgentName, AgentName]): string {\n const template = ROLE_TEMPLATES[agent];\n const peerRole = getPeerRoleDescription(agent, pair);\n return template.replace(\"{peerRole}\", peerRole);\n}\n\n// --- Collaboration system prompt: normal mode, round 1 ---\n\nexport function collaborationSystemPrompt(agent: AgentName, pair: [AgentName, AgentName]): string {\n return `${basePrompt()}\n\n${rolePrompt(agent, pair)}`;\n}\n\n// --- Discussion round prompt: normal mode, rounds 2+ ---\n\nexport function discussionRoundPrompt(\n agent: AgentName,\n conversationContext: string,\n pair: [AgentName, AgentName]\n): string {\n return `${basePrompt()}\n\n${rolePrompt(agent, pair)}\n\nHere is the discussion so far:\n\n${conversationContext}\n\nFor this round:\n1. What is the strongest point in your peer's response?\n2. What is the weakest point, or what claim lacks supporting evidence?\n3. Has your position changed? State one of: HELD / PARTIALLY_CHANGED / CHANGED\n — with explicit reasoning for why.\n4. If proposing a solution, present it concretely and explain tradeoffs\n versus your peer's approach.\n5. Confidence in your current position: LOW | MEDIUM | HIGH\n\nCONFIDENCE: HIGH | MEDIUM | LOW\n\nKeep it concise. Do not restate points already established.`;\n}\n\n// --- Debate system prompt: discuss mode, round 1 ---\n\nexport function debateSystemPrompt(agent: AgentName, pair: [AgentName, AgentName]): string {\n return `${basePrompt()}\n\n${rolePrompt(agent, pair)}\n\nThis is a structured discussion aimed at reaching a well-reasoned position\nthrough genuine deliberation.\n\nAdditional rules for discussion mode:\n- Structure your arguments: STATE your claim, provide EVIDENCE (specific examples,\n data, references), explain your REASONING connecting evidence to\n claim, and note CAVEATS (when your claim doesn't hold).\n- Express confidence: end your response with CONFIDENCE: HIGH | MEDIUM | LOW\n and a one-line explanation of what would change your mind.\n- Consensus signaling: when you believe you and your peer agree on all key\n points AND your confidence is HIGH, end your response with ${CONSENSUS_MARKER} on\n its own line. Only signal consensus when:\n (a) You can state the shared position in one sentence\n (b) You have HIGH confidence\n (c) You are not just deferring — you genuinely agree with the reasoning`;\n}\n\n// --- Debate round prompt: discuss mode, rounds 2+ ---\n\nexport function debateRoundPrompt(\n agent: AgentName,\n conversationContext: string,\n pair: [AgentName, AgentName]\n): string {\n return `${debateSystemPrompt(agent, pair)}\n\n${conversationContext}\n\nFor this round:\n1. Address your peer's strongest argument directly — do you accept it? Why or\n why not?\n2. If your peer identified a flaw in your reasoning, acknowledge it explicitly\n or defend with new evidence.\n3. State your current position with EVIDENCE and REASONING.\n4. CONFIDENCE: HIGH | MEDIUM | LOW — what specific evidence would change\n your remaining position?\n5. If consensus: state the shared position in one sentence, then ${CONSENSUS_MARKER}.\n\nPOSITION: HELD | PARTIALLY_CHANGED | CHANGED`;\n}\n\n// --- Steelman prompt: discuss mode, round 2 ---\n\nexport function steelmanPrompt(): string {\n return `You and your peer appear to largely agree after Round 1. Before confirming\nconsensus, steelman the opposing view:\n\n- What is the strongest argument AGAINST your shared position?\n- What context or edge case might make a different approach better?\n- Is there a tradeoff you're both overlooking?\n\nIf after considering the counterarguments you still hold your position, explain\nwhy the counterarguments don't apply here. Then proceed with your normal round\nresponse.\n\n`;\n}\n\n// --- Direct prompt: single-agent address ---\n\nexport function directPrompt(agent: AgentName, conversationHistory: string): string {\n const profile = getAgentProfile(agent);\n const focusAreas = profile.focus.map((f) => `- ${f}`).join(\"\\n\");\n\n return `You are being addressed directly in a multi-agent session. The user wants YOUR\nspecific perspective.\n\nHere is the conversation so far:\n${conversationHistory}\n\nRespond to the user's latest message. Focus on your area of expertise:\n${focusAreas}\n\nBe concise and direct.`;\n}\n","import type { AgentName } from \"./agents/types.js\";\nimport { formatConversationHistory } from \"./prompts.js\";\n\n// --- Types ---\n\nexport type ConfidenceLevel = \"LOW\" | \"MEDIUM\" | \"HIGH\";\nexport type PositionChange = \"HELD\" | \"PARTIALLY_CHANGED\" | \"CHANGED\";\nexport type TerminationReason = \"mutual-consensus\" | \"stale-no-progress\" | \"cyclic-swap\" | \"max-rounds\";\n\nexport interface RoundAnalysis {\n agent: AgentName;\n confidence: ConfidenceLevel;\n positionChange: PositionChange;\n signaledConsensus: boolean;\n hasNovelContent: boolean;\n}\n\nexport interface DiscussionState {\n round: number;\n analyses: RoundAnalysis[][]; // per discussion round\n terminated: boolean;\n terminationReason?: TerminationReason;\n}\n\n// --- Parsing ---\n\nconst CONFIDENCE_RE = /CONFIDENCE:\\s*(HIGH|MEDIUM|LOW)/i;\nconst POSITION_RE = /POSITION:\\s*(HELD|PARTIALLY_CHANGED|CHANGED)/i;\nconst CONSENSUS_RE = /\\[CONSENSUS\\]/;\n\nexport function parseRoundAnalysis(agent: AgentName, responseText: string): RoundAnalysis {\n const confidenceMatch = responseText.match(CONFIDENCE_RE);\n const positionMatch = responseText.match(POSITION_RE);\n const signaledConsensus = CONSENSUS_RE.test(responseText);\n\n // hasNovelContent: true if the response is substantial (more than just markers/boilerplate)\n // Strip out markers and whitespace, check if meaningful content remains\n const stripped = responseText\n .replace(CONFIDENCE_RE, \"\")\n .replace(POSITION_RE, \"\")\n .replace(CONSENSUS_RE, \"\")\n .trim();\n const hasNovelContent = stripped.length > 100;\n\n return {\n agent,\n confidence: (confidenceMatch?.[1]?.toUpperCase() as ConfidenceLevel) ?? \"MEDIUM\",\n positionChange: (positionMatch?.[1]?.toUpperCase() as PositionChange) ?? \"HELD\",\n signaledConsensus,\n hasNovelContent,\n };\n}\n\n// --- Termination detection ---\n\nexport function checkTermination(\n state: DiscussionState,\n maxRounds: number\n): { terminated: boolean; reason?: TerminationReason } {\n const { round, analyses } = state;\n\n // 1. Mutual consensus: both agents signaled [CONSENSUS] AND both HIGH confidence\n if (analyses.length > 0) {\n const latest = analyses[analyses.length - 1];\n if (latest && latest.length >= 2) {\n const allConsensus = latest.every((a) => a.signaledConsensus);\n const allHigh = latest.every((a) => a.confidence === \"HIGH\");\n if (allConsensus && allHigh) {\n return { terminated: true, reason: \"mutual-consensus\" };\n }\n }\n }\n\n // 2. Stale: two consecutive rounds where both agents HELD and no novel content\n if (analyses.length >= 2) {\n const prev = analyses[analyses.length - 2];\n const curr = analyses[analyses.length - 1];\n if (prev && curr && prev.length >= 2 && curr.length >= 2) {\n const prevStale = prev.every((a) => a.positionChange === \"HELD\" && !a.hasNovelContent);\n const currStale = curr.every((a) => a.positionChange === \"HELD\" && !a.hasNovelContent);\n if (prevStale && currStale) {\n return { terminated: true, reason: \"stale-no-progress\" };\n }\n }\n }\n\n // 3. Cyclic swap: both agents CHANGED in two consecutive rounds\n if (analyses.length >= 2) {\n const prev = analyses[analyses.length - 2];\n const curr = analyses[analyses.length - 1];\n if (prev && curr && prev.length >= 2 && curr.length >= 2) {\n const prevSwap = prev.every((a) => a.positionChange === \"CHANGED\");\n const currSwap = curr.every((a) => a.positionChange === \"CHANGED\");\n if (prevSwap && currSwap) {\n return { terminated: true, reason: \"cyclic-swap\" };\n }\n }\n }\n\n // 4. Max rounds\n if (round >= maxRounds) {\n return { terminated: true, reason: \"max-rounds\" };\n }\n\n return { terminated: false };\n}\n\n// --- Termination display messages ---\n\nexport function terminationMessage(reason: TerminationReason): string {\n switch (reason) {\n case \"mutual-consensus\":\n return \"Consensus reached.\";\n case \"stale-no-progress\":\n return \"Discussion stalled — no new arguments. Showing final positions.\";\n case \"cyclic-swap\":\n return \"Agents are trading positions. Showing both perspectives.\";\n case \"max-rounds\":\n return \"Maximum rounds reached. Showing final positions.\";\n }\n}\n\n// --- Steelman injection decision ---\n\nexport function shouldInjectSteelman(state: DiscussionState): boolean {\n // Always inject steelman prompt in round 2 (after round 1 completes)\n return state.round === 1 && state.analyses.length === 1;\n}\n\n// --- Context building ---\n\nexport function buildConversationContext(\n allMessages: Array<{ role: string; agent?: AgentName; content: string }>,\n analyses: RoundAnalysis[][],\n currentRound: number,\n _pair: [AgentName, AgentName]\n): string {\n // Rounds 1-2: full history\n if (currentRound <= 2) {\n return formatConversationHistory(allMessages);\n }\n\n // Round 3+: structured summary of earlier rounds + full text of latest round\n const summaryParts: string[] = [];\n\n // Summarize earlier rounds from analyses\n for (let i = 0; i < analyses.length - 1; i++) {\n const roundAnalyses = analyses[i];\n if (!roundAnalyses) continue;\n const roundSummary = roundAnalyses.map((a) => {\n return `${a.agent}: confidence=${a.confidence}, position=${a.positionChange}${a.signaledConsensus ? \", signaled consensus\" : \"\"}`;\n }).join(\"; \");\n summaryParts.push(`Round ${i + 1}: ${roundSummary}`);\n }\n\n // Get messages from the latest round only (last 2-3 messages: possibly user + 2 agents)\n // Find the boundary: messages for the latest discussion round\n const latestMessages = allMessages.slice(-3);\n\n const summary = summaryParts.length > 0\n ? `Previous rounds summary:\\n${summaryParts.join(\"\\n\")}\\n\\nLatest exchange:\\n${formatConversationHistory(latestMessages)}`\n : formatConversationHistory(allMessages);\n\n return summary;\n}\n\n// --- Metadata conversion ---\n\nexport function analysisToMetadata(analysis: RoundAnalysis): Record<string, unknown> {\n return {\n confidence: analysis.confidence,\n positionChange: analysis.positionChange,\n signaledConsensus: analysis.signaledConsensus,\n hasNovelContent: analysis.hasNovelContent,\n };\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport type { AgentName } from \"./agents/types.js\";\nimport { getAgent } from \"./agents/registry.js\";\n\nconst FAST_MODELS: Record<AgentName, string> = {\n claude: \"haiku\",\n gemini: \"gemini-2.0-flash\",\n codex: \"gpt-5.3-codex\",\n};\n\nexport interface ExpandResult {\n original: string;\n expanded: string;\n}\n\nfunction gatherProjectContext(cwd: string): string {\n const parts: string[] = [];\n\n try {\n const pkgPath = join(cwd, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const info: string[] = [];\n if (pkg.name) info.push(`name: ${pkg.name}`);\n if (pkg.description) info.push(`description: ${pkg.description}`);\n const deps = [\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.devDependencies ?? {}),\n ].slice(0, 15);\n if (deps.length > 0) info.push(`dependencies: ${deps.join(\", \")}`);\n if (info.length > 0) parts.push(`Project: ${info.join(\"; \")}`);\n }\n } catch {}\n\n try {\n const readmePath = join(cwd, \"README.md\");\n if (existsSync(readmePath)) {\n const readme = readFileSync(readmePath, \"utf-8\").slice(0, 500);\n parts.push(`README excerpt:\\n${readme}`);\n }\n } catch {}\n\n try {\n const recentFiles = execSync(\n \"git diff --name-only HEAD~5 2>/dev/null || ls -t | head -20\",\n { cwd, encoding: \"utf-8\", timeout: 3000 },\n ).trim();\n if (recentFiles) parts.push(`Recently changed files:\\n${recentFiles}`);\n } catch {}\n\n return parts.join(\"\\n\\n\");\n}\n\nconst EXPANSION_SYSTEM_PROMPT = `You are a prompt expansion assistant for a multi-agent discussion tool. Your job is to rewrite terse user prompts into specific, actionable versions.\n\nRules:\n- Preserve the user's intent exactly — do not add requirements they didn't ask for\n- If project context is provided AND the prompt is related to it, enrich the prompt with project-specific details (file paths, dependencies, conventions)\n- If the prompt is unrelated to the project context (or no project context is available), expand based on the topic's own domain — add relevant domain terminology, clarify scope, and make implicit assumptions explicit\n- Keep the expanded prompt to 2-4 sentences\n- Output ONLY the expanded prompt, no preamble or explanation`;\n\nexport async function expandPrompt(\n prompt: string,\n agent: AgentName,\n cwd: string,\n signal?: AbortSignal,\n): Promise<ExpandResult> {\n try {\n const context = gatherProjectContext(cwd);\n const systemPrompt = context\n ? `${EXPANSION_SYSTEM_PROMPT}\\n\\nProject context:\\n${context}`\n : EXPANSION_SYSTEM_PROMPT;\n\n const descriptor = getAgent(agent);\n const response = await descriptor.run({\n prompt: `Expand this prompt:\\n\\n${prompt}`,\n systemPrompt,\n model: FAST_MODELS[agent],\n cwd,\n signal,\n });\n\n const expanded = response.text?.trim();\n if (!expanded) return { original: prompt, expanded: prompt };\n\n return { original: prompt, expanded };\n } catch {\n return { original: prompt, expanded: prompt };\n }\n}\n","import React, { useState } from \"react\";\nimport { render, Box, Text, useApp, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport { loadConfig, setConfigValue } from \"./config.js\";\nimport type { TagTeamConfig } from \"./config.js\";\nimport { validateAgentPair } from \"./agents/registry.js\";\n\ninterface ConfigField {\n key: string;\n label: string;\n get: (c: TagTeamConfig) => string;\n type: \"string\" | \"number\";\n validate?: (value: string) => string | null;\n}\n\nconst CONFIG_FIELDS: ConfigField[] = [\n {\n key: \"agents\",\n label: \"Agent pair\",\n get: (c) => c.agents.join(\", \"),\n type: \"string\",\n validate: (value) => {\n try {\n const names = value.split(\",\").map((s) => s.trim());\n validateAgentPair(names);\n return null;\n } catch (e: any) {\n return e.message;\n }\n },\n },\n {\n key: \"claude.model\",\n label: \"Claude model\",\n get: (c) => c.claude.model,\n type: \"string\",\n },\n {\n key: \"codex.model\",\n label: \"Codex model\",\n get: (c) => c.codex.model,\n type: \"string\",\n },\n {\n key: \"gemini.model\",\n label: \"Gemini model\",\n get: (c) => c.gemini.model,\n type: \"string\",\n },\n {\n key: \"discussion.max_rounds\",\n label: \"Discussion max rounds\",\n get: (c) => String(c.discussion.max_rounds),\n type: \"number\",\n },\n {\n key: \"expansion.enabled\",\n label: \"Prompt expansion\",\n get: (c) => String(c.expansion.enabled),\n type: \"string\",\n validate: (v) => (v !== \"true\" && v !== \"false\") ? \"Must be 'true' or 'false'\" : null,\n },\n];\n\nconst LABEL_WIDTH = Math.max(...CONFIG_FIELDS.map((f) => f.label.length));\n\ntype EditMode = \"select\" | \"edit\";\n\ninterface InlineConfigEditorProps {\n isActive: boolean;\n onClose: () => void;\n}\n\nexport function InlineConfigEditor({ isActive, onClose }: InlineConfigEditorProps) {\n const [config, setConfig] = useState(() => loadConfig());\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [mode, setMode] = useState<EditMode>(\"select\");\n const [editValue, setEditValue] = useState(\"\");\n const [savedMessage, setSavedMessage] = useState<string | null>(null);\n\n useInput(\n (input, key) => {\n if (key.upArrow) {\n setSavedMessage(null);\n setSelectedIndex((i) => (i > 0 ? i - 1 : CONFIG_FIELDS.length - 1));\n } else if (key.downArrow) {\n setSavedMessage(null);\n setSelectedIndex((i) => (i < CONFIG_FIELDS.length - 1 ? i + 1 : 0));\n } else if (key.return) {\n const field = CONFIG_FIELDS[selectedIndex];\n setEditValue(field.get(config));\n setSavedMessage(null);\n setMode(\"edit\");\n } else if (key.escape || input === \"q\") {\n onClose();\n }\n },\n { isActive: isActive && mode === \"select\" }\n );\n\n useInput(\n (_input, key) => {\n if (key.escape) {\n setMode(\"select\");\n }\n },\n { isActive: isActive && mode === \"edit\" }\n );\n\n const handleEditSubmit = (value: string) => {\n const field = CONFIG_FIELDS[selectedIndex];\n\n if (field.type === \"number\") {\n const n = Number(value);\n if (!Number.isInteger(n) || n < 1) {\n setSavedMessage(\"Error: must be a positive integer\");\n setMode(\"select\");\n return;\n }\n }\n\n if (field.validate) {\n const error = field.validate(value);\n if (error) {\n setSavedMessage(`Error: ${error}`);\n setMode(\"select\");\n return;\n }\n }\n\n try {\n const updated = setConfigValue(field.key, value);\n setConfig(updated);\n setSavedMessage(`Saved ${field.key} = ${value}`);\n } catch (e: any) {\n setSavedMessage(`Error: ${e.message}`);\n }\n\n setMode(\"select\");\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Configuration</Text>\n <Text dimColor> ── edit values inline</Text>\n </Box>\n\n {CONFIG_FIELDS.map((field, i) => {\n const selected = i === selectedIndex;\n const pointer = selected ? \"> \" : \" \";\n const currentValue = field.get(config);\n\n return (\n <Box key={field.key} marginLeft={1}>\n <Text color={selected ? \"cyan\" : undefined} bold={selected}>\n {pointer}\n {field.label.padEnd(LABEL_WIDTH)}\n </Text>\n <Text dimColor> = </Text>\n {mode === \"edit\" && selected ? (\n <TextInput\n value={editValue}\n onChange={setEditValue}\n onSubmit={handleEditSubmit}\n showCursor\n />\n ) : (\n <Text color=\"white\">{currentValue}</Text>\n )}\n </Box>\n );\n })}\n\n {savedMessage && (\n <Box marginTop={1} marginLeft={1}>\n <Text color={savedMessage.startsWith(\"Error\") ? \"red\" : \"green\"}>\n {savedMessage}\n </Text>\n </Box>\n )}\n\n <Box marginTop={1} marginLeft={1}>\n <Text dimColor>\n {mode === \"edit\"\n ? \"Enter save Esc cancel\"\n : \"↑↓ navigate Enter edit Esc/q quit\"}\n </Text>\n </Box>\n </Box>\n );\n}\n\n// Standalone entrypoint for `tagteam config edit`\nfunction StandaloneConfigEditor() {\n const { exit } = useApp();\n return <InlineConfigEditor isActive={true} onClose={exit} />;\n}\n\nexport function startConfigEditor() {\n return render(<StandaloneConfigEditor />);\n}\n"],"mappings":"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","names":["execSync","React","useState","render","Box","Text","useApp","useInput","TextInput","spawn","createInterface","spawn","execSync","join","join","db","db","db","readFileSync","existsSync","execSync","join","join","existsSync","readFileSync","execSync","jsx","jsxs","adHoc","Text","React","AgentResponseBlock","Box","UserMessage","ExpandedPromptBlock","useState","TextInput","showTranscript","useApp","useInput","render","execSync","session","dbMessages","transcript","instance"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tagteam",
3
- "version": "0.4.5",
3
+ "version": "0.5.0",
4
4
  "description": "Orchestrate AI agents (Claude, Codex, Gemini) in collaborative sessions",
5
5
  "type": "module",
6
6
  "bin": {