@iowarp/clio-coder 0.3.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/NOTICE +33 -0
  3. package/README.md +12 -3
  4. package/dist/{acp-U67UHUK2.js → acp-G5WJBNCT.js} +13 -12
  5. package/dist/{agents-YU6SGALZ.js → agents-FMV2Q5G4.js} +41 -36
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-5ZPJOIVG.js → auth-3IDSJEIK.js} +18 -18
  8. package/dist/{builtins-C6JMZVV6.js → builtins-XCZWXSC7.js} +5 -5
  9. package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
  10. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  11. package/dist/{chunk-XWSF374K.js → chunk-2OQE55CK.js} +3 -3
  12. package/dist/{chunk-5H3GB5BO.js → chunk-32KWKNSF.js} +8 -384
  13. package/dist/{chunk-KTYTFRMB.js → chunk-36EJLSQQ.js} +34 -36
  14. package/dist/{chunk-FHJEP5SW.js → chunk-3BT2XMV4.js} +19 -13
  15. package/dist/chunk-3DPEIQKN.js +113 -0
  16. package/dist/{chunk-GU2UIAFZ.js → chunk-3URVFKWK.js} +7 -7
  17. package/dist/{chunk-WEH5XRJQ.js → chunk-3XML7CDN.js} +3 -3
  18. package/dist/chunk-42FMPA75.js +101 -0
  19. package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
  20. package/dist/{chunk-VCBR6CU7.js → chunk-5PSMVOLM.js} +2 -2
  21. package/dist/{chunk-NMPKI6XL.js → chunk-6DB53AJS.js} +203 -25
  22. package/dist/{chunk-3BINW3FP.js → chunk-76ONBSIA.js} +2 -2
  23. package/dist/{chunk-26LEYJZH.js → chunk-7MCTRUCE.js} +2 -2
  24. package/dist/{chunk-TYPGUK6W.js → chunk-AB44T6BB.js} +111 -5
  25. package/dist/{chunk-K4XHGFR5.js → chunk-B7OBL7PK.js} +317 -721
  26. package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
  27. package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
  28. package/dist/{chunk-ZVJ5BLO2.js → chunk-BKFJHQCA.js} +154 -16
  29. package/dist/chunk-BKFM6EJV.js +462 -0
  30. package/dist/chunk-BMS5RKQY.js +27 -0
  31. package/dist/{chunk-ZNLWCMVZ.js → chunk-BPKCPIL7.js} +2 -2
  32. package/dist/{chunk-TLQJPP24.js → chunk-BUMFYQFY.js} +1394 -1349
  33. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  34. package/dist/chunk-C2LTL2W6.js +2447 -0
  35. package/dist/{chunk-ME6CCNFO.js → chunk-CODPRO7Q.js} +8 -8
  36. package/dist/{chunk-E77JEWSD.js → chunk-CTJ4RNAA.js} +7 -37
  37. package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
  38. package/dist/{chunk-7RFXX52T.js → chunk-DQITNCXG.js} +642 -172
  39. package/dist/{chunk-TTHACPOM.js → chunk-DYJP44XW.js} +578 -117
  40. package/dist/{chunk-2HFZQUHL.js → chunk-F4CKPOEQ.js} +18 -8
  41. package/dist/{chunk-DGSYXYMX.js → chunk-FEFIFZTL.js} +3 -3
  42. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  43. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  44. package/dist/chunk-GKF55TAZ.js +391 -0
  45. package/dist/{chunk-VWZOAB7K.js → chunk-GR5G2PVF.js} +9 -8
  46. package/dist/{chunk-4DGYLA73.js → chunk-GXNLGKAB.js} +80 -9
  47. package/dist/chunk-HHV2GANA.js +88 -0
  48. package/dist/{chunk-IIZWH4XA.js → chunk-HI63TFOG.js} +5 -4
  49. package/dist/{chunk-WLFILSD5.js → chunk-HJJTYUHX.js} +113 -83
  50. package/dist/{chunk-TT36MB5S.js → chunk-HLW2MRKE.js} +3 -1
  51. package/dist/{chunk-PMDBGQSJ.js → chunk-HWHKMHUA.js} +7 -7
  52. package/dist/chunk-HZHHCK24.js +1631 -0
  53. package/dist/{chunk-WSB3FPX7.js → chunk-I5VEOC6I.js} +39 -143
  54. package/dist/chunk-IBEBSCYA.js +564 -0
  55. package/dist/chunk-IQ7KR472.js +362 -0
  56. package/dist/{chunk-A3WNZD3P.js → chunk-J4W7KFM7.js} +949 -972
  57. package/dist/{chunk-TB5666IT.js → chunk-JDG2WCRO.js} +5 -5
  58. package/dist/{chunk-N22QMJKY.js → chunk-K5C3NCBD.js} +4 -4
  59. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  60. package/dist/{chunk-5C3AQNDW.js → chunk-KFZI4NIL.js} +216 -38
  61. package/dist/chunk-KMVISBZR.js +132 -0
  62. package/dist/{chunk-WXY7KU3G.js → chunk-LDQ2ZF2M.js} +2 -2
  63. package/dist/{chunk-XN3L4EYL.js → chunk-LQ3DZAMX.js} +3 -3
  64. package/dist/{chunk-U6MBIEMB.js → chunk-LY4S7GJC.js} +173 -144
  65. package/dist/{chunk-4SPRNWDE.js → chunk-MLKNTWH2.js} +19 -19
  66. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  67. package/dist/chunk-NEKRRTYW.js +56 -0
  68. package/dist/{chunk-SPULKLCF.js → chunk-NHCZP4K7.js} +3 -3
  69. package/dist/chunk-NHLBIGRH.js +1506 -0
  70. package/dist/chunk-NQQH3YT7.js +302 -0
  71. package/dist/chunk-NYS75XW5.js +15 -0
  72. package/dist/{chunk-GN57SG4G.js → chunk-O4XIVISU.js} +10 -8
  73. package/dist/{chunk-EMYUUSFG.js → chunk-O6TL7WWY.js} +6 -6
  74. package/dist/chunk-OQBA45DZ.js +97 -0
  75. package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
  76. package/dist/chunk-PMZCIOCJ.js +25 -0
  77. package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
  78. package/dist/{chunk-J3YUBZWY.js → chunk-QBJA7R7N.js} +62 -6
  79. package/dist/chunk-QDC3K2U3.js +262 -0
  80. package/dist/{chunk-2HEJ2F35.js → chunk-QLFS5GO2.js} +22 -10
  81. package/dist/{chunk-7RGZWPB6.js → chunk-QLL7ILRG.js} +95 -32
  82. package/dist/{chunk-YS5VLNH5.js → chunk-QREDIESB.js} +6 -6
  83. package/dist/chunk-QSNYB6ZV.js +195 -0
  84. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  85. package/dist/chunk-RKKLTLYB.js +45 -0
  86. package/dist/{chunk-P43ETTHK.js → chunk-SJ5ZKQ4S.js} +2 -2
  87. package/dist/{chunk-GPIEI3LY.js → chunk-SP2RXXYO.js} +6 -54
  88. package/dist/chunk-SUCTJL45.js +45 -0
  89. package/dist/{chunk-DYIM5TJT.js → chunk-SUW5DORT.js} +263 -7
  90. package/dist/chunk-T56WDKA5.js +183 -0
  91. package/dist/chunk-TVHHYFHE.js +255 -0
  92. package/dist/{chunk-FJ3H4MN5.js → chunk-TZ3SGWZZ.js} +3 -3
  93. package/dist/{chunk-MXKJU4JB.js → chunk-U77AMWDL.js} +91 -10
  94. package/dist/{chunk-5DHKRSMQ.js → chunk-ULC6OTWO.js} +11 -7
  95. package/dist/{chunk-RWSI4YD7.js → chunk-UM7N4G5A.js} +33 -12
  96. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  97. package/dist/{chunk-IGWKHNIQ.js → chunk-UXMFQ54G.js} +44 -37
  98. package/dist/{chunk-HFSBBKSQ.js → chunk-V5DHCITQ.js} +171 -3
  99. package/dist/{chunk-5WIGXA4T.js → chunk-VAZSBTKF.js} +111 -4
  100. package/dist/{chunk-VHN4MY6O.js → chunk-VEO4AP2K.js} +2 -2
  101. package/dist/{chunk-IJ7RPIYJ.js → chunk-VFA6GDY5.js} +65 -4
  102. package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
  103. package/dist/chunk-VO67MWHC.js +75 -0
  104. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  105. package/dist/{chunk-TANS5ZJS.js → chunk-VYMXRQI6.js} +36 -22
  106. package/dist/{chunk-WWCZ5F23.js → chunk-W5VSYASO.js} +77 -16
  107. package/dist/{chunk-WNIJTQQK.js → chunk-WZR7K7ZX.js} +72 -116
  108. package/dist/{chunk-5Q2VVUKB.js → chunk-X3YGUTOB.js} +4 -4
  109. package/dist/chunk-X75E3D2N.js +686 -0
  110. package/dist/{chunk-VAWNZU7Z.js → chunk-YDFRH54B.js} +4 -4
  111. package/dist/chunk-YJX4SHTD.js +40 -0
  112. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  113. package/dist/chunk-Z2RR6MAK.js +127 -0
  114. package/dist/{chunk-FBVTI2TJ.js → chunk-Z4TXYIEG.js} +12 -131
  115. package/dist/cli/index.js +47 -36
  116. package/dist/{clio-QVTYJ57A.js → clio-2JXHBBY5.js} +7 -7
  117. package/dist/{code-nav-FGGFIE7L.js → code-nav-3YYRMYNF.js} +8 -8
  118. package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
  119. package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
  120. package/dist/{config-LW5IJFQN.js → config-QZPCMYSO.js} +99 -63
  121. package/dist/{configure-7XIZCOU4.js → configure-TEGEBYCA.js} +23 -22
  122. package/dist/{context-Y6Y7QPR6.js → context-AV7OEZ4D.js} +12 -12
  123. package/dist/{context-L3WL3X7K.js → context-E6H5RNMC.js} +56 -47
  124. package/dist/{context-N52ZA626.js → context-GSXUE4CT.js} +29 -27
  125. package/dist/{context-clear-MBQRLSDQ.js → context-clear-SHIBYK6T.js} +55 -46
  126. package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
  127. package/dist/{context-working-set-GS6DSO7F.js → context-working-set-5ZGKPGZQ.js} +13 -13
  128. package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-EFMJT4LD.js} +93 -64
  129. package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
  130. package/dist/doctor-QOA5FNY5.js +313 -0
  131. package/dist/{eval-BEC2WHDA.js → eval-TFBYQH4H.js} +2032 -156
  132. package/dist/eval-inventory-SXH7PDKX.js +316 -0
  133. package/dist/{evidence-REJUMSKM.js → evidence-ERGESKGN.js} +203 -48
  134. package/dist/{evolve-PY5ZBA5K.js → evolve-VDXTSYCJ.js} +52 -43
  135. package/dist/{extensions-HVKU65YU.js → extensions-7BGBHN57.js} +13 -7
  136. package/dist/{fleet-7WZEWRFA.js → fleet-2RRVDF2V.js} +228 -108
  137. package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-VJ726XIA.js} +11 -11
  138. package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
  139. package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-JF5QOATM.js} +18 -15
  140. package/dist/fleet-inspect-VLY4S7QM.js +442 -0
  141. package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-AIZUEJOY.js} +5 -5
  142. package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-AJRPDMDV.js} +22 -19
  143. package/dist/fleet-verify-JFEL2L3H.js +175 -0
  144. package/dist/fleet-view-ZCON35AG.js +102 -0
  145. package/dist/{init-OG3TPGQG.js → init-DN2WWLFE.js} +72 -62
  146. package/dist/install-XGLBQY5E.js +13 -0
  147. package/dist/interop-OZBKXAYL.js +114 -0
  148. package/dist/{library-CNTMPLRF.js → library-YWZG7IMW.js} +21 -18
  149. package/dist/{memory-6IS7F275.js → memory-I4C4HMLW.js} +54 -45
  150. package/dist/{models-ENRJDA5W.js → models-CEYXJBO6.js} +33 -30
  151. package/dist/{monitor-XLDVO7TN.js → monitor-NZ6GCI3P.js} +59 -52
  152. package/dist/{orchestrator-6KSPYRHA.js → orchestrator-GCGQ4N5I.js} +7827 -7328
  153. package/dist/panes-HMABYVO4.js +58 -0
  154. package/dist/panes-KY6W3V2E.js +103 -0
  155. package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
  156. package/dist/{reset-RZ4ER727.js → reset-DQ6FGCSH.js} +13 -11
  157. package/dist/resources-BB3MVJMD.js +111 -0
  158. package/dist/{run-Y2CNK5RU.js → run-H2GQDUER.js} +119 -87
  159. package/dist/{share-A55GYP6Z.js → share-GTJN6A5O.js} +20 -17
  160. package/dist/{skills-ALC5J6AT.js → skills-L55TEW6R.js} +33 -24
  161. package/dist/{skills-eval-JPBEBYQU.js → skills-eval-XVXPH2JI.js} +67 -56
  162. package/dist/skills-inventory-S4MXPJFV.js +126 -0
  163. package/dist/slash-commands-ZSGASKJC.js +77 -0
  164. package/dist/{steer-GGWFUJUD.js → steer-RZGSCY4R.js} +4 -4
  165. package/dist/{support-MIETYA5E.js → support-PKEUNNQL.js} +6 -6
  166. package/dist/{targets-VGNXIR3S.js → targets-NCPZ644J.js} +68 -40
  167. package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-44SV3YCN.js} +6 -4
  168. package/dist/tools-DAF3DI3C.js +27 -0
  169. package/dist/{trace-PNCASAXC.js → trace-FYVW2MQA.js} +207 -10
  170. package/dist/tui-primitives-2AKXQNZK.js +13 -0
  171. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
  172. package/dist/{upgrade-FUSUAGHR.js → upgrade-3XPP6OQL.js} +27 -24
  173. package/dist/{usage-N4MKVHKD.js → usage-3NLHGTU2.js} +114 -62
  174. package/dist/{verifiers-YAWOJ3H2.js → verifiers-SSQONKRT.js} +172 -13
  175. package/dist/{verify-LTDHYBGY.js → verify-3U6J7FZI.js} +10 -10
  176. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
  177. package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-CEHYGPGQ.js} +75 -65
  178. package/dist/with-panes-MKB46MPQ.js +782 -0
  179. package/dist/worker/entry.js +106 -75
  180. package/docs/README.md +3 -2
  181. package/docs/acp.md +24 -3
  182. package/docs/alcf-provider.md +1 -1
  183. package/docs/architecture.md +2 -2
  184. package/docs/artifact-versions.md +9 -1
  185. package/docs/built-in-agents.md +1 -1
  186. package/docs/capacity-and-scheduling.md +62 -3
  187. package/docs/commands-and-modes.md +31 -2
  188. package/docs/configuration-and-targets.md +69 -12
  189. package/docs/context-engine.md +63 -4
  190. package/docs/development-pipeline.md +19 -0
  191. package/docs/dispatch-typed-intent.md +385 -0
  192. package/docs/documentation-coverage.md +5 -5
  193. package/docs/documentation-guide.md +1 -1
  194. package/docs/environment-variables.md +3 -0
  195. package/docs/eval-runner.md +262 -11
  196. package/docs/evals-internal.md +72 -2
  197. package/docs/evidence-and-memory.md +12 -11
  198. package/docs/evolution.md +1 -1
  199. package/docs/exit-codes-and-output.md +1 -1
  200. package/docs/extensions-and-sharing.md +27 -1
  201. package/docs/fleet-dispatch.md +25 -4
  202. package/docs/installation-and-lifecycle.md +15 -2
  203. package/docs/middleware-and-components.md +1 -1
  204. package/docs/model-catalog.md +10 -1
  205. package/docs/observability.md +55 -4
  206. package/docs/proactive-memory.md +127 -14
  207. package/docs/prompt-envelope-and-tools.md +19 -1
  208. package/docs/provider-adapter-cookbook.md +1 -1
  209. package/docs/release-cut-checklist.md +19 -3
  210. package/docs/safety-model.md +2 -2
  211. package/docs/scientific-validation.md +3 -3
  212. package/docs/session-lifecycle.md +1 -1
  213. package/docs/skills-marketplace.md +1 -1
  214. package/docs/tool-usage.md +18 -8
  215. package/docs/trace-store.md +1 -1
  216. package/docs/troubleshooting.md +88 -1
  217. package/docs/tui-design.md +1 -1
  218. package/docs/worker-dispatch-mechanics.md +1 -1
  219. package/package.json +5 -2
  220. package/src/cli/acp.ts +6 -2
  221. package/src/cli/agents.ts +1 -1
  222. package/src/cli/argv.ts +25 -0
  223. package/src/cli/config-inspect.ts +33 -6
  224. package/src/cli/config.ts +1 -1
  225. package/src/cli/configure.ts +23 -21
  226. package/src/cli/doctor-panes.ts +124 -0
  227. package/src/cli/doctor-state-size.ts +82 -0
  228. package/src/cli/doctor-toolchain.ts +57 -0
  229. package/src/cli/doctor.ts +22 -1
  230. package/src/cli/eval-inventory.ts +436 -0
  231. package/src/cli/eval.ts +93 -16
  232. package/src/cli/evidence-detail.ts +88 -0
  233. package/src/cli/evidence-inventory.ts +183 -0
  234. package/src/cli/evidence.ts +30 -5
  235. package/src/cli/extensions.ts +5 -1
  236. package/src/cli/fleet-decisions.ts +69 -0
  237. package/src/cli/fleet-inspect.ts +334 -0
  238. package/src/cli/fleet-verify.ts +133 -0
  239. package/src/cli/fleet-view.ts +810 -0
  240. package/src/cli/fleet.ts +179 -39
  241. package/src/cli/index.ts +14 -2
  242. package/src/cli/interop-inspect.ts +128 -0
  243. package/src/cli/interop.ts +34 -0
  244. package/src/cli/panes.ts +35 -0
  245. package/src/cli/reset.ts +5 -2
  246. package/src/cli/run.ts +58 -0
  247. package/src/cli/skills-inventory.ts +185 -0
  248. package/src/cli/skills.ts +16 -13
  249. package/src/cli/targets.ts +44 -13
  250. package/src/cli/tools.ts +321 -0
  251. package/src/cli/trace-inspect.ts +252 -0
  252. package/src/cli/trace.ts +85 -5
  253. package/src/cli/usage.ts +63 -14
  254. package/src/cli/verifiers-inspect.ts +347 -0
  255. package/src/cli/verifiers.ts +9 -0
  256. package/src/core/bus-events.ts +33 -1
  257. package/src/core/cache-telemetry.ts +42 -0
  258. package/src/core/config.ts +67 -0
  259. package/src/core/defaults.ts +124 -8
  260. package/src/core/endpoint-key.ts +27 -0
  261. package/src/core/residency-target-key.ts +25 -0
  262. package/src/core/response-schema.ts +80 -6
  263. package/src/core/theme-token-hex.ts +43 -0
  264. package/src/core/tool-names.ts +2 -1
  265. package/src/core/xdg.ts +1 -1
  266. package/src/domains/agents/fleets/build-review.md +0 -3
  267. package/src/domains/agents/fleets/build-test.md +0 -3
  268. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  269. package/src/domains/agents/result-contract.ts +164 -35
  270. package/src/domains/config/classify.ts +6 -0
  271. package/src/domains/context/codewiki/coordinator.ts +12 -4
  272. package/src/domains/dispatch/admission-error.ts +9 -0
  273. package/src/domains/dispatch/admission.ts +52 -14
  274. package/src/domains/dispatch/capacity-lease.ts +118 -9
  275. package/src/domains/dispatch/contract.ts +11 -0
  276. package/src/domains/dispatch/council-topology.ts +398 -0
  277. package/src/domains/dispatch/execution-plan.ts +44 -4
  278. package/src/domains/dispatch/extension.ts +378 -82
  279. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  280. package/src/domains/dispatch/fleet-plan.ts +7 -2
  281. package/src/domains/dispatch/fleet-run.ts +87 -4
  282. package/src/domains/dispatch/gate-decisions.ts +11 -1
  283. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  284. package/src/domains/dispatch/gate-topology.ts +289 -0
  285. package/src/domains/dispatch/heartbeat.ts +32 -8
  286. package/src/domains/dispatch/index.ts +22 -0
  287. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  288. package/src/domains/dispatch/intent.ts +85 -1
  289. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  290. package/src/domains/dispatch/reservation-store.ts +139 -11
  291. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  292. package/src/domains/dispatch/run-event-journal.ts +598 -0
  293. package/src/domains/dispatch/state.ts +49 -1
  294. package/src/domains/dispatch/types.ts +13 -0
  295. package/src/domains/dispatch/validation.ts +33 -8
  296. package/src/domains/dispatch/worker-spawn.ts +25 -11
  297. package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
  298. package/src/domains/dispatch/write-boundary.ts +62 -1
  299. package/src/domains/eval/artifacts/store.ts +62 -0
  300. package/src/domains/eval/compare/behavioral.ts +224 -0
  301. package/src/domains/eval/compare/compare.ts +342 -2
  302. package/src/domains/eval/compare/envelope.ts +128 -0
  303. package/src/domains/eval/compare/gates.ts +24 -6
  304. package/src/domains/eval/compare/thresholds.ts +30 -3
  305. package/src/domains/eval/execution-provenance.ts +240 -0
  306. package/src/domains/eval/inventory.ts +113 -0
  307. package/src/domains/eval/metrics/aggregate.ts +136 -0
  308. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  309. package/src/domains/eval/metrics/tracked.ts +413 -0
  310. package/src/domains/eval/provenance.ts +117 -0
  311. package/src/domains/eval/reports/comparison.ts +128 -0
  312. package/src/domains/eval/reports/junit.ts +17 -3
  313. package/src/domains/eval/reports/markdown.ts +3 -3
  314. package/src/domains/eval/reports/text.ts +14 -0
  315. package/src/domains/eval/run-compare.ts +20 -0
  316. package/src/domains/eval/runners/clio-run.ts +127 -0
  317. package/src/domains/eval/runners/external-command.ts +28 -3
  318. package/src/domains/eval/schema/adapter.ts +111 -0
  319. package/src/domains/eval/schema/artifact.ts +20 -0
  320. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  321. package/src/domains/eval/schema/behavioral.ts +520 -0
  322. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  323. package/src/domains/eval/schema/serving.ts +105 -0
  324. package/src/domains/eval/schema/suite.ts +38 -8
  325. package/src/domains/eval/schema/validate.ts +58 -3
  326. package/src/domains/eval/schema/verdict.ts +237 -0
  327. package/src/domains/eval/suites/resolve.ts +2 -0
  328. package/src/domains/eval/suites/run.ts +264 -33
  329. package/src/domains/eval/verifiers/command.ts +2 -1
  330. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  331. package/src/domains/evidence/build.ts +2 -13
  332. package/src/domains/evidence/eval.ts +2 -12
  333. package/src/domains/evidence/findings-markdown.ts +33 -0
  334. package/src/domains/evidence/run-trust.ts +7 -113
  335. package/src/domains/evidence/store.ts +6 -0
  336. package/src/domains/evidence/trust-projection.ts +2 -2
  337. package/src/domains/extensions/compatibility.ts +285 -0
  338. package/src/domains/extensions/discovery.ts +38 -3
  339. package/src/domains/extensions/resources.ts +1 -1
  340. package/src/domains/extensions/state.ts +12 -3
  341. package/src/domains/extensions/types.ts +2 -0
  342. package/src/domains/lifecycle/doctor.ts +69 -1
  343. package/src/domains/memory/index.ts +14 -1
  344. package/src/domains/memory/task-bank-promotion.ts +64 -0
  345. package/src/domains/memory/task-memory-policy.ts +82 -17
  346. package/src/domains/memory/task-memory-spend.ts +131 -0
  347. package/src/domains/memory/task-memory-status.ts +7 -0
  348. package/src/domains/memory/task-memory-telemetry.ts +3 -0
  349. package/src/domains/middleware/index.ts +1 -0
  350. package/src/domains/middleware/memory-intervention.ts +97 -21
  351. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  352. package/src/domains/mux/contract.ts +434 -0
  353. package/src/domains/mux/detect.ts +158 -0
  354. package/src/domains/mux/extension.ts +47 -0
  355. package/src/domains/mux/index.ts +96 -0
  356. package/src/domains/mux/manifest.ts +6 -0
  357. package/src/domains/mux/operations.ts +164 -0
  358. package/src/domains/mux/pane-registry.ts +90 -0
  359. package/src/domains/mux/protocol.ts +49 -0
  360. package/src/domains/mux/socket-client.ts +816 -0
  361. package/src/domains/mux/types.ts +222 -0
  362. package/src/domains/mux/viewer-command.ts +59 -0
  363. package/src/domains/mux/yazi/assets/init.lua +2 -0
  364. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  365. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  366. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  367. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  368. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  369. package/src/domains/mux/yazi/event-stream.ts +180 -0
  370. package/src/domains/mux/yazi/profile.ts +299 -0
  371. package/src/domains/mux/yazi/session.ts +228 -0
  372. package/src/domains/mux/yazi/theme.ts +30 -0
  373. package/src/domains/observability/background-memory-usage.ts +140 -0
  374. package/src/domains/observability/cost.ts +22 -1
  375. package/src/domains/observability/index.ts +9 -0
  376. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  377. package/src/domains/observability/trace-store.ts +234 -2
  378. package/src/domains/prompts/compiler.ts +100 -13
  379. package/src/domains/providers/endpoint-capacity.ts +228 -0
  380. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  381. package/src/domains/providers/extension.ts +20 -3
  382. package/src/domains/providers/index.ts +32 -0
  383. package/src/domains/providers/model-runtime-capabilities.ts +32 -0
  384. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  385. package/src/domains/providers/runtime-resolution.ts +8 -1
  386. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  387. package/src/domains/providers/runtimes/builtins.ts +2 -0
  388. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  389. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  390. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  391. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  392. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  393. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  394. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  395. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  396. package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
  397. package/src/domains/providers/support.ts +1 -0
  398. package/src/domains/providers/target-model-cache.ts +124 -0
  399. package/src/domains/providers/types/capability-flags.ts +2 -0
  400. package/src/domains/providers/types/target-descriptor.ts +2 -0
  401. package/src/domains/resources/index.ts +3 -0
  402. package/src/domains/resources/prompts/loader.ts +95 -33
  403. package/src/domains/resources/skills/loader.ts +33 -0
  404. package/src/domains/safety/action-classifier.ts +6 -0
  405. package/src/domains/safety/call-target.ts +52 -0
  406. package/src/domains/safety/run-effects.ts +35 -4
  407. package/src/domains/session/context-accounting.ts +52 -1
  408. package/src/domains/session/context-ledger.ts +37 -13
  409. package/src/domains/session/index.ts +6 -0
  410. package/src/domains/session/prompt-cache.ts +140 -0
  411. package/src/domains/session/prompt-manifest.ts +42 -0
  412. package/src/domains/toolchain/archive.ts +175 -0
  413. package/src/domains/toolchain/contract.ts +28 -0
  414. package/src/domains/toolchain/extension.ts +47 -0
  415. package/src/domains/toolchain/index.ts +39 -0
  416. package/src/domains/toolchain/install.ts +327 -0
  417. package/src/domains/toolchain/manifest.ts +8 -0
  418. package/src/domains/toolchain/paths.ts +34 -0
  419. package/src/domains/toolchain/registry.ts +265 -0
  420. package/src/domains/toolchain/remove.ts +218 -0
  421. package/src/domains/toolchain/resolve.ts +182 -0
  422. package/src/domains/toolchain/types.ts +113 -0
  423. package/src/domains/toolchain/version.ts +88 -0
  424. package/src/engine/acp/adapter.ts +18 -3
  425. package/src/engine/acp/server.ts +413 -70
  426. package/src/engine/acp/types.ts +19 -1
  427. package/src/engine/ai.ts +35 -0
  428. package/src/engine/apis/llamacpp-residency.ts +55 -3
  429. package/src/engine/apis/lmstudio.ts +25 -5
  430. package/src/engine/apis/ollama-native.ts +2 -1
  431. package/src/engine/apis/openai-completions.ts +80 -17
  432. package/src/engine/apis/residency-lock.ts +3 -1
  433. package/src/engine/apis/residency.ts +34 -1
  434. package/src/engine/claude/sdk-module.ts +98 -0
  435. package/src/engine/claude/sdk-runtime.ts +19 -11
  436. package/src/engine/provider-payload.ts +29 -1
  437. package/src/engine/tui-primitives.ts +21 -0
  438. package/src/engine/tui.ts +1 -0
  439. package/src/engine/worker-runtime.ts +2 -13
  440. package/src/entry/boot-options.ts +2 -0
  441. package/src/entry/orchestrator.ts +279 -35
  442. package/src/entry/panes-activation.ts +31 -0
  443. package/src/entry/with-panes.ts +20 -0
  444. package/src/interactive/chat-loop-messages.ts +26 -7
  445. package/src/interactive/chat-loop.ts +318 -41
  446. package/src/interactive/chat-panel.ts +62 -8
  447. package/src/interactive/clio-editor.ts +45 -8
  448. package/src/interactive/context-activity.ts +5 -1
  449. package/src/interactive/context-meter.ts +1 -1
  450. package/src/interactive/context-overlay.ts +41 -10
  451. package/src/interactive/cost-overlay.ts +66 -6
  452. package/src/interactive/council-grid.ts +1 -3
  453. package/src/interactive/council.ts +11 -0
  454. package/src/interactive/dispatch-board.ts +102 -20
  455. package/src/interactive/fleet-run-preview.ts +41 -15
  456. package/src/interactive/handoff-round.ts +41 -2
  457. package/src/interactive/interactive-application.ts +177 -7
  458. package/src/interactive/interactive-input-runtime.ts +15 -0
  459. package/src/interactive/interactive-presentation.ts +4 -0
  460. package/src/interactive/interactive-shell.ts +20 -17
  461. package/src/interactive/interactive-slash-runtime.ts +63 -10
  462. package/src/interactive/memory-overlay.ts +9 -0
  463. package/src/interactive/modal-marker.ts +170 -0
  464. package/src/interactive/mutation-preview.ts +295 -0
  465. package/src/interactive/mux-bridge.ts +214 -0
  466. package/src/interactive/overlay-frame.ts +58 -2
  467. package/src/interactive/overlay-general-openers.ts +17 -0
  468. package/src/interactive/overlay-key-routing.ts +52 -3
  469. package/src/interactive/overlay-lifecycle.ts +56 -7
  470. package/src/interactive/overlay-model-selectors.ts +40 -3
  471. package/src/interactive/overlay-permission-lifecycle.ts +112 -24
  472. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  473. package/src/interactive/overlay-transitions.ts +18 -4
  474. package/src/interactive/overlays/agents.ts +1 -0
  475. package/src/interactive/overlays/ask-user.ts +227 -49
  476. package/src/interactive/overlays/auth-dialog.ts +1 -0
  477. package/src/interactive/overlays/context-reset.ts +1 -0
  478. package/src/interactive/overlays/cwd-fallback.ts +1 -0
  479. package/src/interactive/overlays/decisions.ts +11 -11
  480. package/src/interactive/overlays/extensions.ts +1 -0
  481. package/src/interactive/overlays/fleet-run-approval.ts +1 -0
  482. package/src/interactive/overlays/handoff-review.ts +1 -0
  483. package/src/interactive/overlays/help-reference.ts +6 -0
  484. package/src/interactive/overlays/interop.ts +1 -0
  485. package/src/interactive/overlays/library-install-confirm.ts +1 -0
  486. package/src/interactive/overlays/library-tabs.ts +28 -0
  487. package/src/interactive/overlays/list-overlay.ts +10 -1
  488. package/src/interactive/overlays/message-picker.ts +1 -0
  489. package/src/interactive/overlays/model-scope.ts +86 -0
  490. package/src/interactive/overlays/model-selector.ts +1 -0
  491. package/src/interactive/overlays/prompts.ts +12 -1
  492. package/src/interactive/overlays/session-selector.ts +1 -0
  493. package/src/interactive/overlays/settings-sections.ts +30 -0
  494. package/src/interactive/overlays/settings.ts +614 -45
  495. package/src/interactive/overlays/side-question.ts +1 -0
  496. package/src/interactive/overlays/skills-hub.ts +3 -11
  497. package/src/interactive/overlays/tree-selector.ts +1 -0
  498. package/src/interactive/pane-policy.ts +46 -0
  499. package/src/interactive/panes-runtime.ts +292 -0
  500. package/src/interactive/permission-hint.ts +34 -2
  501. package/src/interactive/permission-overlay.ts +159 -9
  502. package/src/interactive/prewarm.ts +197 -0
  503. package/src/interactive/render-trace.ts +162 -15
  504. package/src/interactive/renderers/compaction-summary.ts +29 -0
  505. package/src/interactive/renderers/tool-execution.ts +4 -0
  506. package/src/interactive/renderers/worker-entry.ts +122 -14
  507. package/src/interactive/side-question.ts +58 -1
  508. package/src/interactive/slash-commands.ts +251 -15
  509. package/src/interactive/status/controller.ts +11 -0
  510. package/src/interactive/status/state-machine.ts +54 -2
  511. package/src/interactive/status/types.ts +7 -0
  512. package/src/interactive/tasks-overlay.ts +1 -0
  513. package/src/interactive/terminal-lease.ts +2 -0
  514. package/src/interactive/theme/tokens.ts +3 -14
  515. package/src/interactive/turn-context.ts +346 -33
  516. package/src/interactive/turn-persistence.ts +14 -4
  517. package/src/interactive/turn-prewarm.ts +364 -0
  518. package/src/interactive/turn-queues.ts +7 -4
  519. package/src/interactive/turn-runtime.ts +8 -1
  520. package/src/interactive/turn-state.ts +23 -0
  521. package/src/interactive/view/artifacts.ts +109 -1
  522. package/src/interactive/view/view-overlay.ts +29 -3
  523. package/src/interactive/watch-pane.ts +152 -0
  524. package/src/interactive/worker-progress.ts +7 -1
  525. package/src/interactive/worker-receipts.ts +19 -1
  526. package/src/interactive/worker-stream.ts +5 -0
  527. package/src/interactive/yazi-bridge.ts +444 -0
  528. package/src/tools/ask-user.ts +43 -2
  529. package/src/tools/bootstrap.ts +26 -2
  530. package/src/tools/builtin-tool-catalog.ts +15 -0
  531. package/src/tools/compete-worktrees.ts +83 -2
  532. package/src/tools/core-bootstrap.ts +2 -1
  533. package/src/tools/dispatch-admission.ts +14 -3
  534. package/src/tools/dispatch-arguments.ts +20 -20
  535. package/src/tools/dispatch-plan.ts +17 -9
  536. package/src/tools/dispatch-run-events.ts +134 -19
  537. package/src/tools/dispatch-runner.ts +29 -7
  538. package/src/tools/dispatch-scout.ts +1 -1
  539. package/src/tools/dispatch-types.ts +15 -3
  540. package/src/tools/dispatch.ts +1 -1
  541. package/src/tools/executables.ts +17 -14
  542. package/src/tools/observation.ts +54 -4
  543. package/src/tools/panes-surface.ts +38 -0
  544. package/src/tools/panes.ts +112 -0
  545. package/src/tools/policy.ts +10 -1
  546. package/src/tools/presentation.ts +1 -0
  547. package/src/tools/registry.ts +16 -0
  548. package/dist/chunk-AOCYTWAV.js +0 -449
  549. package/dist/chunk-HLE42MG7.js +0 -37
  550. package/dist/chunk-HWUFFB6L.js +0 -83
  551. package/dist/chunk-JOZYP4GM.js +0 -279
  552. package/dist/doctor-M7YEDGAE.js +0 -91
@@ -24,6 +24,7 @@ import {
24
24
  type RunStatus,
25
25
  runKindSupportsLiveSteering,
26
26
  } from "../domains/dispatch/types.js";
27
+ import { describeWriteBoundaryAttributionDowngrade } from "../domains/dispatch/write-boundary.js";
27
28
  import {
28
29
  summarizeTrustStatus,
29
30
  type TrustSummaryProjection,
@@ -36,17 +37,12 @@ import {
36
37
  type ObservabilityNotice,
37
38
  type ObservabilitySnapshot,
38
39
  } from "../domains/observability/index.js";
39
- import type { CostProvenance } from "../domains/providers/index.js";
40
+ import { type CostProvenance, foregroundStreamUsage } from "../domains/providers/index.js";
40
41
  import { sanitizeCallTargetText } from "../domains/safety/call-target.js";
41
42
  import { type Component, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "../engine/tui.js";
42
43
  import { formatWorkerContextMeter } from "./context-meter.js";
43
- import {
44
- COUNCIL_SYNTHESIS_LABEL,
45
- type CouncilGroupView,
46
- type CouncilMemberView,
47
- councilGroupBody,
48
- councilIslandLines,
49
- } from "./council-grid.js";
44
+ import { COUNCIL_SYNTHESIS_LABEL } from "./council.js";
45
+ import { type CouncilGroupView, type CouncilMemberView, councilGroupBody, councilIslandLines } from "./council-grid.js";
50
46
  import { formatFooterTokens } from "./footer-panel.js";
51
47
  import {
52
48
  type ClioTheme,
@@ -88,6 +84,12 @@ export interface DispatchSteerAcknowledgement {
88
84
  chars: number;
89
85
  }
90
86
 
87
+ export interface DispatchWriteRecordDowngrade {
88
+ reason: "opaque_tool_succeeded";
89
+ tool: string;
90
+ toolCallId: string;
91
+ }
92
+
91
93
  export interface DispatchBoardRow {
92
94
  runId: string;
93
95
  agentId: string;
@@ -97,6 +99,8 @@ export interface DispatchBoardRow {
97
99
  runtimeId: string;
98
100
  targetId: string;
99
101
  wireModelId: string;
102
+ /** Canonical inference scheduler and its independent request-slot bound. */
103
+ endpoint?: { key: string; label: string; limit: number };
100
104
  /** Sanitized, one-line summary of the task assigned to this run. */
101
105
  taskSummary?: string;
102
106
  /** Immutable budget admission provenance for this run. */
@@ -156,6 +160,8 @@ export interface DispatchBoardRow {
156
160
  retry?: DispatchRetryPresentation;
157
161
  /** Most recent worker delivery acknowledgement for an operator steer. */
158
162
  steerAcknowledgement?: DispatchSteerAcknowledgement;
163
+ /** First successful opaque call that opened this run's write record. */
164
+ writeRecordDowngrade?: DispatchWriteRecordDowngrade;
159
165
  /**
160
166
  * Where this run sits in a fleet plan: the wave the step was scheduled in
161
167
  * and the step id it executes. Present only for runs a fleet plan
@@ -598,13 +604,37 @@ function progressAnswerLines(
598
604
  return body.map((row, index) => `${index === 0 ? cardKvKey(theme, "answer") : " ".repeat(gutter)}${row}`);
599
605
  }
600
606
 
607
+ /** Keep the canonical tier and every summary clause visible by wrapping the value under its card key. */
608
+ function trustCardLines(theme: ClioTheme, row: DispatchBoardRow, contentWidth: number): string[] {
609
+ const gutter = CARD_KV_KEY_WIDTH + 1;
610
+ const valueWidth = Math.max(1, contentWidth - gutter);
611
+ const trust =
612
+ row.trust === undefined
613
+ ? theme.fg("dim", isTerminalStatus(row.status) ? "receipt not read back" : "not sealed yet")
614
+ : theme.fg(
615
+ trustVerdictToken(row.trust.verdict),
616
+ `${trustVerdictGlyph(row.trust.verdict)} ${row.trust.verdict}; ${row.trust.text}`,
617
+ );
618
+ const host =
619
+ row.hostVerification === undefined ? "" : ` · ${theme.fg("muted", `host checks ${row.hostVerification}`)}`;
620
+ return wrapTextWithAnsi(`${trust}${host}`, valueWidth).map(
621
+ (line, index) => `${index === 0 ? cardKvKey(theme, "trust") : " ".repeat(gutter)}${line}`,
622
+ );
623
+ }
624
+
601
625
  export function renderDispatchCard(
602
626
  row: DispatchBoardRow,
603
627
  width: number,
604
628
  evidence?: RunEvidencePresentation,
605
- options: { selected?: boolean; expanded?: boolean } = {},
629
+ options: {
630
+ selected?: boolean;
631
+ expanded?: boolean;
632
+ endpointActive?: number;
633
+ endpointQueued?: number;
634
+ theme?: ClioTheme;
635
+ } = {},
606
636
  ): string[] {
607
- const theme = clioTheme();
637
+ const theme = options.theme ?? clioTheme();
608
638
  const contentWidth = Math.max(0, width - 4);
609
639
  const agentLabel = agentDisplayLabel(row);
610
640
  const elapsed = formatCompactMs(row.elapsedMs);
@@ -653,6 +683,14 @@ export function renderDispatchCard(
653
683
  const statusUnits = [
654
684
  statusStr,
655
685
  theme.fg("muted", `node ${row.node ?? "local"}`),
686
+ ...(row.endpoint !== undefined
687
+ ? [
688
+ theme.fg(
689
+ "info",
690
+ `slots ${options.endpointActive ?? 0}/${row.endpoint.limit}${(options.endpointQueued ?? 0) > 0 ? ` +${options.endpointQueued} queued` : ""} ${row.endpoint.label}`,
691
+ ),
692
+ ]
693
+ : []),
656
694
  ...(row.gate !== undefined ? [theme.fg("info", `gate ${row.gate.role} c${row.gate.cycle}`)] : []),
657
695
  ...(row.rerouteCount !== undefined && row.rerouteCount > 0
658
696
  ? [theme.fg("warning", `rerouted x${row.rerouteCount}`)]
@@ -663,15 +701,6 @@ export function renderDispatchCard(
663
701
  `${theme.fg("dim", "ttft")} ${theme.fg("muted", ttft)}`,
664
702
  `${theme.fg("dim", "cost")} ${theme.fg("muted", cost)}`,
665
703
  ];
666
- // The trust line is the canonical projection, styled by its verdict tier;
667
- // a host check is folded into that projection as validation grounding, so
668
- // it is named as a secondary fact and never as independent verification.
669
- const trustUnits = [
670
- row.trust === undefined
671
- ? theme.fg("dim", isTerminalStatus(row.status) ? "trust: receipt not read back" : "trust: not sealed yet")
672
- : theme.fg(trustVerdictToken(row.trust.verdict), `${trustVerdictGlyph(row.trust.verdict)} ${row.trust.text}`),
673
- ...(row.hostVerification !== undefined ? [theme.fg("muted", `host checks ${row.hostVerification}`)] : []),
674
- ];
675
704
  const contextUnit = formatWorkerContextMeter(row.lastContextTokens ?? 0, row.contextWindow, theme);
676
705
  // The phase column: a fleet step says which wave it belongs to and which
677
706
  // step it is; every other run leaves the cell empty rather than inventing a
@@ -690,7 +719,7 @@ export function renderDispatchCard(
690
719
  ? [truncateToWidth(`${cardKvKey(theme, "task")}${theme.fg("muted", row.taskSummary)}`, contentWidth, "…", false)]
691
720
  : []),
692
721
  cardUnitsLine(theme, "status", statusUnits, contentWidth),
693
- cardUnitsLine(theme, "trust", trustUnits, contentWidth),
722
+ ...trustCardLines(theme, row, contentWidth),
694
723
  ...(row.budget !== undefined
695
724
  ? [
696
725
  truncateToWidth(
@@ -751,6 +780,16 @@ export function renderDispatchCard(
751
780
  ),
752
781
  );
753
782
  }
783
+ if (row.writeRecordDowngrade) {
784
+ const warning = describeWriteBoundaryAttributionDowngrade({
785
+ ...row.writeRecordDowngrade,
786
+ runId: row.runId,
787
+ stepId: row.phase?.stepId ?? null,
788
+ });
789
+ bodyLines.push(
790
+ ...wrapTextWithAnsi(`${cardKvKey(theme, "record")}${theme.fg("warning", `open: ${warning}`)}`, contentWidth),
791
+ );
792
+ }
754
793
  // The proof row is present only when the observability projection knows an
755
794
  // evidence state for this run; an unknown/none state adds no line, so cards
756
795
  // without evidence keep their existing three-line body.
@@ -969,6 +1008,15 @@ export function formatDispatchBoardLines(
969
1008
  });
970
1009
  }
971
1010
 
1011
+ const endpointActive: Record<string, number> = { ...foregroundStreamUsage() };
1012
+ const endpointQueued: Record<string, number> = {};
1013
+ for (const row of rows) {
1014
+ if (row.endpoint === undefined) continue;
1015
+ if (row.status === "enqueued") endpointQueued[row.endpoint.key] = (endpointQueued[row.endpoint.key] ?? 0) + 1;
1016
+ else if (row.status === "running" || row.status === "stale" || row.status === "cancelling")
1017
+ endpointActive[row.endpoint.key] = (endpointActive[row.endpoint.key] ?? 0) + 1;
1018
+ }
1019
+
972
1020
  // A council is one question asked of several members, so its rows render as
973
1021
  // one card holding the whole group rather than as unrelated neighbours.
974
1022
  const cards = dispatchBoardItems(rows, selectedRunId).map((item) =>
@@ -977,6 +1025,12 @@ export function formatDispatchBoardLines(
977
1025
  : renderDispatchCard(item.row, width, deriveRunEvidenceState(observability, item.row.runId), {
978
1026
  selected: item.row.runId === selectedRunId,
979
1027
  expanded: detailExpanded && item.row.runId === selectedRunId,
1028
+ ...(item.row.endpoint !== undefined
1029
+ ? {
1030
+ endpointActive: endpointActive[item.row.endpoint.key] ?? 0,
1031
+ endpointQueued: endpointQueued[item.row.endpoint.key] ?? 0,
1032
+ }
1033
+ : {}),
980
1034
  }),
981
1035
  );
982
1036
  const body: string[] = [];
@@ -1155,6 +1209,15 @@ function parseGateBadge(value: unknown): { role: string; cycle: number } | undef
1155
1209
  return { role: record.role, cycle };
1156
1210
  }
1157
1211
 
1212
+ function parseEndpointCapacity(value: unknown): DispatchBoardRow["endpoint"] | undefined {
1213
+ if (typeof value !== "object" || value === null) return undefined;
1214
+ const record = value as { key?: unknown; label?: unknown; limit?: unknown };
1215
+ const key = parseNonEmptyString(record.key);
1216
+ const label = parseNonEmptyString(record.label);
1217
+ const limit = parsePositiveInt(record.limit);
1218
+ return key === undefined || label === undefined || limit === undefined ? undefined : { key, label, limit };
1219
+ }
1220
+
1158
1221
  function parseCouncilBadge(value: unknown): DispatchBoardRow["council"] | undefined {
1159
1222
  if (typeof value !== "object" || value === null) return undefined;
1160
1223
  const record = value as { group?: unknown; label?: unknown; color?: unknown; round?: unknown };
@@ -1351,6 +1414,7 @@ function toRow(entry: DispatchBoardEntry, now: number): DispatchBoardRow {
1351
1414
  runtimeId: entry.runtimeId,
1352
1415
  targetId: entry.targetId,
1353
1416
  wireModelId: entry.wireModelId,
1417
+ ...(entry.endpoint !== undefined ? { endpoint: { ...entry.endpoint } } : {}),
1354
1418
  ...(entry.taskSummary !== undefined ? { taskSummary: entry.taskSummary } : {}),
1355
1419
  ...(entry.budget !== undefined ? { budget: entry.budget } : {}),
1356
1420
  status: retry ? "retrying" : entry.status,
@@ -1379,6 +1443,7 @@ function toRow(entry: DispatchBoardEntry, now: number): DispatchBoardRow {
1379
1443
  recentTools: progress.recentActions.map((action) => action.tool),
1380
1444
  ...(retry ? { retry: { ...retry } } : {}),
1381
1445
  ...(entry.steerAcknowledgement ? { steerAcknowledgement: { ...entry.steerAcknowledgement } } : {}),
1446
+ ...(entry.writeRecordDowngrade ? { writeRecordDowngrade: { ...entry.writeRecordDowngrade } } : {}),
1382
1447
  };
1383
1448
  }
1384
1449
 
@@ -1461,6 +1526,7 @@ export function createDispatchBoardStore(
1461
1526
  const agentAudience = parseAgentAudience(raw.agentAudience, previous?.agentAudience);
1462
1527
  const requestOrigin = parseRequestOrigin(raw.requestOrigin, previous?.requestOrigin);
1463
1528
  const node = parseNonEmptyString(raw.node) ?? previous?.node;
1529
+ const endpoint = parseEndpointCapacity(raw.endpoint) ?? previous?.endpoint;
1464
1530
  const gate = parseGateBadge(raw.gate) ?? previous?.gate;
1465
1531
  const council = parseCouncilBadge(raw.council) ?? previous?.council;
1466
1532
  const rerouteCount = parsePositiveInt(raw.rerouteCount) ?? previous?.rerouteCount;
@@ -1477,6 +1543,7 @@ export function createDispatchBoardStore(
1477
1543
  runtimeId: parseText(raw.runtimeId, previous?.runtimeId ?? "-"),
1478
1544
  targetId: parseText(raw.targetId, previous?.targetId ?? "-"),
1479
1545
  wireModelId: parseText(raw.wireModelId, previous?.wireModelId ?? "-"),
1546
+ ...(endpoint !== undefined ? { endpoint } : {}),
1480
1547
  ...(taskSummary !== undefined ? { taskSummary } : {}),
1481
1548
  ...(budget !== undefined ? { budget } : {}),
1482
1549
  status,
@@ -1505,6 +1572,7 @@ export function createDispatchBoardStore(
1505
1572
  progress: previous?.progress ?? createWorkerProgressFold(),
1506
1573
  ...(previous?.retry ? { retry: { ...previous.retry } } : {}),
1507
1574
  ...(previous?.steerAcknowledgement ? { steerAcknowledgement: { ...previous.steerAcknowledgement } } : {}),
1575
+ ...(previous?.writeRecordDowngrade ? { writeRecordDowngrade: { ...previous.writeRecordDowngrade } } : {}),
1508
1576
  };
1509
1577
  entries.set(runId, entry);
1510
1578
  pruneEntries(entries, (evicted) => fleetPhases.delete(evicted));
@@ -1654,6 +1722,20 @@ export function createDispatchBoardStore(
1654
1722
  entry.ttftMs = Math.round(performance.now() - entry.startedAtClockMs);
1655
1723
  }
1656
1724
  }
1725
+ if (type === "clio_write_record_downgraded") {
1726
+ const rawPayload = (workerEvent as { payload?: unknown }).payload;
1727
+ const payload =
1728
+ typeof rawPayload === "object" && rawPayload !== null ? (rawPayload as Record<string, unknown>) : null;
1729
+ const tool = payload === null ? undefined : parseNonEmptyString(payload.tool);
1730
+ const toolCallId = payload === null ? undefined : parseNonEmptyString(payload.toolCallId);
1731
+ if (payload?.reason === "opaque_tool_succeeded" && tool !== undefined && toolCallId !== undefined) {
1732
+ entry.writeRecordDowngrade = {
1733
+ reason: "opaque_tool_succeeded",
1734
+ tool: sanitizeCallTargetText(tool),
1735
+ toolCallId: sanitizeCallTargetText(toolCallId),
1736
+ };
1737
+ }
1738
+ }
1657
1739
  // The one fold that reads worker prose and tool activity. Everything the
1658
1740
  // board says about what a worker is saying or touching comes from here,
1659
1741
  // so the board and the transcript block cannot tell two stories.
@@ -26,7 +26,11 @@ import {
26
26
  validateFleetGraph,
27
27
  } from "../domains/agents/index.js";
28
28
  import type { AgentSpec } from "../domains/agents/spec.js";
29
- import type { ExecutionPlan, ExecutionPlanStep } from "../domains/dispatch/execution-plan.js";
29
+ import {
30
+ bindExecutionPlanEndpoints,
31
+ type ExecutionPlan,
32
+ type ExecutionPlanStep,
33
+ } from "../domains/dispatch/execution-plan.js";
30
34
  import {
31
35
  type AgentRoleFactsResolver,
32
36
  requestExecutionRole,
@@ -40,6 +44,7 @@ export interface FleetRunPreviewRoute {
40
44
  targetId: string;
41
45
  wireModelId: string;
42
46
  nodeId: string;
47
+ endpoint?: { key: string; label: string; limit: number; foregroundHeld?: number };
43
48
  }
44
49
 
45
50
  export interface FleetRunPreviewStep {
@@ -207,6 +212,40 @@ export function compileFleetRunPreview(input: FleetRunPreviewInput): FleetRunPre
207
212
  diagnostics.push(describeError(error));
208
213
  return fail();
209
214
  }
215
+ const routes = new Map<string, FleetRunPreviewRoute>();
216
+ if (input.resolveRoute !== undefined) {
217
+ for (const step of plan.steps) {
218
+ if (step.kind === "code") continue;
219
+ try {
220
+ const route = input.resolveRoute({
221
+ stepId: step.id,
222
+ agentId: step.agentId,
223
+ task: step.task,
224
+ scope: step.scope,
225
+ ...(step.target !== undefined ? { target: step.target } : {}),
226
+ ...(step.profile !== undefined ? { profile: step.profile } : {}),
227
+ });
228
+ if (route !== null) routes.set(step.id, route);
229
+ } catch (error) {
230
+ diagnostics.push(`step '${step.id}' route preflight failed: ${describeError(error)}`);
231
+ }
232
+ }
233
+ plan = bindExecutionPlanEndpoints(
234
+ plan,
235
+ Object.fromEntries(
236
+ [...routes].map(([stepId, route]) => [
237
+ stepId,
238
+ route.endpoint === undefined
239
+ ? undefined
240
+ : {
241
+ key: route.endpoint.key,
242
+ limit: route.endpoint.limit,
243
+ ...(route.endpoint.foregroundHeld !== undefined ? { foregroundHeld: route.endpoint.foregroundHeld } : {}),
244
+ },
245
+ ]),
246
+ ),
247
+ );
248
+ }
210
249
 
211
250
  // A declared boundary is verified against the checkout, so the checkout has
212
251
  // to be one this can read. Refused here, before any dispatch, rather than
@@ -261,20 +300,7 @@ export function compileFleetRunPreview(input: FleetRunPreviewInput): FleetRunPre
261
300
  },
262
301
  ];
263
302
  }
264
- let route: FleetRunPreviewRoute | null = null;
265
- try {
266
- route =
267
- input.resolveRoute?.({
268
- stepId: step.id,
269
- agentId: step.agentId,
270
- task: step.task,
271
- scope: step.scope,
272
- ...(step.target !== undefined ? { target: step.target } : {}),
273
- ...(step.profile !== undefined ? { profile: step.profile } : {}),
274
- }) ?? null;
275
- } catch (error) {
276
- diagnostics.push(`step '${step.id}' route preflight failed: ${describeError(error)}`);
277
- }
303
+ const route = routes.get(step.id) ?? null;
278
304
  return [
279
305
  {
280
306
  ...base,
@@ -34,6 +34,22 @@ export const HANDOFF_SYSTEM_PROMPT = [
34
34
  /** A handoff record is a list of short entries, so the budget is modest. */
35
35
  export const HANDOFF_MAX_TOKENS = 4096;
36
36
 
37
+ /** The name the wire dialect gives the schema, where it takes one. */
38
+ export const HANDOFF_SCHEMA_NAME = "handoff_record";
39
+
40
+ /** Characters of the refused answer quoted back to the model in the repair round. */
41
+ export const HANDOFF_REPAIR_QUOTE_CHARS = 600;
42
+
43
+ /**
44
+ * What the first round returned and why the parser refused it. The repair round
45
+ * shows the model both, because "return one JSON object" repeated verbatim is
46
+ * the instruction it already failed (issue #223).
47
+ */
48
+ export interface HandoffRepairInput {
49
+ complaint: string;
50
+ previous: string;
51
+ }
52
+
37
53
  export interface HandoffRoundInput {
38
54
  model: EngineModel;
39
55
  /** Read-only. The round copies before appending its own message. */
@@ -42,15 +58,38 @@ export interface HandoffRoundInput {
42
58
  apiKey?: string;
43
59
  signal?: AbortSignal;
44
60
  maxTokens?: number;
61
+ /** Resolved runtime id, which decides whether the schema can be bound on the wire. */
62
+ runtimeId?: string;
63
+ /** Set on the second and last round, after the parser refused the first. */
64
+ repair?: HandoffRepairInput;
65
+ }
66
+
67
+ function repairText(goal: string, repair: HandoffRepairInput): string {
68
+ const quoted = repair.previous.slice(0, HANDOFF_REPAIR_QUOTE_CHARS);
69
+ return [
70
+ `The next session's goal is: ${goal}`,
71
+ "",
72
+ "Your previous answer could not be read as a handoff record.",
73
+ `The parser said: ${repair.complaint}`,
74
+ "This is what you returned, verbatim:",
75
+ "---",
76
+ quoted.length > 0 ? quoted : "(nothing)",
77
+ "---",
78
+ "Answer again with one JSON object matching the schema and nothing else.",
79
+ "No prose before it, no prose after it, no code fence.",
80
+ ].join("\n");
45
81
  }
46
82
 
47
83
  /** Run the round. Provider failures reject; the caller renders the reason. */
48
84
  export async function runHandoffRound(input: HandoffRoundInput): Promise<SideQuestionResult> {
49
- const { goal, ...rest } = input;
85
+ const { goal, repair, ...rest } = input;
50
86
  return runOutOfTurnRound({
51
87
  ...rest,
52
88
  maxTokens: input.maxTokens ?? HANDOFF_MAX_TOKENS,
53
89
  systemPrompt: HANDOFF_SYSTEM_PROMPT,
54
- userText: `The next session's goal is: ${goal}\n\nExtract the handoff record for that goal now.`,
90
+ responseSchema: { name: HANDOFF_SCHEMA_NAME, schema: HANDOFF_RESPONSE_SCHEMA },
91
+ userText: repair
92
+ ? repairText(goal, repair)
93
+ : `The next session's goal is: ${goal}\n\nExtract the handoff record for that goal now.`,
55
94
  });
56
95
  }