@iowarp/clio-coder 0.4.2 → 0.4.4

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 (523) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/CONTRIBUTING.md +86 -19
  3. package/README.md +35 -6
  4. package/dist/{acp-TMDQZDIG.js → acp-WNAYYF4F.js} +12 -13
  5. package/dist/{agents-5N5NG3XG.js → agents-3OKXHLOI.js} +60 -57
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-Z5CCBXKQ.js → auth-VKNNMGPU.js} +21 -19
  8. package/dist/{builtins-K6TNDT24.js → builtins-WGALA46I.js} +9 -4
  9. package/dist/{chunk-XE3PCIXH.js → chunk-23L32XTI.js} +12 -9
  10. package/dist/{chunk-I64IFBLB.js → chunk-25QBEXRS.js} +18 -11
  11. package/dist/{chunk-CDNVLKUX.js → chunk-26QSH3EJ.js} +13 -7
  12. package/dist/{chunk-QQLGQY2A.js → chunk-2ASED4PZ.js} +22 -22
  13. package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
  14. package/dist/chunk-2DSOYNFC.js +108 -0
  15. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  16. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  17. package/dist/{chunk-O3YUNJZ2.js → chunk-2ZSONWVL.js} +82 -25
  18. package/dist/{chunk-2NHR3NAY.js → chunk-36CT5VVL.js} +331 -42
  19. package/dist/{chunk-2X4RYJTJ.js → chunk-3GY4F45V.js} +3 -3
  20. package/dist/{chunk-ZW55JB7N.js → chunk-3ODX73FK.js} +4 -6
  21. package/dist/{chunk-PBP4B7XR.js → chunk-3UNOLWNZ.js} +3 -3
  22. package/dist/{chunk-4JDLP6ZS.js → chunk-3UUXNFEX.js} +14 -10
  23. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  24. package/dist/{chunk-ZW4HH5JJ.js → chunk-4M6Z5QVF.js} +6 -6
  25. package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
  26. package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
  27. package/dist/{chunk-FSP7CMNU.js → chunk-54X7T7DK.js} +61 -6
  28. package/dist/{chunk-54ODD65L.js → chunk-5636DCO5.js} +4 -4
  29. package/dist/chunk-57XXR6DR.js +3763 -0
  30. package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
  31. package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
  32. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  33. package/dist/{chunk-YJISEZKC.js → chunk-5TUB6SLS.js} +6 -6
  34. package/dist/{chunk-IMXMHHMQ.js → chunk-6OSVSQL5.js} +341 -57
  35. package/dist/{chunk-Q4XWMHX6.js → chunk-6PAZTBPA.js} +14 -2
  36. package/dist/{chunk-FVDGR2ZL.js → chunk-6Q3CYFD3.js} +112 -39
  37. package/dist/{chunk-IDNA72AH.js → chunk-6QOTUPRG.js} +155 -36
  38. package/dist/{chunk-X7IARSHT.js → chunk-6UINWWS6.js} +16 -10
  39. package/dist/{chunk-CYZW7JHJ.js → chunk-72YIHOZQ.js} +9 -9
  40. package/dist/{chunk-IKSLQ4XV.js → chunk-75W7L2E2.js} +752 -861
  41. package/dist/{chunk-CRFOIAX3.js → chunk-7UGL4MB5.js} +6 -6
  42. package/dist/{chunk-HIICAHCJ.js → chunk-AUPNRN7C.js} +2 -2
  43. package/dist/{chunk-7BHIY2MW.js → chunk-BJVFZO5U.js} +8 -50
  44. package/dist/{chunk-B74PXLU7.js → chunk-CUSRQKPU.js} +65 -3
  45. package/dist/chunk-DQOVN6KV.js +386 -0
  46. package/dist/{chunk-E7GT7O5N.js → chunk-DT3LWJOB.js} +7 -4
  47. package/dist/chunk-DXKJURES.js +671 -0
  48. package/dist/{chunk-JBCS7CRR.js → chunk-EL24TAU4.js} +10 -10
  49. package/dist/{chunk-TPEQIQIE.js → chunk-ELWDPP3Y.js} +8 -8
  50. package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
  51. package/dist/chunk-EXLD33WO.js +381 -0
  52. package/dist/chunk-FEAXX7B6.js +101 -0
  53. package/dist/{chunk-RLYRBIYQ.js → chunk-FFUPXJC4.js} +90 -331
  54. package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
  55. package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
  56. package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
  57. package/dist/chunk-GX5WYQO4.js +59 -0
  58. package/dist/chunk-GYV6VZOC.js +26 -0
  59. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  60. package/dist/chunk-I2DWJ4GM.js +390 -0
  61. package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
  62. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  63. package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
  64. package/dist/chunk-IRXAATOX.js +539 -0
  65. package/dist/chunk-IXIY2H4R.js +44 -0
  66. package/dist/{chunk-SSEYRH53.js → chunk-IZXGRF7P.js} +92 -147
  67. package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
  68. package/dist/{chunk-JWJGP5DQ.js → chunk-JEIYHLOR.js} +7 -7
  69. package/dist/{chunk-F2I26BDK.js → chunk-JQLNNIKT.js} +4 -4
  70. package/dist/{chunk-BYMNWQ7O.js → chunk-JSD46VO2.js} +315 -63
  71. package/dist/{chunk-AK5XEFVZ.js → chunk-JT2RFCC5.js} +64 -14
  72. package/dist/{chunk-MCMZMDAC.js → chunk-K6T2ZAMZ.js} +168 -6
  73. package/dist/{chunk-PGF63K6I.js → chunk-KFV5L5SK.js} +73 -4
  74. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  75. package/dist/{chunk-PJX3WQUQ.js → chunk-LLXSDWXS.js} +3 -3
  76. package/dist/{chunk-DZAW46HP.js → chunk-LTIKRKFL.js} +3 -3
  77. package/dist/{chunk-DZEK6CJN.js → chunk-N56KALIC.js} +21 -21
  78. package/dist/{chunk-B7HM5Z7T.js → chunk-NAI6ZFCY.js} +9 -5
  79. package/dist/{chunk-I66ZTYNP.js → chunk-NRO2BJRH.js} +2656 -2213
  80. package/dist/{chunk-ZGNYYXQ6.js → chunk-NXIMQY5W.js} +3 -3
  81. package/dist/{chunk-IKOZFYBN.js → chunk-NXYCB2VD.js} +149 -106
  82. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  83. package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
  84. package/dist/chunk-ODGTEFFI.js +50 -0
  85. package/dist/{chunk-3F7VUY77.js → chunk-OEJSLEPW.js} +2 -2
  86. package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
  87. package/dist/{chunk-5KW52TEP.js → chunk-Q4WO54TA.js} +132 -77
  88. package/dist/{chunk-W6NIE6OW.js → chunk-QUFRYSWI.js} +13 -7
  89. package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
  90. package/dist/chunk-R6Q67RJH.js +134 -0
  91. package/dist/{chunk-W4YEMFBX.js → chunk-RAY4OVGZ.js} +3 -3
  92. package/dist/{chunk-ZNT2M6TG.js → chunk-RQCKCSRL.js} +17 -17
  93. package/dist/{chunk-LJID3DYZ.js → chunk-RXTN6AKH.js} +3 -3
  94. package/dist/{chunk-P75RZCJW.js → chunk-RZDWV63N.js} +3 -3
  95. package/dist/{chunk-UH632ZYL.js → chunk-S6PYF2XF.js} +2 -2
  96. package/dist/{chunk-HJWWJ6IL.js → chunk-TOIVGRUX.js} +17 -5
  97. package/dist/{chunk-HLAFFSEK.js → chunk-TQAHXW6Y.js} +2 -2
  98. package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
  99. package/dist/{chunk-2HFQNRV3.js → chunk-UEPWCCTY.js} +12 -12
  100. package/dist/chunk-UOIZ7DA4.js +41 -0
  101. package/dist/{chunk-UH347SHR.js → chunk-USR47QNF.js} +11 -11
  102. package/dist/{chunk-AZ4WMN4W.js → chunk-V6HJFQZE.js} +2 -2
  103. package/dist/chunk-V76WTFTW.js +318 -0
  104. package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
  105. package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
  106. package/dist/{chunk-UBRFI4HS.js → chunk-XULDXHTN.js} +142 -50
  107. package/dist/chunk-XXYSBZIQ.js +283 -0
  108. package/dist/{chunk-HKMD33FO.js → chunk-Y55JBDO5.js} +405 -122
  109. package/dist/{chunk-XOXV5GKE.js → chunk-YD5GIKET.js} +17 -8
  110. package/dist/{chunk-XGDPUNND.js → chunk-YECAMM3D.js} +2 -2
  111. package/dist/{chunk-BO7Y52RY.js → chunk-YNFKXPEC.js} +7 -7
  112. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  113. package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
  114. package/dist/cli/index.js +42 -40
  115. package/dist/{clio-7VB377CC.js → clio-QLICPCF5.js} +7 -7
  116. package/dist/{code-nav-YVLCYA7V.js → code-nav-IJR2DBPR.js} +9 -9
  117. package/dist/{components-UBWCQSRW.js → components-2TGAI2RC.js} +5 -6
  118. package/dist/{config-4HVOS65E.js → config-IUA6OYNS.js} +88 -81
  119. package/dist/{configure-PIWO7B24.js → configure-VEPX4NMX.js} +26 -25
  120. package/dist/{context-KQYIWPWT.js → context-2DKHWH2T.js} +60 -45
  121. package/dist/{context-IYEHL3WQ.js → context-4MPR7WKB.js} +78 -69
  122. package/dist/{context-N6ZE3LGJ.js → context-BOYF5EJM.js} +15 -11
  123. package/dist/{context-clear-G4OGZJDS.js → context-clear-S4ZJCQUX.js} +73 -65
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-BWLF6LJP.js → context-working-set-3I3FYX6Y.js} +18 -17
  126. package/dist/detail-A7JAVSIG.js +98 -0
  127. package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-RJ5I2F2O.js} +99 -75
  128. package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
  129. package/dist/{doctor-LHBD36VU.js → doctor-DKICC2SN.js} +71 -48
  130. package/dist/{eval-C45FYRJ6.js → eval-OQOQUDHK.js} +308 -146
  131. package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
  132. package/dist/{evidence-6SHONYAF.js → evidence-4DQ25GUQ.js} +79 -175
  133. package/dist/evidence-4F5USFKH.js +208 -0
  134. package/dist/{evolve-KRKMV72X.js → evolve-GSS52E5J.js} +71 -67
  135. package/dist/{extensions-KPZ2UHBB.js → extensions-G7MFLYHT.js} +8 -9
  136. package/dist/{fleet-IVTCKDHT.js → fleet-Q37YHHAQ.js} +126 -118
  137. package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-G7E4N7SM.js} +16 -13
  138. package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-O7M6QBA2.js} +9 -8
  139. package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-TOUBW6OW.js} +21 -20
  140. package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-SW33JJNI.js} +65 -60
  141. package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-CV2655TW.js} +4 -5
  142. package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-KESZX2YH.js} +25 -24
  143. package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-UQPMTVE3.js} +66 -61
  144. package/dist/{fleet-view-TWHJKCN6.js → fleet-view-MN2VG4MR.js} +65 -60
  145. package/dist/{init-T2QORQ3Y.js → init-PXEXQSBF.js} +90 -82
  146. package/dist/{interop-IN5I2A66.js → interop-ZG5T62U3.js} +12 -13
  147. package/dist/inventory-C26CFDRR.js +101 -0
  148. package/dist/{library-LSCATDLZ.js → library-B2W4N74O.js} +29 -29
  149. package/dist/{memory-HYOKAGGJ.js → memory-YCANYS5A.js} +73 -69
  150. package/dist/{models-2GPMFYCM.js → models-GERTU3YI.js} +51 -47
  151. package/dist/{monitor-E4ASVUJH.js → monitor-CPNIUULB.js} +74 -67
  152. package/dist/{orchestrator-DDMPR3PY.js → orchestrator-J4BSH4WQ.js} +1288 -1606
  153. package/dist/{panes-E3RUXOW5.js → panes-BOHAEGYC.js} +4 -4
  154. package/dist/{panes-IXKLOKA2.js → panes-NXSLDQZ2.js} +10 -11
  155. package/dist/{paths-L7LGY6RN.js → paths-VSUWNC22.js} +6 -7
  156. package/dist/reset-TNWTB5LU.js +343 -0
  157. package/dist/{resources-OTRSN34L.js → resources-4PXNMD5G.js} +29 -22
  158. package/dist/{run-5DEYH5QK.js → run-D6XJ34CN.js} +132 -132
  159. package/dist/{share-IHWTLO3M.js → share-2NWMJJEE.js} +27 -27
  160. package/dist/{skills-IYMXMKW4.js → skills-KR7WON5G.js} +40 -33
  161. package/dist/{skills-eval-DROHSJAR.js → skills-eval-O2ZNOLDS.js} +81 -77
  162. package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-ZZOUBK7O.js} +23 -22
  163. package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-ZXPJD64J.js} +47 -37
  164. package/dist/{steer-Z5DO23FJ.js → steer-XA25PSCS.js} +4 -4
  165. package/dist/{support-U7QOWY26.js → support-7EMVWYG2.js} +6 -6
  166. package/dist/{targets-P2FUC4IL.js → targets-OMH2XCSN.js} +50 -49
  167. package/dist/tasks-IPAGMEIX.js +36 -0
  168. package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-C2J3JYRE.js} +4 -4
  169. package/dist/{tools-5B7RO6MV.js → tools-EFFEAIDP.js} +8 -9
  170. package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
  171. package/dist/uninstall-HALS6BLF.js +407 -0
  172. package/dist/upgrade-MS72RJEP.js +306 -0
  173. package/dist/{usage-ME5MPXGX.js → usage-NHG6MCJM.js} +162 -108
  174. package/dist/{verifiers-BVZ7IWOO.js → verifiers-7AUNVXDY.js} +155 -22
  175. package/dist/{verify-5K7ZKQFC.js → verify-FWYGPKMR.js} +14 -12
  176. package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
  177. package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-743CIGJW.js} +99 -90
  178. package/dist/{with-panes-BYOJCLAM.js → with-panes-BDQEWBRT.js} +10 -10
  179. package/dist/worker/entry.js +72 -68
  180. package/docs/README.md +3 -2
  181. package/docs/architecture/acp.md +17 -0
  182. package/docs/architecture/artifact-placement.md +1 -0
  183. package/docs/architecture/artifact-versions.md +2 -2
  184. package/docs/architecture/context-engine.md +4 -0
  185. package/docs/architecture/dispatch-typed-intent.md +1 -1
  186. package/docs/architecture/evidence-and-memory.md +1 -1
  187. package/docs/architecture/middleware-and-components.md +1 -1
  188. package/docs/architecture/model-catalog.md +21 -10
  189. package/docs/architecture/observability.md +19 -2
  190. package/docs/architecture/prompt-envelope-and-tools.md +17 -5
  191. package/docs/architecture/provider-adapter-cookbook.md +63 -0
  192. package/docs/architecture/safety-model.md +25 -22
  193. package/docs/architecture/tui-design.md +1 -1
  194. package/docs/guide/built-in-agents.md +25 -11
  195. package/docs/guide/commands-and-modes.md +18 -3
  196. package/docs/guide/configuration-and-targets.md +100 -10
  197. package/docs/guide/configuration-reference.md +17 -7
  198. package/docs/guide/environment-variables.md +4 -2
  199. package/docs/guide/installation-and-lifecycle.md +37 -4
  200. package/docs/guide/proactive-memory.md +66 -55
  201. package/docs/guide/skills-marketplace.md +18 -0
  202. package/docs/guide/tool-usage.md +78 -3
  203. package/docs/history/config-knobs-audit.md +2 -2
  204. package/docs/process/development-pipeline.md +40 -2
  205. package/docs/process/eval-runner.md +67 -3
  206. package/docs/process/git-commit-provenance.md +15 -0
  207. package/docs/process/release-cut-checklist.md +207 -0
  208. package/docs/process/scientific-validation.md +18 -17
  209. package/evals/behavioral-machinery-support.ts +1 -0
  210. package/evals/behavioral-machinery.yaml +1 -1
  211. package/evals/behavioral-model.yaml +3 -2
  212. package/package.json +2 -2
  213. package/skills/README.md +7 -5
  214. package/skills/coding/ast-grep/SKILL.md +101 -30
  215. package/skills/coding/ast-grep/evals.md +26 -0
  216. package/skills/coding/coding-standards/SKILL.md +47 -2
  217. package/skills/coding/coding-standards/evals.md +23 -0
  218. package/skills/coding/prototype/SKILL.md +87 -28
  219. package/skills/coding/prototype/evals.md +19 -0
  220. package/skills/coding/tdd/SKILL.md +80 -53
  221. package/skills/coding/tdd/evals.md +20 -0
  222. package/skills/context/context-handoff/SKILL.md +43 -2
  223. package/skills/context/context-handoff/evals.md +44 -0
  224. package/skills/context/context-prime/SKILL.md +45 -15
  225. package/skills/context/context-prime/evals.md +45 -0
  226. package/skills/git/branch-closeout/SKILL.md +132 -0
  227. package/skills/git/branch-closeout/evals.md +133 -0
  228. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  229. package/skills/git/file-ticket/SKILL.md +77 -63
  230. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  231. package/skills/git/file-ticket/evals.md +31 -26
  232. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  233. package/skills/git/fix-issue/SKILL.md +87 -64
  234. package/skills/git/fix-issue/evals.md +35 -31
  235. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  236. package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
  237. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  238. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  239. package/skills/git/ship/SKILL.md +103 -67
  240. package/skills/git/ship/assets/pr-template.md +21 -0
  241. package/skills/git/ship/evals.md +44 -28
  242. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  243. package/skills/git/worktree-create/SKILL.md +80 -50
  244. package/skills/git/worktree-create/evals.md +40 -33
  245. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  246. package/skills/git/worktree-merge/SKILL.md +112 -65
  247. package/skills/git/worktree-merge/evals.md +42 -34
  248. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  249. package/skills/planning/archify/SKILL.md +196 -0
  250. package/skills/planning/archify/evals.md +65 -0
  251. package/skills/planning/architecture/SKILL.md +61 -12
  252. package/skills/planning/architecture/evals.md +65 -0
  253. package/skills/planning/backlog/SKILL.md +130 -14
  254. package/skills/planning/backlog/evals.md +142 -0
  255. package/skills/planning/prd/SKILL.md +47 -6
  256. package/skills/planning/prd/evals.md +54 -0
  257. package/skills/planning/product-intent/SKILL.md +57 -2
  258. package/skills/planning/product-intent/evals.md +70 -0
  259. package/skills/planning/tech-spec/SKILL.md +53 -2
  260. package/skills/planning/tech-spec/evals.md +73 -0
  261. package/skills/registry.yaml +58 -50
  262. package/skills/remote.yaml +13 -0
  263. package/skills/research/arxiv-literature/SKILL.md +76 -18
  264. package/skills/research/arxiv-literature/evals.md +50 -0
  265. package/skills/research/experiment-protocol/SKILL.md +20 -1
  266. package/skills/research/experiment-protocol/evals.md +23 -0
  267. package/skills/research/scientific-debugging/SKILL.md +24 -1
  268. package/skills/research/scientific-debugging/evals.md +18 -0
  269. package/skills/research/scientific-modernization/SKILL.md +26 -1
  270. package/skills/research/scientific-modernization/evals.md +27 -0
  271. package/skills/skill-marketplace.json +63 -28
  272. package/skills/workflow/cut-it/SKILL.md +64 -5
  273. package/skills/workflow/cut-it/evals.md +101 -0
  274. package/skills/workflow/design-council/SKILL.md +112 -27
  275. package/skills/workflow/design-council/evals.md +161 -0
  276. package/skills/workflow/grill-me/SKILL.md +85 -10
  277. package/skills/workflow/grill-me/evals.md +153 -0
  278. package/skills/workflow/workflow-distiller/SKILL.md +76 -17
  279. package/skills/workflow/workflow-distiller/evals.md +118 -0
  280. package/src/cli/args.ts +0 -8
  281. package/src/cli/configure-interop.ts +105 -13
  282. package/src/cli/configure-oauth.ts +57 -0
  283. package/src/cli/configure-onboarding.ts +980 -0
  284. package/src/cli/configure-target.ts +594 -0
  285. package/src/cli/configure.ts +1084 -529
  286. package/src/cli/context-map.ts +114 -0
  287. package/src/cli/context.ts +4 -0
  288. package/src/cli/doctor-state-size.ts +1 -12
  289. package/src/cli/doctor-validation-contract.ts +28 -0
  290. package/src/cli/doctor.ts +5 -0
  291. package/src/cli/evidence-detail.ts +1 -75
  292. package/src/cli/evidence-inventory.ts +1 -167
  293. package/src/cli/index.ts +3 -0
  294. package/src/cli/lifecycle-presenter.ts +436 -0
  295. package/src/cli/models.ts +10 -2
  296. package/src/cli/modes/print.ts +5 -1
  297. package/src/cli/reset.ts +228 -106
  298. package/src/cli/run.ts +7 -4
  299. package/src/cli/select.ts +664 -0
  300. package/src/cli/skills.ts +9 -2
  301. package/src/cli/targets.ts +3 -0
  302. package/src/cli/tasks.ts +84 -0
  303. package/src/cli/uninstall.ts +233 -165
  304. package/src/cli/upgrade.ts +210 -150
  305. package/src/cli/usage.ts +92 -27
  306. package/src/cli/validate-model.ts +3 -3
  307. package/src/cli/verifiers.ts +147 -1
  308. package/src/cli/wiki-generate.ts +1 -0
  309. package/src/core/commit-attribution.ts +41 -1
  310. package/src/core/config.ts +56 -0
  311. package/src/core/external-diagnostic.ts +44 -0
  312. package/src/core/gateway-routing.ts +157 -0
  313. package/src/core/git-commit-attribution.ts +46 -3
  314. package/src/core/run-overrides.ts +0 -5
  315. package/src/core/safe-exec.ts +17 -2
  316. package/src/core/skill-activation.ts +92 -2
  317. package/src/core/tool-names.ts +5 -2
  318. package/src/domains/agents/builtins/architect.md +1 -1
  319. package/src/domains/agents/builtins/coder.md +1 -1
  320. package/src/domains/agents/builtins/documenter.md +1 -1
  321. package/src/domains/agents/builtins/git-master.md +1 -1
  322. package/src/domains/agents/builtins/provenance.md +7 -7
  323. package/src/domains/agents/builtins/tester.md +1 -1
  324. package/src/domains/agents/builtins/verifier.md +2 -2
  325. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  326. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  327. package/src/domains/agents/catalog.ts +1 -1
  328. package/src/domains/agents/result-contract.ts +70 -0
  329. package/src/domains/context/extension.ts +31 -7
  330. package/src/domains/context/refresh.ts +3 -0
  331. package/src/domains/context/wiki/frontmatter.ts +5 -2
  332. package/src/domains/context/wiki/generate.ts +6 -0
  333. package/src/domains/context/wiki/map-seed.ts +589 -0
  334. package/src/domains/context/wiki/plan.ts +2 -2
  335. package/src/domains/context/wiki/prompts.ts +43 -0
  336. package/src/domains/dispatch/active-route-planner.ts +4 -0
  337. package/src/domains/dispatch/admission.ts +29 -0
  338. package/src/domains/dispatch/agent-candidates.ts +10 -0
  339. package/src/domains/dispatch/budget-envelope.ts +86 -1
  340. package/src/domains/dispatch/capability-match.ts +1 -0
  341. package/src/domains/dispatch/capacity-lease.ts +17 -0
  342. package/src/domains/dispatch/code-step.ts +11 -4
  343. package/src/domains/dispatch/contract.ts +42 -8
  344. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  345. package/src/domains/dispatch/extension.ts +184 -56
  346. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  347. package/src/domains/dispatch/fleet-run.ts +1 -0
  348. package/src/domains/dispatch/host-verification.ts +114 -13
  349. package/src/domains/dispatch/intent.ts +28 -18
  350. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  351. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  352. package/src/domains/dispatch/reservation-store.ts +5 -3
  353. package/src/domains/dispatch/state.ts +15 -2
  354. package/src/domains/dispatch/types.ts +20 -2
  355. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  356. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  357. package/src/domains/eval/metrics/token-stream.ts +201 -31
  358. package/src/domains/eval/metrics/tracked.ts +40 -4
  359. package/src/domains/eval/runners/clio-run.ts +17 -11
  360. package/src/domains/eval/runners/context-index.ts +2 -7
  361. package/src/domains/eval/runners/context-init.ts +3 -6
  362. package/src/domains/eval/runners/external-command.ts +29 -11
  363. package/src/domains/eval/schema/suite.ts +28 -0
  364. package/src/domains/eval/schema/verdict.ts +2 -2
  365. package/src/domains/eval/suites/resolve.ts +13 -1
  366. package/src/domains/eval/suites/run.ts +24 -3
  367. package/src/domains/evidence/build.ts +102 -15
  368. package/src/domains/evidence/detail.ts +69 -0
  369. package/src/domains/evidence/eval.ts +13 -1
  370. package/src/domains/evidence/finish-contract-map.ts +5 -1
  371. package/src/domains/evidence/inventory.ts +167 -0
  372. package/src/domains/evidence/store.ts +16 -0
  373. package/src/domains/evidence/types.ts +12 -0
  374. package/src/domains/extensions/resources.ts +7 -0
  375. package/src/domains/interop/registry.ts +6 -2
  376. package/src/domains/interop/types.ts +4 -0
  377. package/src/domains/lifecycle/migrations/index.ts +4 -0
  378. package/src/domains/memory/task-memory-policy.ts +70 -26
  379. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  380. package/src/domains/middleware/index.ts +0 -1
  381. package/src/domains/middleware/marketplace-offer.ts +22 -35
  382. package/src/domains/middleware/memory-intervention.ts +127 -32
  383. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  384. package/src/domains/middleware/runtime.ts +7 -3
  385. package/src/domains/middleware/skills-reminder.ts +31 -2
  386. package/src/domains/mux/detect.ts +3 -6
  387. package/src/domains/observability/accountability.ts +15 -1
  388. package/src/domains/observability/compaction-usage.ts +118 -0
  389. package/src/domains/observability/contract.ts +52 -7
  390. package/src/domains/observability/cost.ts +1 -1
  391. package/src/domains/observability/evidence-index.ts +10 -0
  392. package/src/domains/observability/extension.ts +15 -6
  393. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  394. package/src/domains/observability/projection.ts +394 -45
  395. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  396. package/src/domains/prompts/fragments/operating/contract.md +2 -0
  397. package/src/domains/prompts/fragments/wiki/page.md +8 -0
  398. package/src/domains/providers/contract.ts +4 -1
  399. package/src/domains/providers/extension.ts +40 -9
  400. package/src/domains/providers/model-capabilities.ts +9 -0
  401. package/src/domains/providers/model-discovery.ts +3 -4
  402. package/src/domains/providers/model-runtime-capabilities.ts +15 -5
  403. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +48 -26
  404. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  405. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  406. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  407. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  408. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  409. package/src/domains/providers/support.ts +11 -5
  410. package/src/domains/providers/target-model-cache.ts +25 -2
  411. package/src/domains/providers/types/capability-flags.ts +2 -0
  412. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  413. package/src/domains/providers/types/target-descriptor.ts +19 -0
  414. package/src/domains/resources/index.ts +3 -0
  415. package/src/domains/resources/skills/install.ts +72 -7
  416. package/src/domains/resources/skills/loader.ts +7 -0
  417. package/src/domains/resources/skills/marketplace.ts +63 -11
  418. package/src/domains/safety/action-classifier.ts +7 -0
  419. package/src/domains/safety/autonomy.ts +15 -0
  420. package/src/domains/safety/default-path-policy.ts +2 -0
  421. package/src/domains/safety/finish-contract-registration.ts +29 -14
  422. package/src/domains/safety/finish-contract.ts +252 -40
  423. package/src/domains/safety/index.ts +21 -1
  424. package/src/domains/safety/path-policy.ts +1 -1
  425. package/src/domains/safety/policy-engine.ts +60 -17
  426. package/src/domains/safety/protected-artifacts.ts +191 -88
  427. package/src/domains/safety/rigor.ts +53 -39
  428. package/src/domains/safety/run-effects.ts +2 -22
  429. package/src/domains/safety/skill-authority.ts +55 -0
  430. package/src/domains/safety/validation-contract.ts +388 -0
  431. package/src/domains/session/archive-readers.ts +10 -1
  432. package/src/domains/session/compaction/compact.ts +72 -22
  433. package/src/domains/session/decision-board.ts +101 -2
  434. package/src/domains/session/entries.ts +50 -7
  435. package/src/domains/session/extension.ts +4 -4
  436. package/src/domains/session/handoff.ts +2 -1
  437. package/src/domains/session/manager.ts +2 -3
  438. package/src/domains/session/task-board.ts +14 -1
  439. package/src/domains/session/tree/fork.ts +1 -2
  440. package/src/domains/session/tree/navigator.ts +1 -1
  441. package/src/domains/session/usage.ts +3 -3
  442. package/src/domains/user-tasks/acceptance.ts +56 -0
  443. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  444. package/src/domains/user-tasks/store.ts +34 -3
  445. package/src/engine/acp/adapter.ts +24 -6
  446. package/src/engine/acp/server.ts +21 -4
  447. package/src/engine/acp/transport.ts +53 -8
  448. package/src/engine/acp/types.ts +4 -0
  449. package/src/engine/agent.ts +13 -3
  450. package/src/engine/ai.ts +26 -8
  451. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  452. package/src/engine/api-registry.ts +3 -0
  453. package/src/engine/apis/ollama-native.ts +15 -0
  454. package/src/engine/apis/openai-completions.ts +117 -14
  455. package/src/engine/claude/subprocess-runtime.ts +107 -60
  456. package/src/engine/external-subprocess.ts +122 -6
  457. package/src/entry/background-model-metadata.ts +18 -0
  458. package/src/entry/compaction-prompt.ts +57 -0
  459. package/src/entry/orchestrator.ts +416 -218
  460. package/src/entry/task-memory-lifecycle.ts +35 -0
  461. package/src/interactive/chat-loop-messages.ts +13 -4
  462. package/src/interactive/chat-loop.ts +65 -2
  463. package/src/interactive/chat-renderer.ts +1 -0
  464. package/src/interactive/cost-overlay.ts +26 -2
  465. package/src/interactive/dispatch-board.ts +46 -717
  466. package/src/interactive/fleet-run-preview.ts +2 -1
  467. package/src/interactive/interactive-application.ts +3 -2
  468. package/src/interactive/interactive-presentation.ts +55 -12
  469. package/src/interactive/interactive-slash-runtime.ts +4 -2
  470. package/src/interactive/oracle.ts +5 -2
  471. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  472. package/src/interactive/overlays/message-picker.ts +2 -2
  473. package/src/interactive/overlays/settings.ts +2 -2
  474. package/src/interactive/overlays/tree-selector.ts +2 -2
  475. package/src/interactive/renderers/branch-summary.ts +1 -1
  476. package/src/interactive/renderers/worker-entry.ts +32 -0
  477. package/src/interactive/slash-autocomplete.ts +4 -6
  478. package/src/interactive/slash-commands.ts +49 -45
  479. package/src/interactive/slash-spec.ts +28 -0
  480. package/src/interactive/theme/labels.ts +19 -13
  481. package/src/interactive/turn-context.ts +9 -5
  482. package/src/interactive/turn-recovery.ts +8 -0
  483. package/src/interactive/turn-runtime.ts +27 -11
  484. package/src/interactive/turn-state.ts +7 -0
  485. package/src/interactive/view/artifacts.ts +2 -0
  486. package/src/interactive/worker-receipts.ts +1 -0
  487. package/src/interactive/worker-stream.ts +13 -4
  488. package/src/tools/bootstrap.ts +4 -0
  489. package/src/tools/builtin-tool-catalog.ts +31 -0
  490. package/src/tools/compete-worktrees.ts +7 -1
  491. package/src/tools/context/index.ts +30 -9
  492. package/src/tools/core-bootstrap.ts +16 -0
  493. package/src/tools/decide.ts +136 -0
  494. package/src/tools/dispatch-admission.ts +21 -0
  495. package/src/tools/dispatch-arguments.ts +1 -0
  496. package/src/tools/dispatch-event-text.ts +10 -0
  497. package/src/tools/dispatch-plan.ts +6 -2
  498. package/src/tools/dispatch-runner.ts +27 -1
  499. package/src/tools/dispatch-types.ts +6 -0
  500. package/src/tools/evidence.ts +96 -0
  501. package/src/tools/limitation.ts +76 -0
  502. package/src/tools/policy.ts +9 -0
  503. package/src/tools/presentation.ts +3 -0
  504. package/src/tools/registry.ts +11 -5
  505. package/src/tools/result-shaping.ts +17 -5
  506. package/src/tools/task-worktree.ts +13 -3
  507. package/src/tools/tasks.ts +10 -1
  508. package/src/tools/verify/authoring.ts +170 -83
  509. package/src/tools/verify/catalog.ts +122 -5
  510. package/src/tools/verify/index.ts +2 -1
  511. package/src/tools/verify/numeric.ts +298 -0
  512. package/src/tools/verify/perf.ts +143 -0
  513. package/src/tools/verify/scripts.ts +229 -2
  514. package/src/tools/worker-evidence.ts +3 -1
  515. package/src/worker/spec-contract.ts +4 -0
  516. package/dist/chunk-2Z2IKEXI.js +0 -1554
  517. package/dist/chunk-RVG5JXAL.js +0 -41
  518. package/dist/chunk-T56WDKA5.js +0 -183
  519. package/dist/chunk-VN3SHNBN.js +0 -313
  520. package/dist/chunk-VPKWYKEY.js +0 -169
  521. package/dist/reset-OAQP3W4O.js +0 -230
  522. package/dist/uninstall-N34PCTGJ.js +0 -331
  523. package/dist/upgrade-PXK3S2YM.js +0 -325
@@ -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);
@@ -41,6 +41,7 @@ import { mergeSamplingOverride } from "./sampling-overrides.js";
41
41
  import type { EngineApiProvider } from "./types.js";
42
42
 
43
43
  const REASONING_CHARS_PER_TOKEN = 4;
44
+ const ownedModelsByTarget = new Map<string, Set<string>>();
44
45
 
45
46
  interface ClioRuntimeMetadata {
46
47
  clioCoder?: {
@@ -293,7 +294,10 @@ async function listResidentOllamaModels(client: OllamaEvictClient): Promise<Resi
293
294
  * weights release.
294
295
  */
295
296
  async function unloadOllamaModel(baseUrl: string, modelId: string, headers?: Record<string, string>): Promise<void> {
297
+ const owned = ownedModelsByTarget.get(residencyTargetKey("ollama-native", baseUrl));
298
+ if (!owned?.has(modelId)) return;
296
299
  await ollamaEvictClient(baseUrl, headers).generate({ model: modelId, prompt: "", keep_alive: 0, stream: false });
300
+ owned.delete(modelId);
297
301
  }
298
302
 
299
303
  function mapStopReason(reason: string | undefined, hadToolCall: boolean): AssistantMessage["stopReason"] {
@@ -466,8 +470,19 @@ function runStream(
466
470
  else emitText(segment.content);
467
471
  }
468
472
  };
473
+ let recordedOwnership = false;
469
474
  for await (const chunk of iterator) {
470
475
  const response = chunk as ChatResponse;
476
+ if (!recordedOwnership && model.baseUrl) {
477
+ const targetKey = residencyTargetKey("ollama-native", model.baseUrl);
478
+ let owned = ownedModelsByTarget.get(targetKey);
479
+ if (!owned) {
480
+ owned = new Set<string>();
481
+ ownedModelsByTarget.set(targetKey, owned);
482
+ }
483
+ owned.add(response.model || model.id);
484
+ recordedOwnership = true;
485
+ }
471
486
  const msg = response.message;
472
487
  if (msg?.thinking && msg.thinking.length > 0) {
473
488
  emitThinking(msg.thinking);