@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
@@ -0,0 +1,643 @@
1
+ /**
2
+ * UI orchestration - chat controller
3
+ *
4
+ * Assembles every state group, the long-lived refs, the agent/command context
5
+ * builders, and all handlers, then returns flat prop bags for the four regions
6
+ * plus resetSession(). This is the "orchestration" half of the old TerminalChat
7
+ * body; index.tsx keeps only composition. It carries no JSX, so it is a plain
8
+ * module (not a component file).
9
+ */
10
+ import { useCallback, useEffect, useRef } from 'react';
11
+ import { useApp } from 'ink';
12
+ import * as config from '../../config.js';
13
+ import { selectProvider, ProviderUnavailableError } from '../../providers/index.js';
14
+ import { DEFAULT_MODELS, supportsVision } from '../../types.js';
15
+ import { getSystemPromptForProvider } from '../../local-model.js';
16
+ import { getModelContextLimit } from '../../model-detection.js';
17
+ import { detectComplexity } from '../../risk.js';
18
+ import * as storage from '../../storage.js';
19
+ import { parseFileReferences, processFilesForMessage, formatFileInfo } from '../../files.js';
20
+ import * as memory from '../../memory.js';
21
+ import { CircuitBreaker } from '../../circuit-breaker.js';
22
+ import { IterationLedger } from '../../iteration-ledger.js';
23
+ import { getDefaultSmartRoutingConfig } from '../../router.js';
24
+ import { fleetActive, fleetStartPolling, fleetPostMessage } from '../../fleet.js';
25
+ import { runAgentImpl, runLoopImpl, validateAndRepairMessagesImpl } from '../agent.js';
26
+ import { handleCommand } from '../commands.js';
27
+ import { resetContextWarnings } from '../context.js';
28
+ import { requestSelfRestart } from '../self-restart.js';
29
+ import { isDebugEnabled, setDebugEnabled, debugLog } from '../debug-log.js';
30
+ import { useTerminalWidth } from './use-terminal-width.js';
31
+ import { useProcessingState } from './use-processing-state.js';
32
+ import { useTranscriptState } from './use-transcript-state.js';
33
+ import { useSessionStats } from './use-session-stats.js';
34
+ import { useModelState } from './use-model-state.js';
35
+ import { useModalState } from './use-modal-state.js';
36
+ import { useQueueState } from './use-queue-state.js';
37
+ import { useLoopState } from './use-loop-state.js';
38
+ import { useSessionInit } from './use-session-init.js';
39
+ const MAX_UNDO_HISTORY = 10;
40
+ function makeCircuitBreaker() {
41
+ if (config.get('circuitBreakersEnabled') === false) {
42
+ return null;
43
+ }
44
+ const iterTimeSec = config.get('maxIterationTime');
45
+ const cb = new CircuitBreaker();
46
+ if (typeof iterTimeSec === 'number' && iterTimeSec > 0) {
47
+ cb.adjust('wall-clock', { maxIterationDurationMs: iterTimeSec * 1000 });
48
+ }
49
+ // Local/free providers: disable cost breaker, relax token limits
50
+ const prov = config.get('defaultProvider');
51
+ if (prov === 'ollama' || prov === 'litellm') {
52
+ cb.adjust('cost-runaway', { maxSessionCost: 999999, maxCostPerMinute: 999999 });
53
+ cb.adjust('token-burn', { maxTokensPerIteration: 500_000, maxTotalTokens: 20_000_000 });
54
+ }
55
+ return cb;
56
+ }
57
+ export function useChatController() {
58
+ const { exit } = useApp();
59
+ const width = useTerminalWidth();
60
+ // -- State groups ---------------------------------------------------------
61
+ const proc = useProcessingState();
62
+ const transcript = useTranscriptState();
63
+ const stats = useSessionStats();
64
+ const modelState = useModelState();
65
+ const modal = useModalState();
66
+ const queue = useQueueState();
67
+ const loop = useLoopState();
68
+ const { messages, collapseSettings, clearCount, addMessage, setMessages } = transcript;
69
+ const { isProcessing, thinkingState, streamingResponse, activityState, setIsProcessing, setThinkingState, setStreamingResponse, setActivityState } = proc;
70
+ const { provider, model, mode, confirmMode, autoRoute, smartRouteActive, breakerHealth, setProvider, setModel, setMode, setBreakerHealth } = modelState;
71
+ const { queuedMessages, setQueuedMessages, queuedMessagesRef, editingQueueIndex, setEditingQueueIndex } = queue;
72
+ const { loopActive, loopCancelledRef, setLoopActive } = loop;
73
+ // -- Long-lived refs ------------------------------------------------------
74
+ const isProcessingRef = useRef(false);
75
+ const surfacedProviderErrorRef = useRef(null);
76
+ const inputSubmitRef = useRef(null);
77
+ const openProviderPickerRef = useRef(null);
78
+ const sessionRef = useRef(null);
79
+ const undoStack = useRef([]);
80
+ const redoStack = useRef([]);
81
+ const llmMessages = useRef([{ role: 'system', content: getSystemPromptForProvider(provider) }]);
82
+ const ledgerRef = useRef(new IterationLedger());
83
+ const circuitBreakerRef = useRef(makeCircuitBreaker());
84
+ const smartRoutingConfigRef = useRef({
85
+ ...getDefaultSmartRoutingConfig(),
86
+ enabled: config.get('routing')?.enabled ?? false,
87
+ costSensitivity: config.get('routing')?.costSensitivity ?? 0.3,
88
+ });
89
+ useEffect(() => { isProcessingRef.current = isProcessing; }, [isProcessing]);
90
+ // -- Derived --------------------------------------------------------------
91
+ // Resolve the true serving provider. An explicitly-selected provider with no
92
+ // credential must NOT silently fall back (#217): keep the status bar honest
93
+ // (show the real, unconfigured selection — not a provider that won't serve)
94
+ // and surface the fix once, keeping the UI alive so the user can /setup or
95
+ // /config set. 'auto' with no keys degrades to 'auto' for display.
96
+ let actualProvider;
97
+ let providerErrorMessage;
98
+ try {
99
+ actualProvider = selectProvider(provider);
100
+ }
101
+ catch (err) {
102
+ providerErrorMessage = err instanceof Error ? err.message : String(err);
103
+ actualProvider = err instanceof ProviderUnavailableError ? err.provider : 'auto';
104
+ }
105
+ const actualModel = model || DEFAULT_MODELS[actualProvider];
106
+ const isModalActive = modal.modalMode !== 'none';
107
+ const contextPercentage = Math.round((stats.contextTokens / getModelContextLimit(actualProvider, actualModel)) * 100);
108
+ const resolvedBreakerHealth = config.get('circuitBreakersEnabled') !== false ? breakerHealth : undefined;
109
+ // Surface a provider-credential problem once per unique message (per session).
110
+ useEffect(() => {
111
+ if (providerErrorMessage && surfacedProviderErrorRef.current !== providerErrorMessage) {
112
+ surfacedProviderErrorRef.current = providerErrorMessage;
113
+ addMessage('system', `⚠️ ${providerErrorMessage}`);
114
+ }
115
+ }, [providerErrorMessage, addMessage]);
116
+ // -- Core helpers ---------------------------------------------------------
117
+ const handleEditQueuedMessage = useCallback((index, newMsg) => {
118
+ if (newMsg === '') {
119
+ setQueuedMessages(prev => prev.filter((_, i) => i !== index));
120
+ addMessage('system', `🗑️ Deleted queued message #${index + 1}`);
121
+ }
122
+ else {
123
+ setQueuedMessages(prev => prev.map((msg, i) => i === index ? newMsg : msg));
124
+ addMessage('system', `✏️ Updated queued message #${index + 1}`);
125
+ }
126
+ }, [addMessage, setQueuedMessages]);
127
+ const validateAndRepairMessages = useCallback(() => {
128
+ return validateAndRepairMessagesImpl({ llmMessages, addMessage, debugLog });
129
+ }, [addMessage]);
130
+ // Estimate context tokens (conservative: ~2.5 chars/token + 1.35x overhead)
131
+ const estimateContextTokens = useCallback(() => {
132
+ let chars = 0;
133
+ let msgCount = 0;
134
+ for (const msg of llmMessages.current) {
135
+ msgCount++;
136
+ if (typeof msg.content === 'string') {
137
+ chars += msg.content.length;
138
+ }
139
+ else if (Array.isArray(msg.content)) {
140
+ for (const block of msg.content) {
141
+ if (block.type === 'text') {
142
+ chars += block.text.length;
143
+ }
144
+ else if (block.type === 'image') {
145
+ chars += 1000; // Images count as ~250 tokens
146
+ }
147
+ }
148
+ }
149
+ if (msg.toolCalls) {
150
+ for (const tool of msg.toolCalls) {
151
+ chars += JSON.stringify(tool.arguments || {}).length;
152
+ }
153
+ }
154
+ }
155
+ return Math.round((chars / 2.5) * 1.35 + msgCount * 50);
156
+ }, []);
157
+ const saveUndoState = useCallback(() => {
158
+ undoStack.current.push({
159
+ messages: [...messages],
160
+ llmMessages: [...llmMessages.current],
161
+ timestamp: new Date(),
162
+ });
163
+ if (undoStack.current.length > MAX_UNDO_HISTORY) {
164
+ undoStack.current.shift();
165
+ }
166
+ redoStack.current = [];
167
+ }, [messages]);
168
+ // -- Agent / command context builders ------------------------------------
169
+ const buildAgentContext = useCallback(() => ({
170
+ provider, model, mode, confirmMode, autoRoute, actualProvider, actualModel,
171
+ stats: stats.stats,
172
+ ledger: ledgerRef.current,
173
+ circuitBreaker: circuitBreakerRef.current || undefined,
174
+ smartRouteActive,
175
+ smartRoutingConfig: smartRoutingConfigRef.current,
176
+ setBreakerHealth,
177
+ setStats: stats.setStats,
178
+ setStreamingResponse,
179
+ setThinkingState,
180
+ setActivityState,
181
+ setContextTokens: stats.setContextTokens,
182
+ setIsProcessing,
183
+ setQueuedMessages,
184
+ setEditingQueueIndex,
185
+ setLoopIteration: loop.setLoopIteration,
186
+ setLoopActive,
187
+ llmMessages,
188
+ queuedMessagesRef,
189
+ loopCancelledRef,
190
+ sessionRef,
191
+ addMessage,
192
+ estimateContextTokens,
193
+ validateAndRepairMessages,
194
+ debugLog,
195
+ }), [provider, model, mode, confirmMode, autoRoute, smartRouteActive, actualProvider, actualModel,
196
+ stats.stats, stats.setStats, stats.setContextTokens, setBreakerHealth, setStreamingResponse,
197
+ setThinkingState, setActivityState, setIsProcessing, setQueuedMessages, setEditingQueueIndex,
198
+ loop.setLoopIteration, setLoopActive, addMessage, estimateContextTokens, validateAndRepairMessages]);
199
+ const runAgent = useCallback(async (content) => {
200
+ await runAgentImpl(buildAgentContext(), content);
201
+ }, [buildAgentContext]);
202
+ const runLoop = useCallback(async (prompt, maxIter, completionPromise) => {
203
+ await runLoopImpl(buildAgentContext(), prompt, maxIter, completionPromise);
204
+ }, [buildAgentContext]);
205
+ const handleFleetInstruction = useCallback((instruction) => {
206
+ if (isProcessingRef.current) {
207
+ setQueuedMessages(prev => [...prev, instruction]);
208
+ }
209
+ else {
210
+ void inputSubmitRef.current?.(instruction);
211
+ }
212
+ }, [setQueuedMessages]);
213
+ const buildCommandContext = useCallback(() => ({
214
+ actualProvider, actualModel, model, mode, confirmMode,
215
+ messages, stats: stats.stats, loopActive, isProcessing, thinkingState, streamingResponse,
216
+ queuedMessages, debugEnabled: isDebugEnabled(), modalMode: modal.modalMode,
217
+ ledger: ledgerRef.current,
218
+ setProvider, setModel, setMode,
219
+ setMessages,
220
+ setStats: stats.setStats,
221
+ setModalMode: modal.setModalMode,
222
+ setAvailableModels: modal.setAvailableModels,
223
+ setLoopActive,
224
+ setLoopPrompt: loop.setLoopPrompt,
225
+ setLoopMaxIterations: loop.setLoopMaxIterations,
226
+ setLoopCompletionPromise: loop.setLoopCompletionPromise,
227
+ setLoopIteration: loop.setLoopIteration,
228
+ setContextTokens: stats.setContextTokens,
229
+ setDebugEnabled,
230
+ llmMessages,
231
+ undoStack,
232
+ redoStack,
233
+ loopCancelledRef,
234
+ sessionRef,
235
+ addMessage,
236
+ estimateContextTokens,
237
+ runLoop,
238
+ startFleetPolling: () => { fleetStartPolling(handleFleetInstruction); },
239
+ openProviderPicker: () => openProviderPickerRef.current?.(),
240
+ }), [actualProvider, actualModel, model, mode, confirmMode, messages, stats.stats, stats.setStats,
241
+ stats.setContextTokens, loopActive, isProcessing, thinkingState, streamingResponse, queuedMessages,
242
+ modal.modalMode, modal.setModalMode, modal.setAvailableModels, setProvider, setModel, setMode,
243
+ setMessages, setLoopActive, loop.setLoopPrompt, loop.setLoopMaxIterations, loop.setLoopCompletionPromise,
244
+ loop.setLoopIteration, addMessage, estimateContextTokens, runLoop, handleFleetInstruction]);
245
+ const handleCommandWrapped = useCallback(async (cmd) => {
246
+ await handleCommand(cmd, buildCommandContext());
247
+ }, [buildCommandContext]);
248
+ // -- Submit (routing) -----------------------------------------------------
249
+ // The input-widget concerns (history, clearing) live in InputRegion; this is
250
+ // the content-processing half of the original handleSubmit.
251
+ const onSubmitMessage = useCallback(async (trimmed) => {
252
+ if (trimmed.startsWith('/')) {
253
+ await handleCommandWrapped(trimmed);
254
+ return;
255
+ }
256
+ // ! prefix executes shell commands directly
257
+ if (trimmed.startsWith('!')) {
258
+ const shellCmd = trimmed.slice(1).trim();
259
+ if (shellCmd) {
260
+ addMessage('system', `$ ${shellCmd}`);
261
+ try {
262
+ const { execSync } = await import('child_process');
263
+ const activeCwd = sessionRef.current?.projectPath ?? process.cwd();
264
+ const output = execSync(shellCmd, {
265
+ cwd: activeCwd,
266
+ encoding: 'utf-8',
267
+ timeout: 30000,
268
+ stdio: ['pipe', 'pipe', 'pipe'],
269
+ maxBuffer: 10 * 1024 * 1024,
270
+ }).trim();
271
+ addMessage('system', output || '(no output)');
272
+ }
273
+ catch (err) {
274
+ const execErr = err;
275
+ addMessage('error', execErr.stderr?.trim() || execErr.message || String(err));
276
+ }
277
+ }
278
+ return;
279
+ }
280
+ // In hybrid mode, check for complex operations
281
+ if (mode === 'hybrid') {
282
+ const complexity = detectComplexity(trimmed);
283
+ if (complexity.isComplex) {
284
+ modal.setPendingComplexPrompt({ prompt: trimmed, complexity });
285
+ modal.setModalMode('complexity-warning');
286
+ return;
287
+ }
288
+ }
289
+ // Save state for undo before modifying conversation
290
+ saveUndoState();
291
+ // Parse file references from input
292
+ const activeCwd = sessionRef.current?.projectPath ?? process.cwd();
293
+ const { text: cleanText, files } = parseFileReferences(trimmed, activeCwd);
294
+ // Show user message (with file info if any)
295
+ if (files.length > 0) {
296
+ const fileInfo = formatFileInfo(files);
297
+ addMessage('user', `${cleanText}\n📎 ${fileInfo}`);
298
+ }
299
+ else {
300
+ addMessage('user', trimmed);
301
+ }
302
+ // Mirror user input to IRC so observers see what prompted each agent run
303
+ if (fleetActive()) {
304
+ fleetPostMessage(cleanText || trimmed);
305
+ }
306
+ setIsProcessing(true);
307
+ try {
308
+ let messageContent;
309
+ if (files.length > 0) {
310
+ const visionSupported = supportsVision(provider, model);
311
+ const { content, warnings } = processFilesForMessage(cleanText || trimmed, files, visionSupported);
312
+ for (const warning of warnings) {
313
+ addMessage('system', warning);
314
+ }
315
+ messageContent = content;
316
+ }
317
+ else {
318
+ messageContent = trimmed;
319
+ }
320
+ await runAgent(messageContent);
321
+ }
322
+ finally {
323
+ setIsProcessing(false);
324
+ setThinkingState(null);
325
+ setStreamingResponse('');
326
+ }
327
+ }, [handleCommandWrapped, runAgent, addMessage, provider, model, saveUndoState, mode,
328
+ modal, setIsProcessing, setThinkingState, setStreamingResponse]);
329
+ // -- Input action handlers ------------------------------------------------
330
+ const handleQueueMessage = useCallback((msg) => {
331
+ setQueuedMessages(prev => [...prev, msg]);
332
+ addMessage('system', `📨 Queued: "${msg.substring(0, 50)}${msg.length > 50 ? '...' : ''}"`);
333
+ }, [addMessage, setQueuedMessages]);
334
+ const cycleMode = useCallback(() => {
335
+ setMode(current => {
336
+ const modes = ['plan', 'hybrid', 'work'];
337
+ const idx = modes.indexOf(current);
338
+ return modes[(idx + 1) % modes.length];
339
+ });
340
+ }, [setMode]);
341
+ const handleEscape = useCallback(() => {
342
+ if (isProcessing) {
343
+ setIsProcessing(false);
344
+ setThinkingState(null);
345
+ setStreamingResponse('');
346
+ setLoopActive(false);
347
+ setEditingQueueIndex(null);
348
+ addMessage('system', '⏹ Operation cancelled. Press Ctrl+C again to quit.');
349
+ }
350
+ else if (modal.modalMode !== 'none') {
351
+ modal.setModalMode('none');
352
+ modal.setPendingComplexPrompt(null);
353
+ }
354
+ else {
355
+ addMessage('system', '💡 Press Ctrl+C again to quit, or /exit.');
356
+ }
357
+ }, [isProcessing, modal, addMessage, setIsProcessing, setThinkingState, setStreamingResponse,
358
+ setLoopActive, setEditingQueueIndex]);
359
+ const handleExit = useCallback(() => { exit(); }, [exit]);
360
+ const handleDirectSend = useCallback((msg) => {
361
+ setIsProcessing(false);
362
+ setThinkingState(null);
363
+ setStreamingResponse('');
364
+ setEditingQueueIndex(null);
365
+ addMessage('system', '⚡ Direct send - interrupting current operation');
366
+ addMessage('user', msg);
367
+ setIsProcessing(true);
368
+ runAgent(msg).finally(() => {
369
+ setIsProcessing(false);
370
+ setThinkingState(null);
371
+ setStreamingResponse('');
372
+ setEditingQueueIndex(null);
373
+ });
374
+ }, [addMessage, runAgent, setIsProcessing, setThinkingState, setStreamingResponse, setEditingQueueIndex]);
375
+ // -- Modal handlers -------------------------------------------------------
376
+ const handleModelSelect = useCallback((selectedModel) => {
377
+ setModel(selectedModel);
378
+ config.set('defaultModel', selectedModel);
379
+ addMessage('system', `Model: ${selectedModel} (saved as default)`);
380
+ modal.setModalMode('none');
381
+ modal.setAvailableModels([]);
382
+ }, [addMessage, setModel, modal]);
383
+ const handleModalCancel = useCallback(() => {
384
+ modal.setModalMode('none');
385
+ modal.setAvailableModels([]);
386
+ modal.setLatestVersion(null);
387
+ }, [modal]);
388
+ const handleUpgradeConfirm = useCallback(async () => {
389
+ modal.setModalMode('none');
390
+ addMessage('system', 'Upgrading...');
391
+ try {
392
+ const { performUpgrade } = await import('../../version-check.js');
393
+ const success = await performUpgrade();
394
+ if (success) {
395
+ addMessage('system', 'Upgrade complete! Restarting...');
396
+ requestSelfRestart(process.argv.slice(1));
397
+ exit();
398
+ return;
399
+ }
400
+ addMessage('error', 'Upgrade failed. Try: npm install -g @calliopelabs/cli@latest');
401
+ }
402
+ catch (e) {
403
+ addMessage('error', `Upgrade failed: ${e instanceof Error ? e.message : String(e)}`);
404
+ }
405
+ modal.setLatestVersion(null);
406
+ }, [addMessage, modal, exit]);
407
+ const buildProviderEntries = useCallback(() => {
408
+ const hasBedrock = !!(config.getApiKey('bedrock') || config.getBaseUrl('bedrock')
409
+ || process.env.AWS_ACCESS_KEY_ID || process.env.AWS_PROFILE);
410
+ return [
411
+ { id: 'ollama', label: 'Ollama', configured: !!config.getBaseUrl('ollama'), configHint: 'OLLAMA_BASE_URL', recommended: true, note: 'local, free' },
412
+ { id: 'anthropic', label: 'Anthropic', configured: !!config.getApiKey('anthropic'), configHint: 'ANTHROPIC_API_KEY' },
413
+ { id: 'openai', label: 'OpenAI', configured: !!config.getApiKey('openai'), configHint: 'OPENAI_API_KEY' },
414
+ { id: 'google', label: 'Google', configured: !!config.getApiKey('google'), configHint: 'GOOGLE_API_KEY' },
415
+ { id: 'mistral', label: 'Mistral', configured: !!config.getApiKey('mistral'), configHint: 'MISTRAL_API_KEY' },
416
+ { id: 'openrouter', label: 'OpenRouter', configured: !!config.getApiKey('openrouter'), configHint: 'OPENROUTER_API_KEY' },
417
+ { id: 'together', label: 'Together', configured: !!config.getApiKey('together'), configHint: 'TOGETHER_API_KEY' },
418
+ { id: 'groq', label: 'Groq', configured: !!config.getApiKey('groq'), configHint: 'GROQ_API_KEY' },
419
+ { id: 'fireworks', label: 'Fireworks', configured: !!config.getApiKey('fireworks'), configHint: 'FIREWORKS_API_KEY' },
420
+ { id: 'ai21', label: 'AI21', configured: !!config.getApiKey('ai21'), configHint: 'AI21_API_KEY' },
421
+ { id: 'huggingface', label: 'HuggingFace', configured: !!config.getApiKey('huggingface'), configHint: 'HUGGINGFACE_API_KEY' },
422
+ { id: 'bedrock', label: 'AWS Bedrock', configured: hasBedrock, configHint: 'AWS_PROFILE or AWS_ACCESS_KEY_ID', note: 'AWS credentials' },
423
+ { id: 'litellm', label: 'LiteLLM', configured: !!config.getBaseUrl('litellm'), configHint: 'LITELLM_BASE_URL' },
424
+ ];
425
+ }, []);
426
+ const openProviderPicker = useCallback(() => {
427
+ modal.setProviderEntries(buildProviderEntries());
428
+ modal.setModalMode('provider');
429
+ }, [buildProviderEntries, modal]);
430
+ useEffect(() => { openProviderPickerRef.current = openProviderPicker; }, [openProviderPicker]);
431
+ const handleProviderSelect = useCallback((entry) => {
432
+ if (entry.configured) {
433
+ setProvider(entry.id);
434
+ config.set('defaultProvider', entry.id);
435
+ config.unset('defaultModel');
436
+ addMessage('system', `Provider: ${entry.label}${entry.id === 'ollama' ? ' (local)' : ''} (saved as default)`);
437
+ modal.setModalMode('none');
438
+ modal.setProviderEntries([]);
439
+ return;
440
+ }
441
+ modal.setPendingSetupProvider(entry);
442
+ modal.setModalMode('api-key-setup');
443
+ }, [addMessage, setProvider, modal]);
444
+ const handleProviderCancel = useCallback(() => {
445
+ modal.setModalMode('none');
446
+ modal.setProviderEntries([]);
447
+ }, [modal]);
448
+ const handleApiKeySubmit = useCallback((value) => {
449
+ const entry = modal.pendingSetupProvider;
450
+ if (!entry) {
451
+ modal.setModalMode('none');
452
+ return;
453
+ }
454
+ try {
455
+ if (entry.id === 'ollama') {
456
+ config.setProviderCred('ollama', { baseUrl: value });
457
+ }
458
+ else if (entry.id === 'litellm') {
459
+ config.setProviderCred('litellm', { baseUrl: value });
460
+ }
461
+ else if (entry.id === 'bedrock') {
462
+ process.env.AWS_PROFILE = value;
463
+ delete process.env.AWS_ACCESS_KEY_ID;
464
+ delete process.env.AWS_SECRET_ACCESS_KEY;
465
+ delete process.env.AWS_SESSION_TOKEN;
466
+ addMessage('system', `AWS_PROFILE=${value} set for this session. Add to shell rc to persist.`);
467
+ }
468
+ else {
469
+ config.setProviderCred(entry.id, { apiKey: value });
470
+ }
471
+ setProvider(entry.id);
472
+ config.set('defaultProvider', entry.id);
473
+ config.unset('defaultModel');
474
+ addMessage('system', `✓ Configured ${entry.label}. Provider switched and saved as default.`);
475
+ }
476
+ catch (e) {
477
+ addMessage('error', `Failed to configure ${entry.label}: ${e instanceof Error ? e.message : String(e)}`);
478
+ }
479
+ modal.setPendingSetupProvider(null);
480
+ modal.setModalMode('none');
481
+ }, [addMessage, setProvider, modal]);
482
+ const handleApiKeyCancel = useCallback(() => {
483
+ modal.setPendingSetupProvider(null);
484
+ modal.setModalMode('none');
485
+ }, [modal]);
486
+ // -- Session-selector / resume handlers -----------------------------------
487
+ const handleSessionSelect = useCallback((session) => {
488
+ addMessage('system', `Loading session: ${session.projectName}...`);
489
+ addMessage('system', `Session path: ${session.projectPath}\nTo load this session, run calliope from that directory.`);
490
+ modal.setModalMode('none');
491
+ }, [addMessage, modal]);
492
+ const handleSessionDelete = useCallback((session) => {
493
+ if (storage.deleteSession(session.id)) {
494
+ addMessage('system', `🗑️ Deleted session: ${session.projectName}`);
495
+ modal.setAvailableSessions(prev => prev.filter(s => s.id !== session.id));
496
+ }
497
+ else {
498
+ addMessage('error', `Failed to delete session: ${session.projectName}`);
499
+ }
500
+ }, [addMessage, modal]);
501
+ const handleSessionResume = useCallback(() => {
502
+ const savedMessages = storage.loadMessageHistory();
503
+ if (savedMessages && savedMessages.length > 0) {
504
+ llmMessages.current.length = 0;
505
+ for (const msg of savedMessages) {
506
+ llmMessages.current.push(msg);
507
+ }
508
+ addMessage('system', `✓ Resumed session with ${savedMessages.length} saved messages loaded`);
509
+ const activeSessionId = sessionRef.current?.id;
510
+ if (activeSessionId) {
511
+ ledgerRef.current.loadSnapshot(storage.loadIterationLedger(activeSessionId));
512
+ storage.saveIterationLedger(ledgerRef.current, activeSessionId);
513
+ }
514
+ stats.setContextTokens(estimateContextTokens());
515
+ }
516
+ else {
517
+ const history = storage.getChatHistory(20);
518
+ if (history.length > 0) {
519
+ llmMessages.current.length = 0;
520
+ const activeCwd = sessionRef.current?.projectPath ?? process.cwd();
521
+ const basePrompt = getSystemPromptForProvider(actualProvider);
522
+ const memoryContext = memory.buildMemoryContext(activeCwd);
523
+ llmMessages.current.push({
524
+ role: 'system',
525
+ content: memoryContext.trim()
526
+ ? `${basePrompt}\n\n--- Project Context ---\n${memoryContext}`
527
+ : basePrompt,
528
+ });
529
+ for (const msg of history) {
530
+ if (msg.role === 'user' || msg.role === 'assistant') {
531
+ llmMessages.current.push({ role: msg.role, content: msg.content });
532
+ }
533
+ }
534
+ addMessage('system', `✓ Resumed session with ${history.length} chat messages loaded`);
535
+ stats.setContextTokens(estimateContextTokens());
536
+ }
537
+ }
538
+ modal.setModalMode('none');
539
+ modal.setPreviousSession(null);
540
+ }, [addMessage, estimateContextTokens, stats, modal, actualProvider]);
541
+ const handleSessionResumeNew = useCallback(() => {
542
+ addMessage('system', '✓ Starting fresh session');
543
+ modal.setModalMode('none');
544
+ modal.setPreviousSession(null);
545
+ }, [addMessage, modal]);
546
+ // -- Complexity-warning handlers ------------------------------------------
547
+ const handleComplexityProceed = useCallback(async () => {
548
+ modal.setModalMode('none');
549
+ const prompt = modal.pendingComplexPrompt?.prompt;
550
+ modal.setPendingComplexPrompt(null);
551
+ if (prompt === undefined)
552
+ return;
553
+ saveUndoState();
554
+ addMessage('user', typeof prompt === 'string' ? prompt : JSON.stringify(prompt));
555
+ setIsProcessing(true);
556
+ try {
557
+ await runAgent(prompt);
558
+ }
559
+ finally {
560
+ setIsProcessing(false);
561
+ }
562
+ }, [modal, saveUndoState, addMessage, runAgent, setIsProcessing]);
563
+ const handleComplexityPlan = useCallback(() => {
564
+ modal.setModalMode('none');
565
+ const prompt = modal.pendingComplexPrompt?.prompt;
566
+ modal.setPendingComplexPrompt(null);
567
+ if (prompt === undefined)
568
+ return;
569
+ setMode('plan');
570
+ addMessage('system', '📋 Switched to Plan mode - I\'ll describe what I would do without executing.');
571
+ saveUndoState();
572
+ addMessage('user', typeof prompt === 'string' ? prompt : JSON.stringify(prompt));
573
+ setIsProcessing(true);
574
+ runAgent(prompt).finally(() => setIsProcessing(false));
575
+ }, [modal, setMode, saveUndoState, addMessage, runAgent, setIsProcessing]);
576
+ const handleComplexityCancel = useCallback(() => {
577
+ modal.setModalMode('none');
578
+ modal.setPendingComplexPrompt(null);
579
+ addMessage('system', 'Operation cancelled.');
580
+ }, [modal, addMessage]);
581
+ const handleKeybindingsClose = useCallback(() => {
582
+ modal.setModalMode('none');
583
+ }, [modal]);
584
+ // -- Session reset (replaces the old full-remount reset) ------------------
585
+ const resetSession = useCallback(() => {
586
+ proc.reset();
587
+ transcript.reset();
588
+ stats.reset();
589
+ modelState.reset();
590
+ modal.reset();
591
+ queue.reset();
592
+ loop.reset();
593
+ llmMessages.current = [{ role: 'system', content: getSystemPromptForProvider(actualProvider) }];
594
+ undoStack.current = [];
595
+ redoStack.current = [];
596
+ ledgerRef.current.reset();
597
+ resetContextWarnings();
598
+ }, [proc, transcript, stats, modelState, modal, queue, loop, actualProvider]);
599
+ // -- Mount initialization -------------------------------------------------
600
+ useSessionInit({ sessionRef, ledgerRef, llmMessages, addMessage, onFleetInstruction: handleFleetInstruction });
601
+ // -- Region prop bags -----------------------------------------------------
602
+ // Plain objects (not memoized): TerminalChat spreads them, so each region's
603
+ // React.memo compares individual props — all of which are stable values or
604
+ // stable useCallback refs when unchanged. This also keeps module-level reads
605
+ // (debugEnabled) fresh on every render, matching the original.
606
+ const transcriptProps = {
607
+ messages, collapseSettings, clearCount, isProcessing, thinkingState, streamingResponse, activityState,
608
+ debugEnabled: isDebugEnabled(), mode, queuedCount: queuedMessages.length,
609
+ };
610
+ const statusProps = {
611
+ provider: actualProvider, model: actualModel, mode, stats: stats.stats,
612
+ contextTokens: stats.contextTokens, breakerHealth: resolvedBreakerHealth, smartRouteActive, width,
613
+ };
614
+ const inputProps = {
615
+ onSubmitMessage, submitRef: inputSubmitRef, disabled: isModalActive, isProcessing,
616
+ queuedCount: queuedMessages.length, queuedMessages, editingQueueIndex,
617
+ onQueueMessage: handleQueueMessage, onEditQueuedMessage: handleEditQueuedMessage,
618
+ onSetEditingQueueIndex: setEditingQueueIndex, onDirectSend: handleDirectSend,
619
+ onEscape: handleEscape, onExit: handleExit, onCycleMode: cycleMode,
620
+ currentMode: mode, contextPercentage, cwd: process.cwd(),
621
+ };
622
+ const modalProps = {
623
+ modalMode: modal.modalMode,
624
+ availableModels: modal.availableModels, onModelSelect: handleModelSelect, onModalCancel: handleModalCancel,
625
+ availableSessions: modal.availableSessions, onSessionSelect: handleSessionSelect, onSessionDelete: handleSessionDelete,
626
+ latestVersion: modal.latestVersion, onUpgradeConfirm: handleUpgradeConfirm,
627
+ previousSession: modal.previousSession, onSessionResume: handleSessionResume, onSessionResumeNew: handleSessionResumeNew,
628
+ pendingComplexPrompt: modal.pendingComplexPrompt, onComplexityProceed: handleComplexityProceed,
629
+ onComplexityPlan: handleComplexityPlan, onComplexityCancel: handleComplexityCancel,
630
+ onKeybindingsClose: handleKeybindingsClose,
631
+ providerEntries: modal.providerEntries, onProviderSelect: handleProviderSelect, onProviderCancel: handleProviderCancel,
632
+ pendingSetupProvider: modal.pendingSetupProvider, onApiKeySubmit: handleApiKeySubmit, onApiKeyCancel: handleApiKeyCancel,
633
+ };
634
+ return {
635
+ width,
636
+ resetSession,
637
+ transcript: transcriptProps,
638
+ status: statusProps,
639
+ input: inputProps,
640
+ modal: modalProps,
641
+ };
642
+ }
643
+ //# sourceMappingURL=use-chat-controller.js.map