@iowarp/clio-coder 0.3.9 → 0.4.0
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 +53 -0
- package/NOTICE +33 -0
- package/README.md +7 -2
- package/dist/{acp-7LOELQFP.js → acp-G5WJBNCT.js} +13 -12
- package/dist/{agents-FIBG2SHA.js → agents-FMV2Q5G4.js} +39 -36
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-OI4LIH2I.js → auth-3IDSJEIK.js} +16 -15
- package/dist/{builtins-AD25UL3C.js → builtins-XCZWXSC7.js} +3 -3
- package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
- package/dist/{chunk-56KB5IJP.js → chunk-2OQE55CK.js} +3 -3
- package/dist/{chunk-N3PBVRTZ.js → chunk-32KWKNSF.js} +9 -7
- package/dist/{chunk-VKBMFOYV.js → chunk-36EJLSQQ.js} +23 -27
- package/dist/{chunk-465CC7FK.js → chunk-3BT2XMV4.js} +16 -13
- package/dist/{chunk-NQ6UCCOD.js → chunk-3URVFKWK.js} +7 -7
- package/dist/{chunk-WIE7ZOSW.js → chunk-3XML7CDN.js} +2 -2
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
- package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-JEQQR47K.js → chunk-6DB53AJS.js} +168 -9
- package/dist/{chunk-KV2AOLDF.js → chunk-76ONBSIA.js} +5 -25
- package/dist/{chunk-FALJGAWU.js → chunk-7MCTRUCE.js} +2 -2
- package/dist/{chunk-5T7RBWN2.js → chunk-AB44T6BB.js} +5 -5
- package/dist/chunk-B7OBL7PK.js +1405 -0
- package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
- package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
- package/dist/{chunk-O6I4CIEU.js → chunk-BKFJHQCA.js} +6 -6
- package/dist/chunk-BKFM6EJV.js +462 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-MV2VUEJC.js → chunk-BPKCPIL7.js} +2 -2
- package/dist/{chunk-TEO2TLVN.js → chunk-BUMFYQFY.js} +964 -1120
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/chunk-C2LTL2W6.js +2447 -0
- package/dist/{chunk-EBOC7MT3.js → chunk-CODPRO7Q.js} +8 -8
- package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
- package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
- package/dist/{chunk-MIX5N5AC.js → chunk-DQITNCXG.js} +394 -154
- package/dist/{chunk-S4COXYBG.js → chunk-DYJP44XW.js} +129 -106
- package/dist/{chunk-N5XKWMDW.js → chunk-F4CKPOEQ.js} +6 -6
- package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/{chunk-7C6RYZGQ.js → chunk-GKF55TAZ.js} +3 -3
- package/dist/{chunk-B5XRQOLB.js → chunk-GR5G2PVF.js} +9 -8
- package/dist/{chunk-XDOQXGFO.js → chunk-GXNLGKAB.js} +64 -8
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/{chunk-774ILSRL.js → chunk-HI63TFOG.js} +4 -3
- package/dist/{chunk-R7LNVMCS.js → chunk-HJJTYUHX.js} +64 -72
- package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
- package/dist/{chunk-CA42X6KT.js → chunk-HWHKMHUA.js} +6 -6
- package/dist/chunk-HZHHCK24.js +1631 -0
- package/dist/{chunk-HJB5IUKP.js → chunk-I5VEOC6I.js} +12 -12
- package/dist/chunk-IBEBSCYA.js +564 -0
- package/dist/chunk-IQ7KR472.js +362 -0
- package/dist/{chunk-4H6ULJ3H.js → chunk-J4W7KFM7.js} +921 -990
- package/dist/{chunk-4LJX2PUC.js → chunk-JDG2WCRO.js} +5 -5
- package/dist/{chunk-NZU6YDNV.js → chunk-K5C3NCBD.js} +4 -4
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-NNNWO6F2.js → chunk-KFZI4NIL.js} +93 -3
- package/dist/chunk-KMVISBZR.js +132 -0
- package/dist/{chunk-BVDVID7E.js → chunk-LDQ2ZF2M.js} +2 -2
- package/dist/{chunk-OEDBCISO.js → chunk-LQ3DZAMX.js} +2 -2
- package/dist/{chunk-PZ4I4JE2.js → chunk-LY4S7GJC.js} +124 -116
- package/dist/{chunk-3DUR4WUA.js → chunk-MLKNTWH2.js} +19 -19
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-5DQRIYDZ.js → chunk-NHCZP4K7.js} +2 -2
- package/dist/chunk-NHLBIGRH.js +1506 -0
- package/dist/chunk-NQQH3YT7.js +302 -0
- package/dist/chunk-NYS75XW5.js +15 -0
- package/dist/{chunk-TD7UE2L5.js → chunk-O4XIVISU.js} +7 -7
- package/dist/{chunk-WXCJ7VME.js → chunk-O6TL7WWY.js} +6 -6
- package/dist/chunk-OQBA45DZ.js +97 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
- package/dist/{chunk-HKO36JWF.js → chunk-QBJA7R7N.js} +31 -3
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-5HFBWUMU.js → chunk-QLFS5GO2.js} +4 -4
- package/dist/{chunk-GAYUJ7LE.js → chunk-QLL7ILRG.js} +41 -32
- package/dist/{chunk-LXPJXFM5.js → chunk-QREDIESB.js} +7 -7
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/chunk-R346GLFC.js +31 -0
- package/dist/{chunk-VPTUJU4P.js → chunk-SJ5ZKQ4S.js} +2 -2
- package/dist/{chunk-QQ7EKM72.js → chunk-SP2RXXYO.js} +6 -54
- package/dist/chunk-SUCTJL45.js +45 -0
- package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/{chunk-IHKBWSXF.js → chunk-TZ3SGWZZ.js} +2 -2
- package/dist/{chunk-ECUO3KDP.js → chunk-U77AMWDL.js} +47 -7
- package/dist/{chunk-3UUY7R3Z.js → chunk-ULC6OTWO.js} +7 -7
- package/dist/{chunk-AEYBF3TB.js → chunk-UM7N4G5A.js} +2 -2
- package/dist/{chunk-3V5AYSEQ.js → chunk-UXMFQ54G.js} +43 -36
- package/dist/{chunk-YW7UVM5V.js → chunk-V5DHCITQ.js} +34 -1
- package/dist/{chunk-47CMYGET.js → chunk-VAZSBTKF.js} +2 -2
- package/dist/{chunk-3MRC2YSQ.js → chunk-VEO4AP2K.js} +2 -2
- package/dist/{chunk-PNY46YEY.js → chunk-VFA6GDY5.js} +47 -3
- package/dist/chunk-VO67MWHC.js +75 -0
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-AD7Y7STJ.js → chunk-VYMXRQI6.js} +36 -22
- package/dist/{chunk-T3Z6VAAF.js → chunk-W5VSYASO.js} +19 -17
- package/dist/{chunk-5PVQ4SRS.js → chunk-WZR7K7ZX.js} +7 -123
- package/dist/{chunk-DG4M6ZUE.js → chunk-X3YGUTOB.js} +4 -4
- package/dist/chunk-X75E3D2N.js +686 -0
- package/dist/{chunk-P3JGPQFL.js → chunk-YDFRH54B.js} +4 -4
- package/dist/chunk-YJX4SHTD.js +40 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/{chunk-YSEHGPCT.js → chunk-Z2RR6MAK.js} +3 -3
- package/dist/{chunk-HCBCAYZU.js → chunk-Z4TXYIEG.js} +5 -5
- package/dist/cli/index.js +47 -36
- package/dist/{clio-LT5V7SSZ.js → clio-2JXHBBY5.js} +7 -7
- package/dist/{code-nav-LMW275PA.js → code-nav-3YYRMYNF.js} +6 -6
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
- package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
- package/dist/{config-RXS5T3JT.js → config-QZPCMYSO.js} +58 -50
- package/dist/{configure-2WYWSCSD.js → configure-TEGEBYCA.js} +21 -19
- package/dist/{context-I3BTOTCS.js → context-AV7OEZ4D.js} +11 -11
- package/dist/{context-MVOORGMF.js → context-E6H5RNMC.js} +49 -41
- package/dist/{context-PALKKQYL.js → context-GSXUE4CT.js} +25 -23
- package/dist/{context-clear-N2WOYZ2K.js → context-clear-SHIBYK6T.js} +48 -40
- package/dist/{context-working-set-MIEVECVZ.js → context-working-set-5ZGKPGZQ.js} +11 -10
- package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-EFMJT4LD.js} +88 -60
- package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
- package/dist/doctor-QOA5FNY5.js +313 -0
- package/dist/{eval-IJ5VEZDJ.js → eval-TFBYQH4H.js} +66 -64
- package/dist/eval-inventory-SXH7PDKX.js +316 -0
- package/dist/{evidence-L5APPXNV.js → evidence-ERGESKGN.js} +198 -44
- package/dist/{evolve-RGNKFJ52.js → evolve-VDXTSYCJ.js} +46 -38
- package/dist/{extensions-7WYWUX5A.js → extensions-7BGBHN57.js} +6 -6
- package/dist/{fleet-6CNVBZZP.js → fleet-2RRVDF2V.js} +189 -101
- package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-VJ726XIA.js} +10 -10
- package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
- package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-JF5QOATM.js} +16 -15
- package/dist/fleet-inspect-VLY4S7QM.js +442 -0
- package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-AIZUEJOY.js} +6 -5
- package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-AJRPDMDV.js} +20 -18
- package/dist/fleet-verify-JFEL2L3H.js +175 -0
- package/dist/fleet-view-ZCON35AG.js +102 -0
- package/dist/{init-VBN2ACVA.js → init-DN2WWLFE.js} +64 -56
- package/dist/install-XGLBQY5E.js +13 -0
- package/dist/interop-OZBKXAYL.js +114 -0
- package/dist/{library-JHGUMLY2.js → library-YWZG7IMW.js} +19 -18
- package/dist/{memory-K4OQIYWG.js → memory-I4C4HMLW.js} +48 -40
- package/dist/{models-2NCZUWDD.js → models-CEYXJBO6.js} +30 -28
- package/dist/{monitor-MMVTJABD.js → monitor-NZ6GCI3P.js} +53 -47
- package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-GCGQ4N5I.js} +6311 -7145
- package/dist/panes-HMABYVO4.js +58 -0
- package/dist/panes-KY6W3V2E.js +103 -0
- package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
- package/dist/{reset-DD5JGOY3.js → reset-DQ6FGCSH.js} +13 -11
- package/dist/resources-BB3MVJMD.js +111 -0
- package/dist/{run-QEGNX7FL.js → run-H2GQDUER.js} +113 -82
- package/dist/{share-JKD3BQMW.js → share-GTJN6A5O.js} +18 -17
- package/dist/{skills-LMQIKDOZ.js → skills-L55TEW6R.js} +31 -24
- package/dist/{skills-eval-I7X2774U.js → skills-eval-XVXPH2JI.js} +61 -52
- package/dist/skills-inventory-S4MXPJFV.js +126 -0
- package/dist/slash-commands-ZSGASKJC.js +77 -0
- package/dist/{steer-CF5TDANS.js → steer-RZGSCY4R.js} +3 -3
- package/dist/{support-I7LOJLIF.js → support-PKEUNNQL.js} +4 -4
- package/dist/{targets-RUSR6B5Z.js → targets-NCPZ644J.js} +31 -29
- package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-44SV3YCN.js} +4 -4
- package/dist/tools-DAF3DI3C.js +27 -0
- package/dist/{trace-ODOQIVIW.js → trace-FYVW2MQA.js} +149 -7
- package/dist/tui-primitives-2AKXQNZK.js +13 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
- package/dist/{upgrade-XANW3FXB.js → upgrade-3XPP6OQL.js} +26 -24
- package/dist/{usage-4H7ZRXQT.js → usage-3NLHGTU2.js} +57 -49
- package/dist/{verifiers-UZXNBZEB.js → verifiers-SSQONKRT.js} +171 -12
- package/dist/{verify-BVKWTNDL.js → verify-3U6J7FZI.js} +9 -9
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
- package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-CEHYGPGQ.js} +67 -59
- package/dist/with-panes-MKB46MPQ.js +782 -0
- package/dist/worker/entry.js +101 -66
- package/docs/README.md +3 -2
- package/docs/acp.md +24 -3
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +4 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +43 -5
- package/docs/commands-and-modes.md +31 -2
- package/docs/configuration-and-targets.md +40 -10
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +1 -0
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +2 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +1 -1
- package/docs/extensions-and-sharing.md +25 -1
- package/docs/fleet-dispatch.md +22 -1
- package/docs/installation-and-lifecycle.md +15 -2
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +1 -1
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +4 -2
- package/src/cli/acp.ts +6 -2
- package/src/cli/argv.ts +25 -0
- package/src/cli/configure.ts +23 -21
- package/src/cli/doctor-panes.ts +124 -0
- package/src/cli/doctor-toolchain.ts +57 -0
- package/src/cli/doctor.ts +20 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +13 -0
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +810 -0
- package/src/cli/fleet.ts +148 -37
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +5 -2
- package/src/cli/run.ts +58 -0
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +23 -2
- package/src/cli/verifiers-inspect.ts +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/core/bus-events.ts +4 -0
- package/src/core/config.ts +49 -0
- package/src/core/defaults.ts +93 -7
- package/src/core/response-schema.ts +44 -4
- package/src/core/theme-token-hex.ts +43 -0
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +164 -35
- package/src/domains/config/classify.ts +3 -0
- package/src/domains/dispatch/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +22 -21
- package/src/domains/dispatch/capacity-lease.ts +21 -1
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/extension.ts +222 -50
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-run.ts +64 -1
- package/src/domains/dispatch/gate-decisions.ts +11 -1
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/index.ts +19 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/reservation-store.ts +24 -4
- package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +598 -0
- package/src/domains/dispatch/state.ts +45 -1
- package/src/domains/dispatch/types.ts +13 -0
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/eval/compare/compare.ts +3 -16
- package/src/domains/eval/inventory.ts +113 -0
- package/src/domains/eval/schema/serving.ts +31 -0
- package/src/domains/evidence/store.ts +6 -0
- package/src/domains/memory/index.ts +0 -1
- package/src/domains/memory/task-memory-policy.ts +6 -10
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/memory-intervention.ts +33 -21
- package/src/domains/mux/contract.ts +434 -0
- package/src/domains/mux/detect.ts +158 -0
- package/src/domains/mux/extension.ts +47 -0
- package/src/domains/mux/index.ts +96 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +164 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +49 -0
- package/src/domains/mux/socket-client.ts +816 -0
- package/src/domains/mux/types.ts +222 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +180 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +228 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/cost.ts +21 -0
- package/src/domains/observability/index.ts +2 -0
- package/src/domains/observability/trace-store.ts +42 -0
- package/src/domains/providers/endpoint-capacity.ts +154 -22
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +20 -3
- package/src/domains/providers/index.ts +22 -0
- package/src/domains/providers/model-runtime-capabilities.ts +32 -0
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/skills/loader.ts +33 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/toolchain/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/server.ts +413 -70
- package/src/engine/acp/types.ts +19 -1
- package/src/engine/claude/sdk-module.ts +98 -0
- package/src/engine/claude/sdk-runtime.ts +19 -11
- package/src/engine/tui-primitives.ts +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-runtime.ts +2 -13
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +103 -5
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/context-overlay.ts +1 -0
- package/src/interactive/cost-overlay.ts +2 -0
- package/src/interactive/council-grid.ts +1 -3
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +26 -16
- package/src/interactive/interactive-application.ts +153 -6
- package/src/interactive/interactive-input-runtime.ts +7 -0
- package/src/interactive/interactive-slash-runtime.ts +36 -6
- package/src/interactive/memory-overlay.ts +1 -0
- package/src/interactive/modal-marker.ts +170 -0
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +58 -2
- package/src/interactive/overlay-general-openers.ts +1 -0
- package/src/interactive/overlay-key-routing.ts +14 -3
- package/src/interactive/overlay-lifecycle.ts +19 -3
- package/src/interactive/overlay-model-selectors.ts +40 -3
- package/src/interactive/overlay-permission-lifecycle.ts +90 -22
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +1 -0
- package/src/interactive/overlays/ask-user.ts +136 -30
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +1 -0
- package/src/interactive/overlays/cwd-fallback.ts +1 -0
- package/src/interactive/overlays/decisions.ts +11 -11
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +1 -0
- package/src/interactive/overlays/handoff-review.ts +1 -0
- package/src/interactive/overlays/help-reference.ts +2 -0
- package/src/interactive/overlays/interop.ts +1 -0
- package/src/interactive/overlays/library-install-confirm.ts +1 -0
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +1 -0
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +1 -0
- package/src/interactive/overlays/prompts.ts +1 -0
- package/src/interactive/overlays/session-selector.ts +1 -0
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +579 -44
- package/src/interactive/overlays/side-question.ts +1 -0
- package/src/interactive/overlays/skills-hub.ts +3 -11
- package/src/interactive/overlays/tree-selector.ts +1 -0
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +292 -0
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/slash-commands.ts +251 -15
- package/src/interactive/tasks-overlay.ts +1 -0
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +47 -2
- package/src/interactive/view/artifacts.ts +109 -1
- package/src/interactive/view/view-overlay.ts +1 -0
- package/src/interactive/watch-pane.ts +152 -0
- package/src/interactive/worker-progress.ts +7 -1
- package/src/interactive/worker-receipts.ts +19 -1
- package/src/interactive/worker-stream.ts +5 -0
- package/src/interactive/yazi-bridge.ts +444 -0
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +15 -0
- package/src/tools/compete-worktrees.ts +83 -2
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +14 -3
- package/src/tools/dispatch-arguments.ts +20 -20
- package/src/tools/dispatch-run-events.ts +134 -19
- package/src/tools/dispatch-runner.ts +29 -7
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/executables.ts +17 -14
- package/src/tools/observation.ts +54 -4
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- package/dist/chunk-D73KXYPF.js +0 -37
- package/dist/chunk-MLOK6ZOS.js +0 -2888
- package/dist/chunk-YKOFT37S.js +0 -279
- package/dist/doctor-TWBWFK5V.js +0 -165
package/src/cli/fleet.ts
CHANGED
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
* clio-coder fleet commands init draft a repository command registry
|
|
8
8
|
* clio-coder fleet run <name> --var k=v ... preflight + execute a fleet contract
|
|
9
9
|
* clio-coder fleet status [--json] runtime snapshot from the durable ledger
|
|
10
|
+
* clio-coder fleet inspect --json bounded recent run and journal projection
|
|
11
|
+
* clio-coder fleet decisions --json bounded sealed review and compete gate verdicts
|
|
12
|
+
* clio-coder fleet view <runId|fleetRootId> one run's transcript, or a root's step index
|
|
10
13
|
* clio-coder fleet drain|resume [--json] close or reopen durable dispatch admission
|
|
11
14
|
*
|
|
12
15
|
* Fleet contracts are repo-owned policy (.clio-coder/fleets/<name>.md). Preflight
|
|
@@ -52,22 +55,34 @@ import { bindExecutionPlanEndpoints, type ExecutionPlan } from "../domains/dispa
|
|
|
52
55
|
import { agentRoleFactsResolver, requestExecutionRole, withAttemptRole } from "../domains/dispatch/execution-role.js";
|
|
53
56
|
import { compileFleetExecutionPlan } from "../domains/dispatch/fleet-plan.js";
|
|
54
57
|
import {
|
|
55
|
-
|
|
58
|
+
createDispatchDomainModule,
|
|
56
59
|
type ExecuteFleetRunInput,
|
|
57
60
|
executeFleetRun,
|
|
58
61
|
type FleetRunOutcome,
|
|
59
62
|
planFleetResume,
|
|
60
63
|
readFleetRun,
|
|
61
64
|
} from "../domains/dispatch/index.js";
|
|
65
|
+
import { configureRunEventJournal } from "../domains/dispatch/run-event-journal.js";
|
|
62
66
|
import { openLedger } from "../domains/dispatch/state.js";
|
|
63
67
|
import type { RunEnvelope, RunReceipt } from "../domains/dispatch/types.js";
|
|
64
68
|
import { WRITE_BOUNDARY_VIOLATION_REASON } from "../domains/dispatch/write-boundary.js";
|
|
65
69
|
import { preflightWriteBoundaries } from "../domains/dispatch/write-boundary-enforcer.js";
|
|
66
70
|
import { ensureClioState, LifecycleDomainModule } from "../domains/lifecycle/index.js";
|
|
67
71
|
import { MiddlewareDomainModule } from "../domains/middleware/index.js";
|
|
68
|
-
import {
|
|
72
|
+
import {
|
|
73
|
+
aggregateCostAmounts,
|
|
74
|
+
type CostAggregate,
|
|
75
|
+
ObservabilityDomainModule,
|
|
76
|
+
renderCostAggregate,
|
|
77
|
+
renderCostAmount,
|
|
78
|
+
} from "../domains/observability/index.js";
|
|
69
79
|
import { createPromptsDomainModule } from "../domains/prompts/index.js";
|
|
70
|
-
import {
|
|
80
|
+
import {
|
|
81
|
+
type CostProvenance,
|
|
82
|
+
foregroundStreamUsage,
|
|
83
|
+
normalizeCostProvenance,
|
|
84
|
+
ProvidersDomainModule,
|
|
85
|
+
} from "../domains/providers/index.js";
|
|
71
86
|
import { ResourcesDomainModule } from "../domains/resources/index.js";
|
|
72
87
|
import type { SafetyContract } from "../domains/safety/contract.js";
|
|
73
88
|
import { SafetyDomainModule } from "../domains/safety/index.js";
|
|
@@ -89,6 +104,10 @@ Subcommands:
|
|
|
89
104
|
[--resume <runId>] replay a completed prefix from a prior run of the same plan
|
|
90
105
|
[--json] emit step receipts as JSON
|
|
91
106
|
status [--json] show running, retrying, and total dispatch state
|
|
107
|
+
inspect --json emit a bounded recent-run and event-journal projection
|
|
108
|
+
decisions --json emit a bounded window of sealed review and compete gate verdicts
|
|
109
|
+
view <runId> [--follow] read one run's ledger entry, event journal, and receipt
|
|
110
|
+
view <fleetRootId> list a fleet run's steps and the run id to view for each
|
|
92
111
|
drain [--json] deny new execution starts for up to one hour
|
|
93
112
|
resume [--json] reopen dispatch admission immediately
|
|
94
113
|
|
|
@@ -96,6 +115,10 @@ Notes:
|
|
|
96
115
|
status reads the durable run ledger. Rows started by another process show
|
|
97
116
|
heartbeat liveness from the recorded worker pid; per-token live meters are
|
|
98
117
|
only available inside the process that owns the run.
|
|
118
|
+
view is read-only and shares no memory with the orchestrator, so it follows a
|
|
119
|
+
run from a second terminal or over SSH. Its transcript comes from the run
|
|
120
|
+
event journal, written when panes.journal is on (the default). Handed the
|
|
121
|
+
fleet-<hex> root id that run prints, it lists that run's steps instead.
|
|
99
122
|
drain preserves running work. Repeat it to renew the one-hour expiry; resume
|
|
100
123
|
clears it early. The expiry prevents an abandoned drain from wedging Clio.
|
|
101
124
|
`;
|
|
@@ -127,7 +150,9 @@ function parseVars(args: ReadonlyArray<string>): { vars: Record<string, string>;
|
|
|
127
150
|
const eq = pair.indexOf("=");
|
|
128
151
|
const key = pair.slice(0, eq).trim();
|
|
129
152
|
const value = pair.slice(eq + 1);
|
|
130
|
-
if (key.length === 0)
|
|
153
|
+
if (key.length === 0) {
|
|
154
|
+
return { vars, rest, error: "--var requires a non-empty key" };
|
|
155
|
+
}
|
|
131
156
|
vars[key] = value;
|
|
132
157
|
}
|
|
133
158
|
return { vars, rest };
|
|
@@ -145,7 +170,9 @@ function renderStep(step: FleetContractStep): string {
|
|
|
145
170
|
if (step.kind === "code") return `code:${step.command}[${step.scope}]`;
|
|
146
171
|
if (step.kind === "agent") return `${step.agent}[${step.scope}]`;
|
|
147
172
|
if (step.kind === "gate") return `gate:${step.path}[${step.run}]`;
|
|
148
|
-
if (step.kind === "plan")
|
|
173
|
+
if (step.kind === "plan") {
|
|
174
|
+
return `plan:${step.agent}[${step.roster.join(",")}; max ${step.maxTasks}]`;
|
|
175
|
+
}
|
|
149
176
|
const check =
|
|
150
177
|
step.check.kind === "code"
|
|
151
178
|
? `code:${step.check.command}`
|
|
@@ -212,16 +239,28 @@ function contractAgents(
|
|
|
212
239
|
): Array<{ id: string; agent: string; scope: "readonly" | "workspace" }> {
|
|
213
240
|
const agents: Array<{ id: string; agent: string; scope: "readonly" | "workspace" }> = [];
|
|
214
241
|
for (const step of contract.steps) {
|
|
215
|
-
if (step.kind === "agent")
|
|
216
|
-
else if (step.kind === "gate") agents.push({ id: step.id, agent: step.agent, scope: "workspace" });
|
|
217
|
-
else if (step.kind === "plan") {
|
|
242
|
+
if (step.kind === "agent") {
|
|
218
243
|
agents.push({ id: step.id, agent: step.agent, scope: step.scope });
|
|
219
|
-
|
|
244
|
+
} else if (step.kind === "gate") {
|
|
245
|
+
agents.push({ id: step.id, agent: step.agent, scope: "workspace" });
|
|
246
|
+
} else if (step.kind === "plan") {
|
|
247
|
+
agents.push({ id: step.id, agent: step.agent, scope: step.scope });
|
|
248
|
+
for (const agent of step.roster) {
|
|
249
|
+
agents.push({ id: `${step.id}.roster`, agent, scope: "readonly" });
|
|
250
|
+
}
|
|
220
251
|
} else if (step.kind === "loop") {
|
|
221
252
|
if (step.check.kind === "agent") {
|
|
222
|
-
agents.push({
|
|
253
|
+
agents.push({
|
|
254
|
+
id: `${step.id}.check`,
|
|
255
|
+
agent: step.check.agent,
|
|
256
|
+
scope: step.check.scope,
|
|
257
|
+
});
|
|
223
258
|
}
|
|
224
|
-
agents.push({
|
|
259
|
+
agents.push({
|
|
260
|
+
id: `${step.id}.repair`,
|
|
261
|
+
agent: step.repair.agent,
|
|
262
|
+
scope: step.repair.scope,
|
|
263
|
+
});
|
|
225
264
|
}
|
|
226
265
|
}
|
|
227
266
|
return agents;
|
|
@@ -231,10 +270,12 @@ function preflightFleet(contract: FleetContract, deps: FleetPreflightDeps): stri
|
|
|
231
270
|
const targets = new Set(deps.settings.targets.map((target) => target.id));
|
|
232
271
|
const profiles = new Set(Object.keys(deps.settings.workers?.profiles ?? {}));
|
|
233
272
|
const checkRoute = (id: string, route: { target?: string; profile?: string }): string | null => {
|
|
234
|
-
if (route.target !== undefined && !targets.has(route.target))
|
|
273
|
+
if (route.target !== undefined && !targets.has(route.target)) {
|
|
235
274
|
return `unknown target '${route.target}' at step '${id}'`;
|
|
236
|
-
|
|
275
|
+
}
|
|
276
|
+
if (route.profile !== undefined && !profiles.has(route.profile)) {
|
|
237
277
|
return `unknown profile '${route.profile}' at step '${id}'`;
|
|
278
|
+
}
|
|
238
279
|
return null;
|
|
239
280
|
};
|
|
240
281
|
for (const step of contract.steps) {
|
|
@@ -280,10 +321,13 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
|
|
|
280
321
|
const json = rest.includes("--json");
|
|
281
322
|
const resumeIndex = rest.indexOf("--resume");
|
|
282
323
|
const resumeId = resumeIndex === -1 ? undefined : rest[resumeIndex + 1];
|
|
283
|
-
if (resumeIndex !== -1 && (resumeId === undefined || resumeId.startsWith("-")))
|
|
324
|
+
if (resumeIndex !== -1 && (resumeId === undefined || resumeId.startsWith("-"))) {
|
|
284
325
|
return fail("--resume requires a run id");
|
|
326
|
+
}
|
|
285
327
|
const name = rest.find((arg) => !arg.startsWith("-"));
|
|
286
|
-
if (!name)
|
|
328
|
+
if (!name) {
|
|
329
|
+
return fail("usage: clio-coder fleet run <name> [--var key=value ...] [--resume <runId>] [--json]");
|
|
330
|
+
}
|
|
287
331
|
|
|
288
332
|
let contract: FleetContract;
|
|
289
333
|
let prompt: string;
|
|
@@ -312,7 +356,10 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
|
|
|
312
356
|
MiddlewareDomainModule,
|
|
313
357
|
ObservabilityDomainModule,
|
|
314
358
|
SchedulingDomainModule,
|
|
315
|
-
|
|
359
|
+
// A fleet step is dispatched by executeFleetRun, which drains the handle
|
|
360
|
+
// itself and never builds a dispatch event registry, so the domain is the
|
|
361
|
+
// only thing that can write each step's durable transcript.
|
|
362
|
+
createDispatchDomainModule({ journalRunEvents: true }),
|
|
316
363
|
SessionDomainModule,
|
|
317
364
|
LifecycleDomainModule,
|
|
318
365
|
]);
|
|
@@ -325,12 +372,17 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
|
|
|
325
372
|
await loaded.stop();
|
|
326
373
|
return fail("required domains unavailable (dispatch/agents/safety)");
|
|
327
374
|
}
|
|
375
|
+
const fleetSettings = config?.get() ?? readSettings();
|
|
376
|
+
// Install `panes.journal` the same way the interactive composition root
|
|
377
|
+
// does, so a fleet run honours the setting without the journal ever reading
|
|
378
|
+
// settings.yaml from the dispatch event path.
|
|
379
|
+
configureRunEventJournal(fleetSettings.panes.journal);
|
|
328
380
|
const roleFacts = agentRoleFactsResolver((id) => agents.getSpec(id));
|
|
329
381
|
const preflightError = preflightFleet(contract, {
|
|
330
382
|
agents,
|
|
331
383
|
safety,
|
|
332
384
|
scheduling,
|
|
333
|
-
settings:
|
|
385
|
+
settings: fleetSettings,
|
|
334
386
|
});
|
|
335
387
|
if (preflightError !== null) {
|
|
336
388
|
await loaded.stop();
|
|
@@ -457,30 +509,43 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
|
|
|
457
509
|
...(resume !== undefined ? { resume } : {}),
|
|
458
510
|
onStepSettled(step) {
|
|
459
511
|
if (step.replayed === true && step.result !== undefined) {
|
|
460
|
-
if (json)
|
|
512
|
+
if (json) {
|
|
461
513
|
process.stdout.write(
|
|
462
|
-
`${JSON.stringify({
|
|
514
|
+
`${JSON.stringify({
|
|
515
|
+
stepId: step.stepId,
|
|
516
|
+
status: "replayed",
|
|
517
|
+
receipt: {
|
|
518
|
+
runId: step.result.terminalRunId,
|
|
519
|
+
digest: step.result.receiptDigest,
|
|
520
|
+
},
|
|
521
|
+
})}\n`,
|
|
463
522
|
);
|
|
464
|
-
else
|
|
523
|
+
} else {
|
|
465
524
|
process.stdout.write(
|
|
466
525
|
`step ${step.stepId}: replayed terminal-run=${step.result.terminalRunId} receipt=${step.result.receiptDigest}\n`,
|
|
467
526
|
);
|
|
527
|
+
}
|
|
468
528
|
return;
|
|
469
529
|
}
|
|
470
530
|
if (step.receipt !== undefined) {
|
|
471
531
|
if (json) process.stdout.write(`${JSON.stringify(step.receipt)}\n`);
|
|
472
|
-
else
|
|
532
|
+
else {
|
|
473
533
|
process.stdout.write(
|
|
474
|
-
`step ${step.stepId} ${step.agentId}: ${step.succeeded ? "succeeded" : "failed"}${step.failureReason !== undefined ? ` reason=${step.failureReason}` : ""} assignment=${step.assignmentId} terminal-run=${step.terminalRunId} cost
|
|
534
|
+
`step ${step.stepId} ${step.agentId}: ${step.succeeded ? "succeeded" : "failed"}${step.failureReason !== undefined ? ` reason=${step.failureReason}` : ""} assignment=${step.assignmentId} terminal-run=${step.terminalRunId} cost=${renderCostAmount(step.costUsd, step.costProvenance)}\n`,
|
|
475
535
|
);
|
|
536
|
+
}
|
|
476
537
|
return;
|
|
477
538
|
}
|
|
478
539
|
if (step.codeStep !== undefined) {
|
|
479
|
-
if (json)
|
|
480
|
-
|
|
540
|
+
if (json) {
|
|
541
|
+
process.stdout.write(`${JSON.stringify({ codeStep: step.codeStep })}\n`);
|
|
542
|
+
} else {
|
|
481
543
|
process.stdout.write(
|
|
482
|
-
`step ${step.stepId} code:${step.commandId}: ${
|
|
544
|
+
`step ${step.stepId} code:${step.commandId}: ${
|
|
545
|
+
step.succeeded ? "passed" : "failed"
|
|
546
|
+
} exit=${step.codeStep.exitCode} ${step.codeStep.durationMs}ms record=${step.recordPath}\n`,
|
|
483
547
|
);
|
|
548
|
+
}
|
|
484
549
|
}
|
|
485
550
|
},
|
|
486
551
|
onNotice(text, kind) {
|
|
@@ -512,21 +577,31 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
|
|
|
512
577
|
);
|
|
513
578
|
} else {
|
|
514
579
|
process.stdout.write(
|
|
515
|
-
`fleet ${contract.name}: ${outcome.succeededStepCount}/${outcome.requiredStepCount} steps succeeded, ${outcome.resolvedLoopCount}/${outcome.result.loops.length} loops resolved, total cost
|
|
580
|
+
`fleet ${contract.name}: ${outcome.succeededStepCount}/${outcome.requiredStepCount} steps succeeded, ${outcome.resolvedLoopCount}/${outcome.result.loops.length} loops resolved, total cost ${renderCostAggregate(outcome.totalCost)}\n`,
|
|
516
581
|
);
|
|
517
|
-
for (const loop of outcome.result.loops)
|
|
582
|
+
for (const loop of outcome.result.loops) {
|
|
518
583
|
process.stdout.write(
|
|
519
584
|
` loop ${loop.loopId}: ${loop.reason} after ${loop.attempts} verification(s) and ${loop.repairs} repair(s)\n`,
|
|
520
585
|
);
|
|
521
|
-
|
|
586
|
+
}
|
|
587
|
+
if (outcome.result.revalidated.length > 0) {
|
|
522
588
|
process.stdout.write(
|
|
523
|
-
` staleness: re-ran ${outcome.result.revalidated.join(
|
|
589
|
+
` staleness: re-ran ${outcome.result.revalidated.join(
|
|
590
|
+
", ",
|
|
591
|
+
)} because a workspace step landed after the last green\n`,
|
|
524
592
|
);
|
|
525
|
-
|
|
593
|
+
}
|
|
594
|
+
for (const message of outcome.result.needsDecision) {
|
|
595
|
+
process.stdout.write(` needs operator decision: ${message}\n`);
|
|
596
|
+
}
|
|
526
597
|
for (const boundary of outcome.result.writeBoundaries) {
|
|
527
598
|
if (!boundary.violated) continue;
|
|
528
599
|
process.stdout.write(` write boundary ${boundary.window}: ${boundary.detail ?? WRITE_BOUNDARY_VIOLATION_REASON}\n`);
|
|
529
600
|
}
|
|
601
|
+
// The root id printed at the top is the only identifier this command
|
|
602
|
+
// advertises, so say what it is good for rather than leaving an operator
|
|
603
|
+
// to guess that the viewer wants a per-step run id.
|
|
604
|
+
process.stdout.write(` clio-coder fleet view ${fleetRootId} step index with each step's run id\n`);
|
|
530
605
|
}
|
|
531
606
|
return outcome.cleanRun ? 0 : 1;
|
|
532
607
|
}
|
|
@@ -559,7 +634,10 @@ function receiptTokenSplit(row: RunEnvelope): { input: number; output: number }
|
|
|
559
634
|
const path = row.receiptPath ?? join(clioStateDir(), "receipts", `${row.id}.json`);
|
|
560
635
|
try {
|
|
561
636
|
const parsed = JSON.parse(readFileSync(path, "utf8")) as Partial<RunReceipt>;
|
|
562
|
-
return {
|
|
637
|
+
return {
|
|
638
|
+
input: finiteCount(parsed.inputTokenCount),
|
|
639
|
+
output: finiteCount(parsed.outputTokenCount),
|
|
640
|
+
};
|
|
563
641
|
} catch {
|
|
564
642
|
return null;
|
|
565
643
|
}
|
|
@@ -572,7 +650,10 @@ function receiptTokenSplit(row: RunEnvelope): { input: number; output: number }
|
|
|
572
650
|
*/
|
|
573
651
|
function rowTokenSplit(row: RunEnvelope): { input: number; output: number } {
|
|
574
652
|
if (row.inputTokenCount !== undefined || row.outputTokenCount !== undefined) {
|
|
575
|
-
return {
|
|
653
|
+
return {
|
|
654
|
+
input: finiteCount(row.inputTokenCount),
|
|
655
|
+
output: finiteCount(row.outputTokenCount),
|
|
656
|
+
};
|
|
576
657
|
}
|
|
577
658
|
if (row.endedAt !== null) {
|
|
578
659
|
return receiptTokenSplit(row) ?? { input: 0, output: 0 };
|
|
@@ -582,7 +663,12 @@ function rowTokenSplit(row: RunEnvelope): { input: number; output: number } {
|
|
|
582
663
|
|
|
583
664
|
export type FleetAdmissionStatus =
|
|
584
665
|
| { state: "open" }
|
|
585
|
-
| {
|
|
666
|
+
| {
|
|
667
|
+
state: "draining";
|
|
668
|
+
requestedByPid: number;
|
|
669
|
+
requestedAt: string;
|
|
670
|
+
expiresAt: string;
|
|
671
|
+
};
|
|
586
672
|
|
|
587
673
|
function admissionStatus(drain: CapacityDrain | null): FleetAdmissionStatus {
|
|
588
674
|
if (drain === null) return { state: "open" };
|
|
@@ -594,7 +680,16 @@ export function statusSnapshot(): {
|
|
|
594
680
|
admission: FleetAdmissionStatus;
|
|
595
681
|
running: Array<Record<string, unknown>>;
|
|
596
682
|
retrying: Array<Record<string, unknown>>;
|
|
597
|
-
totals: {
|
|
683
|
+
totals: {
|
|
684
|
+
inputTokens: number;
|
|
685
|
+
outputTokens: number;
|
|
686
|
+
totalTokens: number;
|
|
687
|
+
/** The bare sum, kept for JSON readers that already parse it. Render `cost`. */
|
|
688
|
+
costUsd: number;
|
|
689
|
+
/** Mirrors what `DispatchSnapshot.totals.cost` declares for the in-process surface. */
|
|
690
|
+
cost: CostAggregate;
|
|
691
|
+
runtimeSeconds: number;
|
|
692
|
+
};
|
|
598
693
|
} {
|
|
599
694
|
const ledger = openLedger();
|
|
600
695
|
const nowMs = Date.now();
|
|
@@ -615,10 +710,18 @@ export function statusSnapshot(): {
|
|
|
615
710
|
elapsedMs: Number.isFinite(startedMs) ? Math.max(0, nowMs - startedMs) : 0,
|
|
616
711
|
tokens: { input: 0, output: 0, total: row.tokenCount },
|
|
617
712
|
costUsd: row.costUsd,
|
|
713
|
+
// Absent on pre-provenance ledger rows, which readers must treat as
|
|
714
|
+
// unknown; `renderCostAmount` normalizes it rather than assuming free.
|
|
715
|
+
costProvenance: row.costProvenance,
|
|
618
716
|
node: row.node?.id ?? "local",
|
|
619
717
|
};
|
|
620
718
|
});
|
|
621
719
|
const totals = { inputTokens: 0, outputTokens: 0, totalTokens: 0, costUsd: 0, runtimeSeconds: 0 };
|
|
720
|
+
// Folded rather than summed: a ledger of runs nobody priced totals to an
|
|
721
|
+
// absent cost claim, not to zero dollars.
|
|
722
|
+
const cost = aggregateCostAmounts(
|
|
723
|
+
rows.map((row) => ({ usd: row.costUsd, provenance: normalizeCostProvenance(row.costProvenance) })),
|
|
724
|
+
);
|
|
622
725
|
for (const row of rows) {
|
|
623
726
|
const split = rowTokenSplit(row);
|
|
624
727
|
totals.inputTokens += split.input;
|
|
@@ -638,7 +741,7 @@ export function statusSnapshot(): {
|
|
|
638
741
|
admission: admissionStatus(capacityDrain(nowMs)),
|
|
639
742
|
running,
|
|
640
743
|
retrying: [],
|
|
641
|
-
totals,
|
|
744
|
+
totals: { ...totals, cost },
|
|
642
745
|
};
|
|
643
746
|
}
|
|
644
747
|
|
|
@@ -663,7 +766,7 @@ function runStatus(args: ReadonlyArray<string>): number {
|
|
|
663
766
|
for (const row of snapshot.running) {
|
|
664
767
|
const lineage = row.lineage as { attempt: number; depth: number };
|
|
665
768
|
process.stdout.write(
|
|
666
|
-
` ${row.runId} ${row.agentId} node=${row.node} ${row.heartbeat} attempt=${lineage.attempt} depth=${lineage.depth} ${Math.round((row.elapsedMs as number) / 1000)}s
|
|
769
|
+
` ${row.runId} ${row.agentId} node=${row.node} ${row.heartbeat} attempt=${lineage.attempt} depth=${lineage.depth} ${Math.round((row.elapsedMs as number) / 1000)}s ${renderCostAmount(row.costUsd as number, row.costProvenance as CostProvenance | undefined)}\n`,
|
|
667
770
|
);
|
|
668
771
|
const budget = row.budget as RunToolBudgetEnvelope | null;
|
|
669
772
|
if (budget !== null) {
|
|
@@ -684,7 +787,7 @@ function runStatus(args: ReadonlyArray<string>): number {
|
|
|
684
787
|
}
|
|
685
788
|
const t = snapshot.totals;
|
|
686
789
|
process.stdout.write(
|
|
687
|
-
`totals: tokens=${t.totalTokens} (in=${t.inputTokens} out=${t.outputTokens}) cost
|
|
790
|
+
`totals: tokens=${t.totalTokens} (in=${t.inputTokens} out=${t.outputTokens}) cost=${renderCostAggregate(t.cost)} runtime=${Math.round(t.runtimeSeconds)}s\n`,
|
|
688
791
|
);
|
|
689
792
|
return 0;
|
|
690
793
|
}
|
|
@@ -738,6 +841,14 @@ export async function runFleetCommand(args: ReadonlyArray<string>): Promise<numb
|
|
|
738
841
|
return runFleet(args.slice(1));
|
|
739
842
|
case "status":
|
|
740
843
|
return runStatus(args.slice(1));
|
|
844
|
+
case "inspect":
|
|
845
|
+
return (await import("./fleet-inspect.js")).runFleetInspect(args.slice(1));
|
|
846
|
+
case "decisions":
|
|
847
|
+
return (await import("./fleet-decisions.js")).runFleetDecisions(args.slice(1));
|
|
848
|
+
case "verify":
|
|
849
|
+
return (await import("./fleet-verify.js")).runFleetVerify(args.slice(1));
|
|
850
|
+
case "view":
|
|
851
|
+
return (await import("./fleet-view.js")).runFleetView(args.slice(1));
|
|
741
852
|
case "drain":
|
|
742
853
|
return runAdmissionControl("drain", args.slice(1));
|
|
743
854
|
case "resume":
|
package/src/cli/index.ts
CHANGED
|
@@ -30,10 +30,13 @@ science. CLIO stands for Context Layer for Input/Output, named for the Greek mus
|
|
|
30
30
|
Usage:
|
|
31
31
|
clio-coder start interactive repository chat
|
|
32
32
|
clio-coder acp serve Clio as an ACP v1 agent over stdio
|
|
33
|
+
clio-coder --acp alias for clio-coder acp
|
|
33
34
|
clio-coder run [flags] <task> run one headless main-agent turn
|
|
34
35
|
clio-coder --version, -v print the Clio Coder version
|
|
35
36
|
clio-coder --api-key <key> override the active target API key for this run
|
|
36
37
|
clio-coder --no-context-files, -nc skip CLIO-CODER.md project-context injection
|
|
38
|
+
clio-coder --with-panes activate the panes extension (terminal panes for workers and tools)
|
|
39
|
+
clio-coder --no-panes keep panes off even when settings turn them on
|
|
37
40
|
clio-coder configure interactive first-run/configuration wizard
|
|
38
41
|
clio-coder targets list configured targets, health, auth, and capabilities
|
|
39
42
|
clio-coder targets add add a target interactively or via flags
|
|
@@ -57,7 +60,7 @@ Usage:
|
|
|
57
60
|
clio-coder uninstall remove all Clio Coder state; --remove-binary also unlinks the launcher
|
|
58
61
|
clio-coder upgrade upgrade Clio Coder and run pending migrations
|
|
59
62
|
clio-coder agents list discovered agent recipes
|
|
60
|
-
clio-coder fleet new|validate|graph|commands|run|status|drain|resume fleet authoring, execution, status, and admission control
|
|
63
|
+
clio-coder fleet new|validate|graph|commands|run|status|view|verify|drain|resume fleet authoring, execution, status, verification, and admission control
|
|
61
64
|
clio-coder evidence build, list, or inspect evidence artifacts
|
|
62
65
|
clio-coder eval run, report, or compare local eval task files
|
|
63
66
|
clio-coder memory list, propose, promote, approve, reject, or prune memory
|
|
@@ -66,7 +69,10 @@ Usage:
|
|
|
66
69
|
clio-coder extensions install, list, enable, disable, or remove extension packages
|
|
67
70
|
clio-coder skills list, inspect, validate, or install skills
|
|
68
71
|
clio-coder library list, search, add, or sync agents, prompts, fleets, and skills from catalogs
|
|
69
|
-
clio-coder verifiers discover, author, validate, edit, or dry-run project checks
|
|
72
|
+
clio-coder verifiers discover, inspect, author, validate, edit, or dry-run project checks
|
|
73
|
+
clio-coder tools list|status|install|remove <id> pinned external programs Clio can drive
|
|
74
|
+
clio-coder interop inspect --json detected external coding agents and how far each one is wired
|
|
75
|
+
clio-coder panes install install the pane multiplexer (alias for 'tools install herdr')
|
|
70
76
|
clio-coder docs [topic] serve the HTML docs of a source checkout on 127.0.0.1 (--no-open to skip browser)
|
|
71
77
|
clio-coder dev <command> harness instruments; run 'clio-coder dev' for the list
|
|
72
78
|
clio-coder --help, -h this message
|
|
@@ -112,6 +118,7 @@ interface CliBootOptions {
|
|
|
112
118
|
noContextFiles?: boolean;
|
|
113
119
|
noSkills?: boolean;
|
|
114
120
|
skillPaths?: string[];
|
|
121
|
+
panes?: "with" | "without";
|
|
115
122
|
}
|
|
116
123
|
|
|
117
124
|
type CommandHandler = (subArgs: string[], bootOptions: CliBootOptions) => Promise<number>;
|
|
@@ -143,6 +150,7 @@ async function main(argv: string[]): Promise<number> {
|
|
|
143
150
|
noContextFiles,
|
|
144
151
|
noSkills,
|
|
145
152
|
skillPaths,
|
|
153
|
+
panes,
|
|
146
154
|
rest,
|
|
147
155
|
error: globalFlagError,
|
|
148
156
|
} = extractGlobalFlags(argv, isCommandToken);
|
|
@@ -169,6 +177,7 @@ async function main(argv: string[]): Promise<number> {
|
|
|
169
177
|
...(noContextFiles ? { noContextFiles: true } : {}),
|
|
170
178
|
...(noSkills ? { noSkills: true } : {}),
|
|
171
179
|
...(skillPaths.length > 0 ? { skillPaths } : {}),
|
|
180
|
+
...(panes === undefined ? {} : { panes }),
|
|
172
181
|
};
|
|
173
182
|
if (!subcommand) {
|
|
174
183
|
await enableBootCompileCache();
|
|
@@ -261,6 +270,9 @@ const COMMAND_HANDLERS = new Map<string, CommandHandler>([
|
|
|
261
270
|
return (await import("./run.js")).runClioRun(subArgs, bootOptions);
|
|
262
271
|
},
|
|
263
272
|
],
|
|
273
|
+
["tools", async (subArgs) => (await import("./tools.js")).runToolsCommand(subArgs)],
|
|
274
|
+
["interop", async (subArgs) => (await import("./interop.js")).runInteropCommand(subArgs)],
|
|
275
|
+
["panes", async (subArgs) => (await import("./panes.js")).runPanesCommand(subArgs)],
|
|
264
276
|
["doctor", async (subArgs) => (await import("./doctor.js")).runDoctorCommand(subArgs)],
|
|
265
277
|
["paths", async (subArgs) => (await import("./paths.js")).runPathsCommand(subArgs)],
|
|
266
278
|
["reset", async (subArgs) => (await import("./reset.js")).runResetCommand(subArgs)],
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of detected external coding agents.
|
|
3
|
+
*
|
|
4
|
+
* `configure --interop` is an interactive review that writes delegation peers
|
|
5
|
+
* into settings, so it is not a transport a GUI host can invoke. This command
|
|
6
|
+
* takes no identifier or flag beyond `--json`, decides nothing, and writes
|
|
7
|
+
* nothing.
|
|
8
|
+
*
|
|
9
|
+
* It also runs no foreign executable. Detection can probe `<bin> --version`,
|
|
10
|
+
* and this read deliberately does not: a GUI refresh must not become "execute
|
|
11
|
+
* every coding agent installed on this machine". The version still crosses,
|
|
12
|
+
* because a non-probing detection keeps the last version the harness observed
|
|
13
|
+
* for the same binary, so what the operator sees is a recorded fact rather than
|
|
14
|
+
* a fresh execution.
|
|
15
|
+
*
|
|
16
|
+
* Resolved binary paths and the agent's home directory are native filesystem
|
|
17
|
+
* facts and stay on the host. Whether a directory exists crosses; where it is
|
|
18
|
+
* does not.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { readSettings } from "../core/config.js";
|
|
22
|
+
import {
|
|
23
|
+
detectInteropAgents,
|
|
24
|
+
INTEROP_AGENT_KINDS,
|
|
25
|
+
type InteropAgentId,
|
|
26
|
+
type InteropPresence,
|
|
27
|
+
interopAgentKind,
|
|
28
|
+
} from "../domains/interop/index.js";
|
|
29
|
+
|
|
30
|
+
export type InteropDecisionState = "accepted" | "declined";
|
|
31
|
+
|
|
32
|
+
export interface InteropInspectAgent {
|
|
33
|
+
readonly id: InteropAgentId;
|
|
34
|
+
readonly label: string;
|
|
35
|
+
readonly presence: InteropPresence;
|
|
36
|
+
/** The last version the harness observed for this binary, never probed here. */
|
|
37
|
+
readonly version: string | null;
|
|
38
|
+
/** Whether the agent owns a directory under the operator's home. The path stays host-side. */
|
|
39
|
+
readonly hasUserDirectory: boolean;
|
|
40
|
+
/** Whether this kind speaks ACP at all. */
|
|
41
|
+
readonly acp: boolean;
|
|
42
|
+
/** Whether the ACP adapter can start without a network install; null for a kind with no recipe. */
|
|
43
|
+
readonly adapter: InteropPresence | null;
|
|
44
|
+
/** Whether a `delegation.agents` entry already names this agent. */
|
|
45
|
+
readonly configured: boolean;
|
|
46
|
+
/** The operator's standing answer, or null when they have not been asked. */
|
|
47
|
+
readonly decision: InteropDecisionState | null;
|
|
48
|
+
readonly decidedAt: string | null;
|
|
49
|
+
/**
|
|
50
|
+
* True when the facts moved since the decision was taken.
|
|
51
|
+
*
|
|
52
|
+
* A standing answer suppresses re-proposal only while the facts it was made
|
|
53
|
+
* against still hold, so this is what says Clio Coder will ask again.
|
|
54
|
+
*/
|
|
55
|
+
readonly decisionStale: boolean;
|
|
56
|
+
/** True when Clio Coder would offer to wire this agent on the next review. */
|
|
57
|
+
readonly proposed: boolean;
|
|
58
|
+
/** True when wiring it would fetch the adapter from the network on first use. */
|
|
59
|
+
readonly needsNetworkInstall: boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface InteropInspectSnapshot {
|
|
63
|
+
readonly version: 1;
|
|
64
|
+
readonly generatedAt: string;
|
|
65
|
+
readonly detectedAt: string;
|
|
66
|
+
/**
|
|
67
|
+
* How many agent kinds the registry knows, so an empty list reads as "none
|
|
68
|
+
* detected" rather than "nothing to detect". Detection drops a kind with no
|
|
69
|
+
* binary, no directory, and no artifacts, so the list is never padded.
|
|
70
|
+
*/
|
|
71
|
+
readonly knownKinds: number;
|
|
72
|
+
readonly agents: readonly InteropInspectAgent[];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Skill and artifact counts are deliberately absent.
|
|
77
|
+
*
|
|
78
|
+
* Detection populates them only from sources the resources and context domains
|
|
79
|
+
* have already loaded, and this command loads neither. Reporting the structural
|
|
80
|
+
* zero that would result would state a fact this read did not establish.
|
|
81
|
+
*/
|
|
82
|
+
export async function interopInspectSnapshot(now: () => number = Date.now): Promise<InteropInspectSnapshot> {
|
|
83
|
+
const report = await detectInteropAgents({ cwd: process.cwd(), probeVersion: false });
|
|
84
|
+
const settings = readSettings();
|
|
85
|
+
const configured = new Set(settings.delegation.agents.map((agent) => agent.id));
|
|
86
|
+
const agents: InteropInspectAgent[] = [];
|
|
87
|
+
for (const record of report.agents) {
|
|
88
|
+
const kind = interopAgentKind(record.kind);
|
|
89
|
+
if (kind === undefined) continue;
|
|
90
|
+
const acp = kind.acp !== undefined;
|
|
91
|
+
const decision = record.decision === "accepted" || record.decision === "declined" ? record.decision : null;
|
|
92
|
+
const decisionStale = decision !== null && record.decidedFingerprint !== record.fingerprint;
|
|
93
|
+
const isConfigured = configured.has(kind.id);
|
|
94
|
+
agents.push({
|
|
95
|
+
id: kind.id,
|
|
96
|
+
label: kind.label,
|
|
97
|
+
presence: record.presence,
|
|
98
|
+
version: typeof record.version === "string" && record.version.length > 0 ? record.version : null,
|
|
99
|
+
hasUserDirectory: record.installDir !== undefined,
|
|
100
|
+
acp,
|
|
101
|
+
adapter: acp ? (record.adapter ?? "unknown") : null,
|
|
102
|
+
configured: isConfigured,
|
|
103
|
+
decision,
|
|
104
|
+
decidedAt: decision === null ? null : (record.decidedAt ?? null),
|
|
105
|
+
decisionStale,
|
|
106
|
+
// The same rule `interopProposals` applies, restated over the projected
|
|
107
|
+
// fields so the flag cannot drift from what the review would offer.
|
|
108
|
+
proposed: acp && record.presence === "present" && !isConfigured && (decision === null || decisionStale),
|
|
109
|
+
needsNetworkInstall: acp && record.adapter !== "present",
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
version: 1,
|
|
114
|
+
generatedAt: new Date(now()).toISOString(),
|
|
115
|
+
detectedAt: report.detectedAt,
|
|
116
|
+
knownKinds: INTEROP_AGENT_KINDS.length,
|
|
117
|
+
agents,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export async function runInteropInspect(args: ReadonlyArray<string>): Promise<number> {
|
|
122
|
+
if (args.length !== 1 || args[0] !== "--json") {
|
|
123
|
+
process.stderr.write("clio-coder interop inspect: usage: clio-coder interop inspect --json\n");
|
|
124
|
+
return 2;
|
|
125
|
+
}
|
|
126
|
+
process.stdout.write(`${JSON.stringify(await interopInspectSnapshot(), null, 2)}\n`);
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `clio-coder interop`, the read half of external coding agent detection.
|
|
3
|
+
*
|
|
4
|
+
* Reviewing and wiring a detected agent as a delegation peer is an interactive
|
|
5
|
+
* mutation and stays on `configure --interop`. This command family carries the
|
|
6
|
+
* read only, and its one subcommand is the fixed projection a GUI host may run.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { runInteropInspect } from "./interop-inspect.js";
|
|
10
|
+
import { printError } from "./shared.js";
|
|
11
|
+
|
|
12
|
+
const HELP = `clio-coder interop <subcommand>
|
|
13
|
+
|
|
14
|
+
Detected external coding agents and how far each one is wired.
|
|
15
|
+
|
|
16
|
+
Subcommands:
|
|
17
|
+
inspect --json emit the detected agent inventory with no native paths
|
|
18
|
+
|
|
19
|
+
Notes:
|
|
20
|
+
inspect writes nothing and runs no foreign executable. Wiring a detected agent
|
|
21
|
+
as a delegation peer is an explicit review: run \`clio-coder configure --interop\`.
|
|
22
|
+
`;
|
|
23
|
+
|
|
24
|
+
export async function runInteropCommand(args: ReadonlyArray<string>): Promise<number> {
|
|
25
|
+
const sub = args[0];
|
|
26
|
+
if (sub === undefined || sub === "--help" || sub === "-h") {
|
|
27
|
+
process.stdout.write(HELP);
|
|
28
|
+
return sub === undefined ? 2 : 0;
|
|
29
|
+
}
|
|
30
|
+
if (sub === "inspect") return await runInteropInspect(args.slice(1));
|
|
31
|
+
printError(`unknown interop command: ${sub}`);
|
|
32
|
+
process.stdout.write(HELP);
|
|
33
|
+
return 2;
|
|
34
|
+
}
|
package/src/cli/panes.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { printError } from "./shared.js";
|
|
2
|
+
import { runToolsCommand } from "./tools.js";
|
|
3
|
+
|
|
4
|
+
const HELP = `clio-coder panes install [--force] [--json]
|
|
5
|
+
|
|
6
|
+
Install the pane multiplexer Clio drives. This is an alias for
|
|
7
|
+
\`clio-coder tools install herdr\`; the toolchain command is where every pinned
|
|
8
|
+
external program is managed, and \`clio-coder tools status herdr\` explains
|
|
9
|
+
which copy Clio would run.
|
|
10
|
+
`;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The user-facing verb for the pane layer's one setup step.
|
|
14
|
+
*
|
|
15
|
+
* Panes are the feature; herdr is the program behind it. Naming the program in
|
|
16
|
+
* a command an operator types is a leak, so the alias exists and routes to the
|
|
17
|
+
* generic installer rather than the reverse.
|
|
18
|
+
*/
|
|
19
|
+
export async function runPanesCommand(argv: ReadonlyArray<string> = []): Promise<number> {
|
|
20
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
21
|
+
process.stdout.write(HELP);
|
|
22
|
+
return 0;
|
|
23
|
+
}
|
|
24
|
+
const [subcommand, ...rest] = argv;
|
|
25
|
+
if (subcommand === undefined) {
|
|
26
|
+
process.stdout.write(HELP);
|
|
27
|
+
return 2;
|
|
28
|
+
}
|
|
29
|
+
if (subcommand !== "install") {
|
|
30
|
+
printError(`unknown panes command: ${subcommand}`);
|
|
31
|
+
process.stderr.write(HELP);
|
|
32
|
+
return 2;
|
|
33
|
+
}
|
|
34
|
+
return runToolsCommand(["install", "herdr", ...rest]);
|
|
35
|
+
}
|