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 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAAA,8DAA8D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** A timeout that doesn't count system-sleep against the deadline.
|
|
2
|
+
*
|
|
3
|
+
* A plain `setTimeout(kill, ms)` is wall-clock: if the machine sleeps mid-call
|
|
4
|
+
* and the deadline passes while suspended, the timer fires the instant the
|
|
5
|
+
* machine wakes — killing a child process (e.g. `claude -p`) that was merely
|
|
6
|
+
* suspended, not hung (the symptom: "claude CLI exited 143"). Instead we tick
|
|
7
|
+
* periodically and, when we see a gap far larger than the tick (i.e. the process
|
|
8
|
+
* was suspended), push the deadline forward by the slept duration. Only *active*
|
|
9
|
+
* time counts toward the timeout.
|
|
10
|
+
*
|
|
11
|
+
* Returns a function that cancels the timer. */
|
|
12
|
+
export declare function sleepAwareTimeout(ms: number, onTimeout: () => void): () => void;
|
|
13
|
+
//# sourceMappingURL=timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../src/core/timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;iDAUiD;AACjD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAkB/E"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** A timeout that doesn't count system-sleep against the deadline.
|
|
2
|
+
*
|
|
3
|
+
* A plain `setTimeout(kill, ms)` is wall-clock: if the machine sleeps mid-call
|
|
4
|
+
* and the deadline passes while suspended, the timer fires the instant the
|
|
5
|
+
* machine wakes — killing a child process (e.g. `claude -p`) that was merely
|
|
6
|
+
* suspended, not hung (the symptom: "claude CLI exited 143"). Instead we tick
|
|
7
|
+
* periodically and, when we see a gap far larger than the tick (i.e. the process
|
|
8
|
+
* was suspended), push the deadline forward by the slept duration. Only *active*
|
|
9
|
+
* time counts toward the timeout.
|
|
10
|
+
*
|
|
11
|
+
* Returns a function that cancels the timer. */
|
|
12
|
+
export function sleepAwareTimeout(ms, onTimeout) {
|
|
13
|
+
const tick = Math.min(5_000, Math.max(250, ms));
|
|
14
|
+
let deadline = Date.now() + ms;
|
|
15
|
+
let last = Date.now();
|
|
16
|
+
const id = setInterval(() => {
|
|
17
|
+
const now = Date.now();
|
|
18
|
+
const gap = now - last;
|
|
19
|
+
last = now;
|
|
20
|
+
// A gap much larger than the tick interval means we were suspended (sleep,
|
|
21
|
+
// a long GC pause, a debugger break) — don't count it against the deadline.
|
|
22
|
+
if (gap > tick * 2)
|
|
23
|
+
deadline += gap - tick;
|
|
24
|
+
if (now >= deadline) {
|
|
25
|
+
clearInterval(id);
|
|
26
|
+
onTimeout();
|
|
27
|
+
}
|
|
28
|
+
}, tick);
|
|
29
|
+
if (typeof id.unref === "function")
|
|
30
|
+
id.unref();
|
|
31
|
+
return () => clearInterval(id);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../src/core/timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;iDAUiD;AACjD,MAAM,UAAU,iBAAiB,CAAC,EAAU,EAAE,SAAqB;IACjE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAChD,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC/B,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;QACvB,IAAI,GAAG,GAAG,CAAC;QACX,2EAA2E;QAC3E,4EAA4E;QAC5E,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;YAAE,QAAQ,IAAI,GAAG,GAAG,IAAI,CAAC;QAC3C,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;YACpB,aAAa,CAAC,EAAE,CAAC,CAAC;YAClB,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC,EAAE,IAAI,CAAC,CAAC;IACT,IAAI,OAAO,EAAE,CAAC,KAAK,KAAK,UAAU;QAAE,EAAE,CAAC,KAAK,EAAE,CAAC;IAC/C,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Cross-module types that can't live in their natural homes without circular imports. */
|
|
2
|
+
import type { AdapterExecutor } from "./executor.js";
|
|
3
|
+
import type { LLMClient } from "./llm/base.js";
|
|
4
|
+
export interface ModeBuildOpts {
|
|
5
|
+
workdir: string;
|
|
6
|
+
executor: AdapterExecutor;
|
|
7
|
+
config: Record<string, any>;
|
|
8
|
+
supervisor_llm?: LLMClient | null;
|
|
9
|
+
judge_llm?: LLMClient | null;
|
|
10
|
+
consensus_llm?: LLMClient | null;
|
|
11
|
+
moderator_llm?: LLMClient | null;
|
|
12
|
+
planner_llm?: LLMClient | null;
|
|
13
|
+
}
|
|
14
|
+
export type ModeBuilder = (opts: ModeBuildOpts) => any;
|
|
15
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,cAAc,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,aAAa,KAAK,GAAG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,0FAA0F"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Pre-run validation of a resolved config: catch the structural problems that
|
|
2
|
+
* would otherwise blow up deep inside a graph node (missing agent ids, empty
|
|
3
|
+
* participant lists, malformed debate sides) and surface them as one clear,
|
|
4
|
+
* upfront error instead. Schema validation (config.ts) covers shape; this covers
|
|
5
|
+
* cross-references between sections and the agent lineup. */
|
|
6
|
+
export declare function validateRuntimeConfig(cfg: any): void;
|
|
7
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA;;;;8DAI8D;AAE9D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAwCpD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** Pre-run validation of a resolved config: catch the structural problems that
|
|
2
|
+
* would otherwise blow up deep inside a graph node (missing agent ids, empty
|
|
3
|
+
* participant lists, malformed debate sides) and surface them as one clear,
|
|
4
|
+
* upfront error instead. Schema validation (config.ts) covers shape; this covers
|
|
5
|
+
* cross-references between sections and the agent lineup. */
|
|
6
|
+
export function validateRuntimeConfig(cfg) {
|
|
7
|
+
const agents = Array.isArray(cfg?.agents) ? cfg.agents : [];
|
|
8
|
+
if (agents.length === 0) {
|
|
9
|
+
throw new Error("Invalid config: 'agents' must list at least one agent.");
|
|
10
|
+
}
|
|
11
|
+
const ids = new Set(agents.map((a) => a?.id).filter(Boolean));
|
|
12
|
+
const known = [...ids].join(", ");
|
|
13
|
+
const need = (id, label) => {
|
|
14
|
+
if (typeof id !== "string" || !ids.has(id)) {
|
|
15
|
+
throw new Error(`Invalid config: ${label} '${id ?? ""}' is not one of the configured agents (${known}).`);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
switch (cfg.mode) {
|
|
19
|
+
case "adversarial": {
|
|
20
|
+
const a = cfg.adversarial ?? {};
|
|
21
|
+
need(a.implementer, "adversarial.implementer");
|
|
22
|
+
need(a.auditor, "adversarial.auditor");
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
case "debate": {
|
|
26
|
+
const sides = cfg.debate?.sides;
|
|
27
|
+
if (!Array.isArray(sides) || sides.length !== 2) {
|
|
28
|
+
throw new Error("Invalid config: debate.sides must list exactly two agent ids.");
|
|
29
|
+
}
|
|
30
|
+
need(sides[0], "debate.sides[0]");
|
|
31
|
+
need(sides[1], "debate.sides[1]");
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
case "consensus":
|
|
35
|
+
case "tournament": {
|
|
36
|
+
const p = cfg[cfg.mode]?.participants ?? agents.map((a) => a.id);
|
|
37
|
+
if (!Array.isArray(p) || p.length < 2) {
|
|
38
|
+
throw new Error(`Invalid config: ${cfg.mode} needs at least two participants.`);
|
|
39
|
+
}
|
|
40
|
+
for (const id of p)
|
|
41
|
+
need(id, `${cfg.mode}.participants`);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
// single: the supervisor routes among `agents` (already non-empty).
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA;;;;8DAI8D;AAE9D,MAAM,UAAU,qBAAqB,CAAC,GAAQ;IAC5C,MAAM,MAAM,GAAU,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,CAAC,EAAW,EAAE,KAAa,EAAE,EAAE;QAC1C,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,KAAK,EAAE,IAAI,EAAE,0CAA0C,KAAK,IAAI,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;YAC/C,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;YACvC,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAClC,MAAM;QACR,CAAC;QACD,KAAK,WAAW,CAAC;QACjB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,CAAC,GAAY,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,IAAI,mCAAmC,CAAC,CAAC;YAClF,CAAC;YACD,KAAK,MAAM,EAAE,IAAI,CAAC;gBAAE,IAAI,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,eAAe,CAAC,CAAC;YACzD,MAAM;QACR,CAAC;QACD,oEAAoE;IACtE,CAAC;AACH,CAAC"}
|
package/dist/graph.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA,uBAAuB;AAGvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,OAU7C"}
|
package/dist/graph.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Mode dispatcher. */
|
|
2
|
+
import { MODE_REGISTRY } from "./core/registry.js";
|
|
3
|
+
export function buildGraph(opts) {
|
|
4
|
+
const mode = opts.config.mode;
|
|
5
|
+
if (!mode) {
|
|
6
|
+
throw new Error(`config.mode is required; expected one of ${MODE_REGISTRY.names().join(", ")}`);
|
|
7
|
+
}
|
|
8
|
+
const builder = MODE_REGISTRY.get(mode);
|
|
9
|
+
if (!builder) {
|
|
10
|
+
throw new Error(`unknown mode ${mode}; available: ${MODE_REGISTRY.names().join(", ")}`);
|
|
11
|
+
}
|
|
12
|
+
return builder(opts);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA,uBAAuB;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,4CAA4C,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,gBAAgB,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Public API. */
|
|
2
|
+
import "./adapters/index.js";
|
|
3
|
+
import "./modes/index.js";
|
|
4
|
+
export { CLIAdapter, type AdapterResult } from "./adapters/base.js";
|
|
5
|
+
export { ClaudeCodeAdapter } from "./adapters/claudeCode.js";
|
|
6
|
+
export { CodexAdapter } from "./adapters/codex.js";
|
|
7
|
+
export { FakeAdapter, FakeAdapterError } from "./adapters/fake.js";
|
|
8
|
+
export { ADAPTER_REGISTRY, MODE_REGISTRY, Registry, registerAdapter, registerMode, } from "./core/registry.js";
|
|
9
|
+
export type { AgentRun, ConsensusFinding, CoterieState, Finding, JudgeDecision, Mode, RouteDecision, Status, } from "./core/state.js";
|
|
10
|
+
export type { LLMClient, LLMMessage } from "./core/llm/base.js";
|
|
11
|
+
export { buildLLM } from "./core/llm/build.js";
|
|
12
|
+
export { ClaudeCliClient } from "./core/llm/claudeCli.js";
|
|
13
|
+
export { ScriptedLLMClient, ScriptedLLMError } from "./core/llm/scripted.js";
|
|
14
|
+
export { type AdapterExecutor, IsolatedWorktreeExecutor, LocalSubprocessExecutor, } from "./core/executor.js";
|
|
15
|
+
export { buildGraph } from "./graph.js";
|
|
16
|
+
export { loadConfig } from "./config.js";
|
|
17
|
+
export declare const VERSION = "0.1.0";
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,OAAO,qBAAqB,CAAC;AAC7B,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,eAAe,EACf,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACP,aAAa,EACb,IAAI,EACJ,aAAa,EACb,MAAM,GACP,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EACL,KAAK,eAAe,EACpB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Public API. */
|
|
2
|
+
import "./adapters/index.js"; // trigger adapter registration on import
|
|
3
|
+
import "./modes/index.js"; // trigger mode registration on import
|
|
4
|
+
export { CLIAdapter } from "./adapters/base.js";
|
|
5
|
+
export { ClaudeCodeAdapter } from "./adapters/claudeCode.js";
|
|
6
|
+
export { CodexAdapter } from "./adapters/codex.js";
|
|
7
|
+
export { FakeAdapter, FakeAdapterError } from "./adapters/fake.js";
|
|
8
|
+
export { ADAPTER_REGISTRY, MODE_REGISTRY, Registry, registerAdapter, registerMode, } from "./core/registry.js";
|
|
9
|
+
export { buildLLM } from "./core/llm/build.js";
|
|
10
|
+
export { ClaudeCliClient } from "./core/llm/claudeCli.js";
|
|
11
|
+
export { ScriptedLLMClient, ScriptedLLMError } from "./core/llm/scripted.js";
|
|
12
|
+
export { IsolatedWorktreeExecutor, LocalSubprocessExecutor, } from "./core/executor.js";
|
|
13
|
+
export { buildGraph } from "./graph.js";
|
|
14
|
+
export { loadConfig } from "./config.js";
|
|
15
|
+
export const VERSION = "0.1.0";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,OAAO,qBAAqB,CAAC,CAAC,yCAAyC;AACvE,OAAO,kBAAkB,CAAC,CAAC,sCAAsC;AAEjE,OAAO,EAAE,UAAU,EAAsB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,eAAe,EACf,YAAY,GACb,MAAM,oBAAoB,CAAC;AAY5B,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAEL,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adversarial.d.ts","sourceRoot":"","sources":["../../src/modes/adversarial.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAWtD,wBAAgB,KAAK,CAAC,IAAI,EAAE,aAAa,OA4CxC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { END, START, StateGraph } from "@langchain/langgraph";
|
|
2
|
+
import { CoterieStateAnnotation } from "../core/annotation.js";
|
|
3
|
+
import { compileGraph } from "../core/compile.js";
|
|
4
|
+
import { registerMode } from "../core/registry.js";
|
|
5
|
+
import { makeAgentRunner } from "../nodes/agentRunner.js";
|
|
6
|
+
import { adversarialAuditorPrompt, adversarialImplementerPrompt, makeAdversarialJudgeNode, makeRecordAuditorFindingsNode, makeRecordImplementerOutputNode, } from "../nodes/auditor.js";
|
|
7
|
+
import { makePlannerNode } from "../nodes/planner.js";
|
|
8
|
+
export function build(opts) {
|
|
9
|
+
const { workdir, executor, config, judge_llm } = opts;
|
|
10
|
+
const adv = config.adversarial ?? {};
|
|
11
|
+
const implementerId = adv.implementer;
|
|
12
|
+
const auditorId = adv.auditor;
|
|
13
|
+
const g = new StateGraph(CoterieStateAnnotation)
|
|
14
|
+
.addNode("planner", makePlannerNode())
|
|
15
|
+
.addNode("implementer", makeAgentRunner({
|
|
16
|
+
role: "implementer",
|
|
17
|
+
workdir,
|
|
18
|
+
executor,
|
|
19
|
+
agent_id: implementerId,
|
|
20
|
+
prompt_fn: adversarialImplementerPrompt,
|
|
21
|
+
}))
|
|
22
|
+
.addNode("record_impl", makeRecordImplementerOutputNode())
|
|
23
|
+
.addNode("auditor", makeAgentRunner({
|
|
24
|
+
role: "auditor",
|
|
25
|
+
workdir,
|
|
26
|
+
executor,
|
|
27
|
+
agent_id: auditorId,
|
|
28
|
+
prompt_fn: adversarialAuditorPrompt,
|
|
29
|
+
}))
|
|
30
|
+
.addNode("record_findings", makeRecordAuditorFindingsNode())
|
|
31
|
+
.addNode("judge", makeAdversarialJudgeNode(judge_llm ?? null))
|
|
32
|
+
.addEdge(START, "planner")
|
|
33
|
+
.addEdge("planner", "implementer")
|
|
34
|
+
.addEdge("implementer", "record_impl")
|
|
35
|
+
.addEdge("record_impl", "auditor")
|
|
36
|
+
.addEdge("auditor", "record_findings")
|
|
37
|
+
.addEdge("record_findings", "judge")
|
|
38
|
+
.addConditionalEdges("judge", (state) => (state.status === "done" ? END : "implementer"), { [END]: END, implementer: "implementer" });
|
|
39
|
+
return compileGraph(g, config);
|
|
40
|
+
}
|
|
41
|
+
registerMode("adversarial", build);
|
|
42
|
+
//# sourceMappingURL=adversarial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adversarial.js","sourceRoot":"","sources":["../../src/modes/adversarial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,UAAU,KAAK,CAAC,IAAmB;IACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG,GAAG,CAAC,WAAqB,CAAC;IAChD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAiB,CAAC;IAExC,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,sBAAsB,CAAC;SAC7C,OAAO,CAAC,SAAS,EAAE,eAAe,EAAE,CAAC;SACrC,OAAO,CACN,aAAa,EACb,eAAe,CAAC;QACd,IAAI,EAAE,aAAa;QACnB,OAAO;QACP,QAAQ;QACR,QAAQ,EAAE,aAAa;QACvB,SAAS,EAAE,4BAA4B;KACxC,CAAC,CACH;SACA,OAAO,CAAC,aAAa,EAAE,+BAA+B,EAAE,CAAC;SACzD,OAAO,CACN,SAAS,EACT,eAAe,CAAC;QACd,IAAI,EAAE,SAAS;QACf,OAAO;QACP,QAAQ;QACR,QAAQ,EAAE,SAAS;QACnB,SAAS,EAAE,wBAAwB;KACpC,CAAC,CACH;SACA,OAAO,CAAC,iBAAiB,EAAE,6BAA6B,EAAE,CAAC;SAC3D,OAAO,CAAC,OAAO,EAAE,wBAAwB,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;SAC7D,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;SACzB,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC;SACjC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC;SACrC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC;SACjC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC;SACrC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,mBAAmB,CAClB,OAAO,EACP,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,EAC/D,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,CAC3C,CAAC;IAEJ,OAAO,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consensus.d.ts","sourceRoot":"","sources":["../../src/modes/consensus.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAqBtD,wBAAgB,KAAK,CAAC,IAAI,EAAE,aAAa,OA6BxC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { END, START, StateGraph } from "@langchain/langgraph";
|
|
2
|
+
import { CoterieStateAnnotation } from "../core/annotation.js";
|
|
3
|
+
import { compileGraph } from "../core/compile.js";
|
|
4
|
+
import { registerMode } from "../core/registry.js";
|
|
5
|
+
import { makeAgentRunner } from "../nodes/agentRunner.js";
|
|
6
|
+
import { makeConsensusEngineNode } from "../nodes/consensusEngine.js";
|
|
7
|
+
import { makePlannerNode } from "../nodes/planner.js";
|
|
8
|
+
const PARTICIPANT_PROMPT = (task) => `Review the following work item and report every defect you can find.
|
|
9
|
+
|
|
10
|
+
# Task
|
|
11
|
+
${task}
|
|
12
|
+
|
|
13
|
+
Report defects only — do NOT propose fixes. Return ONLY a JSON array. No prose, no markdown.
|
|
14
|
+
Each finding:
|
|
15
|
+
{
|
|
16
|
+
"category": "bug|perf|security|clarity|missed-requirement|edge-case",
|
|
17
|
+
"severity": "low|medium|high|critical",
|
|
18
|
+
"description": "<one sentence>",
|
|
19
|
+
"line_ranges": ["path:start-end", ...]
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
If you find no defects, return [].`;
|
|
23
|
+
export function build(opts) {
|
|
24
|
+
const { workdir, executor, config, consensus_llm } = opts;
|
|
25
|
+
const consCfg = config.consensus ?? {};
|
|
26
|
+
const participants = consCfg.participants ?? config.agents.map((a) => a.id);
|
|
27
|
+
let g = new StateGraph(CoterieStateAnnotation)
|
|
28
|
+
.addNode("planner", makePlannerNode())
|
|
29
|
+
.addNode("engine", makeConsensusEngineNode(consensus_llm ?? null));
|
|
30
|
+
for (const pid of participants) {
|
|
31
|
+
g = g.addNode(`participant_${pid}`, makeAgentRunner({
|
|
32
|
+
role: "consensus-participant",
|
|
33
|
+
workdir,
|
|
34
|
+
executor,
|
|
35
|
+
agent_id: pid,
|
|
36
|
+
prompt_fn: (s) => PARTICIPANT_PROMPT(s.task),
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
g = g.addEdge(START, "planner");
|
|
40
|
+
for (const pid of participants) {
|
|
41
|
+
g = g.addEdge("planner", `participant_${pid}`).addEdge(`participant_${pid}`, "engine");
|
|
42
|
+
}
|
|
43
|
+
g = g.addEdge("engine", END);
|
|
44
|
+
return compileGraph(g, config);
|
|
45
|
+
}
|
|
46
|
+
registerMode("consensus", build);
|
|
47
|
+
//# sourceMappingURL=consensus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consensus.js","sourceRoot":"","sources":["../../src/modes/consensus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC;;;EAG3C,IAAI;;;;;;;;;;;mCAW6B,CAAC;AAEpC,MAAM,UAAU,KAAK,CAAC,IAAmB;IACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACvC,MAAM,YAAY,GAAa,OAAO,CAAC,YAAY,IAAK,MAAM,CAAC,MAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEjG,IAAI,CAAC,GAAQ,IAAI,UAAU,CAAC,sBAAsB,CAAC;SAChD,OAAO,CAAC,SAAS,EAAE,eAAe,EAAE,CAAC;SACrC,OAAO,CAAC,QAAQ,EAAE,uBAAuB,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC;IAErE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,CAAC,GAAG,CAAC,CAAC,OAAO,CACX,eAAe,GAAG,EAAE,EACpB,eAAe,CAAC;YACd,IAAI,EAAE,uBAAuB;YAC7B,OAAO;YACP,QAAQ;YACR,QAAQ,EAAE,GAAG;YACb,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;SAC7C,CAAC,CACH,CAAC;IACJ,CAAC;IAED,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzF,CAAC;IACD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAE7B,OAAO,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debate.d.ts","sourceRoot":"","sources":["../../src/modes/debate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAqDtD,wBAAgB,KAAK,CAAC,IAAI,EAAE,aAAa,OA0BxC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { END, START, StateGraph } from "@langchain/langgraph";
|
|
2
|
+
import { CoterieStateAnnotation } from "../core/annotation.js";
|
|
3
|
+
import { compileGraph } from "../core/compile.js";
|
|
4
|
+
import { registerMode } from "../core/registry.js";
|
|
5
|
+
import { makeAgentRunner } from "../nodes/agentRunner.js";
|
|
6
|
+
import { makeDebateJudgeNode, makeModeratorNode } from "../nodes/moderator.js";
|
|
7
|
+
import { makePlannerNode } from "../nodes/planner.js";
|
|
8
|
+
function priorSummaries(state) {
|
|
9
|
+
const summaries = (state.mode_state?.round_summaries ?? []);
|
|
10
|
+
if (summaries.length === 0)
|
|
11
|
+
return "(none — this is round 1)";
|
|
12
|
+
return summaries.map((s, i) => `Round ${i + 1}: ${s.round_summary ?? ""}`).join("\n");
|
|
13
|
+
}
|
|
14
|
+
function proPrompt(state) {
|
|
15
|
+
const total = state.config.debate?.rounds ?? 2;
|
|
16
|
+
const round = (state.mode_state?.rounds_completed ?? 0) + 1;
|
|
17
|
+
return `You are arguing the PRO position in a structured debate.
|
|
18
|
+
|
|
19
|
+
# Question
|
|
20
|
+
${state.task}
|
|
21
|
+
|
|
22
|
+
# Round
|
|
23
|
+
${round} of ${total}
|
|
24
|
+
|
|
25
|
+
# Previous round summaries
|
|
26
|
+
${priorSummaries(state)}
|
|
27
|
+
|
|
28
|
+
Make your strongest argument FOR. Cite concrete evidence and address the strongest
|
|
29
|
+
counterargument from the prior round (if any). Be concise: 4-8 sentences.`;
|
|
30
|
+
}
|
|
31
|
+
function conPrompt(state) {
|
|
32
|
+
const total = state.config.debate?.rounds ?? 2;
|
|
33
|
+
const round = (state.mode_state?.rounds_completed ?? 0) + 1;
|
|
34
|
+
const runs = state.runs ?? [];
|
|
35
|
+
const lastPro = [...runs].reverse().find((r) => r.role === "pro");
|
|
36
|
+
const proArgument = lastPro ? lastPro.stdout.slice(0, 1500) : "(missing)";
|
|
37
|
+
return `You are arguing the CON position in a structured debate.
|
|
38
|
+
|
|
39
|
+
# Question
|
|
40
|
+
${state.task}
|
|
41
|
+
|
|
42
|
+
# Round
|
|
43
|
+
${round} of ${total}
|
|
44
|
+
|
|
45
|
+
# Previous round summaries
|
|
46
|
+
${priorSummaries(state)}
|
|
47
|
+
|
|
48
|
+
# Pro's argument this round
|
|
49
|
+
${proArgument}
|
|
50
|
+
|
|
51
|
+
Make your strongest argument AGAINST. Cite concrete evidence and rebut Pro's argument
|
|
52
|
+
this round and previous rounds. Be concise: 4-8 sentences.`;
|
|
53
|
+
}
|
|
54
|
+
export function build(opts) {
|
|
55
|
+
const { workdir, executor, config, moderator_llm, judge_llm } = opts;
|
|
56
|
+
const deb = config.debate ?? {};
|
|
57
|
+
const [proId, conId] = deb.sides;
|
|
58
|
+
const g = new StateGraph(CoterieStateAnnotation)
|
|
59
|
+
.addNode("planner", makePlannerNode())
|
|
60
|
+
.addNode("pro", makeAgentRunner({ role: "pro", workdir, executor, agent_id: proId, prompt_fn: proPrompt }))
|
|
61
|
+
.addNode("con", makeAgentRunner({ role: "con", workdir, executor, agent_id: conId, prompt_fn: conPrompt }))
|
|
62
|
+
.addNode("moderator", makeModeratorNode(moderator_llm ?? null))
|
|
63
|
+
.addNode("judge", makeDebateJudgeNode(judge_llm ?? null))
|
|
64
|
+
.addEdge(START, "planner")
|
|
65
|
+
.addEdge("planner", "pro")
|
|
66
|
+
.addEdge("pro", "con")
|
|
67
|
+
.addEdge("con", "moderator")
|
|
68
|
+
.addConditionalEdges("moderator", (state) => {
|
|
69
|
+
const done = (state.mode_state?.rounds_completed ?? 0) >= (state.config.debate?.rounds ?? 2);
|
|
70
|
+
return done ? "judge" : "pro";
|
|
71
|
+
}, { pro: "pro", judge: "judge" })
|
|
72
|
+
.addEdge("judge", END);
|
|
73
|
+
return compileGraph(g, config);
|
|
74
|
+
}
|
|
75
|
+
registerMode("debate", build);
|
|
76
|
+
//# sourceMappingURL=debate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debate.js","sourceRoot":"","sources":["../../src/modes/debate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,aAAa,CAAC;AACrB,OAAO,gBAAgB,CAAC;AACxB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,aAAa,CAAC;AACrB,OAAO,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,aAAa,CAAC;AACrB,OAAO,gBAAgB,CAAC;AACxB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,aAAa,CAAC;AACrB,OAAO,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single.d.ts","sourceRoot":"","sources":["../../src/modes/single.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAWtD,wBAAgB,KAAK,CAAC,IAAI,EAAE,aAAa,OAgCxC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { END, START, StateGraph } from "@langchain/langgraph";
|
|
2
|
+
import { CoterieStateAnnotation } from "../core/annotation.js";
|
|
3
|
+
import { compileGraph } from "../core/compile.js";
|
|
4
|
+
import { registerMode } from "../core/registry.js";
|
|
5
|
+
import { makeAgentRunner } from "../nodes/agentRunner.js";
|
|
6
|
+
import { makeLLMPlannerNode, makePlannerNode } from "../nodes/planner.js";
|
|
7
|
+
import { makeStepAdvanceNode, makeSupervisorNode } from "../nodes/supervisor.js";
|
|
8
|
+
function plannerNode(config, plannerLlm) {
|
|
9
|
+
const p = config.planner ?? {};
|
|
10
|
+
if (p.enabled && plannerLlm)
|
|
11
|
+
return makeLLMPlannerNode(plannerLlm, { maxSubtasks: p.max_subtasks ?? 5 });
|
|
12
|
+
return makePlannerNode();
|
|
13
|
+
}
|
|
14
|
+
export function build(opts) {
|
|
15
|
+
const { workdir, executor, config, supervisor_llm, planner_llm } = opts;
|
|
16
|
+
const g = new StateGraph(CoterieStateAnnotation)
|
|
17
|
+
.addNode("planner", plannerNode(config, planner_llm))
|
|
18
|
+
.addNode("supervisor", makeSupervisorNode(supervisor_llm ?? null))
|
|
19
|
+
.addNode("agent", makeAgentRunner({
|
|
20
|
+
role: "agent",
|
|
21
|
+
workdir,
|
|
22
|
+
executor,
|
|
23
|
+
agent_id_fn: (s) => s.next_agent ?? "",
|
|
24
|
+
}))
|
|
25
|
+
.addNode("advance", makeStepAdvanceNode())
|
|
26
|
+
.addEdge(START, "planner")
|
|
27
|
+
.addEdge("planner", "supervisor")
|
|
28
|
+
.addConditionalEdges("supervisor", (state) => {
|
|
29
|
+
if (state.status === "done" || state.status === "failed" || state.status === "awaiting_human")
|
|
30
|
+
return END;
|
|
31
|
+
const idx = state.current_step_idx ?? 0;
|
|
32
|
+
const plan = state.plan ?? [];
|
|
33
|
+
if (idx >= plan.length)
|
|
34
|
+
return END;
|
|
35
|
+
return "agent";
|
|
36
|
+
}, { [END]: END, agent: "agent" })
|
|
37
|
+
.addEdge("agent", "advance")
|
|
38
|
+
.addEdge("advance", "supervisor");
|
|
39
|
+
return compileGraph(g, config);
|
|
40
|
+
}
|
|
41
|
+
registerMode("single", build);
|
|
42
|
+
//# sourceMappingURL=single.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single.js","sourceRoot":"","sources":["../../src/modes/single.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjF,SAAS,WAAW,CAAC,MAAW,EAAE,UAAe;IAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU;QAAE,OAAO,kBAAkB,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC,CAAC;IACzG,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAmB;IACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IACxE,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,sBAAsB,CAAC;SAC7C,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;SACpD,OAAO,CAAC,YAAY,EAAE,kBAAkB,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC;SACjE,OAAO,CACN,OAAO,EACP,eAAe,CAAC;QACd,IAAI,EAAE,OAAO;QACb,OAAO;QACP,QAAQ;QACR,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE;KACvC,CAAC,CACH;SACA,OAAO,CAAC,SAAS,EAAE,mBAAmB,EAAE,CAAC;SACzC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;SACzB,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC;SAChC,mBAAmB,CAClB,YAAY,EACZ,CAAC,KAAU,EAAE,EAAE;QACb,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,gBAAgB;YAAE,OAAO,GAAG,CAAC;QAC1G,MAAM,GAAG,GAAG,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9B,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC;QACnC,OAAO,OAAO,CAAC;IACjB,CAAC,EACD,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAC/B;SACA,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;SAC3B,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEpC,OAAO,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tournament.d.ts","sourceRoot":"","sources":["../../src/modes/tournament.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AActD,wBAAgB,KAAK,CAAC,IAAI,EAAE,aAAa,OAmCxC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { END, START, StateGraph } from "@langchain/langgraph";
|
|
2
|
+
import { CoterieStateAnnotation } from "../core/annotation.js";
|
|
3
|
+
import { compileGraph } from "../core/compile.js";
|
|
4
|
+
import { registerMode } from "../core/registry.js";
|
|
5
|
+
import { makeAgentRunner } from "../nodes/agentRunner.js";
|
|
6
|
+
import { makeBracketJudgeNode } from "../nodes/bracket.js";
|
|
7
|
+
import { makePlannerNode } from "../nodes/planner.js";
|
|
8
|
+
function makeEliminatedAwareParticipant(agent_id, workdir, executor) {
|
|
9
|
+
const inner = makeAgentRunner({ role: "tournament-participant", workdir, executor, agent_id });
|
|
10
|
+
return async (state) => {
|
|
11
|
+
const eliminated = (state.mode_state?.eliminated_participants ?? []);
|
|
12
|
+
if (eliminated.includes(agent_id))
|
|
13
|
+
return {};
|
|
14
|
+
return inner(state);
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function build(opts) {
|
|
18
|
+
const { workdir, executor, config, judge_llm } = opts;
|
|
19
|
+
const tournament = config.tournament ?? {};
|
|
20
|
+
const participants = (tournament.participants ?? config.agents.map((a) => a.id));
|
|
21
|
+
const multiRound = (tournament.rounds ?? 1) > 1;
|
|
22
|
+
let g = new StateGraph(CoterieStateAnnotation)
|
|
23
|
+
.addNode("planner", makePlannerNode())
|
|
24
|
+
.addNode("bracket_judge", makeBracketJudgeNode(judge_llm ?? null));
|
|
25
|
+
for (const pid of participants) {
|
|
26
|
+
g = g.addNode(`tparticipant_${pid}`, makeEliminatedAwareParticipant(pid, workdir, executor));
|
|
27
|
+
}
|
|
28
|
+
g = g.addEdge(START, "planner");
|
|
29
|
+
for (const pid of participants) {
|
|
30
|
+
g = g.addEdge("planner", `tparticipant_${pid}`).addEdge(`tparticipant_${pid}`, "bracket_judge");
|
|
31
|
+
}
|
|
32
|
+
if (multiRound) {
|
|
33
|
+
const targets = { [END]: END };
|
|
34
|
+
for (const pid of participants)
|
|
35
|
+
targets[`tparticipant_${pid}`] = `tparticipant_${pid}`;
|
|
36
|
+
g = g.addConditionalEdges("bracket_judge", (state) => {
|
|
37
|
+
if (state.status === "done")
|
|
38
|
+
return END;
|
|
39
|
+
return participants.map((p) => `tparticipant_${p}`);
|
|
40
|
+
}, targets);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
g = g.addEdge("bracket_judge", END);
|
|
44
|
+
}
|
|
45
|
+
return compileGraph(g, config);
|
|
46
|
+
}
|
|
47
|
+
registerMode("tournament", build);
|
|
48
|
+
//# sourceMappingURL=tournament.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tournament.js","sourceRoot":"","sources":["../../src/modes/tournament.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Generic CLI-invoking node + budget gate. Mirrors Python `nodes/agent_runner.py`. */
|
|
2
|
+
import type { AdapterExecutor } from "../core/executor.js";
|
|
3
|
+
import type { CoterieState } from "../core/state.js";
|
|
4
|
+
export interface AgentRunnerOpts {
|
|
5
|
+
role: string;
|
|
6
|
+
workdir: string;
|
|
7
|
+
executor: AdapterExecutor;
|
|
8
|
+
agent_id?: string;
|
|
9
|
+
agent_id_fn?: (state: CoterieState) => string;
|
|
10
|
+
prompt_fn?: (state: CoterieState) => string;
|
|
11
|
+
}
|
|
12
|
+
export declare function makeAgentRunner(opts: AgentRunnerOpts): (state: CoterieState, config?: {
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
}) => Promise<any>;
|
|
15
|
+
//# sourceMappingURL=agentRunner.d.ts.map
|