@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
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazy loader for the optional `@anthropic-ai/claude-agent-sdk` package.
|
|
3
|
+
*
|
|
4
|
+
* The SDK's platform package ships a 224MB proprietary binary, so it lives in
|
|
5
|
+
* `optionalDependencies` and a default install skips it under
|
|
6
|
+
* `npm install --omit=optional`. Nothing may import it at module scope: boot,
|
|
7
|
+
* `doctor`, and every non-Claude runtime have to work on an install that never
|
|
8
|
+
* fetched it. The one value the runtime needs (`query`) is reached through the
|
|
9
|
+
* dynamic import below, at the moment a `claude-sdk` run actually starts, and a
|
|
10
|
+
* missing package surfaces as a typed error naming the package and the install
|
|
11
|
+
* command instead of an ESM resolution stack.
|
|
12
|
+
*/
|
|
13
|
+
import type { query } from "@anthropic-ai/claude-agent-sdk";
|
|
14
|
+
|
|
15
|
+
/** The optional package this module resolves. */
|
|
16
|
+
export const CLAUDE_AGENT_SDK_PACKAGE = "@anthropic-ai/claude-agent-sdk";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Version the checkout pins in `optionalDependencies`. A contract test keeps
|
|
20
|
+
* the two in step so the install command quoted in the diagnostic never drifts
|
|
21
|
+
* from the version the runtime was built against.
|
|
22
|
+
*/
|
|
23
|
+
export const CLAUDE_AGENT_SDK_VERSION = "0.3.186";
|
|
24
|
+
|
|
25
|
+
/** Exact command an operator can paste to make the Claude SDK runtime usable. */
|
|
26
|
+
export const CLAUDE_AGENT_SDK_INSTALL_COMMAND = `npm install ${CLAUDE_AGENT_SDK_PACKAGE}@${CLAUDE_AGENT_SDK_VERSION}`;
|
|
27
|
+
|
|
28
|
+
/** The slice of the SDK surface the worker runtime calls. */
|
|
29
|
+
export interface ClaudeAgentSdkModule {
|
|
30
|
+
query: typeof query;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Thrown when a `claude-sdk` run starts on an install that omitted the optional package. */
|
|
34
|
+
export class ClaudeAgentSdkUnavailableError extends Error {
|
|
35
|
+
readonly code = "CLAUDE_AGENT_SDK_UNAVAILABLE";
|
|
36
|
+
readonly packageName = CLAUDE_AGENT_SDK_PACKAGE;
|
|
37
|
+
readonly installCommand = CLAUDE_AGENT_SDK_INSTALL_COMMAND;
|
|
38
|
+
|
|
39
|
+
constructor(cause?: unknown) {
|
|
40
|
+
super(
|
|
41
|
+
`The claude-sdk runtime needs the optional package ${CLAUDE_AGENT_SDK_PACKAGE}, which is not installed. ` +
|
|
42
|
+
`Install it with \`${CLAUDE_AGENT_SDK_INSTALL_COMMAND}\` (or reinstall clio-coder without \`--omit=optional\`), ` +
|
|
43
|
+
`then select the target again. Every other runtime works without it.`,
|
|
44
|
+
cause === undefined ? undefined : { cause },
|
|
45
|
+
);
|
|
46
|
+
this.name = "ClaudeAgentSdkUnavailableError";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Resolution failures that mean "the package is not on disk" rather than "the package is broken". */
|
|
51
|
+
const MISSING_MODULE_CODES: ReadonlySet<string> = new Set([
|
|
52
|
+
"ERR_MODULE_NOT_FOUND",
|
|
53
|
+
"MODULE_NOT_FOUND",
|
|
54
|
+
"ERR_PACKAGE_PATH_NOT_EXPORTED",
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
function isMissingModuleError(error: unknown): boolean {
|
|
58
|
+
const code = (error as { code?: unknown } | null)?.code;
|
|
59
|
+
return typeof code === "string" && MISSING_MODULE_CODES.has(code);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export type ClaudeAgentSdkLoader = () => Promise<ClaudeAgentSdkModule>;
|
|
63
|
+
|
|
64
|
+
// The literal specifier is what keeps the SDK's types available here; the tsup
|
|
65
|
+
// `external` entry keeps esbuild from bundling it and leaves this as a real
|
|
66
|
+
// runtime `import()`.
|
|
67
|
+
const realLoader: ClaudeAgentSdkLoader = async () => await import("@anthropic-ai/claude-agent-sdk");
|
|
68
|
+
|
|
69
|
+
let loader: ClaudeAgentSdkLoader = realLoader;
|
|
70
|
+
let cached: ClaudeAgentSdkModule | null = null;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Swap the import used by {@link loadClaudeAgentSdk}. The absence of a 224MB
|
|
74
|
+
* optional package cannot be staged inside a normal test process, so the
|
|
75
|
+
* contract test intercepts the import here; passing `null` restores the real
|
|
76
|
+
* one and clears the cache.
|
|
77
|
+
*/
|
|
78
|
+
export function setClaudeAgentSdkLoader(next: ClaudeAgentSdkLoader | null): void {
|
|
79
|
+
loader = next ?? realLoader;
|
|
80
|
+
cached = null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Resolve the SDK, or fail with {@link ClaudeAgentSdkUnavailableError}. A load
|
|
85
|
+
* error that is not a resolution failure (a broken install, a throwing module
|
|
86
|
+
* top level) propagates unchanged, so a real fault is never mislabeled as an
|
|
87
|
+
* absent package.
|
|
88
|
+
*/
|
|
89
|
+
export async function loadClaudeAgentSdk(): Promise<ClaudeAgentSdkModule> {
|
|
90
|
+
if (cached) return cached;
|
|
91
|
+
try {
|
|
92
|
+
cached = await loader();
|
|
93
|
+
return cached;
|
|
94
|
+
} catch (error) {
|
|
95
|
+
if (isMissingModuleError(error)) throw new ClaudeAgentSdkUnavailableError(error);
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
// Types only. `@anthropic-ai/claude-agent-sdk` is an optional dependency, so
|
|
2
|
+
// nothing here may reach it at module scope; the one value this runtime calls
|
|
3
|
+
// (`query`) comes from the lazy loader in ./sdk-module.js at run time.
|
|
4
|
+
import type {
|
|
5
|
+
CanUseTool,
|
|
6
|
+
EffortLevel,
|
|
7
|
+
HookCallback,
|
|
8
|
+
Options,
|
|
9
|
+
PermissionMode,
|
|
10
|
+
PermissionResult,
|
|
8
11
|
query,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
SDKMessage,
|
|
13
|
+
SDKResultMessage,
|
|
14
|
+
SDKUserMessage,
|
|
15
|
+
ThinkingConfig,
|
|
13
16
|
} from "@anthropic-ai/claude-agent-sdk";
|
|
14
17
|
|
|
15
18
|
import { readClioVersion } from "../../core/package-root.js";
|
|
@@ -19,6 +22,7 @@ import { isReserveAdmittedTool, resolveDeliveryTools } from "../loop-guard.js";
|
|
|
19
22
|
import type { AgentEvent, AgentMessage, Usage } from "../types.js";
|
|
20
23
|
import type { WorkerEventEmit, WorkerRunHandle, WorkerRunInput, WorkerRunResult } from "../worker-runtime.js";
|
|
21
24
|
import { createWorkerSafety } from "../worker-tools.js";
|
|
25
|
+
import { loadClaudeAgentSdk } from "./sdk-module.js";
|
|
22
26
|
import { isClaudeCodeSessionId } from "./session-id.js";
|
|
23
27
|
import {
|
|
24
28
|
type ClaudeToolPermissionDecision,
|
|
@@ -607,6 +611,10 @@ export function startClaudeSdkWorkerRun(input: WorkerRunInput, emit: WorkerEvent
|
|
|
607
611
|
|
|
608
612
|
emit({ type: "agent_start" } as AgentEvent);
|
|
609
613
|
try {
|
|
614
|
+
// First touch of the optional SDK. An install that omitted it fails
|
|
615
|
+
// here with a typed diagnostic naming the package and the install
|
|
616
|
+
// command, and lands in the catch below as an ordinary run failure.
|
|
617
|
+
const { query } = await loadClaudeAgentSdk();
|
|
610
618
|
queryHandle = query({ prompt: buildClaudeSdkPrompt(input), options });
|
|
611
619
|
for await (const sdkMessage of queryHandle) {
|
|
612
620
|
if (sdkMessage.type === "system" && (sdkMessage as { subtype?: string }).subtype === "init") {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The terminal-engine primitives a non-interactive surface needs, kept in a
|
|
3
|
+
* module of its own rather than behind ./tui.js.
|
|
4
|
+
*
|
|
5
|
+
* ./tui.js is the interactive layer's barrel: it carries the instrumented
|
|
6
|
+
* renderer and SelectList, and every consumer of it also pulls the interactive
|
|
7
|
+
* theme. A CLI command that only measures text and paints an alternate screen
|
|
8
|
+
* needs none of that, and reaching it through the barrel is not free. An edge
|
|
9
|
+
* from outside src/interactive/ to ./tui.js, static or dynamic, gives that
|
|
10
|
+
* module a reachability set the theme modules do not share, so the bundler
|
|
11
|
+
* peels it into a chunk of its own. That chunk lands in the Stage 0 instant
|
|
12
|
+
* shell closure, which tests/contracts/instant-shell-import-graph.test.ts holds
|
|
13
|
+
* to six chunks. Everything re-exported here is a pass-through to the external
|
|
14
|
+
* terminal engine, which is not bundled and so adds no chunk at all.
|
|
15
|
+
*
|
|
16
|
+
* The engine-boundary rule (rule1 in tests/boundaries/check-boundaries.ts) keeps
|
|
17
|
+
* terminal-engine value imports inside src/engine/, which is why this seam lives
|
|
18
|
+
* here and not in src/cli/.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export { ProcessTerminal, TuiAltScreen, truncateToWidth } from "@earendil-works/pi-tui";
|
package/src/engine/tui.ts
CHANGED
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
* own worker runners before pi-agent model synthesis.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
13
12
|
import path from "node:path";
|
|
14
13
|
import { validateSettingsFile } from "../core/config.js";
|
|
15
14
|
import {
|
|
@@ -29,6 +28,7 @@ import {
|
|
|
29
28
|
resultContractRepairMessages,
|
|
30
29
|
validateResultContract,
|
|
31
30
|
} from "../domains/agents/result-contract.js";
|
|
31
|
+
import { nodeResultContractFilesystem } from "../domains/agents/result-contract-filesystem.js";
|
|
32
32
|
import type { AgentProduct } from "../domains/agents/spec.js";
|
|
33
33
|
import type { MiddlewareSnapshot } from "../domains/middleware/index.js";
|
|
34
34
|
import { createMiddlewareToolChoiceControl } from "../domains/middleware/index.js";
|
|
@@ -258,18 +258,7 @@ function terminalContractViolation(
|
|
|
258
258
|
// Repair rounds judge shape and grounding only. Network posture belongs to
|
|
259
259
|
// the orchestrator's sealed validation, which runs again on the receipt.
|
|
260
260
|
networkAllowed: true,
|
|
261
|
-
filesystem:
|
|
262
|
-
readFile(filePath) {
|
|
263
|
-
try {
|
|
264
|
-
return readFileSync(filePath, "utf8");
|
|
265
|
-
} catch {
|
|
266
|
-
return null;
|
|
267
|
-
}
|
|
268
|
-
},
|
|
269
|
-
pathExists(filePath) {
|
|
270
|
-
return existsSync(filePath);
|
|
271
|
-
},
|
|
272
|
-
},
|
|
261
|
+
filesystem: nodeResultContractFilesystem(),
|
|
273
262
|
});
|
|
274
263
|
return validation.conformance === "pass" ? null : (validation.reason ?? "invalid result");
|
|
275
264
|
}
|
|
@@ -26,6 +26,8 @@ export interface BootOptions {
|
|
|
26
26
|
terminalLease?: TerminalLease;
|
|
27
27
|
/** Strict effective settings snapshot shared by preflight, Stage 0, and hydration. */
|
|
28
28
|
startupSettings?: Readonly<ClioSettings>;
|
|
29
|
+
/** `--with-panes` / `--no-panes`. The flag beats `panes.enabled` in both directions. */
|
|
30
|
+
panes?: "with" | "without";
|
|
29
31
|
headless?: {
|
|
30
32
|
prompt: string;
|
|
31
33
|
images?: ReadonlyArray<ImageContent>;
|
|
@@ -49,6 +49,7 @@ import { createDispatchDedupRegistration } from "../domains/dispatch/dedup.js";
|
|
|
49
49
|
import { agentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
|
|
50
50
|
import { readGateDecisionArtifacts, readPendingGateDecisions } from "../domains/dispatch/gate-decisions.js";
|
|
51
51
|
import { createDispatchDomainModule } from "../domains/dispatch/index.js";
|
|
52
|
+
import { configureRunEventJournal } from "../domains/dispatch/run-event-journal.js";
|
|
52
53
|
import { type ExtensionsContract, ExtensionsDomainModule } from "../domains/extensions/index.js";
|
|
53
54
|
import { type InteropContract, InteropDomainModule } from "../domains/interop/index.js";
|
|
54
55
|
import {
|
|
@@ -97,6 +98,7 @@ import { announceMemoryStepEndpoint } from "../domains/middleware/memory-step-en
|
|
|
97
98
|
import { createTaskBoardReminderRegistration } from "../domains/middleware/task-board-reminder.js";
|
|
98
99
|
import { createTaskNudgeRegistration } from "../domains/middleware/task-nudge.js";
|
|
99
100
|
import { createWatchdogRegistration } from "../domains/middleware/watchdog.js";
|
|
101
|
+
import type { MuxContract } from "../domains/mux/index.js";
|
|
100
102
|
import type { ObservabilityContract } from "../domains/observability/index.js";
|
|
101
103
|
import { ObservabilityDomainModule, recordBackgroundMemoryStep } from "../domains/observability/index.js";
|
|
102
104
|
import type { PromptsContract } from "../domains/prompts/contract.js";
|
|
@@ -120,6 +122,7 @@ import {
|
|
|
120
122
|
targetRequiresAuth,
|
|
121
123
|
VALID_THINKING_LEVELS,
|
|
122
124
|
} from "../domains/providers/index.js";
|
|
125
|
+
import { memoryInterventionModelMaxTokens } from "../domains/providers/model-runtime-capabilities.js";
|
|
123
126
|
import { getRuntimeRegistry } from "../domains/providers/registry.js";
|
|
124
127
|
import { registerBuiltinRuntimes } from "../domains/providers/runtimes/builtins.js";
|
|
125
128
|
import {
|
|
@@ -159,6 +162,7 @@ import {
|
|
|
159
162
|
import { createTaskBoardStore } from "../domains/session/task-board.js";
|
|
160
163
|
import { filterEntriesToActivePath } from "../domains/session/tree/active-path.js";
|
|
161
164
|
import { type ShareContract, ShareDomainModule } from "../domains/share/index.js";
|
|
165
|
+
import { ToolchainDomainModule } from "../domains/toolchain/index.js";
|
|
162
166
|
import { createUserTasksStore } from "../domains/user-tasks/store.js";
|
|
163
167
|
import { type AcpSafeSettingsPatch, type AcpSafeSettingsSnapshot, serveClioAcpAgent } from "../engine/acp/server.js";
|
|
164
168
|
import { createStdioServerTransport } from "../engine/acp/transport.js";
|
|
@@ -175,6 +179,7 @@ import { createChatLoop } from "../interactive/chat-loop.js";
|
|
|
175
179
|
import { type RunIo, startInteractive } from "../interactive/index.js";
|
|
176
180
|
import { buildModelReplayAgentMessagesFromTurns } from "../interactive/model-session-replay.js";
|
|
177
181
|
import type { BootOptions } from "./boot-options.js";
|
|
182
|
+
import { resolvePanesEnablement } from "./panes-activation.js";
|
|
178
183
|
|
|
179
184
|
export type { BootOptions, HeadlessSamplingOverrides } from "./boot-options.js";
|
|
180
185
|
|
|
@@ -333,6 +338,7 @@ interface BackgroundMemoryRoute {
|
|
|
333
338
|
targetId: string;
|
|
334
339
|
wireModelId: string;
|
|
335
340
|
endpointKey: string | null;
|
|
341
|
+
modelMaxTokens(configuredMaxTokens: number): number;
|
|
336
342
|
}
|
|
337
343
|
|
|
338
344
|
function createBackgroundMemoryModelClient(
|
|
@@ -375,6 +381,12 @@ function createBackgroundMemoryModelClient(
|
|
|
375
381
|
targetId,
|
|
376
382
|
wireModelId: refined.wireModelId,
|
|
377
383
|
endpointKey,
|
|
384
|
+
modelMaxTokens: (configuredMaxTokens) =>
|
|
385
|
+
memoryInterventionModelMaxTokens({
|
|
386
|
+
configuredMaxTokens,
|
|
387
|
+
thinkingMechanism: refined.modelRuntime.thinking.mechanism,
|
|
388
|
+
modelMaxTokens: refined.capabilityDecisions.maxTokens,
|
|
389
|
+
}),
|
|
378
390
|
client: {
|
|
379
391
|
// Wrapped at the layer that knows a request left the process: the step
|
|
380
392
|
// holds endpoint capacity while it is out and publishes the cache
|
|
@@ -844,6 +856,19 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
844
856
|
let effectiveSettingsForDispatch: (() => Readonly<ClioSettings>) | null = null;
|
|
845
857
|
let protectedArtifactStateForDispatch: (() => ProtectedArtifactState) | null = null;
|
|
846
858
|
|
|
859
|
+
// Panes are an interactive-surface projection. Headless, ACP, and worker boots
|
|
860
|
+
// gate detection off so they never resolve a socket path or open a descriptor.
|
|
861
|
+
// This mirrors the `interactive` predicate computed after the domains load.
|
|
862
|
+
const muxInteractive = !options.headless && options.acp === undefined && process.env.CLIO_CODER_INTERACTIVE === "1";
|
|
863
|
+
// The rung is settled before the config contract loads, off the settings the
|
|
864
|
+
// interactive entry point already read strictly (`src/cli/clio.ts:31`) and
|
|
865
|
+
// the `--with-panes` / `--no-panes` flag, which wins in both directions. This
|
|
866
|
+
// is why `panes.enabled` is a restart-scoped row: the decision runs once,
|
|
867
|
+
// here. An inactive rung loads nothing: the whole extension, mux domain
|
|
868
|
+
// included, lives behind the dynamic import below.
|
|
869
|
+
const muxEnablement = resolvePanesEnablement(options.panes, options.startupSettings?.panes.enabled);
|
|
870
|
+
const withPanes = muxInteractive && muxEnablement !== "off" ? await import("./with-panes.js") : null;
|
|
871
|
+
|
|
847
872
|
const result = await loadDomains(
|
|
848
873
|
[
|
|
849
874
|
options.startupSettings ? createConfigDomainModule(options.startupSettings) : ConfigDomainModule,
|
|
@@ -863,6 +888,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
863
888
|
ShareDomainModule,
|
|
864
889
|
createContextDomainModule({ noContextFiles: options.noContextFiles === true }),
|
|
865
890
|
ProvidersDomainModule,
|
|
891
|
+
ToolchainDomainModule,
|
|
866
892
|
SafetyDomainModule,
|
|
867
893
|
createPromptsDomainModule({
|
|
868
894
|
noContextFiles: options.noContextFiles === true,
|
|
@@ -872,6 +898,16 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
872
898
|
SessionDomainModule,
|
|
873
899
|
ObservabilityDomainModule,
|
|
874
900
|
SchedulingDomainModule,
|
|
901
|
+
...(withPanes
|
|
902
|
+
? [
|
|
903
|
+
withPanes.createMuxDomainModule({
|
|
904
|
+
enabled: muxEnablement,
|
|
905
|
+
log: (level, message) => {
|
|
906
|
+
if (level === "warning") bootStderr(`[mux] ${message}\n`);
|
|
907
|
+
},
|
|
908
|
+
}),
|
|
909
|
+
]
|
|
910
|
+
: []),
|
|
875
911
|
// Dispatch resolves worker targets through the session's effective
|
|
876
912
|
// settings view once it exists (assigned below, after the config
|
|
877
913
|
// contract loads); until then it falls back to the shared snapshot.
|
|
@@ -879,6 +915,11 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
879
915
|
getSettings: () => effectiveSettingsForDispatch?.(),
|
|
880
916
|
getProtectedArtifactState: () => protectedArtifactStateForDispatch?.() ?? { artifacts: [] },
|
|
881
917
|
autonomyOverride: options.headless?.autonomy !== undefined,
|
|
918
|
+
// The domain owns the durable journal here, not the dispatch
|
|
919
|
+
// tool's event registry: `/run`, a watchdog run, and a model
|
|
920
|
+
// dispatch all have to leave the same transcript behind, and only
|
|
921
|
+
// the last of the three ever reaches that registry.
|
|
922
|
+
journalRunEvents: true,
|
|
882
923
|
}),
|
|
883
924
|
LifecycleDomainModule,
|
|
884
925
|
],
|
|
@@ -941,6 +982,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
941
982
|
const resources = result.getContract<ResourcesContract>("resources");
|
|
942
983
|
const extensions = result.getContract<ExtensionsContract>("extensions");
|
|
943
984
|
const share = result.getContract<ShareContract>("share");
|
|
985
|
+
const mux = result.getContract<MuxContract>("mux");
|
|
944
986
|
const contextDomain = result.getContract<ContextContract>("context");
|
|
945
987
|
const interop = result.getContract<InteropContract>("interop");
|
|
946
988
|
// Boot detection resolves paths only: no `--version` subprocess and no skill
|
|
@@ -1041,7 +1083,13 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1041
1083
|
// Guardrail policy (tool-call budgets, tool byte caps, dispatch ledger cap)
|
|
1042
1084
|
// resolves settings-first with env as emergency override; install the
|
|
1043
1085
|
// settings section before any guard registration or tool reads it.
|
|
1044
|
-
|
|
1086
|
+
const resolvedSettings = config?.get() ?? readSettings();
|
|
1087
|
+
configureGuardrails(resolvedSettings.guardrails);
|
|
1088
|
+
|
|
1089
|
+
// The run event journal resolves the same way for the same reason: the sink
|
|
1090
|
+
// sits on the dispatch event path, where reading settings.yaml would be both
|
|
1091
|
+
// a cost and a throw site, so the composition root installs the value once.
|
|
1092
|
+
configureRunEventJournal(resolvedSettings.panes.journal);
|
|
1045
1093
|
|
|
1046
1094
|
// Guard registrations on the middleware contract, in order: loop guard,
|
|
1047
1095
|
// protected artifacts (last among guards so it absorbs protect_path effects
|
|
@@ -1214,6 +1262,8 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1214
1262
|
: createBackgroundMemoryModelClient(providers, settings, settings.memory.intervention.timeoutMs, bus);
|
|
1215
1263
|
return backgroundMemoryRoute?.client ?? null;
|
|
1216
1264
|
},
|
|
1265
|
+
getModelMaxTokens: (configuredMaxTokens) =>
|
|
1266
|
+
backgroundMemoryRoute?.modelMaxTokens(configuredMaxTokens) ?? configuredMaxTokens,
|
|
1217
1267
|
// A single-slot local server serves one request at a time, so a memory step
|
|
1218
1268
|
// started while the operator's turn is streaming either waits behind it or
|
|
1219
1269
|
// makes the server swap the resident model out to answer. The chat loop
|
|
@@ -1374,6 +1424,19 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1374
1424
|
// Operator-initiated backgrounding is a TUI affordance: the registry is the
|
|
1375
1425
|
// one object the dispatch tool and the keypress both hold.
|
|
1376
1426
|
const dispatchBackground = createDispatchBackgroundRegistry();
|
|
1427
|
+
// One `PanesOperations` instance drives both the `panes` tool and the
|
|
1428
|
+
// `/panes` slash command, so the model and the operator cannot be told
|
|
1429
|
+
// different things about the same pane. It also owns the no-mux Yazi chooser,
|
|
1430
|
+
// while model tool registration below remains gated on a live pane host.
|
|
1431
|
+
const panes =
|
|
1432
|
+
withPanes && mux
|
|
1433
|
+
? withPanes.createPanesRuntime({
|
|
1434
|
+
mux,
|
|
1435
|
+
getSettings: () => getCurrentSettings(),
|
|
1436
|
+
getDispatchSnapshot: () => dispatch.snapshot(),
|
|
1437
|
+
getCwd: () => process.cwd(),
|
|
1438
|
+
})
|
|
1439
|
+
: null;
|
|
1377
1440
|
registerAllTools(toolRegistry, {
|
|
1378
1441
|
...(session
|
|
1379
1442
|
? {
|
|
@@ -1397,6 +1460,11 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1397
1460
|
// provenance and compete winner handling agree with the approval surface.
|
|
1398
1461
|
getAutonomy: resolveEffectiveAutonomy,
|
|
1399
1462
|
...(interactive ? { dispatchBackground } : {}),
|
|
1463
|
+
...(mux ? { competeMuxWorktrees: mux } : {}),
|
|
1464
|
+
// Registered only when a pane host answered detection, so the tool is
|
|
1465
|
+
// absent from the prompt on a machine with none rather than present and
|
|
1466
|
+
// always refusing.
|
|
1467
|
+
...(panes && mux?.mode !== "none" ? { panes } : {}),
|
|
1400
1468
|
getCostCeilingUsd: () => result.getContract<SchedulingContract>("scheduling")?.ceilingUsd() ?? 0,
|
|
1401
1469
|
...(config ? { getWorkerRosters: () => config.get().workers.rosters } : {}),
|
|
1402
1470
|
getSkillLoaderOptions: () => ({
|
|
@@ -1542,6 +1610,20 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1542
1610
|
mutateSaved?.(saved);
|
|
1543
1611
|
});
|
|
1544
1612
|
};
|
|
1613
|
+
/**
|
|
1614
|
+
* A routing change at the scope the operator chose. "session" moves the live
|
|
1615
|
+
* route and leaves settings.yaml alone, so a swap that points at a dead
|
|
1616
|
+
* endpoint dies with the session that made it; "global" is the historical
|
|
1617
|
+
* write-through. Nothing on this path writes durably without a scope.
|
|
1618
|
+
*/
|
|
1619
|
+
const applyRoutingAtScope = (patch: RoutingPatch, scope: "session" | "global"): void => {
|
|
1620
|
+
if (scope === "global") {
|
|
1621
|
+
updateSessionRouting(patch);
|
|
1622
|
+
return;
|
|
1623
|
+
}
|
|
1624
|
+
applyRoutingPatch(sessionRouting, patch);
|
|
1625
|
+
bumpSessionState();
|
|
1626
|
+
};
|
|
1545
1627
|
const readAcpSafeSettings = (): AcpSafeSettingsSnapshot => {
|
|
1546
1628
|
const settings = getCurrentSettings();
|
|
1547
1629
|
return {
|
|
@@ -2014,6 +2096,20 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
2014
2096
|
...(extensions ? { extensions } : {}),
|
|
2015
2097
|
...(interop ? { interop } : {}),
|
|
2016
2098
|
...(share ? { share } : {}),
|
|
2099
|
+
...(mux ? { mux } : {}),
|
|
2100
|
+
...(panes ? { panes } : {}),
|
|
2101
|
+
...(panes ? { attachYaziBridge: (bridge) => panes.attachYazi(bridge) } : {}),
|
|
2102
|
+
// The interactive surface never imports the panes glue itself; the
|
|
2103
|
+
// factories arrive only on an active boot, through the same dynamic
|
|
2104
|
+
// import that loaded the mux domain.
|
|
2105
|
+
...(withPanes
|
|
2106
|
+
? {
|
|
2107
|
+
createMuxBridge: withPanes.createMuxBridge,
|
|
2108
|
+
createYaziBridge: withPanes.createYaziBridge,
|
|
2109
|
+
createWatchPane: withPanes.createWatchPaneController,
|
|
2110
|
+
}
|
|
2111
|
+
: {}),
|
|
2112
|
+
...(panes ? { attachWatchPane: (controller) => panes.attachWatch(controller) } : {}),
|
|
2017
2113
|
toolRegistry,
|
|
2018
2114
|
...(session ? { session } : {}),
|
|
2019
2115
|
...(session ? { readSessionEntries: readCurrentSessionEntries } : {}),
|
|
@@ -2126,7 +2222,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
2126
2222
|
},
|
|
2127
2223
|
}
|
|
2128
2224
|
: {}),
|
|
2129
|
-
onSetThinkingLevel: (level) => {
|
|
2225
|
+
onSetThinkingLevel: (level, scope) => {
|
|
2130
2226
|
const current = getCurrentSettings();
|
|
2131
2227
|
const nextLevel =
|
|
2132
2228
|
resolveModelRuntimeCapabilitiesForProviders(
|
|
@@ -2135,7 +2231,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
2135
2231
|
current.orchestrator.model,
|
|
2136
2232
|
level,
|
|
2137
2233
|
)?.thinking.effectiveLevel ?? "off";
|
|
2138
|
-
|
|
2234
|
+
applyRoutingAtScope({ orchestrator: { thinkingLevel: nextLevel } }, scope ?? "global");
|
|
2139
2235
|
},
|
|
2140
2236
|
onCycleThinking: () => {
|
|
2141
2237
|
const current = getCurrentSettings();
|
|
@@ -2152,7 +2248,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
2152
2248
|
);
|
|
2153
2249
|
updateSessionRouting({ orchestrator: { thinkingLevel: nextLevel } });
|
|
2154
2250
|
},
|
|
2155
|
-
onSelectModel: ({ target, model }) => {
|
|
2251
|
+
onSelectModel: ({ target, model }, scope) => {
|
|
2156
2252
|
const registry = getRuntimeRegistry();
|
|
2157
2253
|
const settings = getCurrentSettings();
|
|
2158
2254
|
const descriptor = settings.targets.find((e) => e.id === target);
|
|
@@ -2169,7 +2265,9 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
2169
2265
|
);
|
|
2170
2266
|
}
|
|
2171
2267
|
}
|
|
2172
|
-
|
|
2268
|
+
applyRoutingAtScope({ orchestrator: { target, model } }, scope);
|
|
2269
|
+
// Recents live in the state dir, not settings.yaml, and are how a swap
|
|
2270
|
+
// stays reachable in the picker. A session-scoped swap still earns one.
|
|
2173
2271
|
rememberRecentModel(`${target}/${model}`, getCurrentSettings().modelSelector.recentLimit);
|
|
2174
2272
|
},
|
|
2175
2273
|
writeSettings: (next) => applySettingsBlob(next),
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether this boot activates the panes extension.
|
|
3
|
+
*
|
|
4
|
+
* The decision is made here, before any panes module loads, because the whole
|
|
5
|
+
* point of the activation model is that a plain boot never pays for the
|
|
6
|
+
* extension: no socket probe, no guest-mode detection, and none of the mux
|
|
7
|
+
* domain's code in the import closure. The orchestrator dynamically imports
|
|
8
|
+
* `src/entry/with-panes.ts` only when this resolves to an active rung, and a
|
|
9
|
+
* built-graph contract test (tests/contracts/instant-shell-import-graph.test.ts)
|
|
10
|
+
* pins that the default boot chunk carries no mux domain code.
|
|
11
|
+
*
|
|
12
|
+
* Precedence: the command-line flag wins in both directions, then the
|
|
13
|
+
* `panes.enabled` setting, then the shipped default of `off`.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** Mirrors `MuxEnablement` in src/domains/mux/detect.ts without importing it. */
|
|
17
|
+
export type PanesEnablement = "auto" | "embedded" | "off";
|
|
18
|
+
|
|
19
|
+
export function resolvePanesEnablement(
|
|
20
|
+
flag: "with" | "without" | undefined,
|
|
21
|
+
setting: PanesEnablement | undefined,
|
|
22
|
+
): PanesEnablement {
|
|
23
|
+
if (flag === "without") return "off";
|
|
24
|
+
if (flag === "with") {
|
|
25
|
+
// `--with-panes` on a settings file that names `embedded` honors the
|
|
26
|
+
// stronger setting; on `off` or absent settings it activates guest
|
|
27
|
+
// detection, which is the flag's promise.
|
|
28
|
+
return setting === "embedded" ? "embedded" : "auto";
|
|
29
|
+
}
|
|
30
|
+
return setting ?? "off";
|
|
31
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The panes extension's composition surface.
|
|
3
|
+
*
|
|
4
|
+
* This is the one module that statically imports panes-only code: the mux
|
|
5
|
+
* domain (socket client, contract, yazi session machinery) and the interactive
|
|
6
|
+
* glue built on it. The orchestrator imports it dynamically, and only when
|
|
7
|
+
* `resolvePanesEnablement` (src/entry/panes-activation.ts) says the extension
|
|
8
|
+
* is active, so a plain `clio-coder` boot never loads any of it. The built
|
|
9
|
+
* import graph is pinned by tests/contracts/instant-shell-import-graph.test.ts:
|
|
10
|
+
* the default boot chunk must carry no mux domain code.
|
|
11
|
+
*
|
|
12
|
+
* Everything re-exported here is a value the orchestrator wires; types cross
|
|
13
|
+
* the seam as type-only imports at the call sites and cost nothing.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
export { createMuxDomainModule } from "../domains/mux/index.js";
|
|
17
|
+
export { createMuxBridge } from "../interactive/mux-bridge.js";
|
|
18
|
+
export { createPanesRuntime } from "../interactive/panes-runtime.js";
|
|
19
|
+
export { createWatchPaneController } from "../interactive/watch-pane.js";
|
|
20
|
+
export { createYaziBridge } from "../interactive/yazi-bridge.js";
|
|
@@ -374,6 +374,8 @@ export function openCostOverlay(
|
|
|
374
374
|
const handle = showClioOverlayFrame(tui, body, {
|
|
375
375
|
anchor: "center",
|
|
376
376
|
width: COST_OVERLAY_WIDTH,
|
|
377
|
+
// Not derived from the title: that one carries the session id.
|
|
378
|
+
markerId: "cost",
|
|
377
379
|
title: sessionId && sessionId.length > 0 ? `Session usage (${sessionId})` : "Session usage",
|
|
378
380
|
footerHint: buildHint([]),
|
|
379
381
|
});
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
import { truncateToWidth, wrapTextWithAnsi } from "../engine/tui.js";
|
|
17
|
+
import { COUNCIL_SYNTHESIS_LABEL } from "./council.js";
|
|
17
18
|
import {
|
|
18
19
|
type ClioTheme,
|
|
19
20
|
type ClioToken,
|
|
@@ -38,9 +39,6 @@ export const COUNCIL_COLUMN_GUTTER = 2;
|
|
|
38
39
|
/** Rows of a member's bounded answer tail a column shows before it defers to `/view`. */
|
|
39
40
|
export const COUNCIL_ANSWER_ROWS = 4;
|
|
40
41
|
|
|
41
|
-
/** The label the coordinator gives the synthesis run of every council group. */
|
|
42
|
-
export const COUNCIL_SYNTHESIS_LABEL = "synthesis";
|
|
43
|
-
|
|
44
42
|
/** One council run as the board draws it: the roster facts plus the run's presentation. */
|
|
45
43
|
export interface CouncilMemberView {
|
|
46
44
|
runId: string;
|
|
@@ -26,6 +26,17 @@ export type CouncilSynthesisMode = (typeof COUNCIL_SYNTHESIS_MODES)[number];
|
|
|
26
26
|
/** Rounds the dispatch tool admits. The command enforces the same bound where the operator typed it. */
|
|
27
27
|
export const COUNCIL_MAX_ROUNDS = 3;
|
|
28
28
|
|
|
29
|
+
/**
|
|
30
|
+
* The label the coordinator gives the synthesis run of every council group.
|
|
31
|
+
*
|
|
32
|
+
* It lives here rather than beside the board layout that draws it because it is
|
|
33
|
+
* council vocabulary, not presentation: the share path compares against it to
|
|
34
|
+
* decide whether a run seals the whole council or one voice, and that path must
|
|
35
|
+
* stay off the render module graph. See the header of
|
|
36
|
+
* `src/interactive/slash-commands.ts` for the closure budget that depends on it.
|
|
37
|
+
*/
|
|
38
|
+
export const COUNCIL_SYNTHESIS_LABEL = "synthesis";
|
|
39
|
+
|
|
29
40
|
export function isCouncilSynthesisMode(value: string): value is CouncilSynthesisMode {
|
|
30
41
|
return COUNCIL_SYNTHESIS_MODES.some((mode) => mode === value);
|
|
31
42
|
}
|