@iowarp/clio-coder 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +127 -0
- package/CONTRIBUTING.md +142 -52
- package/README.md +434 -473
- package/SECURITY.md +2 -1
- package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
- package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
- package/dist/builtins-IA7V7FUC.js +22 -0
- package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
- package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
- package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
- package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
- package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
- package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
- package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
- package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
- package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
- package/dist/chunk-4UVU7BJ5.js +39 -0
- package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
- package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
- package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
- package/dist/chunk-5MEZN6CB.js +1334 -0
- package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
- package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
- package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
- package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
- package/dist/chunk-7DRAWPTZ.js +360 -0
- package/dist/chunk-7E7I3WLS.js +3762 -0
- package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
- package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
- package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
- package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
- package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
- package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
- package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
- package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
- package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
- package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
- package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
- package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
- package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
- package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
- package/dist/chunk-GYV6VZOC.js +26 -0
- package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
- package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
- package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
- package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
- package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
- package/dist/chunk-IJNZMHLA.js +101 -0
- package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
- package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
- package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
- package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
- package/dist/chunk-JEQ3XTHC.js +42 -0
- package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
- package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
- package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
- package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
- package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
- package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
- package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
- package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
- package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
- package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
- package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
- package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
- package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
- package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
- package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
- package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
- package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
- package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
- package/dist/chunk-R6Q67RJH.js +134 -0
- package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
- package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
- package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
- package/dist/chunk-SKHCAU7K.js +385 -0
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
- package/dist/chunk-UOIZ7DA4.js +41 -0
- package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
- package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
- package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
- package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
- package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
- package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
- package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
- package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
- package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
- package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
- package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
- package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
- package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
- package/dist/chunk-XRZT5WY5.js +47 -0
- package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
- package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
- package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
- package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
- package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
- package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
- package/dist/cli/index.js +41 -39
- package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
- package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
- package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
- package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
- package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
- package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
- package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
- package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
- package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
- package/dist/context-map-COB37XXN.js +505 -0
- package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
- package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
- package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
- package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
- package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
- package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
- package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
- package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
- package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
- package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
- package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
- package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
- package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
- package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
- package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
- package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
- package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
- package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
- package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
- package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
- package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
- package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
- package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
- package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
- package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
- package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
- package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
- package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
- package/dist/reset-EAJFFJVB.js +344 -0
- package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
- package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
- package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
- package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
- package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
- package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
- package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
- package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
- package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
- package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
- package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
- package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
- package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
- package/dist/uninstall-5PEVOE5B.js +408 -0
- package/dist/upgrade-M4WXY6KN.js +303 -0
- package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
- package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
- package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
- package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
- package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
- package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
- package/dist/worker/entry.js +90 -74
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
- package/docs/{observability.md → architecture/observability.md} +38 -14
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
- package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
- package/docs/guide/configuration-reference.md +1163 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
- package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
- package/docs/process/development-pipeline.md +152 -0
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- package/evals/README.md +2 -2
- package/evals/behavioral-model.yaml +3 -2
- package/package.json +10 -8
- package/skills/README.md +52 -41
- package/skills/coding/ast-grep/SKILL.md +102 -31
- package/skills/coding/ast-grep/evals.md +26 -0
- package/skills/coding/coding-standards/SKILL.md +41 -6
- package/skills/coding/coding-standards/evals.md +23 -0
- package/skills/coding/prototype/SKILL.md +88 -29
- package/skills/coding/prototype/evals.md +19 -0
- package/skills/coding/tdd/SKILL.md +81 -54
- package/skills/coding/tdd/evals.md +20 -0
- package/skills/context/context-handoff/SKILL.md +44 -3
- package/skills/context/context-handoff/evals.md +44 -0
- package/skills/context/context-prime/SKILL.md +46 -16
- 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 +78 -64
- 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 +88 -65
- 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 +101 -52
- 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/meta/clio-coder-dev/SKILL.md +9 -5
- package/skills/meta/clio-coder-dev/evals.md +3 -2
- package/skills/meta/clio-coder-test/SKILL.md +102 -95
- package/skills/meta/clio-coder-test/evals.md +9 -4
- package/skills/meta/clio-coder-test/references/harness.md +100 -124
- package/skills/meta/clio-coder-test/references/test-map.md +77 -50
- package/skills/meta/credentials/SKILL.md +2 -2
- package/skills/meta/find-skills/SKILL.md +2 -2
- package/skills/meta/herdr/SKILL.md +2 -2
- package/skills/meta/skill-craft/SKILL.md +22 -16
- package/skills/planning/archify/SKILL.md +196 -0
- package/skills/planning/archify/evals.md +65 -0
- package/skills/planning/architecture/SKILL.md +62 -13
- package/skills/planning/architecture/evals.md +65 -0
- package/skills/planning/backlog/SKILL.md +131 -15
- package/skills/planning/backlog/evals.md +142 -0
- package/skills/planning/prd/SKILL.md +47 -7
- package/skills/planning/prd/evals.md +54 -0
- package/skills/planning/product-intent/SKILL.md +58 -3
- package/skills/planning/product-intent/evals.md +70 -0
- package/skills/planning/tech-spec/SKILL.md +54 -3
- package/skills/planning/tech-spec/evals.md +73 -0
- package/skills/registry.yaml +70 -62
- package/skills/remote.yaml +13 -0
- package/skills/research/arxiv-literature/SKILL.md +77 -19
- package/skills/research/arxiv-literature/evals.md +50 -0
- package/skills/research/experiment-protocol/SKILL.md +21 -2
- package/skills/research/experiment-protocol/evals.md +23 -0
- package/skills/research/scientific-debugging/SKILL.md +24 -2
- package/skills/research/scientific-debugging/evals.md +18 -0
- package/skills/research/scientific-modernization/SKILL.md +27 -2
- package/skills/research/scientific-modernization/evals.md +27 -0
- package/skills/skill-marketplace.json +97 -62
- package/skills/workflow/cut-it/SKILL.md +66 -6
- package/skills/workflow/cut-it/evals.md +101 -0
- package/skills/workflow/design-council/SKILL.md +118 -28
- package/skills/workflow/design-council/evals.md +161 -0
- package/skills/workflow/grill-me/SKILL.md +87 -11
- package/skills/workflow/grill-me/evals.md +153 -0
- package/skills/workflow/workflow-distiller/SKILL.md +77 -18
- package/skills/workflow/workflow-distiller/evals.md +118 -0
- package/src/cli/args.ts +2 -2
- package/src/cli/bootstrap-generate.ts +1 -1
- package/src/cli/config-inspect.ts +65 -12
- 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 +1082 -532
- package/src/cli/context-map.ts +114 -0
- package/src/cli/context.ts +4 -0
- package/src/cli/docs.ts +22 -14
- package/src/cli/doctor-naming.ts +5 -5
- package/src/cli/doctor-toolchain.ts +3 -3
- package/src/cli/eval.ts +1 -2
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet.ts +1 -1
- package/src/cli/index.ts +3 -1
- package/src/cli/internal-dispatch.ts +3 -4
- 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/panes.ts +19 -5
- package/src/cli/reset.ts +228 -106
- package/src/cli/run.ts +9 -4
- package/src/cli/select.ts +664 -0
- package/src/cli/share.ts +5 -1
- package/src/cli/skills-eval.ts +3 -3
- package/src/cli/skills.ts +9 -2
- package/src/cli/targets.ts +5 -6
- package/src/cli/trace.ts +55 -4
- package/src/cli/uninstall.ts +233 -165
- package/src/cli/upgrade.ts +204 -149
- package/src/cli/usage.ts +86 -27
- package/src/cli/validate-model.ts +3 -3
- package/src/cli/wiki-generate.ts +1 -1
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +131 -86
- package/src/core/bus-events.ts +51 -6
- package/src/core/config.ts +61 -1
- package/src/core/defaults.ts +7 -4
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/external-diagnostic.ts +44 -0
- package/src/core/gateway-routing.ts +157 -0
- package/src/core/guardrails.ts +10 -49
- package/src/core/prompt-hint.ts +9 -0
- package/src/core/safe-exec.ts +17 -2
- package/src/core/skill-activation.ts +89 -2
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/builtins/world-knowledge.md +31 -0
- package/src/domains/agents/catalog.ts +13 -15
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +23 -1
- package/src/domains/agents/result-contract.ts +70 -0
- package/src/domains/config/keybindings.ts +8 -0
- package/src/domains/context/extension.ts +0 -3
- package/src/domains/context/wiki/map-seed.ts +589 -0
- package/src/domains/context/wiki/plan.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -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 +11 -0
- package/src/domains/dispatch/capacity-lease.ts +17 -0
- package/src/domains/dispatch/contract.ts +11 -1
- package/src/domains/dispatch/extension.ts +237 -49
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/path-scope.ts +235 -24
- package/src/domains/dispatch/run-event-journal.ts +4 -15
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/transport.ts +45 -21
- package/src/domains/dispatch/types.ts +58 -3
- package/src/domains/dispatch/worker-model-metadata.ts +38 -0
- package/src/domains/eval/artifacts/store.ts +5 -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 +5 -2
- package/src/domains/eval/schema/suite.ts +28 -0
- package/src/domains/eval/schema/verdict.ts +2 -2
- package/src/domains/eval/store.ts +8 -1
- package/src/domains/eval/suites/resolve.ts +13 -1
- package/src/domains/eval/suites/run.ts +24 -3
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- package/src/domains/interop/registry.ts +6 -2
- package/src/domains/interop/types.ts +4 -0
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/index.ts +6 -0
- package/src/domains/lifecycle/naming-resources.ts +19 -4
- package/src/domains/lifecycle/naming-yazi.ts +10 -5
- package/src/domains/memory/task-memory-policy.ts +70 -26
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +28 -5
- package/src/domains/middleware/marketplace-offer.ts +3 -35
- package/src/domains/middleware/memory-intervention.ts +127 -32
- package/src/domains/middleware/memory-step-endpoint.ts +3 -2
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +28 -0
- package/src/domains/middleware/skills-reminder.ts +31 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +38 -0
- package/src/domains/mux/detect.ts +6 -13
- package/src/domains/mux/index.ts +1 -1
- package/src/domains/mux/operations.ts +44 -5
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/session.ts +53 -4
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/compaction-usage.ts +118 -0
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/cost.ts +1 -1
- package/src/domains/observability/extension.ts +17 -4
- package/src/domains/observability/out-of-turn-usage.ts +52 -21
- package/src/domains/observability/projection.ts +14 -90
- package/src/domains/observability/trace-store.ts +43 -7
- package/src/domains/prompts/compiler.ts +73 -53
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +97 -9
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +10 -24
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/contract.ts +4 -1
- package/src/domains/providers/extension.ts +40 -9
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/model-capabilities.ts +9 -0
- package/src/domains/providers/model-discovery.ts +2 -0
- package/src/domains/providers/model-runtime-capabilities.ts +99 -25
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
- package/src/domains/providers/runtime-resolution.ts +31 -0
- package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
- 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/common/probe-helpers.ts +7 -2
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- 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/cost-provenance.ts +19 -0
- package/src/domains/providers/types/local-model-quirks.ts +85 -37
- 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 +23 -19
- package/src/domains/resources/skills/marketplace.ts +63 -11
- package/src/domains/safety/autonomy.ts +15 -0
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/index.ts +1 -0
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/safety/path-policy.ts +1 -1
- package/src/domains/safety/policy-engine.ts +34 -11
- package/src/domains/safety/protected-artifacts.ts +191 -88
- package/src/domains/safety/run-effects.ts +2 -22
- package/src/domains/safety/skill-authority.ts +55 -0
- package/src/domains/session/compaction/compact.ts +72 -22
- package/src/domains/session/entries.ts +6 -0
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/session/usage.ts +3 -3
- package/src/domains/share/archive.ts +164 -7
- package/src/engine/acp/server.ts +62 -9
- 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/llamacpp-residency.ts +3 -4
- package/src/engine/apis/lmstudio.ts +3 -3
- package/src/engine/apis/ollama-native.ts +6 -6
- package/src/engine/apis/openai-completions.ts +145 -39
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +8 -27
- package/src/engine/external-subprocess.ts +114 -6
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -12
- package/src/engine/worker-runtime.ts +40 -11
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/background-model-metadata.ts +18 -0
- package/src/entry/compaction-prompt.ts +57 -0
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +464 -251
- package/src/entry/task-memory-lifecycle.ts +35 -0
- package/src/interactive/application-controller.ts +2 -1
- package/src/interactive/bus-notices.ts +8 -1
- package/src/interactive/chat-loop-messages.ts +16 -17
- package/src/interactive/chat-loop.ts +75 -3
- package/src/interactive/chat-panel.ts +36 -13
- package/src/interactive/chat-renderer.ts +72 -7
- package/src/interactive/cost-overlay.ts +26 -2
- package/src/interactive/dispatch-board.ts +6 -11
- package/src/interactive/footer/widgets.ts +13 -0
- package/src/interactive/interactive-application.ts +39 -4
- package/src/interactive/interactive-input-runtime.ts +4 -0
- package/src/interactive/interactive-presentation.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +4 -1
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/settings.ts +27 -16
- package/src/interactive/panes-runtime.ts +111 -35
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/renderers/worker-entry.ts +32 -0
- package/src/interactive/slash-commands.ts +153 -20
- package/src/interactive/stream-pacing-policy.ts +0 -23
- package/src/interactive/theme/labels.ts +19 -13
- package/src/interactive/turn-context.ts +39 -20
- 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/worker-receipts.ts +1 -0
- package/src/interactive/worker-stream.ts +6 -1
- package/src/interactive/yazi-bridge.ts +60 -6
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +59 -21
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-arguments.ts +6 -1
- package/src/tools/dispatch-event-text.ts +10 -0
- package/src/tools/dispatch-plan.ts +49 -4
- package/src/tools/dispatch-run-events.ts +1 -1
- package/src/tools/dispatch-runner.ts +12 -0
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/observation.ts +4 -5
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +41 -12
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- package/src/tools/worker-evidence.ts +3 -1
- package/src/worker/spec-contract.ts +4 -0
- package/dist/builtins-UJLMOVOV.js +0 -17
- package/dist/chunk-5QIAJV2D.js +0 -48
- package/dist/chunk-JZWT5J3Y.js +0 -814
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-WR6U3OVP.js +0 -45
- package/dist/chunk-Y45G3AXC.js +0 -1558
- package/dist/reset-EOLM7GVE.js +0 -230
- package/dist/uninstall-N34PCTGJ.js +0 -331
- package/dist/upgrade-H7TOM7YL.js +0 -323
- package/docs/artifact-versions.md +0 -67
- package/docs/development-pipeline.md +0 -121
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/time-conventions.md +0 -101
|
@@ -16,6 +16,7 @@ import { performance } from "node:perf_hooks";
|
|
|
16
16
|
import { BusChannels, type DispatchCompletedPayload, type DispatchRunIdentity } from "../../core/bus-events.js";
|
|
17
17
|
import { DEFAULT_SETTINGS, type DelegationToolGovernance } from "../../core/defaults.js";
|
|
18
18
|
import type { DomainBundle, DomainContext, DomainExtension } from "../../core/domain-loader.js";
|
|
19
|
+
import { gatewayRoutingObservationFromRecord } from "../../core/gateway-routing.js";
|
|
19
20
|
import { GUARDRAIL_DEFAULTS } from "../../core/guardrails.js";
|
|
20
21
|
import { readClioVersion, readPiMonoVersion } from "../../core/package-root.js";
|
|
21
22
|
import { canonicalizeExistingPath } from "../../core/path-canonical.js";
|
|
@@ -77,6 +78,7 @@ import type { PromptsContract } from "../prompts/contract.js";
|
|
|
77
78
|
import { type EffectivePricing, resolveEffectivePricing } from "../providers/catalog.js";
|
|
78
79
|
import {
|
|
79
80
|
type CapabilityFlags,
|
|
81
|
+
canonicalEndpointKey,
|
|
80
82
|
canonicalizeWireModelId,
|
|
81
83
|
type EndpointCapacity,
|
|
82
84
|
endpointCapacityFor,
|
|
@@ -157,6 +159,7 @@ import type {
|
|
|
157
159
|
DispatchAdmissionObserver,
|
|
158
160
|
DispatchContract,
|
|
159
161
|
DispatchPlanTaskResolution,
|
|
162
|
+
DispatchPreparationOptions,
|
|
160
163
|
DispatchRequest,
|
|
161
164
|
DispatchSnapshot,
|
|
162
165
|
} from "./contract.js";
|
|
@@ -181,7 +184,12 @@ import {
|
|
|
181
184
|
type HeartbeatStatus,
|
|
182
185
|
heartbeatMonotonicAt,
|
|
183
186
|
} from "./heartbeat.js";
|
|
184
|
-
import {
|
|
187
|
+
import {
|
|
188
|
+
type BatchVerificationGate,
|
|
189
|
+
createBatchVerificationGate,
|
|
190
|
+
hostVerificationRejection,
|
|
191
|
+
runHostVerification,
|
|
192
|
+
} from "./host-verification.js";
|
|
185
193
|
import { renderDispatchIntentRequirements } from "./intent-requirements.js";
|
|
186
194
|
import { adaptJointRouteInput } from "./joint-route-adapter.js";
|
|
187
195
|
import {
|
|
@@ -201,6 +209,8 @@ import {
|
|
|
201
209
|
type DispatchPathScope,
|
|
202
210
|
declaredScopeReplacementDiagnostic,
|
|
203
211
|
declaredScopeReplacementNotice,
|
|
212
|
+
inferredScopeParentTokenDiagnostic,
|
|
213
|
+
inferredScopeParentTokenNotice,
|
|
204
214
|
resolveDispatchPathScope,
|
|
205
215
|
} from "./path-scope.js";
|
|
206
216
|
import { deriveEnvelopePhaseDurations, deriveRunPhaseDurations, recordRunTimingBestEffort } from "./phase-timing.js";
|
|
@@ -289,6 +299,7 @@ import {
|
|
|
289
299
|
validateJobSpec,
|
|
290
300
|
} from "./validation.js";
|
|
291
301
|
import { describeUngroundedValidations, groundClaimedValidations, invalidatesQuality } from "./validation-grounding.js";
|
|
302
|
+
import { prepareWorkerModelMetadata } from "./worker-model-metadata.js";
|
|
292
303
|
import {
|
|
293
304
|
type AgentLedgerBody,
|
|
294
305
|
computeSettingsFingerprint,
|
|
@@ -1431,6 +1442,13 @@ function runtimeLimitations(runtimeKind: RunKind, runtimeId: string): string[] {
|
|
|
1431
1442
|
"Claude CLI subprocess executes Claude Code tools; Clio constrains permission mode and forbids dangerous bypass unless explicitly gated",
|
|
1432
1443
|
];
|
|
1433
1444
|
}
|
|
1445
|
+
if (runtimeKind === "subprocess" && runtimeId === "antigravity-code") {
|
|
1446
|
+
return [
|
|
1447
|
+
"Antigravity CLI owns its internal tools, network activity, prompts, and approvals; Clio observes only structured stream output and does not provide per-tool mediation or complete tool telemetry",
|
|
1448
|
+
"Antigravity conversation ids are recorded only as opaque provider observations; Clio does not resume them",
|
|
1449
|
+
"Antigravity runs are one-shot and never retried automatically",
|
|
1450
|
+
];
|
|
1451
|
+
}
|
|
1434
1452
|
// HTTP/native runtimes run through pi-agent-core, which Clio observes and
|
|
1435
1453
|
// controls directly, so there are no runtime-imposed dispatch limitations.
|
|
1436
1454
|
return [];
|
|
@@ -1471,13 +1489,6 @@ function assertWriteRootsEnforceable(runtime: RuntimeDescriptor, writeRoots: Rea
|
|
|
1471
1489
|
);
|
|
1472
1490
|
}
|
|
1473
1491
|
|
|
1474
|
-
function assertWorkerBudgetEnforceable(runtime: RuntimeDescriptor, hasDeclaredBudget: boolean): void {
|
|
1475
|
-
if (!hasDeclaredBudget || runtime.kind !== "subprocess") return;
|
|
1476
|
-
throw new Error(
|
|
1477
|
-
`dispatch: runtime '${runtime.id}' cannot enforce an explicit dispatch budget because subprocess workers do not expose per-tool mediation; choose a native or claude-sdk worker`,
|
|
1478
|
-
);
|
|
1479
|
-
}
|
|
1480
|
-
|
|
1481
1492
|
/**
|
|
1482
1493
|
* API families whose wire protocol carries tool calls. Membership is a property
|
|
1483
1494
|
* of the protocol, not of any one model: every server speaking one of these can
|
|
@@ -1603,11 +1614,30 @@ function assertPostRuntimeToolCompatibility(
|
|
|
1603
1614
|
}
|
|
1604
1615
|
|
|
1605
1616
|
function workerToolCallHardCap(settings: EffectiveSettings): number {
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1617
|
+
return settings?.fleet.limits.toolCallsPerRun ?? GUARDRAIL_DEFAULTS.workerToolCallCap;
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1620
|
+
/**
|
|
1621
|
+
* Only a runtime that declares its external agent loop may accept a declared
|
|
1622
|
+
* per-tool budget: Clio records that budget as unobserved rather than enforced.
|
|
1623
|
+
* Any other subprocess runtime cannot mediate tool calls, so a declared budget
|
|
1624
|
+
* would be a claim nobody enforces.
|
|
1625
|
+
*/
|
|
1626
|
+
export function assertWorkerBudgetEnforceable(
|
|
1627
|
+
runtime: Pick<RuntimeDescriptor, "id" | "kind" | "externalAgentLoop">,
|
|
1628
|
+
hasDeclaredBudget: boolean,
|
|
1629
|
+
): void {
|
|
1630
|
+
if (!hasDeclaredBudget || runtime.kind !== "subprocess" || runtime.externalAgentLoop !== undefined) return;
|
|
1631
|
+
throw new Error(
|
|
1632
|
+
`dispatch: runtime '${runtime.id}' cannot enforce an explicit dispatch budget because subprocess workers do not expose per-tool mediation; choose a native or claude-sdk worker`,
|
|
1633
|
+
);
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
/** Per-tool budget enforcement is real only where Clio observes each tool call. */
|
|
1637
|
+
export function budgetEnforcementForRuntime(
|
|
1638
|
+
runtime: Pick<RuntimeDescriptor, "kind">,
|
|
1639
|
+
): "native-per-tool" | "external-one-shot" {
|
|
1640
|
+
return runtime.kind === "subprocess" ? "external-one-shot" : "native-per-tool";
|
|
1611
1641
|
}
|
|
1612
1642
|
|
|
1613
1643
|
function resolveEffectiveWorkerBudget(input: {
|
|
@@ -1616,7 +1646,9 @@ function resolveEffectiveWorkerBudget(input: {
|
|
|
1616
1646
|
declared: ReturnType<typeof normalizeAgentSpec>["budget"];
|
|
1617
1647
|
allowedTools: ReadonlyArray<ToolName>;
|
|
1618
1648
|
settings: EffectiveSettings;
|
|
1649
|
+
runtime: RuntimeDescriptor;
|
|
1619
1650
|
}): RunToolBudgetEnvelope {
|
|
1651
|
+
assertWorkerBudgetEnforceable(input.runtime, input.declared !== null || input.req.budget !== undefined);
|
|
1620
1652
|
const hardCap = workerToolCallHardCap(input.settings);
|
|
1621
1653
|
const declared = input.declared ?? {
|
|
1622
1654
|
toolCalls: hardCap,
|
|
@@ -1631,6 +1663,7 @@ function resolveEffectiveWorkerBudget(input: {
|
|
|
1631
1663
|
hasReadTool: input.allowedTools.includes(ToolNames.Read),
|
|
1632
1664
|
retry: (input.req.lineage?.attempt ?? 0) > 0,
|
|
1633
1665
|
revision: input.req.gate?.role === "builder" && input.req.gate.cycle > 1 && input.req.gate.verdict === "revise",
|
|
1666
|
+
enforcement: budgetEnforcementForRuntime(input.runtime),
|
|
1634
1667
|
});
|
|
1635
1668
|
}
|
|
1636
1669
|
|
|
@@ -1971,6 +2004,15 @@ function clampWorkerAutonomy(session: AutonomyLevel, requested: AutonomyLevel |
|
|
|
1971
2004
|
return AUTONOMY_ORDER[requested] < AUTONOMY_ORDER[session] ? requested : session;
|
|
1972
2005
|
}
|
|
1973
2006
|
|
|
2007
|
+
/** Read-only recipes are an authority boundary, including on opaque external loops. */
|
|
2008
|
+
export function effectiveWorkerAutonomy(
|
|
2009
|
+
session: AutonomyLevel,
|
|
2010
|
+
requested: AutonomyLevel | undefined,
|
|
2011
|
+
capabilityClass: AgentCapabilityClass,
|
|
2012
|
+
): AutonomyLevel {
|
|
2013
|
+
return clampWorkerAutonomy(session, capabilityClass === "read-only" ? "read-only" : requested);
|
|
2014
|
+
}
|
|
2015
|
+
|
|
1974
2016
|
function requestedAutonomyEvidence(
|
|
1975
2017
|
sessionAutonomy: AutonomyLevel,
|
|
1976
2018
|
requestedAutonomy: AutonomyLevel | undefined,
|
|
@@ -2500,6 +2542,29 @@ export function createDispatchBundle(
|
|
|
2500
2542
|
return Object.fromEntries(Object.entries(configuredEndpointCapacities()).map(([key, value]) => [key, value.limit]));
|
|
2501
2543
|
}
|
|
2502
2544
|
|
|
2545
|
+
/**
|
|
2546
|
+
* Endpoints still bound by the blind one-slot default have never been
|
|
2547
|
+
* probed by any process, or their record expired. A fresh home carried that
|
|
2548
|
+
* bound into its first batch and refused two tasks on a server running
|
|
2549
|
+
* four, until the operator happened to run `targets --probe`. Probe each
|
|
2550
|
+
* such endpoint once per process, in the background and without the
|
|
2551
|
+
* inference-based reasoning check: the slot count is a header read, and the
|
|
2552
|
+
* model's first dispatch call is seconds away at the earliest. The probe
|
|
2553
|
+
* lands in the provider statuses and the durable slot store, which is where
|
|
2554
|
+
* admission already looks.
|
|
2555
|
+
*/
|
|
2556
|
+
const probedDefaultBoundEndpoints = new Set<string>();
|
|
2557
|
+
function probeEndpointsAtDefaultBound(): void {
|
|
2558
|
+
const capacities = configuredEndpointCapacities();
|
|
2559
|
+
for (const target of getEffectiveSettings()?.targets ?? []) {
|
|
2560
|
+
const key = canonicalEndpointKey(target);
|
|
2561
|
+
if (key === null || capacities[key]?.source !== "local-native-default") continue;
|
|
2562
|
+
if (probedDefaultBoundEndpoints.has(key)) continue;
|
|
2563
|
+
probedDefaultBoundEndpoints.add(key);
|
|
2564
|
+
void providers.probeTarget(target.id, { reasoning: false }).catch(() => undefined);
|
|
2565
|
+
}
|
|
2566
|
+
}
|
|
2567
|
+
|
|
2503
2568
|
function endpointCapacityForTarget(targetId: string): EndpointCapacity | null {
|
|
2504
2569
|
const status = providers.list().find((entry) => entry.target.id === targetId);
|
|
2505
2570
|
const target = status?.target ?? providers.getTarget(targetId);
|
|
@@ -2635,6 +2700,7 @@ export function createDispatchBundle(
|
|
|
2635
2700
|
nodeId: string,
|
|
2636
2701
|
timing: RunPhaseMarks,
|
|
2637
2702
|
endpoint?: EndpointCapacity | null,
|
|
2703
|
+
signal?: AbortSignal,
|
|
2638
2704
|
) {
|
|
2639
2705
|
const queuedAt = now();
|
|
2640
2706
|
timing.queuedAt = new Date(queuedAt).toISOString();
|
|
@@ -2650,7 +2716,12 @@ export function createDispatchBundle(
|
|
|
2650
2716
|
: planQueueSlot(req.reservation.ownerId, req.reservation.memberId, (error) =>
|
|
2651
2717
|
reportDispatchDiagnostic("read plan queue identity", error),
|
|
2652
2718
|
);
|
|
2719
|
+
const cancel = (): void => {
|
|
2720
|
+
capacityAdmission.cancel(assignmentId);
|
|
2721
|
+
};
|
|
2722
|
+
signal?.addEventListener("abort", cancel, { once: true });
|
|
2653
2723
|
try {
|
|
2724
|
+
signal?.throwIfAborted();
|
|
2654
2725
|
const admitted = await capacityAdmission.admit({
|
|
2655
2726
|
assignmentId,
|
|
2656
2727
|
nodeId,
|
|
@@ -2673,6 +2744,8 @@ export function createDispatchBundle(
|
|
|
2673
2744
|
else await failQueuedAssignment(assignmentId);
|
|
2674
2745
|
}
|
|
2675
2746
|
throw error;
|
|
2747
|
+
} finally {
|
|
2748
|
+
signal?.removeEventListener("abort", cancel);
|
|
2676
2749
|
}
|
|
2677
2750
|
}
|
|
2678
2751
|
|
|
@@ -2822,6 +2895,14 @@ export function createDispatchBundle(
|
|
|
2822
2895
|
if (draining) return { scheduled: false };
|
|
2823
2896
|
const rootRunId = run.lineage.rootRunId;
|
|
2824
2897
|
if (!retryChainIsLive(run)) return { scheduled: false };
|
|
2898
|
+
if (providers.getRuntime(run.runtimeId)?.externalAgentLoop?.generatingRetry === "forbidden") {
|
|
2899
|
+
retryBackoff.delete(rootRunId);
|
|
2900
|
+
return {
|
|
2901
|
+
scheduled: false,
|
|
2902
|
+
settlementDetail:
|
|
2903
|
+
"automatic retry suppressed because this external agent loop is one-shot and Clio cannot prove replay is side-effect-free",
|
|
2904
|
+
};
|
|
2905
|
+
}
|
|
2825
2906
|
if (!RETRYABLE_OUTCOMES.has(outcome)) {
|
|
2826
2907
|
retryBackoff.delete(rootRunId);
|
|
2827
2908
|
return { scheduled: false };
|
|
@@ -3197,6 +3278,9 @@ export function createDispatchBundle(
|
|
|
3197
3278
|
const tickMonotonic = monotonicNow();
|
|
3198
3279
|
for (const run of active.values()) {
|
|
3199
3280
|
if (run.aborted || run.stallKilled || !run.heartbeatAt) continue;
|
|
3281
|
+
// Finalizers retain active entries while awaiting ledger persistence.
|
|
3282
|
+
// Their terminal status is already sealed into the receipt digest.
|
|
3283
|
+
if (ledger.get(run.runId)?.endedAt !== null) continue;
|
|
3200
3284
|
const heartbeatMonotonic = heartbeatMonotonicAt(run.heartbeatAt);
|
|
3201
3285
|
if (!Number.isFinite(heartbeatMonotonic) || !Number.isFinite(run.heartbeatAt.current)) continue;
|
|
3202
3286
|
if (run.runtimeKind === "acp-delegation") {
|
|
@@ -3369,9 +3453,31 @@ export function createDispatchBundle(
|
|
|
3369
3453
|
agentId: req.agentId,
|
|
3370
3454
|
});
|
|
3371
3455
|
}
|
|
3456
|
+
// A reinterpreted "../" token is the one legacy-mode scope fact that earns
|
|
3457
|
+
// the channel: it fires only where the dispatch used to fail outright, so
|
|
3458
|
+
// it cannot warn on the ordinary intent-less dispatch the comment above
|
|
3459
|
+
// keeps quiet. Anchoring is reported alongside dropping because it is the
|
|
3460
|
+
// half that adds to scope, putting a path in working context that the
|
|
3461
|
+
// prose never literally spelled.
|
|
3462
|
+
const parentTokenDiagnostic = inferredScopeParentTokenDiagnostic(pathScope);
|
|
3463
|
+
if (parentTokenDiagnostic !== null) {
|
|
3464
|
+
reportDispatchDiagnostic("inferred scope parent tokens", new Error(parentTokenDiagnostic));
|
|
3465
|
+
}
|
|
3466
|
+
const parentTokenNotice = inferredScopeParentTokenNotice(pathScope);
|
|
3467
|
+
if (parentTokenNotice !== null) {
|
|
3468
|
+
context.bus.emit(BusChannels.DispatchScopeNotice, {
|
|
3469
|
+
...parentTokenNotice,
|
|
3470
|
+
agentId: req.agentId,
|
|
3471
|
+
});
|
|
3472
|
+
}
|
|
3372
3473
|
}
|
|
3373
3474
|
|
|
3374
|
-
async function resolveLifecycle(
|
|
3475
|
+
async function resolveLifecycle(
|
|
3476
|
+
req: DispatchRequest,
|
|
3477
|
+
settings: EffectiveSettings,
|
|
3478
|
+
metadataDeadlineAt: number,
|
|
3479
|
+
signal?: AbortSignal,
|
|
3480
|
+
): Promise<DispatchLifecycleStage> {
|
|
3375
3481
|
const recipe = agents.get(req.agentId);
|
|
3376
3482
|
if (!recipe) {
|
|
3377
3483
|
throw new Error(`dispatch: unknown agent recipe: ${req.agentId}`);
|
|
@@ -3402,28 +3508,42 @@ export function createDispatchBundle(
|
|
|
3402
3508
|
autoSelected: req.agentSelection?.mode === "auto",
|
|
3403
3509
|
resultContractKind: spec.resultContract.kind,
|
|
3404
3510
|
specs: agents.listSpecs(),
|
|
3511
|
+
intent: req.intent ?? null,
|
|
3405
3512
|
});
|
|
3406
3513
|
if (capabilityMismatch?.verdict === "refuse") throw new Error(capabilityMismatch.detail);
|
|
3407
3514
|
const pathScope = resolveDispatchPathScope(req);
|
|
3408
3515
|
publishDispatchPathScope(req, pathScope);
|
|
3409
3516
|
const admission = resolveDispatchAdmissionStage(req, recipe, safety, pathScope);
|
|
3410
3517
|
const targets = readWorkerTargets(settings);
|
|
3411
|
-
const
|
|
3412
|
-
|
|
3413
|
-
|
|
3414
|
-
|
|
3415
|
-
|
|
3416
|
-
|
|
3417
|
-
|
|
3418
|
-
|
|
3419
|
-
|
|
3518
|
+
const resolveTarget = () =>
|
|
3519
|
+
resolveDispatchTarget(
|
|
3520
|
+
req,
|
|
3521
|
+
recipe,
|
|
3522
|
+
targets.workerDefault,
|
|
3523
|
+
targets.workerProfiles,
|
|
3524
|
+
targets.agentBindings,
|
|
3525
|
+
targets.targetOrder,
|
|
3526
|
+
providers,
|
|
3527
|
+
);
|
|
3528
|
+
let target = resolveTarget();
|
|
3529
|
+
const identity = (resolved: ResolvedTarget): string =>
|
|
3530
|
+
JSON.stringify([
|
|
3531
|
+
resolved.target.id,
|
|
3532
|
+
resolved.runtime.id,
|
|
3533
|
+
resolved.wireModelId,
|
|
3534
|
+
endpointIdentityHash(resolved.target.url),
|
|
3535
|
+
]);
|
|
3536
|
+
const selectedIdentity = identity(target);
|
|
3537
|
+
await prepareWorkerModelMetadata(providers, target.target.id, metadataDeadlineAt, signal, now);
|
|
3538
|
+
target = resolveTarget();
|
|
3539
|
+
if (identity(target) !== selectedIdentity) {
|
|
3540
|
+
throw new Error("dispatch: worker route changed during model metadata preparation; request a fresh admission");
|
|
3541
|
+
}
|
|
3420
3542
|
enforceCapabilityGate(target.target.id, target.modelCapabilities, req.requiredCapabilities);
|
|
3421
3543
|
assertRuntimeCanHonorWorkerPermissionMode(target.runtime, settings?.fleet.permissions.mode ?? "deny");
|
|
3422
|
-
assertWorkerBudgetEnforceable(target.runtime, spec.budget !== null || req.budget !== undefined);
|
|
3423
|
-
|
|
3424
3544
|
const cwd = req.cwd ?? process.cwd();
|
|
3425
3545
|
const sessionAutonomy = settings?.safety.autonomy ?? "auto-edit";
|
|
3426
|
-
const effectiveAutonomy =
|
|
3546
|
+
const effectiveAutonomy = effectiveWorkerAutonomy(sessionAutonomy, req.autonomy, spec.capabilityClass);
|
|
3427
3547
|
const effectiveTools = withLedgerToolNarrowing(
|
|
3428
3548
|
effectiveToolNames(admission.allowedTools, target, pathScope.writeBoundaries.length > 0, deniedToolNames(req)),
|
|
3429
3549
|
req,
|
|
@@ -3434,17 +3554,16 @@ export function createDispatchBundle(
|
|
|
3434
3554
|
allowedTools: effectiveTools,
|
|
3435
3555
|
};
|
|
3436
3556
|
const personaBody = workerPersonaBody(req, recipe, effectiveTools);
|
|
3557
|
+
const hasCanonicalContext = effectiveTools.includes(ToolNames.Context);
|
|
3558
|
+
const hasBoundSkills =
|
|
3559
|
+
hasCanonicalContext && recipe.skills !== undefined && recipe.skills.length > 0 && req.noSkills !== true;
|
|
3437
3560
|
const compiledWorkerPrompt = await prompts.compileWorkerPrompt({
|
|
3438
3561
|
autonomy: effectiveAutonomy,
|
|
3439
3562
|
providerSupportsTools: target.runtime.kind === "subprocess" ? null : targetToolCapability(target),
|
|
3440
3563
|
toolNames: effectiveTools,
|
|
3441
|
-
toolPromptHints: toolPromptHintsForNames(effectiveTools),
|
|
3442
|
-
hasCanonicalContext
|
|
3443
|
-
hasBoundSkills
|
|
3444
|
-
effectiveTools.includes(ToolNames.Context) &&
|
|
3445
|
-
recipe.skills !== undefined &&
|
|
3446
|
-
recipe.skills.length > 0 &&
|
|
3447
|
-
req.noSkills !== true,
|
|
3564
|
+
toolPromptHints: toolPromptHintsForNames(effectiveTools, hasBoundSkills ? "bound-worker" : "worker"),
|
|
3565
|
+
hasCanonicalContext,
|
|
3566
|
+
hasBoundSkills,
|
|
3448
3567
|
onPermission: settings?.fleet.permissions.mode ?? "deny",
|
|
3449
3568
|
persona: {
|
|
3450
3569
|
id: `persona.${recipe.id}`,
|
|
@@ -3463,6 +3582,7 @@ export function createDispatchBundle(
|
|
|
3463
3582
|
declared: spec.budget,
|
|
3464
3583
|
allowedTools: effectiveTools,
|
|
3465
3584
|
settings,
|
|
3585
|
+
runtime: target.runtime,
|
|
3466
3586
|
});
|
|
3467
3587
|
// Fetch structured project context only for tiers that receive it, so
|
|
3468
3588
|
// read-only scouts never pay the CLIO-CODER.md read. The tier is spec policy
|
|
@@ -3783,11 +3903,13 @@ export function createDispatchBundle(
|
|
|
3783
3903
|
const responseModelIdObservation = responseModelIdObservationFromRecord(event.message, "not-observed");
|
|
3784
3904
|
const differingResponseModelId = readStringOrNull(event.message.responseModel);
|
|
3785
3905
|
const providerResponseId = readStringOrNull(event.message.responseId);
|
|
3906
|
+
const gatewayRouting = gatewayRoutingObservationFromRecord(event.message);
|
|
3786
3907
|
upstreamResponses.push({
|
|
3787
3908
|
requestedModelId,
|
|
3788
3909
|
responseModelIdObservation,
|
|
3789
3910
|
differingResponseModelId,
|
|
3790
3911
|
providerResponseId,
|
|
3912
|
+
...(gatewayRouting !== null ? { gatewayRouting } : {}),
|
|
3791
3913
|
});
|
|
3792
3914
|
if (event.message.stopReason === "error") {
|
|
3793
3915
|
const message = readStringOrNull(event.message.errorMessage);
|
|
@@ -4345,6 +4467,8 @@ export function createDispatchBundle(
|
|
|
4345
4467
|
async function dispatchAttempt(
|
|
4346
4468
|
req: DispatchRequest,
|
|
4347
4469
|
observer?: DispatchAdmissionObserver,
|
|
4470
|
+
preparation?: DispatchPreparationOptions,
|
|
4471
|
+
settlement?: BatchVerificationGate,
|
|
4348
4472
|
): Promise<{
|
|
4349
4473
|
runId: string;
|
|
4350
4474
|
events: AsyncIterableIterator<unknown>;
|
|
@@ -4440,14 +4564,19 @@ export function createDispatchBundle(
|
|
|
4440
4564
|
}
|
|
4441
4565
|
rebindReservationSlot(req, "local", null, UNKNOWN_PRICING_ADMISSION_ESTIMATE_USD, settings);
|
|
4442
4566
|
routeObservation = observeShadowRoute(req, undefined, settings);
|
|
4443
|
-
|
|
4444
|
-
|
|
4445
|
-
|
|
4446
|
-
|
|
4567
|
+
const delegated = await dispatchAcpDelegation(req, settings, timing, routeObservation.decision, observer);
|
|
4568
|
+
// An ACP member never runs host verification, so it can only ever leave
|
|
4569
|
+
// the barrier. It still edits the checkout, so the barrier has to wait
|
|
4570
|
+
// for it; dispatch() releases it when its finalPromise settles.
|
|
4571
|
+
settlement?.live(delegated.runId);
|
|
4572
|
+
return attachRouteObservation({ ...delegated, effectiveRequest: req });
|
|
4447
4573
|
}
|
|
4448
4574
|
|
|
4449
4575
|
req = routeAroundCoolingTarget(req, settings) ?? req;
|
|
4450
|
-
const
|
|
4576
|
+
const metadataDeadlineAt =
|
|
4577
|
+
req.assignmentDeadlineAt ?? Date.parse(requestedAt) + (req.routingIntent?.deadlineMs ?? 60_000);
|
|
4578
|
+
const lifecycle = await resolveLifecycle(req, settings, metadataDeadlineAt, preparation?.signal);
|
|
4579
|
+
preparation?.signal?.throwIfAborted();
|
|
4451
4580
|
timing.decisionCompletedAt = new Date(now()).toISOString();
|
|
4452
4581
|
assertResponseSchemaEnforceable(
|
|
4453
4582
|
lifecycle.target.runtime,
|
|
@@ -4524,7 +4653,13 @@ export function createDispatchBundle(
|
|
|
4524
4653
|
if (queuedIdentity !== null) publishCapacityQueued(queuedIdentity, timing, placement?.node ?? null);
|
|
4525
4654
|
let capacityLease: Awaited<ReturnType<typeof admitAssignmentCapacity>>;
|
|
4526
4655
|
try {
|
|
4527
|
-
capacityLease = await admitAssignmentCapacity(
|
|
4656
|
+
capacityLease = await admitAssignmentCapacity(
|
|
4657
|
+
req,
|
|
4658
|
+
placement?.node.id ?? "local",
|
|
4659
|
+
timing,
|
|
4660
|
+
endpoint,
|
|
4661
|
+
preparation?.signal,
|
|
4662
|
+
);
|
|
4528
4663
|
} catch (error) {
|
|
4529
4664
|
if (queuedIdentity !== null) publishCapacityAdmissionFailure(queuedIdentity, error);
|
|
4530
4665
|
throw error;
|
|
@@ -4535,6 +4670,7 @@ export function createDispatchBundle(
|
|
|
4535
4670
|
|
|
4536
4671
|
const ledgerRef = (() => {
|
|
4537
4672
|
try {
|
|
4673
|
+
preparation?.signal?.throwIfAborted();
|
|
4538
4674
|
return requireLedger();
|
|
4539
4675
|
} catch (error) {
|
|
4540
4676
|
leaseSlot.release();
|
|
@@ -4597,6 +4733,7 @@ export function createDispatchBundle(
|
|
|
4597
4733
|
};
|
|
4598
4734
|
let worker: SpawnedWorker;
|
|
4599
4735
|
try {
|
|
4736
|
+
preparation?.signal?.throwIfAborted();
|
|
4600
4737
|
worker = (placement?.spawn ?? spawnWorker)(spec, {
|
|
4601
4738
|
cwd: lifecycle.cwd,
|
|
4602
4739
|
now,
|
|
@@ -4818,11 +4955,13 @@ export function createDispatchBundle(
|
|
|
4818
4955
|
const responseModelIdObservation = responseModelIdObservationFromRecord(event.message, "not-observed");
|
|
4819
4956
|
const differingResponseModelId = readStringOrNull(event.message.responseModel);
|
|
4820
4957
|
const providerResponseId = readStringOrNull(event.message.responseId);
|
|
4958
|
+
const gatewayRouting = gatewayRoutingObservationFromRecord(event.message);
|
|
4821
4959
|
upstreamResponses.push({
|
|
4822
4960
|
requestedModelId,
|
|
4823
4961
|
responseModelIdObservation,
|
|
4824
4962
|
differingResponseModelId,
|
|
4825
4963
|
providerResponseId,
|
|
4964
|
+
...(gatewayRouting !== null ? { gatewayRouting } : {}),
|
|
4826
4965
|
});
|
|
4827
4966
|
if (event.message.stopReason === "error") {
|
|
4828
4967
|
const message = readStringOrNull(event.message.errorMessage);
|
|
@@ -5368,6 +5507,14 @@ export function createDispatchBundle(
|
|
|
5368
5507
|
return { assessment, rigor };
|
|
5369
5508
|
};
|
|
5370
5509
|
|
|
5510
|
+
// The worker is spawned and its ledger row exists, so from here it can
|
|
5511
|
+
// write and the batch barrier has to wait for it. Registered after the
|
|
5512
|
+
// try/catch at 4939-5068, which aborts the worker and releases the lease on
|
|
5513
|
+
// failure, so a run that never reaches the barrier is never made live.
|
|
5514
|
+
// Paired with the abandon in dispatch(), which fires the moment
|
|
5515
|
+
// finalPromise settles.
|
|
5516
|
+
settlement?.live(envelope.id);
|
|
5517
|
+
|
|
5371
5518
|
const finalPromise = (async (): Promise<RunReceipt> => {
|
|
5372
5519
|
try {
|
|
5373
5520
|
const result = await workerDone;
|
|
@@ -5438,7 +5585,9 @@ export function createDispatchBundle(
|
|
|
5438
5585
|
reachedTerminalResult: resultContractWasDue(finalOutcome, outcomeCode),
|
|
5439
5586
|
output: capturedOutput?.state === "final" ? capturedOutput.text : null,
|
|
5440
5587
|
cwd: lifecycle.cwd,
|
|
5441
|
-
networkAllowed:
|
|
5588
|
+
networkAllowed:
|
|
5589
|
+
lifecycle.admission.allowedTools.includes(ToolNames.WebFetch) ||
|
|
5590
|
+
lifecycle.target.runtime.externalAgentLoop?.network === "externally-governed-unobserved",
|
|
5442
5591
|
observedRunEffects,
|
|
5443
5592
|
filesystem: nodeResultContractFilesystem(),
|
|
5444
5593
|
});
|
|
@@ -5492,12 +5641,21 @@ export function createDispatchBundle(
|
|
|
5492
5641
|
finalDetail = WORKER_FINAL_OUTPUT_MISSING_DETAIL;
|
|
5493
5642
|
failureMessage = finalDetail;
|
|
5494
5643
|
}
|
|
5495
|
-
const
|
|
5644
|
+
const hostVerificationInput = {
|
|
5496
5645
|
runId: envelope.id,
|
|
5497
5646
|
request: req,
|
|
5498
5647
|
workerSuccessful: finalOutcome === "succeeded",
|
|
5499
|
-
onDiagnostic: (error) =>
|
|
5500
|
-
|
|
5648
|
+
onDiagnostic: (error: unknown) =>
|
|
5649
|
+
reportDispatchDiagnostic(`write host verification memo for ${envelope.id}`, error),
|
|
5650
|
+
};
|
|
5651
|
+
// This await is the batch barrier. It already sits before
|
|
5652
|
+
// buildReceiptDraft below, which is why batch settlement needs no
|
|
5653
|
+
// receipt restructuring: every member parks here with its outcome
|
|
5654
|
+
// resolved and nothing sealed.
|
|
5655
|
+
const hostVerification =
|
|
5656
|
+
settlement === undefined
|
|
5657
|
+
? await runHostVerification(hostVerificationInput)
|
|
5658
|
+
: await settlement.arrive(hostVerificationInput);
|
|
5501
5659
|
const hostRejection = hostVerificationRejection(hostVerification);
|
|
5502
5660
|
if (hostRejection !== null && finalOutcome === "succeeded") {
|
|
5503
5661
|
finalOutcome = "failed";
|
|
@@ -5690,12 +5848,20 @@ export function createDispatchBundle(
|
|
|
5690
5848
|
async function dispatch(
|
|
5691
5849
|
req: DispatchRequest,
|
|
5692
5850
|
observer?: DispatchAdmissionObserver,
|
|
5851
|
+
preparation?: DispatchPreparationOptions,
|
|
5852
|
+
settlement?: BatchVerificationGate,
|
|
5693
5853
|
): Promise<{
|
|
5694
5854
|
runId: string;
|
|
5695
5855
|
events: AsyncIterableIterator<unknown>;
|
|
5696
5856
|
finalPromise: Promise<RunReceipt>;
|
|
5697
5857
|
}> {
|
|
5698
|
-
let prepared =
|
|
5858
|
+
let prepared =
|
|
5859
|
+
preparation?.deadlineAt === undefined
|
|
5860
|
+
? req
|
|
5861
|
+
: {
|
|
5862
|
+
...req,
|
|
5863
|
+
assignmentDeadlineAt: Math.min(req.assignmentDeadlineAt ?? Number.POSITIVE_INFINITY, preparation.deadlineAt),
|
|
5864
|
+
};
|
|
5699
5865
|
let createdWorktree: DispatchRequest["taskWorktree"];
|
|
5700
5866
|
let writerLease: CheckoutWriterLease | undefined;
|
|
5701
5867
|
const writerRecipe = agents.get(req.agentId);
|
|
@@ -5727,7 +5893,7 @@ export function createDispatchBundle(
|
|
|
5727
5893
|
return rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel) ? entry : resolvePath(taskWorktree.path, rel);
|
|
5728
5894
|
});
|
|
5729
5895
|
prepared = {
|
|
5730
|
-
...
|
|
5896
|
+
...prepared,
|
|
5731
5897
|
runIdHint: runId,
|
|
5732
5898
|
taskWorktree,
|
|
5733
5899
|
cwd: workerCwd,
|
|
@@ -5737,7 +5903,8 @@ export function createDispatchBundle(
|
|
|
5737
5903
|
}
|
|
5738
5904
|
let handle: Awaited<ReturnType<typeof dispatchAttempt>>;
|
|
5739
5905
|
try {
|
|
5740
|
-
|
|
5906
|
+
preparation?.signal?.throwIfAborted();
|
|
5907
|
+
handle = await dispatchAttempt(prepared, observer, preparation, settlement);
|
|
5741
5908
|
} catch (error) {
|
|
5742
5909
|
writerLease?.release();
|
|
5743
5910
|
if (createdWorktree !== undefined) {
|
|
@@ -5752,6 +5919,14 @@ export function createDispatchBundle(
|
|
|
5752
5919
|
}
|
|
5753
5920
|
throw error;
|
|
5754
5921
|
}
|
|
5922
|
+
// A finalization that throws before the barrier, and an ACP handle that
|
|
5923
|
+
// never reaches it at all, must not park their siblings forever. A member
|
|
5924
|
+
// that already arrived is parked and abandon() is a no-op for it, so this
|
|
5925
|
+
// fires harmlessly on the normal path.
|
|
5926
|
+
if (settlement !== undefined) {
|
|
5927
|
+
const release = (): void => settlement.abandon(handle.runId);
|
|
5928
|
+
handle.finalPromise.then(release, release);
|
|
5929
|
+
}
|
|
5755
5930
|
// Requests carrying lineage are internal attempts (retry or nested
|
|
5756
5931
|
// orchestration) and retain the per-attempt handle contract.
|
|
5757
5932
|
if (req.lineage) return { ...handle, finalPromise: handle.finalPromise.finally(() => writerLease?.release()) };
|
|
@@ -5856,7 +6031,6 @@ export function createDispatchBundle(
|
|
|
5856
6031
|
);
|
|
5857
6032
|
assertPostRuntimeToolCompatibility(req.agentId, agentSpec, effectiveTools, target);
|
|
5858
6033
|
assertRuntimeCanHonorWorkerPermissionMode(target.runtime, settings?.fleet.permissions.mode ?? "deny");
|
|
5859
|
-
assertWorkerBudgetEnforceable(target.runtime, agentSpec.budget !== null || req.budget !== undefined);
|
|
5860
6034
|
assertResponseSchemaEnforceable(target.runtime, target.modelCapabilities, req.responseSchema, effectiveTools.length);
|
|
5861
6035
|
assertWriteRootsEnforceable(target.runtime, pathScope.writeBoundaries);
|
|
5862
6036
|
assertProtectedArtifactsEnforceable(
|
|
@@ -5870,6 +6044,7 @@ export function createDispatchBundle(
|
|
|
5870
6044
|
declared: agentSpec.budget,
|
|
5871
6045
|
allowedTools: effectiveTools,
|
|
5872
6046
|
settings,
|
|
6047
|
+
runtime: target.runtime,
|
|
5873
6048
|
});
|
|
5874
6049
|
const endpoint = endpointCapacityForTarget(target.target.id);
|
|
5875
6050
|
return {
|
|
@@ -6118,17 +6293,29 @@ export function createDispatchBundle(
|
|
|
6118
6293
|
})();
|
|
6119
6294
|
}
|
|
6120
6295
|
|
|
6121
|
-
async function dispatchBatch(
|
|
6296
|
+
async function dispatchBatch(
|
|
6297
|
+
reqs: ReadonlyArray<DispatchRequest>,
|
|
6298
|
+
preparation?: DispatchPreparationOptions,
|
|
6299
|
+
): Promise<{
|
|
6122
6300
|
batchId: string;
|
|
6123
6301
|
assignmentIds: ReadonlyArray<string>;
|
|
6124
6302
|
events: AsyncIterableIterator<unknown>;
|
|
6125
6303
|
finalPromise: Promise<ReadonlyArray<RunReceipt>>;
|
|
6126
6304
|
}> {
|
|
6127
6305
|
if (reqs.length === 0) throw new Error("dispatch: batch requires at least one request");
|
|
6306
|
+
// Two or more concurrent workers share one checkout, so a declared check
|
|
6307
|
+
// run while a sibling is still editing judges a tree neither worker
|
|
6308
|
+
// authored. The barrier only exists when there is both something to verify
|
|
6309
|
+
// and something that could race it; a one-request batch and a batch with no
|
|
6310
|
+
// declared check keep today's per-run path exactly.
|
|
6311
|
+
const settlement =
|
|
6312
|
+
reqs.length > 1 && reqs.some((req) => (req.resolvedVerification?.length ?? 0) > 0)
|
|
6313
|
+
? createBatchVerificationGate()
|
|
6314
|
+
: undefined;
|
|
6128
6315
|
const handles: Array<Awaited<ReturnType<typeof dispatch>> & { agentId: string }> = [];
|
|
6129
6316
|
try {
|
|
6130
6317
|
for (const req of reqs) {
|
|
6131
|
-
const handle = await dispatch(req);
|
|
6318
|
+
const handle = await dispatch(req, undefined, preparation, settlement);
|
|
6132
6319
|
handles.push({ ...handle, agentId: req.agentId });
|
|
6133
6320
|
}
|
|
6134
6321
|
} catch (err) {
|
|
@@ -6347,6 +6534,7 @@ export function createDispatchBundle(
|
|
|
6347
6534
|
// Reconciliation is best-effort; a failure never blocks startup.
|
|
6348
6535
|
}
|
|
6349
6536
|
startHeartbeatWatchdog();
|
|
6537
|
+
probeEndpointsAtDefaultBound();
|
|
6350
6538
|
},
|
|
6351
6539
|
async stop() {
|
|
6352
6540
|
// Shutdown is process-local. The durable machine-wide drain belongs to
|