@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
@@ -0,0 +1,158 @@
1
+ /**
2
+ * The capability ladder from spec 4.2.
3
+ *
4
+ * Guest mode requires all of: `HERDR_ENV=1`, a connectable socket, and a `ping`
5
+ * answered inside one second. The three conditions are checked in that order
6
+ * and the first one that fails ends detection, which is what makes the `none`
7
+ * path free: with `HERDR_ENV` unset nothing here opens a file descriptor, and a
8
+ * contract test pins that by making `net.connect` throw for the duration of the
9
+ * call.
10
+ *
11
+ * Embedded mode resolves to `none` until Phase 5 lands the session bootstrap.
12
+ * Asking for it is not an error; it degrades with a reason the doctor surface
13
+ * can print.
14
+ */
15
+
16
+ import { homedir } from "node:os";
17
+ import { join } from "node:path";
18
+ import { createMuxClient, type MuxClient } from "./socket-client.js";
19
+ import type { MuxLog, MuxMode, MuxSelfLocation, MuxServerInfo } from "./types.js";
20
+
21
+ /** Spec 4.2 gives the ping one second to answer before the rung is refused. */
22
+ const PING_TIMEOUT_MS = 1_000;
23
+
24
+ export type MuxEnablement = "auto" | "embedded" | "off";
25
+
26
+ export interface MuxDetection {
27
+ mode: MuxMode;
28
+ socketPath: string | null;
29
+ server: MuxServerInfo | null;
30
+ self: MuxSelfLocation;
31
+ /** Socket paths considered, in resolution order, for doctor output. */
32
+ candidates: ReadonlyArray<string>;
33
+ /** Human-readable reason, always set; for `guest` it names the socket that answered. */
34
+ reason: string;
35
+ }
36
+
37
+ export interface DetectMuxOptions {
38
+ env?: NodeJS.ProcessEnv;
39
+ enabled?: MuxEnablement;
40
+ pingTimeoutMs?: number;
41
+ log?: MuxLog;
42
+ /** Injection seam for tests; production opens a real client. */
43
+ openClient?: (socketPath: string) => MuxClient;
44
+ }
45
+
46
+ /**
47
+ * herdr resolves its config dir through `XDG_CONFIG_HOME` first and falls back
48
+ * to the platform default, which on Linux is `~/.config/herdr`. Mirroring that
49
+ * matters: a user with `XDG_CONFIG_HOME` set has no `~/.config/herdr` at all,
50
+ * and the spec's literal `~/.config/herdr` would miss every one of their
51
+ * sockets.
52
+ */
53
+ function herdrConfigDir(env: NodeJS.ProcessEnv): string {
54
+ const xdg = env.XDG_CONFIG_HOME;
55
+ if (typeof xdg === "string" && xdg.length > 0) return join(xdg, "herdr");
56
+ const home = typeof env.HOME === "string" && env.HOME.length > 0 ? env.HOME : homedir();
57
+ return join(home, ".config", "herdr");
58
+ }
59
+
60
+ /** Socket paths to try, in the order spec 4.2 fixes. */
61
+ export function resolveSocketCandidates(env: NodeJS.ProcessEnv): ReadonlyArray<string> {
62
+ const candidates: string[] = [];
63
+ const explicit = env.HERDR_SOCKET_PATH;
64
+ if (typeof explicit === "string" && explicit.length > 0) candidates.push(explicit);
65
+ const configDir = herdrConfigDir(env);
66
+ const session = env.HERDR_SESSION;
67
+ if (typeof session === "string" && session.length > 0) {
68
+ candidates.push(join(configDir, "sessions", session, "herdr.sock"));
69
+ }
70
+ candidates.push(join(configDir, "herdr.sock"));
71
+ return [...new Set(candidates)];
72
+ }
73
+
74
+ function readSelfLocation(env: NodeJS.ProcessEnv): MuxSelfLocation {
75
+ const read = (key: string): string | null => {
76
+ const value = env[key];
77
+ return typeof value === "string" && value.length > 0 ? value : null;
78
+ };
79
+ return {
80
+ workspaceId: read("HERDR_WORKSPACE_ID"),
81
+ tabId: read("HERDR_TAB_ID"),
82
+ paneId: read("HERDR_PANE_ID"),
83
+ };
84
+ }
85
+
86
+ function none(reason: string, candidates: ReadonlyArray<string> = []): MuxDetection {
87
+ return {
88
+ mode: "none",
89
+ socketPath: null,
90
+ server: null,
91
+ self: { workspaceId: null, tabId: null, paneId: null },
92
+ candidates,
93
+ reason,
94
+ };
95
+ }
96
+
97
+ /**
98
+ * The detected rung plus the live client when one was reached. The client is
99
+ * the same connection the ping went over, so the caller inherits a warm socket
100
+ * rather than reconnecting.
101
+ */
102
+ export interface MuxDetectionResult {
103
+ detection: MuxDetection;
104
+ client: MuxClient | null;
105
+ }
106
+
107
+ export async function detectMux(options: DetectMuxOptions = {}): Promise<MuxDetectionResult> {
108
+ const env = options.env ?? process.env;
109
+ const enabled = options.enabled ?? "auto";
110
+ const log = options.log ?? ((): void => undefined);
111
+
112
+ if (enabled === "off") {
113
+ return { detection: none("panes are turned off"), client: null };
114
+ }
115
+ if (enabled === "embedded") {
116
+ // Phase 5 owns the session bootstrap. Until then the honest answer is that
117
+ // Clio cannot provide panes, not that it failed to find them.
118
+ return { detection: none("embedded mode is not implemented yet; it ships in phase 5"), client: null };
119
+ }
120
+ if (env.HERDR_ENV !== "1") {
121
+ return { detection: none("HERDR_ENV is not 1, so Clio is not running inside a pane host"), client: null };
122
+ }
123
+
124
+ const candidates = resolveSocketCandidates(env);
125
+ const openClient = options.openClient ?? ((socketPath: string) => createMuxClient({ socketPath, log }));
126
+ const pingTimeoutMs = options.pingTimeoutMs ?? PING_TIMEOUT_MS;
127
+
128
+ for (const socketPath of candidates) {
129
+ const client = openClient(socketPath);
130
+ try {
131
+ const server = await client.ping({ timeoutMs: pingTimeoutMs });
132
+ return {
133
+ detection: {
134
+ mode: "guest",
135
+ socketPath,
136
+ server,
137
+ self: readSelfLocation(env),
138
+ candidates,
139
+ reason: `guest mode on ${socketPath} (herdr ${server.version}, protocol ${server.protocol})`,
140
+ },
141
+ client,
142
+ };
143
+ } catch (error) {
144
+ log("debug", `mux ping ${socketPath} failed: ${error instanceof Error ? error.message : String(error)}`);
145
+ await client.close().catch(() => undefined);
146
+ }
147
+ }
148
+
149
+ return {
150
+ detection: none(
151
+ candidates.length > 0
152
+ ? `no herdr socket answered a ping: tried ${candidates.join(", ")}`
153
+ : "no herdr socket candidates resolved",
154
+ candidates,
155
+ ),
156
+ client: null,
157
+ };
158
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Domain wiring for the pane layer.
3
+ *
4
+ * `createExtension` runs the detection ladder once at boot. This module only
5
+ * loads on a `--with-panes` boot (src/entry/with-panes.ts), so a plain session
6
+ * never reaches this code at all; within an active session, detection failures
7
+ * are never fatal, and a wedged herdr server delays boot by at most the
8
+ * one-second ping budget per socket candidate.
9
+ */
10
+
11
+ import type { DomainBundle, DomainContext, DomainExtension } from "../../core/domain-loader.js";
12
+ import { createMuxRuntime, type MuxContract } from "./contract.js";
13
+ import { detectMux, type MuxEnablement } from "./detect.js";
14
+ import type { MuxLog } from "./types.js";
15
+
16
+ export interface MuxDomainOptions {
17
+ /** `off` skips detection entirely; `embedded` degrades to `none` until phase 5. */
18
+ enabled?: MuxEnablement;
19
+ env?: NodeJS.ProcessEnv;
20
+ log?: MuxLog;
21
+ }
22
+
23
+ export async function createMuxBundle(
24
+ _context: DomainContext,
25
+ options: MuxDomainOptions = {},
26
+ ): Promise<DomainBundle<MuxContract>> {
27
+ const log = options.log ?? ((): void => undefined);
28
+ const { detection, client } = await detectMux({
29
+ ...(options.enabled ? { enabled: options.enabled } : {}),
30
+ ...(options.env ? { env: options.env } : {}),
31
+ log,
32
+ });
33
+ log(detection.mode === "none" ? "debug" : "info", `mux mode ${detection.mode}: ${detection.reason}`);
34
+
35
+ const runtime = createMuxRuntime({ detection, client, log });
36
+
37
+ const extension: DomainExtension = {
38
+ async start(): Promise<void> {
39
+ await runtime.start();
40
+ },
41
+ async stop(): Promise<void> {
42
+ await runtime.stop();
43
+ },
44
+ };
45
+
46
+ return { extension, contract: runtime.contract };
47
+ }
@@ -0,0 +1,96 @@
1
+ import type { DomainModule } from "../../core/domain-loader.js";
2
+ import type { MuxContract } from "./contract.js";
3
+ import { createMuxBundle, type MuxDomainOptions } from "./extension.js";
4
+ import { MuxManifest } from "./manifest.js";
5
+
6
+ /** Zero-configuration module: guest when detected, `none` otherwise. */
7
+ export const MuxDomainModule: DomainModule<MuxContract> = {
8
+ manifest: MuxManifest,
9
+ createExtension: (context) => createMuxBundle(context),
10
+ };
11
+
12
+ /** Parameterized module for callers that gate panes off or on explicitly. */
13
+ export function createMuxDomainModule(options: MuxDomainOptions): DomainModule<MuxContract> {
14
+ return {
15
+ manifest: MuxManifest,
16
+ createExtension: (context) => createMuxBundle(context, options),
17
+ };
18
+ }
19
+
20
+ export type {
21
+ MuxContract,
22
+ MuxNotifyRequest,
23
+ MuxOpenUtilityPaneRequest,
24
+ MuxRuntime,
25
+ MuxRuntimeOptions,
26
+ } from "./contract.js";
27
+ export { createMuxRuntime } from "./contract.js";
28
+ export { detectMux, type MuxDetection, type MuxEnablement, resolveSocketCandidates } from "./detect.js";
29
+ export type { MuxDomainOptions } from "./extension.js";
30
+ export { MuxManifest } from "./manifest.js";
31
+ export { createPaneRegistry, type MuxPaneRegistry, paneRecord } from "./pane-registry.js";
32
+ export { MUX_METHOD_MIN_PROTOCOL, type MuxGatedMethod, muxSupportsMethod } from "./protocol.js";
33
+ export { createMuxClient, type MuxClient, type MuxClientOptions, type MuxSubscription } from "./socket-client.js";
34
+ export {
35
+ type MuxAgentState,
36
+ MuxError,
37
+ type MuxErrorKind,
38
+ type MuxEvent,
39
+ type MuxEventKind,
40
+ type MuxLog,
41
+ type MuxMode,
42
+ type MuxNotificationSound,
43
+ type MuxPanePurpose,
44
+ type MuxPaneRecord,
45
+ type MuxPaneRef,
46
+ type MuxReportableAgentState,
47
+ MuxRequestTimeout,
48
+ type MuxSelfLocation,
49
+ type MuxSelfReport,
50
+ type MuxServerInfo,
51
+ type MuxSnapshot,
52
+ type MuxTab,
53
+ muxErrorKind,
54
+ } from "./types.js";
55
+ export { clioCliEntryPath, type ViewerCommandOptions, watchViewerCommand } from "./viewer-command.js";
56
+ export {
57
+ createYaziEventStream,
58
+ parseYaziEventLine,
59
+ YAZI_STREAM_MAX_BYTES,
60
+ YAZI_STREAM_POLL_MS,
61
+ type YaziCdEvent,
62
+ type YaziEvent,
63
+ type YaziEventStream,
64
+ type YaziEventStreamOptions,
65
+ type YaziEventStreamStats,
66
+ type YaziEventStreamStopReason,
67
+ type YaziPickEvent,
68
+ } from "./yazi/event-stream.js";
69
+ export {
70
+ describeYaziProfile,
71
+ ensureYaziProfile,
72
+ hashYaziAssetTree,
73
+ inspectCurrentYaziProfile,
74
+ inspectYaziProfile,
75
+ renderYaziKeymap,
76
+ resetYaziProfile,
77
+ userYaziConfigDir,
78
+ type YaziProfile,
79
+ type YaziProfileInspection,
80
+ type YaziProfileOptions,
81
+ type YaziProfileStamp,
82
+ type YaziProfileState,
83
+ yaziProfileDir,
84
+ } from "./yazi/profile.js";
85
+ export {
86
+ createYaziSession,
87
+ type YaziChooserResult,
88
+ type YaziProfileMode,
89
+ type YaziResolvedBinaries,
90
+ type YaziSession,
91
+ type YaziSessionMode,
92
+ type YaziSessionOpenResult,
93
+ type YaziSessionOptions,
94
+ type YaziSessionSnapshot,
95
+ } from "./yazi/session.js";
96
+ export { renderYaziTheme } from "./yazi/theme.js";
@@ -0,0 +1,6 @@
1
+ import type { DomainManifest } from "../../core/domain-loader.js";
2
+
3
+ export const MuxManifest: DomainManifest = {
4
+ name: "mux",
5
+ dependsOn: [],
6
+ };
@@ -0,0 +1,164 @@
1
+ /**
2
+ * The operator- and model-facing pane vocabulary: presets, results, and the
3
+ * one operations interface both `/panes` and the `panes` tool drive.
4
+ *
5
+ * It is a leaf with no imports, and it lives in the domain rather than beside
6
+ * either caller because both callers are forbidden from reaching the other's
7
+ * tree. `src/interactive/slash-commands.ts` is a CLI seam whose value closure
8
+ * must stay off the render graph, and `src/tools/**` may not import
9
+ * `src/interactive/**` at all (boundaries rule4). A shared leaf here is the
10
+ * only place both can name the same preset ids and the same result shapes.
11
+ *
12
+ * Presets are the only utility panes the model may open. Arbitrary argv stays
13
+ * operator-only through the slash command, which is what keeps the tool out of
14
+ * shell-escape territory (spec 4.8, and the risk register's "tool misuse" row).
15
+ */
16
+
17
+ /** Utility pane presets, in the order `/panes open` lists them. */
18
+ export const PANES_PRESETS = [
19
+ {
20
+ id: "yazi",
21
+ /** Probed through the toolchain resolution ladder before the pane is split. */
22
+ binary: "yazi",
23
+ summary: "file manager rooted at the workspace",
24
+ /** Printed verbatim when the probe finds nothing. */
25
+ installHint: "clio-coder tools install yazi",
26
+ },
27
+ {
28
+ id: "logs",
29
+ binary: "tail",
30
+ summary: "follow the newest dispatched run's event journal",
31
+ installHint: "install coreutils so `tail` is on PATH",
32
+ },
33
+ {
34
+ id: "shell",
35
+ binary: "bash",
36
+ summary: "a plain shell in the workspace",
37
+ installHint: "install bash, or open a shell with `/panes open <argv>`",
38
+ },
39
+ ] as const;
40
+
41
+ export type PanesPresetId = (typeof PANES_PRESETS)[number]["id"];
42
+
43
+ export const PANES_PRESET_IDS: ReadonlyArray<PanesPresetId> = PANES_PRESETS.map((preset) => preset.id);
44
+
45
+ export function isPanesPresetId(value: string): value is PanesPresetId {
46
+ return PANES_PRESETS.some((preset) => preset.id === value);
47
+ }
48
+
49
+ /** One pane Clio owns, flattened for display. */
50
+ export interface PanesInventoryEntry {
51
+ paneId: string;
52
+ tabId: string;
53
+ purpose: "watch" | "utility";
54
+ label: string;
55
+ adopted: boolean;
56
+ /** An open operation admitted locally but not yet reconciled into the mux registry. */
57
+ pending?: boolean;
58
+ }
59
+
60
+ /** Effective pane settings, as `/panes` prints them. */
61
+ export interface PanesEffectiveSettings {
62
+ enabled: string;
63
+ notifications: string;
64
+ journal: boolean;
65
+ yazi: {
66
+ enabled: boolean;
67
+ mode: "companion" | "chooser";
68
+ profile: "managed" | "user";
69
+ followCwd: boolean;
70
+ };
71
+ }
72
+
73
+ /** File-pane return-path state flattened for `/panes` and the model tool. */
74
+ export interface PanesYaziStatus {
75
+ mode: "companion" | "chooser" | "closed";
76
+ paneId: string | null;
77
+ paneCwd: string | null;
78
+ lastLineAt: number | null;
79
+ droppedLines: number;
80
+ }
81
+
82
+ /** What `/panes` with no subcommand answers. */
83
+ export interface PanesStatus {
84
+ mode: "embedded" | "guest" | "none";
85
+ available: boolean;
86
+ /** Why the mux resolved the way it did, straight from detection. */
87
+ reason: string;
88
+ socketPath: string | null;
89
+ server: { version: string; protocol: number } | null;
90
+ settings: PanesEffectiveSettings;
91
+ yazi: PanesYaziStatus;
92
+ panes: ReadonlyArray<PanesInventoryEntry>;
93
+ }
94
+
95
+ export type PanesShowResult =
96
+ | { status: "watching"; runId: string; agentId: string; opened: boolean }
97
+ | { status: "not-found"; target: string; candidates: ReadonlyArray<string> }
98
+ | { status: "refused"; reason: string }
99
+ | { status: "unavailable"; reason: string };
100
+
101
+ /** What one watch call settles to; the controller lives in src/interactive/watch-pane.ts. */
102
+ export type PanesWatchResult =
103
+ | { status: "watching"; runId: string; paneId: string; opened: boolean }
104
+ | { status: "unavailable"; reason: string };
105
+
106
+ /**
107
+ * Interactive-only watch-pane controller, attached after the TUI exists. A
108
+ * structural interface here for the same reason {@link PanesYaziController}
109
+ * is: neither the domain nor the tool may import the interactive tree.
110
+ */
111
+ export interface PanesWatchController {
112
+ /** Point the watch pane at a run, opening or adopting the pane first if needed. */
113
+ watch(runId: string): Promise<PanesWatchResult>;
114
+ /** Retarget only; false when no watch pane is open or the write failed. */
115
+ follow(runId: string): boolean;
116
+ isOpen(): boolean;
117
+ dispose(): void;
118
+ }
119
+
120
+ export type PanesOpenResult =
121
+ | { status: "opened"; label: string; paneId: string | null }
122
+ | { status: "missing-binary"; preset: string; binary: string; installHint: string; detail: string }
123
+ | { status: "refused"; reason: string }
124
+ | { status: "unavailable"; reason: string };
125
+
126
+ export type PanesCloseResult =
127
+ | { status: "closed"; closed: number; labels: ReadonlyArray<string> }
128
+ | { status: "not-found"; target: string }
129
+ | { status: "unavailable"; reason: string };
130
+
131
+ /**
132
+ * Interactive-only controller attached after the composer and TUI exist.
133
+ *
134
+ * This structural interface stays in the shared leaf so the panes domain does
135
+ * not import the interactive implementation and the tool does not gain a path
136
+ * into `src/interactive/**`.
137
+ */
138
+ export interface PanesYaziController {
139
+ open(options?: {
140
+ once?: boolean;
141
+ }): Promise<
142
+ | { status: "opened"; mode: "companion" | "chooser"; paneId: string | null; existing: boolean }
143
+ | { status: "missing-binary"; binary: "yazi" | "ya"; detail: string }
144
+ | { status: "profile-error"; reason: string }
145
+ | { status: "unavailable"; reason: string }
146
+ >;
147
+ status(): Readonly<PanesYaziStatus>;
148
+ }
149
+
150
+ /**
151
+ * The operations both callers drive. The tool sees a narrower door: its schema
152
+ * has no argv field at all, and `open` refuses one even if a caller fabricates
153
+ * it.
154
+ */
155
+ export interface PanesOperations {
156
+ status(): PanesStatus;
157
+ show(target: string): Promise<PanesShowResult>;
158
+ open(request: { preset?: string; argv?: ReadonlyArray<string>; once?: boolean }): Promise<PanesOpenResult>;
159
+ close(target: string): Promise<PanesCloseResult>;
160
+ /** Bind the composer-facing Yazi bridge without rebuilding this shared object. */
161
+ attachYazi(controller: PanesYaziController): () => void;
162
+ /** Bind the workers-view watch controller; `show` routes runs through it. */
163
+ attachWatch(controller: PanesWatchController): () => void;
164
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * The set of panes Clio created, and the only panes Clio will ever act on.
3
+ *
4
+ * The ownership rule forbids closing, renaming, reporting state on, or sending
5
+ * input to a pane Clio did not create, so every mutating path in `contract.ts`
6
+ * asks this registry first. `pane.closed` and `pane.exited` events feed
7
+ * `forget`, and a post-reconnect `session.snapshot` feeds `reconcile`, so a
8
+ * pane the user closed behind Clio's back stops being in the inventory either
9
+ * way.
10
+ */
11
+
12
+ import type { MuxPanePurpose, MuxPaneRecord, MuxPaneRef } from "./types.js";
13
+
14
+ export interface MuxPaneRegistry {
15
+ /** Record a pane Clio just created. Replaces any record with the same pane id. */
16
+ record(entry: MuxPaneRecord): void;
17
+ byPaneId(paneId: string): MuxPaneRecord | null;
18
+ /** Newest pane of one purpose, e.g. the watch pane. */
19
+ byPurpose(purpose: MuxPanePurpose): MuxPaneRecord | null;
20
+ /** Whether Clio created this pane, and therefore may act on it. */
21
+ owns(paneId: string): boolean;
22
+ /** Drop one pane; returns the dropped record so callers can log what went. */
23
+ forget(paneId: string): MuxPaneRecord | null;
24
+ /**
25
+ * Drop every record whose pane is absent from `livePaneIds`. Returns the
26
+ * dropped records, oldest first.
27
+ */
28
+ reconcile(livePaneIds: Iterable<string>): ReadonlyArray<MuxPaneRecord>;
29
+ list(): ReadonlyArray<MuxPaneRecord>;
30
+ clear(): void;
31
+ }
32
+
33
+ export function createPaneRegistry(): MuxPaneRegistry {
34
+ // Insertion-ordered, which is what makes `list()` read oldest-pane-first.
35
+ const byPane = new Map<string, MuxPaneRecord>();
36
+
37
+ return {
38
+ record(entry: MuxPaneRecord): void {
39
+ byPane.set(entry.ref.paneId, entry);
40
+ },
41
+ byPaneId(paneId: string): MuxPaneRecord | null {
42
+ return byPane.get(paneId) ?? null;
43
+ },
44
+ byPurpose(purpose: MuxPanePurpose): MuxPaneRecord | null {
45
+ let newest: MuxPaneRecord | null = null;
46
+ for (const entry of byPane.values()) {
47
+ if (entry.purpose === purpose) newest = entry;
48
+ }
49
+ return newest;
50
+ },
51
+ owns(paneId: string): boolean {
52
+ return byPane.has(paneId);
53
+ },
54
+ forget(paneId: string): MuxPaneRecord | null {
55
+ const entry = byPane.get(paneId);
56
+ if (!entry) return null;
57
+ byPane.delete(paneId);
58
+ return entry;
59
+ },
60
+ reconcile(livePaneIds: Iterable<string>): ReadonlyArray<MuxPaneRecord> {
61
+ const live = new Set(livePaneIds);
62
+ const dropped: MuxPaneRecord[] = [];
63
+ for (const [paneId, entry] of byPane) {
64
+ if (!live.has(paneId)) dropped.push(entry);
65
+ }
66
+ for (const entry of dropped) byPane.delete(entry.ref.paneId);
67
+ return dropped;
68
+ },
69
+ list(): ReadonlyArray<MuxPaneRecord> {
70
+ return [...byPane.values()];
71
+ },
72
+ clear(): void {
73
+ byPane.clear();
74
+ },
75
+ };
76
+ }
77
+
78
+ /** Convenience for building a registry entry from a freshly created pane. */
79
+ export function paneRecord(
80
+ ref: MuxPaneRef,
81
+ fields: { purpose: MuxPanePurpose; label: string; openedAt: number; adopted?: boolean },
82
+ ): MuxPaneRecord {
83
+ return {
84
+ ref,
85
+ purpose: fields.purpose,
86
+ label: fields.label,
87
+ openedAt: fields.openedAt,
88
+ ...(fields.adopted === true ? { adopted: true } : {}),
89
+ };
90
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Protocol floors for the wire methods that are not universal.
3
+ *
4
+ * Phase 1 recorded `protocol` and `version` from the `ping` handshake and gated
5
+ * nothing on them, because every method phase 1 used exists across the whole
6
+ * protocol range Clio cares about. Phase 3 adds two that do not, and Phase 4
7
+ * adds the worktree family: a herdr old
8
+ * enough to predate them answers `invalid_request`, and the honest response is
9
+ * to take the documented fallback rather than to log a failure per call.
10
+ * (`agent.focus` was gated here too until the per-run focus ladder was
11
+ * removed with the run viewer panes; nothing drives it any more.)
12
+ *
13
+ * The floors are protocol introductions checked against herdr's changelog and
14
+ * then re-verified with `herdr api schema --json` from PATH 0.7.5/protocol 17
15
+ * and pinned 0.8.2/protocol 21. Worktrees arrived in protocol 10; notification.show
16
+ * arrived in 17. Lower one only after checking the schema of
17
+ * the release you are lowering it to.
18
+ */
19
+
20
+ import type { MuxServerInfo } from "./types.js";
21
+
22
+ /** Wire methods this file gates. Phase 1 methods are unconditional and absent here. */
23
+ export type MuxGatedMethod =
24
+ | "notification.show"
25
+ | "pane.rename"
26
+ | "worktree.list"
27
+ | "worktree.create"
28
+ | "worktree.open"
29
+ | "worktree.remove";
30
+
31
+ export const MUX_METHOD_MIN_PROTOCOL: Readonly<Record<MuxGatedMethod, number>> = {
32
+ "notification.show": 17,
33
+ "pane.rename": 17,
34
+ "worktree.list": 10,
35
+ "worktree.create": 10,
36
+ "worktree.open": 10,
37
+ "worktree.remove": 10,
38
+ };
39
+
40
+ /**
41
+ * Whether the server that answered detection is new enough for `method`.
42
+ *
43
+ * A missing server record means detection never completed a handshake, which is
44
+ * the `none` rung: nothing is supported because nothing is there.
45
+ */
46
+ export function muxSupportsMethod(server: MuxServerInfo | null, method: MuxGatedMethod): boolean {
47
+ if (server === null) return false;
48
+ return server.protocol >= MUX_METHOD_MIN_PROTOCOL[method];
49
+ }