coterie 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/dist/adapters/base.d.ts +56 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +176 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claudeCode.d.ts +11 -0
- package/dist/adapters/claudeCode.d.ts.map +1 -0
- package/dist/adapters/claudeCode.js +65 -0
- package/dist/adapters/claudeCode.js.map +1 -0
- package/dist/adapters/codex.d.ts +10 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +51 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/cursor.d.ts +16 -0
- package/dist/adapters/cursor.d.ts.map +1 -0
- package/dist/adapters/cursor.js +47 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/fake.d.ts +19 -0
- package/dist/adapters/fake.d.ts.map +1 -0
- package/dist/adapters/fake.js +41 -0
- package/dist/adapters/fake.js.map +1 -0
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +11 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/stream.d.ts +6 -0
- package/dist/adapters/stream.d.ts.map +1 -0
- package/dist/adapters/stream.js +20 -0
- package/dist/adapters/stream.js.map +1 -0
- package/dist/chat/configs.d.ts +18 -0
- package/dist/chat/configs.d.ts.map +1 -0
- package/dist/chat/configs.js +71 -0
- package/dist/chat/configs.js.map +1 -0
- package/dist/chat/doctor.d.ts +16 -0
- package/dist/chat/doctor.d.ts.map +1 -0
- package/dist/chat/doctor.js +43 -0
- package/dist/chat/doctor.js.map +1 -0
- package/dist/chat/finalizer.d.ts +25 -0
- package/dist/chat/finalizer.d.ts.map +1 -0
- package/dist/chat/finalizer.js +52 -0
- package/dist/chat/finalizer.js.map +1 -0
- package/dist/chat/preflight.d.ts +37 -0
- package/dist/chat/preflight.d.ts.map +1 -0
- package/dist/chat/preflight.js +115 -0
- package/dist/chat/preflight.js.map +1 -0
- package/dist/chat/render.d.ts +21 -0
- package/dist/chat/render.d.ts.map +1 -0
- package/dist/chat/render.js +113 -0
- package/dist/chat/render.js.map +1 -0
- package/dist/chat/repl.d.ts +9 -0
- package/dist/chat/repl.d.ts.map +1 -0
- package/dist/chat/repl.js +275 -0
- package/dist/chat/repl.js.map +1 -0
- package/dist/chat/trace.d.ts +29 -0
- package/dist/chat/trace.d.ts.map +1 -0
- package/dist/chat/trace.js +132 -0
- package/dist/chat/trace.js.map +1 -0
- package/dist/chat/transcript.d.ts +15 -0
- package/dist/chat/transcript.d.ts.map +1 -0
- package/dist/chat/transcript.js +39 -0
- package/dist/chat/transcript.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +134 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +52 -0
- package/dist/config.js.map +1 -0
- package/dist/core/annotation.d.ts +22 -0
- package/dist/core/annotation.d.ts.map +1 -0
- package/dist/core/annotation.js +45 -0
- package/dist/core/annotation.js.map +1 -0
- package/dist/core/compile.d.ts +3 -0
- package/dist/core/compile.d.ts.map +1 -0
- package/dist/core/compile.js +9 -0
- package/dist/core/compile.js.map +1 -0
- package/dist/core/executor.d.ts +32 -0
- package/dist/core/executor.d.ts.map +1 -0
- package/dist/core/executor.js +73 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/json.d.ts +9 -0
- package/dist/core/json.d.ts.map +1 -0
- package/dist/core/json.js +49 -0
- package/dist/core/json.js.map +1 -0
- package/dist/core/llm/base.d.ts +9 -0
- package/dist/core/llm/base.d.ts.map +1 -0
- package/dist/core/llm/base.js +3 -0
- package/dist/core/llm/base.js.map +1 -0
- package/dist/core/llm/build.d.ts +16 -0
- package/dist/core/llm/build.d.ts.map +1 -0
- package/dist/core/llm/build.js +34 -0
- package/dist/core/llm/build.js.map +1 -0
- package/dist/core/llm/claudeCli.d.ts +20 -0
- package/dist/core/llm/claudeCli.d.ts.map +1 -0
- package/dist/core/llm/claudeCli.js +57 -0
- package/dist/core/llm/claudeCli.js.map +1 -0
- package/dist/core/llm/codexCli.d.ts +13 -0
- package/dist/core/llm/codexCli.d.ts.map +1 -0
- package/dist/core/llm/codexCli.js +30 -0
- package/dist/core/llm/codexCli.js.map +1 -0
- package/dist/core/llm/cursorCli.d.ts +13 -0
- package/dist/core/llm/cursorCli.d.ts.map +1 -0
- package/dist/core/llm/cursorCli.js +27 -0
- package/dist/core/llm/cursorCli.js.map +1 -0
- package/dist/core/llm/index.d.ts +5 -0
- package/dist/core/llm/index.d.ts.map +1 -0
- package/dist/core/llm/index.js +4 -0
- package/dist/core/llm/index.js.map +1 -0
- package/dist/core/llm/scripted.d.ts +16 -0
- package/dist/core/llm/scripted.d.ts.map +1 -0
- package/dist/core/llm/scripted.js +29 -0
- package/dist/core/llm/scripted.js.map +1 -0
- package/dist/core/progress.d.ts +29 -0
- package/dist/core/progress.d.ts.map +1 -0
- package/dist/core/progress.js +22 -0
- package/dist/core/progress.js.map +1 -0
- package/dist/core/registry.d.ts +29 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +63 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/spawn.d.ts +19 -0
- package/dist/core/spawn.d.ts.map +1 -0
- package/dist/core/spawn.js +58 -0
- package/dist/core/spawn.js.map +1 -0
- package/dist/core/state.d.ts +58 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +3 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/timeout.d.ts +13 -0
- package/dist/core/timeout.d.ts.map +1 -0
- package/dist/core/timeout.js +33 -0
- package/dist/core/timeout.js.map +1 -0
- package/dist/core/types.d.ts +15 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validate.d.ts +7 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +47 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/graph.d.ts +4 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +14 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/modes/adversarial.d.ts +3 -0
- package/dist/modes/adversarial.d.ts.map +1 -0
- package/dist/modes/adversarial.js +42 -0
- package/dist/modes/adversarial.js.map +1 -0
- package/dist/modes/consensus.d.ts +3 -0
- package/dist/modes/consensus.d.ts.map +1 -0
- package/dist/modes/consensus.js +47 -0
- package/dist/modes/consensus.js.map +1 -0
- package/dist/modes/debate.d.ts +3 -0
- package/dist/modes/debate.d.ts.map +1 -0
- package/dist/modes/debate.js +76 -0
- package/dist/modes/debate.js.map +1 -0
- package/dist/modes/index.d.ts +7 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +7 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/single.d.ts +3 -0
- package/dist/modes/single.d.ts.map +1 -0
- package/dist/modes/single.js +42 -0
- package/dist/modes/single.js.map +1 -0
- package/dist/modes/tournament.d.ts +3 -0
- package/dist/modes/tournament.d.ts.map +1 -0
- package/dist/modes/tournament.js +48 -0
- package/dist/modes/tournament.js.map +1 -0
- package/dist/nodes/agentRunner.d.ts +15 -0
- package/dist/nodes/agentRunner.d.ts.map +1 -0
- package/dist/nodes/agentRunner.js +106 -0
- package/dist/nodes/agentRunner.js.map +1 -0
- package/dist/nodes/auditor.d.ts +38 -0
- package/dist/nodes/auditor.d.ts.map +1 -0
- package/dist/nodes/auditor.js +179 -0
- package/dist/nodes/auditor.js.map +1 -0
- package/dist/nodes/bracket.d.ts +19 -0
- package/dist/nodes/bracket.d.ts.map +1 -0
- package/dist/nodes/bracket.js +90 -0
- package/dist/nodes/bracket.js.map +1 -0
- package/dist/nodes/consensusEngine.d.ts +18 -0
- package/dist/nodes/consensusEngine.d.ts.map +1 -0
- package/dist/nodes/consensusEngine.js +94 -0
- package/dist/nodes/consensusEngine.js.map +1 -0
- package/dist/nodes/moderator.d.ts +20 -0
- package/dist/nodes/moderator.d.ts.map +1 -0
- package/dist/nodes/moderator.js +83 -0
- package/dist/nodes/moderator.js.map +1 -0
- package/dist/nodes/planner.d.ts +17 -0
- package/dist/nodes/planner.d.ts.map +1 -0
- package/dist/nodes/planner.js +40 -0
- package/dist/nodes/planner.js.map +1 -0
- package/dist/nodes/supervisor.d.ts +28 -0
- package/dist/nodes/supervisor.d.ts.map +1 -0
- package/dist/nodes/supervisor.js +75 -0
- package/dist/nodes/supervisor.js.map +1 -0
- package/package.json +66 -0
- package/schemas/coterie.config.schema.json +204 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/** Human-readable rendering of a coordination round. Agents emit JSON (findings,
|
|
2
|
+
* verdicts) and prose; this module turns that into something a person reads.
|
|
3
|
+
* Nothing here ever surfaces raw JSON to the user. */
|
|
4
|
+
/** If `stdout` is a JSON findings array (possibly fenced), return it (maybe
|
|
5
|
+
* empty); otherwise null. Distinguishes "structured findings" from prose, which
|
|
6
|
+
* `parseFindings` in the auditor can't (it returns `[]` for both). */
|
|
7
|
+
function asFindingsArray(stdout) {
|
|
8
|
+
let s = stdout.trim();
|
|
9
|
+
if (s.startsWith("```")) {
|
|
10
|
+
const lines = s.split("\n");
|
|
11
|
+
const last = lines[lines.length - 1];
|
|
12
|
+
s = (last && last.startsWith("```") ? lines.slice(1, -1) : lines.slice(1)).join("\n").trim();
|
|
13
|
+
}
|
|
14
|
+
if (!s.startsWith("["))
|
|
15
|
+
return null;
|
|
16
|
+
try {
|
|
17
|
+
const data = JSON.parse(s);
|
|
18
|
+
return Array.isArray(data) ? data : null;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function capLines(text, maxChars) {
|
|
25
|
+
const t = text.trim();
|
|
26
|
+
if (t.length <= maxChars)
|
|
27
|
+
return t;
|
|
28
|
+
return t.slice(0, maxChars).trimEnd() + " …";
|
|
29
|
+
}
|
|
30
|
+
/** Did this agent run fail? A non-zero exit always counts. An exit-0 run with no
|
|
31
|
+
* stdout but error-looking stderr (auth/rate-limit/crash the CLI reported but
|
|
32
|
+
* didn't exit on) counts too — but a benign warning on stderr with no stdout
|
|
33
|
+
* (e.g. a deprecation notice from an agent that only edited files) does not. */
|
|
34
|
+
const STDERR_ERROR_RE = /error|fail|denied|unauthor|not logged in|rate.?limit|expired|invalid|quota|ENOENT|timed? ?out/i;
|
|
35
|
+
export function runFailed(run) {
|
|
36
|
+
if (run.exit_code !== 0)
|
|
37
|
+
return true;
|
|
38
|
+
if (!run.stdout.trim() && run.stderr.trim())
|
|
39
|
+
return STDERR_ERROR_RE.test(run.stderr);
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
/** A one-line, human-readable description of a failed run. */
|
|
43
|
+
export function renderFailure(run) {
|
|
44
|
+
const exit = run.exit_code !== 0 ? ` (exit ${run.exit_code})` : "";
|
|
45
|
+
const detail = (run.stderr || run.stdout || "").trim().split("\n")[0] ?? "";
|
|
46
|
+
return `failed${exit}${detail ? `: ${detail.slice(0, 200)}` : ""}`;
|
|
47
|
+
}
|
|
48
|
+
const RATE_LIMIT_RE = /rate.?limit|quota|usage limit|too many requests|\b429\b|resets? (?:at|in)|try again (?:later|in)|exhausted/i;
|
|
49
|
+
const AUTH_RE = /not logged in|unauthor|authentication|please (?:sign|log) ?in|login required|subscription|expired|invalid (?:api )?key|\b401\b|\b403\b/i;
|
|
50
|
+
/** Classify *why* a run failed so the session can adapt: drop a rate-limited or
|
|
51
|
+
* signed-out agent when others remain, or bubble up when/whether it'll recover. */
|
|
52
|
+
export function classifyFailure(run) {
|
|
53
|
+
if (!runFailed(run))
|
|
54
|
+
return { kind: null, detail: "" };
|
|
55
|
+
const text = `${run.stderr}\n${run.stdout}`.trim();
|
|
56
|
+
const firstLine = text.split("\n").find((l) => l.trim())?.trim().slice(0, 200) ?? "";
|
|
57
|
+
// Surface a recovery hint if the CLI gave one.
|
|
58
|
+
const when = text.match(/(?:resets?|try again|retry)[^.\n]*?(?:at|in)\s+[^.\n]{1,40}/i)?.[0];
|
|
59
|
+
const detail = when ? `${firstLine}${firstLine.includes(when) ? "" : ` — ${when}`}` : firstLine;
|
|
60
|
+
if (RATE_LIMIT_RE.test(text))
|
|
61
|
+
return { kind: "rate-limit", detail };
|
|
62
|
+
if (AUTH_RE.test(text))
|
|
63
|
+
return { kind: "auth", detail };
|
|
64
|
+
return { kind: null, detail };
|
|
65
|
+
}
|
|
66
|
+
/** Render one agent's contribution as readable lines (no raw JSON). */
|
|
67
|
+
export function renderContribution(run, maxChars = 1200) {
|
|
68
|
+
const findings = asFindingsArray(run.stdout);
|
|
69
|
+
if (findings !== null) {
|
|
70
|
+
if (findings.length === 0)
|
|
71
|
+
return "no defects reported";
|
|
72
|
+
return findings
|
|
73
|
+
.filter((f) => f && typeof f === "object" && typeof f.description === "string")
|
|
74
|
+
.map((f) => `• [${f.severity ?? "?"}] ${f.category ?? "finding"}: ${f.description}`)
|
|
75
|
+
.join("\n");
|
|
76
|
+
}
|
|
77
|
+
const text = (run.stdout ?? "").trim();
|
|
78
|
+
return text ? capLines(text, maxChars) : "(no output)";
|
|
79
|
+
}
|
|
80
|
+
/** A compact, readable digest of the deliberation, handed to the finalizer agent
|
|
81
|
+
* as advice. Built generically from runs + verdicts + mode-specific summaries. */
|
|
82
|
+
export function digestRound(final) {
|
|
83
|
+
const runs = final.runs ?? [];
|
|
84
|
+
const parts = [];
|
|
85
|
+
for (const run of runs) {
|
|
86
|
+
parts.push(`### ${run.role} — ${run.agent_id}\n${renderContribution(run, 1500)}`);
|
|
87
|
+
}
|
|
88
|
+
const verdicts = (final.judge_history ?? [])
|
|
89
|
+
.map((j) => `- ${j.winner}${j.reason ? `: ${j.reason}` : ""}`)
|
|
90
|
+
.filter(Boolean);
|
|
91
|
+
if (verdicts.length)
|
|
92
|
+
parts.push(`### verdicts\n${verdicts.join("\n")}`);
|
|
93
|
+
const consensus = (final.mode_state?.consensus_findings ?? []);
|
|
94
|
+
if (consensus.length) {
|
|
95
|
+
const lines = consensus.map((c) => {
|
|
96
|
+
// Denominator is the participant total, not the supporter count (which
|
|
97
|
+
// would always read "N/N"). Fall back to deriving it from the ratio.
|
|
98
|
+
const total = c.participant_count ??
|
|
99
|
+
(c.agreement_ratio ? Math.round(c.agreement_count / c.agreement_ratio) : c.agreement_count);
|
|
100
|
+
return `- [${c.label}] [${c.severity}] ${c.description} (${c.agreement_count}/${total} agree)`;
|
|
101
|
+
});
|
|
102
|
+
parts.push(`### consensus findings\n${lines.join("\n")}`);
|
|
103
|
+
}
|
|
104
|
+
// Cap the assembled digest so a many-run round can't hand the finalizer an
|
|
105
|
+
// unbounded prompt (compounds the argv limit). Per-contribution caps above
|
|
106
|
+
// bound each piece; this bounds the whole.
|
|
107
|
+
const digest = parts.join("\n\n") || "(the deliberation produced no output)";
|
|
108
|
+
const MAX_DIGEST = 12_000;
|
|
109
|
+
return digest.length > MAX_DIGEST
|
|
110
|
+
? digest.slice(0, MAX_DIGEST) + "\n\n…(deliberation digest truncated)…"
|
|
111
|
+
: digest;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/chat/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** The `coterie chat` REPL: a conversational loop where each turn runs through
|
|
2
|
+
* the active coordination mode and returns the synthesized result. */
|
|
3
|
+
import type { Mode } from "../core/state.js";
|
|
4
|
+
export declare function runChat(opts: {
|
|
5
|
+
mode: Mode;
|
|
6
|
+
workdir: string;
|
|
7
|
+
quiet: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=repl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../src/chat/repl.ts"],"names":[],"mappings":"AAAA;uEACuE;AAUvE,OAAO,KAAK,EAAY,IAAI,EAAE,MAAM,kBAAkB,CAAC;AA4CvD,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4JlG"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/** The `coterie chat` REPL: a conversational loop where each turn runs through
|
|
2
|
+
* the active coordination mode and returns the synthesized result. */
|
|
3
|
+
import { setMaxListeners } from "node:events";
|
|
4
|
+
import { createInterface } from "node:readline";
|
|
5
|
+
import kleur from "kleur";
|
|
6
|
+
import { gitRepoReady, IsolatedWorktreeExecutor } from "../core/executor.js";
|
|
7
|
+
import { buildLLM, coordinationCliFor } from "../core/llm/build.js";
|
|
8
|
+
import { validateRuntimeConfig } from "../core/validate.js";
|
|
9
|
+
import { buildGraph } from "../graph.js";
|
|
10
|
+
import { defaultConfig } from "./configs.js";
|
|
11
|
+
import { formatDoctor, MIN_AGENTS, runDoctor } from "./doctor.js";
|
|
12
|
+
import { runFinalizer } from "./finalizer.js";
|
|
13
|
+
import { agentStatuses } from "./preflight.js";
|
|
14
|
+
import { classifyFailure, digestRound } from "./render.js";
|
|
15
|
+
import { rule, Trace } from "./trace.js";
|
|
16
|
+
import { Transcript } from "./transcript.js";
|
|
17
|
+
const MODES = ["single", "adversarial", "debate", "tournament", "consensus"];
|
|
18
|
+
/** Bare words (no leading slash) that mean "leave the REPL". Without this they'd
|
|
19
|
+
* be sent to the agents as a task — wasting a real (subscription) round and the
|
|
20
|
+
* user's time on the most reflexive action there is. */
|
|
21
|
+
const QUIT_WORDS = new Set(["exit", "quit", "q", ":q"]);
|
|
22
|
+
async function buildLlms(mode, cfg, cli) {
|
|
23
|
+
return {
|
|
24
|
+
supervisor_llm: mode === "single" ? await buildLLM(cfg.router?.model, cli) : null,
|
|
25
|
+
judge_llm: ["adversarial", "tournament", "debate"].includes(mode) ? await buildLLM(cfg[mode]?.judge?.model, cli) : null,
|
|
26
|
+
consensus_llm: mode === "consensus" ? await buildLLM(cfg.consensus?.engine?.model, cli) : null,
|
|
27
|
+
moderator_llm: mode === "debate" ? await buildLLM(cfg.debate?.moderator?.model, cli) : null,
|
|
28
|
+
planner_llm: cfg.planner?.enabled ? await buildLLM(cfg.planner?.model, cli) : null,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const HELP = `
|
|
32
|
+
Commands:
|
|
33
|
+
/mode <name> switch coordination mode (${MODES.join(", ")})
|
|
34
|
+
/show /hide show or hide the live agent exchanges
|
|
35
|
+
/clear forget the conversation so far
|
|
36
|
+
/help this help
|
|
37
|
+
/exit quit (or just type 'exit' / 'quit')
|
|
38
|
+
Ctrl+C cancel the current turn (press again at the prompt to quit)
|
|
39
|
+
|
|
40
|
+
Each turn the agents deliberate (review/critique/compete, in throwaway
|
|
41
|
+
workspaces), then one final agent applies the edits in your workdir and writes
|
|
42
|
+
the reply — so file edits land in every mode. The mode shapes the deliberation:
|
|
43
|
+
'single' is quickest; 'adversarial' adds an auditor/judge loop; 'debate' /
|
|
44
|
+
'tournament' / 'consensus' get more perspectives before the finalizer acts.
|
|
45
|
+
`.trim();
|
|
46
|
+
export async function runChat(opts) {
|
|
47
|
+
let mode = opts.mode;
|
|
48
|
+
// Build the session lineup from whichever agents are actually available; need
|
|
49
|
+
// at least two to coordinate. Roles within each mode are auto-assigned from it.
|
|
50
|
+
// Probe every known agent once, then derive both the ready lineup and the
|
|
51
|
+
// installed-but-signed-out ones (so we can tell the user why they're missing).
|
|
52
|
+
const statuses = agentStatuses();
|
|
53
|
+
const agents = statuses.filter((s) => s.status.ok).map((s) => s.agent);
|
|
54
|
+
const signedOut = statuses.filter((s) => s.status.reason === "not signed in");
|
|
55
|
+
if (agents.length < MIN_AGENTS) {
|
|
56
|
+
console.error(kleur.yellow(formatDoctor(runDoctor())));
|
|
57
|
+
process.exitCode = 1;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Deliberation runs in an isolated git worktree of the workdir, so it must be a
|
|
61
|
+
// git repo with a commit — otherwise every turn would error mid-flight.
|
|
62
|
+
const git = gitRepoReady(opts.workdir);
|
|
63
|
+
if (!git.ok) {
|
|
64
|
+
console.error(kleur.yellow(`Can't start: ${opts.workdir} is ${git.reason}. coterie runs each turn's deliberation in an ` +
|
|
65
|
+
"isolated git worktree, so the working directory must be a git repo with at least one commit.\n" +
|
|
66
|
+
" Fix: cd into your project and run `git init && git add -A && git commit -m init`."));
|
|
67
|
+
process.exitCode = 1;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const transcript = new Transcript();
|
|
71
|
+
const trace = new Trace(!opts.quiet);
|
|
72
|
+
trace.attach();
|
|
73
|
+
console.log(kleur.cyan().bold("▲ coterie chat"));
|
|
74
|
+
console.log(kleur.dim(` mode=${mode} · workdir=${opts.workdir} · agents: ${agents.map((a) => a.id).join(", ")} · $0 metered\n` +
|
|
75
|
+
` modes: ${MODES.join(", ")}\n` +
|
|
76
|
+
" Each turn: agents deliberate, then one finalizer applies edits + replies. /mode to change modes. /help for commands."));
|
|
77
|
+
// An agent that's installed but signed out isn't broken — it just can't join.
|
|
78
|
+
// Say so clearly (and how to fix it) instead of silently dropping it.
|
|
79
|
+
for (const s of signedOut) {
|
|
80
|
+
console.log(kleur.yellow(` ⚠ ${s.status.cli} is installed but not signed in — sitting this session out. ${s.status.fix ?? ""}`.trimEnd()));
|
|
81
|
+
}
|
|
82
|
+
// Coordination (routing / judging / merging) prefers Claude but falls back to
|
|
83
|
+
// codex/cursor, so it works without Claude. Note the coordinator if it's not
|
|
84
|
+
// Claude, so the choice is visible.
|
|
85
|
+
const coordCli = coordinationCliFor(agents.map((a) => a.id));
|
|
86
|
+
if (coordCli !== "claude") {
|
|
87
|
+
console.log(kleur.dim(` coordination: ${coordCli} (Claude not detected — using an available agent)`));
|
|
88
|
+
}
|
|
89
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
90
|
+
const setPrompt = () => rl.setPrompt(kleur.cyan(`\ncoterie(${mode})› `));
|
|
91
|
+
// Ctrl+C cancels the in-flight turn (aborting the agent subprocesses) and keeps
|
|
92
|
+
// the session alive; at the prompt with nothing running it quits.
|
|
93
|
+
let activeAbort = null;
|
|
94
|
+
// Agents that hit a hard limit / auth failure this session, with the reason.
|
|
95
|
+
// We drop them from later turns when ≥2 agents remain; otherwise we keep them
|
|
96
|
+
// and bubble up the limit info (you can't coordinate with fewer than two).
|
|
97
|
+
const sidelined = new Map();
|
|
98
|
+
rl.on("SIGINT", () => {
|
|
99
|
+
if (activeAbort && !activeAbort.signal.aborted) {
|
|
100
|
+
activeAbort.abort();
|
|
101
|
+
console.log(kleur.yellow("\n ↩ canceling this turn… (Ctrl+C again at the prompt to quit)"));
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
rl.close();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
setPrompt();
|
|
108
|
+
rl.prompt();
|
|
109
|
+
for await (const line of rl) {
|
|
110
|
+
const text = line.trim();
|
|
111
|
+
try {
|
|
112
|
+
if (!text) {
|
|
113
|
+
// no-op
|
|
114
|
+
}
|
|
115
|
+
else if (QUIT_WORDS.has(text.toLowerCase())) {
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
else if (text.startsWith("/")) {
|
|
119
|
+
const [rawCmd, ...rest] = text.slice(1).split(/\s+/);
|
|
120
|
+
const cmd = (rawCmd ?? "").toLowerCase();
|
|
121
|
+
if (cmd === "exit" || cmd === "quit" || cmd === "q")
|
|
122
|
+
break;
|
|
123
|
+
else if (cmd === "help")
|
|
124
|
+
console.log(HELP);
|
|
125
|
+
else if (cmd === "hide") {
|
|
126
|
+
trace.visible = false;
|
|
127
|
+
console.log(kleur.dim(" (trace hidden)"));
|
|
128
|
+
}
|
|
129
|
+
else if (cmd === "show") {
|
|
130
|
+
trace.visible = true;
|
|
131
|
+
console.log(kleur.dim(" (trace shown)"));
|
|
132
|
+
}
|
|
133
|
+
else if (cmd === "clear") {
|
|
134
|
+
transcript.clear();
|
|
135
|
+
console.log(kleur.dim(" (conversation cleared)"));
|
|
136
|
+
}
|
|
137
|
+
else if (cmd === "mode") {
|
|
138
|
+
const next = (rest[0] ?? "").toLowerCase();
|
|
139
|
+
if (MODES.includes(next)) {
|
|
140
|
+
mode = next;
|
|
141
|
+
setPrompt();
|
|
142
|
+
console.log(kleur.dim(` (mode → ${mode})`));
|
|
143
|
+
}
|
|
144
|
+
else
|
|
145
|
+
console.log(kleur.red(` unknown mode '${rest[0] ?? ""}'; pick one of ${MODES.join(", ")}`));
|
|
146
|
+
}
|
|
147
|
+
else
|
|
148
|
+
console.log(kleur.red(` unknown command '/${rawCmd ?? ""}' — /help`));
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// Build this turn's lineup: drop sidelined agents, but never below the
|
|
152
|
+
// two needed to coordinate.
|
|
153
|
+
let lineup = agents.filter((a) => !sidelined.has(a.id));
|
|
154
|
+
if (lineup.length < MIN_AGENTS) {
|
|
155
|
+
for (const a of agents) {
|
|
156
|
+
if (sidelined.has(a.id)) {
|
|
157
|
+
console.log(kleur.yellow(` ⚠ ${a.id} is unavailable (${sidelined.get(a.id)}) but kept — dropping it would leave fewer than ${MIN_AGENTS} agents.`));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
lineup = agents;
|
|
161
|
+
}
|
|
162
|
+
else if (lineup.length < agents.length) {
|
|
163
|
+
for (const a of agents) {
|
|
164
|
+
if (sidelined.has(a.id))
|
|
165
|
+
console.log(kleur.dim(` (sitting out ${a.id} this session — ${sidelined.get(a.id)})`));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
activeAbort = new AbortController();
|
|
169
|
+
// LangGraph attaches an abort listener per step; lift the ceiling so a
|
|
170
|
+
// multi-round turn doesn't trip Node's MaxListenersExceededWarning.
|
|
171
|
+
setMaxListeners(128, activeAbort.signal);
|
|
172
|
+
try {
|
|
173
|
+
const runs = await runTurn(text, mode, opts.workdir, lineup, transcript, trace, activeAbort.signal);
|
|
174
|
+
// Learn from failures: sideline agents that hit a limit / auth problem.
|
|
175
|
+
for (const r of runs ?? []) {
|
|
176
|
+
const c = classifyFailure(r);
|
|
177
|
+
if (c.kind && !sidelined.has(r.agent_id)) {
|
|
178
|
+
sidelined.set(r.agent_id, c.detail || c.kind);
|
|
179
|
+
console.log(kleur.yellow(` ▸ ${r.agent_id} hit a ${c.kind} issue — sitting it out for the rest of this session. ${c.detail}`.trimEnd()));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
activeAbort = null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (e) {
|
|
189
|
+
console.error(kleur.red(` error: ${e instanceof Error ? e.message : String(e)}`));
|
|
190
|
+
}
|
|
191
|
+
rl.prompt();
|
|
192
|
+
}
|
|
193
|
+
trace.detach();
|
|
194
|
+
rl.close();
|
|
195
|
+
console.log(kleur.dim("\nbye."));
|
|
196
|
+
}
|
|
197
|
+
async function runTurn(text, mode, workdir, agents, transcript, trace, signal) {
|
|
198
|
+
const cfg = defaultConfig(mode, agents);
|
|
199
|
+
validateRuntimeConfig(cfg);
|
|
200
|
+
// Coordination runs on an available agent's CLI — prefer Claude, else fall back
|
|
201
|
+
// to codex/cursor so a turn works without Claude on the machine.
|
|
202
|
+
const coordCli = coordinationCliFor(agents.map((a) => a.id));
|
|
203
|
+
const llms = await buildLlms(mode, cfg, coordCli);
|
|
204
|
+
// Deliberation never touches the real workdir — it runs in throwaway worktrees
|
|
205
|
+
// and feeds the finalizer as advice. The finalizer is the sole mutator.
|
|
206
|
+
const graph = buildGraph({ workdir, executor: new IsolatedWorktreeExecutor(), config: cfg, ...llms });
|
|
207
|
+
const task = transcript.taskFor(text);
|
|
208
|
+
const initial = {
|
|
209
|
+
task,
|
|
210
|
+
mode,
|
|
211
|
+
plan: [],
|
|
212
|
+
current_step_idx: 0,
|
|
213
|
+
runs: [],
|
|
214
|
+
artifacts: {},
|
|
215
|
+
status: "planning",
|
|
216
|
+
config: cfg,
|
|
217
|
+
spend_usd: 0,
|
|
218
|
+
route_history: [],
|
|
219
|
+
judge_history: [],
|
|
220
|
+
next_agent: null,
|
|
221
|
+
mode_state: {},
|
|
222
|
+
};
|
|
223
|
+
trace.reset();
|
|
224
|
+
if (trace.visible)
|
|
225
|
+
console.log("\n" + rule(`deliberating · ${mode}`));
|
|
226
|
+
let final = initial;
|
|
227
|
+
try {
|
|
228
|
+
// recursionLimit is a hard backstop against an unbounded loop (on top of each
|
|
229
|
+
// mode's own round cap); the modes settle in far fewer supersteps.
|
|
230
|
+
for await (const state of await graph.stream(initial, { streamMode: "values", signal, recursionLimit: 24 })) {
|
|
231
|
+
final = state;
|
|
232
|
+
trace.update(state);
|
|
233
|
+
}
|
|
234
|
+
// Don't apply edits off a deliberation that halted (budget) or is waiting on
|
|
235
|
+
// a human — the finalizer is the sole mutator, so skipping it leaves the
|
|
236
|
+
// workdir untouched.
|
|
237
|
+
if (final.status === "failed" || final.status === "awaiting_human") {
|
|
238
|
+
console.log(kleur.yellow(`\n ⚠ deliberation ended as '${final.status}' — not applying any edits this turn.`));
|
|
239
|
+
transcript.add("user", text);
|
|
240
|
+
transcript.add("assistant", `(no changes — deliberation ended as ${final.status})`);
|
|
241
|
+
return final.runs ?? [];
|
|
242
|
+
}
|
|
243
|
+
if (trace.visible)
|
|
244
|
+
console.log("\n" + rule("finalizing"));
|
|
245
|
+
// The finalizer (the judge seat) is the first available agent. Only pass a
|
|
246
|
+
// model when it's Claude Code — the judge-model aliases are Claude-specific.
|
|
247
|
+
const finalizerAdapter = agents[0].adapter;
|
|
248
|
+
const finalizerModel = finalizerAdapter === "claude-code" ? "claude-opus-4-7" : undefined;
|
|
249
|
+
const { answer, run } = await runFinalizer({
|
|
250
|
+
task,
|
|
251
|
+
digest: digestRound(final),
|
|
252
|
+
workdir,
|
|
253
|
+
adapter: finalizerAdapter,
|
|
254
|
+
model: finalizerModel,
|
|
255
|
+
signal,
|
|
256
|
+
});
|
|
257
|
+
const reply = answer || "(the finalizer produced no reply — check the workdir for edits)";
|
|
258
|
+
console.log("\n" + kleur.cyan().bold("coterie ›") + " " + reply);
|
|
259
|
+
const totalSpend = (final.spend_usd ?? 0) + (run.cost_estimate_usd ?? 0);
|
|
260
|
+
if (totalSpend)
|
|
261
|
+
console.log(kleur.dim(` (≈ $${totalSpend.toFixed(4)} subscription usage — $0 metered)`));
|
|
262
|
+
transcript.add("user", text);
|
|
263
|
+
transcript.add("assistant", reply);
|
|
264
|
+
return [...(final.runs ?? []), run];
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
if (signal.aborted || (e instanceof Error && e.name === "AbortError")) {
|
|
268
|
+
console.log(kleur.yellow("\n ↩ canceled — back to the prompt.") +
|
|
269
|
+
kleur.dim(" (Deliberation runs in a scratch copy, so your files are untouched.)"));
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
throw e;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=repl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/chat/repl.ts"],"names":[],"mappings":"AAAA;uEACuE;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EAAwB,QAAQ,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAiB,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,KAAK,GAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AAErF;;yDAEyD;AACzD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AAExD,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,GAAQ,EAAE,GAAoB;IACjE,OAAO;QACL,cAAc,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QACjF,SAAS,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QACvH,aAAa,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QAC9F,aAAa,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QAC3F,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;KACnF,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAG;;6CAEgC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;CAY5D,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAqD;IACjF,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAErB,8EAA8E;IAC9E,gFAAgF;IAChF,0EAA0E;IAC1E,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC;IAE9E,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,gFAAgF;IAChF,wEAAwE;IACxE,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CACV,gBAAgB,IAAI,CAAC,OAAO,OAAO,GAAG,CAAC,MAAM,gDAAgD;YAC3F,gGAAgG;YAChG,qFAAqF,CACxF,CACF,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,KAAK,CAAC,MAAM,EAAE,CAAC;IAEf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,UAAU,IAAI,cAAc,IAAI,CAAC,OAAO,cAAc,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB;QACvG,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAChC,wHAAwH,CAC3H,CACF,CAAC;IACF,8EAA8E;IAC9E,sEAAsE;IACtE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,+DAA+D,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,CACjH,CACF,CAAC;IACJ,CAAC;IACD,8EAA8E;IAC9E,6EAA6E;IAC7E,oCAAoC;IACpC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,QAAQ,mDAAmD,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC,CAAC;IAEzE,gFAAgF;IAChF,kEAAkE;IAClE,IAAI,WAAW,GAA2B,IAAI,CAAC;IAC/C,6EAA6E;IAC7E,8EAA8E;IAC9E,2EAA2E;IAC3E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACnB,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/C,WAAW,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iEAAiE,CAAC,CAAC,CAAC;QAC/F,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,EAAE,CAAC;IACZ,EAAE,CAAC,MAAM,EAAE,CAAC;IAEZ,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,QAAQ;YACV,CAAC;iBAAM,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC9C,MAAM;YACR,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrD,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBACzC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG;oBAAE,MAAM;qBACtD,IAAI,GAAG,KAAK,MAAM;oBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;qBACtC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;oBAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAAC,CAAC;qBAC1F,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;oBAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAAC,CAAC;qBACxF,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;oBAAC,UAAU,CAAC,KAAK,EAAE,CAAC;oBAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBAAC,CAAC;qBAChG,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBACxB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAU,CAAC;oBACnD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;wBAAC,IAAI,GAAG,IAAI,CAAC;wBAAC,SAAS,EAAE,CAAC;wBAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC,CAAC;oBAAC,CAAC;;wBAChG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,kBAAkB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpG,CAAC;;oBAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,MAAM,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;YAChF,CAAC;iBAAM,CAAC;gBACN,uEAAuE;gBACvE,4BAA4B;gBAC5B,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxD,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;oBAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;wBACvB,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;4BACxB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,OAAO,CAAC,CAAC,EAAE,oBAAoB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,mDAAmD,UAAU,UAAU,CAC1H,CACF,CAAC;wBACJ,CAAC;oBACH,CAAC;oBACD,MAAM,GAAG,MAAM,CAAC;gBAClB,CAAC;qBAAM,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;oBACzC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;wBACvB,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;4BAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,EAAE,mBAAmB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;oBACnH,CAAC;gBACH,CAAC;gBAED,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;gBACpC,uEAAuE;gBACvE,oEAAoE;gBACpE,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;oBACpG,wEAAwE;oBACxE,KAAK,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;wBAC3B,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;wBAC7B,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACzC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;4BAC9C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,OAAO,CAAC,CAAC,QAAQ,UAAU,CAAC,CAAC,IAAI,yDAAyD,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAC/G,CACF,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;wBAAS,CAAC;oBACT,WAAW,GAAG,IAAI,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrF,CAAC;QACD,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,EAAE,CAAC;IACf,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,IAAY,EACZ,IAAU,EACV,OAAe,EACf,MAAkB,EAClB,UAAsB,EACtB,KAAY,EACZ,MAAmB;IAEnB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,gFAAgF;IAChF,iEAAiE;IACjE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAClD,+EAA+E;IAC/E,wEAAwE;IACxE,MAAM,KAAK,GAAG,UAAU,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,wBAAwB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAEtG,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG;QACd,IAAI;QACJ,IAAI;QACJ,IAAI,EAAE,EAAE;QACR,gBAAgB,EAAE,CAAC;QACnB,IAAI,EAAE,EAAE;QACR,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,CAAC;QACZ,aAAa,EAAE,EAAE;QACjB,aAAa,EAAE,EAAE;QACjB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,EAAE;KACf,CAAC;IAEF,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,CAAC;IAEtE,IAAI,KAAK,GAAQ,OAAO,CAAC;IACzB,IAAI,CAAC;QACH,8EAA8E;QAC9E,mEAAmE;QACnE,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC5G,KAAK,GAAG,KAAK,CAAC;YACd,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,6EAA6E;QAC7E,yEAAyE;QACzE,qBAAqB;QACrB,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;YACnE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,gCAAgC,KAAK,CAAC,MAAM,uCAAuC,CAAC,CAClG,CAAC;YACF,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7B,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,uCAAuC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACpF,OAAO,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAC1D,2EAA2E;QAC3E,6EAA6E;QAC7E,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC;QAC5C,MAAM,cAAc,GAAG,gBAAgB,KAAK,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,YAAY,CAAC;YACzC,IAAI;YACJ,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC;YAC1B,OAAO;YACP,OAAO,EAAE,gBAAgB;YACzB,KAAK,EAAE,cAAc;YACrB,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,IAAI,iEAAiE,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;QAEjE,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC;QACzE,IAAI,UAAU;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAE1G,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7B,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;YACtE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,sCAAsC,CAAC;gBAClD,KAAK,CAAC,GAAG,CAAC,sEAAsE,CAAC,CACpF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Live, elegant trace of a coordination round. Per-agent activity is driven by
|
|
2
|
+
* the process-wide progress bus (`core/progress`): each agent emits `start` when
|
|
3
|
+
* it begins and `done` when it finishes, so the back-and-forth streams live even
|
|
4
|
+
* when a mode fans agents out concurrently (e.g. consensus). Judge verdicts come
|
|
5
|
+
* from the graph's streamed state snapshots. Everything is shown by default;
|
|
6
|
+
* `visible=false` (via `--quiet` / `/hide`) silences the commentary — but agent
|
|
7
|
+
* *failures* surface regardless, since a silent failure is worse than a noisy one. */
|
|
8
|
+
import type { JudgeDecision } from "../core/state.js";
|
|
9
|
+
/** A thin section rule, e.g. `── deliberating · consensus ──────────`. */
|
|
10
|
+
export declare function rule(label: string): string;
|
|
11
|
+
export declare class Trace {
|
|
12
|
+
visible: boolean;
|
|
13
|
+
private seenJudge;
|
|
14
|
+
private onStart?;
|
|
15
|
+
private onDone?;
|
|
16
|
+
private onStep?;
|
|
17
|
+
constructor(visible: boolean);
|
|
18
|
+
/** Subscribe to the progress bus for the lifetime of the session. The handlers
|
|
19
|
+
* read `this.visible` at emit time, so `/show` / `/hide` take effect live. */
|
|
20
|
+
attach(): void;
|
|
21
|
+
detach(): void;
|
|
22
|
+
reset(): void;
|
|
23
|
+
private renderRun;
|
|
24
|
+
/** Surface new judge verdicts from a streamed state snapshot. */
|
|
25
|
+
update(state: {
|
|
26
|
+
judge_history?: JudgeDecision[];
|
|
27
|
+
}): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/chat/trace.ts"],"names":[],"mappings":"AAAA;;;;;;uFAMuF;AAKvF,OAAO,KAAK,EAAY,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAwDhE,0EAA0E;AAC1E,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI1C;AAED,qBAAa,KAAK;IAMG,OAAO,EAAE,OAAO;IALnC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAC,CAAgC;IAChD,OAAO,CAAC,MAAM,CAAC,CAA+B;IAC9C,OAAO,CAAC,MAAM,CAAC,CAA+B;gBAE3B,OAAO,EAAE,OAAO;IAEnC;mFAC+E;IAC/E,MAAM,IAAI,IAAI;IAiBd,MAAM,IAAI,IAAI;IAMd,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,SAAS;IAgBjB,iEAAiE;IACjE,MAAM,CAAC,KAAK,EAAE;QAAE,aAAa,CAAC,EAAE,aAAa,EAAE,CAAA;KAAE,GAAG,IAAI;CAUzD"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/** Live, elegant trace of a coordination round. Per-agent activity is driven by
|
|
2
|
+
* the process-wide progress bus (`core/progress`): each agent emits `start` when
|
|
3
|
+
* it begins and `done` when it finishes, so the back-and-forth streams live even
|
|
4
|
+
* when a mode fans agents out concurrently (e.g. consensus). Judge verdicts come
|
|
5
|
+
* from the graph's streamed state snapshots. Everything is shown by default;
|
|
6
|
+
* `visible=false` (via `--quiet` / `/hide`) silences the commentary — but agent
|
|
7
|
+
* *failures* surface regardless, since a silent failure is worse than a noisy one. */
|
|
8
|
+
import kleur from "kleur";
|
|
9
|
+
import { progress } from "../core/progress.js";
|
|
10
|
+
import { renderContribution, renderFailure, runFailed } from "./render.js";
|
|
11
|
+
// A bright, distinct color per agent so each one is easy to follow in a round.
|
|
12
|
+
// Assigned in first-seen order and stable for the session.
|
|
13
|
+
const AGENT_PALETTE = [kleur.cyan, kleur.green, kleur.yellow, kleur.magenta, kleur.blue, kleur.red];
|
|
14
|
+
const agentColors = new Map();
|
|
15
|
+
function agentColor(agentId) {
|
|
16
|
+
let c = agentColors.get(agentId);
|
|
17
|
+
if (!c) {
|
|
18
|
+
c = AGENT_PALETTE[agentColors.size % AGENT_PALETTE.length];
|
|
19
|
+
agentColors.set(agentId, c);
|
|
20
|
+
}
|
|
21
|
+
return c;
|
|
22
|
+
}
|
|
23
|
+
const ROLE_LABELS = {
|
|
24
|
+
"consensus-participant": "participant",
|
|
25
|
+
"tournament-participant": "contender",
|
|
26
|
+
};
|
|
27
|
+
/** Glyph + color + label for a line. Coordination roles (judge/moderator) and the
|
|
28
|
+
* finalizer get fixed colors; every actual agent gets its own palette color so
|
|
29
|
+
* the three agents in a round are visually distinct. */
|
|
30
|
+
function roleStyle(role, agentId) {
|
|
31
|
+
if (role === "finalizer")
|
|
32
|
+
return { glyph: "✦", color: kleur.green, label: "finalizer" };
|
|
33
|
+
if (role === "judge" || role === "moderator")
|
|
34
|
+
return { glyph: "⚖", color: kleur.magenta, label: role };
|
|
35
|
+
return { glyph: "◆", color: agentColor(agentId), label: ROLE_LABELS[role] ?? role };
|
|
36
|
+
}
|
|
37
|
+
function meta(run) {
|
|
38
|
+
const bits = [];
|
|
39
|
+
if (run.duration_s)
|
|
40
|
+
bits.push(`${run.duration_s.toFixed(1)}s`);
|
|
41
|
+
if (run.cost_estimate_usd != null)
|
|
42
|
+
bits.push(`$${run.cost_estimate_usd.toFixed(4)}`);
|
|
43
|
+
return bits.length ? kleur.dim(` ${bits.join(" · ")}`) : "";
|
|
44
|
+
}
|
|
45
|
+
/** Prefix each content line with a colored gutter bar so a block reads as one
|
|
46
|
+
* unit, attributed to its agent. Content stays the terminal's default color
|
|
47
|
+
* (bright/legible) rather than dimmed. */
|
|
48
|
+
function block(text, gutter) {
|
|
49
|
+
const bar = gutter("│");
|
|
50
|
+
return text
|
|
51
|
+
.split("\n")
|
|
52
|
+
.map((l) => ` ${bar} ${l}`)
|
|
53
|
+
.join("\n");
|
|
54
|
+
}
|
|
55
|
+
/** A thin section rule, e.g. `── deliberating · consensus ──────────`. */
|
|
56
|
+
export function rule(label) {
|
|
57
|
+
const head = kleur.dim("── ") + kleur.bold().cyan(label) + kleur.dim(" ");
|
|
58
|
+
const visibleLen = 3 + label.length + 1;
|
|
59
|
+
return head + kleur.dim("─".repeat(Math.max(0, 56 - visibleLen)));
|
|
60
|
+
}
|
|
61
|
+
export class Trace {
|
|
62
|
+
visible;
|
|
63
|
+
seenJudge = 0;
|
|
64
|
+
onStart;
|
|
65
|
+
onDone;
|
|
66
|
+
onStep;
|
|
67
|
+
constructor(visible) {
|
|
68
|
+
this.visible = visible;
|
|
69
|
+
}
|
|
70
|
+
/** Subscribe to the progress bus for the lifetime of the session. The handlers
|
|
71
|
+
* read `this.visible` at emit time, so `/show` / `/hide` take effect live. */
|
|
72
|
+
attach() {
|
|
73
|
+
this.onStart = (ev) => {
|
|
74
|
+
if (!this.visible)
|
|
75
|
+
return;
|
|
76
|
+
const { glyph, color, label } = roleStyle(ev.role, ev.agent_id);
|
|
77
|
+
console.log(` ${color(glyph)} ${kleur.bold(color(label))} ${kleur.dim(`· ${ev.agent_id}`)} ${kleur.dim().italic("· working…")}`);
|
|
78
|
+
};
|
|
79
|
+
// Live activity from inside a run (tool calls, commands, edits), in the agent's
|
|
80
|
+
// own color so concurrent agents (consensus/tournament) stay legible.
|
|
81
|
+
this.onStep = (ev) => {
|
|
82
|
+
if (this.visible)
|
|
83
|
+
console.log(` ${kleur.dim(ev.agent_id)} ${agentColor(ev.agent_id)(ev.text)}`);
|
|
84
|
+
};
|
|
85
|
+
this.onDone = ({ run }) => this.renderRun(run);
|
|
86
|
+
progress.on("start", this.onStart);
|
|
87
|
+
progress.on("step", this.onStep);
|
|
88
|
+
progress.on("done", this.onDone);
|
|
89
|
+
}
|
|
90
|
+
detach() {
|
|
91
|
+
if (this.onStart)
|
|
92
|
+
progress.off("start", this.onStart);
|
|
93
|
+
if (this.onStep)
|
|
94
|
+
progress.off("step", this.onStep);
|
|
95
|
+
if (this.onDone)
|
|
96
|
+
progress.off("done", this.onDone);
|
|
97
|
+
}
|
|
98
|
+
reset() {
|
|
99
|
+
this.seenJudge = 0;
|
|
100
|
+
}
|
|
101
|
+
renderRun(run) {
|
|
102
|
+
const { glyph, color, label } = roleStyle(run.role, run.agent_id);
|
|
103
|
+
if (runFailed(run)) {
|
|
104
|
+
console.warn(` ${kleur.yellow("✗")} ${kleur.bold().yellow(label)} ${kleur.dim(`· ${run.agent_id}`)} ${kleur.yellow(renderFailure(run))}`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (!this.visible)
|
|
108
|
+
return;
|
|
109
|
+
if (run.role === "finalizer") {
|
|
110
|
+
const changed = run.files_changed?.length ? kleur.dim(` — edited ${run.files_changed.join(", ")}`) : "";
|
|
111
|
+
console.log(` ${color(glyph)} ${kleur.bold(color("finalizer"))} ${kleur.dim(`· ${run.agent_id}`)}${meta(run)}${changed}`);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
console.log(` ${color(glyph)} ${kleur.bold(color(label))} ${kleur.dim(`· ${run.agent_id}`)}${meta(run)}`);
|
|
115
|
+
console.log(block(renderContribution(run, 800), color));
|
|
116
|
+
}
|
|
117
|
+
/** Surface new judge verdicts from a streamed state snapshot. */
|
|
118
|
+
update(state) {
|
|
119
|
+
if (!this.visible)
|
|
120
|
+
return;
|
|
121
|
+
const judges = state.judge_history ?? [];
|
|
122
|
+
while (this.seenJudge < judges.length) {
|
|
123
|
+
const j = judges[this.seenJudge++];
|
|
124
|
+
if (!j)
|
|
125
|
+
continue;
|
|
126
|
+
console.log(` ${kleur.magenta("⚖")} ${kleur.magenta().bold("judge")} ${kleur.dim("→")} ${kleur.bold().magenta(j.winner)}`);
|
|
127
|
+
if (j.reason)
|
|
128
|
+
console.log(block(j.reason, kleur.magenta));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/chat/trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Conversation memory. Agents are stateless subprocess calls, so prior turns
|
|
2
|
+
* are threaded into each new turn's task as context. */
|
|
3
|
+
export interface Turn {
|
|
4
|
+
role: "user" | "assistant";
|
|
5
|
+
content: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class Transcript {
|
|
8
|
+
private turns;
|
|
9
|
+
add(role: Turn["role"], content: string): void;
|
|
10
|
+
clear(): void;
|
|
11
|
+
get length(): number;
|
|
12
|
+
/** Build the task for a new prompt, prepending the (bounded) conversation. */
|
|
13
|
+
taskFor(prompt: string): string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/chat/transcript.ts"],"names":[],"mappings":"AAAA;yDACyD;AAEzD,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAQD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAc;IAE3B,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9C,KAAK,IAAI,IAAI;IAIb,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,8EAA8E;IAC9E,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAiBhC"}
|