@iowarp/clio-coder 0.4.1 → 0.4.3

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 (604) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/CONTRIBUTING.md +142 -52
  3. package/README.md +434 -473
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
  6. package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
  9. package/dist/builtins-IA7V7FUC.js +22 -0
  10. package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
  11. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  12. package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
  13. package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
  14. package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
  15. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  16. package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
  17. package/dist/chunk-3EBYEESD.js +314 -0
  18. package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
  19. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  20. package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
  21. package/dist/chunk-4UVU7BJ5.js +39 -0
  22. package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
  23. package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
  24. package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
  25. package/dist/chunk-5MEZN6CB.js +1334 -0
  26. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  27. package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
  28. package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
  29. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  30. package/dist/chunk-7DRAWPTZ.js +360 -0
  31. package/dist/chunk-7E7I3WLS.js +3762 -0
  32. package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
  33. package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
  34. package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
  35. package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
  36. package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
  37. package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
  38. package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
  39. package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
  40. package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
  41. package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
  42. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  43. package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
  44. package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
  45. package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
  46. package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
  47. package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
  48. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  49. package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
  50. package/dist/chunk-GYV6VZOC.js +26 -0
  51. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  52. package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
  53. package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
  54. package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
  55. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  56. package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
  57. package/dist/chunk-IJNZMHLA.js +101 -0
  58. package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
  59. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  60. package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
  61. package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
  62. package/dist/chunk-JEQ3XTHC.js +42 -0
  63. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  64. package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
  65. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  66. package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
  67. package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
  68. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  69. package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
  70. package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
  71. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  72. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  73. package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
  74. package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
  75. package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
  76. package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
  77. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  78. package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
  79. package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
  80. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  81. package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
  82. package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
  83. package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
  84. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  85. package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
  86. package/dist/chunk-R6Q67RJH.js +134 -0
  87. package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
  88. package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
  89. package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
  90. package/dist/chunk-SKHCAU7K.js +385 -0
  91. package/dist/chunk-SZAA6XDG.js +30 -0
  92. package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
  93. package/dist/chunk-UOIZ7DA4.js +41 -0
  94. package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
  95. package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
  96. package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
  97. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  98. package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
  99. package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
  100. package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
  101. package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
  102. package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
  103. package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
  104. package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
  105. package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
  106. package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
  107. package/dist/chunk-XRZT5WY5.js +47 -0
  108. package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
  109. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  110. package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
  111. package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
  112. package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
  113. package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
  114. package/dist/cli/index.js +41 -39
  115. package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
  116. package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
  117. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  118. package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
  119. package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
  120. package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
  121. package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
  122. package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
  123. package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
  126. package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
  127. package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
  128. package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
  129. package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
  130. package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
  131. package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
  132. package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
  133. package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
  134. package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
  135. package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
  136. package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
  137. package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
  138. package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
  139. package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
  140. package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
  141. package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
  142. package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
  143. package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
  144. package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
  145. package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
  146. package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
  147. package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
  148. package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
  149. package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
  150. package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
  151. package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
  152. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  153. package/dist/reset-EAJFFJVB.js +344 -0
  154. package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
  155. package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
  156. package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
  157. package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
  158. package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
  159. package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
  160. package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
  161. package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
  162. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  163. package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
  164. package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
  165. package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
  166. package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
  167. package/dist/uninstall-5PEVOE5B.js +408 -0
  168. package/dist/upgrade-M4WXY6KN.js +303 -0
  169. package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
  170. package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
  171. package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
  172. package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
  173. package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
  174. package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
  175. package/dist/worker/entry.js +90 -74
  176. package/docs/README.md +176 -81
  177. package/docs/{acp.md → architecture/acp.md} +36 -20
  178. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  179. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  180. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
  181. package/docs/architecture/artifact-versions.md +90 -0
  182. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  183. package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
  184. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  185. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  186. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  187. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  188. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  189. package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
  190. package/docs/{observability.md → architecture/observability.md} +38 -14
  191. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  192. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
  193. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
  194. package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
  195. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  196. package/docs/architecture/time-conventions.md +125 -0
  197. package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
  198. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  199. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  200. package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
  201. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
  202. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
  203. package/docs/guide/configuration-reference.md +1163 -0
  204. package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
  205. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
  206. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  207. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
  208. package/docs/{glossary.md → guide/glossary.md} +14 -11
  209. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
  210. package/docs/guide/panes-and-files.md +290 -0
  211. package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
  212. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  213. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
  214. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  215. package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
  216. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
  217. package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
  218. package/docs/process/development-pipeline.md +152 -0
  219. package/docs/process/documentation-coverage.md +100 -0
  220. package/docs/process/documentation-guide.md +187 -0
  221. package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
  222. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  223. package/docs/{evolution.md → process/evolution.md} +2 -2
  224. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
  225. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  226. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  227. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  228. package/evals/README.md +2 -2
  229. package/evals/behavioral-model.yaml +3 -2
  230. package/package.json +10 -8
  231. package/skills/README.md +52 -41
  232. package/skills/coding/ast-grep/SKILL.md +102 -31
  233. package/skills/coding/ast-grep/evals.md +26 -0
  234. package/skills/coding/coding-standards/SKILL.md +41 -6
  235. package/skills/coding/coding-standards/evals.md +23 -0
  236. package/skills/coding/prototype/SKILL.md +88 -29
  237. package/skills/coding/prototype/evals.md +19 -0
  238. package/skills/coding/tdd/SKILL.md +81 -54
  239. package/skills/coding/tdd/evals.md +20 -0
  240. package/skills/context/context-handoff/SKILL.md +44 -3
  241. package/skills/context/context-handoff/evals.md +44 -0
  242. package/skills/context/context-prime/SKILL.md +46 -16
  243. package/skills/context/context-prime/evals.md +45 -0
  244. package/skills/git/branch-closeout/SKILL.md +132 -0
  245. package/skills/git/branch-closeout/evals.md +133 -0
  246. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  247. package/skills/git/file-ticket/SKILL.md +78 -64
  248. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  249. package/skills/git/file-ticket/evals.md +31 -26
  250. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  251. package/skills/git/fix-issue/SKILL.md +88 -65
  252. package/skills/git/fix-issue/evals.md +35 -31
  253. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  254. package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
  255. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  256. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  257. package/skills/git/ship/SKILL.md +103 -67
  258. package/skills/git/ship/assets/pr-template.md +21 -0
  259. package/skills/git/ship/evals.md +44 -28
  260. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  261. package/skills/git/worktree-create/SKILL.md +80 -50
  262. package/skills/git/worktree-create/evals.md +40 -33
  263. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  264. package/skills/git/worktree-merge/SKILL.md +112 -65
  265. package/skills/git/worktree-merge/evals.md +42 -34
  266. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  267. package/skills/meta/clio-coder-dev/SKILL.md +9 -5
  268. package/skills/meta/clio-coder-dev/evals.md +3 -2
  269. package/skills/meta/clio-coder-test/SKILL.md +102 -95
  270. package/skills/meta/clio-coder-test/evals.md +9 -4
  271. package/skills/meta/clio-coder-test/references/harness.md +100 -124
  272. package/skills/meta/clio-coder-test/references/test-map.md +77 -50
  273. package/skills/meta/credentials/SKILL.md +2 -2
  274. package/skills/meta/find-skills/SKILL.md +2 -2
  275. package/skills/meta/herdr/SKILL.md +2 -2
  276. package/skills/meta/skill-craft/SKILL.md +22 -16
  277. package/skills/planning/archify/SKILL.md +196 -0
  278. package/skills/planning/archify/evals.md +65 -0
  279. package/skills/planning/architecture/SKILL.md +62 -13
  280. package/skills/planning/architecture/evals.md +65 -0
  281. package/skills/planning/backlog/SKILL.md +131 -15
  282. package/skills/planning/backlog/evals.md +142 -0
  283. package/skills/planning/prd/SKILL.md +47 -7
  284. package/skills/planning/prd/evals.md +54 -0
  285. package/skills/planning/product-intent/SKILL.md +58 -3
  286. package/skills/planning/product-intent/evals.md +70 -0
  287. package/skills/planning/tech-spec/SKILL.md +54 -3
  288. package/skills/planning/tech-spec/evals.md +73 -0
  289. package/skills/registry.yaml +70 -62
  290. package/skills/remote.yaml +13 -0
  291. package/skills/research/arxiv-literature/SKILL.md +77 -19
  292. package/skills/research/arxiv-literature/evals.md +50 -0
  293. package/skills/research/experiment-protocol/SKILL.md +21 -2
  294. package/skills/research/experiment-protocol/evals.md +23 -0
  295. package/skills/research/scientific-debugging/SKILL.md +24 -2
  296. package/skills/research/scientific-debugging/evals.md +18 -0
  297. package/skills/research/scientific-modernization/SKILL.md +27 -2
  298. package/skills/research/scientific-modernization/evals.md +27 -0
  299. package/skills/skill-marketplace.json +97 -62
  300. package/skills/workflow/cut-it/SKILL.md +66 -6
  301. package/skills/workflow/cut-it/evals.md +101 -0
  302. package/skills/workflow/design-council/SKILL.md +118 -28
  303. package/skills/workflow/design-council/evals.md +161 -0
  304. package/skills/workflow/grill-me/SKILL.md +87 -11
  305. package/skills/workflow/grill-me/evals.md +153 -0
  306. package/skills/workflow/workflow-distiller/SKILL.md +77 -18
  307. package/skills/workflow/workflow-distiller/evals.md +118 -0
  308. package/src/cli/args.ts +2 -2
  309. package/src/cli/bootstrap-generate.ts +1 -1
  310. package/src/cli/config-inspect.ts +65 -12
  311. package/src/cli/configure-interop.ts +105 -13
  312. package/src/cli/configure-oauth.ts +57 -0
  313. package/src/cli/configure-onboarding.ts +980 -0
  314. package/src/cli/configure-target.ts +594 -0
  315. package/src/cli/configure.ts +1082 -532
  316. package/src/cli/context-map.ts +114 -0
  317. package/src/cli/context.ts +4 -0
  318. package/src/cli/docs.ts +22 -14
  319. package/src/cli/doctor-naming.ts +5 -5
  320. package/src/cli/doctor-toolchain.ts +3 -3
  321. package/src/cli/eval.ts +1 -2
  322. package/src/cli/extensions.ts +2 -1
  323. package/src/cli/fleet.ts +1 -1
  324. package/src/cli/index.ts +3 -1
  325. package/src/cli/internal-dispatch.ts +3 -4
  326. package/src/cli/lifecycle-presenter.ts +436 -0
  327. package/src/cli/models.ts +10 -2
  328. package/src/cli/modes/print.ts +5 -1
  329. package/src/cli/panes.ts +19 -5
  330. package/src/cli/reset.ts +228 -106
  331. package/src/cli/run.ts +9 -4
  332. package/src/cli/select.ts +664 -0
  333. package/src/cli/share.ts +5 -1
  334. package/src/cli/skills-eval.ts +3 -3
  335. package/src/cli/skills.ts +9 -2
  336. package/src/cli/targets.ts +5 -6
  337. package/src/cli/trace.ts +55 -4
  338. package/src/cli/uninstall.ts +233 -165
  339. package/src/cli/upgrade.ts +204 -149
  340. package/src/cli/usage.ts +86 -27
  341. package/src/cli/validate-model.ts +3 -3
  342. package/src/cli/wiki-generate.ts +1 -1
  343. package/src/core/artifact-paths.ts +1 -1
  344. package/src/core/bash-exec.ts +131 -86
  345. package/src/core/bus-events.ts +51 -6
  346. package/src/core/config.ts +61 -1
  347. package/src/core/defaults.ts +7 -4
  348. package/src/core/dispatch-outcome.ts +16 -0
  349. package/src/core/external-diagnostic.ts +44 -0
  350. package/src/core/gateway-routing.ts +157 -0
  351. package/src/core/guardrails.ts +10 -49
  352. package/src/core/prompt-hint.ts +9 -0
  353. package/src/core/safe-exec.ts +17 -2
  354. package/src/core/skill-activation.ts +89 -2
  355. package/src/domains/agents/builtins/architect.md +2 -3
  356. package/src/domains/agents/builtins/coder.md +3 -2
  357. package/src/domains/agents/builtins/debugger.md +2 -2
  358. package/src/domains/agents/builtins/documenter.md +2 -2
  359. package/src/domains/agents/builtins/git-master.md +1 -1
  360. package/src/domains/agents/builtins/oracle.md +1 -1
  361. package/src/domains/agents/builtins/provenance.md +1 -1
  362. package/src/domains/agents/builtins/researcher.md +1 -1
  363. package/src/domains/agents/builtins/scout.md +1 -1
  364. package/src/domains/agents/builtins/tester.md +2 -2
  365. package/src/domains/agents/builtins/verifier.md +2 -2
  366. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  367. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  368. package/src/domains/agents/catalog.ts +13 -15
  369. package/src/domains/agents/contract.ts +2 -0
  370. package/src/domains/agents/extension.ts +23 -1
  371. package/src/domains/agents/result-contract.ts +70 -0
  372. package/src/domains/config/keybindings.ts +8 -0
  373. package/src/domains/context/extension.ts +0 -3
  374. package/src/domains/context/wiki/map-seed.ts +589 -0
  375. package/src/domains/context/wiki/plan.ts +2 -2
  376. package/src/domains/context/working-set/path-index.ts +1 -0
  377. package/src/domains/dispatch/admission.ts +29 -0
  378. package/src/domains/dispatch/agent-candidates.ts +10 -0
  379. package/src/domains/dispatch/budget-envelope.ts +86 -1
  380. package/src/domains/dispatch/capability-match.ts +11 -0
  381. package/src/domains/dispatch/capacity-lease.ts +17 -0
  382. package/src/domains/dispatch/contract.ts +11 -1
  383. package/src/domains/dispatch/extension.ts +237 -49
  384. package/src/domains/dispatch/host-verification.ts +435 -39
  385. package/src/domains/dispatch/intent-requirements.ts +10 -0
  386. package/src/domains/dispatch/intent.ts +18 -1
  387. package/src/domains/dispatch/path-scope.ts +235 -24
  388. package/src/domains/dispatch/run-event-journal.ts +4 -15
  389. package/src/domains/dispatch/state.ts +2 -3
  390. package/src/domains/dispatch/transport.ts +45 -21
  391. package/src/domains/dispatch/types.ts +58 -3
  392. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  393. package/src/domains/eval/artifacts/store.ts +5 -0
  394. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  395. package/src/domains/eval/metrics/token-stream.ts +201 -31
  396. package/src/domains/eval/metrics/tracked.ts +40 -4
  397. package/src/domains/eval/runners/clio-run.ts +5 -2
  398. package/src/domains/eval/schema/suite.ts +28 -0
  399. package/src/domains/eval/schema/verdict.ts +2 -2
  400. package/src/domains/eval/store.ts +8 -1
  401. package/src/domains/eval/suites/resolve.ts +13 -1
  402. package/src/domains/eval/suites/run.ts +24 -3
  403. package/src/domains/evidence/trust-status.ts +10 -1
  404. package/src/domains/extensions/contract.ts +15 -1
  405. package/src/domains/extensions/discovery.ts +238 -41
  406. package/src/domains/extensions/extension.ts +105 -6
  407. package/src/domains/extensions/index.ts +24 -0
  408. package/src/domains/extensions/integrity.ts +189 -0
  409. package/src/domains/extensions/manager.ts +17 -1
  410. package/src/domains/extensions/resource-path.ts +27 -0
  411. package/src/domains/extensions/resources.ts +18 -38
  412. package/src/domains/extensions/snapshot-store.ts +39 -0
  413. package/src/domains/extensions/snapshot.ts +180 -0
  414. package/src/domains/extensions/state.ts +385 -57
  415. package/src/domains/extensions/types.ts +118 -1
  416. package/src/domains/interop/registry.ts +6 -2
  417. package/src/domains/interop/types.ts +4 -0
  418. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  419. package/src/domains/lifecycle/migrations/index.ts +6 -0
  420. package/src/domains/lifecycle/naming-resources.ts +19 -4
  421. package/src/domains/lifecycle/naming-yazi.ts +10 -5
  422. package/src/domains/memory/task-memory-policy.ts +70 -26
  423. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  424. package/src/domains/middleware/contract.ts +26 -0
  425. package/src/domains/middleware/extension.ts +24 -24
  426. package/src/domains/middleware/hook-receipts.ts +27 -4
  427. package/src/domains/middleware/hooks-io.ts +65 -32
  428. package/src/domains/middleware/hooks.ts +64 -0
  429. package/src/domains/middleware/index.ts +28 -5
  430. package/src/domains/middleware/marketplace-offer.ts +3 -35
  431. package/src/domains/middleware/memory-intervention.ts +127 -32
  432. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  433. package/src/domains/middleware/registrations.ts +326 -0
  434. package/src/domains/middleware/runtime.ts +28 -0
  435. package/src/domains/middleware/skills-reminder.ts +31 -2
  436. package/src/domains/middleware/snapshot.ts +20 -7
  437. package/src/domains/mux/contract.ts +38 -0
  438. package/src/domains/mux/detect.ts +6 -13
  439. package/src/domains/mux/index.ts +1 -1
  440. package/src/domains/mux/operations.ts +44 -5
  441. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  442. package/src/domains/mux/yazi/session.ts +53 -4
  443. package/src/domains/mux/yazi/theme.ts +117 -17
  444. package/src/domains/observability/compaction-usage.ts +118 -0
  445. package/src/domains/observability/contract.ts +10 -11
  446. package/src/domains/observability/cost.ts +1 -1
  447. package/src/domains/observability/extension.ts +17 -4
  448. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  449. package/src/domains/observability/projection.ts +14 -90
  450. package/src/domains/observability/trace-store.ts +43 -7
  451. package/src/domains/prompts/compiler.ts +73 -53
  452. package/src/domains/prompts/contract.ts +15 -3
  453. package/src/domains/prompts/extension.ts +97 -9
  454. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
  455. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  456. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  457. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  458. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  459. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  460. package/src/domains/prompts/fragments/operating/skills.md +10 -24
  461. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  462. package/src/domains/providers/contract.ts +4 -1
  463. package/src/domains/providers/extension.ts +40 -9
  464. package/src/domains/providers/index.ts +1 -1
  465. package/src/domains/providers/model-capabilities.ts +9 -0
  466. package/src/domains/providers/model-discovery.ts +2 -0
  467. package/src/domains/providers/model-runtime-capabilities.ts +99 -25
  468. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
  469. package/src/domains/providers/runtime-resolution.ts +31 -0
  470. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  471. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  472. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  473. package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
  474. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  475. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  476. package/src/domains/providers/support.ts +11 -5
  477. package/src/domains/providers/target-model-cache.ts +25 -2
  478. package/src/domains/providers/types/capability-flags.ts +2 -0
  479. package/src/domains/providers/types/cost-provenance.ts +19 -0
  480. package/src/domains/providers/types/local-model-quirks.ts +85 -37
  481. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  482. package/src/domains/providers/types/target-descriptor.ts +19 -0
  483. package/src/domains/resources/index.ts +3 -0
  484. package/src/domains/resources/skills/install.ts +72 -7
  485. package/src/domains/resources/skills/loader.ts +23 -19
  486. package/src/domains/resources/skills/marketplace.ts +63 -11
  487. package/src/domains/safety/autonomy.ts +15 -0
  488. package/src/domains/safety/call-target.ts +1 -1
  489. package/src/domains/safety/index.ts +1 -0
  490. package/src/domains/safety/loop-detector.ts +7 -4
  491. package/src/domains/safety/path-policy.ts +1 -1
  492. package/src/domains/safety/policy-engine.ts +34 -11
  493. package/src/domains/safety/protected-artifacts.ts +191 -88
  494. package/src/domains/safety/run-effects.ts +2 -22
  495. package/src/domains/safety/skill-authority.ts +55 -0
  496. package/src/domains/session/compaction/compact.ts +72 -22
  497. package/src/domains/session/entries.ts +6 -0
  498. package/src/domains/session/task-board.ts +10 -9
  499. package/src/domains/session/usage.ts +3 -3
  500. package/src/domains/share/archive.ts +164 -7
  501. package/src/engine/acp/server.ts +62 -9
  502. package/src/engine/agent.ts +13 -3
  503. package/src/engine/ai.ts +26 -8
  504. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  505. package/src/engine/api-registry.ts +3 -0
  506. package/src/engine/apis/llamacpp-residency.ts +3 -4
  507. package/src/engine/apis/lmstudio.ts +3 -3
  508. package/src/engine/apis/ollama-native.ts +6 -6
  509. package/src/engine/apis/openai-completions.ts +145 -39
  510. package/src/engine/apis/output-budget.ts +8 -18
  511. package/src/engine/apis/residency.ts +8 -27
  512. package/src/engine/external-subprocess.ts +114 -6
  513. package/src/engine/gemma-channel-filter.ts +19 -0
  514. package/src/engine/loop-guard.ts +92 -12
  515. package/src/engine/worker-runtime.ts +40 -11
  516. package/src/engine/worker-tools.ts +3 -1
  517. package/src/entry/background-model-metadata.ts +18 -0
  518. package/src/entry/compaction-prompt.ts +57 -0
  519. package/src/entry/extension-hook-sources.ts +28 -0
  520. package/src/entry/extension-reload.ts +309 -0
  521. package/src/entry/orchestrator.ts +464 -251
  522. package/src/entry/task-memory-lifecycle.ts +35 -0
  523. package/src/interactive/application-controller.ts +2 -1
  524. package/src/interactive/bus-notices.ts +8 -1
  525. package/src/interactive/chat-loop-messages.ts +16 -17
  526. package/src/interactive/chat-loop.ts +75 -3
  527. package/src/interactive/chat-panel.ts +36 -13
  528. package/src/interactive/chat-renderer.ts +72 -7
  529. package/src/interactive/cost-overlay.ts +26 -2
  530. package/src/interactive/dispatch-board.ts +6 -11
  531. package/src/interactive/footer/widgets.ts +13 -0
  532. package/src/interactive/interactive-application.ts +39 -4
  533. package/src/interactive/interactive-input-runtime.ts +4 -0
  534. package/src/interactive/interactive-presentation.ts +2 -2
  535. package/src/interactive/interactive-slash-runtime.ts +4 -1
  536. package/src/interactive/overlays/extensions.ts +9 -1
  537. package/src/interactive/overlays/help-reference.ts +13 -0
  538. package/src/interactive/overlays/settings.ts +27 -16
  539. package/src/interactive/panes-runtime.ts +111 -35
  540. package/src/interactive/prompt-cache-identity.ts +88 -0
  541. package/src/interactive/renderers/worker-entry.ts +32 -0
  542. package/src/interactive/slash-commands.ts +153 -20
  543. package/src/interactive/stream-pacing-policy.ts +0 -23
  544. package/src/interactive/theme/labels.ts +19 -13
  545. package/src/interactive/turn-context.ts +39 -20
  546. package/src/interactive/turn-recovery.ts +8 -0
  547. package/src/interactive/turn-runtime.ts +27 -11
  548. package/src/interactive/turn-state.ts +7 -0
  549. package/src/interactive/worker-receipts.ts +1 -0
  550. package/src/interactive/worker-stream.ts +6 -1
  551. package/src/interactive/yazi-bridge.ts +60 -6
  552. package/src/tools/agent-tools.ts +30 -1
  553. package/src/tools/artifact.ts +2 -2
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/bootstrap.ts +4 -0
  557. package/src/tools/builtin-tool-catalog.ts +52 -22
  558. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  559. package/src/tools/codewiki/code-nav.ts +99 -13
  560. package/src/tools/context/docs-engine.ts +20 -7
  561. package/src/tools/context/index.ts +59 -21
  562. package/src/tools/core-bootstrap.ts +28 -6
  563. package/src/tools/credential-present.ts +1 -2
  564. package/src/tools/dispatch-arguments.ts +6 -1
  565. package/src/tools/dispatch-event-text.ts +10 -0
  566. package/src/tools/dispatch-plan.ts +49 -4
  567. package/src/tools/dispatch-run-events.ts +1 -1
  568. package/src/tools/dispatch-runner.ts +12 -0
  569. package/src/tools/dispatch-schema.ts +338 -0
  570. package/src/tools/dispatch-types.ts +3 -0
  571. package/src/tools/dispatch.ts +9 -254
  572. package/src/tools/ledger.ts +3 -5
  573. package/src/tools/monitor-surface.ts +5 -13
  574. package/src/tools/observation.ts +4 -5
  575. package/src/tools/panes-surface.ts +4 -11
  576. package/src/tools/panes.ts +4 -2
  577. package/src/tools/policy.ts +15 -2
  578. package/src/tools/read.ts +5 -6
  579. package/src/tools/registry.ts +41 -12
  580. package/src/tools/result-shaping.ts +18 -14
  581. package/src/tools/steer-surface.ts +1 -1
  582. package/src/tools/tasks.ts +1 -1
  583. package/src/tools/truncate.ts +6 -5
  584. package/src/tools/verify/surface.ts +6 -12
  585. package/src/tools/web-fetch-surface.ts +1 -3
  586. package/src/tools/worker-evidence.ts +3 -1
  587. package/src/worker/spec-contract.ts +4 -0
  588. package/dist/builtins-UJLMOVOV.js +0 -17
  589. package/dist/chunk-5QIAJV2D.js +0 -48
  590. package/dist/chunk-JZWT5J3Y.js +0 -814
  591. package/dist/chunk-K7VKOLQQ.js +0 -15
  592. package/dist/chunk-PMZCIOCJ.js +0 -25
  593. package/dist/chunk-SUW5DORT.js +0 -819
  594. package/dist/chunk-UOV2BYIW.js +0 -107
  595. package/dist/chunk-WR6U3OVP.js +0 -45
  596. package/dist/chunk-Y45G3AXC.js +0 -1558
  597. package/dist/reset-EOLM7GVE.js +0 -230
  598. package/dist/uninstall-N34PCTGJ.js +0 -331
  599. package/dist/upgrade-H7TOM7YL.js +0 -323
  600. package/docs/artifact-versions.md +0 -67
  601. package/docs/development-pipeline.md +0 -121
  602. package/docs/documentation-coverage.md +0 -46
  603. package/docs/documentation-guide.md +0 -167
  604. package/docs/time-conventions.md +0 -101
@@ -217,6 +217,14 @@ export function createTurnRecovery(deps: TurnRecoveryDeps): TurnRecovery {
217
217
  text: string,
218
218
  initialFailure: TerminalAssistantFailure,
219
219
  ): Promise<boolean> => {
220
+ // A LiteLLM model id can be a deliberate physical route. Retrying it in
221
+ // Clio obscures the failure, delays operator recovery, and can multiply
222
+ // attempts beneath a gateway. Preserve and emit the one terminal failure;
223
+ // the operator can choose another advertised route with /model.
224
+ if (agentRuntime.runtimeId === "litellm") {
225
+ ensureFailureVisibleAndPersisted(initialFailure);
226
+ return true;
227
+ }
220
228
  const settings = deps.retrySettings();
221
229
  if (!settings.enabled || settings.maxRetries <= 0) return false;
222
230
  if (initialFailure.stopReason === "aborted" || !isRetryableErrorMessage(initialFailure.errorMessage)) return false;
@@ -8,6 +8,7 @@
8
8
  import { performance } from "node:perf_hooks";
9
9
  import type { BackendCompletionTimings } from "../core/cache-telemetry.js";
10
10
  import type { ClioSettings } from "../core/config.js";
11
+ import { gatewayRoutingObservationFromRecord, gatewayRoutingObservationLabel } from "../core/gateway-routing.js";
11
12
  import { attributedModelId } from "../core/response-model-id.js";
12
13
  import type { MiddlewareToolChoiceControl } from "../domains/middleware/index.js";
13
14
  import type { ObservabilityContract } from "../domains/observability/contract.js";
@@ -130,6 +131,8 @@ export interface TurnRuntimeDeps {
130
131
  context: TurnContext;
131
132
  middleware: TurnMiddleware;
132
133
  retrySettings: () => RetrySettings;
134
+ /** Stable Clio session id forwarded only to gateway runtimes that understand it. */
135
+ sessionId?: () => string | undefined;
133
136
  emit: (event: AgentEvent | AssistantDeltaEvent) => void;
134
137
  emitNotice: (text: string) => void;
135
138
  /** Tool-call id to its `performance.now()` start mark; spans only, never an instant. */
@@ -447,6 +450,11 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
447
450
  cleanupSessionResources(state.runtime.agent.sessionId);
448
451
  }
449
452
  let getCurrentAgentSignal: () => AbortSignal | undefined = () => undefined;
453
+ const gatewaySessionId = target.runtime.id === "litellm" ? deps.sessionId?.() : undefined;
454
+ // message_start can follow response headers. Keep each invocation's
455
+ // monotonic anchor before that wait, including custom stream delegates.
456
+ let apiCallStartedAt: number | null = null;
457
+ let apiCallFirstDeltaAt: number | null = null;
450
458
  const handle = deps.createAgent({
451
459
  initialState: {
452
460
  systemPrompt: fallbackIdentityPrompt(),
@@ -456,6 +464,11 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
456
464
  messages: priorMessages,
457
465
  },
458
466
  maxRetryDelayMs: deps.retrySettings().maxDelayMs,
467
+ ...(gatewaySessionId ? { sessionId: gatewaySessionId } : {}),
468
+ onStreamInvocation: () => {
469
+ apiCallStartedAt = performance.now();
470
+ apiCallFirstDeltaAt = null;
471
+ },
459
472
  onPayload: async (payload, currentModel) => {
460
473
  const thinkingPatched = patchProviderThinkingPayload(payload, currentModel, state.currentThinkingLevel);
461
474
  const basePayload = thinkingPatched ?? payload;
@@ -575,10 +588,6 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
575
588
 
576
589
  let streamStartedAt: number | null = null;
577
590
  let firstAssistantDeltaAt: number | null = null;
578
- // Per-API-call timing (T3.2): one assistant message per provider call,
579
- // bounded by message_start/message_end; the first delta marks TTFT.
580
- let apiCallStartedAt: number | null = null;
581
- let apiCallFirstDeltaAt: number | null = null;
582
591
  // First call of the run is the one whose verdict says whether the
583
592
  // backend reused the session prefix; later calls in a tool loop are
584
593
  // trivially warm.
@@ -669,6 +678,15 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
669
678
  }
670
679
  let publicEvent = enrichedEvent;
671
680
  if (enrichedEvent.type === "message_end" && enrichedEvent.message?.role === "assistant") {
681
+ const gatewayRouting = gatewayRoutingObservationFromRecord(
682
+ enrichedEvent.message as unknown as Record<string, unknown>,
683
+ );
684
+ if (
685
+ gatewayRouting !== null &&
686
+ ((gatewayRouting.attemptedFallbacks ?? 0) > 0 || (gatewayRouting.attemptedRetries ?? 0) > 0)
687
+ ) {
688
+ deps.emitNotice(`[Clio Coder] ${gatewayRoutingObservationLabel(gatewayRouting)}`);
689
+ }
672
690
  const interruptedUsage = estimatedUsageForInterruptedTurn(enrichedEvent.message, context.promptSideTokens());
673
691
  if (interruptedUsage !== null) {
674
692
  // Persistence records the same estimate, but it does so after the
@@ -718,17 +736,15 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
718
736
  // mediator, a dropped frame) therefore stops suspending the watchdog
719
737
  // at the turn that issued it instead of for the rest of the run.
720
738
  if (publicEvent?.type === "turn_end") toolsInFlight = 0;
721
- if (publicEvent?.type === "message_start" && publicEvent.message?.role === "assistant") {
722
- apiCallStartedAt = eventClock;
723
- apiCallFirstDeltaAt = null;
724
- }
725
739
  if (publicEvent?.type === "message_update") {
726
740
  const assistantEvent = publicEvent.assistantMessageEvent as { type?: string; delta?: unknown };
727
741
  const hasDelta =
728
- assistantEvent.type === "text_delta" ||
729
- assistantEvent.type === "thinking_delta" ||
730
742
  assistantEvent.type === "toolcall_start" ||
731
- assistantEvent.type === "toolcall_delta";
743
+ ((assistantEvent.type === "text_delta" ||
744
+ assistantEvent.type === "thinking_delta" ||
745
+ assistantEvent.type === "toolcall_delta") &&
746
+ typeof assistantEvent.delta === "string" &&
747
+ assistantEvent.delta.length > 0);
732
748
  if (hasDelta && firstAssistantDeltaAt === null) firstAssistantDeltaAt = eventClock;
733
749
  if (hasDelta && apiCallFirstDeltaAt === null) apiCallFirstDeltaAt = eventClock;
734
750
  }
@@ -127,6 +127,12 @@ export interface ChatTurnState {
127
127
  /** A middleware request_continuation is waiting to resubmit after settle. */
128
128
  pendingRequestContinuation: boolean;
129
129
  currentPendingSkillPolicy: PendingSkillToolPolicy | undefined;
130
+ /**
131
+ * Tool surface an activated skill narrowed, held across the operator's
132
+ * later turns. Replaced when the operator activates a different skill,
133
+ * cleared by `/skill off`, gone with the session.
134
+ */
135
+ activeSkillSurface: PendingSkillToolPolicy | undefined;
130
136
  currentAskUserPolicy: AskUserToolPolicy | undefined;
131
137
  lastRunSnapshot: ChatLoopRunSnapshot | null;
132
138
  }
@@ -153,6 +159,7 @@ export function createTurnState(initialThinkingLevel: ThinkingLevel): ChatTurnSt
153
159
  stalledTurnNudgeSpent: false,
154
160
  pendingRequestContinuation: false,
155
161
  currentPendingSkillPolicy: undefined,
162
+ activeSkillSurface: undefined,
156
163
  currentAskUserPolicy: undefined,
157
164
  lastRunSnapshot: null,
158
165
  };
@@ -59,6 +59,7 @@ const PRESENTED_RESULT_CONTRACTS: ReadonlyArray<WorkerPresentedResultContract> =
59
59
  "debugger-report",
60
60
  "verifier-report",
61
61
  "research-report",
62
+ "world-knowledge-report",
62
63
  "scout-report",
63
64
  ];
64
65
 
@@ -62,7 +62,12 @@ export interface WorkerAttempt {
62
62
  export type WorkerResultContract = "pass" | "fail" | "not-reached" | "unmeasured";
63
63
 
64
64
  /** Result kinds whose parsed envelopes have a dedicated transcript presentation. */
65
- export type WorkerPresentedResultContract = "debugger-report" | "verifier-report" | "research-report" | "scout-report";
65
+ export type WorkerPresentedResultContract =
66
+ | "debugger-report"
67
+ | "verifier-report"
68
+ | "research-report"
69
+ | "world-knowledge-report"
70
+ | "scout-report";
66
71
 
67
72
  /**
68
73
  * Terminal facts a worker block reports. Sealed by the receipt when it can be
@@ -52,6 +52,10 @@ export type YaziBridgeOpenResult =
52
52
 
53
53
  export interface YaziBridge {
54
54
  open(options?: { once?: boolean }): Promise<YaziBridgeOpenResult>;
55
+ /** Close the files pane and hand focus back to the composer; false when nothing was open. */
56
+ close(): Promise<boolean>;
57
+ /** True while the pane host still reports the files pane. */
58
+ isOpen(): boolean;
55
59
  status(): Readonly<YaziBridgeStatus>;
56
60
  dispose(): void;
57
61
  }
@@ -312,9 +316,12 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
312
316
  }
313
317
  deps.setDraft(appendDraft(draft, batch.text));
314
318
  deps.requestRender();
319
+ // The pick is the end of the operator's trip into the files pane, so the
320
+ // keyboard comes back to the composer without a click.
321
+ void deps.mux?.focusSelf();
315
322
  deps.notice(
316
323
  "info",
317
- `${batch.inserted} ${batch.inserted === 1 ? "path" : "paths"} from the file pane added to the draft`,
324
+ `${batch.inserted} ${batch.inserted === 1 ? "path" : "paths"} from the files pane added to the draft`,
318
325
  );
319
326
  if (batch.plainPaths > 0) {
320
327
  deps.notice(
@@ -366,6 +373,8 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
366
373
  if (disposed || ownGeneration !== generation) return;
367
374
  paneCwd = choice.cwd;
368
375
  if (choice.paths.length > 0) insert(choice.paths, choice.cwd);
376
+ // A cancelled pick still ends the trip; the composer gets the keyboard back.
377
+ else void deps.mux?.focusSelf();
369
378
  },
370
379
  onStopped: () => {
371
380
  if (ownGeneration !== generation) return;
@@ -379,12 +388,16 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
379
388
  return { status: "unavailable", reason: "the file pane was closed while it was opening" };
380
389
  }
381
390
  active = result.session;
391
+ // An explicit open is a request to go and pick something, so the keyboard
392
+ // follows the pane. The dock tier itself never steals focus; this is the
393
+ // one caller entitled to ask.
394
+ await mux.focusPane(result.session.pane.paneId);
382
395
  if (mode === "companion") {
383
396
  livenessTimer = setTimeout(() => {
384
397
  if (disposed || ownGeneration !== generation || sawLine || active === null) return;
385
398
  const stale = active;
386
399
  active = null;
387
- deps.notice("warning", "the file-pane event stream did not start; reopening yazi in chooser mode");
400
+ deps.notice("warning", "the files pane did not report back in time; reopening it in pick mode");
388
401
  void stale.close().finally(() => {
389
402
  if (!disposed && ownGeneration === generation) void start("chooser", profileMode, dockShare);
390
403
  });
@@ -394,16 +407,49 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
394
407
  return { status: "opened", mode, paneId: result.session.pane.paneId, existing: false };
395
408
  };
396
409
 
410
+ /**
411
+ * The pane host is the authority on whether the pane exists. `active` lags
412
+ * it by one event at most, but a caller deciding between open and close
413
+ * must not be told a pane is open when herdr already reported it gone.
414
+ */
415
+ const liveSession = (): YaziSession | null => {
416
+ if (active === null) return null;
417
+ const mux = deps.mux;
418
+ if (mux?.available() && !mux.list().some((record) => record.ref.paneId === active?.pane.paneId)) {
419
+ active = null;
420
+ return null;
421
+ }
422
+ return active;
423
+ };
424
+
425
+ const closeActive = async (): Promise<boolean> => {
426
+ const session = liveSession();
427
+ if (session === null) return false;
428
+ generation += 1;
429
+ clearLiveness();
430
+ active = null;
431
+ await session.close();
432
+ // Closing the dock the operator was looking at would otherwise leave
433
+ // focus wherever herdr puts it after a close, which is not the composer.
434
+ await deps.mux?.focusSelf();
435
+ return true;
436
+ };
437
+
397
438
  return {
398
439
  async open(options = {}): Promise<YaziBridgeOpenResult> {
399
- if (disposed) return { status: "unavailable", reason: "the file-pane bridge is closed" };
440
+ if (disposed) return { status: "unavailable", reason: "the files pane bridge is closed" };
400
441
  const settings = deps.getSettings?.() ?? { mode: "companion", profile: "managed", followCwd: true };
401
- if (active) {
442
+ const existing = liveSession();
443
+ if (existing) {
402
444
  if (settings.followCwd) {
403
445
  const cwd = deps.getCwd();
404
- if (await active.pushCwd(cwd)) paneCwd = cwd;
446
+ if (await existing.pushCwd(cwd)) paneCwd = cwd;
405
447
  }
406
- return { status: "opened", mode: active.mode, paneId: active.pane.paneId, existing: true };
448
+ // Re-opening an open pane means "take me there": leave any zoom that
449
+ // hides it and put the keyboard in it.
450
+ await deps.mux?.unzoomSelf();
451
+ await deps.mux?.focusPane(existing.pane.paneId);
452
+ return { status: "opened", mode: existing.mode, paneId: existing.pane.paneId, existing: true };
407
453
  }
408
454
  const mode = options.once || settings.profile === "user" ? "chooser" : settings.mode;
409
455
  if (!deps.mux?.available()) {
@@ -426,8 +472,16 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
426
472
  }
427
473
  return result;
428
474
  }
475
+ await deps.mux.unzoomSelf();
429
476
  return await start(mode, settings.profile, settings.ratio);
430
477
  },
478
+ close(): Promise<boolean> {
479
+ if (disposed) return Promise.resolve(false);
480
+ return closeActive();
481
+ },
482
+ isOpen(): boolean {
483
+ return liveSession() !== null;
484
+ },
431
485
  status(): Readonly<YaziBridgeStatus> {
432
486
  const snapshot = active?.snapshot();
433
487
  return {
@@ -296,6 +296,35 @@ function errorMessage(err: unknown): string {
296
296
  return err instanceof Error ? err.message : String(err);
297
297
  }
298
298
 
299
+ /**
300
+ * The parameter schema as the provider should see it.
301
+ *
302
+ * TypeBox 1.x annotates every schema it builds with string-keyed markers
303
+ * (`~unsafe` on `Type.Unsafe`, `~optional` on `Type.Optional`, and so on).
304
+ * Unlike the older symbol keys they survive `JSON.stringify`, so each enum
305
+ * field reached the model as `{"~unsafe": null, "~optional": true, ...}`:
306
+ * 44 junk keys on the default surface, and a small model has no way to know
307
+ * that `"~unsafe": null` means nothing. Validation does not need them
308
+ * (`Value.Check` answers identically with and without), so the copy handed
309
+ * to the agent loop drops every `~`-prefixed key. Symbol keys are copied
310
+ * through untouched because pi-ai picks its coercion path by the TypeBox
311
+ * kind symbol on the root schema.
312
+ */
313
+ function wireParameterSchema<T>(schema: T): T {
314
+ if (Array.isArray(schema)) return schema.map((entry) => wireParameterSchema(entry)) as T;
315
+ if (typeof schema !== "object" || schema === null) return schema;
316
+ const source = schema as Record<PropertyKey, unknown>;
317
+ const out: Record<PropertyKey, unknown> = {};
318
+ for (const key of Object.keys(source)) {
319
+ if (key.startsWith("~")) continue;
320
+ out[key] = wireParameterSchema(source[key]);
321
+ }
322
+ for (const symbol of Object.getOwnPropertySymbols(source)) {
323
+ out[symbol] = source[symbol];
324
+ }
325
+ return out as T;
326
+ }
327
+
299
328
  function toAgentTool(
300
329
  spec: ToolSpec,
301
330
  registry: ToolRegistry,
@@ -305,7 +334,7 @@ function toAgentTool(
305
334
  const tool: AgentTool<TSchema> = {
306
335
  name: spec.name,
307
336
  description: spec.description,
308
- parameters: spec.parameters,
337
+ parameters: wireParameterSchema(spec.parameters),
309
338
  label: spec.metadata?.uiLabel ?? spec.name,
310
339
  async execute(
311
340
  toolCallId: string,
@@ -20,7 +20,7 @@ import type { ToolResult, ToolSpec } from "./registry.js";
20
20
  * tree holds files a human asked for, and everything Clio generates on its own
21
21
  * belongs in the gitignored project directory. An explicit `path` still writes
22
22
  * wherever the caller says, inside the workspace. See core/artifact-paths.ts
23
- * and docs/artifact-placement.md.
23
+ * and docs/architecture/artifact-placement.md.
24
24
  *
25
25
  * Skills are not artifacts: a skill is a SKILL.md folder written with the
26
26
  * ordinary write tool and validated by the skills loader on load. The
@@ -83,7 +83,7 @@ async function writeTerminalArtifact(
83
83
  export function createArtifactTool(deps: ArtifactToolDeps = {}): ToolSpec {
84
84
  return {
85
85
  name: ToolNames.Artifact,
86
- description: `Write a named artifact: kind=plan|review|report writes a terminal Markdown document and completes the turn. Without an explicit path it lands in ${CLIO_ARTIFACT_DIR}/ (PLAN.md, REVIEW.md, REPORT.md); pass path only when the user asked for a file at a specific place.`,
86
+ description: `Write a named artifact: kind=plan|review|report writes a terminal Markdown document and completes the turn, so close the task board (tasks done/block/drop) before writing it. Without an explicit path it lands in ${CLIO_ARTIFACT_DIR}/ (PLAN.md, REVIEW.md, REPORT.md); pass path only when the user asked for a file at a specific place.`,
87
87
  parameters: Type.Object({
88
88
  kind: StringEnum(ARTIFACT_KINDS, { description: "Artifact kind." }),
89
89
  content: Type.String({ description: "Full Markdown body." }),
@@ -92,13 +92,13 @@ export interface AskUserToolDeps {
92
92
  export const askUserParameters = Type.Object({
93
93
  action: Type.Optional(
94
94
  StringEnum(["ask", "complete"], {
95
- description: "ask presents a round of questions; complete (exactly once) records decisions before final prose.",
95
+ description: "ask presents a round of questions; complete records the decisions, once, before final prose.",
96
96
  }),
97
97
  ),
98
98
  mode: Type.Optional(
99
99
  StringEnum(["round", "single_question"], {
100
100
  description:
101
- "Caps how many questions this call may carry. single_question accepts exactly 1 and rejects the call otherwise (interviews); round accepts 1 to 4 tightly related confirmations. Default is round.",
101
+ "round (default) accepts 1 to 4 tightly related questions; single_question accepts exactly one, for interviews.",
102
102
  }),
103
103
  ),
104
104
  questions: Type.Optional(
@@ -135,7 +135,7 @@ export const askUserParameters = Type.Object({
135
135
  exposure: Type.Optional(
136
136
  StringEnum(["local", "outward"], {
137
137
  description:
138
- "Blast radius of this gate. local (default) stays inside the workspace. outward means answering it publishes or sends something the operator cannot take back (filing an issue or PR, posting a comment, pushing, releasing); at autonomy auto-edit an outward gate parks for the operator instead of being answered automatically.",
138
+ "local (default) stays inside the workspace; outward publishes or sends something the operator cannot take back (issue, PR, comment, push, release) and parks for the operator at auto-edit.",
139
139
  }),
140
140
  ),
141
141
  });
package/src/tools/bash.ts CHANGED
@@ -163,7 +163,7 @@ export const bashTool: ToolSpec = {
163
163
  cwd: Type.Optional(
164
164
  Type.String({
165
165
  description:
166
- "Omit this. The command already runs at the session workspace root. Set it only to run in a subdirectory of that root, as a relative path; an absolute path outside the root is blocked.",
166
+ "Omit unless the command must run in a subdirectory of the workspace root, given as a relative path; outside the root is blocked.",
167
167
  }),
168
168
  ),
169
169
  timeout_ms: Type.Optional(Type.Number({ description: "Timeout in milliseconds." })),
@@ -10,6 +10,7 @@ import type { CompeteMuxWorktrees } from "./compete-worktrees.js";
10
10
  import { assertRegisteredBuiltinTools, type CoreToolBootstrapDeps, registerCoreTools } from "./core-bootstrap.js";
11
11
  import { createDispatchRunEventRegistry, createDispatchTool } from "./dispatch.js";
12
12
  import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
13
+ import type { DispatchSchemaComposition } from "./dispatch-schema.js";
13
14
  import { lazyTool } from "./lazy-tool.js";
14
15
  import { monitorToolSurface } from "./monitor-surface.js";
15
16
  import { panesToolSurface } from "./panes-surface.js";
@@ -27,6 +28,8 @@ export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
27
28
  getAutonomy?: () => AutonomyLevel;
28
29
  getCostCeilingUsd?: () => number;
29
30
  getWorkerRosters?: () => WorkerRosters;
31
+ /** Which optional `dispatch` schema blocks this session advertises; absent means every block. */
32
+ getDispatchSchemaComposition?: () => DispatchSchemaComposition;
30
33
  dispatchBackground?: DispatchBackgroundRegistry;
31
34
  /** Optional herdr worktree lifecycle for compete candidates. */
32
35
  competeMuxWorktrees?: CompeteMuxWorktrees;
@@ -61,6 +64,7 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
61
64
  ...(deps.getAutonomy ? { getAutonomy: deps.getAutonomy } : {}),
62
65
  ...(deps.getCostCeilingUsd ? { getCostCeilingUsd: deps.getCostCeilingUsd } : {}),
63
66
  ...(deps.getWorkerRosters ? { getWorkerRosters: deps.getWorkerRosters } : {}),
67
+ ...(deps.getDispatchSchemaComposition ? { getSchemaComposition: deps.getDispatchSchemaComposition } : {}),
64
68
  ...(deps.dispatchBackground ? { background: deps.dispatchBackground } : {}),
65
69
  ...(deps.competeMuxWorktrees ? { competeWorktrees: { mux: deps.competeMuxWorktrees } } : {}),
66
70
  };
@@ -4,7 +4,13 @@ import { BASH_DEFAULT_RESULT_DISPOSITION } from "./bash.js";
4
4
  import { OBSERVATION_POLICY_SLACK_BYTES, OBSERVE_SELF_CAPS } from "./observation.js";
5
5
  import { toolPresentationPolicy } from "./presentation.js";
6
6
  import { readMaxBytes } from "./read.js";
7
- import type { ToolMetadata, ToolSourceInfo, ToolSpec } from "./registry.js";
7
+ import {
8
+ resolveToolPromptHint,
9
+ type ToolMetadata,
10
+ type ToolPromptHintRole,
11
+ type ToolSourceInfo,
12
+ type ToolSpec,
13
+ } from "./registry.js";
8
14
 
9
15
  function withSourceInfo<T extends ToolSpec>(spec: T, sourceInfo: ToolSourceInfo): T {
10
16
  return { ...spec, sourceInfo };
@@ -83,7 +89,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
83
89
  resultSizePolicy: observePolicy(OBSERVE_SELF_CAPS.codeNav, "Raise limit or use a narrower mode/query."),
84
90
  costLatency: "local_fast",
85
91
  promptHint:
86
- "Use code_nav for indexed code navigation (modes: symbol, path, entries, outline, deps, dependents, wiki).",
92
+ "Use code_nav with source=workspace (default) for project code and source=clio for Clio's shipped code map; modes: symbol, path, entries, outline, deps, dependents, wiki (workspace only).",
87
93
  },
88
94
  [ToolNames.Context]: {
89
95
  objective: "Return workspace, bundled-docs, or skill context.",
@@ -94,8 +100,14 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
94
100
  "Use a narrower query or scope to inspect omitted content.",
95
101
  ),
96
102
  costLatency: "local_fast",
97
- promptHint:
98
- 'Call context with scope="skills" to list installed and marketplace skills; when one matches the task, or the operator names a skill or asks how one works, suggest the operator run /skill <name> (a marketplace skill is offered for install) and never load it uninvited; a [Marketplace] reminder naming an uninstalled skill may instead be offered through ask_user with its exact options, and the harness performs any install. When the user message carries a skill request, first load that skill via context (scope="skills", name=<skill>) before doing anything else. When an [evicted ...] marker names content you need, recall it with context(scope="recall", ref=...); re-read the file only when the marker says it changed.',
103
+ promptHint: {
104
+ session:
105
+ 'On an explicit pending skill request, first load exactly that skill with context(scope="skills", name=<skill>). Follow a [Marketplace] reminder\'s exact ask_user options. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
106
+ worker:
107
+ 'This worker has no operator skill-activation channel; do not load or suggest skills. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
108
+ boundWorker:
109
+ 'Load only the harness-activated recipe-bound skills named in the persona, and only when they match the assigned task. This worker cannot install or suggest marketplace skills. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
110
+ },
99
111
  },
100
112
  [ToolNames.CredentialPresent]: {
101
113
  objective: "Check whether a credential key is present without returning its value.",
@@ -135,7 +147,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
135
147
  resultDisposition: BASH_DEFAULT_RESULT_DISPOSITION,
136
148
  costLatency: "local_slow",
137
149
  promptHint:
138
- "Bash output_policy defaults to bounded diagnostic tail. Use summary for noisy commands, metadata-only when only outcome and retrieval matter, and full only when output is known to fit the bounded result budget.",
150
+ "bash output_policy: omit for a bounded tail; summary for noisy commands; metadata-only when only the outcome matters; full only when the output is known to fit.",
139
151
  },
140
152
  [ToolNames.Git]: {
141
153
  objective: "Read-only git inspection: status, diff, or log.",
@@ -167,9 +179,8 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
167
179
  },
168
180
  costLatency: "local_fast",
169
181
  promptHint:
170
- 'When a request contains three or more distinct steps, declare the board before your first edit: tasks action="plan" with a title and the task list. ' +
171
- 'Mark one task active with "start" before working it, close it with "done" plus an evidence note ' +
172
- '(what proves it works), and use "block" with a reason instead of silently stalling.',
182
+ 'For a request with three or more distinct steps, declare the board before the first edit: tasks(action="plan") with a title and the task list. ' +
183
+ "start one task before working it, close it with done plus an evidence note, and block with a reason instead of stalling.",
173
184
  },
174
185
  [ToolNames.Ledger]: {
175
186
  objective: "Coordinate with the peer workers of this dispatch through typed claims, findings, and reviews.",
@@ -191,9 +202,10 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
191
202
  resultSizePolicy: summaryPolicy(
192
203
  "Use the dispatch receipt paths or ask a narrower worker follow-up for omitted output.",
193
204
  ),
205
+ // No hint: the Tool Contract's inventory line already says when
206
+ // dispatch(list:true) is the right answer, and the Fleet section says
207
+ // everything else about routing.
194
208
  costLatency: "agent",
195
- promptHint:
196
- "Call dispatch with list:true only when the operator asks about agents, workers, or the fleet; never use it to inventory direct tools.",
197
209
  },
198
210
  [ToolNames.Monitor]: {
199
211
  objective: "Inspect dispatched runs: state, recent events, receipts.",
@@ -226,7 +238,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
226
238
  },
227
239
  costLatency: "local_fast",
228
240
  promptHint:
229
- 'When the operator asks to see a dispatched agent ("show me the tester"), call panes with action="show" and the agent id. Utility panes are presets only; an arbitrary command is the operator\'s own /panes open.',
241
+ 'When the operator asks to see a dispatched agent ("show me the tester"), call panes(action="show", target=<agent id>).',
230
242
  },
231
243
  // RETRIEVE: network-class.
232
244
  [ToolNames.WebFetch]: {
@@ -252,7 +264,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
252
264
  },
253
265
  costLatency: "local_slow",
254
266
  promptHint:
255
- 'Use ask_user only when blocked on a decision the request does not answer; never ask about anything the operator already stated. One question per round in interview workflows, up to four tightly related questions otherwise, recommended option first. Finish with action="complete" and a compact decisions array before final prose. If cancelled, continue with defaults and do not ask again.',
267
+ 'Use ask_user only when blocked on a decision the request does not answer, never about something the operator already stated: one question per round in interviews, up to four related questions otherwise, recommended option first, then action="complete" with the decisions before final prose.',
256
268
  },
257
269
  // ARTIFACT: terminal writers.
258
270
  [ToolNames.Artifact]: {
@@ -264,15 +276,21 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
264
276
  },
265
277
  };
266
278
 
267
- /** Canonical, registry-owned prompt hints for an already-admitted tool set. */
268
- export function toolPromptHintsForNames(names: ReadonlyArray<ToolName>): ReadonlyArray<{ tool: string; hint: string }> {
269
- const seen = new Set<string>();
279
+ /** Canonical, role-aware prompt hints for an already-admitted tool set. */
280
+ export function toolPromptHintsForNames(
281
+ names: ReadonlyArray<ToolName>,
282
+ role: ToolPromptHintRole = "session",
283
+ ): ReadonlyArray<{ tool: string; hint: string }> {
284
+ const seenTools = new Set<string>();
285
+ const seenHints = new Set<string>();
270
286
  const hints: Array<{ tool: string; hint: string }> = [];
271
287
  for (const name of [...names].sort()) {
272
- if (seen.has(name)) continue;
273
- seen.add(name);
274
- const hint = TOOL_METADATA[name]?.promptHint?.trim();
275
- if (hint) hints.push({ tool: name, hint });
288
+ if (seenTools.has(name)) continue;
289
+ seenTools.add(name);
290
+ const hint = resolveToolPromptHint(TOOL_METADATA[name]?.promptHint, role);
291
+ if (!hint || seenHints.has(hint)) continue;
292
+ seenHints.add(hint);
293
+ hints.push({ tool: name, hint });
276
294
  }
277
295
  return hints;
278
296
  }
@@ -282,9 +300,21 @@ export function toolPromptHintsForNames(names: ReadonlyArray<ToolName>): Readonl
282
300
  // live panel (which has no registry) answer the fold question identically.
283
301
  function withBuiltinMetadata<T extends ToolSpec>(spec: T): T {
284
302
  const metadata = TOOL_METADATA[spec.name];
285
- return metadata
286
- ? withMetadata(spec, { ...metadata, presentation: toolPresentationPolicy(spec.name, undefined) })
287
- : spec;
303
+ if (!metadata) return spec;
304
+ // The read cap is a guardrail (`safety.limits.readBytesPerCall`) installed
305
+ // from settings after this module loads, so the table's import-time value
306
+ // is the default, not the operator's. Recompute the policy cap when the tool
307
+ // is registered; the drift check in policy.ts compares against the live cap
308
+ // and a settings file raising the read cap used to fail boot.
309
+ const resultSizePolicy =
310
+ spec.name === ToolNames.Read
311
+ ? observePolicy(readMaxBytes(), metadata.resultSizePolicy?.followUpHint ?? "")
312
+ : metadata.resultSizePolicy;
313
+ return withMetadata(spec, {
314
+ ...metadata,
315
+ ...(resultSizePolicy ? { resultSizePolicy } : {}),
316
+ presentation: toolPresentationPolicy(spec.name, undefined),
317
+ });
288
318
  }
289
319
 
290
320
  export function builtin<T extends ToolSpec>(spec: T, sourceInfo: ToolSourceInfo): T {
@@ -12,6 +12,12 @@ export const codeNavToolSurface = {
12
12
  description:
13
13
  "Navigate the indexed codewiki: mode=symbol finds files by symbol, path finds files by glob/regex/substring, entries lists likely entry points, outline lists file symbols, deps lists imports, and dependents lists importers. mode=wiki without query lists generated Markdown wiki pages; with query it resolves a page id/title and returns its summary plus a path to open with read. For Clio's bundled product docs use context scope=docs.",
14
14
  parameters: Type.Object({
15
+ source: Type.Optional(
16
+ StringEnum(["workspace", "clio"], {
17
+ description: "Code map source (default workspace).",
18
+ default: "workspace",
19
+ }),
20
+ ),
15
21
  mode: StringEnum(["symbol", "path", "entries", "outline", "deps", "dependents", "wiki"], {
16
22
  description: "Lookup mode.",
17
23
  }),