@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
@@ -1,6 +1,6 @@
1
1
  # Troubleshooting & Error Remediation
2
2
 
3
- This guide provides concrete, actionable remediation procedures for operational errors, permission denials, target connection failures, and system diagnostics in Clio Coder `v0.3.7`.
3
+ This guide provides concrete, actionable remediation procedures for operational errors, permission denials, target connection failures, and system diagnostics in Clio Coder `v0.4.0`.
4
4
 
5
5
  ---
6
6
 
@@ -26,6 +26,93 @@ This guide provides concrete, actionable remediation procedures for operational
26
26
 
27
27
  ---
28
28
 
29
+ ## Reading a cold cache
30
+
31
+ On a local server prefill is most of what a turn costs, so a cold prefix cache is the difference between a first token in under a second and one in fifty. This is how to find out why a turn went cold, starting from what the TUI shows.
32
+
33
+ **1. Read the `/context` cache lines.** Two lines answer different questions. The prompt-cache line says what the provider reported and whether the compiled prompt shell was reused. The prefill line says what the server itself did:
34
+
35
+ ```text
36
+ prefill: 34,951 uncached · 0 cached · 48,617 ms
37
+ ```
38
+
39
+ Those are the server's own numbers, not Clio's estimate. `server does not report cache reads` in place of the cached figure means the backend gave no `cache_n` at all, which is LM Studio 2.29.0's OpenAI-compatible port today; on that target the verdict comes from the provider's `cached_tokens` instead and the prefill line reports only total prompt work and milliseconds.
40
+
41
+ **2. Look for the expected-cold line.** When the last settled run came back `cold` and Clio had recorded a cause, `/context` names it rather than warning:
42
+
43
+ ```text
44
+ last cold turn: working-set eviction (expected)
45
+ ```
46
+
47
+ The eight causes and what stamps each one are in [context-engine.md](context-engine.md#cache-divergence-honesty). `background_memory` renders in prose as `last cold turn: background memory step (expected)`.
48
+
49
+ **3. Confirm it in the ledger.** The reasons are durable, so a finished session answers the same question without the TUI. Open `current.jsonl` under the session directory `clio-coder paths` reports and read the run's first assistant entry:
50
+
51
+ ```json
52
+ {
53
+ "timing": { "ttftMs": 53194, "apiMs": 56770 },
54
+ "promptCache": {
55
+ "input": 34951, "cacheRead": 0, "cacheWrite": 0,
56
+ "backendVerdict": "cold",
57
+ "expectedColdReasons": ["dispatch", "residency"],
58
+ "backend": {
59
+ "promptTokens": 34951, "cachedTokens": 0, "predictedTokens": 24,
60
+ "promptMs": 48617, "predictedMs": 373, "source": "llamacpp-timings"
61
+ }
62
+ }
63
+ }
64
+ ```
65
+
66
+ `expectedColdReasons` is stamped once per run, on its first persisted call, so a turn with several model calls carries it on the first one only. `clio-coder doctor` folds the latest session for you and prints the verdict counts plus the most frequent reason, and `clio-coder usage report` gives per-session uncached prefill and verdict counts across the window.
67
+
68
+ **4. When there is no reason, the warning is the finding.** A cold backend with a reused prompt shell and no recorded reason is a real disagreement: Clio kept the bytes stable and the server re-prefilled anyway. `/context` leaves the warning in place for exactly that case. Four causes are worth checking in order, and none of them is a Clio bug:
69
+
70
+ - **The server slept.** A llama.cpp router started with `--sleep-idle-seconds N` drops the slot's prefix cache when it sleeps, and `--cache-ram` does not reliably restore a large state. A gap longer than that setting between two turns explains a cold turn completely. Raise the flag, or accept that a session left idle pays for its first turn back.
71
+ - **Something else used the endpoint.** A worker, a second Clio session, or another client on the same server evicts the slot. Clio stamps `dispatch`, `residency`, and `background_memory` only for work it can attribute to itself on that endpoint; a foreign process leaves no stamp. `clio-coder targets --probe` reports the endpoint's slot count, and `/fleet` settings show active slots per endpoint.
72
+ - **The model was swapped.** A router serving one model at a time reloads on a residency change, and everything the previous model had cached is gone. This normally does stamp `residency`, but only when the mutation went through Clio.
73
+ - **The prompt moved for a reason Clio did not classify.** Compare the run's `promptHash` and `toolSignature` in `context-snapshots.jsonl` against the previous run's. Equal hashes with a cold backend point at the server; different hashes with no `prompt_recompiled` or `tool_surface_change` stamp is worth an issue.
74
+
75
+ One case is expected on hybrid architectures and looks like a bug. Qwen3.8 keeps recurrent state that llama.cpp cannot roll back to an arbitrary token, so a change anywhere inside a cached prefix re-prefills from the last context checkpoint rather than from the changed byte. A small edit to old history can therefore cost thousands of tokens of prefill with the prompt hash otherwise stable. The server's checkpoint count and its `--checkpoint-min-step` are the levers; see the `qwen3.8-27b` family's `serving` and `measuredUnder` notes in `src/domains/providers/models/local-models/clio-local-coding-targets.yaml` for the measured figures and the exact argv they were taken under.
76
+
77
+ ---
78
+
79
+ ## A TUI that stops answering the keyboard
80
+
81
+ When an interactive session stops responding to typing, the question worth
82
+ answering before anything else is which half of the input pipeline stopped: the
83
+ stdin reader that hands bytes to the application, or the renderer that turns
84
+ them into a frame on stdout. Clio keeps that evidence without being asked. Every
85
+ interactive process holds a bounded in-memory ring of the last 256 input-ingress
86
+ records and the last 256 committed frames, and writes it out when the process
87
+ receives `SIGTERM`, which is the signal a `kill` of the stuck pane sends.
88
+
89
+ The dump lands in the state directory `clio-coder paths` reports:
90
+
91
+ ```text
92
+ <stateDir>/input-wedge/<ISO timestamp>-<pid>.json
93
+ ```
94
+
95
+ The five newest dumps are kept and older ones are removed as new ones land.
96
+ Read `classification` first:
97
+
98
+ | `classification` | What it means |
99
+ | :--- | :--- |
100
+ | `input-not-committed` | Bytes reached the application and no frame carrying them ever reached stdout. The renderer is the stuck half. |
101
+ | `no-input-recorded` | Nothing was delivered at all. If the operator was typing, the stdin reader is the stuck half. |
102
+ | `input-committed` | Both halves were moving. Whatever the session was doing, it was not this pipeline. |
103
+
104
+ `msSinceLastInputIngress` and `msSinceLastCommittedFrame` say how long each half
105
+ had been quiet when the signal arrived, and the `inputIngress` and `frames`
106
+ arrays carry the records themselves. Frames are kept only when they reached
107
+ stdout, so an empty `frames` array is itself a finding.
108
+
109
+ For a full session trace rather than the tail, set `CLIO_CODER_RENDER_TRACE` to
110
+ a file path before starting the session. That writes every record, including
111
+ provider deltas and terminal writes, as JSONL. The ring is the always-on subset
112
+ of the same records, for the case where nobody armed the trace first.
113
+
114
+ ---
115
+
29
116
  ## Diagnostic Commands
30
117
 
31
118
  When encountering unexpected system behavior:
@@ -1,7 +1,7 @@
1
1
  # Clio TUI Design System
2
2
 
3
3
  > [!TIP]
4
- > **Interactive Spec Available:** An interactive color/glyph token laboratory and terminal transcript preview renderer is located at [docs/html/tui_design_blueprint.html](html/tui_design_blueprint.html) (Version: 0.3.8).
4
+ > **Interactive Spec Available:** An interactive color/glyph token laboratory and terminal transcript preview renderer is located at [docs/html/tui_design_blueprint.html](html/tui_design_blueprint.html) (Version: 0.4.0).
5
5
 
6
6
  This document is the reference specification for the Clio Coder TUI visual layout, styling, and behavior. It describes color semantics, the glyph vocabulary, structural recipes, and state choreography for all surfaces under [src/interactive/](../src/interactive/).
7
7
 
@@ -1,7 +1,7 @@
1
1
  # Worker Dispatch Mechanics
2
2
 
3
3
  > [!TIP]
4
- > **Interactive Spec Available:** An interactive NDJSON protocol timeline stream and heartbeat watchdog simulator is located at [docs/html/worker_dispatch_blueprint.html](html/worker_dispatch_blueprint.html) (Version: 0.3.8).
4
+ > **Interactive Spec Available:** An interactive NDJSON protocol timeline stream and heartbeat watchdog simulator is located at [docs/html/worker_dispatch_blueprint.html](html/worker_dispatch_blueprint.html) (Version: 0.4.0).
5
5
 
6
6
  This document describes the design and lifecycle of Clio Coder dispatched workers, focusing on the spawning sequence, execution isolation, the standard input/output NDJSON communication loop, and permission escalation routing.
7
7
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iowarp/clio-coder",
3
- "version": "0.3.8",
3
+ "version": "0.4.0",
4
4
  "description": "Coding agent for HPC and scientific-software developers, part of IOWarp's CLIO ecosystem of agentic science.",
5
5
  "keywords": [
6
6
  "ai",
@@ -92,11 +92,14 @@
92
92
  "//": "below here: a real model target, chosen with --target <id>; costs money and/or GPU time, never run in CI",
93
93
  "live:smoke": "node --import tsx benchmarks/internal/live-smoke.ts",
94
94
  "live:fleet-dispatch": "node --import tsx benchmarks/internal/live-fleet-dispatch.ts",
95
+ "live:release-residue": "node --import tsx tests/live/release-residue.ts",
95
96
  "live:tui": "node --import tsx benchmarks/internal/pty-drive.ts",
96
97
  "live:home": "node --import tsx benchmarks/internal/live-home.ts"
97
98
  },
99
+ "optionalDependencies": {
100
+ "@anthropic-ai/claude-agent-sdk": "0.3.186"
101
+ },
98
102
  "dependencies": {
99
- "@anthropic-ai/claude-agent-sdk": "0.3.186",
100
103
  "@earendil-works/pi-agent-core": "0.84.0",
101
104
  "@earendil-works/pi-ai": "0.84.0",
102
105
  "@earendil-works/pi-tui": "0.84.0",
package/src/cli/acp.ts CHANGED
@@ -66,11 +66,15 @@ export async function runAcpCommand(
66
66
  args: ReadonlyArray<string>,
67
67
  options: { apiKey?: string; noContextFiles?: boolean; noSkills?: boolean; skillPaths?: ReadonlyArray<string> } = {},
68
68
  ): Promise<number> {
69
- if (args.includes("--help") || args.includes("-h")) {
69
+ // The top-level argv parser normally rewrites --acp to the `acp` command
70
+ // sentinel. Keep the command boundary tolerant too, so another dispatcher
71
+ // can pass the flag spelling through without changing ACP option semantics.
72
+ const normalizedArgs = args[0] === "--acp" ? args.slice(1) : args;
73
+ if (normalizedArgs.includes("--help") || normalizedArgs.includes("-h")) {
70
74
  process.stdout.write(HELP);
71
75
  return 0;
72
76
  }
73
- const flags = parseAcpFlags(args);
77
+ const flags = parseAcpFlags(normalizedArgs);
74
78
  if (typeof flags === "string") {
75
79
  printError(flags);
76
80
  process.stderr.write(HELP);
package/src/cli/agents.ts CHANGED
@@ -9,7 +9,7 @@ import { printError } from "./shared.js";
9
9
 
10
10
  const HELP = `clio-coder agents [--json] [--all]
11
11
 
12
- List user-facing agent specs from built-in, user, and project recipes.
12
+ List user-facing agent specs from built-in, extension, user, and project recipes.
13
13
 
14
14
  Flags:
15
15
  --json emit specs as JSON instead of the formatted table
package/src/cli/argv.ts CHANGED
@@ -70,6 +70,11 @@ export interface GlobalCliFlags {
70
70
  noContextFiles: boolean;
71
71
  noSkills: boolean;
72
72
  skillPaths: string[];
73
+ /**
74
+ * Panes activation from the command line. `--with-panes` and `--no-panes`
75
+ * both beat the `panes.enabled` setting; absent means the setting decides.
76
+ */
77
+ panes?: "with" | "without";
73
78
  rest: string[];
74
79
  error?: string;
75
80
  }
@@ -85,6 +90,8 @@ const GLOBAL_ONLY_FLAGS: ReadonlyMap<string, string> = new Map([
85
90
  ["--api-key", "--api-key <key>"],
86
91
  ["--no-context-files", "--no-context-files"],
87
92
  ["-nc", "-nc"],
93
+ ["--with-panes", "--with-panes"],
94
+ ["--no-panes", "--no-panes"],
88
95
  ]);
89
96
 
90
97
  /**
@@ -128,6 +135,7 @@ export function extractGlobalFlags(
128
135
  let apiKey: string | undefined;
129
136
  let noContextFiles = false;
130
137
  let noSkills = false;
138
+ let panes: "with" | "without" | undefined;
131
139
  const skillPaths: string[] = [];
132
140
  for (let i = 0; i < argv.length; i++) {
133
141
  const arg = argv[i];
@@ -140,6 +148,14 @@ export function extractGlobalFlags(
140
148
  rest.push(...argv.slice(i));
141
149
  break;
142
150
  }
151
+ if (arg === "--acp") {
152
+ // Treat the global spelling as a command boundary. Rewriting only the
153
+ // sentinel keeps every trailing ACP option on the exact same dispatcher
154
+ // and parser path as `clio-coder acp`, without importing that command into
155
+ // the dependency-light startup graph.
156
+ rest.push("acp", ...argv.slice(i + 1));
157
+ break;
158
+ }
143
159
  if (ROOT_FLAG_TOKENS.has(arg)) {
144
160
  rest.push(arg);
145
161
  continue;
@@ -152,6 +168,12 @@ export function extractGlobalFlags(
152
168
  noSkills = true;
153
169
  continue;
154
170
  }
171
+ if (arg === "--with-panes" || arg === "--no-panes") {
172
+ // Last occurrence wins, so a wrapper script's baked-in choice can be
173
+ // overridden by appending the opposite flag.
174
+ panes = arg === "--with-panes" ? "with" : "without";
175
+ continue;
176
+ }
155
177
  if (arg === "--api-key" || arg === "--skill") {
156
178
  const value = argv[i + 1];
157
179
  if (value === undefined || value.startsWith("-") || isSubcommand(value)) {
@@ -162,6 +184,7 @@ export function extractGlobalFlags(
162
184
  rest,
163
185
  error: `${arg} requires a value`,
164
186
  ...(apiKey === undefined ? {} : { apiKey }),
187
+ ...(panes === undefined ? {} : { panes }),
165
188
  };
166
189
  }
167
190
  if (arg === "--api-key") apiKey = value;
@@ -176,6 +199,7 @@ export function extractGlobalFlags(
176
199
  rest,
177
200
  error: unknownGlobalOptionError(arg),
178
201
  ...(apiKey === undefined ? {} : { apiKey }),
202
+ ...(panes === undefined ? {} : { panes }),
179
203
  };
180
204
  }
181
205
  return {
@@ -184,5 +208,6 @@ export function extractGlobalFlags(
184
208
  skillPaths,
185
209
  rest,
186
210
  ...(apiKey === undefined ? {} : { apiKey }),
211
+ ...(panes === undefined ? {} : { panes }),
187
212
  };
188
213
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The effective-customization graph behind `clio-coder config inspect`. This is the
3
3
  * "why is Clio behaving this way" surface: it answers what settings, context
4
- * files, rules, skills, prompts, agents, extensions, safety, memory, hooks, and
4
+ * files, rules, skills, prompts, agents, fleets, extensions, safety, memory, hooks, and
5
5
  * the operator profile loaded, from where, with what precedence, and what each
6
6
  * costs in context.
7
7
  *
@@ -12,8 +12,9 @@
12
12
  */
13
13
 
14
14
  import { existsSync, readFileSync } from "node:fs";
15
- import { basename } from "node:path";
15
+ import { basename, join } from "node:path";
16
16
  import type { ClioSettings } from "../core/config.js";
17
+ import { resolvePackageRoot } from "../core/package-root.js";
17
18
  import { readLayeredSettings, type SettingsOrigin, settingsSourceFor } from "../core/settings-layers.js";
18
19
  import { clioDataDir } from "../core/xdg.js";
19
20
  import {
@@ -39,7 +40,8 @@ export type CustomizationCategory =
39
40
  | "extension"
40
41
  | "skill-root"
41
42
  | "prompt-root"
42
- | "agents"
43
+ | "agent-root"
44
+ | "fleet-root"
43
45
  | "safety"
44
46
  | "memory";
45
47
 
@@ -265,18 +267,43 @@ function inspectResourceRoots(cwd: string, graph: CustomizationGraph): void {
265
267
  for (const [kind, category] of [
266
268
  ["skills", "skill-root"],
267
269
  ["prompts", "prompt-root"],
270
+ ["agents", "agent-root"],
271
+ ["fleets", "fleet-root"],
268
272
  ] as const) {
269
273
  try {
274
+ if (kind === "agents" || kind === "fleets") {
275
+ const builtinPath = join(
276
+ resolvePackageRoot(),
277
+ "src",
278
+ "domains",
279
+ "agents",
280
+ kind === "agents" ? "builtins" : "fleets",
281
+ );
282
+ graph.entries.push({
283
+ category,
284
+ id: `${kind}:builtin`,
285
+ scope: "builtin",
286
+ sourcePath: builtinPath,
287
+ trust: "trusted",
288
+ precedence: "layer",
289
+ reloadClass: "next-turn",
290
+ detail: { present: existsSync(builtinPath), source: "builtin", resourcePrecedence: 0 },
291
+ });
292
+ }
270
293
  for (const root of defaultScopedResourceRoots(kind, cwd)) {
271
294
  graph.entries.push({
272
295
  category,
273
296
  id: `${kind}:${root.scope}`,
274
- scope: root.scope,
297
+ scope: root.scope === "package" ? "extension" : root.scope,
275
298
  sourcePath: root.path,
276
299
  trust: root.scope === "package" ? "untrusted" : "trusted",
277
- precedence: "single",
300
+ precedence: "layer",
278
301
  reloadClass: "next-turn",
279
- detail: { present: existsSync(root.path), source: root.source },
302
+ detail: {
303
+ present: existsSync(root.path),
304
+ source: root.source,
305
+ ...(root.precedence === undefined ? {} : { resourcePrecedence: root.precedence }),
306
+ },
280
307
  });
281
308
  }
282
309
  } catch (err) {
package/src/cli/config.ts CHANGED
@@ -4,7 +4,7 @@ import { printError } from "./shared.js";
4
4
  const HELP = `clio-coder config inspect [--json]
5
5
 
6
6
  Print the effective-customization graph: what settings, context files, rules,
7
- skills, prompts, agents, extensions, safety, memory, hooks, and the operator
7
+ skills, prompts, agents, fleets, extensions, safety, memory, hooks, and the operator
8
8
  profile loaded, from where, with what precedence, trust, reload class, and
9
9
  context cost. Read-only; nothing is created.
10
10
 
@@ -19,6 +19,8 @@ import {
19
19
  listKnownModelsForRuntime,
20
20
  listProviderSupportEntries,
21
21
  type ProviderSupportEntry,
22
+ readTargetModelSnapshot,
23
+ recordTargetModelSnapshot,
22
24
  resolveRuntimeAuthTarget,
23
25
  supportGroupLabel,
24
26
  } from "../domains/providers/index.js";
@@ -103,6 +105,7 @@ const DEFAULT_PORTS: Record<string, number> = {
103
105
  lemonade: 8000,
104
106
  "anthropic-compat": 8000,
105
107
  "openai-compat": 8000,
108
+ litellm: 4000,
106
109
  };
107
110
 
108
111
  interface ParsedArgs {
@@ -317,7 +320,9 @@ function printRuntimeList(includeHidden: boolean): void {
317
320
  : runtime?.auth === "api-key"
318
321
  ? status?.available
319
322
  ? "credential"
320
- : "needs-key"
323
+ : targetRequiresAuth({ id: entry.runtimeId, runtime: entry.runtimeId }, runtime)
324
+ ? "needs-key"
325
+ : "key-optional"
321
326
  : (runtime?.auth ?? "none");
322
327
  rows.push({
323
328
  group: supportGroupLabel(entry.group),
@@ -387,8 +392,8 @@ function catalogContextWindowFor(runtime: RuntimeDescriptor, modelId: string): n
387
392
  /**
388
393
  * Check the resolved model against the catalog where there is one and against
389
394
  * the target's own list where there is not. A runtime with no catalog used to
390
- * pass any string here while the same command wrote the live list that ruled
391
- * it out into `wireModels`, so the target saved as `ok` and failed on its first
395
+ * pass any string here while the same command had a live list that ruled it
396
+ * out, so the target saved as `ok` and failed on its first
392
397
  * turn. Without a catalog or a live list there is nothing to check against, and
393
398
  * the note says so rather than implying the id was verified.
394
399
  */
@@ -617,7 +622,6 @@ function buildDescriptor(
617
622
  parts: {
618
623
  url?: string;
619
624
  model?: string;
620
- wireModels?: string[];
621
625
  apiKeyEnv?: string;
622
626
  apiKeyRef?: string;
623
627
  oauthProfile?: string;
@@ -631,19 +635,12 @@ function buildDescriptor(
631
635
  ): TargetDescriptor {
632
636
  const descriptor: TargetDescriptor = { id, runtime: runtime.id };
633
637
  if (parts.url) descriptor.url = parts.url;
634
- const wireModels =
635
- parts.wireModels?.filter((value, index, all) => value.trim().length > 0 && all.indexOf(value) === index) ?? [];
636
638
  if (parts.model) descriptor.defaultModel = parts.model;
637
- else {
638
- const firstWireModel = wireModels[0];
639
- if (firstWireModel) descriptor.defaultModel = firstWireModel;
640
- }
641
639
  const auth: NonNullable<TargetDescriptor["auth"]> = {};
642
640
  if (parts.apiKeyEnv) auth.apiKeyEnvVar = parts.apiKeyEnv;
643
641
  if (parts.apiKeyRef) auth.apiKeyRef = parts.apiKeyRef;
644
642
  if (parts.oauthProfile) auth.oauthProfile = parts.oauthProfile;
645
643
  if (Object.keys(auth).length > 0) descriptor.auth = auth;
646
- if (wireModels.length > 0) descriptor.wireModels = wireModels;
647
644
  if (parts.gateway) descriptor.gateway = true;
648
645
  if (parts.lifecycle) descriptor.lifecycle = parts.lifecycle;
649
646
  const caps: NonNullable<TargetDescriptor["capabilities"]> = {};
@@ -714,7 +711,7 @@ async function loginOAuthRuntime(rl: ReturnType<typeof createInterface>, runtime
714
711
  */
715
712
  interface WireModelInventory {
716
713
  models: string[];
717
- source: "catalog" | "probe" | "existing" | "none";
714
+ source: "catalog" | "probe" | "cache" | "legacy" | "none";
718
715
  /** Per-model load state when the probe reported it. */
719
716
  modelStates?: Readonly<Record<string, ProbeModelStatus>> | undefined;
720
717
  }
@@ -761,13 +758,21 @@ async function resolveSupportedWireModels(
761
758
  // lists models only through probeModels still gets its ids checked.
762
759
  const probe = await runtimeProbe(runtime, target, authToken);
763
760
  if (probe?.ok && probe.models && probe.models.length > 0) {
761
+ recordTargetModelSnapshot(target, probe.models);
764
762
  return { models: [...probe.models], source: "probe", modelStates: probe.modelStates };
765
763
  }
766
764
  const discovered = await runtimeProbeModels(runtime, target, authToken);
767
- if (discovered.length > 0) return { models: discovered, source: "probe" };
765
+ if (discovered.length > 0) {
766
+ recordTargetModelSnapshot(target, discovered);
767
+ return { models: discovered, source: "probe" };
768
+ }
769
+ }
770
+ const cached = readTargetModelSnapshot(target);
771
+ if (cached && cached.models.length > 0) return { models: [...cached.models], source: "cache" };
772
+ if (existing?.wireModels && existing.wireModels.length > 0) {
773
+ recordTargetModelSnapshot(target, existing.wireModels);
774
+ return { models: [...existing.wireModels], source: "legacy" };
768
775
  }
769
- if (existing?.wireModels && existing.wireModels.length > 0)
770
- return { models: [...existing.wireModels], source: "existing" };
771
776
  return { models: [], source: "none" };
772
777
  }
773
778
 
@@ -905,7 +910,6 @@ async function runNonInteractive(runtime: RuntimeDescriptor, args: ParsedArgs):
905
910
  const descriptor = buildDescriptor(runtime, args.id, {
906
911
  ...(url !== undefined ? { url } : {}),
907
912
  ...(model ? { model } : {}),
908
- ...(wireModels.length > 0 ? { wireModels } : {}),
909
913
  ...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),
910
914
  ...(apiKeyRef !== undefined ? { apiKeyRef } : {}),
911
915
  ...(oauthProfile !== undefined ? { oauthProfile } : {}),
@@ -966,6 +970,7 @@ async function runNonInteractive(runtime: RuntimeDescriptor, args: ParsedArgs):
966
970
  applyConfiguration(settings);
967
971
  updateSettings(applyConfiguration);
968
972
  const probe = await runtimeProbe(runtime, descriptor);
973
+ if (probe?.ok && probe.models) recordTargetModelSnapshot(descriptor, probe.models);
969
974
  printSummary(settings, descriptor, probe);
970
975
  if (
971
976
  runtime.auth === "oauth" &&
@@ -1272,10 +1277,7 @@ async function runInteractive(
1272
1277
  }
1273
1278
 
1274
1279
  let model: string | undefined = defaults.model;
1275
- let inventory: WireModelInventory =
1276
- existing?.wireModels && existing.wireModels.length > 0
1277
- ? { models: [...existing.wireModels], source: "existing" }
1278
- : { models: [], source: "none" };
1280
+ let inventory: WireModelInventory = { models: [], source: "none" };
1279
1281
  const tentative = buildDescriptor(runtime, targetId, {
1280
1282
  ...(url !== undefined ? { url } : {}),
1281
1283
  ...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),
@@ -1367,7 +1369,6 @@ async function runInteractive(
1367
1369
  ...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),
1368
1370
  ...(apiKeyRef !== undefined ? { apiKeyRef } : {}),
1369
1371
  ...(oauthProfile !== undefined ? { oauthProfile } : {}),
1370
- ...(wireModels.length > 0 ? { wireModels } : {}),
1371
1372
  gateway: gatewayAnswer,
1372
1373
  ...(defaults.lifecycle !== undefined
1373
1374
  ? { lifecycle: defaults.lifecycle }
@@ -1395,6 +1396,7 @@ async function runInteractive(
1395
1396
  }
1396
1397
 
1397
1398
  const probe = await runtimeProbe(runtime, descriptor);
1399
+ if (probe?.ok && probe.models) recordTargetModelSnapshot(descriptor, probe.models);
1398
1400
  if (probe) {
1399
1401
  process.stdout.write("\n");
1400
1402
  for (const line of probeLines(descriptor, probe)) process.stdout.write(`${line}\n`);
@@ -0,0 +1,124 @@
1
+ import { accessSync, constants, mkdirSync } from "node:fs";
2
+ import { readSettings } from "../core/config.js";
3
+ import { runEventJournalRoot } from "../domains/dispatch/run-event-journal.js";
4
+ import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
5
+ import { detectMux, MUX_METHOD_MIN_PROTOCOL, resolveSocketCandidates } from "../domains/mux/index.js";
6
+ import { describeResolution, findPinnedTool, toolStatus } from "../domains/toolchain/index.js";
7
+
8
+ /**
9
+ * The panes section of `clio-coder doctor`.
10
+ *
11
+ * Five rows, in the order an operator debugs them: what mode the pane layer
12
+ * resolved to, whether the socket answered, whether the server is new enough
13
+ * for the methods phase 3 uses, where the pane host binary resolves, and
14
+ * whether the journal directory the viewer reads is writable.
15
+ *
16
+ * No row is an error. Panes are optional: an operator who never wanted them has
17
+ * a healthy install without them, and doctor's exit code answers "is this
18
+ * install healthy". The rows that would be errors elsewhere are warnings that
19
+ * name the next step instead.
20
+ */
21
+
22
+ const PANE_HOST_TOOL_ID = "herdr";
23
+
24
+ /** Highest protocol any method Clio drives requires, for the version row. */
25
+ const REQUIRED_PROTOCOL = Math.max(...Object.values(MUX_METHOD_MIN_PROTOCOL));
26
+
27
+ function journalWritabilityFinding(root = runEventJournalRoot()): DoctorFinding {
28
+ try {
29
+ // The viewer reads this tree and the journal writes it, so the useful
30
+ // question is whether it can exist and be written, not whether it does.
31
+ mkdirSync(root, { recursive: true });
32
+ accessSync(root, constants.W_OK);
33
+ return { ok: true, name: "panes journal dir", detail: `${root} is writable` };
34
+ } catch (error) {
35
+ return {
36
+ ok: true,
37
+ level: "warn",
38
+ name: "panes journal dir",
39
+ detail: `${root} is not writable (${error instanceof Error ? error.message : String(error)}); \`clio-coder fleet view\` will have no transcript to follow`,
40
+ };
41
+ }
42
+ }
43
+
44
+ export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promise<DoctorFinding[]> {
45
+ let enabled: "auto" | "embedded" | "off" = "off";
46
+ try {
47
+ enabled = readSettings().panes.enabled;
48
+ } catch {
49
+ // An unreadable settings file is already reported by the settings row;
50
+ // this section answers on the shipped default (off) rather than throwing.
51
+ }
52
+
53
+ // Inactive by choice is a different answer from unavailable. With the
54
+ // setting off, detection is skipped the same way the boot skips it, and the
55
+ // row names the two ways to turn the extension on instead of warning about
56
+ // a socket nobody asked for.
57
+ if (enabled === "off") {
58
+ return [
59
+ {
60
+ ok: true,
61
+ name: "panes mode",
62
+ detail:
63
+ "off by choice (panes.enabled=off); start `clio-coder --with-panes` for one session, or set panes.enabled=auto",
64
+ },
65
+ journalWritabilityFinding(),
66
+ ];
67
+ }
68
+
69
+ // Detection is the same ladder the interactive boot runs, so this row is the
70
+ // answer that boot would get. It opens a socket and nothing else: no file is
71
+ // created and no pane is touched.
72
+ const { detection, client } = await detectMux({ enabled, env });
73
+ await client?.close().catch(() => undefined);
74
+
75
+ const candidates = detection.candidates.length > 0 ? detection.candidates : resolveSocketCandidates(env);
76
+ const findings: DoctorFinding[] = [
77
+ {
78
+ ok: true,
79
+ level: detection.mode === "none" ? "warn" : "ok",
80
+ name: "panes mode",
81
+ detail: `${detection.mode} (panes.enabled=${enabled}); ${detection.reason}`,
82
+ },
83
+ {
84
+ ok: true,
85
+ level: detection.socketPath === null ? "warn" : "ok",
86
+ name: "panes socket",
87
+ detail:
88
+ detection.socketPath === null
89
+ ? `no socket answered; tried ${candidates.length > 0 ? candidates.join(", ") : "no candidates"}`
90
+ : `${detection.socketPath} answered a ping`,
91
+ },
92
+ ];
93
+
94
+ const server = detection.server;
95
+ findings.push({
96
+ ok: true,
97
+ level: server === null || server.protocol < REQUIRED_PROTOCOL ? "warn" : "ok",
98
+ name: "panes protocol",
99
+ detail:
100
+ server === null
101
+ ? `unknown; Clio's optional methods need protocol ${REQUIRED_PROTOCOL} or newer`
102
+ : `server ${server.version}, protocol ${server.protocol}; Clio's optional methods need ${REQUIRED_PROTOCOL} (${server.protocol >= REQUIRED_PROTOCOL ? "satisfied" : "toasts and agent focus fall back"})`,
103
+ });
104
+
105
+ const entry = findPinnedTool(PANE_HOST_TOOL_ID);
106
+ findings.push(
107
+ entry === null
108
+ ? {
109
+ ok: true,
110
+ level: "warn",
111
+ name: "panes binary",
112
+ detail: `${PANE_HOST_TOOL_ID} is not in the pinned tool registry`,
113
+ }
114
+ : {
115
+ ok: true,
116
+ level: toolStatus(entry).resolution.source === "none" ? "warn" : "ok",
117
+ name: "panes binary",
118
+ detail: describeResolution(toolStatus(entry)),
119
+ },
120
+ );
121
+
122
+ findings.push(journalWritabilityFinding());
123
+ return findings;
124
+ }