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.
Files changed (203) hide show
  1. package/README.md +137 -0
  2. package/dist/adapters/base.d.ts +56 -0
  3. package/dist/adapters/base.d.ts.map +1 -0
  4. package/dist/adapters/base.js +176 -0
  5. package/dist/adapters/base.js.map +1 -0
  6. package/dist/adapters/claudeCode.d.ts +11 -0
  7. package/dist/adapters/claudeCode.d.ts.map +1 -0
  8. package/dist/adapters/claudeCode.js +65 -0
  9. package/dist/adapters/claudeCode.js.map +1 -0
  10. package/dist/adapters/codex.d.ts +10 -0
  11. package/dist/adapters/codex.d.ts.map +1 -0
  12. package/dist/adapters/codex.js +51 -0
  13. package/dist/adapters/codex.js.map +1 -0
  14. package/dist/adapters/cursor.d.ts +16 -0
  15. package/dist/adapters/cursor.d.ts.map +1 -0
  16. package/dist/adapters/cursor.js +47 -0
  17. package/dist/adapters/cursor.js.map +1 -0
  18. package/dist/adapters/fake.d.ts +19 -0
  19. package/dist/adapters/fake.d.ts.map +1 -0
  20. package/dist/adapters/fake.js +41 -0
  21. package/dist/adapters/fake.js.map +1 -0
  22. package/dist/adapters/index.d.ts +11 -0
  23. package/dist/adapters/index.d.ts.map +1 -0
  24. package/dist/adapters/index.js +11 -0
  25. package/dist/adapters/index.js.map +1 -0
  26. package/dist/adapters/stream.d.ts +6 -0
  27. package/dist/adapters/stream.d.ts.map +1 -0
  28. package/dist/adapters/stream.js +20 -0
  29. package/dist/adapters/stream.js.map +1 -0
  30. package/dist/chat/configs.d.ts +18 -0
  31. package/dist/chat/configs.d.ts.map +1 -0
  32. package/dist/chat/configs.js +71 -0
  33. package/dist/chat/configs.js.map +1 -0
  34. package/dist/chat/doctor.d.ts +16 -0
  35. package/dist/chat/doctor.d.ts.map +1 -0
  36. package/dist/chat/doctor.js +43 -0
  37. package/dist/chat/doctor.js.map +1 -0
  38. package/dist/chat/finalizer.d.ts +25 -0
  39. package/dist/chat/finalizer.d.ts.map +1 -0
  40. package/dist/chat/finalizer.js +52 -0
  41. package/dist/chat/finalizer.js.map +1 -0
  42. package/dist/chat/preflight.d.ts +37 -0
  43. package/dist/chat/preflight.d.ts.map +1 -0
  44. package/dist/chat/preflight.js +115 -0
  45. package/dist/chat/preflight.js.map +1 -0
  46. package/dist/chat/render.d.ts +21 -0
  47. package/dist/chat/render.d.ts.map +1 -0
  48. package/dist/chat/render.js +113 -0
  49. package/dist/chat/render.js.map +1 -0
  50. package/dist/chat/repl.d.ts +9 -0
  51. package/dist/chat/repl.d.ts.map +1 -0
  52. package/dist/chat/repl.js +275 -0
  53. package/dist/chat/repl.js.map +1 -0
  54. package/dist/chat/trace.d.ts +29 -0
  55. package/dist/chat/trace.d.ts.map +1 -0
  56. package/dist/chat/trace.js +132 -0
  57. package/dist/chat/trace.js.map +1 -0
  58. package/dist/chat/transcript.d.ts +15 -0
  59. package/dist/chat/transcript.d.ts.map +1 -0
  60. package/dist/chat/transcript.js +39 -0
  61. package/dist/chat/transcript.js.map +1 -0
  62. package/dist/cli.d.ts +5 -0
  63. package/dist/cli.d.ts.map +1 -0
  64. package/dist/cli.js +134 -0
  65. package/dist/cli.js.map +1 -0
  66. package/dist/config.d.ts +2 -0
  67. package/dist/config.d.ts.map +1 -0
  68. package/dist/config.js +52 -0
  69. package/dist/config.js.map +1 -0
  70. package/dist/core/annotation.d.ts +22 -0
  71. package/dist/core/annotation.d.ts.map +1 -0
  72. package/dist/core/annotation.js +45 -0
  73. package/dist/core/annotation.js.map +1 -0
  74. package/dist/core/compile.d.ts +3 -0
  75. package/dist/core/compile.d.ts.map +1 -0
  76. package/dist/core/compile.js +9 -0
  77. package/dist/core/compile.js.map +1 -0
  78. package/dist/core/executor.d.ts +32 -0
  79. package/dist/core/executor.d.ts.map +1 -0
  80. package/dist/core/executor.js +73 -0
  81. package/dist/core/executor.js.map +1 -0
  82. package/dist/core/json.d.ts +9 -0
  83. package/dist/core/json.d.ts.map +1 -0
  84. package/dist/core/json.js +49 -0
  85. package/dist/core/json.js.map +1 -0
  86. package/dist/core/llm/base.d.ts +9 -0
  87. package/dist/core/llm/base.d.ts.map +1 -0
  88. package/dist/core/llm/base.js +3 -0
  89. package/dist/core/llm/base.js.map +1 -0
  90. package/dist/core/llm/build.d.ts +16 -0
  91. package/dist/core/llm/build.d.ts.map +1 -0
  92. package/dist/core/llm/build.js +34 -0
  93. package/dist/core/llm/build.js.map +1 -0
  94. package/dist/core/llm/claudeCli.d.ts +20 -0
  95. package/dist/core/llm/claudeCli.d.ts.map +1 -0
  96. package/dist/core/llm/claudeCli.js +57 -0
  97. package/dist/core/llm/claudeCli.js.map +1 -0
  98. package/dist/core/llm/codexCli.d.ts +13 -0
  99. package/dist/core/llm/codexCli.d.ts.map +1 -0
  100. package/dist/core/llm/codexCli.js +30 -0
  101. package/dist/core/llm/codexCli.js.map +1 -0
  102. package/dist/core/llm/cursorCli.d.ts +13 -0
  103. package/dist/core/llm/cursorCli.d.ts.map +1 -0
  104. package/dist/core/llm/cursorCli.js +27 -0
  105. package/dist/core/llm/cursorCli.js.map +1 -0
  106. package/dist/core/llm/index.d.ts +5 -0
  107. package/dist/core/llm/index.d.ts.map +1 -0
  108. package/dist/core/llm/index.js +4 -0
  109. package/dist/core/llm/index.js.map +1 -0
  110. package/dist/core/llm/scripted.d.ts +16 -0
  111. package/dist/core/llm/scripted.d.ts.map +1 -0
  112. package/dist/core/llm/scripted.js +29 -0
  113. package/dist/core/llm/scripted.js.map +1 -0
  114. package/dist/core/progress.d.ts +29 -0
  115. package/dist/core/progress.d.ts.map +1 -0
  116. package/dist/core/progress.js +22 -0
  117. package/dist/core/progress.js.map +1 -0
  118. package/dist/core/registry.d.ts +29 -0
  119. package/dist/core/registry.d.ts.map +1 -0
  120. package/dist/core/registry.js +63 -0
  121. package/dist/core/registry.js.map +1 -0
  122. package/dist/core/spawn.d.ts +19 -0
  123. package/dist/core/spawn.d.ts.map +1 -0
  124. package/dist/core/spawn.js +58 -0
  125. package/dist/core/spawn.js.map +1 -0
  126. package/dist/core/state.d.ts +58 -0
  127. package/dist/core/state.d.ts.map +1 -0
  128. package/dist/core/state.js +3 -0
  129. package/dist/core/state.js.map +1 -0
  130. package/dist/core/timeout.d.ts +13 -0
  131. package/dist/core/timeout.d.ts.map +1 -0
  132. package/dist/core/timeout.js +33 -0
  133. package/dist/core/timeout.js.map +1 -0
  134. package/dist/core/types.d.ts +15 -0
  135. package/dist/core/types.d.ts.map +1 -0
  136. package/dist/core/types.js +3 -0
  137. package/dist/core/types.js.map +1 -0
  138. package/dist/core/validate.d.ts +7 -0
  139. package/dist/core/validate.d.ts.map +1 -0
  140. package/dist/core/validate.js +47 -0
  141. package/dist/core/validate.js.map +1 -0
  142. package/dist/graph.d.ts +4 -0
  143. package/dist/graph.d.ts.map +1 -0
  144. package/dist/graph.js +14 -0
  145. package/dist/graph.js.map +1 -0
  146. package/dist/index.d.ts +18 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +16 -0
  149. package/dist/index.js.map +1 -0
  150. package/dist/modes/adversarial.d.ts +3 -0
  151. package/dist/modes/adversarial.d.ts.map +1 -0
  152. package/dist/modes/adversarial.js +42 -0
  153. package/dist/modes/adversarial.js.map +1 -0
  154. package/dist/modes/consensus.d.ts +3 -0
  155. package/dist/modes/consensus.d.ts.map +1 -0
  156. package/dist/modes/consensus.js +47 -0
  157. package/dist/modes/consensus.js.map +1 -0
  158. package/dist/modes/debate.d.ts +3 -0
  159. package/dist/modes/debate.d.ts.map +1 -0
  160. package/dist/modes/debate.js +76 -0
  161. package/dist/modes/debate.js.map +1 -0
  162. package/dist/modes/index.d.ts +7 -0
  163. package/dist/modes/index.d.ts.map +1 -0
  164. package/dist/modes/index.js +7 -0
  165. package/dist/modes/index.js.map +1 -0
  166. package/dist/modes/single.d.ts +3 -0
  167. package/dist/modes/single.d.ts.map +1 -0
  168. package/dist/modes/single.js +42 -0
  169. package/dist/modes/single.js.map +1 -0
  170. package/dist/modes/tournament.d.ts +3 -0
  171. package/dist/modes/tournament.d.ts.map +1 -0
  172. package/dist/modes/tournament.js +48 -0
  173. package/dist/modes/tournament.js.map +1 -0
  174. package/dist/nodes/agentRunner.d.ts +15 -0
  175. package/dist/nodes/agentRunner.d.ts.map +1 -0
  176. package/dist/nodes/agentRunner.js +106 -0
  177. package/dist/nodes/agentRunner.js.map +1 -0
  178. package/dist/nodes/auditor.d.ts +38 -0
  179. package/dist/nodes/auditor.d.ts.map +1 -0
  180. package/dist/nodes/auditor.js +179 -0
  181. package/dist/nodes/auditor.js.map +1 -0
  182. package/dist/nodes/bracket.d.ts +19 -0
  183. package/dist/nodes/bracket.d.ts.map +1 -0
  184. package/dist/nodes/bracket.js +90 -0
  185. package/dist/nodes/bracket.js.map +1 -0
  186. package/dist/nodes/consensusEngine.d.ts +18 -0
  187. package/dist/nodes/consensusEngine.d.ts.map +1 -0
  188. package/dist/nodes/consensusEngine.js +94 -0
  189. package/dist/nodes/consensusEngine.js.map +1 -0
  190. package/dist/nodes/moderator.d.ts +20 -0
  191. package/dist/nodes/moderator.d.ts.map +1 -0
  192. package/dist/nodes/moderator.js +83 -0
  193. package/dist/nodes/moderator.js.map +1 -0
  194. package/dist/nodes/planner.d.ts +17 -0
  195. package/dist/nodes/planner.d.ts.map +1 -0
  196. package/dist/nodes/planner.js +40 -0
  197. package/dist/nodes/planner.js.map +1 -0
  198. package/dist/nodes/supervisor.d.ts +28 -0
  199. package/dist/nodes/supervisor.d.ts.map +1 -0
  200. package/dist/nodes/supervisor.js +75 -0
  201. package/dist/nodes/supervisor.js.map +1 -0
  202. package/package.json +66 -0
  203. package/schemas/coterie.config.schema.json +204 -0
@@ -0,0 +1,3 @@
1
+ /** Coterie's typed state. Mirrors Python's `CoterieState`. */
2
+ export {};
3
+ //# sourceMappingURL=state.js.map
@@ -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,3 @@
1
+ /** Cross-module types that can't live in their natural homes without circular imports. */
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -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"}
@@ -0,0 +1,4 @@
1
+ /** Mode dispatcher. */
2
+ import type { ModeBuildOpts } from "./core/types.js";
3
+ export declare function buildGraph(opts: ModeBuildOpts): any;
4
+ //# sourceMappingURL=graph.d.ts.map
@@ -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"}
@@ -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,3 @@
1
+ import type { ModeBuildOpts } from "../core/types.js";
2
+ export declare function build(opts: ModeBuildOpts): any;
3
+ //# sourceMappingURL=adversarial.d.ts.map
@@ -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,3 @@
1
+ import type { ModeBuildOpts } from "../core/types.js";
2
+ export declare function build(opts: ModeBuildOpts): any;
3
+ //# sourceMappingURL=consensus.d.ts.map
@@ -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,3 @@
1
+ import type { ModeBuildOpts } from "../core/types.js";
2
+ export declare function build(opts: ModeBuildOpts): any;
3
+ //# sourceMappingURL=debate.d.ts.map
@@ -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,7 @@
1
+ /** Importing this module triggers all built-in mode registrations. */
2
+ import "./single.js";
3
+ import "./consensus.js";
4
+ import "./adversarial.js";
5
+ import "./debate.js";
6
+ import "./tournament.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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,7 @@
1
+ /** Importing this module triggers all built-in mode registrations. */
2
+ import "./single.js";
3
+ import "./consensus.js";
4
+ import "./adversarial.js";
5
+ import "./debate.js";
6
+ import "./tournament.js";
7
+ //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ import type { ModeBuildOpts } from "../core/types.js";
2
+ export declare function build(opts: ModeBuildOpts): any;
3
+ //# sourceMappingURL=single.d.ts.map
@@ -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,3 @@
1
+ import type { ModeBuildOpts } from "../core/types.js";
2
+ export declare function build(opts: ModeBuildOpts): any;
3
+ //# sourceMappingURL=tournament.d.ts.map
@@ -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