@calliopelabs/cli 2.3.0 → 3.0.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 (538) hide show
  1. package/README.md +45 -644
  2. package/dist/acp.d.ts +78 -0
  3. package/dist/acp.d.ts.map +1 -0
  4. package/dist/acp.js +572 -0
  5. package/dist/acp.js.map +1 -0
  6. package/dist/auto-compressor.d.ts.map +1 -1
  7. package/dist/auto-compressor.js +9 -5
  8. package/dist/auto-compressor.js.map +1 -1
  9. package/dist/bin.d.ts +9 -5
  10. package/dist/bin.d.ts.map +1 -1
  11. package/dist/bin.js +108 -76
  12. package/dist/bin.js.map +1 -1
  13. package/dist/budget.d.ts +64 -0
  14. package/dist/budget.d.ts.map +1 -0
  15. package/dist/budget.js +157 -0
  16. package/dist/budget.js.map +1 -0
  17. package/dist/checkpoint.d.ts +63 -30
  18. package/dist/checkpoint.d.ts.map +1 -1
  19. package/dist/checkpoint.js +249 -150
  20. package/dist/checkpoint.js.map +1 -1
  21. package/dist/circuit-breaker/breaker.js.map +1 -1
  22. package/dist/config.d.ts +86 -81
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +237 -305
  25. package/dist/config.js.map +1 -1
  26. package/dist/cost.d.ts +114 -0
  27. package/dist/cost.d.ts.map +1 -0
  28. package/dist/cost.js +499 -0
  29. package/dist/cost.js.map +1 -0
  30. package/dist/diff.d.ts.map +1 -1
  31. package/dist/diff.js +53 -11
  32. package/dist/diff.js.map +1 -1
  33. package/dist/errors.d.ts.map +1 -1
  34. package/dist/errors.js +33 -6
  35. package/dist/errors.js.map +1 -1
  36. package/dist/files.js.map +1 -1
  37. package/dist/fleet.d.ts +30 -0
  38. package/dist/fleet.d.ts.map +1 -0
  39. package/dist/fleet.js +86 -0
  40. package/dist/fleet.js.map +1 -0
  41. package/dist/fuzzy-search.d.ts.map +1 -1
  42. package/dist/fuzzy-search.js +2 -1
  43. package/dist/fuzzy-search.js.map +1 -1
  44. package/dist/git-status.js.map +1 -1
  45. package/dist/headless.d.ts +1 -2
  46. package/dist/headless.d.ts.map +1 -1
  47. package/dist/headless.js +222 -26
  48. package/dist/headless.js.map +1 -1
  49. package/dist/hooks.d.ts +8 -2
  50. package/dist/hooks.d.ts.map +1 -1
  51. package/dist/hooks.js +97 -11
  52. package/dist/hooks.js.map +1 -1
  53. package/dist/hud/api.d.ts +3 -18
  54. package/dist/hud/api.d.ts.map +1 -1
  55. package/dist/hud/api.js +9 -352
  56. package/dist/hud/api.js.map +1 -1
  57. package/dist/hud/palettes.d.ts.map +1 -1
  58. package/dist/hud/palettes.js +0 -180
  59. package/dist/hud/palettes.js.map +1 -1
  60. package/dist/hud/skins.d.ts.map +1 -1
  61. package/dist/hud/skins.js +0 -263
  62. package/dist/hud/skins.js.map +1 -1
  63. package/dist/hud/types.d.ts +2 -5
  64. package/dist/hud/types.d.ts.map +1 -1
  65. package/dist/index.d.ts +1 -4
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +1 -4
  68. package/dist/index.js.map +1 -1
  69. package/dist/iteration-ledger.d.ts.map +1 -1
  70. package/dist/iteration-ledger.js +3 -2
  71. package/dist/iteration-ledger.js.map +1 -1
  72. package/dist/local-model.d.ts +150 -0
  73. package/dist/local-model.d.ts.map +1 -0
  74. package/dist/local-model.js +408 -0
  75. package/dist/local-model.js.map +1 -0
  76. package/dist/markdown.d.ts.map +1 -1
  77. package/dist/markdown.js +32 -10
  78. package/dist/markdown.js.map +1 -1
  79. package/dist/mcp.d.ts +35 -5
  80. package/dist/mcp.d.ts.map +1 -1
  81. package/dist/mcp.js +190 -13
  82. package/dist/mcp.js.map +1 -1
  83. package/dist/memory.d.ts.map +1 -1
  84. package/dist/memory.js +6 -4
  85. package/dist/memory.js.map +1 -1
  86. package/dist/model-detection.d.ts +14 -1
  87. package/dist/model-detection.d.ts.map +1 -1
  88. package/dist/model-detection.js +308 -115
  89. package/dist/model-detection.js.map +1 -1
  90. package/dist/parallel-tools.d.ts +9 -1
  91. package/dist/parallel-tools.d.ts.map +1 -1
  92. package/dist/parallel-tools.js +6 -5
  93. package/dist/parallel-tools.js.map +1 -1
  94. package/dist/plugins.d.ts +68 -0
  95. package/dist/plugins.d.ts.map +1 -1
  96. package/dist/plugins.js +201 -3
  97. package/dist/plugins.js.map +1 -1
  98. package/dist/policy.d.ts +43 -0
  99. package/dist/policy.d.ts.map +1 -0
  100. package/dist/policy.js +139 -0
  101. package/dist/policy.js.map +1 -0
  102. package/dist/project-config.d.ts +1 -2
  103. package/dist/project-config.d.ts.map +1 -1
  104. package/dist/project-config.js +0 -3
  105. package/dist/project-config.js.map +1 -1
  106. package/dist/providers/anthropic.d.ts.map +1 -1
  107. package/dist/providers/anthropic.js +36 -2
  108. package/dist/providers/anthropic.js.map +1 -1
  109. package/dist/providers/bedrock.d.ts.map +1 -1
  110. package/dist/providers/bedrock.js +83 -22
  111. package/dist/providers/bedrock.js.map +1 -1
  112. package/dist/providers/compat.d.ts +21 -0
  113. package/dist/providers/compat.d.ts.map +1 -1
  114. package/dist/providers/compat.js +176 -6
  115. package/dist/providers/compat.js.map +1 -1
  116. package/dist/providers/google.js.map +1 -1
  117. package/dist/providers/index.d.ts +19 -4
  118. package/dist/providers/index.d.ts.map +1 -1
  119. package/dist/providers/index.js +62 -9
  120. package/dist/providers/index.js.map +1 -1
  121. package/dist/providers/ollama.d.ts +2 -2
  122. package/dist/providers/ollama.d.ts.map +1 -1
  123. package/dist/providers/ollama.js +26 -6
  124. package/dist/providers/ollama.js.map +1 -1
  125. package/dist/providers/openai.d.ts.map +1 -1
  126. package/dist/providers/openai.js +14 -10
  127. package/dist/providers/openai.js.map +1 -1
  128. package/dist/providers/types.d.ts +8 -0
  129. package/dist/providers/types.d.ts.map +1 -1
  130. package/dist/providers/types.js +19 -10
  131. package/dist/providers/types.js.map +1 -1
  132. package/dist/replay.d.ts +37 -0
  133. package/dist/replay.d.ts.map +1 -0
  134. package/dist/replay.js +168 -0
  135. package/dist/replay.js.map +1 -0
  136. package/dist/risk.d.ts.map +1 -1
  137. package/dist/risk.js +15 -5
  138. package/dist/risk.js.map +1 -1
  139. package/dist/router.d.ts +133 -0
  140. package/dist/router.d.ts.map +1 -0
  141. package/dist/{model-router.js → router.js} +336 -10
  142. package/dist/router.js.map +1 -0
  143. package/dist/runlog.d.ts +185 -0
  144. package/dist/runlog.d.ts.map +1 -0
  145. package/dist/runlog.js +398 -0
  146. package/dist/runlog.js.map +1 -0
  147. package/dist/{sandbox.d.ts → sandbox/docker.d.ts} +1 -1
  148. package/dist/sandbox/docker.d.ts.map +1 -0
  149. package/dist/{sandbox.js → sandbox/docker.js} +1 -1
  150. package/dist/sandbox/docker.js.map +1 -0
  151. package/dist/sandbox/index.d.ts +36 -0
  152. package/dist/sandbox/index.d.ts.map +1 -0
  153. package/dist/sandbox/index.js +62 -0
  154. package/dist/sandbox/index.js.map +1 -0
  155. package/dist/{sandbox-native.d.ts → sandbox/native.d.ts} +2 -1
  156. package/dist/sandbox/native.d.ts.map +1 -0
  157. package/dist/{sandbox-native.js → sandbox/native.js} +38 -6
  158. package/dist/sandbox/native.js.map +1 -0
  159. package/dist/scope.d.ts +10 -0
  160. package/dist/scope.d.ts.map +1 -1
  161. package/dist/scope.js +76 -16
  162. package/dist/scope.js.map +1 -1
  163. package/dist/scuttlebot/client.d.ts +83 -0
  164. package/dist/scuttlebot/client.d.ts.map +1 -0
  165. package/dist/scuttlebot/client.js +350 -0
  166. package/dist/scuttlebot/client.js.map +1 -0
  167. package/dist/scuttlebot/config.d.ts +28 -0
  168. package/dist/scuttlebot/config.d.ts.map +1 -0
  169. package/dist/scuttlebot/config.js +91 -0
  170. package/dist/scuttlebot/config.js.map +1 -0
  171. package/dist/scuttlebot/http-client.d.ts +63 -0
  172. package/dist/scuttlebot/http-client.d.ts.map +1 -0
  173. package/dist/scuttlebot/http-client.js +124 -0
  174. package/dist/scuttlebot/http-client.js.map +1 -0
  175. package/dist/scuttlebot/index.d.ts +13 -0
  176. package/dist/scuttlebot/index.d.ts.map +1 -0
  177. package/dist/scuttlebot/index.js +10 -0
  178. package/dist/scuttlebot/index.js.map +1 -0
  179. package/dist/scuttlebot/irc-client.d.ts +124 -0
  180. package/dist/scuttlebot/irc-client.d.ts.map +1 -0
  181. package/dist/scuttlebot/irc-client.js +599 -0
  182. package/dist/scuttlebot/irc-client.js.map +1 -0
  183. package/dist/setup.d.ts.map +1 -1
  184. package/dist/setup.js +22 -54
  185. package/dist/setup.js.map +1 -1
  186. package/dist/skills.d.ts +58 -0
  187. package/dist/skills.d.ts.map +1 -1
  188. package/dist/skills.js +186 -16
  189. package/dist/skills.js.map +1 -1
  190. package/dist/storage.d.ts +0 -4
  191. package/dist/storage.d.ts.map +1 -1
  192. package/dist/storage.js +87 -8
  193. package/dist/storage.js.map +1 -1
  194. package/dist/streaming.d.ts +25 -0
  195. package/dist/streaming.d.ts.map +1 -1
  196. package/dist/streaming.js +59 -0
  197. package/dist/streaming.js.map +1 -1
  198. package/dist/styles.d.ts +6 -0
  199. package/dist/styles.d.ts.map +1 -1
  200. package/dist/styles.js +11 -0
  201. package/dist/styles.js.map +1 -1
  202. package/dist/summarization.js.map +1 -1
  203. package/dist/terminal-image.js +1 -1
  204. package/dist/terminal-image.js.map +1 -1
  205. package/dist/themes.d.ts +5 -4
  206. package/dist/themes.d.ts.map +1 -1
  207. package/dist/themes.js +35 -90
  208. package/dist/themes.js.map +1 -1
  209. package/dist/tools.d.ts +27 -3
  210. package/dist/tools.d.ts.map +1 -1
  211. package/dist/tools.js +352 -209
  212. package/dist/tools.js.map +1 -1
  213. package/dist/trust.d.ts +16 -3
  214. package/dist/trust.d.ts.map +1 -1
  215. package/dist/trust.js +23 -4
  216. package/dist/trust.js.map +1 -1
  217. package/dist/types.d.ts +4 -3
  218. package/dist/types.d.ts.map +1 -1
  219. package/dist/types.js +34 -44
  220. package/dist/types.js.map +1 -1
  221. package/dist/ui/agent.d.ts +4 -7
  222. package/dist/ui/agent.d.ts.map +1 -1
  223. package/dist/ui/agent.js +354 -73
  224. package/dist/ui/agent.js.map +1 -1
  225. package/dist/ui/animations.d.ts +37 -0
  226. package/dist/ui/animations.d.ts.map +1 -0
  227. package/dist/ui/animations.js +227 -0
  228. package/dist/ui/animations.js.map +1 -0
  229. package/dist/ui/chat-input-keys.d.ts +42 -0
  230. package/dist/ui/chat-input-keys.d.ts.map +1 -0
  231. package/dist/ui/chat-input-keys.js +360 -0
  232. package/dist/ui/chat-input-keys.js.map +1 -0
  233. package/dist/ui/chat-input.d.ts +5 -2
  234. package/dist/ui/chat-input.d.ts.map +1 -1
  235. package/dist/ui/chat-input.js +54 -308
  236. package/dist/ui/chat-input.js.map +1 -1
  237. package/dist/ui/commands.d.ts +15 -45
  238. package/dist/ui/commands.d.ts.map +1 -1
  239. package/dist/ui/commands.js +461 -2636
  240. package/dist/ui/commands.js.map +1 -1
  241. package/dist/ui/completions.d.ts +1 -0
  242. package/dist/ui/completions.d.ts.map +1 -1
  243. package/dist/ui/completions.js +36 -107
  244. package/dist/ui/completions.js.map +1 -1
  245. package/dist/ui/components.d.ts +14 -6
  246. package/dist/ui/components.d.ts.map +1 -1
  247. package/dist/ui/components.js +17 -226
  248. package/dist/ui/components.js.map +1 -1
  249. package/dist/ui/context.js +6 -6
  250. package/dist/ui/context.js.map +1 -1
  251. package/dist/ui/debug-log.d.ts +11 -0
  252. package/dist/ui/debug-log.d.ts.map +1 -0
  253. package/dist/ui/debug-log.js +21 -0
  254. package/dist/ui/debug-log.js.map +1 -0
  255. package/dist/ui/error-boundary.d.ts.map +1 -1
  256. package/dist/ui/error-boundary.js.map +1 -1
  257. package/dist/ui/frame.d.ts.map +1 -1
  258. package/dist/ui/frame.js +1 -3
  259. package/dist/ui/frame.js.map +1 -1
  260. package/dist/ui/index.d.ts +11 -3
  261. package/dist/ui/index.d.ts.map +1 -1
  262. package/dist/ui/index.js +46 -887
  263. package/dist/ui/index.js.map +1 -1
  264. package/dist/ui/input-utils.d.ts +20 -0
  265. package/dist/ui/input-utils.d.ts.map +1 -0
  266. package/dist/ui/input-utils.js +35 -0
  267. package/dist/ui/input-utils.js.map +1 -0
  268. package/dist/ui/messages.d.ts +8 -7
  269. package/dist/ui/messages.d.ts.map +1 -1
  270. package/dist/ui/messages.js +51 -35
  271. package/dist/ui/messages.js.map +1 -1
  272. package/dist/ui/modals/index.d.ts +11 -0
  273. package/dist/ui/modals/index.d.ts.map +1 -0
  274. package/dist/ui/modals/index.js +10 -0
  275. package/dist/ui/modals/index.js.map +1 -0
  276. package/dist/ui/{modals.d.ts → modals/prompts.d.ts} +5 -20
  277. package/dist/ui/modals/prompts.d.ts.map +1 -0
  278. package/dist/ui/{modals.js → modals/prompts.js} +14 -94
  279. package/dist/ui/modals/prompts.js.map +1 -0
  280. package/dist/ui/modals/selectors.d.ts +33 -0
  281. package/dist/ui/modals/selectors.d.ts.map +1 -0
  282. package/dist/ui/modals/selectors.js +111 -0
  283. package/dist/ui/modals/selectors.js.map +1 -0
  284. package/dist/ui/modals/setup.d.ts +17 -0
  285. package/dist/ui/modals/setup.d.ts.map +1 -0
  286. package/dist/ui/modals/setup.js +51 -0
  287. package/dist/ui/modals/setup.js.map +1 -0
  288. package/dist/ui/regions/input-region.d.ts +40 -0
  289. package/dist/ui/regions/input-region.d.ts.map +1 -0
  290. package/dist/ui/regions/input-region.js +116 -0
  291. package/dist/ui/regions/input-region.js.map +1 -0
  292. package/dist/ui/regions/modal-host.d.ts +41 -0
  293. package/dist/ui/regions/modal-host.d.ts.map +1 -0
  294. package/dist/ui/regions/modal-host.js +51 -0
  295. package/dist/ui/regions/modal-host.js.map +1 -0
  296. package/dist/ui/regions/render-probe.d.ts +22 -0
  297. package/dist/ui/regions/render-probe.d.ts.map +1 -0
  298. package/dist/ui/regions/render-probe.js +45 -0
  299. package/dist/ui/regions/render-probe.js.map +1 -0
  300. package/dist/ui/regions/static-scrollback.d.ts +39 -0
  301. package/dist/ui/regions/static-scrollback.d.ts.map +1 -0
  302. package/dist/ui/regions/static-scrollback.js +68 -0
  303. package/dist/ui/regions/static-scrollback.js.map +1 -0
  304. package/dist/ui/regions/status-region.d.ts +24 -0
  305. package/dist/ui/regions/status-region.d.ts.map +1 -0
  306. package/dist/ui/regions/status-region.js +17 -0
  307. package/dist/ui/regions/status-region.js.map +1 -0
  308. package/dist/ui/regions/transcript-region.d.ts +41 -0
  309. package/dist/ui/regions/transcript-region.d.ts.map +1 -0
  310. package/dist/ui/regions/transcript-region.js +52 -0
  311. package/dist/ui/regions/transcript-region.js.map +1 -0
  312. package/dist/ui/self-restart.d.ts +9 -0
  313. package/dist/ui/self-restart.d.ts.map +1 -0
  314. package/dist/ui/self-restart.js +24 -0
  315. package/dist/ui/self-restart.js.map +1 -0
  316. package/dist/ui/state/use-chat-controller.d.ts +23 -0
  317. package/dist/ui/state/use-chat-controller.d.ts.map +1 -0
  318. package/dist/ui/state/use-chat-controller.js +643 -0
  319. package/dist/ui/state/use-chat-controller.js.map +1 -0
  320. package/dist/ui/state/use-loop-state.d.ts +23 -0
  321. package/dist/ui/state/use-loop-state.d.ts.map +1 -0
  322. package/dist/ui/state/use-loop-state.js +39 -0
  323. package/dist/ui/state/use-loop-state.js.map +1 -0
  324. package/dist/ui/state/use-modal-state.d.ts +52 -0
  325. package/dist/ui/state/use-modal-state.d.ts.map +1 -0
  326. package/dist/ui/state/use-modal-state.js +44 -0
  327. package/dist/ui/state/use-modal-state.js.map +1 -0
  328. package/dist/ui/state/use-model-state.d.ts +29 -0
  329. package/dist/ui/state/use-model-state.d.ts.map +1 -0
  330. package/dist/ui/state/use-model-state.js +47 -0
  331. package/dist/ui/state/use-model-state.js.map +1 -0
  332. package/dist/ui/state/use-processing-state.d.ts +24 -0
  333. package/dist/ui/state/use-processing-state.d.ts.map +1 -0
  334. package/dist/ui/state/use-processing-state.js +46 -0
  335. package/dist/ui/state/use-processing-state.js.map +1 -0
  336. package/dist/ui/state/use-queue-state.d.ts +19 -0
  337. package/dist/ui/state/use-queue-state.d.ts.map +1 -0
  338. package/dist/ui/state/use-queue-state.js +30 -0
  339. package/dist/ui/state/use-queue-state.js.map +1 -0
  340. package/dist/ui/state/use-session-init.d.ts +22 -0
  341. package/dist/ui/state/use-session-init.d.ts.map +1 -0
  342. package/dist/ui/state/use-session-init.js +77 -0
  343. package/dist/ui/state/use-session-init.js.map +1 -0
  344. package/dist/ui/state/use-session-stats.d.ts +16 -0
  345. package/dist/ui/state/use-session-stats.d.ts.map +1 -0
  346. package/dist/ui/state/use-session-stats.js +18 -0
  347. package/dist/ui/state/use-session-stats.js.map +1 -0
  348. package/dist/ui/state/use-terminal-width.d.ts +8 -0
  349. package/dist/ui/state/use-terminal-width.d.ts.map +1 -0
  350. package/dist/ui/state/use-terminal-width.js +22 -0
  351. package/dist/ui/state/use-terminal-width.js.map +1 -0
  352. package/dist/ui/state/use-transcript-state.d.ts +21 -0
  353. package/dist/ui/state/use-transcript-state.d.ts.map +1 -0
  354. package/dist/ui/state/use-transcript-state.js +49 -0
  355. package/dist/ui/state/use-transcript-state.js.map +1 -0
  356. package/dist/ui/status-bar.d.ts +4 -1
  357. package/dist/ui/status-bar.d.ts.map +1 -1
  358. package/dist/ui/status-bar.js +13 -3
  359. package/dist/ui/status-bar.js.map +1 -1
  360. package/dist/ui/types.d.ts +3 -0
  361. package/dist/ui/types.d.ts.map +1 -1
  362. package/dist/version-check.d.ts.map +1 -1
  363. package/dist/version-check.js +10 -0
  364. package/dist/version-check.js.map +1 -1
  365. package/package.json +12 -8
  366. package/dist/agents/agent-config-loader.d.ts +0 -60
  367. package/dist/agents/agent-config-loader.d.ts.map +0 -1
  368. package/dist/agents/agent-config-loader.js +0 -402
  369. package/dist/agents/agent-config-loader.js.map +0 -1
  370. package/dist/agents/agent-config-presets.d.ts +0 -10
  371. package/dist/agents/agent-config-presets.d.ts.map +0 -1
  372. package/dist/agents/agent-config-presets.js +0 -940
  373. package/dist/agents/agent-config-presets.js.map +0 -1
  374. package/dist/agents/agent-config-types.d.ts +0 -145
  375. package/dist/agents/agent-config-types.d.ts.map +0 -1
  376. package/dist/agents/agent-config-types.js +0 -12
  377. package/dist/agents/agent-config-types.js.map +0 -1
  378. package/dist/agents/agent-detection.d.ts +0 -35
  379. package/dist/agents/agent-detection.d.ts.map +0 -1
  380. package/dist/agents/agent-detection.js +0 -110
  381. package/dist/agents/agent-detection.js.map +0 -1
  382. package/dist/agents/aggregator.d.ts +0 -19
  383. package/dist/agents/aggregator.d.ts.map +0 -1
  384. package/dist/agents/aggregator.js +0 -141
  385. package/dist/agents/aggregator.js.map +0 -1
  386. package/dist/agents/cli-backend.d.ts +0 -32
  387. package/dist/agents/cli-backend.d.ts.map +0 -1
  388. package/dist/agents/cli-backend.js +0 -271
  389. package/dist/agents/cli-backend.js.map +0 -1
  390. package/dist/agents/council-types.d.ts +0 -115
  391. package/dist/agents/council-types.d.ts.map +0 -1
  392. package/dist/agents/council-types.js +0 -81
  393. package/dist/agents/council-types.js.map +0 -1
  394. package/dist/agents/council.d.ts +0 -112
  395. package/dist/agents/council.d.ts.map +0 -1
  396. package/dist/agents/council.js +0 -722
  397. package/dist/agents/council.js.map +0 -1
  398. package/dist/agents/decomposer.d.ts +0 -33
  399. package/dist/agents/decomposer.d.ts.map +0 -1
  400. package/dist/agents/decomposer.js +0 -138
  401. package/dist/agents/decomposer.js.map +0 -1
  402. package/dist/agents/dynamic-tools.d.ts +0 -52
  403. package/dist/agents/dynamic-tools.d.ts.map +0 -1
  404. package/dist/agents/dynamic-tools.js +0 -395
  405. package/dist/agents/dynamic-tools.js.map +0 -1
  406. package/dist/agents/index.d.ts +0 -29
  407. package/dist/agents/index.d.ts.map +0 -1
  408. package/dist/agents/index.js +0 -29
  409. package/dist/agents/index.js.map +0 -1
  410. package/dist/agents/installer.d.ts +0 -39
  411. package/dist/agents/installer.d.ts.map +0 -1
  412. package/dist/agents/installer.js +0 -205
  413. package/dist/agents/installer.js.map +0 -1
  414. package/dist/agents/orchestrator.d.ts +0 -106
  415. package/dist/agents/orchestrator.d.ts.map +0 -1
  416. package/dist/agents/orchestrator.js +0 -363
  417. package/dist/agents/orchestrator.js.map +0 -1
  418. package/dist/agents/sdk-backend.d.ts +0 -63
  419. package/dist/agents/sdk-backend.d.ts.map +0 -1
  420. package/dist/agents/sdk-backend.js +0 -489
  421. package/dist/agents/sdk-backend.js.map +0 -1
  422. package/dist/agents/swarm-types.d.ts +0 -84
  423. package/dist/agents/swarm-types.d.ts.map +0 -1
  424. package/dist/agents/swarm-types.js +0 -20
  425. package/dist/agents/swarm-types.js.map +0 -1
  426. package/dist/agents/swarm.d.ts +0 -79
  427. package/dist/agents/swarm.d.ts.map +0 -1
  428. package/dist/agents/swarm.js +0 -375
  429. package/dist/agents/swarm.js.map +0 -1
  430. package/dist/agents/tools.d.ts +0 -26
  431. package/dist/agents/tools.d.ts.map +0 -1
  432. package/dist/agents/tools.js +0 -776
  433. package/dist/agents/tools.js.map +0 -1
  434. package/dist/agents/types.d.ts +0 -108
  435. package/dist/agents/types.d.ts.map +0 -1
  436. package/dist/agents/types.js +0 -43
  437. package/dist/agents/types.js.map +0 -1
  438. package/dist/api-server.d.ts +0 -36
  439. package/dist/api-server.d.ts.map +0 -1
  440. package/dist/api-server.js +0 -255
  441. package/dist/api-server.js.map +0 -1
  442. package/dist/auto-checkpoint.d.ts +0 -35
  443. package/dist/auto-checkpoint.d.ts.map +0 -1
  444. package/dist/auto-checkpoint.js +0 -143
  445. package/dist/auto-checkpoint.js.map +0 -1
  446. package/dist/background-jobs.d.ts +0 -45
  447. package/dist/background-jobs.d.ts.map +0 -1
  448. package/dist/background-jobs.js +0 -127
  449. package/dist/background-jobs.js.map +0 -1
  450. package/dist/branching.d.ts +0 -56
  451. package/dist/branching.d.ts.map +0 -1
  452. package/dist/branching.js +0 -211
  453. package/dist/branching.js.map +0 -1
  454. package/dist/cli/agent.d.ts +0 -9
  455. package/dist/cli/agent.d.ts.map +0 -1
  456. package/dist/cli/agent.js +0 -314
  457. package/dist/cli/agent.js.map +0 -1
  458. package/dist/cli/commands.d.ts +0 -12
  459. package/dist/cli/commands.d.ts.map +0 -1
  460. package/dist/cli/commands.js +0 -943
  461. package/dist/cli/commands.js.map +0 -1
  462. package/dist/cli/index.d.ts +0 -8
  463. package/dist/cli/index.d.ts.map +0 -1
  464. package/dist/cli/index.js +0 -237
  465. package/dist/cli/index.js.map +0 -1
  466. package/dist/cli/types.d.ts +0 -33
  467. package/dist/cli/types.d.ts.map +0 -1
  468. package/dist/cli/types.js +0 -21
  469. package/dist/cli/types.js.map +0 -1
  470. package/dist/companions.d.ts +0 -54
  471. package/dist/companions.d.ts.map +0 -1
  472. package/dist/companions.js +0 -440
  473. package/dist/companions.js.map +0 -1
  474. package/dist/completion.d.ts +0 -75
  475. package/dist/completion.d.ts.map +0 -1
  476. package/dist/completion.js +0 -234
  477. package/dist/completion.js.map +0 -1
  478. package/dist/file-watcher.d.ts +0 -91
  479. package/dist/file-watcher.d.ts.map +0 -1
  480. package/dist/file-watcher.js +0 -269
  481. package/dist/file-watcher.js.map +0 -1
  482. package/dist/hud/theme-packs/api.d.ts +0 -51
  483. package/dist/hud/theme-packs/api.d.ts.map +0 -1
  484. package/dist/hud/theme-packs/api.js +0 -145
  485. package/dist/hud/theme-packs/api.js.map +0 -1
  486. package/dist/hud/theme-packs/index.d.ts +0 -18
  487. package/dist/hud/theme-packs/index.d.ts.map +0 -1
  488. package/dist/hud/theme-packs/index.js +0 -38
  489. package/dist/hud/theme-packs/index.js.map +0 -1
  490. package/dist/hud/theme-packs/types.d.ts +0 -29
  491. package/dist/hud/theme-packs/types.d.ts.map +0 -1
  492. package/dist/hud/theme-packs/types.js +0 -9
  493. package/dist/hud/theme-packs/types.js.map +0 -1
  494. package/dist/idle-eviction.d.ts +0 -34
  495. package/dist/idle-eviction.d.ts.map +0 -1
  496. package/dist/idle-eviction.js +0 -78
  497. package/dist/idle-eviction.js.map +0 -1
  498. package/dist/keyboard.d.ts +0 -57
  499. package/dist/keyboard.d.ts.map +0 -1
  500. package/dist/keyboard.js +0 -265
  501. package/dist/keyboard.js.map +0 -1
  502. package/dist/model-router.d.ts +0 -67
  503. package/dist/model-router.d.ts.map +0 -1
  504. package/dist/model-router.js.map +0 -1
  505. package/dist/providers/openai-compat-shims.d.ts +0 -31
  506. package/dist/providers/openai-compat-shims.d.ts.map +0 -1
  507. package/dist/providers/openai-compat-shims.js +0 -179
  508. package/dist/providers/openai-compat-shims.js.map +0 -1
  509. package/dist/sandbox-native.d.ts.map +0 -1
  510. package/dist/sandbox-native.js.map +0 -1
  511. package/dist/sandbox.d.ts.map +0 -1
  512. package/dist/sandbox.js.map +0 -1
  513. package/dist/session-timeout.d.ts +0 -31
  514. package/dist/session-timeout.d.ts.map +0 -1
  515. package/dist/session-timeout.js +0 -100
  516. package/dist/session-timeout.js.map +0 -1
  517. package/dist/smart-router.d.ts +0 -73
  518. package/dist/smart-router.d.ts.map +0 -1
  519. package/dist/smart-router.js +0 -332
  520. package/dist/smart-router.js.map +0 -1
  521. package/dist/terminal-recording.d.ts +0 -55
  522. package/dist/terminal-recording.d.ts.map +0 -1
  523. package/dist/terminal-recording.js +0 -182
  524. package/dist/terminal-recording.js.map +0 -1
  525. package/dist/tmux.d.ts +0 -35
  526. package/dist/tmux.d.ts.map +0 -1
  527. package/dist/tmux.js +0 -106
  528. package/dist/tmux.js.map +0 -1
  529. package/dist/ui/modals.d.ts.map +0 -1
  530. package/dist/ui/modals.js.map +0 -1
  531. package/dist/ui/pack-picker.d.ts +0 -12
  532. package/dist/ui/pack-picker.d.ts.map +0 -1
  533. package/dist/ui/pack-picker.js +0 -101
  534. package/dist/ui/pack-picker.js.map +0 -1
  535. package/dist/ui/theme-picker.d.ts +0 -24
  536. package/dist/ui/theme-picker.d.ts.map +0 -1
  537. package/dist/ui/theme-picker.js +0 -190
  538. package/dist/ui/theme-picker.js.map +0 -1
@@ -1,722 +0,0 @@
1
- /**
2
- * Calliope Agents — Council Manager
3
- *
4
- * Coordinates groups of agents deliberating on a shared goal.
5
- * Supports competitive, collaborative, consensus, and overseer modes.
6
- */
7
- import { randomUUID } from 'crypto';
8
- import { DEFAULT_COUNCIL_CONFIG, COUNCIL_TEMPLATES } from './council-types.js';
9
- import { orchestrator } from './orchestrator.js';
10
- import { swarmManager } from './swarm.js';
11
- /**
12
- * Council Manager - Singleton
13
- */
14
- class CouncilManager {
15
- sessions = new Map();
16
- /**
17
- * Start a new council session
18
- */
19
- async startCouncil(prompt, config, cwd) {
20
- const mergedConfig = {
21
- ...DEFAULT_COUNCIL_CONFIG,
22
- ...config,
23
- };
24
- const session = {
25
- id: randomUUID(),
26
- prompt,
27
- status: 'deliberating',
28
- config: mergedConfig,
29
- deliberations: [],
30
- votes: [],
31
- scores: [],
32
- round: 1,
33
- activeTaskIds: [],
34
- createdAt: new Date(),
35
- updatedAt: new Date(),
36
- };
37
- this.sessions.set(session.id, session);
38
- // Start council lifecycle
39
- this.runCouncilLifecycle(session, cwd).catch(err => {
40
- if (this.isCancelled(session)) {
41
- return;
42
- }
43
- session.status = 'failed';
44
- session.error = err instanceof Error ? err.message : String(err);
45
- session.completedAt = new Date();
46
- session.updatedAt = new Date();
47
- });
48
- return session;
49
- }
50
- /**
51
- * Start a council from a template
52
- */
53
- async startFromTemplate(templateName, prompt, cwd) {
54
- const template = COUNCIL_TEMPLATES[templateName];
55
- if (!template) {
56
- throw new Error(`Unknown council template: ${templateName}. Available: ${Object.keys(COUNCIL_TEMPLATES).join(', ')}`);
57
- }
58
- const members = template.members.map(m => ({
59
- ...m,
60
- id: randomUUID(),
61
- }));
62
- const fullPrompt = template.promptPrefix
63
- ? `${template.promptPrefix}${prompt}`
64
- : prompt;
65
- return this.startCouncil(fullPrompt, {
66
- mode: template.mode,
67
- members,
68
- tieBreaker: template.tieBreaker,
69
- }, cwd);
70
- }
71
- /**
72
- * Get a council session
73
- */
74
- getSession(sessionId) {
75
- return this.sessions.get(sessionId);
76
- }
77
- /**
78
- * Get all sessions
79
- */
80
- getAllSessions() {
81
- return Array.from(this.sessions.values());
82
- }
83
- /**
84
- * Cancel a council session
85
- */
86
- async cancelCouncil(sessionId) {
87
- const session = this.sessions.get(sessionId);
88
- if (!session)
89
- return false;
90
- session.status = 'cancelled';
91
- session.updatedAt = new Date();
92
- await this.cancelTrackedTasks(session);
93
- if (session.linkedSwarmId) {
94
- try {
95
- await swarmManager.cancelSwarm(session.linkedSwarmId);
96
- }
97
- catch {
98
- // Best effort cancellation
99
- }
100
- session.linkedSwarmId = undefined;
101
- }
102
- session.completedAt = new Date();
103
- session.updatedAt = new Date();
104
- return true;
105
- }
106
- /**
107
- * Get council statistics
108
- */
109
- getStats() {
110
- const all = Array.from(this.sessions.values());
111
- return {
112
- totalSessions: all.length,
113
- activeSessions: all.filter(s => !['completed', 'failed', 'cancelled'].includes(s.status)).length,
114
- completedSessions: all.filter(s => s.status === 'completed').length,
115
- failedSessions: all.filter(s => s.status === 'failed').length,
116
- };
117
- }
118
- /**
119
- * Run the council lifecycle based on mode
120
- */
121
- async runCouncilLifecycle(session, cwd) {
122
- try {
123
- switch (session.config.mode) {
124
- case 'competitive':
125
- await this.runCompetitive(session, cwd);
126
- break;
127
- case 'collaborative':
128
- await this.runCollaborative(session, cwd);
129
- break;
130
- case 'consensus':
131
- await this.runConsensus(session, cwd);
132
- break;
133
- case 'overseer':
134
- await this.runOverseer(session, cwd);
135
- break;
136
- }
137
- }
138
- catch (error) {
139
- if (this.isCancelled(session)) {
140
- session.completedAt = session.completedAt || new Date();
141
- session.updatedAt = new Date();
142
- return;
143
- }
144
- session.status = 'failed';
145
- session.error = error instanceof Error ? error.message : String(error);
146
- session.completedAt = new Date();
147
- session.updatedAt = new Date();
148
- }
149
- }
150
- /**
151
- * Competitive mode: All respond independently → cross-score → highest wins
152
- */
153
- async runCompetitive(session, cwd) {
154
- const { members } = session.config;
155
- // Phase 1: All members deliberate independently
156
- session.status = 'deliberating';
157
- session.updatedAt = new Date();
158
- const deliberationPromises = members.map(async (member) => {
159
- const roleContext = member.role
160
- ? `You are acting as ${member.role}. `
161
- : '';
162
- const prompt = `${roleContext}${session.prompt}`;
163
- try {
164
- const task = await this.runTrackedTask(session, prompt, member.agent, {
165
- priority: 'normal',
166
- cwd,
167
- });
168
- if (this.isCancelled(session) || task.status === 'cancelled') {
169
- return;
170
- }
171
- if (task.status !== 'completed') {
172
- session.deliberations.push({
173
- memberId: member.id,
174
- memberName: member.name,
175
- response: `Error: ${task.error || `Task ended with status: ${task.status}`}`,
176
- timestamp: new Date(),
177
- });
178
- return;
179
- }
180
- const entry = {
181
- memberId: member.id,
182
- memberName: member.name,
183
- response: task.result || '(no response)',
184
- timestamp: new Date(),
185
- };
186
- session.deliberations.push(entry);
187
- session.updatedAt = new Date();
188
- }
189
- catch (error) {
190
- if (this.isCancelled(session)) {
191
- return;
192
- }
193
- session.deliberations.push({
194
- memberId: member.id,
195
- memberName: member.name,
196
- response: `Error: ${error instanceof Error ? error.message : String(error)}`,
197
- timestamp: new Date(),
198
- });
199
- }
200
- });
201
- await Promise.allSettled(deliberationPromises);
202
- session.updatedAt = new Date();
203
- if (this.isCancelled(session))
204
- return;
205
- // Phase 2: Cross-scoring (LLM-based with heuristic fallback)
206
- session.status = 'scoring';
207
- session.updatedAt = new Date();
208
- const scoringResults = await this.crossScoreAsync(session, cwd);
209
- session.scores = scoringResults;
210
- if (this.isCancelled(session))
211
- return;
212
- // Phase 3: Select winner
213
- const winner = this.selectWinner(session);
214
- if (winner) {
215
- session.result = winner.response;
216
- session.winnerId = winner.memberId;
217
- }
218
- else {
219
- session.result = session.deliberations[0]?.response || 'No results';
220
- }
221
- session.status = 'completed';
222
- session.completedAt = new Date();
223
- session.updatedAt = new Date();
224
- }
225
- /**
226
- * Collaborative mode: Sequential building (A → B builds on A → C builds on B)
227
- */
228
- async runCollaborative(session, cwd) {
229
- const { members } = session.config;
230
- session.status = 'building';
231
- session.updatedAt = new Date();
232
- let accumulatedContext = '';
233
- for (const member of members) {
234
- if (this.isCancelled(session))
235
- return;
236
- const roleContext = member.role
237
- ? `You are acting as ${member.role}. `
238
- : '';
239
- let prompt;
240
- if (accumulatedContext) {
241
- prompt = `${roleContext}${session.prompt}\n\nPrevious contributions from the team:\n${accumulatedContext}\n\nBuild upon and improve the above contributions. Add your expertise and perspective.`;
242
- }
243
- else {
244
- prompt = `${roleContext}${session.prompt}\n\nYou are the first team member to respond. Provide a strong foundation.`;
245
- }
246
- try {
247
- const task = await this.runTrackedTask(session, prompt, member.agent, {
248
- priority: 'normal',
249
- cwd,
250
- });
251
- if (this.isCancelled(session) || task.status === 'cancelled') {
252
- return;
253
- }
254
- if (task.status !== 'completed') {
255
- session.deliberations.push({
256
- memberId: member.id,
257
- memberName: member.name,
258
- response: `Error: ${task.error || `Task ended with status: ${task.status}`}`,
259
- timestamp: new Date(),
260
- });
261
- continue;
262
- }
263
- const entry = {
264
- memberId: member.id,
265
- memberName: member.name,
266
- response: task.result || '(no response)',
267
- timestamp: new Date(),
268
- };
269
- session.deliberations.push(entry);
270
- accumulatedContext += `\n\n--- ${member.name} (${member.role || 'general'}) ---\n${task.result || '(no response)'}`;
271
- session.updatedAt = new Date();
272
- }
273
- catch (error) {
274
- if (this.isCancelled(session)) {
275
- return;
276
- }
277
- session.deliberations.push({
278
- memberId: member.id,
279
- memberName: member.name,
280
- response: `Error: ${error instanceof Error ? error.message : String(error)}`,
281
- timestamp: new Date(),
282
- });
283
- }
284
- }
285
- // The last response is the most refined version
286
- const lastEntry = session.deliberations[session.deliberations.length - 1];
287
- session.result = lastEntry?.response || 'No results';
288
- session.winnerId = lastEntry?.memberId;
289
- session.status = 'completed';
290
- session.completedAt = new Date();
291
- session.updatedAt = new Date();
292
- }
293
- /**
294
- * Consensus mode: Deliberate → vote → supermajority or repeat
295
- */
296
- async runConsensus(session, cwd) {
297
- const { members, maxRounds, consensusThreshold } = session.config;
298
- for (let round = 1; round <= maxRounds; round++) {
299
- session.round = round;
300
- session.status = 'deliberating';
301
- session.updatedAt = new Date();
302
- // Phase 1: Deliberate
303
- const previousContext = round > 1
304
- ? `\n\nPrevious round results:\n${session.deliberations.filter(d => d.votes !== undefined).map(d => `${d.memberName}: ${d.response.slice(0, 200)}... (${d.votes} votes)`).join('\n')}`
305
- : '';
306
- const deliberationPromises = members.map(async (member) => {
307
- const roleContext = member.role ? `You are ${member.role}. ` : '';
308
- const prompt = `${roleContext}${session.prompt}${previousContext}\n\nRound ${round}/${maxRounds}. Present your position concisely.`;
309
- try {
310
- const task = await this.runTrackedTask(session, prompt, member.agent, {
311
- priority: 'normal',
312
- cwd,
313
- });
314
- if (this.isCancelled(session) || task.status === 'cancelled') {
315
- return;
316
- }
317
- if (task.status !== 'completed') {
318
- session.deliberations.push({
319
- memberId: member.id,
320
- memberName: member.name,
321
- response: `Error: ${task.error || `Task ended with status: ${task.status}`}`,
322
- timestamp: new Date(),
323
- votes: 0,
324
- });
325
- return;
326
- }
327
- const entry = {
328
- memberId: member.id,
329
- memberName: member.name,
330
- response: task.result || '(no response)',
331
- timestamp: new Date(),
332
- votes: 0,
333
- };
334
- session.deliberations.push(entry);
335
- }
336
- catch (error) {
337
- if (this.isCancelled(session)) {
338
- return;
339
- }
340
- session.deliberations.push({
341
- memberId: member.id,
342
- memberName: member.name,
343
- response: `Error: ${error instanceof Error ? error.message : String(error)}`,
344
- timestamp: new Date(),
345
- votes: 0,
346
- });
347
- }
348
- });
349
- await Promise.allSettled(deliberationPromises);
350
- session.updatedAt = new Date();
351
- if (this.isCancelled(session))
352
- return;
353
- // Phase 2: Vote
354
- session.status = 'voting';
355
- session.updatedAt = new Date();
356
- // Each member votes for the best response (not their own)
357
- const roundEntries = session.deliberations.filter(d => d.votes !== undefined).slice(-members.length);
358
- for (const member of members) {
359
- const candidates = roundEntries.filter(e => e.memberId !== member.id);
360
- if (candidates.length === 0)
361
- continue;
362
- // Simple scoring: first candidate gets the vote (in a real system, the LLM would evaluate)
363
- // For now, use round-robin voting based on member weight
364
- const candidateIdx = members.indexOf(member) % candidates.length;
365
- const selected = candidates[candidateIdx];
366
- const vote = {
367
- voterId: member.id,
368
- candidateId: selected.memberId,
369
- weight: member.weight,
370
- };
371
- session.votes.push(vote);
372
- // Update vote count on the entry
373
- selected.votes = (selected.votes || 0) + member.weight;
374
- }
375
- // Check for consensus
376
- const totalWeight = members.reduce((sum, m) => sum + m.weight, 0);
377
- const bestEntry = roundEntries.reduce((best, entry) => (!best || (entry.votes || 0) > (best.votes || 0) ? entry : best), null);
378
- if (bestEntry && (bestEntry.votes || 0) / totalWeight >= consensusThreshold) {
379
- // Consensus reached
380
- session.result = bestEntry.response;
381
- session.winnerId = bestEntry.memberId;
382
- session.status = 'completed';
383
- session.completedAt = new Date();
384
- session.updatedAt = new Date();
385
- return;
386
- }
387
- }
388
- // No consensus after max rounds - use tie-breaker
389
- const finalResult = this.applyTieBreaker(session);
390
- session.result = finalResult?.response || session.deliberations[session.deliberations.length - 1]?.response || 'No consensus reached';
391
- session.winnerId = finalResult?.memberId;
392
- session.status = 'completed';
393
- session.completedAt = new Date();
394
- session.updatedAt = new Date();
395
- }
396
- /**
397
- * Overseer mode: Lead decomposes (Swarm), reviews results, makes final call
398
- */
399
- async runOverseer(session, cwd) {
400
- const { members } = session.config;
401
- const lead = members[0]; // First member is the overseer
402
- if (!lead) {
403
- throw new Error('Council needs at least one member for overseer mode');
404
- }
405
- // Phase 1: Overseer decomposes via swarm
406
- session.status = 'deliberating';
407
- session.updatedAt = new Date();
408
- const swarmSession = await swarmManager.startSwarm(session.prompt, { decomposition: 'parallel', aggregation: 'structured' }, cwd);
409
- session.linkedSwarmId = swarmSession.id;
410
- // Wait for swarm to complete (poll at 2s intervals).
411
- // Timeout scales with maxRounds (each round ≈ 5 min), minimum 5 minutes,
412
- // so large councils get proportionally more time to finish.
413
- const timeoutMs = Math.max(5 * 60_000, session.config.maxRounds * 5 * 60_000);
414
- const pollIntervalMs = 2000;
415
- const maxAttempts = Math.ceil(timeoutMs / pollIntervalMs);
416
- let attempts = 0;
417
- while (!this.isCancelled(session) &&
418
- !['completed', 'failed', 'cancelled'].includes(swarmSession.status) &&
419
- attempts < maxAttempts) {
420
- await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
421
- attempts++;
422
- }
423
- session.linkedSwarmId = undefined;
424
- if (this.isCancelled(session) || swarmSession.status === 'cancelled') {
425
- return;
426
- }
427
- if (swarmSession.status !== 'completed' || !swarmSession.result) {
428
- throw new Error(`Swarm decomposition failed: ${swarmSession.error || 'timeout'}`);
429
- }
430
- // Record swarm results as deliberation
431
- session.deliberations.push({
432
- memberId: 'swarm',
433
- memberName: 'Swarm Workers',
434
- response: swarmSession.result,
435
- timestamp: new Date(),
436
- });
437
- if (this.isCancelled(session)) {
438
- return;
439
- }
440
- // Phase 2: Overseer reviews
441
- session.status = 'reviewing';
442
- session.updatedAt = new Date();
443
- const reviewPrompt = `You are the overseer reviewing results from your team.
444
-
445
- Original task: ${session.prompt}
446
-
447
- Team results:
448
- ${swarmSession.result}
449
-
450
- Review these results. Synthesize, correct errors, fill gaps, and produce the final authoritative response.`;
451
- try {
452
- const reviewTask = await this.runTrackedTask(session, reviewPrompt, lead.agent, {
453
- priority: 'high',
454
- cwd,
455
- });
456
- if (this.isCancelled(session) || reviewTask.status === 'cancelled') {
457
- return;
458
- }
459
- if (reviewTask.status !== 'completed') {
460
- throw new Error(reviewTask.error || `Task ended with status: ${reviewTask.status}`);
461
- }
462
- session.deliberations.push({
463
- memberId: lead.id,
464
- memberName: lead.name,
465
- response: reviewTask.result || '(no review)',
466
- timestamp: new Date(),
467
- });
468
- session.result = reviewTask.result || swarmSession.result;
469
- session.winnerId = lead.id;
470
- }
471
- catch (error) {
472
- if (this.isCancelled(session)) {
473
- return;
474
- }
475
- // Fall back to swarm results
476
- session.result = swarmSession.result;
477
- session.error = `Overseer review failed: ${error instanceof Error ? error.message : String(error)}`;
478
- }
479
- session.status = 'completed';
480
- session.completedAt = new Date();
481
- session.updatedAt = new Date();
482
- }
483
- /**
484
- * LLM-based cross-scoring: spawns a scoring agent to evaluate responses.
485
- * Returns null if LLM scoring fails (caller should fall back to heuristic).
486
- */
487
- async llmCrossScore(session, cwd) {
488
- const entries = session.deliberations;
489
- if (entries.length === 0)
490
- return null;
491
- const responseSummaries = entries.map((entry, i) => `--- Response ${i + 1} (by ${entry.memberName}) ---\n${entry.response}`).join('\n\n');
492
- const scoringPrompt = `You are an impartial judge evaluating ${entries.length} responses to the following prompt:
493
-
494
- "${session.prompt}"
495
-
496
- Here are the responses:
497
-
498
- ${responseSummaries}
499
-
500
- Evaluate each response on correctness, completeness, and quality. Return ONLY a JSON array of scores (0-100), one per response, in the same order they were presented. Example for 3 responses: [85, 72, 90]
501
-
502
- Return ONLY the JSON array, no other text.`;
503
- try {
504
- const task = await this.runTrackedTask(session, scoringPrompt, 'calliope', {
505
- priority: 'normal',
506
- cwd,
507
- });
508
- if (this.isCancelled(session) || task.status === 'cancelled') {
509
- return null;
510
- }
511
- if (task.status !== 'completed') {
512
- return null;
513
- }
514
- const result = (task.result || '').trim();
515
- // Extract JSON array from response (handle markdown fences, leading text, etc.)
516
- const arrayMatch = result.match(/\[[\s\d,]+\]/);
517
- if (!arrayMatch)
518
- return null;
519
- const parsed = JSON.parse(arrayMatch[0]);
520
- if (!Array.isArray(parsed) || parsed.length !== entries.length)
521
- return null;
522
- // Validate all entries are numbers in range
523
- const numericScores = parsed.map((v) => {
524
- const n = Number(v);
525
- if (isNaN(n))
526
- throw new Error('non-numeric score');
527
- return Math.max(0, Math.min(100, Math.round(n)));
528
- });
529
- const scores = entries.map((entry, i) => {
530
- entry.score = numericScores[i];
531
- return {
532
- scorerId: 'llm',
533
- targetId: entry.memberId,
534
- score: numericScores[i],
535
- weight: 1.0,
536
- };
537
- });
538
- return scores;
539
- }
540
- catch {
541
- return null;
542
- }
543
- }
544
- async runTrackedTask(session, prompt, agent, options = {}) {
545
- const task = await orchestrator.spawnAgent(prompt, agent, {
546
- background: true,
547
- priority: options.priority,
548
- cwd: options.cwd,
549
- timeout: options.timeout,
550
- });
551
- this.trackTask(session, task.id);
552
- try {
553
- return await orchestrator.waitForTask(task.id);
554
- }
555
- finally {
556
- this.untrackTask(session, task.id);
557
- }
558
- }
559
- trackTask(session, taskId) {
560
- if (!session.activeTaskIds.includes(taskId)) {
561
- session.activeTaskIds.push(taskId);
562
- }
563
- }
564
- untrackTask(session, taskId) {
565
- const index = session.activeTaskIds.indexOf(taskId);
566
- if (index !== -1) {
567
- session.activeTaskIds.splice(index, 1);
568
- }
569
- }
570
- isCancelled(session) {
571
- return session.status === 'cancelled';
572
- }
573
- async cancelTrackedTasks(session) {
574
- const taskIds = [...session.activeTaskIds];
575
- session.activeTaskIds.length = 0;
576
- await Promise.allSettled(taskIds.map(taskId => orchestrator.cancelTask(taskId)));
577
- }
578
- /**
579
- * Heuristic cross-scoring fallback: scores based on response structure.
580
- */
581
- heuristicCrossScore(session) {
582
- const scores = [];
583
- const entries = session.deliberations;
584
- for (const entry of entries) {
585
- // Simple scoring based on response quality heuristics
586
- let score = 50; // Base score
587
- // Longer responses suggest more depth
588
- if (entry.response.length > 500)
589
- score += 15;
590
- else if (entry.response.length > 200)
591
- score += 10;
592
- else if (entry.response.length < 50)
593
- score -= 10;
594
- // Structured responses (headers, lists, code blocks)
595
- if (entry.response.includes('```'))
596
- score += 10;
597
- if (entry.response.match(/^[\-\*] /m))
598
- score += 5;
599
- if (entry.response.match(/^#+\s/m))
600
- score += 5;
601
- // Error responses get penalized
602
- if (entry.response.startsWith('Error:'))
603
- score = 10;
604
- entry.score = Math.max(0, Math.min(100, score));
605
- scores.push({
606
- scorerId: 'system',
607
- targetId: entry.memberId,
608
- score: entry.score,
609
- weight: 1.0,
610
- });
611
- }
612
- return scores;
613
- }
614
- /**
615
- * Cross-score deliberations (sync fallback for non-competitive callers).
616
- */
617
- crossScore(session) {
618
- return this.heuristicCrossScore(session);
619
- }
620
- /**
621
- * Async cross-scoring: tries LLM evaluation first, falls back to heuristics.
622
- */
623
- async crossScoreAsync(session, cwd) {
624
- if (this.isCancelled(session)) {
625
- return [];
626
- }
627
- const llmScores = await this.llmCrossScore(session, cwd);
628
- if (this.isCancelled(session)) {
629
- return [];
630
- }
631
- if (llmScores)
632
- return llmScores;
633
- return this.heuristicCrossScore(session);
634
- }
635
- /**
636
- * Select the winner based on scores
637
- */
638
- selectWinner(session) {
639
- if (session.deliberations.length === 0)
640
- return null;
641
- return session.deliberations.reduce((best, entry) => {
642
- const memberWeight = session.config.members.find(m => m.id === entry.memberId)?.weight || 1.0;
643
- const weightedScore = (entry.score || 0) * memberWeight;
644
- const bestWeightedScore = (best.score || 0) * (session.config.members.find(m => m.id === best.memberId)?.weight || 1.0);
645
- return weightedScore > bestWeightedScore ? entry : best;
646
- });
647
- }
648
- /**
649
- * Apply tie-breaker when consensus fails
650
- */
651
- applyTieBreaker(session) {
652
- const { tieBreaker, designatedBreaker, members } = session.config;
653
- const entries = session.deliberations;
654
- switch (tieBreaker) {
655
- case 'scoring': {
656
- // Use cross-scoring
657
- const scores = this.crossScore(session);
658
- return this.selectWinner(session);
659
- }
660
- case 'designated': {
661
- const designated = designatedBreaker || members[0]?.id;
662
- return entries.find(e => e.memberId === designated) || entries[0] || null;
663
- }
664
- case 'voting': {
665
- // Use existing votes
666
- return entries.reduce((best, entry) => (!best || (entry.votes || 0) > (best.votes || 0) ? entry : best), null);
667
- }
668
- case 'user':
669
- default:
670
- // Can't resolve automatically - return highest scored
671
- return this.selectWinner(session);
672
- }
673
- }
674
- /**
675
- * Format session status for display
676
- */
677
- formatSessionStatus(session) {
678
- const lines = [
679
- `Coordination: ${session.id.slice(0, 8)}`,
680
- `Mode: ${session.config.mode}`,
681
- `Status: ${session.status}`,
682
- `Agents: ${session.config.members.map(m => `${m.name} (${m.agent})`).join(', ')}`,
683
- `Round: ${session.round}`,
684
- ];
685
- if (session.deliberations.length > 0) {
686
- lines.push(`Deliberations: ${session.deliberations.length}`);
687
- for (const d of session.deliberations) {
688
- const scoreStr = d.score !== undefined ? ` [score: ${d.score}]` : '';
689
- const voteStr = d.votes !== undefined ? ` [votes: ${d.votes}]` : '';
690
- const winner = session.winnerId === d.memberId ? ' \u2605' : '';
691
- lines.push(` ${d.memberName}: ${d.response.slice(0, 60)}...${scoreStr}${voteStr}${winner}`);
692
- }
693
- }
694
- if (session.error) {
695
- lines.push(`Error: ${session.error}`);
696
- }
697
- return lines.join('\n');
698
- }
699
- /**
700
- * Get available templates
701
- */
702
- getTemplates() {
703
- return Object.values(COUNCIL_TEMPLATES);
704
- }
705
- /**
706
- * Reset all sessions
707
- */
708
- reset() {
709
- for (const session of this.sessions.values()) {
710
- void this.cancelTrackedTasks(session);
711
- if (session.linkedSwarmId) {
712
- void swarmManager.cancelSwarm(session.linkedSwarmId);
713
- }
714
- }
715
- this.sessions.clear();
716
- }
717
- }
718
- /**
719
- * Singleton council manager instance
720
- */
721
- export const councilManager = new CouncilManager();
722
- //# sourceMappingURL=council.js.map