@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
package/src/engine/ai.ts CHANGED
@@ -59,6 +59,8 @@ export interface EngineTextCompletionInput {
59
59
  signal: AbortSignal;
60
60
  timeoutMs: number;
61
61
  apiKey?: string;
62
+ /** Accounting only: observed before terminal errors throw, never carries response content. */
63
+ onUsage?: (observation: Pick<EngineTextCompletionResult, "usage" | "backend">) => void;
62
64
  }
63
65
 
64
66
  export interface EngineTextCompletionResult {
@@ -98,16 +100,11 @@ export async function completeEngineText(input: EngineTextCompletionInput): Prom
98
100
  ...(input.apiKey === undefined ? {} : { apiKey: input.apiKey }),
99
101
  },
100
102
  );
101
- if (response.stopReason === "error" || response.stopReason === "aborted") {
103
+ const failed = response.stopReason === "error" || response.stopReason === "aborted";
104
+ if (failed && !response.usage) {
102
105
  throw new Error(response.errorMessage ?? `model completion ${response.stopReason}`);
103
106
  }
104
- return {
105
- text: response.content
106
- .filter((block): block is Extract<(typeof response.content)[number], { type: "text" }> => block.type === "text")
107
- .map((block) => block.text)
108
- .join(""),
109
- inputTokens: response.usage.input,
110
- outputTokens: response.usage.output,
107
+ const observation: Pick<EngineTextCompletionResult, "usage" | "backend"> = {
111
108
  usage: {
112
109
  input: response.usage.input,
113
110
  output: response.usage.output,
@@ -119,6 +116,27 @@ export async function completeEngineText(input: EngineTextCompletionInput): Prom
119
116
  },
120
117
  backend: response.backendTimings ?? null,
121
118
  };
119
+ // Pi synthesizes all-zero usage for failures with no provider accounting.
120
+ // Do not turn that placeholder into a measured zero-spend call.
121
+ if (!failed || Object.values(observation.usage).some((value) => Number.isFinite(value) && value > 0)) {
122
+ try {
123
+ input.onUsage?.(observation);
124
+ } catch {
125
+ // Accounting observers cannot change completion success/error behavior.
126
+ }
127
+ }
128
+ if (failed) {
129
+ throw new Error(response.errorMessage ?? `model completion ${response.stopReason}`);
130
+ }
131
+ return {
132
+ text: response.content
133
+ .filter((block): block is Extract<(typeof response.content)[number], { type: "text" }> => block.type === "text")
134
+ .map((block) => block.text)
135
+ .join(""),
136
+ inputTokens: response.usage.input,
137
+ outputTokens: response.usage.output,
138
+ ...observation,
139
+ };
122
140
  }
123
141
 
124
142
  export interface EngineAi {
@@ -1,45 +1,64 @@
1
1
  import { type ChildProcessByStdio, spawn } from "node:child_process";
2
- import type { Readable } from "node:stream";
2
+ import type { Readable, Writable } from "node:stream";
3
3
 
4
+ import { boundedExternalDiagnostic } from "../../core/external-diagnostic.js";
5
+ import { buildSafeToolEnv, resolveSafeCwd } from "../../core/safe-exec.js";
4
6
  import type { AutonomyLevel } from "../../domains/safety/autonomy.js";
5
7
  import { assertToolProfileEnforceable } from "../../tools/profiles.js";
6
- import { readStderr, waitForClose } from "../external-subprocess.js";
8
+ import { createProcessTreeTerminator, readBoundedLines, readStderr, waitForClose } from "../external-subprocess.js";
7
9
  import type { AgentEvent, AgentMessage, Usage } from "../types.js";
8
10
  import type { WorkerEventEmit, WorkerRunHandle, WorkerRunInput, WorkerRunResult } from "../worker-runtime.js";
9
11
 
10
- /** Binary name; resolved via PATH like the `claude` runner resolves `claude`. */
12
+ /** Official CLI binary, resolved from the operator's PATH. */
11
13
  const ANTIGRAVITY_BINARY = "agy";
14
+ export const ANTIGRAVITY_MAX_STREAM_LINE_BYTES = 1024 * 1024;
15
+ export const ANTIGRAVITY_MAX_STREAM_BYTES = 8 * 1024 * 1024;
16
+ export const ANTIGRAVITY_MAX_RESPONSE_BYTES = 4 * 1024 * 1024;
17
+ export const ANTIGRAVITY_MAX_PROMPT_BYTES = 4 * 1024 * 1024;
18
+ const MAX_PROTOCOL_DIAGNOSTICS = 32;
19
+ const MAX_CONVERSATION_ID_BYTES = 4096;
12
20
 
13
- type AntigravityChildProcess = ChildProcessByStdio<null, Readable, Readable>;
21
+ type AntigravityChildProcess = ChildProcessByStdio<Writable, Readable, Readable>;
14
22
 
15
- const ZERO_USAGE: Usage = {
16
- input: 0,
17
- output: 0,
18
- cacheRead: 0,
19
- cacheWrite: 0,
20
- totalTokens: 0,
21
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
23
+ type AntigravityUsage = {
24
+ input_tokens?: unknown;
25
+ output_tokens?: unknown;
26
+ thinking_tokens?: unknown;
27
+ cache_read_tokens?: unknown;
28
+ total_tokens?: unknown;
22
29
  };
23
30
 
31
+ type AntigravityResult = {
32
+ conversation_id?: unknown;
33
+ status?: unknown;
34
+ response?: unknown;
35
+ error?: unknown;
36
+ usage?: unknown;
37
+ };
38
+
39
+ export type AntigravityStreamEvent =
40
+ | { event: "init"; conversationId: string | null; model: string | null }
41
+ | { event: "text"; conversationId: string | null; delta: string }
42
+ | { event: "result"; result: AntigravityResult }
43
+ | { event: "other" };
44
+
24
45
  export interface AntigravitySubprocessConfig {
25
46
  extraArgs: string[];
26
47
  dangerousBypass: boolean;
27
- externalMode: "plan+sandbox" | "bypassPermissions" | "agy-settings-default";
48
+ externalMode: "plan+sandbox" | "accept-edits" | "bypassPermissions";
49
+ }
50
+
51
+ export interface AntigravityRuntimeDependencies {
52
+ binary?: string;
53
+ workspaceRoot?: string;
54
+ environment?: NodeJS.ProcessEnv;
55
+ killGraceMs?: number;
28
56
  }
29
57
 
30
58
  /**
31
- * agy `--print` permission flags for a given autonomy level, mirroring the
32
- * Claude Code runner's posture against agy's coarser flag surface. agy exposes
33
- * an agent execution mode and a terminal sandbox, but no per-tool callback or
34
- * allowlist Clio can mediate.
35
- *
36
- * - `full-auto` + `CLIO_CODER_ALLOW_EXTERNAL_FULL_ACCESS=1` opens the dangerous
37
- * bypass (`--dangerously-skip-permissions`); nothing else does.
38
- * - `read-only` runs `--mode plan --sandbox`: plan prevents agent edits and
39
- * sandbox independently restricts terminal execution.
40
- * - `suggest` is refused because `agy --print` cannot pause to ask.
41
- * - `auto-edit` and ungated `full-auto` pass no permission flag and defer to
42
- * agy's own `settings.json`.
59
+ * Translate Clio's effective autonomy ceiling to the official CLI's coarser
60
+ * modes. Every non-bypass launch is explicit, so changing interactive `agy`
61
+ * defaults cannot silently widen a delegated run.
43
62
  */
44
63
  export function antigravitySubprocessConfigForAutonomy(
45
64
  level: AutonomyLevel | undefined,
@@ -60,7 +79,9 @@ export function antigravitySubprocessConfigForAutonomy(
60
79
  if (level === "read-only") {
61
80
  return { extraArgs: ["--mode", "plan", "--sandbox"], dangerousBypass: false, externalMode: "plan+sandbox" };
62
81
  }
63
- return { extraArgs: [], dangerousBypass: false, externalMode: "agy-settings-default" };
82
+ // Both auto-edit and ungated full-auto stay at agy's explicit
83
+ // accept-edits ceiling. Shell/network policy remains owned by agy.
84
+ return { extraArgs: ["--mode", "accept-edits"], dangerousBypass: false, externalMode: "accept-edits" };
64
85
  }
65
86
 
66
87
  function buildAntigravityPrompt(input: WorkerRunInput): string {
@@ -75,131 +96,376 @@ function buildAntigravityPrompt(input: WorkerRunInput): string {
75
96
  return parts.join("\n\n");
76
97
  }
77
98
 
78
- function buildAgyArgs(input: WorkerRunInput): string[] {
99
+ /** Official one-turn stream-json stdin record. JSON encoding keeps prompt text literal. */
100
+ export function buildAgyStdinLine(input: WorkerRunInput): string {
101
+ const content = buildAntigravityPrompt(input);
102
+ if (Buffer.byteLength(content, "utf8") > ANTIGRAVITY_MAX_PROMPT_BYTES) {
103
+ throw new Error(`Antigravity work order exceeded ${ANTIGRAVITY_MAX_PROMPT_BYTES} bytes`);
104
+ }
105
+ return `${JSON.stringify({ event: "user", message: { content } })}\n`;
106
+ }
107
+
108
+ export function buildAgyArgs(input: WorkerRunInput, gateEnv: NodeJS.ProcessEnv = process.env): string[] {
79
109
  assertToolProfileEnforceable(input.toolProfile, "antigravity-code");
80
- const permission = antigravitySubprocessConfigForAutonomy(input.autonomy);
81
- const args = ["--print", ...permission.extraArgs];
110
+ const permission = antigravitySubprocessConfigForAutonomy(input.autonomy, gateEnv);
111
+ const args = [
112
+ ...permission.extraArgs,
113
+ "--input-format",
114
+ "stream-json",
115
+ "--output-format",
116
+ "stream-json",
117
+ "--disable-slash-commands",
118
+ ];
82
119
  if (input.wireModelId.trim().length > 0) args.push("--model", input.wireModelId.trim());
83
- args.push(buildAntigravityPrompt(input));
84
120
  return args;
85
121
  }
86
122
 
123
+ function record(value: unknown): Record<string, unknown> | null {
124
+ return typeof value === "object" && value !== null && !Array.isArray(value)
125
+ ? (value as Record<string, unknown>)
126
+ : null;
127
+ }
128
+
129
+ /** Parse one event from agy's newline-delimited `stream-json` output. */
130
+ export function parseAntigravityStreamLine(line: string): AntigravityStreamEvent | null {
131
+ let decoded: unknown;
132
+ try {
133
+ decoded = JSON.parse(line);
134
+ } catch {
135
+ return null;
136
+ }
137
+ const envelope = record(decoded);
138
+ if (!envelope || typeof envelope.event !== "string") return null;
139
+ if (envelope.event === "init") {
140
+ return {
141
+ event: "init",
142
+ conversationId: typeof envelope.conversation_id === "string" ? envelope.conversation_id : null,
143
+ model: typeof envelope.model === "string" ? envelope.model : null,
144
+ };
145
+ }
146
+ if (envelope.event === "step_update") {
147
+ const update = record(envelope.step_update);
148
+ if (!update) return null;
149
+ if (update.step_type !== "agent_response" || typeof update.text_delta !== "string") {
150
+ return { event: "other" };
151
+ }
152
+ return {
153
+ event: "text",
154
+ conversationId: typeof update.conversation_id === "string" ? update.conversation_id : null,
155
+ delta: update.text_delta,
156
+ };
157
+ }
158
+ if (envelope.event === "result") {
159
+ const result = record(envelope.result);
160
+ return result ? { event: "result", result } : null;
161
+ }
162
+ return { event: "other" };
163
+ }
164
+
165
+ function finite(value: unknown): number {
166
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.min(value, Number.MAX_SAFE_INTEGER) : 0;
167
+ }
168
+
169
+ function normalizeUsage(raw: unknown): Usage {
170
+ const source = (record(raw) ?? {}) as AntigravityUsage;
171
+ const input = finite(source.input_tokens);
172
+ const output = finite(source.output_tokens);
173
+ const cacheRead = finite(source.cache_read_tokens);
174
+ const reasoningTokens = finite(source.thinking_tokens);
175
+ const usage: Usage & { reasoningTokens?: number } = {
176
+ input,
177
+ output,
178
+ cacheRead,
179
+ cacheWrite: 0,
180
+ totalTokens: finite(source.total_tokens) || input + output + reasoningTokens,
181
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
182
+ };
183
+ if (reasoningTokens > 0) usage.reasoningTokens = reasoningTokens;
184
+ return usage;
185
+ }
186
+
187
+ function appendBoundedText(current: string, delta: string): string {
188
+ if (Buffer.byteLength(current, "utf8") + Buffer.byteLength(delta, "utf8") > ANTIGRAVITY_MAX_RESPONSE_BYTES) {
189
+ throw new Error(`Antigravity response exceeded ${ANTIGRAVITY_MAX_RESPONSE_BYTES} bytes`);
190
+ }
191
+ return current + delta;
192
+ }
193
+
194
+ function boundedProviderField(value: unknown, field: string): string {
195
+ if (typeof value !== "string") return "";
196
+ if (Buffer.byteLength(value, "utf8") > ANTIGRAVITY_MAX_RESPONSE_BYTES) {
197
+ throw new Error(`Antigravity terminal ${field} exceeded ${ANTIGRAVITY_MAX_RESPONSE_BYTES} bytes`);
198
+ }
199
+ return value;
200
+ }
201
+
202
+ function boundedConversationId(value: unknown): string | null {
203
+ if (typeof value !== "string" || value.length === 0) return null;
204
+ return Buffer.byteLength(value, "utf8") <= MAX_CONVERSATION_ID_BYTES ? value : null;
205
+ }
206
+
207
+ interface StreamState {
208
+ started: boolean;
209
+ text: string;
210
+ model: string;
211
+ result: AntigravityResult | null;
212
+ conversationId: string | null;
213
+ initSeen: boolean;
214
+ terminalSeen: boolean;
215
+ protocolDiagnostics: string[];
216
+ }
217
+
218
+ function protocolFailure(state: StreamState, detail: string): void {
219
+ if (state.protocolDiagnostics.length < MAX_PROTOCOL_DIAGNOSTICS) state.protocolDiagnostics.push(detail);
220
+ }
221
+
222
+ function emitTextDelta(emit: WorkerEventEmit, state: StreamState, delta: string): void {
223
+ if (delta.length === 0) return;
224
+ state.text = appendBoundedText(state.text, delta);
225
+ if (!state.started) {
226
+ state.started = true;
227
+ emit({
228
+ type: "message_start",
229
+ message: buildAssistantMessage({
230
+ model: state.model,
231
+ text: "",
232
+ result: null,
233
+ conversationId: null,
234
+ exitCode: 0,
235
+ aborted: false,
236
+ diagnostic: "",
237
+ }),
238
+ } as AgentEvent);
239
+ }
240
+ // This runner is worker-only. The NDJSON event contract consumes the delta;
241
+ // cumulative message/partial copies are intentionally omitted.
242
+ emit({
243
+ type: "message_update",
244
+ assistantMessageEvent: { type: "text_delta", contentIndex: 0, delta },
245
+ } as AgentEvent);
246
+ }
247
+
248
+ async function readStream(child: AntigravityChildProcess, emit: WorkerEventEmit, state: StreamState): Promise<void> {
249
+ for await (const bounded of readBoundedLines(child.stdout, {
250
+ maxLineBytes: ANTIGRAVITY_MAX_STREAM_LINE_BYTES,
251
+ maxTotalBytes: ANTIGRAVITY_MAX_STREAM_BYTES,
252
+ })) {
253
+ if (bounded.kind === "oversized") {
254
+ protocolFailure(state, "oversized structured output line");
255
+ continue;
256
+ }
257
+ const line = bounded.line;
258
+ if (!line.trim()) continue;
259
+ const event = parseAntigravityStreamLine(line);
260
+ if (!event) {
261
+ protocolFailure(state, "unreadable structured output line");
262
+ continue;
263
+ }
264
+ if (state.terminalSeen) {
265
+ protocolFailure(state, "event after terminal result");
266
+ continue;
267
+ }
268
+ switch (event.event) {
269
+ case "init":
270
+ if (state.initSeen) {
271
+ protocolFailure(state, "duplicate init event");
272
+ break;
273
+ }
274
+ state.initSeen = true;
275
+ state.conversationId = boundedConversationId(event.conversationId);
276
+ if (event.model?.trim()) state.model = event.model.trim();
277
+ break;
278
+ case "text":
279
+ if (!state.initSeen) {
280
+ protocolFailure(state, "text event before init");
281
+ break;
282
+ }
283
+ state.conversationId = boundedConversationId(event.conversationId) ?? state.conversationId;
284
+ emitTextDelta(emit, state, event.delta);
285
+ break;
286
+ case "result":
287
+ if (!state.initSeen) {
288
+ protocolFailure(state, "terminal result before init");
289
+ break;
290
+ }
291
+ state.terminalSeen = true;
292
+ state.result = event.result;
293
+ state.conversationId = boundedConversationId(event.result.conversation_id) ?? state.conversationId;
294
+ break;
295
+ case "other":
296
+ if (!state.initSeen) protocolFailure(state, "event before init");
297
+ break;
298
+ }
299
+ }
300
+ }
301
+
302
+ function resultDiagnostic(input: {
303
+ result: AntigravityResult | null;
304
+ exitCode: number;
305
+ spawnError: string;
306
+ stderr: string;
307
+ protocolDiagnostics: ReadonlyArray<string>;
308
+ streamError: string;
309
+ aborted: boolean;
310
+ }): string {
311
+ if (input.aborted) return "Antigravity run was cancelled";
312
+ if (input.spawnError) return input.spawnError;
313
+ if (input.streamError) return input.streamError;
314
+ if (input.protocolDiagnostics.length > 0) {
315
+ return `Antigravity structured output violated the protocol: ${input.protocolDiagnostics.join("; ")}`;
316
+ }
317
+ if (input.result === null) {
318
+ return "Antigravity CLI ended without a terminal stream result. Update `agy` and verify stream-json support.";
319
+ }
320
+ if (input.result.status !== "SUCCESS") {
321
+ const providerError = boundedProviderField(input.result.error, "error").trim();
322
+ return providerError || `Antigravity returned terminal status ${String(input.result.status ?? "missing")}`;
323
+ }
324
+ if (input.exitCode !== 0) return `Antigravity returned SUCCESS but exited with status ${input.exitCode}`;
325
+ if (typeof input.result.response !== "string") return "Antigravity SUCCESS result omitted its required response";
326
+ // Successful structured output is authoritative. Some CLI builds write
327
+ // benign notices to stderr; retaining those as run failures would turn a
328
+ // valid SUCCESS terminal record into a protocol contradiction.
329
+ return "";
330
+ }
331
+
87
332
  function buildAssistantMessage(input: {
88
333
  model: string;
89
334
  text: string;
335
+ result: AntigravityResult | null;
336
+ conversationId: string | null;
90
337
  exitCode: number;
91
338
  aborted: boolean;
92
- stderr: string;
339
+ diagnostic: string;
93
340
  }): AgentMessage & { role: "assistant" } {
341
+ const succeeded =
342
+ !input.aborted &&
343
+ input.exitCode === 0 &&
344
+ input.result?.status === "SUCCESS" &&
345
+ typeof input.result.response === "string" &&
346
+ input.diagnostic.length === 0;
94
347
  const message: AgentMessage & { role: "assistant" } = {
95
348
  role: "assistant",
96
349
  content: [{ type: "text", text: input.text }],
97
- api: "google-generative-ai",
98
- provider: "google",
350
+ api: "external-agent-subprocess",
351
+ provider: "antigravity",
99
352
  model: input.model,
100
- usage: ZERO_USAGE,
101
- stopReason: input.aborted ? "aborted" : input.exitCode === 0 ? "stop" : "error",
353
+ usage: normalizeUsage(input.result?.usage),
354
+ stopReason: input.aborted ? "aborted" : succeeded ? "stop" : "error",
102
355
  timestamp: Date.now(),
103
356
  } as AgentMessage & { role: "assistant" };
104
- if (input.exitCode !== 0 && !input.aborted) {
105
- const detail = input.stderr.trim();
106
- if (detail.length > 0) message.errorMessage = detail;
107
- }
357
+ // Opaque provider observation only. This runtime never accepts it as a
358
+ // resumable Clio session id.
359
+ if (input.conversationId) message.responseId = input.conversationId;
360
+ if (input.diagnostic) message.errorMessage = boundedExternalDiagnostic(input.diagnostic);
108
361
  return message;
109
362
  }
110
363
 
111
- function emitTextDelta(
364
+ export function startAntigravityWorkerRun(
365
+ input: WorkerRunInput,
112
366
  emit: WorkerEventEmit,
113
- state: { started: boolean; text: string; model: string },
114
- delta: string,
115
- ): void {
116
- if (delta.length === 0) return;
117
- state.text += delta;
118
- const message = buildAssistantMessage({
119
- model: state.model,
120
- text: state.text,
121
- exitCode: 0,
122
- aborted: false,
123
- stderr: "",
367
+ dependencies: AntigravityRuntimeDependencies = {},
368
+ ): WorkerRunHandle {
369
+ const sourceEnv = dependencies.environment ?? process.env;
370
+ const args = buildAgyArgs(input, sourceEnv);
371
+ const stdinLine = buildAgyStdinLine(input);
372
+ const workspaceRoot = dependencies.workspaceRoot ?? process.cwd();
373
+ const cwd = resolveSafeCwd(input.cwd, workspaceRoot);
374
+ const child: AntigravityChildProcess = spawn(dependencies.binary ?? ANTIGRAVITY_BINARY, args, {
375
+ cwd,
376
+ env: buildSafeToolEnv({}, sourceEnv),
377
+ detached: process.platform !== "win32",
378
+ stdio: ["pipe", "pipe", "pipe"],
124
379
  });
125
- if (!state.started) {
126
- state.started = true;
127
- emit({ type: "message_start", message } as AgentEvent);
128
- }
129
- emit({
130
- type: "message_update",
131
- message,
132
- assistantMessageEvent: {
133
- type: "text_delta",
134
- contentIndex: 0,
135
- delta,
136
- partial: message,
137
- },
138
- } as AgentEvent);
139
- }
140
-
141
- async function readStdout(
142
- child: AntigravityChildProcess,
143
- emit: WorkerEventEmit,
144
- state: { started: boolean; text: string; model: string },
145
- ): Promise<void> {
146
- for await (const chunk of child.stdout) {
147
- emitTextDelta(emit, state, String(chunk));
148
- }
149
- }
150
-
151
- export function startAntigravityWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): WorkerRunHandle {
152
- const args = buildAgyArgs(input);
153
- const child = spawn(ANTIGRAVITY_BINARY, args, {
154
- cwd: process.cwd(),
155
- env: process.env,
156
- stdio: ["ignore", "pipe", "pipe"],
157
- });
158
- const streamState = { started: false, text: "", model: input.wireModelId };
380
+ const streamState: StreamState = {
381
+ started: false,
382
+ text: "",
383
+ model: input.wireModelId,
384
+ result: null,
385
+ conversationId: null,
386
+ initSeen: false,
387
+ terminalSeen: false,
388
+ protocolDiagnostics: [],
389
+ };
159
390
  let aborted = false;
160
- let killTimer: NodeJS.Timeout | null = null;
161
-
391
+ let spawnError = "";
392
+ let streamError = "";
393
+ const terminator = createProcessTreeTerminator(child, dependencies.killGraceMs ?? 1500);
162
394
  const abort = (): void => {
395
+ if (child.exitCode !== null) return;
163
396
  aborted = true;
164
- if (child.killed) return;
165
- child.kill("SIGTERM");
166
- killTimer = setTimeout(() => {
167
- if (!child.killed) child.kill("SIGKILL");
168
- }, 1500);
397
+ terminator.terminate();
169
398
  };
170
- if (input.signal) {
171
- if (input.signal.aborted) abort();
172
- else input.signal.addEventListener("abort", abort, { once: true });
173
- }
399
+ const onAbort = (): void => abort();
400
+ if (input.signal?.aborted) abort();
401
+ else input.signal?.addEventListener("abort", onAbort, { once: true });
402
+ child.once("error", (cause) => {
403
+ spawnError =
404
+ (cause as NodeJS.ErrnoException).code === "ENOENT"
405
+ ? "Antigravity CLI (`agy`) is not installed or not on PATH."
406
+ : boundedExternalDiagnostic(cause.message);
407
+ });
408
+ child.stdin.on("error", (cause) => {
409
+ if (!aborted) spawnError ||= boundedExternalDiagnostic(`could not send work order to Antigravity: ${cause.message}`);
410
+ });
411
+ child.stdin.end(stdinLine);
174
412
 
175
413
  const promise = (async (): Promise<WorkerRunResult> => {
176
414
  emit({ type: "agent_start" } as AgentEvent);
177
- const stderrPromise = readStderr(child);
178
- const stdoutPromise = readStdout(child, emit, streamState);
179
- const exitCode = await waitForClose(child);
180
- await stdoutPromise.catch(() => {});
181
- const stderr = await stderrPromise.catch(() => "");
182
- if (killTimer) clearTimeout(killTimer);
183
- const finalText = streamState.text || (exitCode === 0 ? "" : stderr.trim());
184
- const finalMessage = buildAssistantMessage({
185
- model: streamState.model,
186
- text: finalText,
187
- exitCode,
188
- aborted,
189
- stderr,
190
- });
191
- if (!streamState.started) emit({ type: "message_start", message: finalMessage } as AgentEvent);
192
- emit({ type: "message_end", message: finalMessage } as AgentEvent);
193
- const messages: AgentMessage[] = [finalMessage];
194
- emit({ type: "agent_end", messages } as AgentEvent);
195
- if (exitCode !== 0 && stderr.trim().length > 0 && !aborted) {
196
- process.stderr.write(`[worker:antigravity-code] ${stderr.trim()}\n`);
415
+ try {
416
+ const stderrPromise = readStderr(child);
417
+ const stdoutPromise = readStream(child, emit, streamState).catch((cause) => {
418
+ streamError = boundedExternalDiagnostic(cause instanceof Error ? cause.message : String(cause));
419
+ terminator.terminate();
420
+ });
421
+ const exitCode = await waitForClose(child);
422
+ await stdoutPromise;
423
+ const stderr = await stderrPromise.catch((cause) =>
424
+ boundedExternalDiagnostic(cause instanceof Error ? cause.message : String(cause)),
425
+ );
426
+ let terminalResponse = "";
427
+ try {
428
+ terminalResponse = boundedProviderField(streamState.result?.response, "response");
429
+ } catch (cause) {
430
+ streamError ||= boundedExternalDiagnostic(cause instanceof Error ? cause.message : String(cause));
431
+ }
432
+ let diagnostic = "";
433
+ try {
434
+ diagnostic = resultDiagnostic({
435
+ result: streamState.result,
436
+ exitCode,
437
+ spawnError,
438
+ stderr,
439
+ protocolDiagnostics: streamState.protocolDiagnostics,
440
+ streamError,
441
+ aborted,
442
+ });
443
+ } catch (cause) {
444
+ diagnostic = boundedExternalDiagnostic(cause instanceof Error ? cause.message : String(cause));
445
+ }
446
+ const finalText = terminalResponse || streamState.text;
447
+ const finalMessage = buildAssistantMessage({
448
+ model: streamState.model,
449
+ text: finalText,
450
+ result: streamState.result,
451
+ conversationId: streamState.conversationId,
452
+ exitCode,
453
+ aborted,
454
+ diagnostic,
455
+ });
456
+ if (!streamState.started) emit({ type: "message_start", message: finalMessage } as AgentEvent);
457
+ emit({ type: "message_end", message: finalMessage } as AgentEvent);
458
+ const messages: AgentMessage[] = [finalMessage];
459
+ emit({ type: "agent_end", messages } as AgentEvent);
460
+ if (finalMessage.stopReason === "error" && diagnostic && !aborted) {
461
+ process.stderr.write(`[worker:antigravity-code] ${boundedExternalDiagnostic(diagnostic)}\n`);
462
+ }
463
+ return { messages, exitCode: finalMessage.stopReason === "stop" ? 0 : 1 };
464
+ } finally {
465
+ terminator.cleanup();
466
+ input.signal?.removeEventListener("abort", onAbort);
197
467
  }
198
- return { messages, exitCode: exitCode === 0 ? 0 : 1 };
199
468
  })();
200
469
 
201
- return {
202
- promise,
203
- abort,
204
- };
470
+ return { promise, abort };
205
471
  }
@@ -176,6 +176,9 @@ export async function completeEngineSimple(
176
176
  return engineStreamSimple(model, context, options).result();
177
177
  }
178
178
 
179
+ /** Engine-owned fixture seam for decorating a faux transport before registration. */
180
+ export { createFauxCore as createEngineFauxCore };
181
+
179
182
  export function registerEngineFauxProvider(options: RegisterFauxProviderOptions = {}): FauxProviderRegistration {
180
183
  registerEngineBuiltins();
181
184
  const core = createFauxCore(options);
@@ -5,7 +5,6 @@ import {
5
5
  type ResidencyAdapter,
6
6
  ResidencyPreconditionError,
7
7
  reconcileResidency,
8
- residencyManaged,
9
8
  residentTagProtected,
10
9
  } from "./residency.js";
11
10
 
@@ -27,8 +26,8 @@ export interface LlamaCppResidencyInput {
27
26
  runtimeId: string;
28
27
  keepModelId: string;
29
28
  /**
30
- * Combined env + target lifecycle opt-out verdict from the caller
31
- * (residencyManagedFor). Defaults to the env-only switch.
29
+ * Target lifecycle verdict from the caller (residencyManagedFor). Defaults
30
+ * to managed for direct adapter callers.
32
31
  */
33
32
  managed?: boolean;
34
33
  fetchImpl?: typeof fetch;
@@ -284,7 +283,7 @@ export async function ensureLlamaCppResidency(input: LlamaCppResidencyInput): Pr
284
283
  targetId: input.targetId,
285
284
  runtimeId: input.runtimeId,
286
285
  keepModelId: input.keepModelId,
287
- managed: input.managed ?? residencyManaged(),
286
+ managed: input.managed ?? true,
288
287
  strategy: "router",
289
288
  listResident: async () => {
290
289
  const models = await fetchRouterModels(input, fetchImpl);