@iowarp/clio-coder 0.4.2 → 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 (369) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/CONTRIBUTING.md +86 -19
  3. package/README.md +35 -6
  4. package/dist/{acp-TMDQZDIG.js → acp-H2NGRPWO.js} +11 -11
  5. package/dist/{agents-5N5NG3XG.js → agents-TL5LLUQP.js} +54 -53
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-Z5CCBXKQ.js → auth-E5SW4HMS.js} +19 -16
  8. package/dist/{builtins-K6TNDT24.js → builtins-IA7V7FUC.js} +9 -4
  9. package/dist/{chunk-ZW4HH5JJ.js → chunk-2APPQIER.js} +6 -6
  10. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  11. package/dist/{chunk-UBRFI4HS.js → chunk-2UG5F4C5.js} +127 -47
  12. package/dist/{chunk-UH632ZYL.js → chunk-2UH2KFUP.js} +2 -2
  13. package/dist/{chunk-3F7VUY77.js → chunk-2VIKGWFZ.js} +2 -2
  14. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  15. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  16. package/dist/{chunk-2X4RYJTJ.js → chunk-4UVU7BJ5.js} +2 -2
  17. package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
  18. package/dist/{chunk-5KW52TEP.js → chunk-54CBCGIR.js} +5 -5
  19. package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
  20. package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
  21. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  22. package/dist/{chunk-LJID3DYZ.js → chunk-64I3JVYM.js} +2 -2
  23. package/dist/{chunk-4JDLP6ZS.js → chunk-6PTFB5VS.js} +7 -7
  24. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  25. package/dist/{chunk-HLAFFSEK.js → chunk-7DRAWPTZ.js} +2 -2
  26. package/dist/chunk-7E7I3WLS.js +3762 -0
  27. package/dist/{chunk-YJISEZKC.js → chunk-7ZYNNDKC.js} +6 -6
  28. package/dist/{chunk-I66ZTYNP.js → chunk-AF4YM7Z4.js} +236 -101
  29. package/dist/{chunk-2HFQNRV3.js → chunk-AX2THNSA.js} +12 -12
  30. package/dist/{chunk-PGF63K6I.js → chunk-B4OAX3SI.js} +65 -3
  31. package/dist/{chunk-W6NIE6OW.js → chunk-B4VEBZKF.js} +3 -3
  32. package/dist/{chunk-JBCS7CRR.js → chunk-BEPZRGGU.js} +10 -10
  33. package/dist/{chunk-XGDPUNND.js → chunk-CE5AX47J.js} +2 -2
  34. package/dist/{chunk-I64IFBLB.js → chunk-DWUOQKRU.js} +17 -10
  35. package/dist/{chunk-DZAW46HP.js → chunk-E3TPLWFX.js} +3 -3
  36. package/dist/{chunk-HIICAHCJ.js → chunk-EKCHAPYA.js} +2 -2
  37. package/dist/{chunk-XE3PCIXH.js → chunk-F5JHEYZM.js} +7 -7
  38. package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
  39. package/dist/{chunk-ZNT2M6TG.js → chunk-G76U63X4.js} +17 -17
  40. package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
  41. package/dist/{chunk-2NHR3NAY.js → chunk-GI7YYQ3F.js} +40 -34
  42. package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
  43. package/dist/chunk-GYV6VZOC.js +26 -0
  44. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  45. package/dist/{chunk-W4YEMFBX.js → chunk-HEQY7ZFI.js} +2 -2
  46. package/dist/{chunk-IKOZFYBN.js → chunk-I7ZPNEJM.js} +145 -102
  47. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  48. package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
  49. package/dist/chunk-IJNZMHLA.js +101 -0
  50. package/dist/{chunk-JWJGP5DQ.js → chunk-INY6HTFL.js} +7 -7
  51. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  52. package/dist/{chunk-B74PXLU7.js → chunk-IWT4SF4R.js} +3 -3
  53. package/dist/{chunk-B7HM5Z7T.js → chunk-JDAY6FIL.js} +5 -5
  54. package/dist/{chunk-PJX3WQUQ.js → chunk-JEQ3XTHC.js} +2 -2
  55. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  56. package/dist/{chunk-X7IARSHT.js → chunk-JKKCYP3C.js} +9 -9
  57. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  58. package/dist/{chunk-SSEYRH53.js → chunk-KK4JZPBQ.js} +19 -140
  59. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  60. package/dist/{chunk-Q4XWMHX6.js → chunk-L47TF46W.js} +2 -2
  61. package/dist/{chunk-O3YUNJZ2.js → chunk-LDJG7DW3.js} +81 -24
  62. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  63. package/dist/{chunk-F2I26BDK.js → chunk-MUW2BDDH.js} +4 -4
  64. package/dist/{chunk-HKMD33FO.js → chunk-MWUZBSAQ.js} +79 -76
  65. package/dist/{chunk-QQLGQY2A.js → chunk-N2Z7HLVY.js} +20 -20
  66. package/dist/{chunk-DZEK6CJN.js → chunk-NIQJ66N4.js} +19 -19
  67. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  68. package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
  69. package/dist/{chunk-TPEQIQIE.js → chunk-OML5D5V5.js} +8 -8
  70. package/dist/{chunk-IKSLQ4XV.js → chunk-PAJQJ7BS.js} +558 -216
  71. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  72. package/dist/{chunk-UH347SHR.js → chunk-QWGDJJYJ.js} +11 -11
  73. package/dist/chunk-R6Q67RJH.js +134 -0
  74. package/dist/{chunk-CRFOIAX3.js → chunk-RRNP2ANY.js} +6 -6
  75. package/dist/{chunk-IDNA72AH.js → chunk-RSJ25QSL.js} +2 -2
  76. package/dist/chunk-SKHCAU7K.js +385 -0
  77. package/dist/{chunk-RLYRBIYQ.js → chunk-TM6LQDI3.js} +20 -12
  78. package/dist/chunk-UOIZ7DA4.js +41 -0
  79. package/dist/{chunk-P75RZCJW.js → chunk-UPZU6GE4.js} +3 -3
  80. package/dist/{chunk-MCMZMDAC.js → chunk-V2ANDPVT.js} +4 -4
  81. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  82. package/dist/{chunk-IMXMHHMQ.js → chunk-VW6DOEDG.js} +332 -57
  83. package/dist/{chunk-XOXV5GKE.js → chunk-W6RRQCPQ.js} +16 -7
  84. package/dist/{chunk-CYZW7JHJ.js → chunk-WBKFA554.js} +8 -8
  85. package/dist/{chunk-BO7Y52RY.js → chunk-WCXUNS7U.js} +7 -7
  86. package/dist/{chunk-ZGNYYXQ6.js → chunk-WRBAGUNF.js} +3 -3
  87. package/dist/{chunk-FVDGR2ZL.js → chunk-XIVNBFZS.js} +85 -30
  88. package/dist/{chunk-BYMNWQ7O.js → chunk-XPWWI35G.js} +299 -58
  89. package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
  90. package/dist/{chunk-AZ4WMN4W.js → chunk-Y3CBHOR6.js} +2 -2
  91. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  92. package/dist/{chunk-54ODD65L.js → chunk-YQWYVTMC.js} +4 -4
  93. package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
  94. package/dist/{chunk-7BHIY2MW.js → chunk-ZDN3Y73Y.js} +6 -6
  95. package/dist/{chunk-E7GT7O5N.js → chunk-ZWPRK62N.js} +7 -4
  96. package/dist/cli/index.js +38 -37
  97. package/dist/{clio-7VB377CC.js → clio-CMMK4KRR.js} +7 -7
  98. package/dist/{code-nav-YVLCYA7V.js → code-nav-MDZNQS33.js} +7 -7
  99. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  100. package/dist/{config-4HVOS65E.js → config-SVM5P5YI.js} +76 -74
  101. package/dist/{configure-PIWO7B24.js → configure-LE3IK2TJ.js} +26 -24
  102. package/dist/{context-IYEHL3WQ.js → context-2OHRKS42.js} +66 -63
  103. package/dist/{context-N6ZE3LGJ.js → context-E3VC7RX5.js} +15 -11
  104. package/dist/{context-KQYIWPWT.js → context-VNCR7KAG.js} +60 -45
  105. package/dist/{context-clear-G4OGZJDS.js → context-clear-BW4O37TG.js} +61 -59
  106. package/dist/context-map-COB37XXN.js +505 -0
  107. package/dist/{context-working-set-BWLF6LJP.js → context-working-set-VDS25HXZ.js} +17 -16
  108. package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-5AHT53RF.js} +85 -74
  109. package/dist/{doctor-LHBD36VU.js → doctor-WNNVO6FY.js} +37 -37
  110. package/dist/{eval-C45FYRJ6.js → eval-7G7SGAYO.js} +285 -114
  111. package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
  112. package/dist/{evidence-6SHONYAF.js → evidence-VD6736FQ.js} +63 -62
  113. package/dist/{evolve-KRKMV72X.js → evolve-AL3NGVRL.js} +62 -61
  114. package/dist/{extensions-KPZ2UHBB.js → extensions-MOVJ32NM.js} +7 -7
  115. package/dist/{fleet-IVTCKDHT.js → fleet-QZHUMAGI.js} +110 -108
  116. package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-BAYT5FJZ.js} +10 -10
  117. package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-IREVMRU4.js} +7 -6
  118. package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-YCTT3HTI.js} +19 -18
  119. package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-QVJTDAVB.js} +55 -54
  120. package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-25QAFPK4.js} +4 -4
  121. package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-5O57AAJ7.js} +23 -22
  122. package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-CPH2W2T6.js} +56 -55
  123. package/dist/{fleet-view-TWHJKCN6.js → fleet-view-SWBR3VGQ.js} +55 -54
  124. package/dist/{init-T2QORQ3Y.js → init-J477LKZH.js} +78 -76
  125. package/dist/{interop-IN5I2A66.js → interop-3FCM6XLG.js} +11 -11
  126. package/dist/{library-LSCATDLZ.js → library-QUQEIUG6.js} +28 -27
  127. package/dist/{memory-HYOKAGGJ.js → memory-SGGSEP65.js} +64 -63
  128. package/dist/{models-2GPMFYCM.js → models-HEKUAXXK.js} +49 -43
  129. package/dist/{monitor-E4ASVUJH.js → monitor-HKU57TYQ.js} +61 -60
  130. package/dist/{orchestrator-DDMPR3PY.js → orchestrator-VDFAEFAI.js} +919 -546
  131. package/dist/{panes-E3RUXOW5.js → panes-DN2SSFOH.js} +3 -3
  132. package/dist/{panes-IXKLOKA2.js → panes-TALGNPZT.js} +8 -8
  133. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  134. package/dist/reset-EAJFFJVB.js +344 -0
  135. package/dist/{resources-OTRSN34L.js → resources-OVKSEFVE.js} +27 -20
  136. package/dist/{run-5DEYH5QK.js → run-7DP7ZF2J.js} +113 -109
  137. package/dist/{share-IHWTLO3M.js → share-WML67FT3.js} +26 -25
  138. package/dist/{skills-IYMXMKW4.js → skills-SG662R2K.js} +39 -31
  139. package/dist/{skills-eval-DROHSJAR.js → skills-eval-VVZEUU46.js} +74 -73
  140. package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-I2E23GET.js} +21 -20
  141. package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-S7MBJDQK.js} +35 -34
  142. package/dist/{steer-Z5DO23FJ.js → steer-2LQOMCPB.js} +3 -3
  143. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  144. package/dist/{targets-P2FUC4IL.js → targets-4QC3HIEW.js} +48 -45
  145. package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-TUHIJ6Y2.js} +2 -2
  146. package/dist/{tools-5B7RO6MV.js → tools-TFGJICCU.js} +8 -8
  147. package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
  148. package/dist/uninstall-5PEVOE5B.js +408 -0
  149. package/dist/upgrade-M4WXY6KN.js +303 -0
  150. package/dist/{usage-ME5MPXGX.js → usage-N7ZNVLEM.js} +147 -102
  151. package/dist/{verifiers-BVZ7IWOO.js → verifiers-DJTP4XX6.js} +15 -15
  152. package/dist/{verify-5K7ZKQFC.js → verify-RWE4PPEK.js} +9 -9
  153. package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-C7IQOXSP.js} +84 -82
  154. package/dist/{with-panes-BYOJCLAM.js → with-panes-4GCGSL7J.js} +9 -9
  155. package/dist/worker/entry.js +61 -60
  156. package/docs/architecture/artifact-placement.md +1 -0
  157. package/docs/architecture/artifact-versions.md +1 -1
  158. package/docs/architecture/context-engine.md +4 -0
  159. package/docs/architecture/middleware-and-components.md +1 -1
  160. package/docs/architecture/model-catalog.md +21 -10
  161. package/docs/architecture/observability.md +12 -1
  162. package/docs/architecture/prompt-envelope-and-tools.md +2 -0
  163. package/docs/architecture/provider-adapter-cookbook.md +63 -0
  164. package/docs/architecture/safety-model.md +15 -5
  165. package/docs/guide/built-in-agents.md +17 -3
  166. package/docs/guide/commands-and-modes.md +1 -1
  167. package/docs/guide/configuration-and-targets.md +97 -9
  168. package/docs/guide/configuration-reference.md +7 -2
  169. package/docs/guide/environment-variables.md +2 -0
  170. package/docs/guide/installation-and-lifecycle.md +37 -4
  171. package/docs/guide/proactive-memory.md +66 -55
  172. package/docs/guide/skills-marketplace.md +18 -0
  173. package/docs/process/development-pipeline.md +34 -1
  174. package/docs/process/eval-runner.md +67 -3
  175. package/evals/behavioral-model.yaml +3 -2
  176. package/package.json +2 -2
  177. package/skills/README.md +7 -5
  178. package/skills/coding/ast-grep/SKILL.md +101 -30
  179. package/skills/coding/ast-grep/evals.md +26 -0
  180. package/skills/coding/coding-standards/SKILL.md +40 -5
  181. package/skills/coding/coding-standards/evals.md +23 -0
  182. package/skills/coding/prototype/SKILL.md +87 -28
  183. package/skills/coding/prototype/evals.md +19 -0
  184. package/skills/coding/tdd/SKILL.md +80 -53
  185. package/skills/coding/tdd/evals.md +20 -0
  186. package/skills/context/context-handoff/SKILL.md +43 -2
  187. package/skills/context/context-handoff/evals.md +44 -0
  188. package/skills/context/context-prime/SKILL.md +45 -15
  189. package/skills/context/context-prime/evals.md +45 -0
  190. package/skills/git/branch-closeout/SKILL.md +132 -0
  191. package/skills/git/branch-closeout/evals.md +133 -0
  192. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  193. package/skills/git/file-ticket/SKILL.md +77 -63
  194. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  195. package/skills/git/file-ticket/evals.md +31 -26
  196. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  197. package/skills/git/fix-issue/SKILL.md +87 -64
  198. package/skills/git/fix-issue/evals.md +35 -31
  199. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  200. package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
  201. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  202. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  203. package/skills/git/ship/SKILL.md +103 -67
  204. package/skills/git/ship/assets/pr-template.md +21 -0
  205. package/skills/git/ship/evals.md +44 -28
  206. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  207. package/skills/git/worktree-create/SKILL.md +80 -50
  208. package/skills/git/worktree-create/evals.md +40 -33
  209. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  210. package/skills/git/worktree-merge/SKILL.md +112 -65
  211. package/skills/git/worktree-merge/evals.md +42 -34
  212. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  213. package/skills/planning/archify/SKILL.md +196 -0
  214. package/skills/planning/archify/evals.md +65 -0
  215. package/skills/planning/architecture/SKILL.md +61 -12
  216. package/skills/planning/architecture/evals.md +65 -0
  217. package/skills/planning/backlog/SKILL.md +130 -14
  218. package/skills/planning/backlog/evals.md +142 -0
  219. package/skills/planning/prd/SKILL.md +46 -6
  220. package/skills/planning/prd/evals.md +54 -0
  221. package/skills/planning/product-intent/SKILL.md +57 -2
  222. package/skills/planning/product-intent/evals.md +70 -0
  223. package/skills/planning/tech-spec/SKILL.md +53 -2
  224. package/skills/planning/tech-spec/evals.md +73 -0
  225. package/skills/registry.yaml +58 -50
  226. package/skills/remote.yaml +13 -0
  227. package/skills/research/arxiv-literature/SKILL.md +76 -18
  228. package/skills/research/arxiv-literature/evals.md +50 -0
  229. package/skills/research/experiment-protocol/SKILL.md +20 -1
  230. package/skills/research/experiment-protocol/evals.md +23 -0
  231. package/skills/research/scientific-debugging/SKILL.md +23 -1
  232. package/skills/research/scientific-debugging/evals.md +18 -0
  233. package/skills/research/scientific-modernization/SKILL.md +26 -1
  234. package/skills/research/scientific-modernization/evals.md +27 -0
  235. package/skills/skill-marketplace.json +63 -28
  236. package/skills/workflow/cut-it/SKILL.md +65 -5
  237. package/skills/workflow/cut-it/evals.md +101 -0
  238. package/skills/workflow/design-council/SKILL.md +117 -27
  239. package/skills/workflow/design-council/evals.md +161 -0
  240. package/skills/workflow/grill-me/SKILL.md +86 -10
  241. package/skills/workflow/grill-me/evals.md +153 -0
  242. package/skills/workflow/workflow-distiller/SKILL.md +76 -17
  243. package/skills/workflow/workflow-distiller/evals.md +118 -0
  244. package/src/cli/configure-interop.ts +105 -13
  245. package/src/cli/configure-oauth.ts +57 -0
  246. package/src/cli/configure-onboarding.ts +980 -0
  247. package/src/cli/configure-target.ts +594 -0
  248. package/src/cli/configure.ts +1082 -528
  249. package/src/cli/context-map.ts +114 -0
  250. package/src/cli/context.ts +4 -0
  251. package/src/cli/index.ts +1 -0
  252. package/src/cli/lifecycle-presenter.ts +436 -0
  253. package/src/cli/models.ts +10 -2
  254. package/src/cli/modes/print.ts +5 -1
  255. package/src/cli/reset.ts +228 -106
  256. package/src/cli/run.ts +7 -2
  257. package/src/cli/select.ts +664 -0
  258. package/src/cli/skills.ts +9 -2
  259. package/src/cli/targets.ts +3 -0
  260. package/src/cli/uninstall.ts +233 -165
  261. package/src/cli/upgrade.ts +204 -149
  262. package/src/cli/usage.ts +86 -27
  263. package/src/cli/validate-model.ts +3 -3
  264. package/src/core/config.ts +56 -0
  265. package/src/core/external-diagnostic.ts +44 -0
  266. package/src/core/gateway-routing.ts +157 -0
  267. package/src/core/safe-exec.ts +17 -2
  268. package/src/core/skill-activation.ts +89 -2
  269. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  270. package/src/domains/agents/catalog.ts +1 -1
  271. package/src/domains/agents/result-contract.ts +70 -0
  272. package/src/domains/context/wiki/map-seed.ts +589 -0
  273. package/src/domains/context/wiki/plan.ts +2 -2
  274. package/src/domains/dispatch/admission.ts +29 -0
  275. package/src/domains/dispatch/agent-candidates.ts +10 -0
  276. package/src/domains/dispatch/budget-envelope.ts +86 -1
  277. package/src/domains/dispatch/capability-match.ts +1 -0
  278. package/src/domains/dispatch/capacity-lease.ts +17 -0
  279. package/src/domains/dispatch/contract.ts +11 -1
  280. package/src/domains/dispatch/extension.ts +134 -29
  281. package/src/domains/dispatch/types.ts +3 -0
  282. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  283. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  284. package/src/domains/eval/metrics/token-stream.ts +201 -31
  285. package/src/domains/eval/metrics/tracked.ts +40 -4
  286. package/src/domains/eval/runners/clio-run.ts +5 -2
  287. package/src/domains/eval/schema/suite.ts +28 -0
  288. package/src/domains/eval/schema/verdict.ts +2 -2
  289. package/src/domains/eval/suites/resolve.ts +13 -1
  290. package/src/domains/eval/suites/run.ts +24 -3
  291. package/src/domains/interop/registry.ts +6 -2
  292. package/src/domains/interop/types.ts +4 -0
  293. package/src/domains/lifecycle/migrations/index.ts +4 -0
  294. package/src/domains/memory/task-memory-policy.ts +70 -26
  295. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  296. package/src/domains/middleware/index.ts +0 -1
  297. package/src/domains/middleware/marketplace-offer.ts +3 -35
  298. package/src/domains/middleware/memory-intervention.ts +127 -32
  299. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  300. package/src/domains/middleware/skills-reminder.ts +31 -2
  301. package/src/domains/observability/compaction-usage.ts +118 -0
  302. package/src/domains/observability/cost.ts +1 -1
  303. package/src/domains/observability/extension.ts +6 -1
  304. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  305. package/src/domains/providers/contract.ts +4 -1
  306. package/src/domains/providers/extension.ts +40 -9
  307. package/src/domains/providers/model-capabilities.ts +9 -0
  308. package/src/domains/providers/model-discovery.ts +2 -0
  309. package/src/domains/providers/model-runtime-capabilities.ts +15 -5
  310. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +32 -12
  311. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  312. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  313. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  314. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  315. package/src/domains/providers/support.ts +11 -5
  316. package/src/domains/providers/target-model-cache.ts +25 -2
  317. package/src/domains/providers/types/capability-flags.ts +2 -0
  318. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  319. package/src/domains/providers/types/target-descriptor.ts +19 -0
  320. package/src/domains/resources/index.ts +3 -0
  321. package/src/domains/resources/skills/install.ts +72 -7
  322. package/src/domains/resources/skills/loader.ts +7 -0
  323. package/src/domains/resources/skills/marketplace.ts +63 -11
  324. package/src/domains/safety/autonomy.ts +15 -0
  325. package/src/domains/safety/index.ts +1 -0
  326. package/src/domains/safety/path-policy.ts +1 -1
  327. package/src/domains/safety/policy-engine.ts +34 -11
  328. package/src/domains/safety/protected-artifacts.ts +191 -88
  329. package/src/domains/safety/run-effects.ts +2 -22
  330. package/src/domains/safety/skill-authority.ts +55 -0
  331. package/src/domains/session/compaction/compact.ts +72 -22
  332. package/src/domains/session/entries.ts +6 -0
  333. package/src/domains/session/usage.ts +3 -3
  334. package/src/engine/agent.ts +13 -3
  335. package/src/engine/ai.ts +26 -8
  336. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  337. package/src/engine/api-registry.ts +3 -0
  338. package/src/engine/apis/openai-completions.ts +117 -14
  339. package/src/engine/external-subprocess.ts +114 -6
  340. package/src/entry/background-model-metadata.ts +18 -0
  341. package/src/entry/compaction-prompt.ts +57 -0
  342. package/src/entry/orchestrator.ts +405 -216
  343. package/src/entry/task-memory-lifecycle.ts +35 -0
  344. package/src/interactive/chat-loop-messages.ts +13 -4
  345. package/src/interactive/chat-loop.ts +65 -2
  346. package/src/interactive/chat-renderer.ts +1 -0
  347. package/src/interactive/cost-overlay.ts +26 -2
  348. package/src/interactive/interactive-slash-runtime.ts +2 -1
  349. package/src/interactive/renderers/worker-entry.ts +32 -0
  350. package/src/interactive/slash-commands.ts +24 -6
  351. package/src/interactive/theme/labels.ts +19 -13
  352. package/src/interactive/turn-context.ts +9 -5
  353. package/src/interactive/turn-recovery.ts +8 -0
  354. package/src/interactive/turn-runtime.ts +27 -11
  355. package/src/interactive/turn-state.ts +7 -0
  356. package/src/interactive/worker-receipts.ts +1 -0
  357. package/src/interactive/worker-stream.ts +6 -1
  358. package/src/tools/context/index.ts +30 -9
  359. package/src/tools/dispatch-arguments.ts +1 -0
  360. package/src/tools/dispatch-event-text.ts +10 -0
  361. package/src/tools/dispatch-plan.ts +1 -0
  362. package/src/tools/dispatch-runner.ts +12 -0
  363. package/src/tools/registry.ts +11 -5
  364. package/src/tools/worker-evidence.ts +3 -1
  365. package/src/worker/spec-contract.ts +4 -0
  366. package/dist/chunk-2Z2IKEXI.js +0 -1554
  367. package/dist/reset-OAQP3W4O.js +0 -230
  368. package/dist/uninstall-N34PCTGJ.js +0 -331
  369. 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);