@calliopelabs/cli 3.1.0 → 3.2.1

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 (856) hide show
  1. package/README.md +68 -7
  2. package/dist/acp.d.ts +1 -4
  3. package/dist/acp.d.ts.map +1 -1
  4. package/dist/acp.js +118 -217
  5. package/dist/acp.js.map +1 -1
  6. package/dist/approvals/commands.d.ts +35 -0
  7. package/dist/approvals/commands.d.ts.map +1 -0
  8. package/dist/approvals/commands.js +51 -0
  9. package/dist/approvals/commands.js.map +1 -0
  10. package/dist/approvals/index.d.ts +6 -0
  11. package/dist/approvals/index.d.ts.map +1 -0
  12. package/dist/approvals/index.js +6 -0
  13. package/dist/approvals/index.js.map +1 -0
  14. package/dist/approvals/queue.d.ts +18 -0
  15. package/dist/approvals/queue.d.ts.map +1 -0
  16. package/dist/approvals/queue.js +46 -0
  17. package/dist/approvals/queue.js.map +1 -0
  18. package/dist/approvals/request.d.ts +13 -0
  19. package/dist/approvals/request.d.ts.map +1 -0
  20. package/dist/approvals/request.js +102 -0
  21. package/dist/approvals/request.js.map +1 -0
  22. package/dist/approvals/store.d.ts +24 -0
  23. package/dist/approvals/store.d.ts.map +1 -0
  24. package/dist/approvals/store.js +229 -0
  25. package/dist/approvals/store.js.map +1 -0
  26. package/dist/approvals/types.d.ts +27 -0
  27. package/dist/approvals/types.d.ts.map +1 -0
  28. package/dist/approvals/types.js +4 -0
  29. package/dist/approvals/types.js.map +1 -0
  30. package/dist/auto-compressor.d.ts +3 -2
  31. package/dist/auto-compressor.d.ts.map +1 -1
  32. package/dist/auto-compressor.js +9 -9
  33. package/dist/auto-compressor.js.map +1 -1
  34. package/dist/bin.d.ts.map +1 -1
  35. package/dist/bin.js +125 -22
  36. package/dist/bin.js.map +1 -1
  37. package/dist/brain/access.d.ts +65 -0
  38. package/dist/brain/access.d.ts.map +1 -0
  39. package/dist/brain/access.js +216 -0
  40. package/dist/brain/access.js.map +1 -0
  41. package/dist/brain/actions.d.ts +120 -0
  42. package/dist/brain/actions.d.ts.map +1 -0
  43. package/dist/brain/actions.js +270 -0
  44. package/dist/brain/actions.js.map +1 -0
  45. package/dist/brain/cli.d.ts +17 -0
  46. package/dist/brain/cli.d.ts.map +1 -0
  47. package/dist/brain/cli.js +206 -0
  48. package/dist/brain/cli.js.map +1 -0
  49. package/dist/brain/index.d.ts +16 -0
  50. package/dist/brain/index.d.ts.map +1 -0
  51. package/dist/brain/index.js +16 -0
  52. package/dist/brain/index.js.map +1 -0
  53. package/dist/brain/journal.d.ts +17 -0
  54. package/dist/brain/journal.d.ts.map +1 -0
  55. package/dist/brain/journal.js +189 -0
  56. package/dist/brain/journal.js.map +1 -0
  57. package/dist/brain/kg.d.ts +23 -0
  58. package/dist/brain/kg.d.ts.map +1 -0
  59. package/dist/brain/kg.js +36 -0
  60. package/dist/brain/kg.js.map +1 -0
  61. package/dist/brain/presentation.d.ts +3 -0
  62. package/dist/brain/presentation.d.ts.map +1 -0
  63. package/dist/brain/presentation.js +48 -0
  64. package/dist/brain/presentation.js.map +1 -0
  65. package/dist/brain/queries.d.ts +179 -0
  66. package/dist/brain/queries.d.ts.map +1 -0
  67. package/dist/brain/queries.js +210 -0
  68. package/dist/brain/queries.js.map +1 -0
  69. package/dist/brain/run-ingest.d.ts +29 -0
  70. package/dist/brain/run-ingest.d.ts.map +1 -0
  71. package/dist/brain/run-ingest.js +200 -0
  72. package/dist/brain/run-ingest.js.map +1 -0
  73. package/dist/brain/sqlite.d.ts +19 -0
  74. package/dist/brain/sqlite.d.ts.map +1 -0
  75. package/dist/brain/sqlite.js +252 -0
  76. package/dist/brain/sqlite.js.map +1 -0
  77. package/dist/brain/store.d.ts +31 -0
  78. package/dist/brain/store.d.ts.map +1 -0
  79. package/dist/brain/store.js +324 -0
  80. package/dist/brain/store.js.map +1 -0
  81. package/dist/brain/tool-query.d.ts +6 -0
  82. package/dist/brain/tool-query.d.ts.map +1 -0
  83. package/dist/brain/tool-query.js +42 -0
  84. package/dist/brain/tool-query.js.map +1 -0
  85. package/dist/brain/tools.d.ts +13 -0
  86. package/dist/brain/tools.d.ts.map +1 -0
  87. package/dist/brain/tools.js +20 -0
  88. package/dist/brain/tools.js.map +1 -0
  89. package/dist/brain/transfer.d.ts +57 -0
  90. package/dist/brain/transfer.d.ts.map +1 -0
  91. package/dist/brain/transfer.js +266 -0
  92. package/dist/brain/transfer.js.map +1 -0
  93. package/dist/brain/types.d.ts +145 -0
  94. package/dist/brain/types.d.ts.map +1 -0
  95. package/dist/brain/types.js +38 -0
  96. package/dist/brain/types.js.map +1 -0
  97. package/dist/brain/validation.d.ts +15 -0
  98. package/dist/brain/validation.d.ts.map +1 -0
  99. package/dist/brain/validation.js +163 -0
  100. package/dist/brain/validation.js.map +1 -0
  101. package/dist/budget.d.ts +5 -4
  102. package/dist/budget.d.ts.map +1 -1
  103. package/dist/budget.js +16 -38
  104. package/dist/budget.js.map +1 -1
  105. package/dist/cancellation.d.ts +8 -0
  106. package/dist/cancellation.d.ts.map +1 -0
  107. package/dist/cancellation.js +42 -0
  108. package/dist/cancellation.js.map +1 -0
  109. package/dist/checkpoint.d.ts +2 -2
  110. package/dist/checkpoint.d.ts.map +1 -1
  111. package/dist/checkpoint.js +5 -5
  112. package/dist/checkpoint.js.map +1 -1
  113. package/dist/config.d.ts +13 -0
  114. package/dist/config.d.ts.map +1 -1
  115. package/dist/config.js +32 -8
  116. package/dist/config.js.map +1 -1
  117. package/dist/doctor.d.ts +30 -0
  118. package/dist/doctor.d.ts.map +1 -0
  119. package/dist/doctor.js +124 -0
  120. package/dist/doctor.js.map +1 -0
  121. package/dist/errors.d.ts +15 -0
  122. package/dist/errors.d.ts.map +1 -1
  123. package/dist/errors.js +33 -9
  124. package/dist/errors.js.map +1 -1
  125. package/dist/execution/attribution.d.ts +17 -0
  126. package/dist/execution/attribution.d.ts.map +1 -0
  127. package/dist/execution/attribution.js +21 -0
  128. package/dist/execution/attribution.js.map +1 -0
  129. package/dist/execution/authority.d.ts +22 -0
  130. package/dist/execution/authority.d.ts.map +1 -0
  131. package/dist/execution/authority.js +134 -0
  132. package/dist/execution/authority.js.map +1 -0
  133. package/dist/execution/billing.d.ts +100 -0
  134. package/dist/execution/billing.d.ts.map +1 -0
  135. package/dist/execution/billing.js +166 -0
  136. package/dist/execution/billing.js.map +1 -0
  137. package/dist/execution/child-grants.d.ts +9 -0
  138. package/dist/execution/child-grants.d.ts.map +1 -0
  139. package/dist/execution/child-grants.js +55 -0
  140. package/dist/execution/child-grants.js.map +1 -0
  141. package/dist/execution/files.d.ts +6 -0
  142. package/dist/execution/files.d.ts.map +1 -0
  143. package/dist/execution/files.js +159 -0
  144. package/dist/execution/files.js.map +1 -0
  145. package/dist/execution/guard.d.ts +50 -0
  146. package/dist/execution/guard.d.ts.map +1 -0
  147. package/dist/execution/guard.js +158 -0
  148. package/dist/execution/guard.js.map +1 -0
  149. package/dist/execution/index.d.ts +12 -0
  150. package/dist/execution/index.d.ts.map +1 -0
  151. package/dist/execution/index.js +12 -0
  152. package/dist/execution/index.js.map +1 -0
  153. package/dist/execution/ledger.d.ts +23 -0
  154. package/dist/execution/ledger.d.ts.map +1 -0
  155. package/dist/execution/ledger.js +379 -0
  156. package/dist/execution/ledger.js.map +1 -0
  157. package/dist/execution/project-spend.d.ts +45 -0
  158. package/dist/execution/project-spend.d.ts.map +1 -0
  159. package/dist/execution/project-spend.js +274 -0
  160. package/dist/execution/project-spend.js.map +1 -0
  161. package/dist/execution/quote.d.ts +19 -0
  162. package/dist/execution/quote.d.ts.map +1 -0
  163. package/dist/execution/quote.js +116 -0
  164. package/dist/execution/quote.js.map +1 -0
  165. package/dist/execution/types.d.ts +113 -0
  166. package/dist/execution/types.d.ts.map +1 -0
  167. package/dist/execution/types.js +9 -0
  168. package/dist/execution/types.js.map +1 -0
  169. package/dist/execution/writer-recovery.d.ts +3 -0
  170. package/dist/execution/writer-recovery.d.ts.map +1 -0
  171. package/dist/execution/writer-recovery.js +85 -0
  172. package/dist/execution/writer-recovery.js.map +1 -0
  173. package/dist/goals/accounting.d.ts +69 -0
  174. package/dist/goals/accounting.d.ts.map +1 -0
  175. package/dist/goals/accounting.js +100 -0
  176. package/dist/goals/accounting.js.map +1 -0
  177. package/dist/goals/actions.d.ts +33 -0
  178. package/dist/goals/actions.d.ts.map +1 -0
  179. package/dist/goals/actions.js +261 -0
  180. package/dist/goals/actions.js.map +1 -0
  181. package/dist/goals/authority.d.ts +9 -0
  182. package/dist/goals/authority.d.ts.map +1 -0
  183. package/dist/goals/authority.js +47 -0
  184. package/dist/goals/authority.js.map +1 -0
  185. package/dist/goals/cli.d.ts +10 -0
  186. package/dist/goals/cli.d.ts.map +1 -0
  187. package/dist/goals/cli.js +169 -0
  188. package/dist/goals/cli.js.map +1 -0
  189. package/dist/goals/contracts.d.ts +18 -0
  190. package/dist/goals/contracts.d.ts.map +1 -0
  191. package/dist/goals/contracts.js +127 -0
  192. package/dist/goals/contracts.js.map +1 -0
  193. package/dist/goals/index.d.ts +17 -0
  194. package/dist/goals/index.d.ts.map +1 -0
  195. package/dist/goals/index.js +16 -0
  196. package/dist/goals/index.js.map +1 -0
  197. package/dist/goals/journal.d.ts +5 -0
  198. package/dist/goals/journal.d.ts.map +1 -0
  199. package/dist/goals/journal.js +142 -0
  200. package/dist/goals/journal.js.map +1 -0
  201. package/dist/goals/metrics.d.ts +53 -0
  202. package/dist/goals/metrics.d.ts.map +1 -0
  203. package/dist/goals/metrics.js +141 -0
  204. package/dist/goals/metrics.js.map +1 -0
  205. package/dist/goals/repair.d.ts +10 -0
  206. package/dist/goals/repair.d.ts.map +1 -0
  207. package/dist/goals/repair.js +50 -0
  208. package/dist/goals/repair.js.map +1 -0
  209. package/dist/goals/routing.d.ts +18 -0
  210. package/dist/goals/routing.d.ts.map +1 -0
  211. package/dist/goals/routing.js +60 -0
  212. package/dist/goals/routing.js.map +1 -0
  213. package/dist/goals/store.d.ts +30 -0
  214. package/dist/goals/store.d.ts.map +1 -0
  215. package/dist/goals/store.js +314 -0
  216. package/dist/goals/store.js.map +1 -0
  217. package/dist/goals/supervised-cli.d.ts +5 -0
  218. package/dist/goals/supervised-cli.d.ts.map +1 -0
  219. package/dist/goals/supervised-cli.js +44 -0
  220. package/dist/goals/supervised-cli.js.map +1 -0
  221. package/dist/goals/supervised.d.ts +8 -0
  222. package/dist/goals/supervised.d.ts.map +1 -0
  223. package/dist/goals/supervised.js +65 -0
  224. package/dist/goals/supervised.js.map +1 -0
  225. package/dist/goals/team.d.ts +8 -0
  226. package/dist/goals/team.d.ts.map +1 -0
  227. package/dist/goals/team.js +64 -0
  228. package/dist/goals/team.js.map +1 -0
  229. package/dist/goals/types.d.ts +174 -0
  230. package/dist/goals/types.d.ts.map +1 -0
  231. package/dist/goals/types.js +2 -0
  232. package/dist/goals/types.js.map +1 -0
  233. package/dist/goals/validation.d.ts +17 -0
  234. package/dist/goals/validation.d.ts.map +1 -0
  235. package/dist/goals/validation.js +172 -0
  236. package/dist/goals/validation.js.map +1 -0
  237. package/dist/headless.d.ts +1 -0
  238. package/dist/headless.d.ts.map +1 -1
  239. package/dist/headless.js +98 -275
  240. package/dist/headless.js.map +1 -1
  241. package/dist/health/index.d.ts +5 -0
  242. package/dist/health/index.d.ts.map +1 -0
  243. package/dist/health/index.js +5 -0
  244. package/dist/health/index.js.map +1 -0
  245. package/dist/health/store.d.ts +24 -0
  246. package/dist/health/store.d.ts.map +1 -0
  247. package/dist/health/store.js +190 -0
  248. package/dist/health/store.js.map +1 -0
  249. package/dist/health/summary.d.ts +10 -0
  250. package/dist/health/summary.d.ts.map +1 -0
  251. package/dist/health/summary.js +95 -0
  252. package/dist/health/summary.js.map +1 -0
  253. package/dist/health/target.d.ts +3 -0
  254. package/dist/health/target.d.ts.map +1 -0
  255. package/dist/health/target.js +53 -0
  256. package/dist/health/target.js.map +1 -0
  257. package/dist/health/types.d.ts +72 -0
  258. package/dist/health/types.d.ts.map +1 -0
  259. package/dist/health/types.js +2 -0
  260. package/dist/health/types.js.map +1 -0
  261. package/dist/hooks.d.ts +7 -2
  262. package/dist/hooks.d.ts.map +1 -1
  263. package/dist/hooks.js +35 -17
  264. package/dist/hooks.js.map +1 -1
  265. package/dist/improvement/actions.d.ts +27 -0
  266. package/dist/improvement/actions.d.ts.map +1 -0
  267. package/dist/improvement/actions.js +116 -0
  268. package/dist/improvement/actions.js.map +1 -0
  269. package/dist/improvement/cli.d.ts +9 -0
  270. package/dist/improvement/cli.d.ts.map +1 -0
  271. package/dist/improvement/cli.js +58 -0
  272. package/dist/improvement/cli.js.map +1 -0
  273. package/dist/improvement/feedback.d.ts +30 -0
  274. package/dist/improvement/feedback.d.ts.map +1 -0
  275. package/dist/improvement/feedback.js +7 -0
  276. package/dist/improvement/feedback.js.map +1 -0
  277. package/dist/improvement/index.d.ts +7 -0
  278. package/dist/improvement/index.d.ts.map +1 -0
  279. package/dist/improvement/index.js +7 -0
  280. package/dist/improvement/index.js.map +1 -0
  281. package/dist/improvement/metrics.d.ts +4 -0
  282. package/dist/improvement/metrics.d.ts.map +1 -0
  283. package/dist/improvement/metrics.js +38 -0
  284. package/dist/improvement/metrics.js.map +1 -0
  285. package/dist/improvement/projection.d.ts +7 -0
  286. package/dist/improvement/projection.d.ts.map +1 -0
  287. package/dist/improvement/projection.js +135 -0
  288. package/dist/improvement/projection.js.map +1 -0
  289. package/dist/improvement/types.d.ts +115 -0
  290. package/dist/improvement/types.d.ts.map +1 -0
  291. package/dist/improvement/types.js +2 -0
  292. package/dist/improvement/types.js.map +1 -0
  293. package/dist/index.d.ts +3 -0
  294. package/dist/index.d.ts.map +1 -1
  295. package/dist/index.js +3 -0
  296. package/dist/index.js.map +1 -1
  297. package/dist/instructions.d.ts +10 -0
  298. package/dist/instructions.d.ts.map +1 -0
  299. package/dist/instructions.js +93 -0
  300. package/dist/instructions.js.map +1 -0
  301. package/dist/isolation/contracts.d.ts +42 -0
  302. package/dist/isolation/contracts.d.ts.map +1 -0
  303. package/dist/isolation/contracts.js +33 -0
  304. package/dist/isolation/contracts.js.map +1 -0
  305. package/dist/isolation/coordinator.d.ts +10 -0
  306. package/dist/isolation/coordinator.d.ts.map +1 -0
  307. package/dist/isolation/coordinator.js +79 -0
  308. package/dist/isolation/coordinator.js.map +1 -0
  309. package/dist/isolation/index.d.ts +5 -0
  310. package/dist/isolation/index.d.ts.map +1 -0
  311. package/dist/isolation/index.js +5 -0
  312. package/dist/isolation/index.js.map +1 -0
  313. package/dist/isolation/process.d.ts +11 -0
  314. package/dist/isolation/process.d.ts.map +1 -0
  315. package/dist/isolation/process.js +131 -0
  316. package/dist/isolation/process.js.map +1 -0
  317. package/dist/isolation/worktree.d.ts +25 -0
  318. package/dist/isolation/worktree.d.ts.map +1 -0
  319. package/dist/isolation/worktree.js +282 -0
  320. package/dist/isolation/worktree.js.map +1 -0
  321. package/dist/memory.d.ts.map +1 -1
  322. package/dist/memory.js +5 -1
  323. package/dist/memory.js.map +1 -1
  324. package/dist/model-detection.d.ts +14 -18
  325. package/dist/model-detection.d.ts.map +1 -1
  326. package/dist/model-detection.js +287 -149
  327. package/dist/model-detection.js.map +1 -1
  328. package/dist/models/index.d.ts +3 -0
  329. package/dist/models/index.d.ts.map +1 -0
  330. package/dist/models/index.js +3 -0
  331. package/dist/models/index.js.map +1 -0
  332. package/dist/models/metadata.d.ts +43 -0
  333. package/dist/models/metadata.d.ts.map +1 -0
  334. package/dist/models/metadata.js +72 -0
  335. package/dist/models/metadata.js.map +1 -0
  336. package/dist/models/openrouter.d.ts +6 -0
  337. package/dist/models/openrouter.d.ts.map +1 -0
  338. package/dist/models/openrouter.js +38 -0
  339. package/dist/models/openrouter.js.map +1 -0
  340. package/dist/orchestration/accounting.d.ts +35 -0
  341. package/dist/orchestration/accounting.d.ts.map +1 -0
  342. package/dist/orchestration/accounting.js +27 -0
  343. package/dist/orchestration/accounting.js.map +1 -0
  344. package/dist/orchestration/actions.d.ts +23 -0
  345. package/dist/orchestration/actions.d.ts.map +1 -0
  346. package/dist/orchestration/actions.js +65 -0
  347. package/dist/orchestration/actions.js.map +1 -0
  348. package/dist/orchestration/cli.d.ts +28 -0
  349. package/dist/orchestration/cli.d.ts.map +1 -0
  350. package/dist/orchestration/cli.js +178 -0
  351. package/dist/orchestration/cli.js.map +1 -0
  352. package/dist/orchestration/coordinator-actions.d.ts +15 -0
  353. package/dist/orchestration/coordinator-actions.d.ts.map +1 -0
  354. package/dist/orchestration/coordinator-actions.js +79 -0
  355. package/dist/orchestration/coordinator-actions.js.map +1 -0
  356. package/dist/orchestration/coordinator-types.d.ts +193 -0
  357. package/dist/orchestration/coordinator-types.d.ts.map +1 -0
  358. package/dist/orchestration/coordinator-types.js +2 -0
  359. package/dist/orchestration/coordinator-types.js.map +1 -0
  360. package/dist/orchestration/coordinator.d.ts +32 -0
  361. package/dist/orchestration/coordinator.d.ts.map +1 -0
  362. package/dist/orchestration/coordinator.js +405 -0
  363. package/dist/orchestration/coordinator.js.map +1 -0
  364. package/dist/orchestration/execution-cli.d.ts +11 -0
  365. package/dist/orchestration/execution-cli.d.ts.map +1 -0
  366. package/dist/orchestration/execution-cli.js +183 -0
  367. package/dist/orchestration/execution-cli.js.map +1 -0
  368. package/dist/orchestration/execution-journal.d.ts +15 -0
  369. package/dist/orchestration/execution-journal.d.ts.map +1 -0
  370. package/dist/orchestration/execution-journal.js +477 -0
  371. package/dist/orchestration/execution-journal.js.map +1 -0
  372. package/dist/orchestration/execution-store.d.ts +39 -0
  373. package/dist/orchestration/execution-store.d.ts.map +1 -0
  374. package/dist/orchestration/execution-store.js +325 -0
  375. package/dist/orchestration/execution-store.js.map +1 -0
  376. package/dist/orchestration/execution.d.ts +8 -0
  377. package/dist/orchestration/execution.d.ts.map +1 -0
  378. package/dist/orchestration/execution.js +47 -0
  379. package/dist/orchestration/execution.js.map +1 -0
  380. package/dist/orchestration/index.d.ts +20 -0
  381. package/dist/orchestration/index.d.ts.map +1 -0
  382. package/dist/orchestration/index.js +17 -0
  383. package/dist/orchestration/index.js.map +1 -0
  384. package/dist/orchestration/progress.d.ts +19 -0
  385. package/dist/orchestration/progress.d.ts.map +1 -0
  386. package/dist/orchestration/progress.js +20 -0
  387. package/dist/orchestration/progress.js.map +1 -0
  388. package/dist/orchestration/recovery.d.ts +4 -0
  389. package/dist/orchestration/recovery.d.ts.map +1 -0
  390. package/dist/orchestration/recovery.js +121 -0
  391. package/dist/orchestration/recovery.js.map +1 -0
  392. package/dist/orchestration/request-accounting.d.ts +35 -0
  393. package/dist/orchestration/request-accounting.d.ts.map +1 -0
  394. package/dist/orchestration/request-accounting.js +71 -0
  395. package/dist/orchestration/request-accounting.js.map +1 -0
  396. package/dist/orchestration/routing.d.ts +20 -0
  397. package/dist/orchestration/routing.d.ts.map +1 -0
  398. package/dist/orchestration/routing.js +38 -0
  399. package/dist/orchestration/routing.js.map +1 -0
  400. package/dist/orchestration/store.d.ts +26 -0
  401. package/dist/orchestration/store.d.ts.map +1 -0
  402. package/dist/orchestration/store.js +381 -0
  403. package/dist/orchestration/store.js.map +1 -0
  404. package/dist/orchestration/types.d.ts +201 -0
  405. package/dist/orchestration/types.d.ts.map +1 -0
  406. package/dist/orchestration/types.js +11 -0
  407. package/dist/orchestration/types.js.map +1 -0
  408. package/dist/orchestration/validation.d.ts +29 -0
  409. package/dist/orchestration/validation.d.ts.map +1 -0
  410. package/dist/orchestration/validation.js +440 -0
  411. package/dist/orchestration/validation.js.map +1 -0
  412. package/dist/orchestration/verification.d.ts +30 -0
  413. package/dist/orchestration/verification.d.ts.map +1 -0
  414. package/dist/orchestration/verification.js +204 -0
  415. package/dist/orchestration/verification.js.map +1 -0
  416. package/dist/orchestration/worker-context.d.ts +33 -0
  417. package/dist/orchestration/worker-context.d.ts.map +1 -0
  418. package/dist/orchestration/worker-context.js +31 -0
  419. package/dist/orchestration/worker-context.js.map +1 -0
  420. package/dist/policy.d.ts +1 -0
  421. package/dist/policy.d.ts.map +1 -1
  422. package/dist/policy.js +25 -5
  423. package/dist/policy.js.map +1 -1
  424. package/dist/preferences/controls.d.ts +21 -0
  425. package/dist/preferences/controls.d.ts.map +1 -0
  426. package/dist/preferences/controls.js +36 -0
  427. package/dist/preferences/controls.js.map +1 -0
  428. package/dist/preferences/flags.d.ts +8 -0
  429. package/dist/preferences/flags.d.ts.map +1 -0
  430. package/dist/preferences/flags.js +27 -0
  431. package/dist/preferences/flags.js.map +1 -0
  432. package/dist/preferences/index.d.ts +9 -0
  433. package/dist/preferences/index.d.ts.map +1 -0
  434. package/dist/preferences/index.js +9 -0
  435. package/dist/preferences/index.js.map +1 -0
  436. package/dist/preferences/once.d.ts +8 -0
  437. package/dist/preferences/once.d.ts.map +1 -0
  438. package/dist/preferences/once.js +28 -0
  439. package/dist/preferences/once.js.map +1 -0
  440. package/dist/preferences/resolve.d.ts +14 -0
  441. package/dist/preferences/resolve.d.ts.map +1 -0
  442. package/dist/preferences/resolve.js +58 -0
  443. package/dist/preferences/resolve.js.map +1 -0
  444. package/dist/preferences/store.d.ts +19 -0
  445. package/dist/preferences/store.d.ts.map +1 -0
  446. package/dist/preferences/store.js +147 -0
  447. package/dist/preferences/store.js.map +1 -0
  448. package/dist/preferences/submission.d.ts +16 -0
  449. package/dist/preferences/submission.d.ts.map +1 -0
  450. package/dist/preferences/submission.js +29 -0
  451. package/dist/preferences/submission.js.map +1 -0
  452. package/dist/preferences/types.d.ts +23 -0
  453. package/dist/preferences/types.d.ts.map +1 -0
  454. package/dist/preferences/types.js +2 -0
  455. package/dist/preferences/types.js.map +1 -0
  456. package/dist/preferences/validate.d.ts +3 -0
  457. package/dist/preferences/validate.d.ts.map +1 -0
  458. package/dist/preferences/validate.js +15 -0
  459. package/dist/preferences/validate.js.map +1 -0
  460. package/dist/process-cancellation.d.ts +6 -0
  461. package/dist/process-cancellation.d.ts.map +1 -0
  462. package/dist/process-cancellation.js +39 -0
  463. package/dist/process-cancellation.js.map +1 -0
  464. package/dist/providers/anthropic.d.ts +7 -2
  465. package/dist/providers/anthropic.d.ts.map +1 -1
  466. package/dist/providers/anthropic.js +72 -41
  467. package/dist/providers/anthropic.js.map +1 -1
  468. package/dist/providers/bedrock.d.ts +1 -1
  469. package/dist/providers/bedrock.d.ts.map +1 -1
  470. package/dist/providers/bedrock.js +39 -23
  471. package/dist/providers/bedrock.js.map +1 -1
  472. package/dist/providers/compat.d.ts +4 -3
  473. package/dist/providers/compat.d.ts.map +1 -1
  474. package/dist/providers/compat.js +49 -31
  475. package/dist/providers/compat.js.map +1 -1
  476. package/dist/providers/deepseek-reasoning.d.ts +64 -0
  477. package/dist/providers/deepseek-reasoning.d.ts.map +1 -0
  478. package/dist/providers/deepseek-reasoning.js +28 -0
  479. package/dist/providers/deepseek-reasoning.js.map +1 -0
  480. package/dist/providers/google.d.ts +4 -3
  481. package/dist/providers/google.d.ts.map +1 -1
  482. package/dist/providers/google.js +128 -19
  483. package/dist/providers/google.js.map +1 -1
  484. package/dist/providers/index.d.ts +2 -0
  485. package/dist/providers/index.d.ts.map +1 -1
  486. package/dist/providers/index.js +216 -36
  487. package/dist/providers/index.js.map +1 -1
  488. package/dist/providers/ollama.d.ts.map +1 -1
  489. package/dist/providers/ollama.js +79 -43
  490. package/dist/providers/ollama.js.map +1 -1
  491. package/dist/providers/openai.d.ts +2 -2
  492. package/dist/providers/openai.d.ts.map +1 -1
  493. package/dist/providers/openai.js +50 -46
  494. package/dist/providers/openai.js.map +1 -1
  495. package/dist/providers/openrouter-bounds.d.ts +22 -0
  496. package/dist/providers/openrouter-bounds.d.ts.map +1 -0
  497. package/dist/providers/openrouter-bounds.js +16 -0
  498. package/dist/providers/openrouter-bounds.js.map +1 -0
  499. package/dist/providers/stream-attempt.d.ts +29 -0
  500. package/dist/providers/stream-attempt.d.ts.map +1 -0
  501. package/dist/providers/stream-attempt.js +63 -0
  502. package/dist/providers/stream-attempt.js.map +1 -0
  503. package/dist/providers/types.d.ts +40 -4
  504. package/dist/providers/types.d.ts.map +1 -1
  505. package/dist/providers/types.js +19 -0
  506. package/dist/providers/types.js.map +1 -1
  507. package/dist/replay.d.ts.map +1 -1
  508. package/dist/replay.js +16 -0
  509. package/dist/replay.js.map +1 -1
  510. package/dist/risk.d.ts.map +1 -1
  511. package/dist/risk.js +5 -0
  512. package/dist/risk.js.map +1 -1
  513. package/dist/router.d.ts +7 -110
  514. package/dist/router.d.ts.map +1 -1
  515. package/dist/router.js +0 -451
  516. package/dist/router.js.map +1 -1
  517. package/dist/routing/index.d.ts +6 -0
  518. package/dist/routing/index.d.ts.map +1 -0
  519. package/dist/routing/index.js +5 -0
  520. package/dist/routing/index.js.map +1 -0
  521. package/dist/routing/prompt.d.ts +4 -0
  522. package/dist/routing/prompt.d.ts.map +1 -0
  523. package/dist/routing/prompt.js +14 -0
  524. package/dist/routing/prompt.js.map +1 -0
  525. package/dist/routing/select.d.ts +9 -0
  526. package/dist/routing/select.d.ts.map +1 -0
  527. package/dist/routing/select.js +279 -0
  528. package/dist/routing/select.js.map +1 -0
  529. package/dist/routing/smart.d.ts +31 -0
  530. package/dist/routing/smart.d.ts.map +1 -0
  531. package/dist/routing/smart.js +46 -0
  532. package/dist/routing/smart.js.map +1 -0
  533. package/dist/routing/types.d.ts +79 -0
  534. package/dist/routing/types.d.ts.map +1 -0
  535. package/dist/routing/types.js +2 -0
  536. package/dist/routing/types.js.map +1 -0
  537. package/dist/runlog.d.ts +32 -4
  538. package/dist/runlog.d.ts.map +1 -1
  539. package/dist/runlog.js +22 -6
  540. package/dist/runlog.js.map +1 -1
  541. package/dist/runtime/index.d.ts +6 -0
  542. package/dist/runtime/index.d.ts.map +1 -0
  543. package/dist/runtime/index.js +6 -0
  544. package/dist/runtime/index.js.map +1 -0
  545. package/dist/runtime/permissions.d.ts +21 -0
  546. package/dist/runtime/permissions.d.ts.map +1 -0
  547. package/dist/runtime/permissions.js +110 -0
  548. package/dist/runtime/permissions.js.map +1 -0
  549. package/dist/runtime/repair.d.ts +20 -0
  550. package/dist/runtime/repair.d.ts.map +1 -0
  551. package/dist/runtime/repair.js +50 -0
  552. package/dist/runtime/repair.js.map +1 -0
  553. package/dist/runtime/tool-retry.d.ts +3 -0
  554. package/dist/runtime/tool-retry.d.ts.map +1 -0
  555. package/dist/runtime/tool-retry.js +12 -0
  556. package/dist/runtime/tool-retry.js.map +1 -0
  557. package/dist/runtime/turn.d.ts +97 -0
  558. package/dist/runtime/turn.d.ts.map +1 -0
  559. package/dist/runtime/turn.js +437 -0
  560. package/dist/runtime/turn.js.map +1 -0
  561. package/dist/runtime/types.d.ts +11 -0
  562. package/dist/runtime/types.d.ts.map +1 -0
  563. package/dist/runtime/types.js +5 -0
  564. package/dist/runtime/types.js.map +1 -0
  565. package/dist/sandbox/docker.d.ts +4 -4
  566. package/dist/sandbox/docker.d.ts.map +1 -1
  567. package/dist/sandbox/docker.js +55 -16
  568. package/dist/sandbox/docker.js.map +1 -1
  569. package/dist/sandbox/native.d.ts +1 -0
  570. package/dist/sandbox/native.d.ts.map +1 -1
  571. package/dist/sandbox/native.js +11 -2
  572. package/dist/sandbox/native.js.map +1 -1
  573. package/dist/scope.d.ts +5 -9
  574. package/dist/scope.d.ts.map +1 -1
  575. package/dist/scope.js +43 -20
  576. package/dist/scope.js.map +1 -1
  577. package/dist/session-management/actions.d.ts +28 -0
  578. package/dist/session-management/actions.d.ts.map +1 -0
  579. package/dist/session-management/actions.js +78 -0
  580. package/dist/session-management/actions.js.map +1 -0
  581. package/dist/session-management/cli.d.ts +24 -0
  582. package/dist/session-management/cli.d.ts.map +1 -0
  583. package/dist/session-management/cli.js +92 -0
  584. package/dist/session-management/cli.js.map +1 -0
  585. package/dist/session-management/files.d.ts +5 -0
  586. package/dist/session-management/files.d.ts.map +1 -0
  587. package/dist/session-management/files.js +92 -0
  588. package/dist/session-management/files.js.map +1 -0
  589. package/dist/session-management/index.d.ts +7 -0
  590. package/dist/session-management/index.d.ts.map +1 -0
  591. package/dist/session-management/index.js +7 -0
  592. package/dist/session-management/index.js.map +1 -0
  593. package/dist/session-management/permissions.d.ts +12 -0
  594. package/dist/session-management/permissions.d.ts.map +1 -0
  595. package/dist/session-management/permissions.js +33 -0
  596. package/dist/session-management/permissions.js.map +1 -0
  597. package/dist/session-management/presentation.d.ts +5 -0
  598. package/dist/session-management/presentation.d.ts.map +1 -0
  599. package/dist/session-management/presentation.js +10 -0
  600. package/dist/session-management/presentation.js.map +1 -0
  601. package/dist/session-management/transfer.d.ts +9 -0
  602. package/dist/session-management/transfer.d.ts.map +1 -0
  603. package/dist/session-management/transfer.js +39 -0
  604. package/dist/session-management/transfer.js.map +1 -0
  605. package/dist/sessions/context.d.ts +4 -0
  606. package/dist/sessions/context.d.ts.map +1 -0
  607. package/dist/sessions/context.js +6 -0
  608. package/dist/sessions/context.js.map +1 -0
  609. package/dist/sessions/format.d.ts +38 -0
  610. package/dist/sessions/format.d.ts.map +1 -0
  611. package/dist/sessions/format.js +116 -0
  612. package/dist/sessions/format.js.map +1 -0
  613. package/dist/sessions/history.d.ts +37 -0
  614. package/dist/sessions/history.d.ts.map +1 -0
  615. package/dist/sessions/history.js +197 -0
  616. package/dist/sessions/history.js.map +1 -0
  617. package/dist/sessions/index.d.ts +8 -0
  618. package/dist/sessions/index.d.ts.map +1 -0
  619. package/dist/sessions/index.js +8 -0
  620. package/dist/sessions/index.js.map +1 -0
  621. package/dist/sessions/output.d.ts +31 -0
  622. package/dist/sessions/output.d.ts.map +1 -0
  623. package/dist/sessions/output.js +115 -0
  624. package/dist/sessions/output.js.map +1 -0
  625. package/dist/sessions/portable.d.ts +26 -0
  626. package/dist/sessions/portable.d.ts.map +1 -0
  627. package/dist/sessions/portable.js +105 -0
  628. package/dist/sessions/portable.js.map +1 -0
  629. package/dist/sessions/snapshot.d.ts +11 -0
  630. package/dist/sessions/snapshot.d.ts.map +1 -0
  631. package/dist/sessions/snapshot.js +118 -0
  632. package/dist/sessions/snapshot.js.map +1 -0
  633. package/dist/sessions/tool-state.d.ts +11 -0
  634. package/dist/sessions/tool-state.d.ts.map +1 -0
  635. package/dist/sessions/tool-state.js +152 -0
  636. package/dist/sessions/tool-state.js.map +1 -0
  637. package/dist/setup.d.ts.map +1 -1
  638. package/dist/setup.js +13 -5
  639. package/dist/setup.js.map +1 -1
  640. package/dist/spawning/actions.d.ts +23 -0
  641. package/dist/spawning/actions.d.ts.map +1 -0
  642. package/dist/spawning/actions.js +120 -0
  643. package/dist/spawning/actions.js.map +1 -0
  644. package/dist/spawning/authority.d.ts +15 -0
  645. package/dist/spawning/authority.d.ts.map +1 -0
  646. package/dist/spawning/authority.js +16 -0
  647. package/dist/spawning/authority.js.map +1 -0
  648. package/dist/spawning/cli.d.ts +4 -0
  649. package/dist/spawning/cli.d.ts.map +1 -0
  650. package/dist/spawning/cli.js +46 -0
  651. package/dist/spawning/cli.js.map +1 -0
  652. package/dist/spawning/execution.d.ts +13 -0
  653. package/dist/spawning/execution.d.ts.map +1 -0
  654. package/dist/spawning/execution.js +59 -0
  655. package/dist/spawning/execution.js.map +1 -0
  656. package/dist/spawning/index.d.ts +8 -0
  657. package/dist/spawning/index.d.ts.map +1 -0
  658. package/dist/spawning/index.js +8 -0
  659. package/dist/spawning/index.js.map +1 -0
  660. package/dist/spawning/store.d.ts +12 -0
  661. package/dist/spawning/store.d.ts.map +1 -0
  662. package/dist/spawning/store.js +93 -0
  663. package/dist/spawning/store.js.map +1 -0
  664. package/dist/spawning/types.d.ts +34 -0
  665. package/dist/spawning/types.d.ts.map +1 -0
  666. package/dist/spawning/types.js +2 -0
  667. package/dist/spawning/types.js.map +1 -0
  668. package/dist/spawning/validation.d.ts +14 -0
  669. package/dist/spawning/validation.d.ts.map +1 -0
  670. package/dist/spawning/validation.js +95 -0
  671. package/dist/spawning/validation.js.map +1 -0
  672. package/dist/storage.d.ts +29 -1
  673. package/dist/storage.d.ts.map +1 -1
  674. package/dist/storage.js +112 -40
  675. package/dist/storage.js.map +1 -1
  676. package/dist/supervision/approval.d.ts +4 -0
  677. package/dist/supervision/approval.d.ts.map +1 -0
  678. package/dist/supervision/approval.js +7 -0
  679. package/dist/supervision/approval.js.map +1 -0
  680. package/dist/supervision/availability.d.ts +34 -0
  681. package/dist/supervision/availability.d.ts.map +1 -0
  682. package/dist/supervision/availability.js +44 -0
  683. package/dist/supervision/availability.js.map +1 -0
  684. package/dist/supervision/context.d.ts +36 -0
  685. package/dist/supervision/context.d.ts.map +1 -0
  686. package/dist/supervision/context.js +52 -0
  687. package/dist/supervision/context.js.map +1 -0
  688. package/dist/supervision/contracts.d.ts +7 -0
  689. package/dist/supervision/contracts.d.ts.map +1 -0
  690. package/dist/supervision/contracts.js +86 -0
  691. package/dist/supervision/contracts.js.map +1 -0
  692. package/dist/supervision/effects.d.ts +15 -0
  693. package/dist/supervision/effects.d.ts.map +1 -0
  694. package/dist/supervision/effects.js +19 -0
  695. package/dist/supervision/effects.js.map +1 -0
  696. package/dist/supervision/evidence.d.ts +32 -0
  697. package/dist/supervision/evidence.d.ts.map +1 -0
  698. package/dist/supervision/evidence.js +68 -0
  699. package/dist/supervision/evidence.js.map +1 -0
  700. package/dist/supervision/health.d.ts +16 -0
  701. package/dist/supervision/health.d.ts.map +1 -0
  702. package/dist/supervision/health.js +86 -0
  703. package/dist/supervision/health.js.map +1 -0
  704. package/dist/supervision/index.d.ts +13 -0
  705. package/dist/supervision/index.d.ts.map +1 -0
  706. package/dist/supervision/index.js +13 -0
  707. package/dist/supervision/index.js.map +1 -0
  708. package/dist/supervision/journal.d.ts +16 -0
  709. package/dist/supervision/journal.d.ts.map +1 -0
  710. package/dist/supervision/journal.js +311 -0
  711. package/dist/supervision/journal.js.map +1 -0
  712. package/dist/supervision/receipts.d.ts +4 -0
  713. package/dist/supervision/receipts.d.ts.map +1 -0
  714. package/dist/supervision/receipts.js +21 -0
  715. package/dist/supervision/receipts.js.map +1 -0
  716. package/dist/supervision/reply.d.ts +12 -0
  717. package/dist/supervision/reply.d.ts.map +1 -0
  718. package/dist/supervision/reply.js +50 -0
  719. package/dist/supervision/reply.js.map +1 -0
  720. package/dist/supervision/runtime.d.ts +8 -0
  721. package/dist/supervision/runtime.d.ts.map +1 -0
  722. package/dist/supervision/runtime.js +188 -0
  723. package/dist/supervision/runtime.js.map +1 -0
  724. package/dist/supervision/types.d.ts +174 -0
  725. package/dist/supervision/types.d.ts.map +1 -0
  726. package/dist/supervision/types.js +2 -0
  727. package/dist/supervision/types.js.map +1 -0
  728. package/dist/tools.d.ts +12 -0
  729. package/dist/tools.d.ts.map +1 -1
  730. package/dist/tools.js +131 -23
  731. package/dist/tools.js.map +1 -1
  732. package/dist/turn-controller.d.ts +12 -0
  733. package/dist/turn-controller.d.ts.map +1 -0
  734. package/dist/turn-controller.js +51 -0
  735. package/dist/turn-controller.js.map +1 -0
  736. package/dist/types.d.ts +7 -1
  737. package/dist/types.d.ts.map +1 -1
  738. package/dist/types.js +3 -0
  739. package/dist/types.js.map +1 -1
  740. package/dist/ui/agent.d.ts +11 -10
  741. package/dist/ui/agent.d.ts.map +1 -1
  742. package/dist/ui/agent.js +293 -897
  743. package/dist/ui/agent.js.map +1 -1
  744. package/dist/ui/commands.d.ts +20 -2
  745. package/dist/ui/commands.d.ts.map +1 -1
  746. package/dist/ui/commands.js +208 -155
  747. package/dist/ui/commands.js.map +1 -1
  748. package/dist/ui/completions.d.ts.map +1 -1
  749. package/dist/ui/completions.js +16 -5
  750. package/dist/ui/completions.js.map +1 -1
  751. package/dist/ui/index.d.ts +6 -2
  752. package/dist/ui/index.d.ts.map +1 -1
  753. package/dist/ui/index.js +13 -11
  754. package/dist/ui/index.js.map +1 -1
  755. package/dist/ui/messages.d.ts.map +1 -1
  756. package/dist/ui/messages.js +5 -0
  757. package/dist/ui/messages.js.map +1 -1
  758. package/dist/ui/modals/index.d.ts +1 -0
  759. package/dist/ui/modals/index.d.ts.map +1 -1
  760. package/dist/ui/modals/index.js +1 -0
  761. package/dist/ui/modals/index.js.map +1 -1
  762. package/dist/ui/modals/prompts.d.ts +4 -7
  763. package/dist/ui/modals/prompts.d.ts.map +1 -1
  764. package/dist/ui/modals/prompts.js +14 -10
  765. package/dist/ui/modals/prompts.js.map +1 -1
  766. package/dist/ui/modals/selectors.d.ts +1 -0
  767. package/dist/ui/modals/selectors.d.ts.map +1 -1
  768. package/dist/ui/modals/selectors.js +3 -2
  769. package/dist/ui/modals/selectors.js.map +1 -1
  770. package/dist/ui/modals/tool-output.d.ts +8 -0
  771. package/dist/ui/modals/tool-output.d.ts.map +1 -0
  772. package/dist/ui/modals/tool-output.js +26 -0
  773. package/dist/ui/modals/tool-output.js.map +1 -0
  774. package/dist/ui/model-commands.d.ts +4 -0
  775. package/dist/ui/model-commands.d.ts.map +1 -0
  776. package/dist/ui/model-commands.js +69 -0
  777. package/dist/ui/model-commands.js.map +1 -0
  778. package/dist/ui/regions/modal-host.d.ts +3 -0
  779. package/dist/ui/regions/modal-host.d.ts.map +1 -1
  780. package/dist/ui/regions/modal-host.js +7 -1
  781. package/dist/ui/regions/modal-host.js.map +1 -1
  782. package/dist/ui/regions/status-region.d.ts +2 -1
  783. package/dist/ui/regions/status-region.d.ts.map +1 -1
  784. package/dist/ui/regions/status-region.js +2 -2
  785. package/dist/ui/regions/status-region.js.map +1 -1
  786. package/dist/ui/regions/tool-activity.d.ts +6 -0
  787. package/dist/ui/regions/tool-activity.d.ts.map +1 -0
  788. package/dist/ui/regions/tool-activity.js +9 -0
  789. package/dist/ui/regions/tool-activity.js.map +1 -0
  790. package/dist/ui/regions/transcript-region.d.ts.map +1 -1
  791. package/dist/ui/regions/transcript-region.js +2 -1
  792. package/dist/ui/regions/transcript-region.js.map +1 -1
  793. package/dist/ui/regions/workflow-region.d.ts +9 -0
  794. package/dist/ui/regions/workflow-region.d.ts.map +1 -0
  795. package/dist/ui/regions/workflow-region.js +11 -0
  796. package/dist/ui/regions/workflow-region.js.map +1 -0
  797. package/dist/ui/session-commands.d.ts +3 -0
  798. package/dist/ui/session-commands.d.ts.map +1 -0
  799. package/dist/ui/session-commands.js +141 -0
  800. package/dist/ui/session-commands.js.map +1 -0
  801. package/dist/ui/state/use-approval-state.d.ts +9 -0
  802. package/dist/ui/state/use-approval-state.d.ts.map +1 -0
  803. package/dist/ui/state/use-approval-state.js +18 -0
  804. package/dist/ui/state/use-approval-state.js.map +1 -0
  805. package/dist/ui/state/use-chat-controller.d.ts +4 -1
  806. package/dist/ui/state/use-chat-controller.d.ts.map +1 -1
  807. package/dist/ui/state/use-chat-controller.js +256 -180
  808. package/dist/ui/state/use-chat-controller.js.map +1 -1
  809. package/dist/ui/state/use-modal-state.d.ts +6 -8
  810. package/dist/ui/state/use-modal-state.d.ts.map +1 -1
  811. package/dist/ui/state/use-modal-state.js +3 -4
  812. package/dist/ui/state/use-modal-state.js.map +1 -1
  813. package/dist/ui/state/use-model-state.d.ts +7 -3
  814. package/dist/ui/state/use-model-state.d.ts.map +1 -1
  815. package/dist/ui/state/use-model-state.js +24 -17
  816. package/dist/ui/state/use-model-state.js.map +1 -1
  817. package/dist/ui/state/use-queue-state.d.ts +4 -3
  818. package/dist/ui/state/use-queue-state.d.ts.map +1 -1
  819. package/dist/ui/state/use-queue-state.js +11 -8
  820. package/dist/ui/state/use-queue-state.js.map +1 -1
  821. package/dist/ui/state/use-session-init.d.ts +4 -0
  822. package/dist/ui/state/use-session-init.d.ts.map +1 -1
  823. package/dist/ui/state/use-session-init.js +19 -3
  824. package/dist/ui/state/use-session-init.js.map +1 -1
  825. package/dist/ui/state/use-transcript-state.d.ts +6 -3
  826. package/dist/ui/state/use-transcript-state.d.ts.map +1 -1
  827. package/dist/ui/state/use-transcript-state.js +27 -15
  828. package/dist/ui/state/use-transcript-state.js.map +1 -1
  829. package/dist/ui/status-bar.d.ts +2 -1
  830. package/dist/ui/status-bar.d.ts.map +1 -1
  831. package/dist/ui/status-bar.js +2 -2
  832. package/dist/ui/status-bar.js.map +1 -1
  833. package/dist/ui/tool-output-cache.d.ts +12 -0
  834. package/dist/ui/tool-output-cache.d.ts.map +1 -0
  835. package/dist/ui/tool-output-cache.js +27 -0
  836. package/dist/ui/tool-output-cache.js.map +1 -0
  837. package/dist/ui/tool-output-commands.d.ts +3 -0
  838. package/dist/ui/tool-output-commands.d.ts.map +1 -0
  839. package/dist/ui/tool-output-commands.js +37 -0
  840. package/dist/ui/tool-output-commands.js.map +1 -0
  841. package/dist/ui/tool-output-wrap.d.ts +3 -0
  842. package/dist/ui/tool-output-wrap.d.ts.map +1 -0
  843. package/dist/ui/tool-output-wrap.js +24 -0
  844. package/dist/ui/tool-output-wrap.js.map +1 -0
  845. package/dist/ui/tool-progress.d.ts +23 -0
  846. package/dist/ui/tool-progress.d.ts.map +1 -0
  847. package/dist/ui/tool-progress.js +42 -0
  848. package/dist/ui/tool-progress.js.map +1 -0
  849. package/dist/ui/types.d.ts +8 -0
  850. package/dist/ui/types.d.ts.map +1 -1
  851. package/dist/ui/workflow-progress.d.ts +21 -0
  852. package/dist/ui/workflow-progress.d.ts.map +1 -0
  853. package/dist/ui/workflow-progress.js +107 -0
  854. package/dist/ui/workflow-progress.js.map +1 -0
  855. package/package.json +13 -4
  856. package/scripts/verify-runlog.mjs +208 -0
@@ -7,17 +7,20 @@
7
7
  * body; index.tsx keeps only composition. It carries no JSX, so it is a plain
8
8
  * module (not a component file).
9
9
  */
10
- import { useCallback, useEffect, useRef } from 'react';
10
+ import { providerChoices, createSubmission, drainSubmissions } from '../../preferences/index.js';
11
+ import { isCancellation } from '../../cancellation.js';
12
+ import { TurnController } from '../../turn-controller.js';
13
+ import { useCallback, useEffect, useRef, useState } from 'react';
11
14
  import { useApp } from 'ink';
12
15
  import * as config from '../../config.js';
13
16
  import { selectProvider, ProviderUnavailableError } from '../../providers/index.js';
14
- import { DEFAULT_MODELS, supportsVision } from '../../types.js';
17
+ import { DEFAULT_MODELS } from '../../types.js';
15
18
  import { getSystemPromptForProvider } from '../../local-model.js';
16
19
  import { getModelContextLimit } from '../../model-detection.js';
17
20
  import { detectComplexity } from '../../risk.js';
18
21
  import * as storage from '../../storage.js';
22
+ import { RunLog } from '../../runlog.js';
19
23
  import { parseFileReferences, processFilesForMessage, formatFileInfo } from '../../files.js';
20
- import * as memory from '../../memory.js';
21
24
  import { CircuitBreaker } from '../../circuit-breaker.js';
22
25
  import { IterationLedger } from '../../iteration-ledger.js';
23
26
  import { getDefaultSmartRoutingConfig } from '../../router.js';
@@ -32,10 +35,12 @@ import { useProcessingState } from './use-processing-state.js';
32
35
  import { useTranscriptState } from './use-transcript-state.js';
33
36
  import { useSessionStats } from './use-session-stats.js';
34
37
  import { useModelState } from './use-model-state.js';
38
+ import { useApprovalState } from './use-approval-state.js';
35
39
  import { useModalState } from './use-modal-state.js';
36
40
  import { useQueueState } from './use-queue-state.js';
37
41
  import { useLoopState } from './use-loop-state.js';
38
42
  import { useSessionInit } from './use-session-init.js';
43
+ import { workflowSnapshot, retainWorkflows } from '../workflow-progress.js';
39
44
  const MAX_UNDO_HISTORY = 10;
40
45
  function makeCircuitBreaker() {
41
46
  if (config.get('circuitBreakersEnabled') === false) {
@@ -54,28 +59,36 @@ function makeCircuitBreaker() {
54
59
  }
55
60
  return cb;
56
61
  }
57
- export function useChatController() {
62
+ export function useChatController(initial, skipPermissions = false) {
58
63
  const { exit } = useApp();
59
64
  const width = useTerminalWidth();
60
65
  // -- State groups ---------------------------------------------------------
61
66
  const proc = useProcessingState();
62
- const transcript = useTranscriptState();
67
+ const sessionRef = useRef(null);
68
+ const conversationCursor = useRef(null);
69
+ const transcript = useTranscriptState(sessionRef);
63
70
  const stats = useSessionStats();
64
- const modelState = useModelState();
71
+ const modelState = useModelState(initial, skipPermissions);
65
72
  const modal = useModalState();
73
+ const approval = useApprovalState();
66
74
  const queue = useQueueState();
67
75
  const loop = useLoopState();
68
76
  const { messages, collapseSettings, clearCount, addMessage, setMessages } = transcript;
69
77
  const { isProcessing, thinkingState, streamingResponse, activityState, setIsProcessing, setThinkingState, setStreamingResponse, setActivityState } = proc;
70
78
  const { provider, model, mode, confirmMode, autoRoute, smartRouteActive, breakerHealth, setProvider, setModel, setMode, setBreakerHealth } = modelState;
71
79
  const { queuedMessages, setQueuedMessages, queuedMessagesRef, editingQueueIndex, setEditingQueueIndex } = queue;
80
+ const [workflows, setWorkflows] = useState([]);
81
+ const [workflowHudMode, setWorkflowHudMode] = useState('agents');
82
+ const onWorkflowProgress = useCallback((progress) => { const next = workflowSnapshot(progress); setWorkflows(previous => retainWorkflows(previous, next)); }, []);
83
+ const [lastRoute, setLastRoute] = useState();
72
84
  const { loopActive, loopCancelledRef, setLoopActive } = loop;
73
85
  // -- Long-lived refs ------------------------------------------------------
74
86
  const isProcessingRef = useRef(false);
87
+ const turnController = useRef(new TurnController());
88
+ useEffect(() => () => turnController.current.cancel(), []);
75
89
  const surfacedProviderErrorRef = useRef(null);
76
90
  const inputSubmitRef = useRef(null);
77
91
  const openProviderPickerRef = useRef(null);
78
- const sessionRef = useRef(null);
79
92
  const undoStack = useRef([]);
80
93
  const redoStack = useRef([]);
81
94
  const llmMessages = useRef([{ role: 'system', content: getSystemPromptForProvider(provider) }]);
@@ -83,6 +96,7 @@ export function useChatController() {
83
96
  const circuitBreakerRef = useRef(makeCircuitBreaker());
84
97
  const smartRoutingConfigRef = useRef({
85
98
  ...getDefaultSmartRoutingConfig(),
99
+ ...config.get('routing'),
86
100
  enabled: config.get('routing')?.enabled ?? false,
87
101
  costSensitivity: config.get('routing')?.costSensitivity ?? 0.3,
88
102
  });
@@ -102,8 +116,11 @@ export function useChatController() {
102
116
  providerErrorMessage = err instanceof Error ? err.message : String(err);
103
117
  actualProvider = err instanceof ProviderUnavailableError ? err.provider : 'auto';
104
118
  }
105
- const actualModel = model || DEFAULT_MODELS[actualProvider];
106
- const isModalActive = modal.modalMode !== 'none';
119
+ const matchingRoute = lastRoute?.selected && (isProcessing || lastRoute.requested.provider === provider && lastRoute.requested.model === (model ?? null)) ? lastRoute.selected : undefined;
120
+ if (matchingRoute)
121
+ actualProvider = matchingRoute.provider;
122
+ const actualModel = matchingRoute?.model || model || DEFAULT_MODELS[actualProvider];
123
+ const isModalActive = modal.modalMode !== 'none' || approval.pending !== null;
107
124
  const contextPercentage = Math.round((stats.contextTokens / getModelContextLimit(actualProvider, actualModel)) * 100);
108
125
  const resolvedBreakerHealth = config.get('circuitBreakersEnabled') !== false ? breakerHealth : undefined;
109
126
  // Surface a provider-credential problem once per unique message (per session).
@@ -114,14 +131,19 @@ export function useChatController() {
114
131
  }
115
132
  }, [providerErrorMessage, addMessage]);
116
133
  // -- Core helpers ---------------------------------------------------------
134
+ const selection = { provider, model, sources: modelState.sources, warnings: modelState.warnings };
135
+ const selectionRef = useRef(selection);
136
+ selectionRef.current = selection;
137
+ useEffect(() => { for (const warning of modelState.warnings)
138
+ addMessage('system', warning); }, [modelState.warnings, addMessage]);
117
139
  const handleEditQueuedMessage = useCallback((index, newMsg) => {
118
- if (newMsg === '') {
119
- setQueuedMessages(prev => prev.filter((_, i) => i !== index));
120
- addMessage('system', `🗑️ Deleted queued message #${index + 1}`);
140
+ try {
141
+ setQueuedMessages(previous => previous.flatMap((message, i) => i !== index ? [message]
142
+ : newMsg ? [{ ...createSubmission(newMsg, message.base), id: message.id }] : []));
143
+ addMessage('system', `${newMsg ? 'Updated' : 'Deleted'} queued message #${index + 1}`);
121
144
  }
122
- else {
123
- setQueuedMessages(prev => prev.map((msg, i) => i === index ? newMsg : msg));
124
- addMessage('system', `✏️ Updated queued message #${index + 1}`);
145
+ catch (error) {
146
+ addMessage('error', error instanceof Error ? error.message : 'Cannot edit queued message');
125
147
  }
126
148
  }, [addMessage, setQueuedMessages]);
127
149
  const validateAndRepairMessages = useCallback(() => {
@@ -168,11 +190,24 @@ export function useChatController() {
168
190
  // -- Agent / command context builders ------------------------------------
169
191
  const buildAgentContext = useCallback(() => ({
170
192
  provider, model, mode, confirmMode, autoRoute, actualProvider, actualModel,
193
+ approvals: approval.store,
194
+ approve: (decision, signal) => !confirmMode ? Promise.resolve('allow')
195
+ : decision.request ? approval.request(decision.request, signal) : Promise.resolve('reject'),
196
+ preferenceSources: modelState.sources,
197
+ onCheckpoint: (messages, status) => {
198
+ const cursor = conversationCursor.current;
199
+ if (!cursor || cursor.sessionId !== sessionRef.current?.id)
200
+ throw new Error('Session recovery unavailable; start /new before continuing.');
201
+ const snapshot = storage.saveSessionConversation(cursor.sessionId, messages, { expectedRevision: cursor.revision, status });
202
+ cursor.revision = snapshot.revision;
203
+ RunLog.open(cursor.sessionId).sessionCheckpoint({ revision: snapshot.revision, status: snapshot.status, messageCount: snapshot.messages.length, checksum: snapshot.checksum });
204
+ },
171
205
  stats: stats.stats,
172
206
  ledger: ledgerRef.current,
173
207
  circuitBreaker: circuitBreakerRef.current || undefined,
174
208
  smartRouteActive,
175
209
  smartRoutingConfig: smartRoutingConfigRef.current,
210
+ onRoute: setLastRoute,
176
211
  setBreakerHealth,
177
212
  setStats: stats.setStats,
178
213
  setStreamingResponse,
@@ -180,42 +215,99 @@ export function useChatController() {
180
215
  setActivityState,
181
216
  setContextTokens: stats.setContextTokens,
182
217
  setIsProcessing,
183
- setQueuedMessages,
184
218
  setEditingQueueIndex,
185
219
  setLoopIteration: loop.setLoopIteration,
186
220
  setLoopActive,
187
221
  llmMessages,
188
- queuedMessagesRef,
189
222
  loopCancelledRef,
190
223
  sessionRef,
191
224
  addMessage,
192
225
  estimateContextTokens,
193
226
  validateAndRepairMessages,
194
227
  debugLog,
195
- }), [provider, model, mode, confirmMode, autoRoute, smartRouteActive, actualProvider, actualModel,
228
+ }), [approval.store, approval.request, provider, model, modelState.sources, mode, confirmMode, autoRoute, smartRouteActive, actualProvider, actualModel,
196
229
  stats.stats, stats.setStats, stats.setContextTokens, setBreakerHealth, setStreamingResponse,
197
230
  setThinkingState, setActivityState, setIsProcessing, setQueuedMessages, setEditingQueueIndex,
198
231
  loop.setLoopIteration, setLoopActive, addMessage, estimateContextTokens, validateAndRepairMessages]);
199
- const runAgent = useCallback(async (content) => {
200
- await runAgentImpl(buildAgentContext(), content);
201
- }, [buildAgentContext]);
232
+ const agentContextRef = useRef(buildAgentContext);
233
+ agentContextRef.current = buildAgentContext;
234
+ const runSubmission = useCallback(async (first, signal, modeOverride) => {
235
+ const outcome = await drainSubmissions(first, {
236
+ signal,
237
+ next: () => {
238
+ const next = queuedMessagesRef.current[0];
239
+ if (next) {
240
+ setQueuedMessages(previous => previous.slice(1));
241
+ setEditingQueueIndex(null);
242
+ }
243
+ return next;
244
+ },
245
+ run: async (submission) => {
246
+ const activeCwd = sessionRef.current?.projectPath ?? process.cwd();
247
+ const { text, files } = parseFileReferences(submission.prompt, activeCwd);
248
+ addMessage('user', files.length ? `${text}\n📎 ${formatFileInfo(files)}` : submission.prompt);
249
+ let content = submission.prompt;
250
+ if (files.length) {
251
+ // Retain attached images; the shared router validates discovered vision
252
+ // support before inference instead of a static provider-name guess.
253
+ const prepared = processFilesForMessage(text || submission.prompt, files, true);
254
+ content = prepared.content;
255
+ for (const warning of prepared.warnings)
256
+ addMessage('system', warning);
257
+ }
258
+ if (fleetActive())
259
+ fleetPostMessage(text || submission.prompt);
260
+ return runAgentImpl({ ...agentContextRef.current(), signal, ...(submission.id === first.id && modeOverride ? { mode: modeOverride } : {}), provider: submission.selection.provider,
261
+ model: submission.selection.model, preferenceSources: submission.selection.sources }, content);
262
+ },
263
+ });
264
+ if (outcome === 'limit' && queuedMessagesRef.current.length)
265
+ addMessage('system', 'Processed 100 turns; remaining queued work is paused. Submit a new turn to continue.');
266
+ return outcome === 'empty';
267
+ }, [addMessage, setQueuedMessages, setEditingQueueIndex]);
268
+ const runAgent = useCallback(async (submission, modeOverride) => {
269
+ await turnController.current.run(async (signal) => { await runSubmission(submission, signal, modeOverride); });
270
+ }, [runSubmission]);
202
271
  const runLoop = useCallback(async (prompt, maxIter, completionPromise) => {
203
- await runLoopImpl(buildAgentContext(), prompt, maxIter, completionPromise);
204
- }, [buildAgentContext]);
272
+ await turnController.current.run(signal => runLoopImpl({ ...buildAgentContext(), signal, afterLoopTurn: async () => {
273
+ const next = queuedMessagesRef.current[0];
274
+ if (!next)
275
+ return true;
276
+ setQueuedMessages(previous => previous.slice(1));
277
+ setEditingQueueIndex(null);
278
+ return runSubmission(next, signal);
279
+ } }, prompt, maxIter, completionPromise));
280
+ }, [buildAgentContext, runSubmission, setQueuedMessages, setEditingQueueIndex]);
205
281
  const handleFleetInstruction = useCallback((instruction) => {
206
282
  if (isProcessingRef.current) {
207
- setQueuedMessages(prev => [...prev, instruction]);
283
+ try {
284
+ setQueuedMessages(prev => [...prev, createSubmission(instruction, selectionRef.current)]);
285
+ }
286
+ catch (error) {
287
+ addMessage('error', error instanceof Error ? error.message : 'Cannot queue instruction');
288
+ }
208
289
  }
209
290
  else {
210
291
  void inputSubmitRef.current?.(instruction);
211
292
  }
212
- }, [setQueuedMessages]);
293
+ }, [setQueuedMessages, addMessage]);
213
294
  const buildCommandContext = useCallback(() => ({
214
- actualProvider, actualModel, model, mode, confirmMode,
295
+ onWorkflowProgress, workflowHudMode, setWorkflowHudMode,
296
+ toolOutputs: transcript.toolOutputs,
297
+ showToolOutput: output => { modal.setToolOutput(output); modal.setModalMode('tool-output'); },
298
+ approvals: approval.store,
299
+ approve: (decision, signal) => !confirmMode ? Promise.resolve('allow')
300
+ : decision.request ? approval.request(decision.request, signal) : Promise.resolve('reject'),
301
+ cancelActiveTurn: () => turnController.current.cancel(),
302
+ provider, actualProvider, actualModel, model, mode, confirmMode,
303
+ reloadDefaults: modelState.reload,
304
+ conversationCursor,
305
+ clearQueued: () => { setQueuedMessages([]); setEditingQueueIndex(null); },
306
+ submitOnce: async (input) => { inputSubmitRef.current?.(input); },
215
307
  messages, stats: stats.stats, loopActive, isProcessing, thinkingState, streamingResponse,
216
- queuedMessages, debugEnabled: isDebugEnabled(), modalMode: modal.modalMode,
308
+ queuedMessages: queuedMessages.map(message => message.text), debugEnabled: isDebugEnabled(), modalMode: modal.modalMode,
217
309
  ledger: ledgerRef.current,
218
- setProvider, setModel, setMode,
310
+ setProvider, setModel, setMode, setConfirmMode: modelState.setConfirmMode,
219
311
  setMessages,
220
312
  setStats: stats.setStats,
221
313
  setModalMode: modal.setModalMode,
@@ -237,19 +329,54 @@ export function useChatController() {
237
329
  runLoop,
238
330
  startFleetPolling: () => { fleetStartPolling(handleFleetInstruction); },
239
331
  openProviderPicker: () => openProviderPickerRef.current?.(),
240
- }), [actualProvider, actualModel, model, mode, confirmMode, messages, stats.stats, stats.setStats,
332
+ }), [onWorkflowProgress, workflowHudMode, approval.store, approval.request, transcript.toolOutputs, provider, modelState.reload, actualProvider, actualModel, model, mode, confirmMode, messages, stats.stats, stats.setStats,
241
333
  stats.setContextTokens, loopActive, isProcessing, thinkingState, streamingResponse, queuedMessages,
242
- modal.modalMode, modal.setModalMode, modal.setAvailableModels, setProvider, setModel, setMode,
334
+ modal.modalMode, modal.setModalMode, modal.setToolOutput, modal.setAvailableModels, setProvider, setModel, setMode, modelState.setConfirmMode,
243
335
  setMessages, setLoopActive, loop.setLoopPrompt, loop.setLoopMaxIterations, loop.setLoopCompletionPromise,
244
336
  loop.setLoopIteration, addMessage, estimateContextTokens, runLoop, handleFleetInstruction]);
245
337
  const handleCommandWrapped = useCallback(async (cmd) => {
246
- await handleCommand(cmd, buildCommandContext());
247
- }, [buildCommandContext]);
338
+ const parts = cmd.trim().split(/\s+/);
339
+ const controlled = ['/provider', '/model', '/defaults', '/permissions', '/auto', '/new', '/resume', '/branch', '/checkout', '/diff', '/replay', '/export', '/import'].includes(parts[0].toLowerCase()) || parts[0] === '/doctor' && parts.includes('--probe')
340
+ || parts[0].toLowerCase() === '/run' && !!parts[1] && !['list', 'status', 'replay', 'cancel'].includes(parts[1]) || parts[0].toLowerCase() === '/agents' && parts[1] === 'retry'
341
+ || parts[0].toLowerCase() === '/orchestrate' && !['list', 'status', 'proposal', 'replay', 'cancel'].includes(parts[1] ?? '');
342
+ try {
343
+ const orchestration = parts[0].toLowerCase() === '/agents' ? await import('../../orchestration/index.js') : undefined;
344
+ if (orchestration?.isSpawnArgs(orchestration.parseOrchestrationArgs(cmd.slice(parts[0].length)))) {
345
+ setIsProcessing(true);
346
+ try {
347
+ await turnController.current.join(signal => handleCommand(cmd, { ...buildCommandContext(), isProcessing: false, signal }));
348
+ }
349
+ finally {
350
+ if (!turnController.current.busy)
351
+ setIsProcessing(false);
352
+ }
353
+ }
354
+ else if (controlled) {
355
+ if (turnController.current.busy) {
356
+ addMessage('error', 'Wait for the active operation or cancel it before starting another operation or changing settings.');
357
+ return;
358
+ }
359
+ setIsProcessing(true);
360
+ try {
361
+ await turnController.current.run(signal => handleCommand(cmd, { ...buildCommandContext(), isProcessing: false, signal }));
362
+ }
363
+ finally {
364
+ setIsProcessing(false);
365
+ }
366
+ }
367
+ else
368
+ await handleCommand(cmd, buildCommandContext());
369
+ }
370
+ catch (error) {
371
+ if (!isCancellation(error))
372
+ addMessage('error', error instanceof Error ? error.message : 'Command failed');
373
+ }
374
+ }, [buildCommandContext, addMessage, setIsProcessing]);
248
375
  // -- Submit (routing) -----------------------------------------------------
249
376
  // The input-widget concerns (history, clearing) live in InputRegion; this is
250
377
  // the content-processing half of the original handleSubmit.
251
378
  const onSubmitMessage = useCallback(async (trimmed) => {
252
- if (trimmed.startsWith('/')) {
379
+ if (trimmed.startsWith('/') && !/^\/once(?:\s|$)/i.test(trimmed)) {
253
380
  await handleCommandWrapped(trimmed);
254
381
  return;
255
382
  }
@@ -277,58 +404,48 @@ export function useChatController() {
277
404
  }
278
405
  return;
279
406
  }
280
- // In hybrid mode, check for complex operations
407
+ let submission;
408
+ try {
409
+ submission = createSubmission(trimmed, selectionRef.current);
410
+ }
411
+ catch (error) {
412
+ addMessage('error', error instanceof Error ? error.message : 'Invalid prompt');
413
+ return;
414
+ }
281
415
  if (mode === 'hybrid') {
282
- const complexity = detectComplexity(trimmed);
416
+ const complexity = detectComplexity(submission.prompt);
283
417
  if (complexity.isComplex) {
284
- modal.setPendingComplexPrompt({ prompt: trimmed, complexity });
418
+ modal.setPendingComplexPrompt({ prompt: submission.prompt, submission, complexity });
285
419
  modal.setModalMode('complexity-warning');
286
420
  return;
287
421
  }
288
422
  }
289
- // Save state for undo before modifying conversation
290
423
  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
424
  setIsProcessing(true);
307
425
  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);
426
+ await runAgent(submission);
427
+ }
428
+ catch (error) {
429
+ if (!isCancellation(error))
430
+ addMessage('error', error instanceof Error ? error.message : 'Turn failed');
321
431
  }
322
432
  finally {
323
- setIsProcessing(false);
324
- setThinkingState(null);
325
- setStreamingResponse('');
433
+ if (!turnController.current.busy) {
434
+ setIsProcessing(false);
435
+ setThinkingState(null);
436
+ setStreamingResponse('');
437
+ }
326
438
  }
327
- }, [handleCommandWrapped, runAgent, addMessage, provider, model, saveUndoState, mode,
328
- modal, setIsProcessing, setThinkingState, setStreamingResponse]);
439
+ }, [handleCommandWrapped, runAgent, addMessage, saveUndoState, mode, modal, setIsProcessing, setThinkingState, setStreamingResponse]);
329
440
  // -- Input action handlers ------------------------------------------------
330
441
  const handleQueueMessage = useCallback((msg) => {
331
- setQueuedMessages(prev => [...prev, msg]);
442
+ try {
443
+ setQueuedMessages(prev => [...prev, createSubmission(msg, selectionRef.current)]);
444
+ }
445
+ catch (error) {
446
+ addMessage('error', error instanceof Error ? error.message : 'Cannot queue message');
447
+ return;
448
+ }
332
449
  addMessage('system', `📨 Queued: "${msg.substring(0, 50)}${msg.length > 50 ? '...' : ''}"`);
333
450
  }, [addMessage, setQueuedMessages]);
334
451
  const cycleMode = useCallback(() => {
@@ -340,12 +457,14 @@ export function useChatController() {
340
457
  }, [setMode]);
341
458
  const handleEscape = useCallback(() => {
342
459
  if (isProcessing) {
343
- setIsProcessing(false);
460
+ turnController.current.cancel();
461
+ loopCancelledRef.current = true;
344
462
  setThinkingState(null);
345
463
  setStreamingResponse('');
464
+ setActivityState(null);
346
465
  setLoopActive(false);
347
466
  setEditingQueueIndex(null);
348
- addMessage('system', '⏹ Operation cancelled. Press Ctrl+C again to quit.');
467
+ addMessage('system', '⏹ Cancellation requested. Waiting for active work to stop.');
349
468
  }
350
469
  else if (modal.modalMode !== 'none') {
351
470
  modal.setModalMode('none');
@@ -354,32 +473,43 @@ export function useChatController() {
354
473
  else {
355
474
  addMessage('system', '💡 Press Ctrl+C again to quit, or /exit.');
356
475
  }
357
- }, [isProcessing, modal, addMessage, setIsProcessing, setThinkingState, setStreamingResponse,
476
+ }, [isProcessing, modal, addMessage, setIsProcessing, setThinkingState, setStreamingResponse, setActivityState,
358
477
  setLoopActive, setEditingQueueIndex]);
359
- const handleExit = useCallback(() => { exit(); }, [exit]);
478
+ const handleExit = useCallback(() => { turnController.current.cancel(); exit(); }, [exit]);
360
479
  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('');
480
+ let submission;
481
+ try {
482
+ submission = createSubmission(msg, selectionRef.current);
483
+ }
484
+ catch (error) {
485
+ addMessage('error', error instanceof Error ? error.message : 'Invalid prompt');
486
+ return;
487
+ }
488
+ addMessage('system', 'Interrupting the active turn before sending the new message...');
489
+ loopCancelledRef.current = true;
490
+ void turnController.current.replace(async (signal) => {
491
+ setIsProcessing(true);
372
492
  setEditingQueueIndex(null);
493
+ saveUndoState();
494
+ await runSubmission(submission, signal);
495
+ }).catch(error => {
496
+ if (!isCancellation(error))
497
+ addMessage('error', error instanceof Error ? error.message : 'Turn failed');
498
+ }).finally(() => {
499
+ if (!turnController.current.busy) {
500
+ setIsProcessing(false);
501
+ setThinkingState(null);
502
+ setStreamingResponse('');
503
+ setEditingQueueIndex(null);
504
+ }
373
505
  });
374
- }, [addMessage, runAgent, setIsProcessing, setThinkingState, setStreamingResponse, setEditingQueueIndex]);
506
+ }, [addMessage, runSubmission, saveUndoState, setIsProcessing, setThinkingState, setStreamingResponse, setEditingQueueIndex]);
375
507
  // -- Modal handlers -------------------------------------------------------
376
508
  const handleModelSelect = useCallback((selectedModel) => {
377
- setModel(selectedModel);
378
- config.set('defaultModel', selectedModel);
379
- addMessage('system', `Model: ${selectedModel} (saved as default)`);
380
509
  modal.setModalMode('none');
381
510
  modal.setAvailableModels([]);
382
- }, [addMessage, setModel, modal]);
511
+ void handleCommandWrapped(`/model ${selectedModel}`);
512
+ }, [handleCommandWrapped, modal]);
383
513
  const handleModalCancel = useCallback(() => {
384
514
  modal.setModalMode('none');
385
515
  modal.setAvailableModels([]);
@@ -404,43 +534,21 @@ export function useChatController() {
404
534
  }
405
535
  modal.setLatestVersion(null);
406
536
  }, [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());
537
+ const openProviderPicker = useCallback(async () => {
538
+ modal.setProviderEntries(await providerChoices());
428
539
  modal.setModalMode('provider');
429
- }, [buildProviderEntries, modal]);
540
+ }, [modal]);
430
541
  useEffect(() => { openProviderPickerRef.current = openProviderPicker; }, [openProviderPicker]);
431
542
  const handleProviderSelect = useCallback((entry) => {
432
543
  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
544
  modal.setModalMode('none');
438
545
  modal.setProviderEntries([]);
546
+ void handleCommandWrapped(`/provider ${entry.id}`);
439
547
  return;
440
548
  }
441
549
  modal.setPendingSetupProvider(entry);
442
550
  modal.setModalMode('api-key-setup');
443
- }, [addMessage, setProvider, modal]);
551
+ }, [handleCommandWrapped, modal]);
444
552
  const handleProviderCancel = useCallback(() => {
445
553
  modal.setModalMode('none');
446
554
  modal.setProviderEntries([]);
@@ -455,8 +563,8 @@ export function useChatController() {
455
563
  if (entry.id === 'ollama') {
456
564
  config.setProviderCred('ollama', { baseUrl: value });
457
565
  }
458
- else if (entry.id === 'litellm') {
459
- config.setProviderCred('litellm', { baseUrl: value });
566
+ else if (entry.id === 'litellm' || entry.id === 'openai-compat') {
567
+ config.setProviderCred(entry.id, { baseUrl: value });
460
568
  }
461
569
  else if (entry.id === 'bedrock') {
462
570
  process.env.AWS_PROFILE = value;
@@ -468,27 +576,24 @@ export function useChatController() {
468
576
  else {
469
577
  config.setProviderCred(entry.id, { apiKey: value });
470
578
  }
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.`);
579
+ addMessage('system', `Configured ${entry.label}. Checking model discovery...`);
580
+ void handleCommandWrapped(`/provider ${entry.id}`);
475
581
  }
476
582
  catch (e) {
477
583
  addMessage('error', `Failed to configure ${entry.label}: ${e instanceof Error ? e.message : String(e)}`);
478
584
  }
479
585
  modal.setPendingSetupProvider(null);
480
586
  modal.setModalMode('none');
481
- }, [addMessage, setProvider, modal]);
587
+ }, [addMessage, handleCommandWrapped, modal]);
482
588
  const handleApiKeyCancel = useCallback(() => {
483
589
  modal.setPendingSetupProvider(null);
484
590
  modal.setModalMode('none');
485
591
  }, [modal]);
486
592
  // -- Session-selector / resume handlers -----------------------------------
487
593
  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.`);
594
+ void handleCommandWrapped(`/resume ${session.id}`);
490
595
  modal.setModalMode('none');
491
- }, [addMessage, modal]);
596
+ }, [handleCommandWrapped, modal]);
492
597
  const handleSessionDelete = useCallback((session) => {
493
598
  if (storage.deleteSession(session.id)) {
494
599
  addMessage('system', `🗑️ Deleted session: ${session.projectName}`);
@@ -499,62 +604,26 @@ export function useChatController() {
499
604
  }
500
605
  }, [addMessage, modal]);
501
606
  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
- }
607
+ void handleCommandWrapped('/resume');
538
608
  modal.setModalMode('none');
539
609
  modal.setPreviousSession(null);
540
- }, [addMessage, estimateContextTokens, stats, modal, actualProvider]);
610
+ }, [handleCommandWrapped, modal]);
541
611
  const handleSessionResumeNew = useCallback(() => {
542
- addMessage('system', '✓ Starting fresh session');
612
+ void handleCommandWrapped('/new');
543
613
  modal.setModalMode('none');
544
614
  modal.setPreviousSession(null);
545
- }, [addMessage, modal]);
615
+ }, [handleCommandWrapped, modal]);
546
616
  // -- Complexity-warning handlers ------------------------------------------
547
617
  const handleComplexityProceed = useCallback(async () => {
548
618
  modal.setModalMode('none');
549
- const prompt = modal.pendingComplexPrompt?.prompt;
619
+ const submission = modal.pendingComplexPrompt?.submission;
550
620
  modal.setPendingComplexPrompt(null);
551
- if (prompt === undefined)
621
+ if (!submission)
552
622
  return;
553
623
  saveUndoState();
554
- addMessage('user', typeof prompt === 'string' ? prompt : JSON.stringify(prompt));
555
624
  setIsProcessing(true);
556
625
  try {
557
- await runAgent(prompt);
626
+ await runAgent(submission);
558
627
  }
559
628
  finally {
560
629
  setIsProcessing(false);
@@ -562,16 +631,16 @@ export function useChatController() {
562
631
  }, [modal, saveUndoState, addMessage, runAgent, setIsProcessing]);
563
632
  const handleComplexityPlan = useCallback(() => {
564
633
  modal.setModalMode('none');
565
- const prompt = modal.pendingComplexPrompt?.prompt;
634
+ const submission = modal.pendingComplexPrompt?.submission;
566
635
  modal.setPendingComplexPrompt(null);
567
- if (prompt === undefined)
636
+ if (!submission)
568
637
  return;
569
638
  setMode('plan');
570
639
  addMessage('system', '📋 Switched to Plan mode - I\'ll describe what I would do without executing.');
571
640
  saveUndoState();
572
- addMessage('user', typeof prompt === 'string' ? prompt : JSON.stringify(prompt));
573
641
  setIsProcessing(true);
574
- runAgent(prompt).finally(() => setIsProcessing(false));
642
+ void runAgent(submission, 'plan').catch(error => { if (!isCancellation(error))
643
+ addMessage('error', error instanceof Error ? error.message : 'Turn failed'); }).finally(() => setIsProcessing(false));
575
644
  }, [modal, setMode, saveUndoState, addMessage, runAgent, setIsProcessing]);
576
645
  const handleComplexityCancel = useCallback(() => {
577
646
  modal.setModalMode('none');
@@ -583,6 +652,8 @@ export function useChatController() {
583
652
  }, [modal]);
584
653
  // -- Session reset (replaces the old full-remount reset) ------------------
585
654
  const resetSession = useCallback(() => {
655
+ approval.cancel();
656
+ setWorkflows([]);
586
657
  proc.reset();
587
658
  transcript.reset();
588
659
  stats.reset();
@@ -595,9 +666,9 @@ export function useChatController() {
595
666
  redoStack.current = [];
596
667
  ledgerRef.current.reset();
597
668
  resetContextWarnings();
598
- }, [proc, transcript, stats, modelState, modal, queue, loop, actualProvider]);
669
+ }, [approval.cancel, proc, transcript, stats, modelState, modal, queue, loop, actualProvider]);
599
670
  // -- Mount initialization -------------------------------------------------
600
- useSessionInit({ sessionRef, ledgerRef, llmMessages, addMessage, onFleetInstruction: handleFleetInstruction });
671
+ useSessionInit({ sessionRef, conversationCursor, ledgerRef, llmMessages, addMessage, onFleetInstruction: handleFleetInstruction });
601
672
  // -- Region prop bags -----------------------------------------------------
602
673
  // Plain objects (not memoized): TerminalChat spreads them, so each region's
603
674
  // React.memo compares individual props — all of which are stable values or
@@ -609,18 +680,22 @@ export function useChatController() {
609
680
  };
610
681
  const statusProps = {
611
682
  provider: actualProvider, model: actualModel, mode, stats: stats.stats,
612
- contextTokens: stats.contextTokens, breakerHealth: resolvedBreakerHealth, smartRouteActive, width,
683
+ contextTokens: stats.contextTokens, breakerHealth: resolvedBreakerHealth, smartRouteActive, confirmMode, width,
613
684
  };
614
685
  const inputProps = {
615
686
  onSubmitMessage, submitRef: inputSubmitRef, disabled: isModalActive, isProcessing,
616
- queuedCount: queuedMessages.length, queuedMessages, editingQueueIndex,
687
+ queuedCount: queuedMessages.length, queuedMessages: queuedMessages.map(message => message.text), editingQueueIndex,
617
688
  onQueueMessage: handleQueueMessage, onEditQueuedMessage: handleEditQueuedMessage,
618
689
  onSetEditingQueueIndex: setEditingQueueIndex, onDirectSend: handleDirectSend,
619
690
  onEscape: handleEscape, onExit: handleExit, onCycleMode: cycleMode,
620
691
  currentMode: mode, contextPercentage, cwd: process.cwd(),
621
692
  };
622
693
  const modalProps = {
623
- modalMode: modal.modalMode,
694
+ toolOutput: modal.toolOutput,
695
+ pendingApproval: approval.pending,
696
+ onApprovalAnswer: (id, choice) => { if (approval.answer(id, choice) && choice === 'cancelled')
697
+ turnController.current.cancel(); },
698
+ modalMode: approval.pending ? 'confirm' : modal.modalMode,
624
699
  availableModels: modal.availableModels, onModelSelect: handleModelSelect, onModalCancel: handleModalCancel,
625
700
  availableSessions: modal.availableSessions, onSessionSelect: handleSessionSelect, onSessionDelete: handleSessionDelete,
626
701
  latestVersion: modal.latestVersion, onUpgradeConfirm: handleUpgradeConfirm,
@@ -635,6 +710,7 @@ export function useChatController() {
635
710
  width,
636
711
  resetSession,
637
712
  transcript: transcriptProps,
713
+ workflow: { workflows, mode: workflowHudMode, width },
638
714
  status: statusProps,
639
715
  input: inputProps,
640
716
  modal: modalProps,