tagteam 0.4.4 → 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
@@ -3,7 +3,7 @@
3
3
  // src/index.ts
4
4
  import { Command } from "commander";
5
5
  import { createRequire } from "module";
6
- import { execSync as execSync3 } from "child_process";
6
+ import { execSync as execSync4 } from "child_process";
7
7
  import chalk from "chalk";
8
8
 
9
9
  // src/config.ts
@@ -24,6 +24,9 @@ var DEFAULT_CONFIG = {
24
24
  },
25
25
  discussion: {
26
26
  max_rounds: 5
27
+ },
28
+ expansion: {
29
+ enabled: false
27
30
  }
28
31
  };
29
32
  function getConfigDir() {
@@ -57,7 +60,8 @@ function loadConfig() {
57
60
  claude: { ...DEFAULT_CONFIG.claude, ...parsed.claude },
58
61
  codex: { ...DEFAULT_CONFIG.codex, ...parsed.codex },
59
62
  gemini: { ...DEFAULT_CONFIG.gemini, ...parsed.gemini },
60
- discussion: { ...DEFAULT_CONFIG.discussion, ...parsed.discussion }
63
+ discussion: { ...DEFAULT_CONFIG.discussion, ...parsed.discussion },
64
+ expansion: { ...DEFAULT_CONFIG.expansion, ...parsed.expansion }
61
65
  };
62
66
  } catch {
63
67
  return { ...DEFAULT_CONFIG };
@@ -88,6 +92,9 @@ function setConfigValue(key, value) {
88
92
  case "discussion_max_rounds":
89
93
  config.discussion.max_rounds = Number(value);
90
94
  break;
95
+ case "expansion_enabled":
96
+ config.expansion.enabled = value.toLowerCase() === "true";
97
+ break;
91
98
  default:
92
99
  throw new Error(`Unknown config key: ${key}`);
93
100
  }
@@ -101,6 +108,8 @@ function setConfigValue(key, value) {
101
108
  config.gemini.model = value;
102
109
  } else if (section === "discussion" && field === "max_rounds") {
103
110
  config.discussion.max_rounds = Number(value);
111
+ } else if (section === "expansion" && field === "enabled") {
112
+ config.expansion.enabled = value.toLowerCase() === "true";
104
113
  } else {
105
114
  throw new Error(`Unknown config key: ${key}`);
106
115
  }
@@ -460,13 +469,13 @@ var AGENTS = {
460
469
  installUrl: "https://docs.anthropic.com/en/docs/claude-code",
461
470
  org: "Anthropic",
462
471
  profile: {
463
- strength: "architecture-implementation",
464
- role: "The Builder",
472
+ strength: "structure-synthesis",
473
+ role: "The Architect",
465
474
  focus: [
466
- "multi-file coherence and refactoring",
467
- "production-quality implementation",
468
- "design patterns and maintainability",
469
- "comprehensive working solutions"
475
+ "structural coherence and organization",
476
+ "concrete actionable proposals",
477
+ "practical feasibility and constraints",
478
+ "synthesizing competing requirements"
470
479
  ]
471
480
  },
472
481
  run: runClaude
@@ -479,13 +488,13 @@ var AGENTS = {
479
488
  installUrl: "https://github.com/openai/codex",
480
489
  org: "OpenAI",
481
490
  profile: {
482
- strength: "correctness-verification",
483
- role: "The Verifier",
491
+ strength: "rigor-verification",
492
+ role: "The Critic",
484
493
  focus: [
485
- "algorithmic correctness and edge cases",
486
- "test coverage and failure modes",
487
- "standards compliance and best practices",
488
- "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"
489
498
  ]
490
499
  },
491
500
  run: runCodex
@@ -501,10 +510,10 @@ var AGENTS = {
501
510
  strength: "context-strategy",
502
511
  role: "The Strategist",
503
512
  focus: [
504
- "broad codebase context and upstream/downstream effects",
505
- "current ecosystem conventions and documentation",
506
- "architectural fit and scope assessment",
507
- "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"
508
517
  ]
509
518
  },
510
519
  run: runGemini
@@ -512,20 +521,20 @@ var AGENTS = {
512
521
  };
513
522
  var PEER_ROLES = {
514
523
  "claude,codex": {
515
- claude: "Correctness & Standards \u2014 they verify edge cases, test coverage, and standards compliance",
516
- 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",
517
526
  gemini: ""
518
527
  // not in this pair
519
528
  },
520
529
  "claude,gemini": {
521
- claude: "Strategic Context \u2014 they assess broad codebase fit, ecosystem conventions, and architectural tradeoffs",
522
- 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",
523
532
  codex: ""
524
533
  // not in this pair
525
534
  },
526
535
  "codex,gemini": {
527
- codex: "Strategic Context \u2014 they assess broad codebase fit, ecosystem conventions, and architectural tradeoffs",
528
- 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",
529
538
  claude: ""
530
539
  // not in this pair
531
540
  }
@@ -798,7 +807,7 @@ function formatConversationHistory(messages) {
798
807
  }).join("\n\n");
799
808
  }
800
809
  function basePrompt() {
801
- 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.
802
811
  You will independently analyze the problem, then engage in focused rounds of
803
812
  critique and refinement with your peer.
804
813
 
@@ -816,42 +825,41 @@ Ground rules:
816
825
  may reveal genuine blind spots in yours \u2014 and vice versa.`;
817
826
  }
818
827
  var ROLE_TEMPLATES = {
819
- claude: `Your role: Architecture & Implementation Reviewer.
828
+ claude: `Your role: Structure & Synthesis Analyst.
820
829
 
821
830
  Focus your analysis on:
822
- - Code structure, design patterns, and maintainability
823
- - Multi-file coherence \u2014 how changes ripple across the codebase
824
- - Production readiness \u2014 error handling, logging, edge cases in real usage
825
- - 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
826
835
 
827
- When you propose a solution, provide the actual implementation. When you
836
+ When you propose a solution, present it concretely with specifics. When you
828
837
  critique, point to specific structural issues and show what the fix looks
829
838
  like. Your peer's role is {peerRole} \u2014 they will stress-test your proposals
830
839
  from a different angle.`,
831
- codex: `Your role: Correctness & Standards Reviewer.
840
+ codex: `Your role: Rigor & Verification Analyst.
832
841
 
833
842
  Focus your analysis on:
834
- - Algorithmic correctness \u2014 does the logic actually work for all inputs?
835
- - Edge cases and failure modes \u2014 what breaks, what's untested?
836
- - Standards compliance \u2014 does this follow language/framework conventions?
837
- - 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?
838
847
 
839
- When you critique, provide specific test cases or inputs that demonstrate
840
- 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.
841
850
  Your peer's role is {peerRole} \u2014 they will focus on different aspects of the
842
851
  same problem.`,
843
- gemini: `Your role: Strategic Context Analyst.
852
+ gemini: `Your role: Context & Strategy Analyst.
844
853
 
845
854
  Focus your analysis on:
846
- - Broad codebase context \u2014 how does this change fit the larger system?
847
- - Current ecosystem conventions \u2014 what do the docs, community, and recent
848
- 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?
849
857
  - Upstream and downstream effects \u2014 what will this break or enable elsewhere?
850
858
  - Scope and planning \u2014 is this the right approach at the right level of
851
859
  abstraction?
852
860
 
853
861
  When you critique, ground your position in the broader context your peer may
854
- be missing. When you propose alternatives, explain the architectural tradeoffs.
862
+ be missing. When you propose alternatives, explain the tradeoffs involved.
855
863
  Your peer's role is {peerRole} \u2014 they will focus on different aspects of the
856
864
  same problem.`
857
865
  };
@@ -879,7 +887,7 @@ For this round:
879
887
  2. What is the weakest point, or what claim lacks supporting evidence?
880
888
  3. Has your position changed? State one of: HELD / PARTIALLY_CHANGED / CHANGED
881
889
  \u2014 with explicit reasoning for why.
882
- 4. If proposing code, show the specific implementation and explain tradeoffs
890
+ 4. If proposing a solution, present it concretely and explain tradeoffs
883
891
  versus your peer's approach.
884
892
  5. Confidence in your current position: LOW | MEDIUM | HIGH
885
893
 
@@ -896,8 +904,8 @@ This is a structured discussion aimed at reaching a well-reasoned position
896
904
  through genuine deliberation.
897
905
 
898
906
  Additional rules for discussion mode:
899
- - Structure your arguments: STATE your claim, provide EVIDENCE (code examples,
900
- 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
901
909
  claim, and note CAVEATS (when your claim doesn't hold).
902
910
  - Express confidence: end your response with CONFIDENCE: HIGH | MEDIUM | LOW
903
911
  and a one-line explanation of what would change your mind.
@@ -1056,6 +1064,86 @@ function analysisToMetadata(analysis) {
1056
1064
  };
1057
1065
  }
1058
1066
 
1067
+ // src/expand.ts
1068
+ import { readFileSync as readFileSync2, existsSync as existsSync2 } from "fs";
1069
+ import { execSync as execSync3 } from "child_process";
1070
+ import { join as join3 } from "path";
1071
+ var FAST_MODELS = {
1072
+ claude: "haiku",
1073
+ gemini: "gemini-2.0-flash",
1074
+ codex: "gpt-5.3-codex"
1075
+ };
1076
+ function gatherProjectContext(cwd) {
1077
+ const parts = [];
1078
+ try {
1079
+ const pkgPath = join3(cwd, "package.json");
1080
+ if (existsSync2(pkgPath)) {
1081
+ const pkg = JSON.parse(readFileSync2(pkgPath, "utf-8"));
1082
+ const info = [];
1083
+ if (pkg.name) info.push(`name: ${pkg.name}`);
1084
+ if (pkg.description) info.push(`description: ${pkg.description}`);
1085
+ const deps = [
1086
+ ...Object.keys(pkg.dependencies ?? {}),
1087
+ ...Object.keys(pkg.devDependencies ?? {})
1088
+ ].slice(0, 15);
1089
+ if (deps.length > 0) info.push(`dependencies: ${deps.join(", ")}`);
1090
+ if (info.length > 0) parts.push(`Project: ${info.join("; ")}`);
1091
+ }
1092
+ } catch {
1093
+ }
1094
+ try {
1095
+ const readmePath = join3(cwd, "README.md");
1096
+ if (existsSync2(readmePath)) {
1097
+ const readme = readFileSync2(readmePath, "utf-8").slice(0, 500);
1098
+ parts.push(`README excerpt:
1099
+ ${readme}`);
1100
+ }
1101
+ } catch {
1102
+ }
1103
+ try {
1104
+ const recentFiles = execSync3(
1105
+ "git diff --name-only HEAD~5 2>/dev/null || ls -t | head -20",
1106
+ { cwd, encoding: "utf-8", timeout: 3e3 }
1107
+ ).trim();
1108
+ if (recentFiles) parts.push(`Recently changed files:
1109
+ ${recentFiles}`);
1110
+ } catch {
1111
+ }
1112
+ return parts.join("\n\n");
1113
+ }
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.
1115
+
1116
+ Rules:
1117
+ - Preserve the user's intent exactly \u2014 do not add requirements they didn't ask for
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
+ - Keep the expanded prompt to 2-4 sentences
1121
+ - Output ONLY the expanded prompt, no preamble or explanation`;
1122
+ async function expandPrompt(prompt, agent, cwd, signal) {
1123
+ try {
1124
+ const context = gatherProjectContext(cwd);
1125
+ const systemPrompt = context ? `${EXPANSION_SYSTEM_PROMPT}
1126
+
1127
+ Project context:
1128
+ ${context}` : EXPANSION_SYSTEM_PROMPT;
1129
+ const descriptor = getAgent(agent);
1130
+ const response = await descriptor.run({
1131
+ prompt: `Expand this prompt:
1132
+
1133
+ ${prompt}`,
1134
+ systemPrompt,
1135
+ model: FAST_MODELS[agent],
1136
+ cwd,
1137
+ signal
1138
+ });
1139
+ const expanded = response.text?.trim();
1140
+ if (!expanded) return { original: prompt, expanded: prompt };
1141
+ return { original: prompt, expanded };
1142
+ } catch {
1143
+ return { original: prompt, expanded: prompt };
1144
+ }
1145
+ }
1146
+
1059
1147
  // src/config-editor.tsx
1060
1148
  import { useState } from "react";
1061
1149
  import { render, Box, Text, useApp, useInput } from "ink";
@@ -1100,6 +1188,13 @@ var CONFIG_FIELDS = [
1100
1188
  label: "Discussion max rounds",
1101
1189
  get: (c) => String(c.discussion.max_rounds),
1102
1190
  type: "number"
1191
+ },
1192
+ {
1193
+ key: "expansion.enabled",
1194
+ label: "Prompt expansion",
1195
+ get: (c) => String(c.expansion.enabled),
1196
+ type: "string",
1197
+ validate: (v) => v !== "true" && v !== "false" ? "Must be 'true' or 'false'" : null
1103
1198
  }
1104
1199
  ];
1105
1200
  var LABEL_WIDTH = Math.max(...CONFIG_FIELDS.map((f) => f.label.length));
@@ -1301,6 +1396,12 @@ var UserMessage = React2.memo(function UserMessage2({ content }) {
1301
1396
  /* @__PURE__ */ jsx2(Text2, { children: content })
1302
1397
  ] });
1303
1398
  });
1399
+ var ExpandedPromptBlock = React2.memo(function ExpandedPromptBlock2({ content }) {
1400
+ return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", marginLeft: 1, marginBottom: 1, children: [
1401
+ /* @__PURE__ */ jsx2(Text2, { color: "yellow", dimColor: true, children: "Expanded prompt:" }),
1402
+ /* @__PURE__ */ jsx2(Box2, { marginLeft: 2, children: /* @__PURE__ */ jsx2(Text2, { children: content }) })
1403
+ ] });
1404
+ });
1304
1405
  function ThinkingIndicator({ agent }) {
1305
1406
  const descriptor = getAgent(agent);
1306
1407
  return /* @__PURE__ */ jsxs2(Box2, { marginLeft: 1, children: [
@@ -1376,6 +1477,7 @@ function App({
1376
1477
  const [thinkingAgents, setThinkingAgents] = useState2([]);
1377
1478
  const [discussionRound, setDiscussionRound] = useState2(0);
1378
1479
  const [consensusReached, setConsensusReached] = useState2(false);
1480
+ const [expanding, setExpanding] = useState2(false);
1379
1481
  const [statusMessage, setStatusMessage] = useState2(null);
1380
1482
  const [roundNum, setRoundNum] = useState2(() => {
1381
1483
  if (showTranscript2 && showTranscript2.length > 0) {
@@ -1423,6 +1525,7 @@ function App({
1423
1525
  runningRoundRef.current = null;
1424
1526
  }
1425
1527
  setThinkingAgents([]);
1528
+ setExpanding(false);
1426
1529
  setDiscussionRound(0);
1427
1530
  setStatusMessage("Interrupted.");
1428
1531
  setState("input");
@@ -1479,7 +1582,7 @@ function App({
1479
1582
  if (isFirstRound) return collaborationSystemPrompt(agent, promptPair);
1480
1583
  return discussionRoundPrompt(agent, history, promptPair);
1481
1584
  };
1482
- const ac = new AbortController();
1585
+ const ac = abortRef.current ?? new AbortController();
1483
1586
  abortRef.current = ac;
1484
1587
  const results = [];
1485
1588
  const promises = [];
@@ -1572,11 +1675,42 @@ function App({
1572
1675
  content: rawInput,
1573
1676
  round: currentRound
1574
1677
  });
1575
- const allMessages = [...messages, userMsg];
1576
- const newMessages = await runAgents(allMessages, currentRound, target);
1678
+ let allMessages = [...messages, userMsg];
1679
+ let effectivePrompt;
1680
+ if (config.expansion.enabled && currentRound === 0 && !existingSessionId) {
1681
+ const ac = new AbortController();
1682
+ abortRef.current = ac;
1683
+ setExpanding(true);
1684
+ try {
1685
+ const result = await expandPrompt(prompt, pair[0], process.cwd(), ac.signal);
1686
+ if (result.expanded !== result.original) {
1687
+ const expandedMsg = {
1688
+ id: `${currentRound}-expanded`,
1689
+ role: "expanded",
1690
+ content: result.expanded,
1691
+ round: currentRound
1692
+ };
1693
+ setMessages((prev) => [...prev, expandedMsg]);
1694
+ insertMessage({
1695
+ sessionId,
1696
+ role: "expanded",
1697
+ content: result.expanded,
1698
+ round: currentRound
1699
+ });
1700
+ allMessages = [...allMessages, expandedMsg];
1701
+ effectivePrompt = result.expanded;
1702
+ }
1703
+ } catch {
1704
+ } finally {
1705
+ setExpanding(false);
1706
+ }
1707
+ if (ac.signal.aborted) return;
1708
+ }
1709
+ const newMessages = await runAgents(allMessages, currentRound, target, effectivePrompt);
1577
1710
  if (newMessages.length === 0) return;
1711
+ const expandedCount = effectivePrompt ? 1 : 0;
1578
1712
  setMessages((prev) => [...prev, ...newMessages]);
1579
- setCommittedCount((prev) => prev + 1 + newMessages.length);
1713
+ setCommittedCount((prev) => prev + 1 + expandedCount + newMessages.length);
1580
1714
  setRoundNum(currentRound + 1);
1581
1715
  runningRoundRef.current = null;
1582
1716
  touchSession(sessionId);
@@ -1607,6 +1741,36 @@ function App({
1607
1741
  round: currentRound
1608
1742
  });
1609
1743
  let allMessages = [...messages, userMsg];
1744
+ let effectivePrompt;
1745
+ if (config.expansion.enabled && currentRound === 0 && !existingSessionId) {
1746
+ const ac = new AbortController();
1747
+ abortRef.current = ac;
1748
+ setExpanding(true);
1749
+ try {
1750
+ const result = await expandPrompt(prompt, activePair[0], process.cwd(), ac.signal);
1751
+ if (result.expanded !== result.original) {
1752
+ const expandedMsg = {
1753
+ id: `${currentRound}-expanded`,
1754
+ role: "expanded",
1755
+ content: result.expanded,
1756
+ round: currentRound
1757
+ };
1758
+ setMessages((prev) => [...prev, expandedMsg]);
1759
+ insertMessage({
1760
+ sessionId,
1761
+ role: "expanded",
1762
+ content: result.expanded,
1763
+ round: currentRound
1764
+ });
1765
+ allMessages = [...allMessages, expandedMsg];
1766
+ effectivePrompt = result.expanded;
1767
+ }
1768
+ } catch {
1769
+ } finally {
1770
+ setExpanding(false);
1771
+ }
1772
+ if (ac.signal.aborted) return;
1773
+ }
1610
1774
  const discState = {
1611
1775
  round: 0,
1612
1776
  analyses: [],
@@ -1641,13 +1805,14 @@ function App({
1641
1805
  allMessages,
1642
1806
  currentRound,
1643
1807
  discussionTarget,
1644
- disc === 1 ? prompt : "Provide your response for this round.",
1808
+ disc === 1 ? effectivePrompt ?? prompt : "Provide your response for this round.",
1645
1809
  true,
1646
1810
  perAgentPrompts
1647
1811
  );
1648
1812
  if (newMessages.length === 0) break;
1649
1813
  setMessages((prev) => [...prev, ...newMessages]);
1650
- setCommittedCount((prev) => prev + (disc === 1 ? 1 : 0) + newMessages.length);
1814
+ const expandedCount = disc === 1 && effectivePrompt ? 1 : 0;
1815
+ setCommittedCount((prev) => prev + (disc === 1 ? 1 : 0) + expandedCount + newMessages.length);
1651
1816
  allMessages = [...allMessages, ...newMessages];
1652
1817
  currentRound++;
1653
1818
  const roundAnalyses = activePair.map((agent) => {
@@ -1751,15 +1916,21 @@ function App({
1751
1916
  /* @__PURE__ */ jsx2(Static, { items: staticItems, children: (item) => {
1752
1917
  if (item.role === "__header") return /* @__PURE__ */ jsx2(Header, { sessionId }, item.id);
1753
1918
  if (item.role === "user") return /* @__PURE__ */ jsx2(UserMessage, { content: item.content }, item.id);
1919
+ if (item.role === "expanded") return /* @__PURE__ */ jsx2(ExpandedPromptBlock, { content: item.content }, item.id);
1754
1920
  if (isValidAgentName(item.role)) return /* @__PURE__ */ jsx2(AgentResponseBlock, { agent: item.role, content: item.content, error: item.error }, item.id);
1755
1921
  return /* @__PURE__ */ jsx2(Box2, {}, item.id);
1756
1922
  } }),
1757
1923
  messages.length === 0 && state === "input" && /* @__PURE__ */ jsx2(QuickHelp, {}),
1758
1924
  messages.slice(committedCount).map((msg) => {
1759
1925
  if (msg.role === "user") return /* @__PURE__ */ jsx2(UserMessage, { content: msg.content }, msg.id);
1926
+ if (msg.role === "expanded") return /* @__PURE__ */ jsx2(ExpandedPromptBlock, { content: msg.content }, msg.id);
1760
1927
  if (isValidAgentName(msg.role)) return /* @__PURE__ */ jsx2(AgentResponseBlock, { agent: msg.role, content: msg.content, error: msg.error }, msg.id);
1761
1928
  return null;
1762
1929
  }),
1930
+ expanding && /* @__PURE__ */ jsxs2(Box2, { marginLeft: 1, children: [
1931
+ /* @__PURE__ */ jsx2(Text2, { color: "yellow", children: /* @__PURE__ */ jsx2(Spinner, { type: "dots" }) }),
1932
+ /* @__PURE__ */ jsx2(Text2, { color: "yellow", children: " Expanding prompt\u2026" })
1933
+ ] }),
1763
1934
  discussionRound > 0 && thinkingAgents.length > 0 && /* @__PURE__ */ jsx2(DiscussionStatus, { round: discussionRound, maxRounds: config.discussion.max_rounds }),
1764
1935
  thinkingAgents.length > 0 && /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", marginBottom: 1, children: thinkingAgents.map((agent) => /* @__PURE__ */ jsx2(ThinkingIndicator, { agent }, agent)) }),
1765
1936
  consensusReached && /* @__PURE__ */ jsx2(ConsensusReached, {}),
@@ -1815,6 +1986,9 @@ function showTranscript(sessionId) {
1815
1986
  if (msg.role === "user") {
1816
1987
  return /* @__PURE__ */ jsx2(UserMessage, { content: msg.content }, msg.id);
1817
1988
  }
1989
+ if (msg.role === "expanded") {
1990
+ return /* @__PURE__ */ jsx2(ExpandedPromptBlock, { content: msg.content }, msg.id);
1991
+ }
1818
1992
  if (isValidAgentName(msg.role)) {
1819
1993
  return /* @__PURE__ */ jsx2(AgentResponseBlock, { agent: msg.role, content: msg.content }, msg.id);
1820
1994
  }
@@ -1851,7 +2025,7 @@ process.on("SIGINT", () => {
1851
2025
  });
1852
2026
  function checkCli(name, installUrl) {
1853
2027
  try {
1854
- execSync3(`${name} --version`, { stdio: "ignore" });
2028
+ execSync4(`${name} --version`, { stdio: "ignore" });
1855
2029
  return true;
1856
2030
  } catch {
1857
2031
  console.error(
@@ -2100,6 +2274,9 @@ configCmd.command("show").description("Show current configuration").action(() =>
2100
2274
  console.log(
2101
2275
  chalk.dim(" discussion.max_rounds = ") + chalk.white(String(config.discussion.max_rounds))
2102
2276
  );
2277
+ console.log(
2278
+ chalk.dim(" expansion.enabled = ") + chalk.white(String(config.expansion.enabled))
2279
+ );
2103
2280
  console.log();
2104
2281
  });
2105
2282
  configCmd.command("set <key> <value>").description("Set a configuration value").action((key, value) => {
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/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 });\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}\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};\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 };\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 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 {\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 { 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\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 [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 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 = 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 const allMessages = [...messages, userMsg];\n const newMessages = await runAgents(allMessages, currentRound, target);\n\n // If aborted, the Escape handler already cleaned up\n if (newMessages.length === 0) return;\n\n setMessages((prev) => [...prev, ...newMessages]);\n setCommittedCount((prev) => prev + 1 + 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\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 ? 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)\n setCommittedCount((prev) => prev + (disc === 1 ? 1 : 0) + 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 (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 (isValidAgentName(msg.role)) return <AgentResponseBlock key={msg.id} agent={msg.role} content={msg.content} error={msg.error} />;\n return null;\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 (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 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\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","jsx","jsxs","adHoc","Text","React","AgentResponseBlock","Box","UserMessage","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.4",
3
+ "version": "0.5.0",
4
4
  "description": "Orchestrate AI agents (Claude, Codex, Gemini) in collaborative sessions",
5
5
  "type": "module",
6
6
  "bin": {