@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
package/README.md CHANGED
@@ -7,20 +7,34 @@ npm install -g @calliopelabs/cli
7
7
  calliope
8
8
  ```
9
9
 
10
- Single-binary installs (Homebrew and a `curl` installer, no Node.js required) are
11
- coming with the v3.0.0 stable release — see
10
+ Single-binary installs are available through Homebrew and a `curl` installer,
11
+ with no Node.js required — see
12
12
  [Install as a single binary](docs/getting-started.md#install-as-a-single-binary).
13
13
 
14
14
  ## Why Calliope
15
15
 
16
- - **Any backend, live-discovered.** 13 providers — Anthropic, OpenAI, Google, AWS Bedrock, Ollama, OpenRouter, Together, Groq, Fireworks, Mistral, AI21, Hugging Face, LiteLLM, plus any OpenAI-compatible server. No hardcoded model lists: models and capabilities are discovered from each provider's API, so new models work the day they ship.
16
+ - **Any backend, live-discovered.** Hosted providers, local runtimes, and OpenAI-compatible servers share the same workflow. Models and capabilities are discovered from provider APIs; unsupported or unknown behavior stays explicit. See the [provider matrix and real-wire evidence](docs/provider-conformance.md).
17
17
  - **Built for models you run yourself.** Ollama and self-hosted OpenAI-compatible servers are first-class targets, not checkboxes. Run fully air-gapped.
18
18
  - **Sandbox-first execution.** Shell and code tools run inside macOS Seatbelt or Docker sandboxes (`auto`/`native`/`docker`/`off`). Blocklists are advisory; the sandbox is the boundary.
19
19
  - **Safety rails that survive long sessions.** Circuit breakers, iteration budgets, git-based checkpoints with `/restore`, and automatic context compaction.
20
20
  - **Governance built in.** Tamper-evident audit run logs (on by default), a `replay` command to inspect and verify them, budget caps that halt a run before it overspends, and a pre-tool policy hook for an external allow/deny engine. See [docs/governance.md](docs/governance.md).
21
- - **Small on purpose.** 22 commands. 16 config keys. 11 flags. v3 removed more code than it kept — the changelog lists everything that went and why.
21
+ - **Focused command surface.** 23 commands, plus optional fleet mode. The [command reference](docs/commands.md) documents the available workflows and subcommands.
22
22
  - **Tested like infrastructure.** 3,500 tests, 93%+ line coverage with an enforced 90% floor.
23
23
 
24
+ ## What's new in 3.2
25
+
26
+ 3.2 turns the provider foundation into a project workbench: live provider health and
27
+ model discovery, `/doctor` diagnostics, health-aware routing, resumable sessions,
28
+ stream-safe retries, and the `auto` permission mode are available from the same
29
+ terminal and headless interfaces. It also adds reviewed orchestration with planner,
30
+ worker and verifier roles, isolated execution, bounded retry/replan supervision,
31
+ auditable artifacts, and a local Brain/KG for provenance-aware project memory.
32
+
33
+ The release includes native Bedrock reasoning preservation, Google's `@google/genai`
34
+ adapter, expanded DeepSeek/Cerebras and OpenAI-compatible coverage, and real-wire
35
+ provider evidence. See the [3.2.0 release notes](docs/releases/3.2.0.md) for the
36
+ complete feature and validation details.
37
+
24
38
  ## Quick start
25
39
 
26
40
  ```bash
@@ -32,7 +46,9 @@ Inside a session:
32
46
 
33
47
  ```
34
48
  /mode plan think first — the agent proposes, you approve
49
+ /mode auto execute without per-tool approval prompts this session
35
50
  /model list see live-discovered models for your provider
51
+ /defaults save save the current provider/model for this project
36
52
  /scope add ../lib widen file access deliberately
37
53
  /compact compress context when it grows
38
54
  /restore list git checkpoints; /restore <path> to roll back
@@ -45,6 +61,49 @@ Headless, for CI and scripts:
45
61
  calliope --headless --json "run the tests and summarize failures"
46
62
  ```
47
63
 
64
+ Plan a project goal within a fixed budget, then approve the returned proposal hash:
65
+
66
+ ```bash
67
+ calliope orchestrate "Inspect the parser and propose a focused fix" --cost 1 --json
68
+ calliope orchestrate approve GOAL_ID PROPOSAL_HASH --allow-mutations --json
69
+ ```
70
+
71
+ Planning exits 5 for review; the [goal workflow](docs/goal-planning.md) documents
72
+ scope limits, approval, recovery and the JSON contract. `/orchestrate` presents
73
+ the proposed plan and approval dialog in the REPL.
74
+
75
+ Add [`--supervise --isolation-image sha256:ID`](docs/continuous-supervision.md#start-from-a-goal)
76
+ to propose an isolated work → verify → review → retry/replan loop. Choose separate
77
+ controller, worker and optional execution-reviewer models; the existing HUD shows
78
+ roles, task attempts and bounded supervision rounds. Planning remains read-only
79
+ and execution requires approval of the exact plan.
80
+
81
+ Execute a reviewed project task graph with bounded agents:
82
+
83
+ ```bash
84
+ calliope run plan.json --dry-run --json
85
+ calliope run plan.json --allow-mutations --json
86
+ ```
87
+
88
+ Independent tasks run concurrently with per-agent permissions and shared budgets.
89
+ Recorded artifact checks determine completion; unverified criteria require human
90
+ acceptance. See [coordinator execution](docs/coordinator-execution.md) for plan
91
+ contracts, provider requirements, cancellation and recovery.
92
+
93
+ Record and query project knowledge locally, without model requests:
94
+
95
+ ```bash
96
+ calliope brain init --allow-mutations
97
+ calliope brain ingest docs/design.md --allow-mutations
98
+ calliope brain search "storage decision" --json
99
+ calliope kg graph
100
+ ```
101
+
102
+ The [project brain](docs/project-brain.md) preserves source provenance, supports
103
+ human review and reversal, tracks stale documents, and links verified run evidence.
104
+ Use `/brain` and `/kg` for the same controls in the REPL.
105
+
106
+
48
107
  ## Configuration
49
108
 
50
109
  One file, 16 keys. Credentials live in a per-provider map with environment-variable fallbacks:
@@ -63,7 +122,7 @@ One file, 16 keys. Credentials live in a per-provider map with environment-varia
63
122
 
64
123
  `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `OLLAMA_BASE_URL`, and friends work as before. v2 configs migrate automatically on first run.
65
124
 
66
- Docs: [getting started](docs/getting-started.md) · [commands](docs/commands.md) · [configuration](docs/configuration.md) · [providers](docs/providers.md) · [features](docs/features.md) · [fleet mode](docs/fleet.md)
125
+ Docs: [getting started](docs/getting-started.md) · [commands](docs/commands.md) · [configuration](docs/configuration.md) · [model preferences](docs/model-preferences.md) · [providers](docs/providers.md) · [features](docs/features.md) · [fleet mode](docs/fleet.md)
67
126
 
68
127
  ## Editors
69
128
 
@@ -75,13 +134,15 @@ Coordinate a fleet of agents and human operators over a self-hosted IRC channel
75
134
 
76
135
  ## Project memory
77
136
 
78
- Drop a `CALLIOPE.md` in your repo and every session starts knowing your conventions. `/memory` manages it.
137
+ Use `AGENTS.md` for portable repository instructions and `CALLIOPE.md` for project memory. Trusted instructions load from the checkout root to your working directory, with source paths and directory precedence. `/memory sources` shows applicable files; `/memory reload` refreshes them. See [repository instructions](docs/instructions.md).
79
138
 
80
139
  ## v3.0
81
140
 
82
141
  v3 is a deliberate reduction: 84 commands, 40 config keys, and ~20k lines of speculative features (theme packs, companions, multi-agent orchestration, an embedded API server, and more) were removed to make the core fast, predictable, and maintainable. The full list and rationale live in [CHANGELOG.md](CHANGELOG.md) and the [v3.0 roadmap](https://github.com/calliopeai/calliope-cli/issues/195).
83
142
 
84
- Coming in v3.0 stable: single-binary installs (brew/curl, no Node required) and enforced performance budgets. Governance primitives — replayable audit run logs, budget caps, and a policy hook — have landed; see [docs/governance.md](docs/governance.md). Coming after: local-model edit-reliability hardening.
143
+ Single-binary installs, enforced performance budgets, governance, ACP editor integration, and local-model edit repair shipped in v3.0. See [docs/governance.md](docs/governance.md) and [docs/local-models.md](docs/local-models.md).
144
+
145
+ The [next-version roadmap](https://github.com/calliopeai/calliope-cli/issues/254) prioritizes consistent execution across providers, portable sessions and instructions, and measured task reliability. The [first implementation](https://github.com/calliopeai/calliope-cli/issues/255) adds cancellation through provider requests, retries and local processes, plus scoped `AGENTS.md` support. See [cancellation behavior](docs/features.md#cancellation).
85
146
 
86
147
  ## Contributing
87
148
 
package/dist/acp.d.ts CHANGED
@@ -22,6 +22,7 @@
22
22
  import { AgentSideConnection, type Agent, type Stream, type InitializeRequest, type InitializeResponse, type NewSessionRequest, type NewSessionResponse, type AuthenticateResponse, type PromptRequest, type PromptResponse, type CancelNotification } from '@zed-industries/agent-client-protocol';
23
23
  declare class CalliopeAgent implements Agent {
24
24
  private readonly conn;
25
+ private readonly approvals;
25
26
  private clientCapabilities;
26
27
  private readonly sessions;
27
28
  /** Tail of the outgoing write chain; awaited to flush notifications. */
@@ -33,12 +34,8 @@ declare class CalliopeAgent implements Agent {
33
34
  prompt(params: PromptRequest): Promise<PromptResponse>;
34
35
  cancel(params: CancelNotification): Promise<void>;
35
36
  private runTurn;
36
- /** Flush pending notifications and return the cancelled stop reason. */
37
- private finishCancelled;
38
- private runToolCall;
39
37
  /** Send a terminal (completed/failed) tool_call_update to the client. */
40
38
  private reportToolResult;
41
- private gateToolCall;
42
39
  /**
43
40
  * Ask the client to authorize a tool call. Returns the user's decision, or
44
41
  * falls back to Calliope's non-interactive default (deny) when the client does
package/dist/acp.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"acp.d.ts","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EACL,mBAAmB,EAInB,KAAK,KAAK,EACV,KAAK,MAAM,EAKX,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,uCAAuC,CAAC;AAwK/C,cAAM,aAAc,YAAW,KAAK;IAMtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,OAAO,CAAC,kBAAkB,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,wEAAwE;IACxE,OAAO,CAAC,SAAS,CAAoC;IAErD,YAA6B,IAAI,EAAE,mBAAmB,EAAI;IAIpD,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoBvE;IAIK,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAElD;IAIK,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiDvE;IAIK,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB3D;IAIK,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtD;YAIa,OAAO;IAyErB,wEAAwE;YAC1D,eAAe;YAQf,WAAW;IA6DzB,yEAAyE;IACzE,OAAO,CAAC,gBAAgB;YAkBV,YAAY;IAkC1B;;;;OAIG;YACW,iBAAiB;IAiC/B;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;;;OAIG;IACH,OAAO,CAAC,IAAI;IAQZ,gDAAgD;IAChD,OAAO,CAAC,KAAK;IAIb,iEAAiE;IAC3D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAc9B;CACF;AAMD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAQtD;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAkBnD"}
1
+ {"version":3,"file":"acp.d.ts","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,OAAO,EACL,mBAAmB,EAInB,KAAK,KAAK,EACV,KAAK,MAAM,EAKX,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,uCAAuC,CAAC;AAuJ/C,cAAM,aAAc,YAAW,KAAK;IAOtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IANjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,kBAAkB,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,wEAAwE;IACxE,OAAO,CAAC,SAAS,CAAoC;IAErD,YAA6B,IAAI,EAAE,mBAAmB,EAAI;IAIpD,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoBvE;IAIK,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAElD;IAIK,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0CvE;IAIK,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CA0B3D;IAIK,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtD;YAIa,OAAO;IAsDrB,yEAAyE;IACzE,OAAO,CAAC,gBAAgB;IAkBxB;;;;OAIG;YACW,iBAAiB;IAkC/B;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;;;OAIG;IACH,OAAO,CAAC,IAAI;IAQZ,gDAAgD;IAChD,OAAO,CAAC,KAAK;IAIb,iEAAiE;IAC3D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAM9B;CACF;AAMD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAQtD;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAkBnD"}
package/dist/acp.js CHANGED
@@ -19,20 +19,24 @@
19
19
  * lazy-loaded from bin.ts only for the `acp` subcommand, so it adds nothing to the
20
20
  * default cold-start path.
21
21
  */
22
+ import { ApprovalStore } from './approvals/index.js';
22
23
  import * as path from 'node:path';
23
24
  import { Readable, Writable } from 'node:stream';
24
25
  import { AgentSideConnection, ndJsonStream, RequestError, PROTOCOL_VERSION, } from '@zed-industries/agent-client-protocol';
25
26
  import * as config from './config.js';
26
- import { chat, selectProvider } from './providers/index.js';
27
- import { TOOLS, executeTool } from './tools.js';
28
- import { DEFAULT_MODELS, calculateCost } from './types.js';
29
- import { getSystemPromptForProvider, isLocalBackend } from './local-model.js';
27
+ import { selectProvider } from './providers/index.js';
28
+ import { runTurn } from './runtime/index.js';
29
+ import { createSession, saveSessionConversation } from './storage.js';
30
+ import { SessionRecoveryError } from './sessions/index.js';
31
+ import { resolvePreferences } from './preferences/index.js';
32
+ import { cancellable, isCancellation } from './cancellation.js';
33
+ import { TOOLS } from './tools.js';
34
+ import { DEFAULT_MODELS } from './types.js';
35
+ import { getSystemPromptForProvider } from './local-model.js';
30
36
  import * as memory from './memory.js';
31
37
  import { resolveIterationLimit } from './iteration-limit.js';
38
+ import { formatBudgetHalt } from './budget.js';
32
39
  import { RunLog } from './runlog.js';
33
- import { evaluatePolicy, isPolicyEnabled } from './policy.js';
34
- import { assessToolRisk } from './risk.js';
35
- import { checkHooksAllow } from './hooks.js';
36
40
  // ============================================================================
37
41
  // Diagnostics — stderr only (stdout carries the protocol).
38
42
  // ============================================================================
@@ -61,23 +65,6 @@ function errMessage(err) {
61
65
  // ============================================================================
62
66
  // Tool → permission / presentation mapping
63
67
  // ============================================================================
64
- /**
65
- * Tools with side effects. These always route through the permission flow (and
66
- * are denied under the non-interactive fallback), matching the headless runner's
67
- * notion of a mutating tool.
68
- */
69
- const MUTATING_TOOLS = new Set(['shell', 'write_file', 'edit_file', 'git', 'execute_code', 'configure']);
70
- /**
71
- * Whether a tool call must ask the client for permission before running.
72
- * Read-only tools (read_file, list_files, think, glob, grep, web_search) run
73
- * silently; anything that mutates state or that Calliope's risk model flags for
74
- * confirmation asks first.
75
- */
76
- function toolNeedsPermission(toolCall) {
77
- if (MUTATING_TOOLS.has(toolCall.name))
78
- return true;
79
- return assessToolRisk(toolCall).requiresConfirmation;
80
- }
81
68
  /** Map a Calliope tool name to the ACP tool kind (drives client icons/UX). */
82
69
  function toolKind(name) {
83
70
  switch (name) {
@@ -156,6 +143,7 @@ function promptToText(blocks) {
156
143
  // ============================================================================
157
144
  class CalliopeAgent {
158
145
  conn;
146
+ approvals = new ApprovalStore();
159
147
  clientCapabilities = {};
160
148
  sessions = new Map();
161
149
  /** Tail of the outgoing write chain; awaited to flush notifications. */
@@ -190,8 +178,14 @@ class CalliopeAgent {
190
178
  // ---- ACP: session/new -------------------------------------------------
191
179
  async newSession(params) {
192
180
  const cwd = params.cwd || process.cwd();
193
- const provider = process.env.CALLIOPE_PROVIDER || config.get('defaultProvider');
194
- const model = process.env.CALLIOPE_MODEL || config.get('defaultModel') || '';
181
+ let preference;
182
+ try {
183
+ preference = resolvePreferences(cwd);
184
+ }
185
+ catch (error) {
186
+ throw RequestError.invalidParams({ error: error instanceof Error ? error.message : String(error) });
187
+ }
188
+ const { provider } = preference, model = preference.model || '';
195
189
  // Resolve the provider so 'auto' picks a real backend for the system prompt,
196
190
  // cost model, and local-backend flag (mirrors the headless runner). Fall back
197
191
  // to the raw provider if selection throws (chat() surfaces the real error).
@@ -202,18 +196,9 @@ class CalliopeAgent {
202
196
  catch {
203
197
  resolvedProvider = provider;
204
198
  }
205
- const localBackend = isLocalBackend(resolvedProvider);
206
199
  const costModel = model || DEFAULT_MODELS[resolvedProvider];
207
- const sessionId = `acp_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
200
+ const sessionId = createSession(cwd, { activate: false, prefix: 'acp' }).id;
208
201
  const runlog = RunLog.open(sessionId);
209
- runlog.runStart({
210
- session: sessionId,
211
- cwd,
212
- provider: resolvedProvider,
213
- model: costModel,
214
- config: config.getConfig(),
215
- mode: 'acp',
216
- });
217
202
  const systemPrompt = getSystemPromptForProvider(resolvedProvider);
218
203
  const memoryContext = memory.buildMemoryContext(cwd);
219
204
  const fullPrompt = memoryContext.trim()
@@ -225,12 +210,11 @@ class CalliopeAgent {
225
210
  provider,
226
211
  resolvedProvider,
227
212
  model,
228
- localBackend,
213
+ preference,
214
+ revision: null,
229
215
  messages: [{ role: 'system', content: fullPrompt }],
230
216
  runlog,
231
217
  cancelled: false,
232
- totals: { inputTokens: 0, outputTokens: 0, cost: 0, toolCalls: 0 },
233
- startedAt: Date.now(),
234
218
  });
235
219
  debug(`session/new: ${sessionId} cwd=${cwd} provider=${resolvedProvider} model=${costModel}`);
236
220
  return { sessionId };
@@ -241,156 +225,108 @@ class CalliopeAgent {
241
225
  if (!session) {
242
226
  throw RequestError.invalidParams({ error: `unknown session: ${params.sessionId}` });
243
227
  }
228
+ if (session.controller)
229
+ throw RequestError.invalidParams({ error: 'A prompt is already running in this session' });
230
+ session.controller = new AbortController();
244
231
  // Each prompt is a fresh turn; clear any stale cancel from a prior turn.
245
232
  session.cancelled = false;
246
233
  const text = promptToText(params.prompt);
247
234
  session.messages.push({ role: 'user', content: text });
248
- session.runlog.userPrompt(text);
249
235
  debug(`session/prompt: ${session.id} (${text.length} chars)`);
250
- const stopReason = await this.runTurn(session);
251
- await session.runlog.flush();
252
- return { stopReason };
236
+ try {
237
+ session.activeTurn = this.runTurn(session, text);
238
+ const stopReason = await session.activeTurn;
239
+ return { stopReason };
240
+ }
241
+ catch (error) {
242
+ if (!(error instanceof SessionRecoveryError) && (session.cancelled || isCancellation(error)))
243
+ return { stopReason: 'cancelled' };
244
+ throw RequestError.internalError({ error: errMessage(error) });
245
+ }
246
+ finally {
247
+ try {
248
+ await session.runlog.flush();
249
+ }
250
+ finally {
251
+ session.controller = undefined;
252
+ session.activeTurn = undefined;
253
+ }
254
+ }
253
255
  }
254
256
  // ---- ACP: session/cancel (notification) -------------------------------
255
257
  async cancel(params) {
256
258
  const session = this.sessions.get(params.sessionId);
257
259
  if (session) {
258
260
  session.cancelled = true;
261
+ session.controller?.abort();
259
262
  debug(`session/cancel: ${params.sessionId}`);
260
263
  }
261
264
  }
262
265
  // ---- The agent loop (ACP-flavoured mirror of the headless loop) --------
263
- async runTurn(session) {
264
- const maxIterations = resolveIterationLimit(config.get('maxIterations'));
265
- const costModel = session.model || DEFAULT_MODELS[session.resolvedProvider];
266
- let iteration = 0;
267
- while (iteration < maxIterations) {
268
- if (session.cancelled)
269
- return this.finishCancelled(session);
270
- iteration++;
271
- // Stream assistant text as agent_message_chunk deltas via the chat seam.
272
- let streamedChars = 0;
273
- const onToken = (token) => {
274
- if (!token)
275
- return;
276
- streamedChars += token.length;
277
- this.emit(session.id, { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: token } });
278
- };
279
- let response;
280
- try {
281
- response = await chat(session.provider, session.messages, TOOLS, session.model || undefined, onToken);
282
- }
283
- catch (err) {
284
- const msg = errMessage(err);
285
- log(`chat error: ${msg}`);
286
- session.runlog.assistantMessage({ content: `[error: ${msg}]`, tokens: { input: 0, output: 0 }, cost: 0 });
287
- await session.runlog.flush();
288
- throw RequestError.internalError({ error: msg });
289
- }
290
- // Audit + spend accounting (mirrors headless).
291
- if (response.usage) {
292
- const cost = calculateCost(costModel, response.usage.inputTokens, response.usage.outputTokens);
293
- session.totals.inputTokens += response.usage.inputTokens;
294
- session.totals.outputTokens += response.usage.outputTokens;
295
- session.totals.cost += cost;
296
- session.runlog.assistantMessage({
297
- content: response.content,
298
- tokens: { input: response.usage.inputTokens, output: response.usage.outputTokens },
299
- cost,
300
- });
301
- }
302
- else {
303
- session.runlog.assistantMessage({ content: response.content, tokens: { input: 0, output: 0 }, cost: 0 });
304
- }
305
- // Providers that don't stream: emit the assembled content once so the
306
- // client still sees the assistant message.
307
- if (streamedChars === 0 && response.content) {
308
- this.emit(session.id, { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: response.content } });
309
- }
310
- if (session.cancelled)
311
- return this.finishCancelled(session);
312
- if (response.toolCalls && response.toolCalls.length > 0) {
313
- session.messages.push({ role: 'assistant', content: response.content, toolCalls: response.toolCalls });
314
- for (const toolCall of response.toolCalls) {
315
- if (session.cancelled)
316
- return this.finishCancelled(session);
317
- const outcome = await this.runToolCall(session, toolCall);
318
- if (outcome === 'cancelled')
319
- return this.finishCancelled(session);
320
- }
321
- continue; // next model turn
322
- }
323
- // No tool calls: this is the final assistant message → end of turn.
324
- session.messages.push({ role: 'assistant', content: response.content });
325
- await this.flush();
326
- return response.finishReason === 'length' ? 'max_tokens' : 'end_turn';
327
- }
328
- // Exhausted the iteration budget.
329
- await this.flush();
330
- return 'max_turn_requests';
331
- }
332
- /** Flush pending notifications and return the cancelled stop reason. */
333
- async finishCancelled(session) {
334
- debug(`turn cancelled: ${session.id}`);
335
- await this.flush();
336
- return 'cancelled';
337
- }
338
- // ---- One tool call: announce → gate → execute → report ----------------
339
- async runToolCall(session, toolCall) {
340
- session.runlog.toolCall({ id: toolCall.id, name: toolCall.name, args: toolCall.arguments });
341
- session.totals.toolCalls++;
342
- // Announce the pending tool call.
343
- await this.emit(session.id, {
344
- sessionUpdate: 'tool_call',
345
- toolCallId: toolCall.id,
346
- title: toolTitle(toolCall),
347
- kind: toolKind(toolCall.name),
348
- status: 'pending',
349
- rawInput: toolCall.arguments,
350
- locations: toolLocations(toolCall, session.cwd),
351
- });
352
- // Permission + hard governance gates.
353
- const gate = await this.gateToolCall(session, toolCall);
354
- if (gate.decision === 'cancelled') {
355
- await this.reportToolResult(session, toolCall.id, '[cancelled]', true);
356
- session.runlog.toolResult({ id: toolCall.id, result: '[cancelled]', isError: true, durationMs: 0 });
357
- session.messages.push({ role: 'tool', content: '[cancelled]', toolCallId: toolCall.id });
358
- return 'cancelled';
359
- }
360
- if (gate.decision === 'deny') {
361
- await this.reportToolResult(session, toolCall.id, gate.reason, true);
362
- session.runlog.toolResult({ id: toolCall.id, result: gate.reason, isError: true, durationMs: 0 });
363
- session.messages.push({ role: 'tool', content: gate.reason, toolCallId: toolCall.id });
364
- return 'ok';
365
- }
366
- // Allowed: mark in-progress and execute through the shared tool runtime,
367
- // preferring the client's filesystem when it advertised fs capabilities.
368
- await this.emit(session.id, { sessionUpdate: 'tool_call_update', toolCallId: toolCall.id, status: 'in_progress' });
369
- const started = Date.now();
370
- let result;
266
+ async runTurn(session, prompt) {
267
+ const messages = { current: session.messages };
268
+ let streamedChars = 0;
371
269
  try {
372
- result = await executeTool(toolCall, session.cwd, 60000, undefined, {
373
- appendAnchorHash: session.localBackend,
374
- fs: this.clientFsDelegate(session.id),
270
+ for (const warning of session.preference.warnings)
271
+ await this.emit(session.id, { sessionUpdate: 'agent_thought_chunk', content: { type: 'text', text: `[Warning: ${warning}]\n` } });
272
+ const result = await runTurn({
273
+ captureToolOutput: true,
274
+ client: 'acp',
275
+ onSafetyBranch: async () => {
276
+ const { branchSession } = await import('./session-management/index.js');
277
+ const branch = await branchSession(session.id, { kind: 'safety', signal: session.controller?.signal, runlog: session.runlog });
278
+ await this.emit(session.id, { sessionUpdate: 'agent_thought_chunk', content: { type: 'text', text: `Recovery conversation branch: ${branch.session.id}\n` } });
279
+ },
280
+ onCheckpoint: (history, status) => {
281
+ const saved = saveSessionConversation(session.id, history, { expectedRevision: session.revision, status });
282
+ session.revision = saved.revision;
283
+ session.runlog.sessionCheckpoint({ revision: saved.revision, status, messageCount: saved.messages.length, checksum: saved.checksum });
284
+ },
285
+ sessionId: session.id, cwd: session.cwd, provider: session.provider,
286
+ model: session.model || undefined, prompt, messages, signal: session.controller?.signal,
287
+ preferenceSources: session.preference.sources,
288
+ runlog: session.runlog, maxIterations: resolveIterationLimit(config.get('maxIterations')),
289
+ confirmation: 'mutating', approvals: this.approvals, tools: () => TOOLS, toolOptions: { fs: this.clientFsDelegate(session.id) },
290
+ prepare: async (request) => { streamedChars = 0; return request; },
291
+ approve: (call, decision) => this.requestPermission(session, call, decision.request?.reusable ?? false),
292
+ onToken: token => {
293
+ if (!token || session.cancelled)
294
+ return;
295
+ streamedChars += token.length;
296
+ void this.emit(session.id, { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: token } });
297
+ },
298
+ onResponse: async (response) => {
299
+ if (!streamedChars && response.content)
300
+ await this.emit(session.id, { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: response.content } });
301
+ },
302
+ onToolStart: async (call) => {
303
+ await this.emit(session.id, { sessionUpdate: 'tool_call', toolCallId: call.id, title: toolTitle(call), kind: toolKind(call.name), status: 'pending', rawInput: call.arguments });
304
+ },
305
+ beforeTool: async (call) => { await this.emit(session.id, { sessionUpdate: 'tool_call_update', toolCallId: call.id, status: 'in_progress' }); },
306
+ onToolResult: async (call, value) => { await this.reportToolResult(session, call.id, value.displayResult || value.result, !!value.isError, value.result); },
307
+ onWarning: warning => { void this.emit(session.id, { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: `\n[Warning: ${warning}]\n` } }); },
308
+ onRoute: decision => {
309
+ if (decision.selected)
310
+ session.resolvedProvider = decision.selected.provider;
311
+ void this.emit(session.id, { sessionUpdate: 'agent_thought_chunk', content: { type: 'text', text: `\n[Route: ${decision.selected ? `${decision.selected.provider}/${decision.selected.model}` : 'unavailable'}; ${decision.reason}]\n` } });
312
+ },
375
313
  });
314
+ if (result.budget?.exceeded)
315
+ await this.emit(session.id, { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: formatBudgetHalt(result.budget) } });
316
+ await this.flush();
317
+ if (result.reason === 'cancelled')
318
+ return 'cancelled';
319
+ if (result.reason === 'budget')
320
+ return 'refusal';
321
+ if (result.reason === 'iteration_limit')
322
+ return 'max_turn_requests';
323
+ if (result.reason === 'length')
324
+ return 'max_tokens';
325
+ return 'end_turn';
376
326
  }
377
- catch (err) {
378
- result = {
379
- toolCallId: toolCall.id,
380
- result: `Error: ${errMessage(err)}`,
381
- isError: true,
382
- };
327
+ finally {
328
+ session.messages = messages.current;
383
329
  }
384
- const durationMs = Date.now() - started;
385
- session.runlog.toolResult({
386
- id: toolCall.id,
387
- result: result.result,
388
- isError: result.isError || false,
389
- durationMs,
390
- });
391
- await this.reportToolResult(session, toolCall.id, result.displayResult || result.result, result.isError || false, result.result);
392
- session.messages.push({ role: 'tool', content: result.result, toolCallId: toolCall.id });
393
- return 'ok';
394
330
  }
395
331
  /** Send a terminal (completed/failed) tool_call_update to the client. */
396
332
  reportToolResult(session, toolCallId, text, isError, rawResult) {
@@ -403,46 +339,14 @@ class CalliopeAgent {
403
339
  });
404
340
  }
405
341
  // ---- Gates: permission, then the hard hooks -------------------------
406
- async gateToolCall(session, toolCall) {
407
- // 1. Permission via the client (only for mutating / confirm-worthy tools).
408
- if (toolNeedsPermission(toolCall)) {
409
- const permission = await this.requestPermission(session, toolCall);
410
- if (permission === 'cancelled')
411
- return { decision: 'cancelled' };
412
- if (permission === 'reject')
413
- return { decision: 'deny', reason: '[Permission denied by user]' };
414
- // 'allow' falls through to the hard gates below.
415
- }
416
- // 2. Pre-tool hooks — the hard gate, runs regardless of permission (exit-42
417
- // veto contract; see hooks.ts / docs/governance.md).
418
- const hookGate = await checkHooksAllow('pre-tool', { tool: toolCall.name, toolArgs: toolCall.arguments });
419
- if (!hookGate.allowed) {
420
- return { decision: 'deny', reason: `[Blocked by hook: ${hookGate.reason || 'no reason given'}]` };
421
- }
422
- // 3. Policy hook — the Zentinelle integration point (fail closed).
423
- if (isPolicyEnabled()) {
424
- const verdict = await evaluatePolicy(toolCall);
425
- session.runlog.policyEvent({
426
- tool: toolCall.name,
427
- decision: verdict.decision,
428
- source: verdict.source,
429
- reason: verdict.reason,
430
- durationMs: verdict.durationMs,
431
- });
432
- if (verdict.decision === 'deny') {
433
- return { decision: 'deny', reason: `[Policy denied: ${verdict.reason || 'no reason given'}]` };
434
- }
435
- }
436
- return { decision: 'allow' };
437
- }
438
342
  /**
439
343
  * Ask the client to authorize a tool call. Returns the user's decision, or
440
344
  * falls back to Calliope's non-interactive default (deny) when the client does
441
345
  * not support the permission request at all.
442
346
  */
443
- async requestPermission(session, toolCall) {
347
+ async requestPermission(session, toolCall, reusable) {
444
348
  try {
445
- const res = await this.conn.requestPermission({
349
+ const res = await cancellable(this.conn.requestPermission({
446
350
  sessionId: session.id,
447
351
  toolCall: {
448
352
  toolCallId: toolCall.id,
@@ -452,18 +356,20 @@ class CalliopeAgent {
452
356
  },
453
357
  options: [
454
358
  { optionId: 'allow', name: 'Allow', kind: 'allow_once' },
455
- { optionId: 'allow_always', name: 'Always allow', kind: 'allow_always' },
359
+ ...(reusable ? [{ optionId: 'allow_always', name: 'Allow this exact operation for this session', kind: 'allow_always' }] : []),
456
360
  { optionId: 'reject', name: 'Reject', kind: 'reject_once' },
457
361
  ],
458
- });
362
+ }), session.controller?.signal);
459
363
  const outcome = res.outcome;
460
364
  if (outcome.outcome === 'cancelled')
461
365
  return 'cancelled';
462
366
  if (outcome.outcome === 'selected')
463
- return outcome.optionId.startsWith('allow') ? 'allow' : 'reject';
367
+ return outcome.optionId === 'allow' ? 'allow' : outcome.optionId === 'allow_always' && reusable ? 'allow_session' : 'reject';
464
368
  return 'reject';
465
369
  }
466
370
  catch (err) {
371
+ if (session.cancelled || isCancellation(err))
372
+ return 'cancelled';
467
373
  // Client can't handle permission requests: non-interactive default is to
468
374
  // deny anything that needed asking (read-only tools never reach here).
469
375
  log(`requestPermission unavailable (${errMessage(err)}); ` +
@@ -517,16 +423,11 @@ class CalliopeAgent {
517
423
  /** Close every session's audit log (best-effort) on shutdown. */
518
424
  async shutdown() {
519
425
  for (const session of this.sessions.values()) {
520
- session.runlog.runEnd({
521
- totals: {
522
- inputTokens: session.totals.inputTokens,
523
- outputTokens: session.totals.outputTokens,
524
- cost: session.totals.cost,
525
- toolCalls: session.totals.toolCalls,
526
- durationMs: Date.now() - session.startedAt,
527
- },
528
- exitReason: session.cancelled ? 'cancelled' : 'completed',
529
- });
426
+ if (session.controller) {
427
+ session.cancelled = true;
428
+ session.controller.abort();
429
+ }
430
+ await session.activeTurn?.catch(() => { });
530
431
  await session.runlog.close();
531
432
  }
532
433
  }