@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
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import { join, normalize } from "node:path";
|
|
2
|
+
import { isAbsolute, join, normalize, relative, resolve } from "node:path";
|
|
3
|
+
import { resolvePackageRoot } from "../../core/package-root.js";
|
|
3
4
|
import { ToolNames } from "../../core/tool-names.js";
|
|
5
|
+
import { parseCodewikiRaw } from "../../domains/context/codewiki/artifact.js";
|
|
4
6
|
import type { Codewiki, CodewikiFile, CodewikiSymbol } from "../../domains/context/codewiki/schema.js";
|
|
5
7
|
import { listWikiPages } from "../../domains/context/wiki/layout.js";
|
|
6
8
|
import { readWikiMeta } from "../../domains/context/wiki/meta.js";
|
|
@@ -22,6 +24,14 @@ import {
|
|
|
22
24
|
import { loadCodewikiForTool, renderJson } from "./shared.js";
|
|
23
25
|
|
|
24
26
|
const REGEX_SYNTAX_HINTS = /\.\*|\.\+|\^|\$|\\[dDwWsSbB]|\(\?:|\(\?=|\(\?!/;
|
|
27
|
+
const CLIO_CODEWIKI_RELATIVE_PATH = join("dist", "assets", "codewiki.json");
|
|
28
|
+
|
|
29
|
+
type CodeNavSource = "workspace" | "clio";
|
|
30
|
+
|
|
31
|
+
interface LoadedNavSource {
|
|
32
|
+
codewiki: Codewiki;
|
|
33
|
+
entryRoot: string | null;
|
|
34
|
+
}
|
|
25
35
|
|
|
26
36
|
interface NavIndex {
|
|
27
37
|
filesById: Map<string, CodewikiFile>;
|
|
@@ -42,6 +52,62 @@ interface NavPayload {
|
|
|
42
52
|
}
|
|
43
53
|
|
|
44
54
|
const navIndexCache = new WeakMap<Codewiki, NavIndex>();
|
|
55
|
+
let clioCodewikiCache: { packageRoot: string; codewiki: Codewiki } | null = null;
|
|
56
|
+
|
|
57
|
+
function packageRootResolvedPath(packageRoot: string, indexedPath: string): string {
|
|
58
|
+
const resolved = resolve(packageRoot, indexedPath);
|
|
59
|
+
const rel = relative(packageRoot, resolved);
|
|
60
|
+
if (
|
|
61
|
+
rel.length === 0 ||
|
|
62
|
+
rel === ".." ||
|
|
63
|
+
rel.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) ||
|
|
64
|
+
isAbsolute(rel)
|
|
65
|
+
) {
|
|
66
|
+
throw new Error(`invalid package-root-relative path in bundled code map: ${indexedPath}`);
|
|
67
|
+
}
|
|
68
|
+
return resolved;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function packageRootResolvedCodewiki(packageRoot: string, codewiki: Codewiki): Codewiki {
|
|
72
|
+
return {
|
|
73
|
+
...codewiki,
|
|
74
|
+
files: codewiki.files.map((file) => ({
|
|
75
|
+
...file,
|
|
76
|
+
path: packageRootResolvedPath(packageRoot, file.path),
|
|
77
|
+
})),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function loadClioCodewikiForTool(): { ok: true; loaded: LoadedNavSource } | { ok: false; message: string } {
|
|
82
|
+
try {
|
|
83
|
+
const packageRoot = resolvePackageRoot();
|
|
84
|
+
if (clioCodewikiCache?.packageRoot === packageRoot) {
|
|
85
|
+
return { ok: true, loaded: { codewiki: clioCodewikiCache.codewiki, entryRoot: packageRoot } };
|
|
86
|
+
}
|
|
87
|
+
const artifactPath = join(packageRoot, CLIO_CODEWIKI_RELATIVE_PATH);
|
|
88
|
+
const parsed = parseCodewikiRaw(readFileSync(artifactPath, "utf8"));
|
|
89
|
+
if (!parsed) throw new Error("bundled artifact is not a valid codewiki");
|
|
90
|
+
const codewiki = packageRootResolvedCodewiki(packageRoot, parsed);
|
|
91
|
+
clioCodewikiCache = { packageRoot, codewiki };
|
|
92
|
+
return { ok: true, loaded: { codewiki, entryRoot: packageRoot } };
|
|
93
|
+
} catch (err) {
|
|
94
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
message: `code_nav: bundled Clio code map unavailable at ${CLIO_CODEWIKI_RELATIVE_PATH}: ${message}`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async function loadNavSource(
|
|
103
|
+
source: CodeNavSource,
|
|
104
|
+
): Promise<{ ok: true; loaded: LoadedNavSource } | { ok: false; message: string }> {
|
|
105
|
+
if (source === "clio") return loadClioCodewikiForTool();
|
|
106
|
+
const loaded = await loadCodewikiForTool();
|
|
107
|
+
return loaded.ok
|
|
108
|
+
? { ok: true, loaded: { codewiki: loaded.codewiki, entryRoot: null } }
|
|
109
|
+
: { ok: false, message: loaded.message };
|
|
110
|
+
}
|
|
45
111
|
|
|
46
112
|
function regexFromPattern(pattern: string): RegExp | null {
|
|
47
113
|
if (pattern.startsWith("/") && pattern.lastIndexOf("/") > 0) {
|
|
@@ -73,7 +139,7 @@ function regexFromPattern(pattern: string): RegExp | null {
|
|
|
73
139
|
return null;
|
|
74
140
|
}
|
|
75
141
|
|
|
76
|
-
function readPackageEntryPaths(cwd: string): Set<string> {
|
|
142
|
+
function readPackageEntryPaths(cwd: string, resolveFromRoot: boolean): Set<string> {
|
|
77
143
|
const out = new Set<string>();
|
|
78
144
|
const pkgPath = join(cwd, "package.json");
|
|
79
145
|
if (!existsSync(pkgPath)) return out;
|
|
@@ -85,11 +151,15 @@ function readPackageEntryPaths(cwd: string): Set<string> {
|
|
|
85
151
|
}
|
|
86
152
|
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return out;
|
|
87
153
|
const pkg = parsed as Record<string, unknown>;
|
|
88
|
-
|
|
89
|
-
|
|
154
|
+
const add = (value: string): void => {
|
|
155
|
+
const normalized = normalizeEntryPath(value);
|
|
156
|
+
out.add(resolveFromRoot ? packageRootResolvedPath(cwd, normalized) : normalized);
|
|
157
|
+
};
|
|
158
|
+
if (typeof pkg.main === "string") add(pkg.main);
|
|
159
|
+
if (typeof pkg.bin === "string") add(pkg.bin);
|
|
90
160
|
if (typeof pkg.bin === "object" && pkg.bin !== null && !Array.isArray(pkg.bin)) {
|
|
91
161
|
for (const value of Object.values(pkg.bin)) {
|
|
92
|
-
if (typeof value === "string")
|
|
162
|
+
if (typeof value === "string") add(value);
|
|
93
163
|
}
|
|
94
164
|
}
|
|
95
165
|
return out;
|
|
@@ -243,9 +313,9 @@ function runPath(index: NavIndex, query: string, limit: number): NavPayload {
|
|
|
243
313
|
};
|
|
244
314
|
}
|
|
245
315
|
|
|
246
|
-
function runEntries(index: NavIndex, limit: number): NavPayload {
|
|
247
|
-
const cwd = process.cwd();
|
|
248
|
-
const packageEntries = readPackageEntryPaths(cwd);
|
|
316
|
+
function runEntries(index: NavIndex, limit: number, entryRoot: string | null): NavPayload {
|
|
317
|
+
const cwd = entryRoot ?? process.cwd();
|
|
318
|
+
const packageEntries = readPackageEntryPaths(cwd, entryRoot !== null);
|
|
249
319
|
const candidates = [...index.filesByPath.values()].filter(
|
|
250
320
|
(file) => file.lang !== "config" && (file.role === "entry" || packageEntries.has(file.path)),
|
|
251
321
|
);
|
|
@@ -488,10 +558,24 @@ function parseLimit(value: unknown, fallback: number): number {
|
|
|
488
558
|
export const codeNavTool: ToolSpec = {
|
|
489
559
|
...codeNavToolSurface,
|
|
490
560
|
async run(args, options): Promise<ToolResult> {
|
|
561
|
+
const rawSource = args.source;
|
|
562
|
+
if (rawSource !== undefined && rawSource !== "workspace" && rawSource !== "clio") {
|
|
563
|
+
return {
|
|
564
|
+
kind: "error",
|
|
565
|
+
message: `code_nav: source must be workspace or clio; got '${String(rawSource)}'`,
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
const source: CodeNavSource = rawSource === "clio" ? "clio" : "workspace";
|
|
491
569
|
const mode = typeof args.mode === "string" ? args.mode : "";
|
|
492
|
-
|
|
570
|
+
if (source === "clio" && mode === "wiki") {
|
|
571
|
+
return {
|
|
572
|
+
kind: "error",
|
|
573
|
+
message: "code_nav: source=clio does not provide mode=wiki; use context scope=docs for Clio documentation",
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
const loaded = await loadNavSource(source);
|
|
493
577
|
if (!loaded.ok) return { kind: "error", message: loaded.message };
|
|
494
|
-
const index = navIndexFor(loaded.codewiki);
|
|
578
|
+
const index = navIndexFor(loaded.loaded.codewiki);
|
|
495
579
|
const query = typeof args.query === "string" ? args.query.trim() : "";
|
|
496
580
|
const limit = parseLimit(args.limit, mode === "entries" ? DEFAULT_ENTRY_LIMIT : DEFAULT_LIMIT);
|
|
497
581
|
const reservation = reserveObservation(OBSERVE_SELF_CAPS.codeNav, options);
|
|
@@ -506,15 +590,17 @@ export const codeNavTool: ToolSpec = {
|
|
|
506
590
|
}
|
|
507
591
|
const close = (nav: NavPayload | ToolResult): ToolResult => {
|
|
508
592
|
if ("kind" in nav) return nav;
|
|
593
|
+
const next = source === "clio" && nav.next !== undefined ? `source=clio ${nav.next}` : nav.next;
|
|
594
|
+
const payload = next === nav.next ? nav.payload : { ...nav.payload, next };
|
|
509
595
|
return finalizeObservation({
|
|
510
596
|
tool: ToolNames.CodeNav,
|
|
511
597
|
unit: "results",
|
|
512
598
|
format: "json",
|
|
513
|
-
output: renderJson(
|
|
599
|
+
output: renderJson(payload),
|
|
514
600
|
shownCount: nav.shownCount,
|
|
515
601
|
totalCount: nav.totalCount,
|
|
516
602
|
truncated: nav.shownCount < nav.totalCount,
|
|
517
|
-
...(
|
|
603
|
+
...(next !== undefined ? { next } : {}),
|
|
518
604
|
reservation,
|
|
519
605
|
...(options ? { options } : {}),
|
|
520
606
|
});
|
|
@@ -527,7 +613,7 @@ export const codeNavTool: ToolSpec = {
|
|
|
527
613
|
if (query.length === 0) return { kind: "error", message: "code_nav: mode=path requires query" };
|
|
528
614
|
return close(runPath(index, query, limit));
|
|
529
615
|
}
|
|
530
|
-
if (mode === "entries") return close(runEntries(index, limit));
|
|
616
|
+
if (mode === "entries") return close(runEntries(index, limit, loaded.loaded.entryRoot));
|
|
531
617
|
if (mode === "outline") {
|
|
532
618
|
if (query.length === 0) return { kind: "error", message: "code_nav: mode=outline requires query path" };
|
|
533
619
|
return close(runOutline(index, query, limit));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
-
import { basename, join, resolve } from "node:path";
|
|
2
|
+
import { basename, join, relative, resolve } from "node:path";
|
|
3
3
|
import { resolvePackageRoot } from "../../core/package-root.js";
|
|
4
4
|
|
|
5
5
|
// Deterministic, dependency-free retrieval over Clio's bundled human docs,
|
|
@@ -298,14 +298,27 @@ function indexSection(section: RawSection): IndexedSection {
|
|
|
298
298
|
|
|
299
299
|
function candidateDocFiles(root: string): string[] {
|
|
300
300
|
const docsDir = join(root, "docs");
|
|
301
|
+
const htmlDir = join(docsDir, "html");
|
|
301
302
|
const files: string[] = [];
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
303
|
+
const walk = (dir: string): void => {
|
|
304
|
+
let entries: import("node:fs").Dirent[];
|
|
305
|
+
try {
|
|
306
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
307
|
+
} catch {
|
|
308
|
+
return;
|
|
305
309
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
310
|
+
for (const entry of entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0))) {
|
|
311
|
+
const absolute = join(dir, entry.name);
|
|
312
|
+
if (entry.isDirectory()) {
|
|
313
|
+
if (absolute !== htmlDir) walk(absolute);
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
if (entry.isFile() && entry.name.toLowerCase().endsWith(".md")) {
|
|
317
|
+
files.push(relative(root, absolute).replaceAll("\\", "/"));
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
walk(docsDir);
|
|
309
322
|
for (const name of ["README.md", "CHANGELOG.md", "CLIO-CODER.md"]) {
|
|
310
323
|
if (existsSync(join(root, name))) files.push(name);
|
|
311
324
|
}
|
|
@@ -181,20 +181,33 @@ function pendingSkillPolicyError(name: string, options: ToolInvokeOptions | unde
|
|
|
181
181
|
if (!policy) {
|
|
182
182
|
return NO_PENDING_SKILL_DENIAL;
|
|
183
183
|
}
|
|
184
|
+
const recipeBound = policyIsRecipeBound(policy);
|
|
185
|
+
// auto-edit / full-auto: the operator already chose to let the model act
|
|
186
|
+
// without being asked, and a skill only ever narrows the tool surface, so
|
|
187
|
+
// the model activates an installed skill itself under the same per-run
|
|
188
|
+
// policy `/skill` produces. A skill that is not installed still fails the
|
|
189
|
+
// lookup below with the operator-gated marketplace message.
|
|
190
|
+
if (policy.modelActivation === true && !recipeBound) {
|
|
191
|
+
if (!policy.loadedSkillNames.has(name)) return null;
|
|
192
|
+
const window = policy.carriedSurface === true ? "in this session" : "this turn";
|
|
193
|
+
return `context: skill ${name} already loaded ${window}; continue with the loaded workflow and call ask_user if an interview/choice is needed.`;
|
|
194
|
+
}
|
|
184
195
|
const allowed = [...new Set(policy.allowedSkillNames.map((entry) => entry.trim()).filter(Boolean))];
|
|
185
196
|
if (allowed.length === 0) {
|
|
186
197
|
return NO_PENDING_SKILL_DENIAL;
|
|
187
198
|
}
|
|
188
|
-
const recipeBound = policyIsRecipeBound(policy);
|
|
189
199
|
if (!allowed.includes(name)) {
|
|
190
|
-
return
|
|
191
|
-
|
|
192
|
-
|
|
200
|
+
if (recipeBound) return `context: this agent run may load only its declared skill(s): ${allowed.join(", ")}.`;
|
|
201
|
+
// A carried surface is a skill the operator activated on an earlier
|
|
202
|
+
// turn, not a request waiting to be loaded now. Claiming a pending
|
|
203
|
+
// request here would invite a retry of a load nothing asked for.
|
|
204
|
+
if (policy.carriedSurface === true) return NO_PENDING_SKILL_DENIAL;
|
|
205
|
+
return `context: this turn has pending skill request(s): ${allowed.join(", ")}. Load only those before doing anything else.`;
|
|
193
206
|
}
|
|
194
207
|
if (policy.loadedSkillNames.has(name)) {
|
|
195
|
-
return
|
|
196
|
-
|
|
197
|
-
|
|
208
|
+
if (recipeBound) return `context: skill ${name} is already loaded in this run; continue with its workflow.`;
|
|
209
|
+
const window = policy.carriedSurface === true ? "in this session" : "this turn";
|
|
210
|
+
return `context: pending skill ${name} already loaded ${window}; continue with the loaded workflow and call ask_user if an interview/choice is needed.`;
|
|
198
211
|
}
|
|
199
212
|
return null;
|
|
200
213
|
}
|
|
@@ -203,6 +216,23 @@ function pendingSkillRequestFor(name: string, options: ToolInvokeOptions | undef
|
|
|
203
216
|
return options?.pendingSkillPolicy?.requests.find((request) => request.name === name) ?? null;
|
|
204
217
|
}
|
|
205
218
|
|
|
219
|
+
/**
|
|
220
|
+
* A hidden skill is intentionally absent from model discovery, but
|
|
221
|
+
* `disable-model-invocation` still promises that the operator may activate it
|
|
222
|
+
* by hand. Slash-command and selector requests are the two authenticated
|
|
223
|
+
* interactive paths for that choice. Recipe and marketplace requests do not
|
|
224
|
+
* widen visibility: neither proves that the operator selected an installed
|
|
225
|
+
* manual-only skill for this turn.
|
|
226
|
+
*/
|
|
227
|
+
function operatorRequestedManualSkill(skill: Skill, request: ReturnType<typeof pendingSkillRequestFor>): boolean {
|
|
228
|
+
return (
|
|
229
|
+
skill.trusted &&
|
|
230
|
+
skill.disableModelInvocation &&
|
|
231
|
+
request?.installed === true &&
|
|
232
|
+
(request.source === "slash-command" || request.source === "selector")
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
|
|
206
236
|
function renderPendingSkillTask(name: string, options: ToolInvokeOptions | undefined): string[] {
|
|
207
237
|
const request = pendingSkillRequestFor(name, options);
|
|
208
238
|
if (!request) return [];
|
|
@@ -257,16 +287,18 @@ function renderSkillsList(
|
|
|
257
287
|
skills: ReadonlyArray<Skill>,
|
|
258
288
|
marketplace: ReadonlyArray<MarketplaceSkill>,
|
|
259
289
|
marketplaceOffered: boolean,
|
|
290
|
+
modelActivation: boolean,
|
|
260
291
|
): string {
|
|
261
292
|
if (skills.length === 0 && marketplace.length === 0) {
|
|
262
293
|
// A registry that never offers the marketplace (a worker) must not
|
|
263
294
|
// claim none is configured; it simply has nothing to list.
|
|
264
295
|
return marketplaceOffered ? "No skills are installed and no marketplace is configured." : "No skills are installed.";
|
|
265
296
|
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
297
|
+
// The header names the listing and nothing more. The reply protocol is
|
|
298
|
+
// stated once, as the recency anchor at the bottom, because that is the
|
|
299
|
+
// line literal models act on; a second copy up here cost every listing
|
|
300
|
+
// call the same sentences again.
|
|
301
|
+
const lines = ["Available skills.", ""];
|
|
270
302
|
if (skills.length > 0) {
|
|
271
303
|
lines.push("Installed:");
|
|
272
304
|
for (const skill of skills) {
|
|
@@ -280,10 +312,7 @@ function renderSkillsList(
|
|
|
280
312
|
// operator's /skill <name> prompts to install before it runs, so the
|
|
281
313
|
// model's move is the same suggest-and-wait. Only the body is out of
|
|
282
314
|
// reach until then, which is why the description is all that appears.
|
|
283
|
-
lines.push(
|
|
284
|
-
"",
|
|
285
|
-
"Marketplace (not installed; /skill <name> offers to install, or `clio-coder skills install <name>`). Suggest these the same way when one matches; their bodies cannot be loaded until the operator installs them:",
|
|
286
|
-
);
|
|
315
|
+
lines.push("", "Marketplace (not installed; /skill <name> offers to install):");
|
|
287
316
|
for (const entry of marketplace) {
|
|
288
317
|
const category = entry.category ? ` [${entry.category}]` : "";
|
|
289
318
|
lines.push(`- ${entry.name}${category}: ${entry.description}`);
|
|
@@ -293,7 +322,9 @@ function renderSkillsList(
|
|
|
293
322
|
// template where they skip conditional prose in the header.
|
|
294
323
|
lines.push(
|
|
295
324
|
"",
|
|
296
|
-
|
|
325
|
+
modelActivation
|
|
326
|
+
? `If one skill above matches the current task, load it now with context(scope="skills", name="<name>") and continue in the same turn; at this autonomy level you activate installed skills yourself and do not wait for the operator. Marketplace rows below are not installed and still need the operator. If none match, do not mention skills.`
|
|
327
|
+
: `If one skill above matches the current task, begin your reply with the line \`${SKILL_SUGGESTION_ANCHOR}\` (a comma-separated sequence, in order, when several compose), then continue the task in the same turn without it; only the operator can run it. If none match, do not mention skills.`,
|
|
297
328
|
);
|
|
298
329
|
if (marketplace.length > 0) {
|
|
299
330
|
// The offer protocol mirrors the marketplace-offer middleware: fixed
|
|
@@ -407,8 +438,13 @@ function runSkillsScope(
|
|
|
407
438
|
if (name.length === 0) {
|
|
408
439
|
const list = loadSkills({ cwd: cwdFromDeps(deps), ...(deps.getSkillLoaderOptions?.() ?? {}) });
|
|
409
440
|
const visible = modelVisibleSkills(list.items);
|
|
410
|
-
const marketplace = marketplaceRowsFor(deps,
|
|
411
|
-
const rendered = renderSkillsList(
|
|
441
|
+
const marketplace = marketplaceRowsFor(deps, list.items, options);
|
|
442
|
+
const rendered = renderSkillsList(
|
|
443
|
+
visible,
|
|
444
|
+
marketplace,
|
|
445
|
+
deps.skillMarketplace !== false,
|
|
446
|
+
options?.pendingSkillPolicy?.modelActivation === true,
|
|
447
|
+
);
|
|
412
448
|
// The catalog is bounded but not small: the whole listing must fit the
|
|
413
449
|
// per-call cap like any observation, and a cut list says so instead of
|
|
414
450
|
// silently dropping the marketplace tail.
|
|
@@ -437,12 +473,15 @@ function runSkillsScope(
|
|
|
437
473
|
if (policyError) return { kind: "error", message: policyError };
|
|
438
474
|
const list = loadSkills({ cwd: cwdFromDeps(deps), ...(deps.getSkillLoaderOptions?.() ?? {}) });
|
|
439
475
|
const visible = modelVisibleSkills(list.items);
|
|
440
|
-
const
|
|
476
|
+
const pendingRequest = pendingSkillRequestFor(name, options);
|
|
477
|
+
const skill =
|
|
478
|
+
visible.find((item) => item.name === name) ??
|
|
479
|
+
list.items.find((item) => item.name === name && operatorRequestedManualSkill(item, pendingRequest));
|
|
441
480
|
if (!skill) {
|
|
442
481
|
// A marketplace entry is a skill that exists and is not installed. Saying
|
|
443
482
|
// "unknown skill" about it denies the operator a thing the listing just
|
|
444
483
|
// offered; name the state and the one move that changes it.
|
|
445
|
-
const installable = marketplaceRowsFor(deps,
|
|
484
|
+
const installable = marketplaceRowsFor(deps, list.items, options).some((entry) => entry.name === name);
|
|
446
485
|
if (installable) {
|
|
447
486
|
return {
|
|
448
487
|
kind: "error",
|
|
@@ -455,7 +494,6 @@ function runSkillsScope(
|
|
|
455
494
|
}
|
|
456
495
|
const includeTree = args.include_tree === true;
|
|
457
496
|
const tree = includeTree ? buildResourceTree(skill.baseDir, DEFAULT_TREE_ENTRIES) : null;
|
|
458
|
-
const pendingRequest = pendingSkillRequestFor(name, options);
|
|
459
497
|
const pendingTask = pendingRequest?.args.trim() ?? "";
|
|
460
498
|
// Provenance: the activated content is compared against whatever recorded
|
|
461
499
|
// hash can speak for it, the audited catalog's pinned manifest or the
|
|
@@ -38,6 +38,16 @@ export interface CoreToolBootstrapDeps {
|
|
|
38
38
|
taskBoard?: TaskBoardStore;
|
|
39
39
|
userTasks?: UserTasksStore;
|
|
40
40
|
agentLedger?: AgentLedgerPort;
|
|
41
|
+
/**
|
|
42
|
+
* Register the ledger tool even without a port. A worker registry needs
|
|
43
|
+
* this: `attestedToolSignature` signs the names a bare worker registry
|
|
44
|
+
* produces, and the orchestrator admits `ledger` for every batch member,
|
|
45
|
+
* so a registry that dropped the tool for want of a port drifted the
|
|
46
|
+
* signature and admission refused every batch worker. The session never
|
|
47
|
+
* sets it: it has no peers, and the schema was 444 tokens of every first
|
|
48
|
+
* turn for a tool that could only answer "no ledger".
|
|
49
|
+
*/
|
|
50
|
+
includeLedgerTools?: boolean;
|
|
41
51
|
getSkillLoaderOptions?: () => Pick<
|
|
42
52
|
LoadSkillsInput,
|
|
43
53
|
"trustProjectCompatRoots" | "disableDiscovery" | "explicitSkillPaths"
|
|
@@ -49,6 +59,8 @@ export interface CoreToolRegistration {
|
|
|
49
59
|
includeNetworkTools: boolean;
|
|
50
60
|
includeSessionTools: boolean;
|
|
51
61
|
includeInteractiveTools: boolean;
|
|
62
|
+
/** True only when a worker bound its dispatch's agent-ledger port; the session never does. */
|
|
63
|
+
includeLedgerTools: boolean;
|
|
52
64
|
}
|
|
53
65
|
|
|
54
66
|
export function registerCoreTools(registry: ToolRegistry, deps: CoreToolBootstrapDeps = {}): CoreToolRegistration {
|
|
@@ -154,12 +166,21 @@ export function registerCoreTools(registry: ToolRegistry, deps: CoreToolBootstra
|
|
|
154
166
|
registry.register({
|
|
155
167
|
...builtin(createArtifactTool({ getCwd: skillToolDeps.getCwd }), { path: "src/tools/artifact.ts", scope: "core" }),
|
|
156
168
|
});
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
169
|
+
// The coordination board exists only inside a dispatch: a worker process
|
|
170
|
+
// binds the port, the session never does, and without a port the tool can
|
|
171
|
+
// only answer "no ledger". Registering it on the session put its schema on
|
|
172
|
+
// every first turn, so the session registers it with a port or not at all;
|
|
173
|
+
// a worker registry asks for it explicitly, port or no port, because its
|
|
174
|
+
// attested surface must not depend on whether this run bound one.
|
|
175
|
+
const includeLedgerTools = deps.includeLedgerTools === true || deps.agentLedger !== undefined;
|
|
176
|
+
if (includeLedgerTools) {
|
|
177
|
+
registry.register({
|
|
178
|
+
...builtin(createLedgerTool(deps.agentLedger ? { agentLedger: deps.agentLedger } : {}), {
|
|
179
|
+
path: "src/tools/ledger.ts",
|
|
180
|
+
scope: "core",
|
|
181
|
+
}),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
163
184
|
registry.register({
|
|
164
185
|
...builtin(
|
|
165
186
|
createTasksTool({
|
|
@@ -177,6 +198,7 @@ export function registerCoreTools(registry: ToolRegistry, deps: CoreToolBootstra
|
|
|
177
198
|
includeNetworkTools,
|
|
178
199
|
includeSessionTools: Boolean(session),
|
|
179
200
|
includeInteractiveTools: Boolean(deps.askUser),
|
|
201
|
+
includeLedgerTools,
|
|
180
202
|
};
|
|
181
203
|
}
|
|
182
204
|
|
|
@@ -92,8 +92,7 @@ export const credentialPresentTool: ToolSpec = {
|
|
|
92
92
|
name: Type.String({ description: "Credential key name, e.g. OPENAI_API_KEY." }),
|
|
93
93
|
source: Type.Optional(
|
|
94
94
|
StringEnum(["auto", "environment", "env", "file"], {
|
|
95
|
-
description:
|
|
96
|
-
"auto checks the environment and the file when file is supplied; environment/env checks only the process environment; file checks only the file.",
|
|
95
|
+
description: "auto (default) checks the environment, then file when given; the others check one source.",
|
|
97
96
|
}),
|
|
98
97
|
),
|
|
99
98
|
file: Type.Optional(Type.String({ description: "Env-style file to check for NAME=, e.g. .env." })),
|
|
@@ -50,6 +50,7 @@ const AUTO_BASELINE_BY_TASK_TYPE: Readonly<Record<AgentTaskType, string>> = {
|
|
|
50
50
|
// Read-only shapes.
|
|
51
51
|
code_review: "verifier",
|
|
52
52
|
research: "researcher",
|
|
53
|
+
world_knowledge: "world-knowledge",
|
|
53
54
|
code_read: "scout",
|
|
54
55
|
unknown: "scout",
|
|
55
56
|
};
|
|
@@ -186,7 +187,11 @@ function dispatchRequestFromArgs(
|
|
|
186
187
|
let rawIntent = args.intent;
|
|
187
188
|
if (Object.hasOwn(args, "gate")) {
|
|
188
189
|
if (typeof args.gate !== "string" || args.gate.trim().length === 0) {
|
|
189
|
-
return {
|
|
190
|
+
return {
|
|
191
|
+
ok: false,
|
|
192
|
+
message:
|
|
193
|
+
"gate must be a non-empty declared check id: a check verify() lists, never a shell command; omit gate and run the check yourself after the receipt",
|
|
194
|
+
};
|
|
190
195
|
}
|
|
191
196
|
rawIntent = { ...(isRecord(rawIntent) ? rawIntent : {}), verification: [{ check: args.gate.trim() }] };
|
|
192
197
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { gatewayRoutingObservationFromRecord, gatewayRoutingObservationLabel } from "../core/gateway-routing.js";
|
|
1
2
|
import { responseModelIdObservationFromRecord } from "../core/response-model-id.js";
|
|
2
3
|
import { durableAssistantTextFromEvent } from "../domains/dispatch/event-pump.js";
|
|
3
4
|
import type { RunReceipt } from "../domains/dispatch/types.js";
|
|
@@ -23,3 +24,12 @@ export function receiptResponseModelIdObservationLabel(receipt: Pick<RunReceipt,
|
|
|
23
24
|
});
|
|
24
25
|
return `response_model_id_observation=${labels.join(",")}`;
|
|
25
26
|
}
|
|
27
|
+
|
|
28
|
+
/** Human projection of gateway routes carried by a receipt. */
|
|
29
|
+
export function receiptGatewayRoutingLabel(receipt: Pick<RunReceipt, "upstreamResponses">): string | null {
|
|
30
|
+
const observations = (receipt.upstreamResponses ?? [])
|
|
31
|
+
.map((response) => gatewayRoutingObservationFromRecord(response as unknown as Record<string, unknown>))
|
|
32
|
+
.filter((observation) => observation !== null);
|
|
33
|
+
if (observations.length === 0) return null;
|
|
34
|
+
return observations.map(gatewayRoutingObservationLabel).join(" | ");
|
|
35
|
+
}
|
|
@@ -103,7 +103,14 @@ export interface DispatchPlanView {
|
|
|
103
103
|
/** True when this call requires plan approval at supervised autonomy levels. */
|
|
104
104
|
planScale: boolean;
|
|
105
105
|
tasks: DispatchPlanTaskView[];
|
|
106
|
-
/**
|
|
106
|
+
/**
|
|
107
|
+
* Rendered plan artifact, deterministic for identical arguments against an
|
|
108
|
+
* unchanged working tree. The tree is an input because a legacy task's scope
|
|
109
|
+
* lines resolve a "../"-leading prose token by probing the dispatch root, so
|
|
110
|
+
* creating or deleting the probed file between two renders of the same call
|
|
111
|
+
* changes this text and the hash below. Nothing re-derives the hash to compare
|
|
112
|
+
* it; both renders of one call happen in the same synchronous admission pass.
|
|
113
|
+
*/
|
|
107
114
|
text: string;
|
|
108
115
|
/** sha256 of the rendered artifact. */
|
|
109
116
|
hash: string;
|
|
@@ -251,12 +258,24 @@ function safeField(value: string, bindChangedValue = true): string {
|
|
|
251
258
|
return `${result}{sha256=${createHash("sha256").update(value, "utf8").digest("hex")}}`;
|
|
252
259
|
}
|
|
253
260
|
|
|
254
|
-
|
|
261
|
+
/**
|
|
262
|
+
* The scope lines of the approval artifact, for a task with no typed intent.
|
|
263
|
+
*
|
|
264
|
+
* `cwd` is the dispatch's own working directory, not this process's: prose
|
|
265
|
+
* inference probes a "../"-leading token against the dispatch root, so a plan
|
|
266
|
+
* rendered against `process.cwd()` would show the operator a working context
|
|
267
|
+
* the run does not resolve whenever the call carries an explicit `cwd` (a
|
|
268
|
+
* worktree, most often). Passing it makes this render and admission read the
|
|
269
|
+
* same tree, which is also the sense in which the artifact is deterministic:
|
|
270
|
+
* identical arguments against an unchanged tree, not against any tree.
|
|
271
|
+
*/
|
|
272
|
+
function renderLegacyPathScope(task: DispatchPlanTaskView, cwd: string | undefined): string[] {
|
|
255
273
|
if (task.intent !== undefined) return [];
|
|
256
274
|
const scope = resolveDispatchPathScope({
|
|
257
275
|
agentId: task.agent,
|
|
258
276
|
executionRole: task.executionRole,
|
|
259
277
|
task: task.task,
|
|
278
|
+
...(cwd !== undefined ? { cwd } : {}),
|
|
260
279
|
...(task.briefing !== undefined ? { briefing: task.briefing } : {}),
|
|
261
280
|
});
|
|
262
281
|
const lines = [" scope mode=legacy-inferred"];
|
|
@@ -275,6 +294,17 @@ function renderLegacyPathScope(task: DispatchPlanTaskView): string[] {
|
|
|
275
294
|
if (scope.provenance.workingContextPaths.length === 0 && scope.provenance.writeBoundaries.length === 0) {
|
|
276
295
|
lines.push(" scope policy_paths=none");
|
|
277
296
|
}
|
|
297
|
+
// Named here as well as on the dispatch-time notice, because this artifact is
|
|
298
|
+
// the surface an operator approves: a token the run anchored somewhere the
|
|
299
|
+
// prose did not spell, or discarded outright, would otherwise be visible in
|
|
300
|
+
// the plan only as a scope line that has no counterpart in the task text.
|
|
301
|
+
for (const entry of scope.parentTokens) {
|
|
302
|
+
lines.push(
|
|
303
|
+
` scope parent_token raw=${JSON.stringify(safeField(entry.token))} resolved=${
|
|
304
|
+
entry.resolved === null ? "dropped" : JSON.stringify(safeField(entry.resolved))
|
|
305
|
+
} source=${entry.source}`,
|
|
306
|
+
);
|
|
307
|
+
}
|
|
278
308
|
return lines;
|
|
279
309
|
}
|
|
280
310
|
|
|
@@ -365,6 +395,7 @@ function renderPlanText(
|
|
|
365
395
|
source: DispatchPlanSource,
|
|
366
396
|
maxWorkers: number | null,
|
|
367
397
|
onFailure: ResolvedDispatchPlanArtifact["onFailure"],
|
|
398
|
+
cwd: string | undefined,
|
|
368
399
|
confirmation?: ResolvedDispatchPlanArtifact["confirmation"],
|
|
369
400
|
): string {
|
|
370
401
|
const lines = [
|
|
@@ -453,7 +484,7 @@ function renderPlanText(
|
|
|
453
484
|
const serialized = JSON.stringify(task.intent);
|
|
454
485
|
lines.push(` intent_sha256=${createHash("sha256").update(serialized, "utf8").digest("hex")}`);
|
|
455
486
|
}
|
|
456
|
-
lines.push(...renderLegacyPathScope(task));
|
|
487
|
+
lines.push(...renderLegacyPathScope(task, cwd));
|
|
457
488
|
for (const check of task.resolvedVerification ?? []) {
|
|
458
489
|
lines.push(
|
|
459
490
|
` verification check=${safeField(check.check)} argv=${JSON.stringify(check.argv)} cwd=${JSON.stringify(check.cwd)} timeout_ms=${check.timeoutMs}`,
|
|
@@ -606,6 +637,7 @@ const RESULT_CONTRACT_KINDS = new Set<ResultContract["kind"]>([
|
|
|
606
637
|
"council-report",
|
|
607
638
|
"debugger-report",
|
|
608
639
|
"research-report",
|
|
640
|
+
"world-knowledge-report",
|
|
609
641
|
"mutation-report",
|
|
610
642
|
"provenance-report",
|
|
611
643
|
"oracle-report",
|
|
@@ -887,7 +919,20 @@ export function describeDispatchPlan(rawArgs: Record<string, unknown> | undefine
|
|
|
887
919
|
tasks.some((task) => task.failover === "approved") ||
|
|
888
920
|
confirmation !== undefined ||
|
|
889
921
|
isRecord(args.apply_winner));
|
|
890
|
-
const text = renderPlanText(
|
|
922
|
+
const text = renderPlanText(
|
|
923
|
+
topology,
|
|
924
|
+
tasks,
|
|
925
|
+
costCeilingUsd,
|
|
926
|
+
deadlineMs,
|
|
927
|
+
source,
|
|
928
|
+
maxWorkers,
|
|
929
|
+
onFailure,
|
|
930
|
+
// Read off the whole call rather than a task view: `cwd` is one top-level
|
|
931
|
+
// dispatch argument, so it survives on both the freshly parsed path and
|
|
932
|
+
// the resolved-artifact path, where the sealed task shape carries no cwd.
|
|
933
|
+
str(args.cwd),
|
|
934
|
+
confirmation,
|
|
935
|
+
);
|
|
891
936
|
return {
|
|
892
937
|
topology,
|
|
893
938
|
taskCount: Math.max(1, tasks.length),
|
|
@@ -102,7 +102,7 @@ export function runTailEntryFromEvent(event: unknown, at: string = new Date().to
|
|
|
102
102
|
export interface DispatchRunEventRegistryOptions {
|
|
103
103
|
/**
|
|
104
104
|
* Durable tee for the display tail. Omitted takes the process-wide default
|
|
105
|
-
* journal (settings-gated by `
|
|
105
|
+
* journal (settings-gated by `fleet.history.journal`); `null` turns it off for this
|
|
106
106
|
* registry. This is the one wiring choke point: every registry in the
|
|
107
107
|
* process is built by this factory, so the sink attaches here rather than at
|
|
108
108
|
* each of the three construction sites that call it.
|
|
@@ -2153,6 +2153,18 @@ export async function runDispatchTool(
|
|
|
2153
2153
|
if (options?.signal?.aborted) return { kind: "error", message: "dispatch: aborted" };
|
|
2154
2154
|
const maxOutputBytes = snapshot.maxOutputBytes;
|
|
2155
2155
|
const timeoutMs = snapshot.timeoutMs;
|
|
2156
|
+
// All modes, including derived Scout/review runs, share the invocation's
|
|
2157
|
+
// admission bounds. Keep these off the serializable approved request.
|
|
2158
|
+
const dispatch = deps.dispatch;
|
|
2159
|
+
const preparation = {
|
|
2160
|
+
...(options?.signal === undefined ? {} : { signal: options.signal }),
|
|
2161
|
+
...(timeoutMs === undefined ? {} : { deadlineAt: Date.now() + timeoutMs }),
|
|
2162
|
+
};
|
|
2163
|
+
deps.dispatch = {
|
|
2164
|
+
...dispatch,
|
|
2165
|
+
dispatch: (request, observer) => dispatch.dispatch(request, observer, preparation),
|
|
2166
|
+
dispatchBatch: (requests) => dispatch.dispatchBatch(requests, preparation),
|
|
2167
|
+
};
|
|
2156
2168
|
let review = snapshot.review === undefined ? undefined : structuredClone(snapshot.review);
|
|
2157
2169
|
let council = snapshot.council === undefined ? undefined : structuredClone(snapshot.council);
|
|
2158
2170
|
|