@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.
- package/CHANGELOG.md +98 -0
- package/CONTRIBUTING.md +86 -19
- package/README.md +35 -6
- package/dist/{acp-TMDQZDIG.js → acp-WNAYYF4F.js} +12 -13
- package/dist/{agents-5N5NG3XG.js → agents-3OKXHLOI.js} +60 -57
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-Z5CCBXKQ.js → auth-VKNNMGPU.js} +21 -19
- package/dist/{builtins-K6TNDT24.js → builtins-WGALA46I.js} +9 -4
- package/dist/{chunk-XE3PCIXH.js → chunk-23L32XTI.js} +12 -9
- package/dist/{chunk-I64IFBLB.js → chunk-25QBEXRS.js} +18 -11
- package/dist/{chunk-CDNVLKUX.js → chunk-26QSH3EJ.js} +13 -7
- package/dist/{chunk-QQLGQY2A.js → chunk-2ASED4PZ.js} +22 -22
- package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
- package/dist/chunk-2DSOYNFC.js +108 -0
- package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
- package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
- package/dist/{chunk-O3YUNJZ2.js → chunk-2ZSONWVL.js} +82 -25
- package/dist/{chunk-2NHR3NAY.js → chunk-36CT5VVL.js} +331 -42
- package/dist/{chunk-2X4RYJTJ.js → chunk-3GY4F45V.js} +3 -3
- package/dist/{chunk-ZW55JB7N.js → chunk-3ODX73FK.js} +4 -6
- package/dist/{chunk-PBP4B7XR.js → chunk-3UNOLWNZ.js} +3 -3
- package/dist/{chunk-4JDLP6ZS.js → chunk-3UUXNFEX.js} +14 -10
- package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
- package/dist/{chunk-ZW4HH5JJ.js → chunk-4M6Z5QVF.js} +6 -6
- package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
- package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
- package/dist/{chunk-FSP7CMNU.js → chunk-54X7T7DK.js} +61 -6
- package/dist/{chunk-54ODD65L.js → chunk-5636DCO5.js} +4 -4
- package/dist/chunk-57XXR6DR.js +3763 -0
- package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
- package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
- package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
- package/dist/{chunk-YJISEZKC.js → chunk-5TUB6SLS.js} +6 -6
- package/dist/{chunk-IMXMHHMQ.js → chunk-6OSVSQL5.js} +341 -57
- package/dist/{chunk-Q4XWMHX6.js → chunk-6PAZTBPA.js} +14 -2
- package/dist/{chunk-FVDGR2ZL.js → chunk-6Q3CYFD3.js} +112 -39
- package/dist/{chunk-IDNA72AH.js → chunk-6QOTUPRG.js} +155 -36
- package/dist/{chunk-X7IARSHT.js → chunk-6UINWWS6.js} +16 -10
- package/dist/{chunk-CYZW7JHJ.js → chunk-72YIHOZQ.js} +9 -9
- package/dist/{chunk-IKSLQ4XV.js → chunk-75W7L2E2.js} +752 -861
- package/dist/{chunk-CRFOIAX3.js → chunk-7UGL4MB5.js} +6 -6
- package/dist/{chunk-HIICAHCJ.js → chunk-AUPNRN7C.js} +2 -2
- package/dist/{chunk-7BHIY2MW.js → chunk-BJVFZO5U.js} +8 -50
- package/dist/{chunk-B74PXLU7.js → chunk-CUSRQKPU.js} +65 -3
- package/dist/chunk-DQOVN6KV.js +386 -0
- package/dist/{chunk-E7GT7O5N.js → chunk-DT3LWJOB.js} +7 -4
- package/dist/chunk-DXKJURES.js +671 -0
- package/dist/{chunk-JBCS7CRR.js → chunk-EL24TAU4.js} +10 -10
- package/dist/{chunk-TPEQIQIE.js → chunk-ELWDPP3Y.js} +8 -8
- package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
- package/dist/chunk-EXLD33WO.js +381 -0
- package/dist/chunk-FEAXX7B6.js +101 -0
- package/dist/{chunk-RLYRBIYQ.js → chunk-FFUPXJC4.js} +90 -331
- package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
- package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
- package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
- package/dist/chunk-GX5WYQO4.js +59 -0
- package/dist/chunk-GYV6VZOC.js +26 -0
- package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
- package/dist/chunk-I2DWJ4GM.js +390 -0
- package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
- package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
- package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
- package/dist/chunk-IRXAATOX.js +539 -0
- package/dist/chunk-IXIY2H4R.js +44 -0
- package/dist/{chunk-SSEYRH53.js → chunk-IZXGRF7P.js} +92 -147
- package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
- package/dist/{chunk-JWJGP5DQ.js → chunk-JEIYHLOR.js} +7 -7
- package/dist/{chunk-F2I26BDK.js → chunk-JQLNNIKT.js} +4 -4
- package/dist/{chunk-BYMNWQ7O.js → chunk-JSD46VO2.js} +315 -63
- package/dist/{chunk-AK5XEFVZ.js → chunk-JT2RFCC5.js} +64 -14
- package/dist/{chunk-MCMZMDAC.js → chunk-K6T2ZAMZ.js} +168 -6
- package/dist/{chunk-PGF63K6I.js → chunk-KFV5L5SK.js} +73 -4
- package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
- package/dist/{chunk-PJX3WQUQ.js → chunk-LLXSDWXS.js} +3 -3
- package/dist/{chunk-DZAW46HP.js → chunk-LTIKRKFL.js} +3 -3
- package/dist/{chunk-DZEK6CJN.js → chunk-N56KALIC.js} +21 -21
- package/dist/{chunk-B7HM5Z7T.js → chunk-NAI6ZFCY.js} +9 -5
- package/dist/{chunk-I66ZTYNP.js → chunk-NRO2BJRH.js} +2656 -2213
- package/dist/{chunk-ZGNYYXQ6.js → chunk-NXIMQY5W.js} +3 -3
- package/dist/{chunk-IKOZFYBN.js → chunk-NXYCB2VD.js} +149 -106
- package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
- package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
- package/dist/chunk-ODGTEFFI.js +50 -0
- package/dist/{chunk-3F7VUY77.js → chunk-OEJSLEPW.js} +2 -2
- package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
- package/dist/{chunk-5KW52TEP.js → chunk-Q4WO54TA.js} +132 -77
- package/dist/{chunk-W6NIE6OW.js → chunk-QUFRYSWI.js} +13 -7
- package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
- package/dist/chunk-R6Q67RJH.js +134 -0
- package/dist/{chunk-W4YEMFBX.js → chunk-RAY4OVGZ.js} +3 -3
- package/dist/{chunk-ZNT2M6TG.js → chunk-RQCKCSRL.js} +17 -17
- package/dist/{chunk-LJID3DYZ.js → chunk-RXTN6AKH.js} +3 -3
- package/dist/{chunk-P75RZCJW.js → chunk-RZDWV63N.js} +3 -3
- package/dist/{chunk-UH632ZYL.js → chunk-S6PYF2XF.js} +2 -2
- package/dist/{chunk-HJWWJ6IL.js → chunk-TOIVGRUX.js} +17 -5
- package/dist/{chunk-HLAFFSEK.js → chunk-TQAHXW6Y.js} +2 -2
- package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
- package/dist/{chunk-2HFQNRV3.js → chunk-UEPWCCTY.js} +12 -12
- package/dist/chunk-UOIZ7DA4.js +41 -0
- package/dist/{chunk-UH347SHR.js → chunk-USR47QNF.js} +11 -11
- package/dist/{chunk-AZ4WMN4W.js → chunk-V6HJFQZE.js} +2 -2
- package/dist/chunk-V76WTFTW.js +318 -0
- package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
- package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
- package/dist/{chunk-UBRFI4HS.js → chunk-XULDXHTN.js} +142 -50
- package/dist/chunk-XXYSBZIQ.js +283 -0
- package/dist/{chunk-HKMD33FO.js → chunk-Y55JBDO5.js} +405 -122
- package/dist/{chunk-XOXV5GKE.js → chunk-YD5GIKET.js} +17 -8
- package/dist/{chunk-XGDPUNND.js → chunk-YECAMM3D.js} +2 -2
- package/dist/{chunk-BO7Y52RY.js → chunk-YNFKXPEC.js} +7 -7
- package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
- package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
- package/dist/cli/index.js +42 -40
- package/dist/{clio-7VB377CC.js → clio-QLICPCF5.js} +7 -7
- package/dist/{code-nav-YVLCYA7V.js → code-nav-IJR2DBPR.js} +9 -9
- package/dist/{components-UBWCQSRW.js → components-2TGAI2RC.js} +5 -6
- package/dist/{config-4HVOS65E.js → config-IUA6OYNS.js} +88 -81
- package/dist/{configure-PIWO7B24.js → configure-VEPX4NMX.js} +26 -25
- package/dist/{context-KQYIWPWT.js → context-2DKHWH2T.js} +60 -45
- package/dist/{context-IYEHL3WQ.js → context-4MPR7WKB.js} +78 -69
- package/dist/{context-N6ZE3LGJ.js → context-BOYF5EJM.js} +15 -11
- package/dist/{context-clear-G4OGZJDS.js → context-clear-S4ZJCQUX.js} +73 -65
- package/dist/context-map-COB37XXN.js +505 -0
- package/dist/{context-working-set-BWLF6LJP.js → context-working-set-3I3FYX6Y.js} +18 -17
- package/dist/detail-A7JAVSIG.js +98 -0
- package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-RJ5I2F2O.js} +99 -75
- package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
- package/dist/{doctor-LHBD36VU.js → doctor-DKICC2SN.js} +71 -48
- package/dist/{eval-C45FYRJ6.js → eval-OQOQUDHK.js} +308 -146
- package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
- package/dist/{evidence-6SHONYAF.js → evidence-4DQ25GUQ.js} +79 -175
- package/dist/evidence-4F5USFKH.js +208 -0
- package/dist/{evolve-KRKMV72X.js → evolve-GSS52E5J.js} +71 -67
- package/dist/{extensions-KPZ2UHBB.js → extensions-G7MFLYHT.js} +8 -9
- package/dist/{fleet-IVTCKDHT.js → fleet-Q37YHHAQ.js} +126 -118
- package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-G7E4N7SM.js} +16 -13
- package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-O7M6QBA2.js} +9 -8
- package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-TOUBW6OW.js} +21 -20
- package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-SW33JJNI.js} +65 -60
- package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-CV2655TW.js} +4 -5
- package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-KESZX2YH.js} +25 -24
- package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-UQPMTVE3.js} +66 -61
- package/dist/{fleet-view-TWHJKCN6.js → fleet-view-MN2VG4MR.js} +65 -60
- package/dist/{init-T2QORQ3Y.js → init-PXEXQSBF.js} +90 -82
- package/dist/{interop-IN5I2A66.js → interop-ZG5T62U3.js} +12 -13
- package/dist/inventory-C26CFDRR.js +101 -0
- package/dist/{library-LSCATDLZ.js → library-B2W4N74O.js} +29 -29
- package/dist/{memory-HYOKAGGJ.js → memory-YCANYS5A.js} +73 -69
- package/dist/{models-2GPMFYCM.js → models-GERTU3YI.js} +51 -47
- package/dist/{monitor-E4ASVUJH.js → monitor-CPNIUULB.js} +74 -67
- package/dist/{orchestrator-DDMPR3PY.js → orchestrator-J4BSH4WQ.js} +1288 -1606
- package/dist/{panes-E3RUXOW5.js → panes-BOHAEGYC.js} +4 -4
- package/dist/{panes-IXKLOKA2.js → panes-NXSLDQZ2.js} +10 -11
- package/dist/{paths-L7LGY6RN.js → paths-VSUWNC22.js} +6 -7
- package/dist/reset-TNWTB5LU.js +343 -0
- package/dist/{resources-OTRSN34L.js → resources-4PXNMD5G.js} +29 -22
- package/dist/{run-5DEYH5QK.js → run-D6XJ34CN.js} +132 -132
- package/dist/{share-IHWTLO3M.js → share-2NWMJJEE.js} +27 -27
- package/dist/{skills-IYMXMKW4.js → skills-KR7WON5G.js} +40 -33
- package/dist/{skills-eval-DROHSJAR.js → skills-eval-O2ZNOLDS.js} +81 -77
- package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-ZZOUBK7O.js} +23 -22
- package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-ZXPJD64J.js} +47 -37
- package/dist/{steer-Z5DO23FJ.js → steer-XA25PSCS.js} +4 -4
- package/dist/{support-U7QOWY26.js → support-7EMVWYG2.js} +6 -6
- package/dist/{targets-P2FUC4IL.js → targets-OMH2XCSN.js} +50 -49
- package/dist/tasks-IPAGMEIX.js +36 -0
- package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-C2J3JYRE.js} +4 -4
- package/dist/{tools-5B7RO6MV.js → tools-EFFEAIDP.js} +8 -9
- package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
- package/dist/uninstall-HALS6BLF.js +407 -0
- package/dist/upgrade-MS72RJEP.js +306 -0
- package/dist/{usage-ME5MPXGX.js → usage-NHG6MCJM.js} +162 -108
- package/dist/{verifiers-BVZ7IWOO.js → verifiers-7AUNVXDY.js} +155 -22
- package/dist/{verify-5K7ZKQFC.js → verify-FWYGPKMR.js} +14 -12
- package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
- package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-743CIGJW.js} +99 -90
- package/dist/{with-panes-BYOJCLAM.js → with-panes-BDQEWBRT.js} +10 -10
- package/dist/worker/entry.js +72 -68
- package/docs/README.md +3 -2
- package/docs/architecture/acp.md +17 -0
- package/docs/architecture/artifact-placement.md +1 -0
- package/docs/architecture/artifact-versions.md +2 -2
- package/docs/architecture/context-engine.md +4 -0
- package/docs/architecture/dispatch-typed-intent.md +1 -1
- package/docs/architecture/evidence-and-memory.md +1 -1
- package/docs/architecture/middleware-and-components.md +1 -1
- package/docs/architecture/model-catalog.md +21 -10
- package/docs/architecture/observability.md +19 -2
- package/docs/architecture/prompt-envelope-and-tools.md +17 -5
- package/docs/architecture/provider-adapter-cookbook.md +63 -0
- package/docs/architecture/safety-model.md +25 -22
- package/docs/architecture/tui-design.md +1 -1
- package/docs/guide/built-in-agents.md +25 -11
- package/docs/guide/commands-and-modes.md +18 -3
- package/docs/guide/configuration-and-targets.md +100 -10
- package/docs/guide/configuration-reference.md +17 -7
- package/docs/guide/environment-variables.md +4 -2
- package/docs/guide/installation-and-lifecycle.md +37 -4
- package/docs/guide/proactive-memory.md +66 -55
- package/docs/guide/skills-marketplace.md +18 -0
- package/docs/guide/tool-usage.md +78 -3
- package/docs/history/config-knobs-audit.md +2 -2
- package/docs/process/development-pipeline.md +40 -2
- package/docs/process/eval-runner.md +67 -3
- package/docs/process/git-commit-provenance.md +15 -0
- package/docs/process/release-cut-checklist.md +207 -0
- package/docs/process/scientific-validation.md +18 -17
- package/evals/behavioral-machinery-support.ts +1 -0
- package/evals/behavioral-machinery.yaml +1 -1
- package/evals/behavioral-model.yaml +3 -2
- package/package.json +2 -2
- package/skills/README.md +7 -5
- package/skills/coding/ast-grep/SKILL.md +101 -30
- package/skills/coding/ast-grep/evals.md +26 -0
- package/skills/coding/coding-standards/SKILL.md +47 -2
- package/skills/coding/coding-standards/evals.md +23 -0
- package/skills/coding/prototype/SKILL.md +87 -28
- package/skills/coding/prototype/evals.md +19 -0
- package/skills/coding/tdd/SKILL.md +80 -53
- package/skills/coding/tdd/evals.md +20 -0
- package/skills/context/context-handoff/SKILL.md +43 -2
- package/skills/context/context-handoff/evals.md +44 -0
- package/skills/context/context-prime/SKILL.md +45 -15
- package/skills/context/context-prime/evals.md +45 -0
- package/skills/git/branch-closeout/SKILL.md +132 -0
- package/skills/git/branch-closeout/evals.md +133 -0
- package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
- package/skills/git/file-ticket/SKILL.md +77 -63
- package/skills/git/file-ticket/assets/issue-template.md +22 -0
- package/skills/git/file-ticket/evals.md +31 -26
- package/skills/git/file-ticket/references/issue-discovery.md +49 -0
- package/skills/git/fix-issue/SKILL.md +87 -64
- package/skills/git/fix-issue/evals.md +35 -31
- package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
- package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
- package/skills/git/resolve-merge-conflicts/evals.md +52 -25
- package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
- package/skills/git/ship/SKILL.md +103 -67
- package/skills/git/ship/assets/pr-template.md +21 -0
- package/skills/git/ship/evals.md +44 -28
- package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
- package/skills/git/worktree-create/SKILL.md +80 -50
- package/skills/git/worktree-create/evals.md +40 -33
- package/skills/git/worktree-create/references/worktree-setup.md +62 -66
- package/skills/git/worktree-merge/SKILL.md +112 -65
- package/skills/git/worktree-merge/evals.md +42 -34
- package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
- package/skills/planning/archify/SKILL.md +196 -0
- package/skills/planning/archify/evals.md +65 -0
- package/skills/planning/architecture/SKILL.md +61 -12
- package/skills/planning/architecture/evals.md +65 -0
- package/skills/planning/backlog/SKILL.md +130 -14
- package/skills/planning/backlog/evals.md +142 -0
- package/skills/planning/prd/SKILL.md +47 -6
- package/skills/planning/prd/evals.md +54 -0
- package/skills/planning/product-intent/SKILL.md +57 -2
- package/skills/planning/product-intent/evals.md +70 -0
- package/skills/planning/tech-spec/SKILL.md +53 -2
- package/skills/planning/tech-spec/evals.md +73 -0
- package/skills/registry.yaml +58 -50
- package/skills/remote.yaml +13 -0
- package/skills/research/arxiv-literature/SKILL.md +76 -18
- package/skills/research/arxiv-literature/evals.md +50 -0
- package/skills/research/experiment-protocol/SKILL.md +20 -1
- package/skills/research/experiment-protocol/evals.md +23 -0
- package/skills/research/scientific-debugging/SKILL.md +24 -1
- package/skills/research/scientific-debugging/evals.md +18 -0
- package/skills/research/scientific-modernization/SKILL.md +26 -1
- package/skills/research/scientific-modernization/evals.md +27 -0
- package/skills/skill-marketplace.json +63 -28
- package/skills/workflow/cut-it/SKILL.md +64 -5
- package/skills/workflow/cut-it/evals.md +101 -0
- package/skills/workflow/design-council/SKILL.md +112 -27
- package/skills/workflow/design-council/evals.md +161 -0
- package/skills/workflow/grill-me/SKILL.md +85 -10
- package/skills/workflow/grill-me/evals.md +153 -0
- package/skills/workflow/workflow-distiller/SKILL.md +76 -17
- package/skills/workflow/workflow-distiller/evals.md +118 -0
- package/src/cli/args.ts +0 -8
- package/src/cli/configure-interop.ts +105 -13
- package/src/cli/configure-oauth.ts +57 -0
- package/src/cli/configure-onboarding.ts +980 -0
- package/src/cli/configure-target.ts +594 -0
- package/src/cli/configure.ts +1084 -529
- package/src/cli/context-map.ts +114 -0
- package/src/cli/context.ts +4 -0
- package/src/cli/doctor-state-size.ts +1 -12
- package/src/cli/doctor-validation-contract.ts +28 -0
- package/src/cli/doctor.ts +5 -0
- package/src/cli/evidence-detail.ts +1 -75
- package/src/cli/evidence-inventory.ts +1 -167
- package/src/cli/index.ts +3 -0
- package/src/cli/lifecycle-presenter.ts +436 -0
- package/src/cli/models.ts +10 -2
- package/src/cli/modes/print.ts +5 -1
- package/src/cli/reset.ts +228 -106
- package/src/cli/run.ts +7 -4
- package/src/cli/select.ts +664 -0
- package/src/cli/skills.ts +9 -2
- package/src/cli/targets.ts +3 -0
- package/src/cli/tasks.ts +84 -0
- package/src/cli/uninstall.ts +233 -165
- package/src/cli/upgrade.ts +210 -150
- package/src/cli/usage.ts +92 -27
- package/src/cli/validate-model.ts +3 -3
- package/src/cli/verifiers.ts +147 -1
- package/src/cli/wiki-generate.ts +1 -0
- package/src/core/commit-attribution.ts +41 -1
- package/src/core/config.ts +56 -0
- package/src/core/external-diagnostic.ts +44 -0
- package/src/core/gateway-routing.ts +157 -0
- package/src/core/git-commit-attribution.ts +46 -3
- package/src/core/run-overrides.ts +0 -5
- package/src/core/safe-exec.ts +17 -2
- package/src/core/skill-activation.ts +92 -2
- package/src/core/tool-names.ts +5 -2
- package/src/domains/agents/builtins/architect.md +1 -1
- package/src/domains/agents/builtins/coder.md +1 -1
- package/src/domains/agents/builtins/documenter.md +1 -1
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/provenance.md +7 -7
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +4 -3
- package/src/domains/agents/builtins/world-knowledge.md +31 -0
- package/src/domains/agents/catalog.ts +1 -1
- package/src/domains/agents/result-contract.ts +70 -0
- package/src/domains/context/extension.ts +31 -7
- package/src/domains/context/refresh.ts +3 -0
- package/src/domains/context/wiki/frontmatter.ts +5 -2
- package/src/domains/context/wiki/generate.ts +6 -0
- package/src/domains/context/wiki/map-seed.ts +589 -0
- package/src/domains/context/wiki/plan.ts +2 -2
- package/src/domains/context/wiki/prompts.ts +43 -0
- package/src/domains/dispatch/active-route-planner.ts +4 -0
- package/src/domains/dispatch/admission.ts +29 -0
- package/src/domains/dispatch/agent-candidates.ts +10 -0
- package/src/domains/dispatch/budget-envelope.ts +86 -1
- package/src/domains/dispatch/capability-match.ts +1 -0
- package/src/domains/dispatch/capacity-lease.ts +17 -0
- package/src/domains/dispatch/code-step.ts +11 -4
- package/src/domains/dispatch/contract.ts +42 -8
- package/src/domains/dispatch/execution-scheduler.ts +2 -0
- package/src/domains/dispatch/extension.ts +184 -56
- package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/host-verification.ts +114 -13
- package/src/domains/dispatch/intent.ts +28 -18
- package/src/domains/dispatch/orphan-recovery.ts +2 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/reservation-store.ts +5 -3
- package/src/domains/dispatch/state.ts +15 -2
- package/src/domains/dispatch/types.ts +20 -2
- package/src/domains/dispatch/worker-model-metadata.ts +38 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
- package/src/domains/eval/metrics/token-stream.ts +201 -31
- package/src/domains/eval/metrics/tracked.ts +40 -4
- package/src/domains/eval/runners/clio-run.ts +17 -11
- package/src/domains/eval/runners/context-index.ts +2 -7
- package/src/domains/eval/runners/context-init.ts +3 -6
- package/src/domains/eval/runners/external-command.ts +29 -11
- package/src/domains/eval/schema/suite.ts +28 -0
- package/src/domains/eval/schema/verdict.ts +2 -2
- package/src/domains/eval/suites/resolve.ts +13 -1
- package/src/domains/eval/suites/run.ts +24 -3
- package/src/domains/evidence/build.ts +102 -15
- package/src/domains/evidence/detail.ts +69 -0
- package/src/domains/evidence/eval.ts +13 -1
- package/src/domains/evidence/finish-contract-map.ts +5 -1
- package/src/domains/evidence/inventory.ts +167 -0
- package/src/domains/evidence/store.ts +16 -0
- package/src/domains/evidence/types.ts +12 -0
- package/src/domains/extensions/resources.ts +7 -0
- package/src/domains/interop/registry.ts +6 -2
- package/src/domains/interop/types.ts +4 -0
- package/src/domains/lifecycle/migrations/index.ts +4 -0
- package/src/domains/memory/task-memory-policy.ts +70 -26
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +0 -1
- package/src/domains/middleware/marketplace-offer.ts +22 -35
- package/src/domains/middleware/memory-intervention.ts +127 -32
- package/src/domains/middleware/memory-step-endpoint.ts +3 -2
- package/src/domains/middleware/runtime.ts +7 -3
- package/src/domains/middleware/skills-reminder.ts +31 -2
- package/src/domains/mux/detect.ts +3 -6
- package/src/domains/observability/accountability.ts +15 -1
- package/src/domains/observability/compaction-usage.ts +118 -0
- package/src/domains/observability/contract.ts +52 -7
- package/src/domains/observability/cost.ts +1 -1
- package/src/domains/observability/evidence-index.ts +10 -0
- package/src/domains/observability/extension.ts +15 -6
- package/src/domains/observability/out-of-turn-usage.ts +52 -21
- package/src/domains/observability/projection.ts +394 -45
- package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
- package/src/domains/prompts/fragments/operating/contract.md +2 -0
- package/src/domains/prompts/fragments/wiki/page.md +8 -0
- package/src/domains/providers/contract.ts +4 -1
- package/src/domains/providers/extension.ts +40 -9
- package/src/domains/providers/model-capabilities.ts +9 -0
- package/src/domains/providers/model-discovery.ts +3 -4
- package/src/domains/providers/model-runtime-capabilities.ts +15 -5
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +48 -26
- package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
- package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
- package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
- package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
- package/src/domains/providers/support.ts +11 -5
- package/src/domains/providers/target-model-cache.ts +25 -2
- package/src/domains/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/runtime-descriptor.ts +20 -1
- package/src/domains/providers/types/target-descriptor.ts +19 -0
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/skills/install.ts +72 -7
- package/src/domains/resources/skills/loader.ts +7 -0
- package/src/domains/resources/skills/marketplace.ts +63 -11
- package/src/domains/safety/action-classifier.ts +7 -0
- package/src/domains/safety/autonomy.ts +15 -0
- package/src/domains/safety/default-path-policy.ts +2 -0
- package/src/domains/safety/finish-contract-registration.ts +29 -14
- package/src/domains/safety/finish-contract.ts +252 -40
- package/src/domains/safety/index.ts +21 -1
- package/src/domains/safety/path-policy.ts +1 -1
- package/src/domains/safety/policy-engine.ts +60 -17
- package/src/domains/safety/protected-artifacts.ts +191 -88
- package/src/domains/safety/rigor.ts +53 -39
- package/src/domains/safety/run-effects.ts +2 -22
- package/src/domains/safety/skill-authority.ts +55 -0
- package/src/domains/safety/validation-contract.ts +388 -0
- package/src/domains/session/archive-readers.ts +10 -1
- package/src/domains/session/compaction/compact.ts +72 -22
- package/src/domains/session/decision-board.ts +101 -2
- package/src/domains/session/entries.ts +50 -7
- package/src/domains/session/extension.ts +4 -4
- package/src/domains/session/handoff.ts +2 -1
- package/src/domains/session/manager.ts +2 -3
- package/src/domains/session/task-board.ts +14 -1
- package/src/domains/session/tree/fork.ts +1 -2
- package/src/domains/session/tree/navigator.ts +1 -1
- package/src/domains/session/usage.ts +3 -3
- package/src/domains/user-tasks/acceptance.ts +56 -0
- package/src/domains/user-tasks/active-acceptance.ts +40 -0
- package/src/domains/user-tasks/store.ts +34 -3
- package/src/engine/acp/adapter.ts +24 -6
- package/src/engine/acp/server.ts +21 -4
- package/src/engine/acp/transport.ts +53 -8
- package/src/engine/acp/types.ts +4 -0
- package/src/engine/agent.ts +13 -3
- package/src/engine/ai.ts +26 -8
- package/src/engine/antigravity/subprocess-runtime.ts +386 -120
- package/src/engine/api-registry.ts +3 -0
- package/src/engine/apis/ollama-native.ts +15 -0
- package/src/engine/apis/openai-completions.ts +117 -14
- package/src/engine/claude/subprocess-runtime.ts +107 -60
- package/src/engine/external-subprocess.ts +122 -6
- package/src/entry/background-model-metadata.ts +18 -0
- package/src/entry/compaction-prompt.ts +57 -0
- package/src/entry/orchestrator.ts +416 -218
- package/src/entry/task-memory-lifecycle.ts +35 -0
- package/src/interactive/chat-loop-messages.ts +13 -4
- package/src/interactive/chat-loop.ts +65 -2
- package/src/interactive/chat-renderer.ts +1 -0
- package/src/interactive/cost-overlay.ts +26 -2
- package/src/interactive/dispatch-board.ts +46 -717
- package/src/interactive/fleet-run-preview.ts +2 -1
- package/src/interactive/interactive-application.ts +3 -2
- package/src/interactive/interactive-presentation.ts +55 -12
- package/src/interactive/interactive-slash-runtime.ts +4 -2
- package/src/interactive/oracle.ts +5 -2
- package/src/interactive/overlays/fleet-run-approval.ts +3 -2
- package/src/interactive/overlays/message-picker.ts +2 -2
- package/src/interactive/overlays/settings.ts +2 -2
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/renderers/branch-summary.ts +1 -1
- package/src/interactive/renderers/worker-entry.ts +32 -0
- package/src/interactive/slash-autocomplete.ts +4 -6
- package/src/interactive/slash-commands.ts +49 -45
- package/src/interactive/slash-spec.ts +28 -0
- package/src/interactive/theme/labels.ts +19 -13
- package/src/interactive/turn-context.ts +9 -5
- package/src/interactive/turn-recovery.ts +8 -0
- package/src/interactive/turn-runtime.ts +27 -11
- package/src/interactive/turn-state.ts +7 -0
- package/src/interactive/view/artifacts.ts +2 -0
- package/src/interactive/worker-receipts.ts +1 -0
- package/src/interactive/worker-stream.ts +13 -4
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +31 -0
- package/src/tools/compete-worktrees.ts +7 -1
- package/src/tools/context/index.ts +30 -9
- package/src/tools/core-bootstrap.ts +16 -0
- package/src/tools/decide.ts +136 -0
- package/src/tools/dispatch-admission.ts +21 -0
- package/src/tools/dispatch-arguments.ts +1 -0
- package/src/tools/dispatch-event-text.ts +10 -0
- package/src/tools/dispatch-plan.ts +6 -2
- package/src/tools/dispatch-runner.ts +27 -1
- package/src/tools/dispatch-types.ts +6 -0
- package/src/tools/evidence.ts +96 -0
- package/src/tools/limitation.ts +76 -0
- package/src/tools/policy.ts +9 -0
- package/src/tools/presentation.ts +3 -0
- package/src/tools/registry.ts +11 -5
- package/src/tools/result-shaping.ts +17 -5
- package/src/tools/task-worktree.ts +13 -3
- package/src/tools/tasks.ts +10 -1
- package/src/tools/verify/authoring.ts +170 -83
- package/src/tools/verify/catalog.ts +122 -5
- package/src/tools/verify/index.ts +2 -1
- package/src/tools/verify/numeric.ts +298 -0
- package/src/tools/verify/perf.ts +143 -0
- package/src/tools/verify/scripts.ts +229 -2
- package/src/tools/worker-evidence.ts +3 -1
- package/src/worker/spec-contract.ts +4 -0
- package/dist/chunk-2Z2IKEXI.js +0 -1554
- package/dist/chunk-RVG5JXAL.js +0 -41
- package/dist/chunk-T56WDKA5.js +0 -183
- package/dist/chunk-VN3SHNBN.js +0 -313
- package/dist/chunk-VPKWYKEY.js +0 -169
- package/dist/reset-OAQP3W4O.js +0 -230
- package/dist/uninstall-N34PCTGJ.js +0 -331
- 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
|
-
/**
|
|
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<
|
|
21
|
+
type AntigravityChildProcess = ChildProcessByStdio<Writable, Readable, Readable>;
|
|
14
22
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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" | "
|
|
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
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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 = [
|
|
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
|
-
|
|
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: "
|
|
98
|
-
provider: "
|
|
350
|
+
api: "external-agent-subprocess",
|
|
351
|
+
provider: "antigravity",
|
|
99
352
|
model: input.model,
|
|
100
|
-
usage:
|
|
101
|
-
stopReason: input.aborted ? "aborted" :
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
|
364
|
+
export function startAntigravityWorkerRun(
|
|
365
|
+
input: WorkerRunInput,
|
|
112
366
|
emit: WorkerEventEmit,
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
|
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
|
-
|
|
165
|
-
child.kill("SIGTERM");
|
|
166
|
-
killTimer = setTimeout(() => {
|
|
167
|
-
if (!child.killed) child.kill("SIGKILL");
|
|
168
|
-
}, 1500);
|
|
397
|
+
terminator.terminate();
|
|
169
398
|
};
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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);
|