tagteam 0.4.3 → 0.4.5
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/README.md +1 -1
- package/dist/index.js +232 -25
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# tagteam
|
|
2
2
|
|
|
3
|
-
Orchestrate AI agents in collaborative sessions. Pick any two from Claude, Codex, and Gemini — send a prompt to both simultaneously, then let them build on each other's responses in multi-round discussions.
|
|
3
|
+
Orchestrate AI agents in collaborative sessions. Pick any two from Claude, Codex, and Gemini — send a prompt to both simultaneously, then let them build on each other's responses in multi-round discussions. Discussion mode uses a structured multi-agent debate protocol informed by recent research showing that LLMs produce more accurate, well-reasoned outputs when they critique and refine each other's arguments.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
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
|
|
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
|
}
|
|
@@ -112,7 +121,7 @@ function setConfigValue(key, value) {
|
|
|
112
121
|
}
|
|
113
122
|
|
|
114
123
|
// src/ui.tsx
|
|
115
|
-
import React2, { useState as useState2, useEffect,
|
|
124
|
+
import React2, { useState as useState2, useEffect, useRef, useMemo } from "react";
|
|
116
125
|
import { render as render2, Box as Box2, Text as Text2, useApp as useApp2, useInput as useInput2, Static } from "ink";
|
|
117
126
|
import TextInput2 from "ink-text-input";
|
|
118
127
|
import Spinner from "ink-spinner";
|
|
@@ -140,7 +149,7 @@ async function* streamClaude(options) {
|
|
|
140
149
|
args.push(options.prompt);
|
|
141
150
|
const proc = spawn("claude", args, {
|
|
142
151
|
cwd: options.cwd,
|
|
143
|
-
stdio: ["ignore", "pipe", "
|
|
152
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
144
153
|
env: { ...process.env, CLAUDECODE: "" }
|
|
145
154
|
});
|
|
146
155
|
let spawnErrorMsg = "";
|
|
@@ -256,7 +265,7 @@ ${options.prompt}`;
|
|
|
256
265
|
args.push(fullPrompt);
|
|
257
266
|
const proc = spawn2("codex", args, {
|
|
258
267
|
cwd: options.cwd,
|
|
259
|
-
stdio: ["ignore", "pipe", "
|
|
268
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
260
269
|
env: process.env
|
|
261
270
|
});
|
|
262
271
|
let spawnErrorMsg = "";
|
|
@@ -378,7 +387,7 @@ ${options.prompt}`;
|
|
|
378
387
|
}
|
|
379
388
|
const proc = spawn3("gemini", args, {
|
|
380
389
|
cwd: options.cwd,
|
|
381
|
-
stdio: ["ignore", "pipe", "
|
|
390
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
382
391
|
env: process.env
|
|
383
392
|
});
|
|
384
393
|
let spawnErrorMsg = "";
|
|
@@ -1056,6 +1065,85 @@ function analysisToMetadata(analysis) {
|
|
|
1056
1065
|
};
|
|
1057
1066
|
}
|
|
1058
1067
|
|
|
1068
|
+
// src/expand.ts
|
|
1069
|
+
import { readFileSync as readFileSync2, existsSync as existsSync2 } from "fs";
|
|
1070
|
+
import { execSync as execSync3 } from "child_process";
|
|
1071
|
+
import { join as join3 } from "path";
|
|
1072
|
+
var FAST_MODELS = {
|
|
1073
|
+
claude: "haiku",
|
|
1074
|
+
gemini: "gemini-2.0-flash",
|
|
1075
|
+
codex: "gpt-5.3-codex"
|
|
1076
|
+
};
|
|
1077
|
+
function gatherProjectContext(cwd) {
|
|
1078
|
+
const parts = [];
|
|
1079
|
+
try {
|
|
1080
|
+
const pkgPath = join3(cwd, "package.json");
|
|
1081
|
+
if (existsSync2(pkgPath)) {
|
|
1082
|
+
const pkg = JSON.parse(readFileSync2(pkgPath, "utf-8"));
|
|
1083
|
+
const info = [];
|
|
1084
|
+
if (pkg.name) info.push(`name: ${pkg.name}`);
|
|
1085
|
+
if (pkg.description) info.push(`description: ${pkg.description}`);
|
|
1086
|
+
const deps = [
|
|
1087
|
+
...Object.keys(pkg.dependencies ?? {}),
|
|
1088
|
+
...Object.keys(pkg.devDependencies ?? {})
|
|
1089
|
+
].slice(0, 15);
|
|
1090
|
+
if (deps.length > 0) info.push(`dependencies: ${deps.join(", ")}`);
|
|
1091
|
+
if (info.length > 0) parts.push(`Project: ${info.join("; ")}`);
|
|
1092
|
+
}
|
|
1093
|
+
} catch {
|
|
1094
|
+
}
|
|
1095
|
+
try {
|
|
1096
|
+
const readmePath = join3(cwd, "README.md");
|
|
1097
|
+
if (existsSync2(readmePath)) {
|
|
1098
|
+
const readme = readFileSync2(readmePath, "utf-8").slice(0, 500);
|
|
1099
|
+
parts.push(`README excerpt:
|
|
1100
|
+
${readme}`);
|
|
1101
|
+
}
|
|
1102
|
+
} catch {
|
|
1103
|
+
}
|
|
1104
|
+
try {
|
|
1105
|
+
const recentFiles = execSync3(
|
|
1106
|
+
"git diff --name-only HEAD~5 2>/dev/null || ls -t | head -20",
|
|
1107
|
+
{ cwd, encoding: "utf-8", timeout: 3e3 }
|
|
1108
|
+
).trim();
|
|
1109
|
+
if (recentFiles) parts.push(`Recently changed files:
|
|
1110
|
+
${recentFiles}`);
|
|
1111
|
+
} catch {
|
|
1112
|
+
}
|
|
1113
|
+
return parts.join("\n\n");
|
|
1114
|
+
}
|
|
1115
|
+
var EXPANSION_SYSTEM_PROMPT = `You are a prompt expansion assistant for a multi-agent coding tool. Your job is to rewrite terse user prompts into specific, actionable versions.
|
|
1116
|
+
|
|
1117
|
+
Rules:
|
|
1118
|
+
- Preserve the user's intent exactly \u2014 do not add requirements they didn't ask for
|
|
1119
|
+
- Make implicit context explicit using the project information provided
|
|
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: [
|
|
@@ -1323,19 +1424,20 @@ function DiscussionStatus({ round, maxRounds }) {
|
|
|
1323
1424
|
function ConsensusReached() {
|
|
1324
1425
|
return /* @__PURE__ */ jsx2(Box2, { marginLeft: 1, marginBottom: 1, children: /* @__PURE__ */ jsx2(Text2, { color: "green", bold: true, children: "Consensus reached." }) });
|
|
1325
1426
|
}
|
|
1427
|
+
var promptHistory = [];
|
|
1326
1428
|
function PromptInput({
|
|
1327
|
-
onSubmit
|
|
1429
|
+
onSubmit,
|
|
1430
|
+
controlRef
|
|
1328
1431
|
}) {
|
|
1329
1432
|
const [value, setValue] = useState2("");
|
|
1330
|
-
const
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
}
|
|
1337
|
-
|
|
1338
|
-
);
|
|
1433
|
+
const valueRef = useRef("");
|
|
1434
|
+
valueRef.current = value;
|
|
1435
|
+
useEffect(() => {
|
|
1436
|
+
controlRef.current = { setValue, getValue: () => valueRef.current };
|
|
1437
|
+
return () => {
|
|
1438
|
+
controlRef.current = null;
|
|
1439
|
+
};
|
|
1440
|
+
}, [controlRef]);
|
|
1339
1441
|
return /* @__PURE__ */ jsxs2(Box2, { marginLeft: 1, children: [
|
|
1340
1442
|
/* @__PURE__ */ jsx2(Text2, { bold: true, color: "white", children: "> " }),
|
|
1341
1443
|
/* @__PURE__ */ jsx2(
|
|
@@ -1343,7 +1445,12 @@ function PromptInput({
|
|
|
1343
1445
|
{
|
|
1344
1446
|
value,
|
|
1345
1447
|
onChange: setValue,
|
|
1346
|
-
onSubmit:
|
|
1448
|
+
onSubmit: (submitted) => {
|
|
1449
|
+
if (submitted.trim()) {
|
|
1450
|
+
onSubmit(submitted.trim());
|
|
1451
|
+
setValue("");
|
|
1452
|
+
}
|
|
1453
|
+
},
|
|
1347
1454
|
showCursor: true
|
|
1348
1455
|
}
|
|
1349
1456
|
)
|
|
@@ -1370,6 +1477,7 @@ function App({
|
|
|
1370
1477
|
const [thinkingAgents, setThinkingAgents] = useState2([]);
|
|
1371
1478
|
const [discussionRound, setDiscussionRound] = useState2(0);
|
|
1372
1479
|
const [consensusReached, setConsensusReached] = useState2(false);
|
|
1480
|
+
const [expanding, setExpanding] = useState2(false);
|
|
1373
1481
|
const [statusMessage, setStatusMessage] = useState2(null);
|
|
1374
1482
|
const [roundNum, setRoundNum] = useState2(() => {
|
|
1375
1483
|
if (showTranscript2 && showTranscript2.length > 0) {
|
|
@@ -1378,6 +1486,9 @@ function App({
|
|
|
1378
1486
|
return 0;
|
|
1379
1487
|
});
|
|
1380
1488
|
const [committedCount, setCommittedCount] = useState2(showTranscript2?.length ?? 0);
|
|
1489
|
+
const promptControlRef = useRef(null);
|
|
1490
|
+
const historyIndexRef = useRef(-1);
|
|
1491
|
+
const savedInputRef = useRef("");
|
|
1381
1492
|
const sessionCreatedRef = useRef(!!existingSessionId);
|
|
1382
1493
|
const ensureSession = (id) => {
|
|
1383
1494
|
if (!sessionCreatedRef.current) {
|
|
@@ -1414,10 +1525,29 @@ function App({
|
|
|
1414
1525
|
runningRoundRef.current = null;
|
|
1415
1526
|
}
|
|
1416
1527
|
setThinkingAgents([]);
|
|
1528
|
+
setExpanding(false);
|
|
1417
1529
|
setDiscussionRound(0);
|
|
1418
1530
|
setStatusMessage("Interrupted.");
|
|
1419
1531
|
setState("input");
|
|
1420
1532
|
}
|
|
1533
|
+
if (state === "input" && key.upArrow && promptHistory.length > 0) {
|
|
1534
|
+
if (historyIndexRef.current === -1) {
|
|
1535
|
+
savedInputRef.current = promptControlRef.current?.getValue() ?? "";
|
|
1536
|
+
}
|
|
1537
|
+
const nextIndex = historyIndexRef.current === -1 ? promptHistory.length - 1 : Math.max(0, historyIndexRef.current - 1);
|
|
1538
|
+
historyIndexRef.current = nextIndex;
|
|
1539
|
+
promptControlRef.current?.setValue(promptHistory[nextIndex]);
|
|
1540
|
+
}
|
|
1541
|
+
if (state === "input" && key.downArrow && historyIndexRef.current !== -1) {
|
|
1542
|
+
if (historyIndexRef.current >= promptHistory.length - 1) {
|
|
1543
|
+
historyIndexRef.current = -1;
|
|
1544
|
+
promptControlRef.current?.setValue(savedInputRef.current);
|
|
1545
|
+
} else {
|
|
1546
|
+
const nextIndex = historyIndexRef.current + 1;
|
|
1547
|
+
historyIndexRef.current = nextIndex;
|
|
1548
|
+
promptControlRef.current?.setValue(promptHistory[nextIndex]);
|
|
1549
|
+
}
|
|
1550
|
+
}
|
|
1421
1551
|
});
|
|
1422
1552
|
const runAgents = async (currentMessages, round, target, promptOverride, isDebate = false, systemPromptPerAgent) => {
|
|
1423
1553
|
const activeAgents = Array.isArray(target) ? target : target === "both" ? [...pair] : [target];
|
|
@@ -1452,7 +1582,7 @@ function App({
|
|
|
1452
1582
|
if (isFirstRound) return collaborationSystemPrompt(agent, promptPair);
|
|
1453
1583
|
return discussionRoundPrompt(agent, history, promptPair);
|
|
1454
1584
|
};
|
|
1455
|
-
const ac = new AbortController();
|
|
1585
|
+
const ac = abortRef.current ?? new AbortController();
|
|
1456
1586
|
abortRef.current = ac;
|
|
1457
1587
|
const results = [];
|
|
1458
1588
|
const promises = [];
|
|
@@ -1545,11 +1675,42 @@ function App({
|
|
|
1545
1675
|
content: rawInput,
|
|
1546
1676
|
round: currentRound
|
|
1547
1677
|
});
|
|
1548
|
-
|
|
1549
|
-
|
|
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);
|
|
1550
1710
|
if (newMessages.length === 0) return;
|
|
1711
|
+
const expandedCount = effectivePrompt ? 1 : 0;
|
|
1551
1712
|
setMessages((prev) => [...prev, ...newMessages]);
|
|
1552
|
-
setCommittedCount((prev) => prev + 1 + newMessages.length);
|
|
1713
|
+
setCommittedCount((prev) => prev + 1 + expandedCount + newMessages.length);
|
|
1553
1714
|
setRoundNum(currentRound + 1);
|
|
1554
1715
|
runningRoundRef.current = null;
|
|
1555
1716
|
touchSession(sessionId);
|
|
@@ -1580,6 +1741,36 @@ function App({
|
|
|
1580
1741
|
round: currentRound
|
|
1581
1742
|
});
|
|
1582
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
|
+
}
|
|
1583
1774
|
const discState = {
|
|
1584
1775
|
round: 0,
|
|
1585
1776
|
analyses: [],
|
|
@@ -1614,13 +1805,14 @@ function App({
|
|
|
1614
1805
|
allMessages,
|
|
1615
1806
|
currentRound,
|
|
1616
1807
|
discussionTarget,
|
|
1617
|
-
disc === 1 ? prompt : "Provide your response for this round.",
|
|
1808
|
+
disc === 1 ? effectivePrompt ?? prompt : "Provide your response for this round.",
|
|
1618
1809
|
true,
|
|
1619
1810
|
perAgentPrompts
|
|
1620
1811
|
);
|
|
1621
1812
|
if (newMessages.length === 0) break;
|
|
1622
1813
|
setMessages((prev) => [...prev, ...newMessages]);
|
|
1623
|
-
|
|
1814
|
+
const expandedCount = disc === 1 && effectivePrompt ? 1 : 0;
|
|
1815
|
+
setCommittedCount((prev) => prev + (disc === 1 ? 1 : 0) + expandedCount + newMessages.length);
|
|
1624
1816
|
allMessages = [...allMessages, ...newMessages];
|
|
1625
1817
|
currentRound++;
|
|
1626
1818
|
const roundAnalyses = activePair.map((agent) => {
|
|
@@ -1648,6 +1840,9 @@ function App({
|
|
|
1648
1840
|
};
|
|
1649
1841
|
const handleSubmit = (value) => {
|
|
1650
1842
|
setStatusMessage(null);
|
|
1843
|
+
promptHistory.push(value);
|
|
1844
|
+
historyIndexRef.current = -1;
|
|
1845
|
+
savedInputRef.current = "";
|
|
1651
1846
|
if (value === "/exit") {
|
|
1652
1847
|
closeDb();
|
|
1653
1848
|
exit();
|
|
@@ -1721,15 +1916,21 @@ function App({
|
|
|
1721
1916
|
/* @__PURE__ */ jsx2(Static, { items: staticItems, children: (item) => {
|
|
1722
1917
|
if (item.role === "__header") return /* @__PURE__ */ jsx2(Header, { sessionId }, item.id);
|
|
1723
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);
|
|
1724
1920
|
if (isValidAgentName(item.role)) return /* @__PURE__ */ jsx2(AgentResponseBlock, { agent: item.role, content: item.content, error: item.error }, item.id);
|
|
1725
1921
|
return /* @__PURE__ */ jsx2(Box2, {}, item.id);
|
|
1726
1922
|
} }),
|
|
1727
1923
|
messages.length === 0 && state === "input" && /* @__PURE__ */ jsx2(QuickHelp, {}),
|
|
1728
1924
|
messages.slice(committedCount).map((msg) => {
|
|
1729
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);
|
|
1730
1927
|
if (isValidAgentName(msg.role)) return /* @__PURE__ */ jsx2(AgentResponseBlock, { agent: msg.role, content: msg.content, error: msg.error }, msg.id);
|
|
1731
1928
|
return null;
|
|
1732
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
|
+
] }),
|
|
1733
1934
|
discussionRound > 0 && thinkingAgents.length > 0 && /* @__PURE__ */ jsx2(DiscussionStatus, { round: discussionRound, maxRounds: config.discussion.max_rounds }),
|
|
1734
1935
|
thinkingAgents.length > 0 && /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", marginBottom: 1, children: thinkingAgents.map((agent) => /* @__PURE__ */ jsx2(ThinkingIndicator, { agent }, agent)) }),
|
|
1735
1936
|
consensusReached && /* @__PURE__ */ jsx2(ConsensusReached, {}),
|
|
@@ -1755,7 +1956,7 @@ function App({
|
|
|
1755
1956
|
}
|
|
1756
1957
|
}
|
|
1757
1958
|
),
|
|
1758
|
-
state === "input" && /* @__PURE__ */ jsx2(PromptInput, { onSubmit: handleSubmit })
|
|
1959
|
+
state === "input" && /* @__PURE__ */ jsx2(PromptInput, { onSubmit: handleSubmit, controlRef: promptControlRef })
|
|
1759
1960
|
] });
|
|
1760
1961
|
}
|
|
1761
1962
|
function startApp(props) {
|
|
@@ -1785,6 +1986,9 @@ function showTranscript(sessionId) {
|
|
|
1785
1986
|
if (msg.role === "user") {
|
|
1786
1987
|
return /* @__PURE__ */ jsx2(UserMessage, { content: msg.content }, msg.id);
|
|
1787
1988
|
}
|
|
1989
|
+
if (msg.role === "expanded") {
|
|
1990
|
+
return /* @__PURE__ */ jsx2(ExpandedPromptBlock, { content: msg.content }, msg.id);
|
|
1991
|
+
}
|
|
1788
1992
|
if (isValidAgentName(msg.role)) {
|
|
1789
1993
|
return /* @__PURE__ */ jsx2(AgentResponseBlock, { agent: msg.role, content: msg.content }, msg.id);
|
|
1790
1994
|
}
|
|
@@ -1821,7 +2025,7 @@ process.on("SIGINT", () => {
|
|
|
1821
2025
|
});
|
|
1822
2026
|
function checkCli(name, installUrl) {
|
|
1823
2027
|
try {
|
|
1824
|
-
|
|
2028
|
+
execSync4(`${name} --version`, { stdio: "ignore" });
|
|
1825
2029
|
return true;
|
|
1826
2030
|
} catch {
|
|
1827
2031
|
console.error(
|
|
@@ -2070,6 +2274,9 @@ configCmd.command("show").description("Show current configuration").action(() =>
|
|
|
2070
2274
|
console.log(
|
|
2071
2275
|
chalk.dim(" discussion.max_rounds = ") + chalk.white(String(config.discussion.max_rounds))
|
|
2072
2276
|
);
|
|
2277
|
+
console.log(
|
|
2278
|
+
chalk.dim(" expansion.enabled = ") + chalk.white(String(config.expansion.enabled))
|
|
2279
|
+
);
|
|
2073
2280
|
console.log();
|
|
2074
2281
|
});
|
|
2075
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\nfunction PromptInput({\n onSubmit,\n}: {\n onSubmit: (value: string) => void;\n}) {\n const [value, setValue] = useState(\"\");\n\n const handleSubmit = useCallback(\n (submitted: string) => {\n if (submitted.trim()) {\n onSubmit(submitted.trim());\n setValue(\"\");\n }\n },\n [onSubmit]\n );\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={handleSubmit}\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\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 // Ctrl+C and Escape handling\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 });\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\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} />}\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\", \"inherit\"],\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\", \"inherit\"],\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\", \"inherit\"],\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: \"architecture-implementation\",\n role: \"The Builder\",\n focus: [\n \"multi-file coherence and refactoring\",\n \"production-quality implementation\",\n \"design patterns and maintainability\",\n \"comprehensive working solutions\",\n ],\n },\n run: runClaude,\n },\n codex: {\n name: \"codex\",\n displayName: \"Codex\",\n color: \"green\",\n cliBinary: \"codex\",\n installUrl: \"https://github.com/openai/codex\",\n org: \"OpenAI\",\n profile: {\n strength: \"correctness-verification\",\n role: \"The Verifier\",\n focus: [\n \"algorithmic correctness and edge cases\",\n \"test coverage and failure modes\",\n \"standards compliance and best practices\",\n \"performance characteristics and benchmarks\",\n ],\n },\n run: runCodex,\n },\n gemini: {\n name: \"gemini\",\n displayName: \"Gemini\",\n color: \"blue\",\n cliBinary: \"gemini\",\n installUrl: \"https://github.com/google-gemini/gemini-cli\",\n org: \"Google\",\n profile: {\n strength: \"context-strategy\",\n role: \"The Strategist\",\n focus: [\n \"broad codebase context and upstream/downstream effects\",\n \"current ecosystem conventions and documentation\",\n \"architectural fit and scope assessment\",\n \"planning, decomposition, and tradeoff analysis\",\n ],\n },\n run: runGemini,\n },\n};\n\n// Anonymized peer role descriptions keyed by sorted pair string\nconst PEER_ROLES: Record<string, Record<AgentName, string>> = {\n \"claude,codex\": {\n claude: \"Correctness & Standards — they verify edge cases, test coverage, and standards compliance\",\n codex: \"Architecture & Implementation — they propose complete solutions and assess structural coherence\",\n gemini: \"\", // not in this pair\n },\n \"claude,gemini\": {\n claude: \"Strategic Context — they assess broad codebase fit, ecosystem conventions, and architectural tradeoffs\",\n gemini: \"Architecture & Implementation — they propose complete solutions and assess structural coherence\",\n codex: \"\", // not in this pair\n },\n \"codex,gemini\": {\n codex: \"Strategic Context — they assess broad codebase fit, ecosystem conventions, and architectural tradeoffs\",\n gemini: \"Correctness & Standards — they verify edge cases, test coverage, and standards compliance\",\n claude: \"\", // not in this pair\n },\n};\n\nexport function getAgent(name: AgentName): AgentDescriptor {\n return AGENTS[name];\n}\n\nexport function getAgentProfile(name: AgentName): AgentProfile {\n return AGENTS[name].profile;\n}\n\nexport function getPeerRoleDescription(agent: AgentName, pair: [AgentName, AgentName]): string {\n const key = [...pair].sort().join(\",\");\n return PEER_ROLES[key]?.[agent] ?? \"\";\n}\n\nexport function getAllAgentNames(): AgentName[] {\n return Object.keys(AGENTS) as AgentName[];\n}\n\nexport function isValidAgentName(name: string): name is AgentName {\n return name in AGENTS;\n}\n\nexport function validateAgentPair(pair: string[]): [AgentName, AgentName] {\n if (pair.length !== 2) {\n throw new Error(\"Agent pair must contain exactly 2 agents\");\n }\n if (pair[0] === pair[1]) {\n throw new Error(\"Agent pair must contain 2 distinct agents\");\n }\n for (const name of pair) {\n if (!isValidAgentName(name)) {\n throw new Error(`Unknown agent: \"${name}\". Valid agents: ${getAllAgentNames().join(\", \")}`);\n }\n }\n return pair as [AgentName, AgentName];\n}\n","import { getAgent, isValidAgentName } from \"./agents/registry.js\";\n\ninterface Message {\n role: string;\n content: string;\n error?: boolean;\n}\n\nexport function formatAsMarkdown(messages: Message[]): string {\n const parts: string[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") continue;\n\n if (msg.role === \"user\") {\n parts.push(`**You:** ${msg.content}`);\n } else if (isValidAgentName(msg.role)) {\n const name = getAgent(msg.role).displayName;\n if (msg.error) {\n parts.push(`**${name}:** *(error)*\\n\\n${msg.content}`);\n } else {\n parts.push(`**${name}:**\\n\\n${msg.content}`);\n }\n }\n }\n\n return parts.join(\"\\n\\n---\\n\\n\") + \"\\n\";\n}\n","import { execSync } from \"node:child_process\";\n\nexport function copyToClipboard(text: string): void {\n const platform = process.platform;\n\n let cmd: string;\n if (platform === \"darwin\") {\n cmd = \"pbcopy\";\n } else if (platform === \"win32\") {\n cmd = \"clip\";\n } else {\n // Linux — try xclip first, fall back to xsel\n let hasXclip = false;\n let hasXsel = false;\n try {\n execSync(\"which xclip\", { stdio: \"ignore\" });\n hasXclip = true;\n } catch {}\n if (!hasXclip) {\n try {\n execSync(\"which xsel\", { stdio: \"ignore\" });\n hasXsel = true;\n } catch {}\n }\n\n if (hasXclip) {\n cmd = \"xclip -selection clipboard\";\n } else if (hasXsel) {\n cmd = \"xsel --clipboard --input\";\n } else {\n throw new Error(\n \"Clipboard requires xclip or xsel. Install one with: sudo apt install xclip\"\n );\n }\n }\n\n try {\n execSync(cmd, { input: text, stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n } catch {\n throw new Error(\n `Failed to copy to clipboard using \"${cmd.split(\" \")[0]}\". Check that it is installed and working.`\n );\n }\n}\n","import { execSync } from \"node:child_process\";\n\nexport function createGist(content: string, filename: string): string {\n // Check gh is installed and authenticated\n try {\n execSync(\"gh auth status\", { stdio: \"ignore\" });\n } catch {\n // Distinguish between not installed and not authenticated\n try {\n execSync(\"which gh\", { stdio: \"ignore\" });\n } catch {\n throw new Error(\n \"gh CLI not found. Install it from https://cli.github.com\"\n );\n }\n throw new Error(\n \"gh CLI is not authenticated. Run: gh auth login\"\n );\n }\n\n try {\n const result = execSync(\n `gh gist create --filename \"${filename}\" -`,\n { input: content, stdio: [\"pipe\", \"pipe\", \"pipe\"], encoding: \"utf-8\" }\n );\n return result.trim();\n } catch (e: any) {\n const stderr = e.stderr?.toString().trim();\n throw new Error(stderr || \"Failed to create gist.\");\n }\n}\n","import Database from \"better-sqlite3\";\nimport { join } from \"node:path\";\nimport { getConfigDir, ensureConfigDir } from \"../config.js\";\n\nlet db: Database.Database | null = null;\n\nexport function getDbPath(): string {\n return join(getConfigDir(), \"tagteam.db\");\n}\n\nexport function getDb(): Database.Database {\n if (db) return db;\n\n ensureConfigDir();\n db = new Database(getDbPath());\n db.pragma(\"journal_mode = WAL\");\n db.pragma(\"foreign_keys = ON\");\n\n initSchema(db);\n return db;\n}\n\nfunction initSchema(db: Database.Database): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n title TEXT,\n working_dir TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n status TEXT NOT NULL DEFAULT 'active'\n );\n\n CREATE TABLE IF NOT EXISTS messages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL REFERENCES sessions(id),\n role TEXT NOT NULL,\n content TEXT NOT NULL,\n round INTEGER NOT NULL DEFAULT 0,\n duration_ms INTEGER,\n metadata TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id, id);\n `);\n}\n\nexport function closeDb(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n","import { getDb } from \"./index.js\";\n\nexport interface Session {\n id: string;\n title: string | null;\n working_dir: string;\n created_at: string;\n updated_at: string;\n status: string;\n}\n\nexport function createSession(\n id: string,\n workingDir: string\n): Session {\n const db = getDb();\n db.prepare(\n `INSERT INTO sessions (id, working_dir) VALUES (?, ?)`\n ).run(id, workingDir);\n\n return getSession(id)!;\n}\n\nexport function getSession(id: string): Session | undefined {\n const db = getDb();\n return db.prepare(`SELECT * FROM sessions WHERE id = ?`).get(id) as\n | Session\n | undefined;\n}\n\nexport function getSessionByPrefix(prefix: string): Session | undefined {\n const db = getDb();\n return db\n .prepare(`SELECT * FROM sessions WHERE id LIKE ? ORDER BY updated_at DESC LIMIT 1`)\n .get(`${prefix}%`) as Session | undefined;\n}\n\nexport function getMostRecentSession(): Session | undefined {\n const db = getDb();\n return db\n .prepare(\n `SELECT * FROM sessions WHERE status = 'active' ORDER BY updated_at DESC LIMIT 1`\n )\n .get() as Session | undefined;\n}\n\nexport function listSessions(limit = 20): Session[] {\n const db = getDb();\n return db\n .prepare(`SELECT * FROM sessions ORDER BY updated_at DESC LIMIT ?`)\n .all(limit) as Session[];\n}\n\nexport function updateSessionTitle(id: string, title: string): void {\n const db = getDb();\n db.prepare(\n `UPDATE sessions SET title = ?, updated_at = datetime('now') WHERE id = ?`\n ).run(title, id);\n}\n\nexport function touchSession(id: string): void {\n const db = getDb();\n db.prepare(`UPDATE sessions SET updated_at = datetime('now') WHERE id = ?`).run(\n id\n );\n}\n\nexport function deleteSession(id: string): void {\n const db = getDb();\n db.prepare(`DELETE FROM messages WHERE session_id = ?`).run(id);\n db.prepare(`DELETE FROM sessions WHERE id = ?`).run(id);\n}\n\nexport function deleteAllSessions(): void {\n const db = getDb();\n db.prepare(`DELETE FROM messages`).run();\n db.prepare(`DELETE FROM sessions`).run();\n}\n","import { getDb } from \"./index.js\";\n\nexport interface Message {\n id: number;\n session_id: string;\n role: string;\n content: string;\n round: number;\n duration_ms: number | null;\n metadata: string | null;\n created_at: string;\n}\n\nexport function insertMessage(params: {\n sessionId: string;\n role: string;\n content: string;\n round: number;\n durationMs?: number;\n metadata?: Record<string, unknown>;\n}): Message {\n const db = getDb();\n const result = db\n .prepare(\n `INSERT INTO messages (session_id, role, content, round, duration_ms, metadata)\n VALUES (?, ?, ?, ?, ?, ?)`\n )\n .run(\n params.sessionId,\n params.role,\n params.content,\n params.round,\n params.durationMs ?? null,\n params.metadata ? JSON.stringify(params.metadata) : null\n );\n\n return db\n .prepare(`SELECT * FROM messages WHERE id = ?`)\n .get(result.lastInsertRowid) as Message;\n}\n\nexport function getMessages(sessionId: string): Message[] {\n const db = getDb();\n return db\n .prepare(`SELECT * FROM messages WHERE session_id = ? ORDER BY id`)\n .all(sessionId) as Message[];\n}\n\nexport function deleteMessagesFromRound(\n sessionId: string,\n fromRound: number\n): void {\n const db = getDb();\n db.prepare(\n `DELETE FROM messages WHERE session_id = ? AND round >= ?`\n ).run(sessionId, fromRound);\n}","import type { AgentName } from \"./agents/types.js\";\nimport { getAgent, getAgentProfile, getPeerRoleDescription, isValidAgentName } from \"./agents/registry.js\";\n\nexport const CONSENSUS_MARKER = \"[CONSENSUS]\";\n\nexport function formatConversationHistory(\n messages: Array<{ role: string; agent?: AgentName; content: string }>\n): string {\n return messages\n .map((m) => {\n let label: string;\n if (m.role === \"user\") {\n label = \"User\";\n } else if (isValidAgentName(m.role)) {\n label = getAgent(m.role).displayName;\n } else if (m.agent && isValidAgentName(m.agent)) {\n label = getAgent(m.agent).displayName;\n } else {\n label = m.role;\n }\n return `[${label}]: ${m.content}`;\n })\n .join(\"\\n\\n\");\n}\n\n// --- Base prompt: anti-sycophancy rules, applies to all modes ---\n\nexport function basePrompt(): string {\n return `You are one of two expert coding agents in a structured technical discussion.\nYou will independently analyze the problem, then engage in focused rounds of\ncritique and refinement with your peer.\n\nGround rules:\n- You are evaluated on the ACCURACY and QUALITY of your final position, not\n on agreement with your peer.\n- When you change your position, you MUST name the specific argument that\n changed your mind and explain why your previous reasoning was flawed.\n Changing position without this justification is not acceptable.\n- Each response must either: (a) introduce new evidence or a new argument,\n (b) identify a specific logical flaw or unsupported claim in your peer's\n reasoning, or (c) concede a point with explicit justification. Restating\n or paraphrasing existing points is not acceptable.\n- Your peer is a different AI model with different training. Their perspective\n may reveal genuine blind spots in yours — and vice versa.`;\n}\n\n// --- Role prompt: model-specific focus + peer role description ---\n\nconst ROLE_TEMPLATES: Record<AgentName, string> = {\n claude: `Your role: Architecture & Implementation Reviewer.\n\nFocus your analysis on:\n- Code structure, design patterns, and maintainability\n- Multi-file coherence — how changes ripple across the codebase\n- Production readiness — error handling, logging, edge cases in real usage\n- Proposing complete, working implementations (not just pseudocode)\n\nWhen you propose a solution, provide the actual implementation. When you\ncritique, point to specific structural issues and show what the fix looks\nlike. Your peer's role is {peerRole} — they will stress-test your proposals\nfrom a different angle.`,\n\n codex: `Your role: Correctness & Standards Reviewer.\n\nFocus your analysis on:\n- Algorithmic correctness — does the logic actually work for all inputs?\n- Edge cases and failure modes — what breaks, what's untested?\n- Standards compliance — does this follow language/framework conventions?\n- Performance characteristics — time/space complexity, benchmarks\n\nWhen you critique, provide specific test cases or inputs that demonstrate\nthe issue. When you propose alternatives, explain the correctness guarantees.\nYour peer's role is {peerRole} — they will focus on different aspects of the\nsame problem.`,\n\n gemini: `Your role: Strategic Context Analyst.\n\nFocus your analysis on:\n- Broad codebase context — how does this change fit the larger system?\n- Current ecosystem conventions — what do the docs, community, and recent\n releases recommend?\n- Upstream and downstream effects — what will this break or enable elsewhere?\n- Scope and planning — is this the right approach at the right level of\n abstraction?\n\nWhen you critique, ground your position in the broader context your peer may\nbe missing. When you propose alternatives, explain the architectural tradeoffs.\nYour peer's role is {peerRole} — they will focus on different aspects of the\nsame problem.`,\n};\n\nexport function rolePrompt(agent: AgentName, pair: [AgentName, AgentName]): string {\n const template = ROLE_TEMPLATES[agent];\n const peerRole = getPeerRoleDescription(agent, pair);\n return template.replace(\"{peerRole}\", peerRole);\n}\n\n// --- Collaboration system prompt: normal mode, round 1 ---\n\nexport function collaborationSystemPrompt(agent: AgentName, pair: [AgentName, AgentName]): string {\n return `${basePrompt()}\n\n${rolePrompt(agent, pair)}`;\n}\n\n// --- Discussion round prompt: normal mode, rounds 2+ ---\n\nexport function discussionRoundPrompt(\n agent: AgentName,\n conversationContext: string,\n pair: [AgentName, AgentName]\n): string {\n return `${basePrompt()}\n\n${rolePrompt(agent, pair)}\n\nHere is the discussion so far:\n\n${conversationContext}\n\nFor this round:\n1. What is the strongest point in your peer's response?\n2. What is the weakest point, or what claim lacks supporting evidence?\n3. Has your position changed? State one of: HELD / PARTIALLY_CHANGED / CHANGED\n — with explicit reasoning for why.\n4. If proposing code, show the specific implementation and explain tradeoffs\n versus your peer's approach.\n5. Confidence in your current position: LOW | MEDIUM | HIGH\n\nCONFIDENCE: HIGH | MEDIUM | LOW\n\nKeep it concise. Do not restate points already established.`;\n}\n\n// --- Debate system prompt: discuss mode, round 1 ---\n\nexport function debateSystemPrompt(agent: AgentName, pair: [AgentName, AgentName]): string {\n return `${basePrompt()}\n\n${rolePrompt(agent, pair)}\n\nThis is a structured discussion aimed at reaching a well-reasoned position\nthrough genuine deliberation.\n\nAdditional rules for discussion mode:\n- Structure your arguments: STATE your claim, provide EVIDENCE (code examples,\n documentation, benchmarks), explain your REASONING connecting evidence to\n claim, and note CAVEATS (when your claim doesn't hold).\n- Express confidence: end your response with CONFIDENCE: HIGH | MEDIUM | LOW\n and a one-line explanation of what would change your mind.\n- Consensus signaling: when you believe you and your peer agree on all key\n points AND your confidence is HIGH, end your response with ${CONSENSUS_MARKER} on\n its own line. Only signal consensus when:\n (a) You can state the shared position in one sentence\n (b) You have HIGH confidence\n (c) You are not just deferring — you genuinely agree with the reasoning`;\n}\n\n// --- Debate round prompt: discuss mode, rounds 2+ ---\n\nexport function debateRoundPrompt(\n agent: AgentName,\n conversationContext: string,\n pair: [AgentName, AgentName]\n): string {\n return `${debateSystemPrompt(agent, pair)}\n\n${conversationContext}\n\nFor this round:\n1. Address your peer's strongest argument directly — do you accept it? Why or\n why not?\n2. If your peer identified a flaw in your reasoning, acknowledge it explicitly\n or defend with new evidence.\n3. State your current position with EVIDENCE and REASONING.\n4. CONFIDENCE: HIGH | MEDIUM | LOW — what specific evidence would change\n your remaining position?\n5. If consensus: state the shared position in one sentence, then ${CONSENSUS_MARKER}.\n\nPOSITION: HELD | PARTIALLY_CHANGED | CHANGED`;\n}\n\n// --- Steelman prompt: discuss mode, round 2 ---\n\nexport function steelmanPrompt(): string {\n return `You and your peer appear to largely agree after Round 1. Before confirming\nconsensus, steelman the opposing view:\n\n- What is the strongest argument AGAINST your shared position?\n- What context or edge case might make a different approach better?\n- Is there a tradeoff you're both overlooking?\n\nIf after considering the counterarguments you still hold your position, explain\nwhy the counterarguments don't apply here. Then proceed with your normal round\nresponse.\n\n`;\n}\n\n// --- Direct prompt: single-agent address ---\n\nexport function directPrompt(agent: AgentName, conversationHistory: string): string {\n const profile = getAgentProfile(agent);\n const focusAreas = profile.focus.map((f) => `- ${f}`).join(\"\\n\");\n\n return `You are being addressed directly in a multi-agent session. The user wants YOUR\nspecific perspective.\n\nHere is the conversation so far:\n${conversationHistory}\n\nRespond to the user's latest message. Focus on your area of expertise:\n${focusAreas}\n\nBe concise and direct.`;\n}\n","import type { AgentName } from \"./agents/types.js\";\nimport { formatConversationHistory } from \"./prompts.js\";\n\n// --- Types ---\n\nexport type ConfidenceLevel = \"LOW\" | \"MEDIUM\" | \"HIGH\";\nexport type PositionChange = \"HELD\" | \"PARTIALLY_CHANGED\" | \"CHANGED\";\nexport type TerminationReason = \"mutual-consensus\" | \"stale-no-progress\" | \"cyclic-swap\" | \"max-rounds\";\n\nexport interface RoundAnalysis {\n agent: AgentName;\n confidence: ConfidenceLevel;\n positionChange: PositionChange;\n signaledConsensus: boolean;\n hasNovelContent: boolean;\n}\n\nexport interface DiscussionState {\n round: number;\n analyses: RoundAnalysis[][]; // per discussion round\n terminated: boolean;\n terminationReason?: TerminationReason;\n}\n\n// --- Parsing ---\n\nconst CONFIDENCE_RE = /CONFIDENCE:\\s*(HIGH|MEDIUM|LOW)/i;\nconst POSITION_RE = /POSITION:\\s*(HELD|PARTIALLY_CHANGED|CHANGED)/i;\nconst CONSENSUS_RE = /\\[CONSENSUS\\]/;\n\nexport function parseRoundAnalysis(agent: AgentName, responseText: string): RoundAnalysis {\n const confidenceMatch = responseText.match(CONFIDENCE_RE);\n const positionMatch = responseText.match(POSITION_RE);\n const signaledConsensus = CONSENSUS_RE.test(responseText);\n\n // hasNovelContent: true if the response is substantial (more than just markers/boilerplate)\n // Strip out markers and whitespace, check if meaningful content remains\n const stripped = responseText\n .replace(CONFIDENCE_RE, \"\")\n .replace(POSITION_RE, \"\")\n .replace(CONSENSUS_RE, \"\")\n .trim();\n const hasNovelContent = stripped.length > 100;\n\n return {\n agent,\n confidence: (confidenceMatch?.[1]?.toUpperCase() as ConfidenceLevel) ?? \"MEDIUM\",\n positionChange: (positionMatch?.[1]?.toUpperCase() as PositionChange) ?? \"HELD\",\n signaledConsensus,\n hasNovelContent,\n };\n}\n\n// --- Termination detection ---\n\nexport function checkTermination(\n state: DiscussionState,\n maxRounds: number\n): { terminated: boolean; reason?: TerminationReason } {\n const { round, analyses } = state;\n\n // 1. Mutual consensus: both agents signaled [CONSENSUS] AND both HIGH confidence\n if (analyses.length > 0) {\n const latest = analyses[analyses.length - 1];\n if (latest && latest.length >= 2) {\n const allConsensus = latest.every((a) => a.signaledConsensus);\n const allHigh = latest.every((a) => a.confidence === \"HIGH\");\n if (allConsensus && allHigh) {\n return { terminated: true, reason: \"mutual-consensus\" };\n }\n }\n }\n\n // 2. Stale: two consecutive rounds where both agents HELD and no novel content\n if (analyses.length >= 2) {\n const prev = analyses[analyses.length - 2];\n const curr = analyses[analyses.length - 1];\n if (prev && curr && prev.length >= 2 && curr.length >= 2) {\n const prevStale = prev.every((a) => a.positionChange === \"HELD\" && !a.hasNovelContent);\n const currStale = curr.every((a) => a.positionChange === \"HELD\" && !a.hasNovelContent);\n if (prevStale && currStale) {\n return { terminated: true, reason: \"stale-no-progress\" };\n }\n }\n }\n\n // 3. Cyclic swap: both agents CHANGED in two consecutive rounds\n if (analyses.length >= 2) {\n const prev = analyses[analyses.length - 2];\n const curr = analyses[analyses.length - 1];\n if (prev && curr && prev.length >= 2 && curr.length >= 2) {\n const prevSwap = prev.every((a) => a.positionChange === \"CHANGED\");\n const currSwap = curr.every((a) => a.positionChange === \"CHANGED\");\n if (prevSwap && currSwap) {\n return { terminated: true, reason: \"cyclic-swap\" };\n }\n }\n }\n\n // 4. Max rounds\n if (round >= maxRounds) {\n return { terminated: true, reason: \"max-rounds\" };\n }\n\n return { terminated: false };\n}\n\n// --- Termination display messages ---\n\nexport function terminationMessage(reason: TerminationReason): string {\n switch (reason) {\n case \"mutual-consensus\":\n return \"Consensus reached.\";\n case \"stale-no-progress\":\n return \"Discussion stalled — no new arguments. Showing final positions.\";\n case \"cyclic-swap\":\n return \"Agents are trading positions. Showing both perspectives.\";\n case \"max-rounds\":\n return \"Maximum rounds reached. Showing final positions.\";\n }\n}\n\n// --- Steelman injection decision ---\n\nexport function shouldInjectSteelman(state: DiscussionState): boolean {\n // Always inject steelman prompt in round 2 (after round 1 completes)\n return state.round === 1 && state.analyses.length === 1;\n}\n\n// --- Context building ---\n\nexport function buildConversationContext(\n allMessages: Array<{ role: string; agent?: AgentName; content: string }>,\n analyses: RoundAnalysis[][],\n currentRound: number,\n _pair: [AgentName, AgentName]\n): string {\n // Rounds 1-2: full history\n if (currentRound <= 2) {\n return formatConversationHistory(allMessages);\n }\n\n // Round 3+: structured summary of earlier rounds + full text of latest round\n const summaryParts: string[] = [];\n\n // Summarize earlier rounds from analyses\n for (let i = 0; i < analyses.length - 1; i++) {\n const roundAnalyses = analyses[i];\n if (!roundAnalyses) continue;\n const roundSummary = roundAnalyses.map((a) => {\n return `${a.agent}: confidence=${a.confidence}, position=${a.positionChange}${a.signaledConsensus ? \", signaled consensus\" : \"\"}`;\n }).join(\"; \");\n summaryParts.push(`Round ${i + 1}: ${roundSummary}`);\n }\n\n // Get messages from the latest round only (last 2-3 messages: possibly user + 2 agents)\n // Find the boundary: messages for the latest discussion round\n const latestMessages = allMessages.slice(-3);\n\n const summary = summaryParts.length > 0\n ? `Previous rounds summary:\\n${summaryParts.join(\"\\n\")}\\n\\nLatest exchange:\\n${formatConversationHistory(latestMessages)}`\n : formatConversationHistory(allMessages);\n\n return summary;\n}\n\n// --- Metadata conversion ---\n\nexport function analysisToMetadata(analysis: RoundAnalysis): Record<string, unknown> {\n return {\n confidence: analysis.confidence,\n positionChange: analysis.positionChange,\n signaledConsensus: analysis.signaledConsensus,\n hasNovelContent: analysis.hasNovelContent,\n };\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport type { AgentName } from \"./agents/types.js\";\nimport { getAgent } from \"./agents/registry.js\";\n\nconst FAST_MODELS: Record<AgentName, string> = {\n claude: \"haiku\",\n gemini: \"gemini-2.0-flash\",\n codex: \"gpt-5.3-codex\",\n};\n\nexport interface ExpandResult {\n original: string;\n expanded: string;\n}\n\nfunction gatherProjectContext(cwd: string): string {\n const parts: string[] = [];\n\n try {\n const pkgPath = join(cwd, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const info: string[] = [];\n if (pkg.name) info.push(`name: ${pkg.name}`);\n if (pkg.description) info.push(`description: ${pkg.description}`);\n const deps = [\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.devDependencies ?? {}),\n ].slice(0, 15);\n if (deps.length > 0) info.push(`dependencies: ${deps.join(\", \")}`);\n if (info.length > 0) parts.push(`Project: ${info.join(\"; \")}`);\n }\n } catch {}\n\n try {\n const readmePath = join(cwd, \"README.md\");\n if (existsSync(readmePath)) {\n const readme = readFileSync(readmePath, \"utf-8\").slice(0, 500);\n parts.push(`README excerpt:\\n${readme}`);\n }\n } catch {}\n\n try {\n const recentFiles = execSync(\n \"git diff --name-only HEAD~5 2>/dev/null || ls -t | head -20\",\n { cwd, encoding: \"utf-8\", timeout: 3000 },\n ).trim();\n if (recentFiles) parts.push(`Recently changed files:\\n${recentFiles}`);\n } catch {}\n\n return parts.join(\"\\n\\n\");\n}\n\nconst EXPANSION_SYSTEM_PROMPT = `You are a prompt expansion assistant for a multi-agent coding tool. Your job is to rewrite terse user prompts into specific, actionable versions.\n\nRules:\n- Preserve the user's intent exactly — do not add requirements they didn't ask for\n- Make implicit context explicit using the project information provided\n- Keep the expanded prompt to 2-4 sentences\n- Output ONLY the expanded prompt, no preamble or explanation`;\n\nexport async function expandPrompt(\n prompt: string,\n agent: AgentName,\n cwd: string,\n signal?: AbortSignal,\n): Promise<ExpandResult> {\n try {\n const context = gatherProjectContext(cwd);\n const systemPrompt = context\n ? `${EXPANSION_SYSTEM_PROMPT}\\n\\nProject context:\\n${context}`\n : EXPANSION_SYSTEM_PROMPT;\n\n const descriptor = getAgent(agent);\n const response = await descriptor.run({\n prompt: `Expand this prompt:\\n\\n${prompt}`,\n systemPrompt,\n model: FAST_MODELS[agent],\n cwd,\n signal,\n });\n\n const expanded = response.text?.trim();\n if (!expanded) return { original: prompt, expanded: prompt };\n\n return { original: prompt, expanded };\n } catch {\n return { original: prompt, expanded: prompt };\n }\n}\n","import React, { useState } from \"react\";\nimport { render, Box, Text, useApp, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport { loadConfig, setConfigValue } from \"./config.js\";\nimport type { TagTeamConfig } from \"./config.js\";\nimport { validateAgentPair } from \"./agents/registry.js\";\n\ninterface ConfigField {\n key: string;\n label: string;\n get: (c: TagTeamConfig) => string;\n type: \"string\" | \"number\";\n validate?: (value: string) => string | null;\n}\n\nconst CONFIG_FIELDS: ConfigField[] = [\n {\n key: \"agents\",\n label: \"Agent pair\",\n get: (c) => c.agents.join(\", \"),\n type: \"string\",\n validate: (value) => {\n try {\n const names = value.split(\",\").map((s) => s.trim());\n validateAgentPair(names);\n return null;\n } catch (e: any) {\n return e.message;\n }\n },\n },\n {\n key: \"claude.model\",\n label: \"Claude model\",\n get: (c) => c.claude.model,\n type: \"string\",\n },\n {\n key: \"codex.model\",\n label: \"Codex model\",\n get: (c) => c.codex.model,\n type: \"string\",\n },\n {\n key: \"gemini.model\",\n label: \"Gemini model\",\n get: (c) => c.gemini.model,\n type: \"string\",\n },\n {\n key: \"discussion.max_rounds\",\n label: \"Discussion max rounds\",\n get: (c) => String(c.discussion.max_rounds),\n type: \"number\",\n },\n {\n key: \"expansion.enabled\",\n label: \"Prompt expansion\",\n get: (c) => String(c.expansion.enabled),\n type: \"string\",\n validate: (v) => (v !== \"true\" && v !== \"false\") ? \"Must be 'true' or 'false'\" : null,\n },\n];\n\nconst LABEL_WIDTH = Math.max(...CONFIG_FIELDS.map((f) => f.label.length));\n\ntype EditMode = \"select\" | \"edit\";\n\ninterface InlineConfigEditorProps {\n isActive: boolean;\n onClose: () => void;\n}\n\nexport function InlineConfigEditor({ isActive, onClose }: InlineConfigEditorProps) {\n const [config, setConfig] = useState(() => loadConfig());\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [mode, setMode] = useState<EditMode>(\"select\");\n const [editValue, setEditValue] = useState(\"\");\n const [savedMessage, setSavedMessage] = useState<string | null>(null);\n\n useInput(\n (input, key) => {\n if (key.upArrow) {\n setSavedMessage(null);\n setSelectedIndex((i) => (i > 0 ? i - 1 : CONFIG_FIELDS.length - 1));\n } else if (key.downArrow) {\n setSavedMessage(null);\n setSelectedIndex((i) => (i < CONFIG_FIELDS.length - 1 ? i + 1 : 0));\n } else if (key.return) {\n const field = CONFIG_FIELDS[selectedIndex];\n setEditValue(field.get(config));\n setSavedMessage(null);\n setMode(\"edit\");\n } else if (key.escape || input === \"q\") {\n onClose();\n }\n },\n { isActive: isActive && mode === \"select\" }\n );\n\n useInput(\n (_input, key) => {\n if (key.escape) {\n setMode(\"select\");\n }\n },\n { isActive: isActive && mode === \"edit\" }\n );\n\n const handleEditSubmit = (value: string) => {\n const field = CONFIG_FIELDS[selectedIndex];\n\n if (field.type === \"number\") {\n const n = Number(value);\n if (!Number.isInteger(n) || n < 1) {\n setSavedMessage(\"Error: must be a positive integer\");\n setMode(\"select\");\n return;\n }\n }\n\n if (field.validate) {\n const error = field.validate(value);\n if (error) {\n setSavedMessage(`Error: ${error}`);\n setMode(\"select\");\n return;\n }\n }\n\n try {\n const updated = setConfigValue(field.key, value);\n setConfig(updated);\n setSavedMessage(`Saved ${field.key} = ${value}`);\n } catch (e: any) {\n setSavedMessage(`Error: ${e.message}`);\n }\n\n setMode(\"select\");\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Configuration</Text>\n <Text dimColor> ── edit values inline</Text>\n </Box>\n\n {CONFIG_FIELDS.map((field, i) => {\n const selected = i === selectedIndex;\n const pointer = selected ? \"> \" : \" \";\n const currentValue = field.get(config);\n\n return (\n <Box key={field.key} marginLeft={1}>\n <Text color={selected ? \"cyan\" : undefined} bold={selected}>\n {pointer}\n {field.label.padEnd(LABEL_WIDTH)}\n </Text>\n <Text dimColor> = </Text>\n {mode === \"edit\" && selected ? (\n <TextInput\n value={editValue}\n onChange={setEditValue}\n onSubmit={handleEditSubmit}\n showCursor\n />\n ) : (\n <Text color=\"white\">{currentValue}</Text>\n )}\n </Box>\n );\n })}\n\n {savedMessage && (\n <Box marginTop={1} marginLeft={1}>\n <Text color={savedMessage.startsWith(\"Error\") ? \"red\" : \"green\"}>\n {savedMessage}\n </Text>\n </Box>\n )}\n\n <Box marginTop={1} marginLeft={1}>\n <Text dimColor>\n {mode === \"edit\"\n ? \"Enter save Esc cancel\"\n : \"↑↓ navigate Enter edit Esc/q quit\"}\n </Text>\n </Box>\n </Box>\n );\n}\n\n// Standalone entrypoint for `tagteam config edit`\nfunction StandaloneConfigEditor() {\n const { exit } = useApp();\n return <InlineConfigEditor isActive={true} onClose={exit} />;\n}\n\nexport function startConfigEditor() {\n return render(<StandaloneConfigEditor />);\n}\n"],"mappings":"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","names":["execSync","React","useState","render","Box","Text","useApp","useInput","TextInput","spawn","createInterface","spawn","execSync","join","join","db","db","db","readFileSync","existsSync","execSync","join","join","existsSync","readFileSync","execSync","jsx","jsxs","adHoc","Text","React","AgentResponseBlock","Box","UserMessage","ExpandedPromptBlock","useState","TextInput","showTranscript","useApp","useInput","render","execSync","session","dbMessages","transcript","instance"]}
|