@iowarp/clio-coder 0.4.1 → 0.4.2

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 (437) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/CONTRIBUTING.md +59 -36
  3. package/README.md +404 -472
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-ZILU3AUO.js → acp-TMDQZDIG.js} +7 -7
  6. package/dist/{agents-HYWGBGQR.js → agents-5N5NG3XG.js} +28 -28
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-N3QT7CBO.js → auth-Z5CCBXKQ.js} +8 -9
  9. package/dist/{builtins-UJLMOVOV.js → builtins-K6TNDT24.js} +4 -4
  10. package/dist/{chunk-GVQJ5CCZ.js → chunk-2HFQNRV3.js} +7 -7
  11. package/dist/{chunk-QMXC4JB7.js → chunk-2NHR3NAY.js} +163 -1401
  12. package/dist/chunk-2X4RYJTJ.js +39 -0
  13. package/dist/{chunk-Y45G3AXC.js → chunk-2Z2IKEXI.js} +6 -10
  14. package/dist/{chunk-EIMVLWB3.js → chunk-34BHNEE3.js} +7 -3
  15. package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
  16. package/dist/chunk-3EBYEESD.js +314 -0
  17. package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
  18. package/dist/{chunk-AP73CFDC.js → chunk-3KIPBMUA.js} +2 -2
  19. package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
  20. package/dist/{chunk-VEGN6WIQ.js → chunk-462T4EGZ.js} +2 -2
  21. package/dist/{chunk-AFKWHWXF.js → chunk-4JDLP6ZS.js} +33 -16
  22. package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
  23. package/dist/{chunk-AKB4GYDL.js → chunk-54ODD65L.js} +5 -5
  24. package/dist/{chunk-BBTJOK6Y.js → chunk-5KW52TEP.js} +3 -3
  25. package/dist/{chunk-6CCS4G3W.js → chunk-5PFYMY2V.js} +2 -2
  26. package/dist/chunk-77QIVUZB.js +1334 -0
  27. package/dist/{chunk-7OBGU7UB.js → chunk-7BHIY2MW.js} +7 -13
  28. package/dist/{chunk-3QSOM6PA.js → chunk-AZ4WMN4W.js} +2 -2
  29. package/dist/{chunk-6NJQITNH.js → chunk-B74PXLU7.js} +6 -3
  30. package/dist/{chunk-R23Z6K6I.js → chunk-B7HM5Z7T.js} +15 -15
  31. package/dist/{chunk-R32CLGZ6.js → chunk-BO7Y52RY.js} +81 -20
  32. package/dist/{chunk-UEDMSP56.js → chunk-BYMNWQ7O.js} +123 -148
  33. package/dist/{chunk-ZJLUDYFY.js → chunk-CRFOIAX3.js} +4 -4
  34. package/dist/{chunk-2NM363SV.js → chunk-CYZW7JHJ.js} +7 -7
  35. package/dist/{chunk-6HMJX2VU.js → chunk-DYHAXKHD.js} +38 -10
  36. package/dist/{chunk-THYWACCR.js → chunk-DZAW46HP.js} +3 -3
  37. package/dist/{chunk-FYUN5KZ3.js → chunk-DZEK6CJN.js} +17 -17
  38. package/dist/{chunk-3I5NY75V.js → chunk-E7GT7O5N.js} +5 -5
  39. package/dist/{chunk-VKFQTNDV.js → chunk-F2I26BDK.js} +4 -4
  40. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  41. package/dist/{chunk-IXJT6DCX.js → chunk-FVDGR2ZL.js} +3 -3
  42. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  43. package/dist/{chunk-7EPLI7VL.js → chunk-HIICAHCJ.js} +2 -2
  44. package/dist/{chunk-E67WX76H.js → chunk-HKMD33FO.js} +29 -80
  45. package/dist/chunk-HLAFFSEK.js +360 -0
  46. package/dist/{chunk-UAPGZHYC.js → chunk-I64IFBLB.js} +9 -2
  47. package/dist/{chunk-XKA2ICR3.js → chunk-I66ZTYNP.js} +440 -175
  48. package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
  49. package/dist/{chunk-PVAMAVBB.js → chunk-IDNA72AH.js} +102 -2
  50. package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
  51. package/dist/{chunk-2VG7KLYV.js → chunk-IKSLQ4XV.js} +5460 -3241
  52. package/dist/{chunk-QKIFBZKT.js → chunk-IMXMHHMQ.js} +166 -25
  53. package/dist/{chunk-74YWRRU5.js → chunk-JBCS7CRR.js} +2 -2
  54. package/dist/{chunk-BDPT6GTK.js → chunk-JWJGP5DQ.js} +2 -2
  55. package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
  56. package/dist/chunk-KPXDY6QF.js +47 -0
  57. package/dist/{chunk-ABLSQ6JX.js → chunk-LJID3DYZ.js} +7 -1
  58. package/dist/{chunk-VKRH2TCS.js → chunk-M2DAX4F6.js} +2 -2
  59. package/dist/{chunk-6I5ILFOF.js → chunk-M2WXEHER.js} +2 -2
  60. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  61. package/dist/{chunk-N5UK64DP.js → chunk-MCMZMDAC.js} +2 -2
  62. package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
  63. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  64. package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
  65. package/dist/{chunk-HUAS7ITX.js → chunk-O3YUNJZ2.js} +13 -21
  66. package/dist/{chunk-MA3H6DM5.js → chunk-P75RZCJW.js} +25 -3
  67. package/dist/{chunk-IG7BCQBA.js → chunk-PGF63K6I.js} +2 -2
  68. package/dist/chunk-PJX3WQUQ.js +42 -0
  69. package/dist/{chunk-6DWBAZ5U.js → chunk-Q4XWMHX6.js} +4 -6
  70. package/dist/{chunk-OJTRZGR3.js → chunk-QQLGQY2A.js} +8 -8
  71. package/dist/{chunk-J4HBWF6Y.js → chunk-RLYRBIYQ.js} +115 -20
  72. package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
  73. package/dist/{chunk-C537JADH.js → chunk-SSEYRH53.js} +6 -7
  74. package/dist/chunk-SZAA6XDG.js +30 -0
  75. package/dist/{chunk-MOPSG2X7.js → chunk-TPEQIQIE.js} +6 -6
  76. package/dist/{chunk-JA5QWE4Z.js → chunk-UBRFI4HS.js} +1879 -1650
  77. package/dist/{chunk-BTGG6BG2.js → chunk-UH347SHR.js} +154 -15
  78. package/dist/{chunk-5YHDIDBP.js → chunk-UH632ZYL.js} +2 -2
  79. package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
  80. package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
  81. package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
  82. package/dist/{chunk-UXN6JT4W.js → chunk-W4YEMFBX.js} +2 -2
  83. package/dist/{chunk-TD3PGPQA.js → chunk-W6NIE6OW.js} +2 -2
  84. package/dist/{chunk-TVH4ONAM.js → chunk-X7IARSHT.js} +3 -3
  85. package/dist/{chunk-PJJ6MY27.js → chunk-XE3PCIXH.js} +3 -3
  86. package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
  87. package/dist/{chunk-SCYB3HA4.js → chunk-XOXV5GKE.js} +51 -16
  88. package/dist/{chunk-QTFGO774.js → chunk-XQRY4DTA.js} +24 -11
  89. package/dist/{chunk-BJGUKIG4.js → chunk-YJISEZKC.js} +2 -2
  90. package/dist/{chunk-GPPB3JBE.js → chunk-ZGNYYXQ6.js} +2 -2
  91. package/dist/{chunk-SINK3QR6.js → chunk-ZNT2M6TG.js} +7 -7
  92. package/dist/{chunk-7RY5VZPH.js → chunk-ZW4HH5JJ.js} +6 -6
  93. package/dist/cli/index.js +33 -32
  94. package/dist/{clio-IT3G3VQH.js → clio-7VB377CC.js} +7 -7
  95. package/dist/{code-nav-RK6S7F6E.js → code-nav-YVLCYA7V.js} +85 -17
  96. package/dist/{config-3QZRWZJF.js → config-4HVOS65E.js} +88 -43
  97. package/dist/{configure-FL7Y3KJF.js → configure-PIWO7B24.js} +10 -10
  98. package/dist/{context-5HE7ODYK.js → context-IYEHL3WQ.js} +33 -31
  99. package/dist/{context-XNHL75JV.js → context-KQYIWPWT.js} +47 -34
  100. package/dist/{context-KYQFRVDC.js → context-N6ZE3LGJ.js} +11 -11
  101. package/dist/{context-clear-N545L53A.js → context-clear-G4OGZJDS.js} +33 -31
  102. package/dist/{context-working-set-QHKXSV2F.js → context-working-set-BWLF6LJP.js} +7 -7
  103. package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-2QQAITS3.js} +38 -38
  104. package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
  105. package/dist/{doctor-ZGPEGHIP.js → doctor-LHBD36VU.js} +23 -22
  106. package/dist/{eval-GXLL44RD.js → eval-C45FYRJ6.js} +21 -20
  107. package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-6DEJPLBF.js} +2 -2
  108. package/dist/{evidence-HWLBRH3Q.js → evidence-6SHONYAF.js} +30 -28
  109. package/dist/{evolve-FTZBMNVW.js → evolve-KRKMV72X.js} +30 -28
  110. package/dist/{extensions-VHRBEID7.js → extensions-KPZ2UHBB.js} +5 -3
  111. package/dist/{fleet-CKZHJWZJ.js → fleet-IVTCKDHT.js} +62 -61
  112. package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-EDWL3IT7.js} +5 -5
  113. package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-YP3YEFGK.js} +4 -4
  114. package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-ZFWKHY2M.js} +16 -14
  115. package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-FVUNCBML.js} +31 -29
  116. package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-UN5XED4R.js} +2 -2
  117. package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-XOWC4HSX.js} +17 -15
  118. package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-UN3SODEL.js} +30 -28
  119. package/dist/{fleet-view-WAMJYNDT.js → fleet-view-TWHJKCN6.js} +31 -29
  120. package/dist/{init-5XQRBOFV.js → init-T2QORQ3Y.js} +50 -49
  121. package/dist/{interop-34TVO25M.js → interop-IN5I2A66.js} +5 -5
  122. package/dist/{library-3QY6KF57.js → library-LSCATDLZ.js} +15 -13
  123. package/dist/{memory-L4UTIIIW.js → memory-HYOKAGGJ.js} +31 -29
  124. package/dist/{models-ZVX3QOWE.js → models-2GPMFYCM.js} +22 -21
  125. package/dist/{monitor-CEKVSYTS.js → monitor-E4ASVUJH.js} +34 -32
  126. package/dist/{orchestrator-77BAP6BC.js → orchestrator-DDMPR3PY.js} +984 -583
  127. package/dist/{panes-7STHOAUJ.js → panes-E3RUXOW5.js} +4 -4
  128. package/dist/{panes-SHAUIRXY.js → panes-IXKLOKA2.js} +23 -8
  129. package/dist/{reset-EOLM7GVE.js → reset-OAQP3W4O.js} +4 -4
  130. package/dist/{resources-74GKTLSF.js → resources-OTRSN34L.js} +15 -13
  131. package/dist/{run-HBAUJNNZ.js → run-5DEYH5QK.js} +60 -59
  132. package/dist/{share-G3APVLVP.js → share-IHWTLO3M.js} +19 -15
  133. package/dist/{skills-35HHUKCR.js → skills-IYMXMKW4.js} +17 -15
  134. package/dist/{skills-eval-QN4HSHDC.js → skills-eval-DROHSJAR.js} +36 -36
  135. package/dist/{skills-inventory-J357J34F.js → skills-inventory-D7X4L4ZX.js} +15 -13
  136. package/dist/{slash-commands-JZZCQA32.js → slash-commands-QBM7UZ3B.js} +21 -18
  137. package/dist/{steer-XAVHJM22.js → steer-Z5DO23FJ.js} +2 -2
  138. package/dist/{targets-DSM6CY3M.js → targets-P2FUC4IL.js} +25 -28
  139. package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-YREJ3JX2.js} +5 -5
  140. package/dist/{tools-MKNWVPBH.js → tools-5B7RO6MV.js} +4 -4
  141. package/dist/{trace-ECQ7TIYZ.js → trace-YMGMUM6A.js} +55 -7
  142. package/dist/{upgrade-H7TOM7YL.js → upgrade-PXK3S2YM.js} +11 -9
  143. package/dist/{usage-X52N3IDJ.js → usage-ME5MPXGX.js} +36 -34
  144. package/dist/{verifiers-EJTVVSMA.js → verifiers-BVZ7IWOO.js} +5 -5
  145. package/dist/{verify-YJL6XET2.js → verify-5K7ZKQFC.js} +4 -4
  146. package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
  147. package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-F5W5QTYY.js} +48 -47
  148. package/dist/{with-panes-OBOBFIIR.js → with-panes-BYOJCLAM.js} +51 -255
  149. package/dist/worker/entry.js +45 -30
  150. package/docs/README.md +176 -81
  151. package/docs/{acp.md → architecture/acp.md} +36 -20
  152. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  153. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  154. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
  155. package/docs/architecture/artifact-versions.md +90 -0
  156. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  157. package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
  158. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  159. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  160. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  161. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  162. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  163. package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
  164. package/docs/{observability.md → architecture/observability.md} +26 -13
  165. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  166. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
  167. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
  168. package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
  169. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  170. package/docs/architecture/time-conventions.md +125 -0
  171. package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
  172. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  173. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  174. package/docs/{built-in-agents.md → guide/built-in-agents.md} +50 -34
  175. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +65 -60
  176. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +227 -289
  177. package/docs/guide/configuration-reference.md +1158 -0
  178. package/docs/{environment-variables.md → guide/environment-variables.md} +31 -28
  179. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
  180. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  181. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
  182. package/docs/{glossary.md → guide/glossary.md} +14 -11
  183. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +44 -13
  184. package/docs/guide/panes-and-files.md +290 -0
  185. package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
  186. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  187. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
  188. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  189. package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
  190. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
  191. package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
  192. package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
  193. package/docs/process/documentation-coverage.md +100 -0
  194. package/docs/process/documentation-guide.md +187 -0
  195. package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
  196. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  197. package/docs/{evolution.md → process/evolution.md} +2 -2
  198. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
  199. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  200. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  201. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  202. package/evals/README.md +2 -2
  203. package/package.json +9 -7
  204. package/skills/README.md +46 -37
  205. package/skills/coding/ast-grep/SKILL.md +2 -2
  206. package/skills/coding/coding-standards/SKILL.md +2 -2
  207. package/skills/coding/prototype/SKILL.md +2 -2
  208. package/skills/coding/tdd/SKILL.md +2 -2
  209. package/skills/context/context-handoff/SKILL.md +2 -2
  210. package/skills/context/context-prime/SKILL.md +2 -2
  211. package/skills/git/file-ticket/SKILL.md +2 -2
  212. package/skills/git/fix-issue/SKILL.md +3 -3
  213. package/skills/git/resolve-merge-conflicts/SKILL.md +2 -2
  214. package/skills/git/ship/SKILL.md +2 -2
  215. package/skills/git/worktree-create/SKILL.md +2 -2
  216. package/skills/git/worktree-merge/SKILL.md +2 -2
  217. package/skills/meta/clio-coder-dev/SKILL.md +9 -5
  218. package/skills/meta/clio-coder-dev/evals.md +3 -2
  219. package/skills/meta/clio-coder-test/SKILL.md +102 -95
  220. package/skills/meta/clio-coder-test/evals.md +9 -4
  221. package/skills/meta/clio-coder-test/references/harness.md +100 -124
  222. package/skills/meta/clio-coder-test/references/test-map.md +77 -50
  223. package/skills/meta/credentials/SKILL.md +2 -2
  224. package/skills/meta/find-skills/SKILL.md +2 -2
  225. package/skills/meta/herdr/SKILL.md +2 -2
  226. package/skills/meta/skill-craft/SKILL.md +22 -16
  227. package/skills/planning/architecture/SKILL.md +2 -2
  228. package/skills/planning/backlog/SKILL.md +2 -2
  229. package/skills/planning/prd/SKILL.md +2 -2
  230. package/skills/planning/product-intent/SKILL.md +2 -2
  231. package/skills/planning/tech-spec/SKILL.md +2 -2
  232. package/skills/registry.yaml +62 -62
  233. package/skills/research/arxiv-literature/SKILL.md +2 -2
  234. package/skills/research/experiment-protocol/SKILL.md +2 -2
  235. package/skills/research/scientific-debugging/SKILL.md +2 -2
  236. package/skills/research/scientific-modernization/SKILL.md +2 -2
  237. package/skills/skill-marketplace.json +62 -62
  238. package/skills/workflow/cut-it/SKILL.md +2 -2
  239. package/skills/workflow/design-council/SKILL.md +2 -2
  240. package/skills/workflow/grill-me/SKILL.md +2 -2
  241. package/skills/workflow/workflow-distiller/SKILL.md +2 -2
  242. package/src/cli/args.ts +2 -2
  243. package/src/cli/bootstrap-generate.ts +1 -1
  244. package/src/cli/config-inspect.ts +65 -12
  245. package/src/cli/configure.ts +0 -4
  246. package/src/cli/docs.ts +22 -14
  247. package/src/cli/doctor-naming.ts +5 -5
  248. package/src/cli/doctor-toolchain.ts +3 -3
  249. package/src/cli/eval.ts +1 -2
  250. package/src/cli/extensions.ts +2 -1
  251. package/src/cli/fleet.ts +1 -1
  252. package/src/cli/index.ts +2 -1
  253. package/src/cli/internal-dispatch.ts +3 -4
  254. package/src/cli/panes.ts +19 -5
  255. package/src/cli/run.ts +2 -2
  256. package/src/cli/share.ts +5 -1
  257. package/src/cli/skills-eval.ts +3 -3
  258. package/src/cli/targets.ts +2 -6
  259. package/src/cli/trace.ts +55 -4
  260. package/src/cli/wiki-generate.ts +1 -1
  261. package/src/core/artifact-paths.ts +1 -1
  262. package/src/core/bash-exec.ts +131 -86
  263. package/src/core/bus-events.ts +51 -6
  264. package/src/core/config.ts +5 -1
  265. package/src/core/defaults.ts +7 -4
  266. package/src/core/dispatch-outcome.ts +16 -0
  267. package/src/core/guardrails.ts +10 -49
  268. package/src/core/prompt-hint.ts +9 -0
  269. package/src/domains/agents/builtins/architect.md +2 -3
  270. package/src/domains/agents/builtins/coder.md +3 -2
  271. package/src/domains/agents/builtins/debugger.md +2 -2
  272. package/src/domains/agents/builtins/documenter.md +2 -2
  273. package/src/domains/agents/builtins/git-master.md +1 -1
  274. package/src/domains/agents/builtins/oracle.md +1 -1
  275. package/src/domains/agents/builtins/provenance.md +1 -1
  276. package/src/domains/agents/builtins/researcher.md +1 -1
  277. package/src/domains/agents/builtins/scout.md +1 -1
  278. package/src/domains/agents/builtins/tester.md +2 -2
  279. package/src/domains/agents/builtins/verifier.md +2 -2
  280. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  281. package/src/domains/agents/catalog.ts +12 -14
  282. package/src/domains/agents/contract.ts +2 -0
  283. package/src/domains/agents/extension.ts +23 -1
  284. package/src/domains/config/keybindings.ts +8 -0
  285. package/src/domains/context/extension.ts +0 -3
  286. package/src/domains/context/working-set/path-index.ts +1 -0
  287. package/src/domains/dispatch/capability-match.ts +10 -0
  288. package/src/domains/dispatch/extension.ts +105 -22
  289. package/src/domains/dispatch/host-verification.ts +435 -39
  290. package/src/domains/dispatch/intent-requirements.ts +10 -0
  291. package/src/domains/dispatch/intent.ts +18 -1
  292. package/src/domains/dispatch/path-scope.ts +235 -24
  293. package/src/domains/dispatch/run-event-journal.ts +4 -15
  294. package/src/domains/dispatch/state.ts +2 -3
  295. package/src/domains/dispatch/transport.ts +45 -21
  296. package/src/domains/dispatch/types.ts +55 -3
  297. package/src/domains/eval/artifacts/store.ts +5 -0
  298. package/src/domains/eval/store.ts +8 -1
  299. package/src/domains/evidence/trust-status.ts +10 -1
  300. package/src/domains/extensions/contract.ts +15 -1
  301. package/src/domains/extensions/discovery.ts +238 -41
  302. package/src/domains/extensions/extension.ts +105 -6
  303. package/src/domains/extensions/index.ts +24 -0
  304. package/src/domains/extensions/integrity.ts +189 -0
  305. package/src/domains/extensions/manager.ts +17 -1
  306. package/src/domains/extensions/resource-path.ts +27 -0
  307. package/src/domains/extensions/resources.ts +18 -38
  308. package/src/domains/extensions/snapshot-store.ts +39 -0
  309. package/src/domains/extensions/snapshot.ts +180 -0
  310. package/src/domains/extensions/state.ts +385 -57
  311. package/src/domains/extensions/types.ts +118 -1
  312. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  313. package/src/domains/lifecycle/migrations/index.ts +2 -0
  314. package/src/domains/lifecycle/naming-resources.ts +19 -4
  315. package/src/domains/lifecycle/naming-yazi.ts +10 -5
  316. package/src/domains/middleware/contract.ts +26 -0
  317. package/src/domains/middleware/extension.ts +24 -24
  318. package/src/domains/middleware/hook-receipts.ts +27 -4
  319. package/src/domains/middleware/hooks-io.ts +65 -32
  320. package/src/domains/middleware/hooks.ts +64 -0
  321. package/src/domains/middleware/index.ts +28 -4
  322. package/src/domains/middleware/registrations.ts +326 -0
  323. package/src/domains/middleware/runtime.ts +28 -0
  324. package/src/domains/middleware/snapshot.ts +20 -7
  325. package/src/domains/mux/contract.ts +38 -0
  326. package/src/domains/mux/detect.ts +6 -13
  327. package/src/domains/mux/index.ts +1 -1
  328. package/src/domains/mux/operations.ts +44 -5
  329. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  330. package/src/domains/mux/yazi/session.ts +53 -4
  331. package/src/domains/mux/yazi/theme.ts +117 -17
  332. package/src/domains/observability/contract.ts +10 -11
  333. package/src/domains/observability/extension.ts +11 -3
  334. package/src/domains/observability/projection.ts +14 -90
  335. package/src/domains/observability/trace-store.ts +43 -7
  336. package/src/domains/prompts/compiler.ts +73 -53
  337. package/src/domains/prompts/contract.ts +15 -3
  338. package/src/domains/prompts/extension.ts +97 -9
  339. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
  340. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  341. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  342. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  343. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  344. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  345. package/src/domains/prompts/fragments/operating/skills.md +10 -24
  346. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  347. package/src/domains/providers/index.ts +1 -1
  348. package/src/domains/providers/model-runtime-capabilities.ts +85 -21
  349. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +669 -104
  350. package/src/domains/providers/runtime-resolution.ts +31 -0
  351. package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
  352. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  353. package/src/domains/providers/types/cost-provenance.ts +19 -0
  354. package/src/domains/providers/types/local-model-quirks.ts +85 -37
  355. package/src/domains/resources/skills/loader.ts +16 -19
  356. package/src/domains/safety/call-target.ts +1 -1
  357. package/src/domains/safety/loop-detector.ts +7 -4
  358. package/src/domains/session/task-board.ts +10 -9
  359. package/src/domains/share/archive.ts +164 -7
  360. package/src/engine/acp/server.ts +62 -9
  361. package/src/engine/apis/llamacpp-residency.ts +3 -4
  362. package/src/engine/apis/lmstudio.ts +3 -3
  363. package/src/engine/apis/ollama-native.ts +6 -6
  364. package/src/engine/apis/openai-completions.ts +28 -25
  365. package/src/engine/apis/output-budget.ts +8 -18
  366. package/src/engine/apis/residency.ts +8 -27
  367. package/src/engine/gemma-channel-filter.ts +19 -0
  368. package/src/engine/loop-guard.ts +92 -12
  369. package/src/engine/worker-runtime.ts +40 -11
  370. package/src/engine/worker-tools.ts +3 -1
  371. package/src/entry/extension-hook-sources.ts +28 -0
  372. package/src/entry/extension-reload.ts +309 -0
  373. package/src/entry/orchestrator.ts +59 -35
  374. package/src/interactive/application-controller.ts +2 -1
  375. package/src/interactive/bus-notices.ts +8 -1
  376. package/src/interactive/chat-loop-messages.ts +3 -13
  377. package/src/interactive/chat-loop.ts +10 -1
  378. package/src/interactive/chat-panel.ts +36 -13
  379. package/src/interactive/chat-renderer.ts +71 -7
  380. package/src/interactive/dispatch-board.ts +6 -11
  381. package/src/interactive/footer/widgets.ts +13 -0
  382. package/src/interactive/interactive-application.ts +39 -4
  383. package/src/interactive/interactive-input-runtime.ts +4 -0
  384. package/src/interactive/interactive-presentation.ts +2 -2
  385. package/src/interactive/interactive-slash-runtime.ts +2 -0
  386. package/src/interactive/overlays/extensions.ts +9 -1
  387. package/src/interactive/overlays/help-reference.ts +13 -0
  388. package/src/interactive/overlays/settings.ts +27 -16
  389. package/src/interactive/panes-runtime.ts +111 -35
  390. package/src/interactive/prompt-cache-identity.ts +88 -0
  391. package/src/interactive/slash-commands.ts +129 -14
  392. package/src/interactive/stream-pacing-policy.ts +0 -23
  393. package/src/interactive/turn-context.ts +30 -15
  394. package/src/interactive/yazi-bridge.ts +60 -6
  395. package/src/tools/agent-tools.ts +30 -1
  396. package/src/tools/artifact.ts +2 -2
  397. package/src/tools/ask-user.ts +3 -3
  398. package/src/tools/bash.ts +1 -1
  399. package/src/tools/bootstrap.ts +4 -0
  400. package/src/tools/builtin-tool-catalog.ts +52 -22
  401. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  402. package/src/tools/codewiki/code-nav.ts +99 -13
  403. package/src/tools/context/docs-engine.ts +20 -7
  404. package/src/tools/context/index.ts +29 -12
  405. package/src/tools/core-bootstrap.ts +28 -6
  406. package/src/tools/credential-present.ts +1 -2
  407. package/src/tools/dispatch-arguments.ts +5 -1
  408. package/src/tools/dispatch-plan.ts +48 -4
  409. package/src/tools/dispatch-run-events.ts +1 -1
  410. package/src/tools/dispatch-schema.ts +338 -0
  411. package/src/tools/dispatch-types.ts +3 -0
  412. package/src/tools/dispatch.ts +9 -254
  413. package/src/tools/ledger.ts +3 -5
  414. package/src/tools/monitor-surface.ts +5 -13
  415. package/src/tools/observation.ts +4 -5
  416. package/src/tools/panes-surface.ts +4 -11
  417. package/src/tools/panes.ts +4 -2
  418. package/src/tools/policy.ts +15 -2
  419. package/src/tools/read.ts +5 -6
  420. package/src/tools/registry.ts +30 -7
  421. package/src/tools/result-shaping.ts +18 -14
  422. package/src/tools/steer-surface.ts +1 -1
  423. package/src/tools/tasks.ts +1 -1
  424. package/src/tools/truncate.ts +6 -5
  425. package/src/tools/verify/surface.ts +6 -12
  426. package/src/tools/web-fetch-surface.ts +1 -3
  427. package/dist/chunk-5QIAJV2D.js +0 -48
  428. package/dist/chunk-JZWT5J3Y.js +0 -814
  429. package/dist/chunk-K7VKOLQQ.js +0 -15
  430. package/dist/chunk-PMZCIOCJ.js +0 -25
  431. package/dist/chunk-SUW5DORT.js +0 -819
  432. package/dist/chunk-UOV2BYIW.js +0 -107
  433. package/dist/chunk-WR6U3OVP.js +0 -45
  434. package/docs/artifact-versions.md +0 -67
  435. package/docs/documentation-coverage.md +0 -46
  436. package/docs/documentation-guide.md +0 -167
  437. package/docs/time-conventions.md +0 -101
@@ -81,7 +81,7 @@ import {
81
81
  type SessionPromptCompileRecord,
82
82
  } from "../domains/session/prompt-manifest.js";
83
83
  import type { AgentMessage, Usage } from "../engine/types.js";
84
- import type { ToolRegistry } from "../tools/registry.js";
84
+ import { resolveToolPromptHint, type ToolRegistry } from "../tools/registry.js";
85
85
  import {
86
86
  backendCacheVerdict,
87
87
  extractUserText,
@@ -90,6 +90,7 @@ import {
90
90
  toolNamesFromAgentState,
91
91
  } from "./chat-loop-messages.js";
92
92
  import { buildModelReplayAgentMessagesFromTurns } from "./model-session-replay.js";
93
+ import { attachedToolSchemasFromState, mainPromptCacheIdentity } from "./prompt-cache-identity.js";
93
94
  import { renderCompactionSummaryLine, renderEvictionSkipLine } from "./renderers/compaction-summary.js";
94
95
  import type { TurnMiddleware } from "./turn-middleware.js";
95
96
  import type { AgentRuntime, ChatTurnState } from "./turn-state.js";
@@ -270,8 +271,8 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
270
271
  // before the operator did.
271
272
  let lastPrewarm: PrewarmStats | null = null;
272
273
  // The session system prompt, compiled once per session. Recompiles happen
273
- // only on explicit events: the compile key (target, model, safety level,
274
- // session id) changes, or a config hot-reload invalidates the cache. A
274
+ // only when the canonical identity of every live compile input changes, or
275
+ // a config hot-reload invalidates compiler-owned inputs. A
275
276
  // recompile that changes the prompt text appends a "promptRecompiled"
276
277
  // ledger entry so a cold provider cache is always explainable.
277
278
  let sessionPrompt: CompiledSessionPrompt | null = null;
@@ -1021,8 +1022,8 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
1021
1022
 
1022
1023
  /**
1023
1024
  * Ensure the session system prompt is compiled and applied to the live
1024
- * agent. Compiles only when the compile key (target, model, safety
1025
- * level, session id) changes or a config hot-reload invalidated the
1025
+ * agent. Compiles only when the canonical live-input identity changes
1026
+ * or a config hot-reload invalidated compiler-owned inputs in the
1026
1027
  * cache; every other submit reuses the cached prompt byte-for-byte. A
1027
1028
  * compile whose text differs from the previous prompt queues a
1028
1029
  * "promptRecompiled" ledger entry (written once the session exists).
@@ -1032,14 +1033,9 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
1032
1033
  const settings = deps.getSettings();
1033
1034
  const autonomy = settings.safety.autonomy ?? "auto-edit";
1034
1035
  const sessionId = deps.session?.current()?.id ?? "";
1035
- const workingContextKey = [...sessionWorkingContextPaths].sort().join("\0");
1036
- const key = `${agentRuntime.targetId}|${agentRuntime.wireModelId}|${autonomy}|${sessionId}|${workingContextKey}`;
1037
- if (sessionPrompt && sessionPromptKey === key) {
1038
- lastSystemPromptReused = true;
1039
- return sessionPrompt;
1040
- }
1036
+ const cwd = process.cwd();
1041
1037
  const modelState = agentRuntime.agent.state.model as
1042
- | (typeof agentRuntime.agent.state.model & { clio?: { quirks?: LocalModelQuirks } })
1038
+ | (typeof agentRuntime.agent.state.model & { clioCoder?: { quirks?: LocalModelQuirks } })
1043
1039
  | undefined;
1044
1040
  // `Context window: N` is the window the backend will actually serve
1045
1041
  // this session, taken from the resolution the turn already ran rather
@@ -1057,13 +1053,14 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
1057
1053
  const contextWindow = typeof resolvedWindow === "number" && resolvedWindow > 0 ? resolvedWindow : null;
1058
1054
  const contextWindowSource: ContextWindowSource | null =
1059
1055
  contextWindow === null ? null : windowDetails.contextWindowSource;
1060
- const guidance = modelState?.clio?.quirks?.thinking?.guidance;
1056
+ const guidance = modelState?.clioCoder?.quirks?.thinking?.guidance;
1061
1057
  // Per-tool prompt hints come from registry metadata, derived once from
1062
1058
  // the frozen surface per compile. The compiler renders them sorted by
1063
1059
  // tool name, so the compiled text stays byte-stable for a given surface.
1064
1060
  const toolNames = toolNamesFromAgentState(agentRuntime.agent.state.tools);
1061
+ const attachedToolSchemas = attachedToolSchemasFromState(agentRuntime.agent.state.tools);
1065
1062
  const toolPromptHints = toolNames.flatMap((name) => {
1066
- const hint = deps.toolRegistry?.get(name as ToolName)?.metadata?.promptHint;
1063
+ const hint = resolveToolPromptHint(deps.toolRegistry?.get(name as ToolName)?.metadata?.promptHint, "session");
1067
1064
  return hint ? [{ tool: name, hint }] : [];
1068
1065
  });
1069
1066
  const sessionInputs: SessionPromptInputs = {
@@ -1085,11 +1082,29 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
1085
1082
  );
1086
1083
  }
1087
1084
  }
1085
+ const key = mainPromptCacheIdentity({
1086
+ targetId: agentRuntime.targetId,
1087
+ runtimeId: agentRuntime.runtimeId,
1088
+ wireModelId: agentRuntime.wireModelId,
1089
+ autonomy,
1090
+ sessionId,
1091
+ cwd,
1092
+ workingContextPaths: [...sessionWorkingContextPaths],
1093
+ contextWindowSource,
1094
+ promptInputEpoch: deps.prompts.inputEpoch(),
1095
+ sessionInputs,
1096
+ attachedToolSchemas,
1097
+ });
1098
+ if (sessionPrompt && sessionPromptKey === key) {
1099
+ lastSystemPromptReused = true;
1100
+ return sessionPrompt;
1101
+ }
1088
1102
  try {
1089
1103
  const result = await deps.prompts.compileSessionPrompt({
1104
+ sessionId,
1090
1105
  sessionInputs,
1091
1106
  autonomy,
1092
- cwd: process.cwd(),
1107
+ cwd,
1093
1108
  workingContextPaths: [...sessionWorkingContextPaths],
1094
1109
  });
1095
1110
  const previousHash = sessionPromptHash ?? lastRecordedPromptHash();
@@ -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
  }),