@iowarp/clio-coder 0.3.8 → 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 +102 -0
- package/NOTICE +33 -0
- package/README.md +12 -3
- package/dist/{acp-U67UHUK2.js → acp-G5WJBNCT.js} +13 -12
- package/dist/{agents-YU6SGALZ.js → agents-FMV2Q5G4.js} +41 -36
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-5ZPJOIVG.js → auth-3IDSJEIK.js} +18 -18
- package/dist/{builtins-C6JMZVV6.js → builtins-XCZWXSC7.js} +5 -5
- package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
- package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
- package/dist/{chunk-XWSF374K.js → chunk-2OQE55CK.js} +3 -3
- package/dist/{chunk-5H3GB5BO.js → chunk-32KWKNSF.js} +8 -384
- package/dist/{chunk-KTYTFRMB.js → chunk-36EJLSQQ.js} +34 -36
- package/dist/{chunk-FHJEP5SW.js → chunk-3BT2XMV4.js} +19 -13
- package/dist/chunk-3DPEIQKN.js +113 -0
- package/dist/{chunk-GU2UIAFZ.js → chunk-3URVFKWK.js} +7 -7
- package/dist/{chunk-WEH5XRJQ.js → chunk-3XML7CDN.js} +3 -3
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
- package/dist/{chunk-VCBR6CU7.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-NMPKI6XL.js → chunk-6DB53AJS.js} +203 -25
- package/dist/{chunk-3BINW3FP.js → chunk-76ONBSIA.js} +2 -2
- package/dist/{chunk-26LEYJZH.js → chunk-7MCTRUCE.js} +2 -2
- package/dist/{chunk-TYPGUK6W.js → chunk-AB44T6BB.js} +111 -5
- package/dist/{chunk-K4XHGFR5.js → chunk-B7OBL7PK.js} +317 -721
- package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
- package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
- package/dist/{chunk-ZVJ5BLO2.js → chunk-BKFJHQCA.js} +154 -16
- package/dist/chunk-BKFM6EJV.js +462 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-ZNLWCMVZ.js → chunk-BPKCPIL7.js} +2 -2
- package/dist/{chunk-TLQJPP24.js → chunk-BUMFYQFY.js} +1394 -1349
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/chunk-C2LTL2W6.js +2447 -0
- package/dist/{chunk-ME6CCNFO.js → chunk-CODPRO7Q.js} +8 -8
- package/dist/{chunk-E77JEWSD.js → chunk-CTJ4RNAA.js} +7 -37
- package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
- package/dist/{chunk-7RFXX52T.js → chunk-DQITNCXG.js} +642 -172
- package/dist/{chunk-TTHACPOM.js → chunk-DYJP44XW.js} +578 -117
- package/dist/{chunk-2HFZQUHL.js → chunk-F4CKPOEQ.js} +18 -8
- package/dist/{chunk-DGSYXYMX.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GKF55TAZ.js +391 -0
- package/dist/{chunk-VWZOAB7K.js → chunk-GR5G2PVF.js} +9 -8
- package/dist/{chunk-4DGYLA73.js → chunk-GXNLGKAB.js} +80 -9
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/{chunk-IIZWH4XA.js → chunk-HI63TFOG.js} +5 -4
- package/dist/{chunk-WLFILSD5.js → chunk-HJJTYUHX.js} +113 -83
- package/dist/{chunk-TT36MB5S.js → chunk-HLW2MRKE.js} +3 -1
- package/dist/{chunk-PMDBGQSJ.js → chunk-HWHKMHUA.js} +7 -7
- package/dist/chunk-HZHHCK24.js +1631 -0
- package/dist/{chunk-WSB3FPX7.js → chunk-I5VEOC6I.js} +39 -143
- package/dist/chunk-IBEBSCYA.js +564 -0
- package/dist/chunk-IQ7KR472.js +362 -0
- package/dist/{chunk-A3WNZD3P.js → chunk-J4W7KFM7.js} +949 -972
- package/dist/{chunk-TB5666IT.js → chunk-JDG2WCRO.js} +5 -5
- package/dist/{chunk-N22QMJKY.js → chunk-K5C3NCBD.js} +4 -4
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-5C3AQNDW.js → chunk-KFZI4NIL.js} +216 -38
- package/dist/chunk-KMVISBZR.js +132 -0
- package/dist/{chunk-WXY7KU3G.js → chunk-LDQ2ZF2M.js} +2 -2
- package/dist/{chunk-XN3L4EYL.js → chunk-LQ3DZAMX.js} +3 -3
- package/dist/{chunk-U6MBIEMB.js → chunk-LY4S7GJC.js} +173 -144
- package/dist/{chunk-4SPRNWDE.js → chunk-MLKNTWH2.js} +19 -19
- package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-SPULKLCF.js → chunk-NHCZP4K7.js} +3 -3
- package/dist/chunk-NHLBIGRH.js +1506 -0
- package/dist/chunk-NQQH3YT7.js +302 -0
- package/dist/chunk-NYS75XW5.js +15 -0
- package/dist/{chunk-GN57SG4G.js → chunk-O4XIVISU.js} +10 -8
- package/dist/{chunk-EMYUUSFG.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-J3YUBZWY.js → chunk-QBJA7R7N.js} +62 -6
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-2HEJ2F35.js → chunk-QLFS5GO2.js} +22 -10
- package/dist/{chunk-7RGZWPB6.js → chunk-QLL7ILRG.js} +95 -32
- package/dist/{chunk-YS5VLNH5.js → chunk-QREDIESB.js} +6 -6
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
- package/dist/chunk-RKKLTLYB.js +45 -0
- package/dist/{chunk-P43ETTHK.js → chunk-SJ5ZKQ4S.js} +2 -2
- package/dist/{chunk-GPIEI3LY.js → chunk-SP2RXXYO.js} +6 -54
- package/dist/chunk-SUCTJL45.js +45 -0
- package/dist/{chunk-DYIM5TJT.js → chunk-SUW5DORT.js} +263 -7
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/{chunk-FJ3H4MN5.js → chunk-TZ3SGWZZ.js} +3 -3
- package/dist/{chunk-MXKJU4JB.js → chunk-U77AMWDL.js} +91 -10
- package/dist/{chunk-5DHKRSMQ.js → chunk-ULC6OTWO.js} +11 -7
- package/dist/{chunk-RWSI4YD7.js → chunk-UM7N4G5A.js} +33 -12
- package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
- package/dist/{chunk-IGWKHNIQ.js → chunk-UXMFQ54G.js} +44 -37
- package/dist/{chunk-HFSBBKSQ.js → chunk-V5DHCITQ.js} +171 -3
- package/dist/{chunk-5WIGXA4T.js → chunk-VAZSBTKF.js} +111 -4
- package/dist/{chunk-VHN4MY6O.js → chunk-VEO4AP2K.js} +2 -2
- package/dist/{chunk-IJ7RPIYJ.js → chunk-VFA6GDY5.js} +65 -4
- package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
- package/dist/chunk-VO67MWHC.js +75 -0
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-TANS5ZJS.js → chunk-VYMXRQI6.js} +36 -22
- package/dist/{chunk-WWCZ5F23.js → chunk-W5VSYASO.js} +77 -16
- package/dist/{chunk-WNIJTQQK.js → chunk-WZR7K7ZX.js} +72 -116
- package/dist/{chunk-5Q2VVUKB.js → chunk-X3YGUTOB.js} +4 -4
- package/dist/chunk-X75E3D2N.js +686 -0
- package/dist/{chunk-VAWNZU7Z.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-Z2RR6MAK.js +127 -0
- package/dist/{chunk-FBVTI2TJ.js → chunk-Z4TXYIEG.js} +12 -131
- package/dist/cli/index.js +47 -36
- package/dist/{clio-QVTYJ57A.js → clio-2JXHBBY5.js} +7 -7
- package/dist/{code-nav-FGGFIE7L.js → code-nav-3YYRMYNF.js} +8 -8
- 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-LW5IJFQN.js → config-QZPCMYSO.js} +99 -63
- package/dist/{configure-7XIZCOU4.js → configure-TEGEBYCA.js} +23 -22
- package/dist/{context-Y6Y7QPR6.js → context-AV7OEZ4D.js} +12 -12
- package/dist/{context-L3WL3X7K.js → context-E6H5RNMC.js} +56 -47
- package/dist/{context-N52ZA626.js → context-GSXUE4CT.js} +29 -27
- package/dist/{context-clear-MBQRLSDQ.js → context-clear-SHIBYK6T.js} +55 -46
- package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
- package/dist/{context-working-set-GS6DSO7F.js → context-working-set-5ZGKPGZQ.js} +13 -13
- package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-EFMJT4LD.js} +93 -64
- package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
- package/dist/doctor-QOA5FNY5.js +313 -0
- package/dist/{eval-BEC2WHDA.js → eval-TFBYQH4H.js} +2032 -156
- package/dist/eval-inventory-SXH7PDKX.js +316 -0
- package/dist/{evidence-REJUMSKM.js → evidence-ERGESKGN.js} +203 -48
- package/dist/{evolve-PY5ZBA5K.js → evolve-VDXTSYCJ.js} +52 -43
- package/dist/{extensions-HVKU65YU.js → extensions-7BGBHN57.js} +13 -7
- package/dist/{fleet-7WZEWRFA.js → fleet-2RRVDF2V.js} +228 -108
- package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-VJ726XIA.js} +11 -11
- package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
- package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-JF5QOATM.js} +18 -15
- package/dist/fleet-inspect-VLY4S7QM.js +442 -0
- package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-AIZUEJOY.js} +5 -5
- package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-AJRPDMDV.js} +22 -19
- package/dist/fleet-verify-JFEL2L3H.js +175 -0
- package/dist/fleet-view-ZCON35AG.js +102 -0
- package/dist/{init-OG3TPGQG.js → init-DN2WWLFE.js} +72 -62
- package/dist/install-XGLBQY5E.js +13 -0
- package/dist/interop-OZBKXAYL.js +114 -0
- package/dist/{library-CNTMPLRF.js → library-YWZG7IMW.js} +21 -18
- package/dist/{memory-6IS7F275.js → memory-I4C4HMLW.js} +54 -45
- package/dist/{models-ENRJDA5W.js → models-CEYXJBO6.js} +33 -30
- package/dist/{monitor-XLDVO7TN.js → monitor-NZ6GCI3P.js} +59 -52
- package/dist/{orchestrator-6KSPYRHA.js → orchestrator-GCGQ4N5I.js} +7827 -7328
- 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-RZ4ER727.js → reset-DQ6FGCSH.js} +13 -11
- package/dist/resources-BB3MVJMD.js +111 -0
- package/dist/{run-Y2CNK5RU.js → run-H2GQDUER.js} +119 -87
- package/dist/{share-A55GYP6Z.js → share-GTJN6A5O.js} +20 -17
- package/dist/{skills-ALC5J6AT.js → skills-L55TEW6R.js} +33 -24
- package/dist/{skills-eval-JPBEBYQU.js → skills-eval-XVXPH2JI.js} +67 -56
- package/dist/skills-inventory-S4MXPJFV.js +126 -0
- package/dist/slash-commands-ZSGASKJC.js +77 -0
- package/dist/{steer-GGWFUJUD.js → steer-RZGSCY4R.js} +4 -4
- package/dist/{support-MIETYA5E.js → support-PKEUNNQL.js} +6 -6
- package/dist/{targets-VGNXIR3S.js → targets-NCPZ644J.js} +68 -40
- package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-44SV3YCN.js} +6 -4
- package/dist/tools-DAF3DI3C.js +27 -0
- package/dist/{trace-PNCASAXC.js → trace-FYVW2MQA.js} +207 -10
- package/dist/tui-primitives-2AKXQNZK.js +13 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
- package/dist/{upgrade-FUSUAGHR.js → upgrade-3XPP6OQL.js} +27 -24
- package/dist/{usage-N4MKVHKD.js → usage-3NLHGTU2.js} +114 -62
- package/dist/{verifiers-YAWOJ3H2.js → verifiers-SSQONKRT.js} +172 -13
- package/dist/{verify-LTDHYBGY.js → verify-3U6J7FZI.js} +10 -10
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
- package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-CEHYGPGQ.js} +75 -65
- package/dist/with-panes-MKB46MPQ.js +782 -0
- package/dist/worker/entry.js +106 -75
- 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 +9 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +62 -3
- package/docs/commands-and-modes.md +31 -2
- package/docs/configuration-and-targets.md +69 -12
- package/docs/context-engine.md +63 -4
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +5 -5
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -0
- package/docs/eval-runner.md +262 -11
- package/docs/evals-internal.md +72 -2
- package/docs/evidence-and-memory.md +12 -11
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +1 -1
- package/docs/extensions-and-sharing.md +27 -1
- package/docs/fleet-dispatch.md +25 -4
- 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 +55 -4
- package/docs/proactive-memory.md +127 -14
- package/docs/prompt-envelope-and-tools.md +19 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +19 -3
- 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 +88 -1
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +5 -2
- package/src/cli/acp.ts +6 -2
- package/src/cli/agents.ts +1 -1
- package/src/cli/argv.ts +25 -0
- package/src/cli/config-inspect.ts +33 -6
- package/src/cli/config.ts +1 -1
- package/src/cli/configure.ts +23 -21
- package/src/cli/doctor-panes.ts +124 -0
- package/src/cli/doctor-state-size.ts +82 -0
- package/src/cli/doctor-toolchain.ts +57 -0
- package/src/cli/doctor.ts +22 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +93 -16
- 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/extensions.ts +5 -1
- 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 +179 -39
- 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/targets.ts +44 -13
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +85 -5
- package/src/cli/usage.ts +63 -14
- package/src/cli/verifiers-inspect.ts +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/core/bus-events.ts +33 -1
- package/src/core/cache-telemetry.ts +42 -0
- package/src/core/config.ts +67 -0
- package/src/core/defaults.ts +124 -8
- package/src/core/endpoint-key.ts +27 -0
- package/src/core/residency-target-key.ts +25 -0
- package/src/core/response-schema.ts +80 -6
- 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 +6 -0
- package/src/domains/context/codewiki/coordinator.ts +12 -4
- package/src/domains/dispatch/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +52 -14
- package/src/domains/dispatch/capacity-lease.ts +118 -9
- package/src/domains/dispatch/contract.ts +11 -0
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/execution-plan.ts +44 -4
- package/src/domains/dispatch/extension.ts +378 -82
- 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 +87 -4
- 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/heartbeat.ts +32 -8
- package/src/domains/dispatch/index.ts +22 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/orphan-recovery.ts +5 -0
- package/src/domains/dispatch/reservation-store.ts +139 -11
- 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 +49 -1
- package/src/domains/dispatch/types.ts +13 -0
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-spawn.ts +25 -11
- package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
- package/src/domains/dispatch/write-boundary.ts +62 -1
- package/src/domains/eval/artifacts/store.ts +62 -0
- package/src/domains/eval/compare/behavioral.ts +224 -0
- package/src/domains/eval/compare/compare.ts +342 -2
- package/src/domains/eval/compare/envelope.ts +128 -0
- package/src/domains/eval/compare/gates.ts +24 -6
- package/src/domains/eval/compare/thresholds.ts +30 -3
- package/src/domains/eval/execution-provenance.ts +240 -0
- package/src/domains/eval/inventory.ts +113 -0
- package/src/domains/eval/metrics/aggregate.ts +136 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
- package/src/domains/eval/metrics/tracked.ts +413 -0
- package/src/domains/eval/provenance.ts +117 -0
- package/src/domains/eval/reports/comparison.ts +128 -0
- package/src/domains/eval/reports/junit.ts +17 -3
- package/src/domains/eval/reports/markdown.ts +3 -3
- package/src/domains/eval/reports/text.ts +14 -0
- package/src/domains/eval/run-compare.ts +20 -0
- package/src/domains/eval/runners/clio-run.ts +127 -0
- package/src/domains/eval/runners/external-command.ts +28 -3
- package/src/domains/eval/schema/adapter.ts +111 -0
- package/src/domains/eval/schema/artifact.ts +20 -0
- package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
- package/src/domains/eval/schema/behavioral.ts +520 -0
- package/src/domains/eval/schema/execution-envelope.ts +194 -0
- package/src/domains/eval/schema/serving.ts +105 -0
- package/src/domains/eval/schema/suite.ts +38 -8
- package/src/domains/eval/schema/validate.ts +58 -3
- package/src/domains/eval/schema/verdict.ts +237 -0
- package/src/domains/eval/suites/resolve.ts +2 -0
- package/src/domains/eval/suites/run.ts +264 -33
- package/src/domains/eval/verifiers/command.ts +2 -1
- package/src/domains/eval/workspaces/temp-copy.ts +145 -13
- package/src/domains/evidence/build.ts +2 -13
- package/src/domains/evidence/eval.ts +2 -12
- package/src/domains/evidence/findings-markdown.ts +33 -0
- package/src/domains/evidence/run-trust.ts +7 -113
- package/src/domains/evidence/store.ts +6 -0
- package/src/domains/evidence/trust-projection.ts +2 -2
- package/src/domains/extensions/compatibility.ts +285 -0
- package/src/domains/extensions/discovery.ts +38 -3
- package/src/domains/extensions/resources.ts +1 -1
- package/src/domains/extensions/state.ts +12 -3
- package/src/domains/extensions/types.ts +2 -0
- package/src/domains/lifecycle/doctor.ts +69 -1
- package/src/domains/memory/index.ts +14 -1
- package/src/domains/memory/task-bank-promotion.ts +64 -0
- package/src/domains/memory/task-memory-policy.ts +82 -17
- package/src/domains/memory/task-memory-spend.ts +131 -0
- package/src/domains/memory/task-memory-status.ts +7 -0
- package/src/domains/memory/task-memory-telemetry.ts +3 -0
- package/src/domains/middleware/index.ts +1 -0
- package/src/domains/middleware/memory-intervention.ts +97 -21
- package/src/domains/middleware/memory-step-endpoint.ts +71 -0
- 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/background-memory-usage.ts +140 -0
- package/src/domains/observability/cost.ts +22 -1
- package/src/domains/observability/index.ts +9 -0
- package/src/domains/observability/out-of-turn-usage.ts +51 -2
- package/src/domains/observability/trace-store.ts +234 -2
- package/src/domains/prompts/compiler.ts +100 -13
- package/src/domains/providers/endpoint-capacity.ts +228 -0
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +20 -3
- package/src/domains/providers/index.ts +32 -0
- package/src/domains/providers/model-runtime-capabilities.ts +32 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
- package/src/domains/providers/runtime-resolution.ts +8 -1
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
- package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
- 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/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/target-descriptor.ts +2 -0
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/prompts/loader.ts +95 -33
- package/src/domains/resources/skills/loader.ts +33 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/safety/call-target.ts +52 -0
- package/src/domains/safety/run-effects.ts +35 -4
- package/src/domains/session/context-accounting.ts +52 -1
- package/src/domains/session/context-ledger.ts +37 -13
- package/src/domains/session/index.ts +6 -0
- package/src/domains/session/prompt-cache.ts +140 -0
- package/src/domains/session/prompt-manifest.ts +42 -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/adapter.ts +18 -3
- package/src/engine/acp/server.ts +413 -70
- package/src/engine/acp/types.ts +19 -1
- package/src/engine/ai.ts +35 -0
- package/src/engine/apis/llamacpp-residency.ts +55 -3
- package/src/engine/apis/lmstudio.ts +25 -5
- package/src/engine/apis/ollama-native.ts +2 -1
- package/src/engine/apis/openai-completions.ts +80 -17
- package/src/engine/apis/residency-lock.ts +3 -1
- package/src/engine/apis/residency.ts +34 -1
- package/src/engine/claude/sdk-module.ts +98 -0
- package/src/engine/claude/sdk-runtime.ts +19 -11
- package/src/engine/provider-payload.ts +29 -1
- 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 +279 -35
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/chat-loop-messages.ts +26 -7
- package/src/interactive/chat-loop.ts +318 -41
- package/src/interactive/chat-panel.ts +62 -8
- package/src/interactive/clio-editor.ts +45 -8
- package/src/interactive/context-activity.ts +5 -1
- package/src/interactive/context-meter.ts +1 -1
- package/src/interactive/context-overlay.ts +41 -10
- package/src/interactive/cost-overlay.ts +66 -6
- package/src/interactive/council-grid.ts +1 -3
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +102 -20
- package/src/interactive/fleet-run-preview.ts +41 -15
- package/src/interactive/handoff-round.ts +41 -2
- package/src/interactive/interactive-application.ts +177 -7
- package/src/interactive/interactive-input-runtime.ts +15 -0
- package/src/interactive/interactive-presentation.ts +4 -0
- package/src/interactive/interactive-shell.ts +20 -17
- package/src/interactive/interactive-slash-runtime.ts +63 -10
- package/src/interactive/memory-overlay.ts +9 -0
- package/src/interactive/modal-marker.ts +170 -0
- package/src/interactive/mutation-preview.ts +295 -0
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +58 -2
- package/src/interactive/overlay-general-openers.ts +17 -0
- package/src/interactive/overlay-key-routing.ts +52 -3
- package/src/interactive/overlay-lifecycle.ts +56 -7
- package/src/interactive/overlay-model-selectors.ts +40 -3
- package/src/interactive/overlay-permission-lifecycle.ts +112 -24
- package/src/interactive/overlay-session-lifecycle.ts +73 -9
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +1 -0
- package/src/interactive/overlays/ask-user.ts +227 -49
- 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 +6 -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 +12 -1
- package/src/interactive/overlays/session-selector.ts +1 -0
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +614 -45
- 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/permission-hint.ts +34 -2
- package/src/interactive/permission-overlay.ts +159 -9
- package/src/interactive/prewarm.ts +197 -0
- package/src/interactive/render-trace.ts +162 -15
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/tool-execution.ts +4 -0
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/side-question.ts +58 -1
- package/src/interactive/slash-commands.ts +251 -15
- package/src/interactive/status/controller.ts +11 -0
- package/src/interactive/status/state-machine.ts +54 -2
- package/src/interactive/status/types.ts +7 -0
- package/src/interactive/tasks-overlay.ts +1 -0
- package/src/interactive/terminal-lease.ts +2 -0
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +346 -33
- package/src/interactive/turn-persistence.ts +14 -4
- package/src/interactive/turn-prewarm.ts +364 -0
- package/src/interactive/turn-queues.ts +7 -4
- package/src/interactive/turn-runtime.ts +8 -1
- package/src/interactive/turn-state.ts +23 -0
- package/src/interactive/view/artifacts.ts +109 -1
- package/src/interactive/view/view-overlay.ts +29 -3
- 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/ask-user.ts +43 -2
- 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-plan.ts +17 -9
- package/src/tools/dispatch-run-events.ts +134 -19
- package/src/tools/dispatch-runner.ts +29 -7
- package/src/tools/dispatch-scout.ts +1 -1
- 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/src/tools/registry.ts +16 -0
- package/dist/chunk-AOCYTWAV.js +0 -449
- package/dist/chunk-HLE42MG7.js +0 -37
- package/dist/chunk-HWUFFB6L.js +0 -83
- package/dist/chunk-JOZYP4GM.js +0 -279
- package/dist/doctor-M7YEDGAE.js +0 -91
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RESPONSE_SCHEMA_RUNTIME_ID } from "../core/response-schema.js";
|
|
1
|
+
import { RESPONSE_SCHEMA_RUNTIME_ID, type ResponseSchemaDialect } from "../core/response-schema.js";
|
|
2
2
|
import type { ThinkingLevel } from "../domains/providers/index.js";
|
|
3
3
|
import type { EngineModel } from "./types.js";
|
|
4
4
|
|
|
@@ -217,6 +217,34 @@ function patchLlamaCppResponseSchemaPayload(
|
|
|
217
217
|
};
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
+
/**
|
|
221
|
+
* Apply a JSON-schema response constraint in the dialect the runtime takes.
|
|
222
|
+
*
|
|
223
|
+
* Unlike the worker patcher above, this one is for a seam that treats native
|
|
224
|
+
* enforcement as an optimization: the caller looks the dialect up first and
|
|
225
|
+
* simply does not call this when there is none, so an unconstrained request
|
|
226
|
+
* still goes out and the prompt-level instruction carries it (issue #223).
|
|
227
|
+
* Returns undefined when the payload is not an object, which leaves it alone.
|
|
228
|
+
*/
|
|
229
|
+
export function patchResponseSchemaPayloadForDialect(
|
|
230
|
+
payload: unknown,
|
|
231
|
+
dialect: ResponseSchemaDialect,
|
|
232
|
+
responseSchema: Record<string, unknown>,
|
|
233
|
+
schemaName: string,
|
|
234
|
+
): unknown | undefined {
|
|
235
|
+
if (!isRecord(payload)) return undefined;
|
|
236
|
+
if (dialect === "llamacpp-json-object") {
|
|
237
|
+
return { ...payload, response_format: { type: "json_object", schema: responseSchema } };
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
...payload,
|
|
241
|
+
response_format: {
|
|
242
|
+
type: "json_schema",
|
|
243
|
+
json_schema: { name: schemaName, strict: true, schema: responseSchema },
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
220
248
|
export interface WorkerPayloadPatchOptions {
|
|
221
249
|
runtimeId: string;
|
|
222
250
|
thinkingLevel?: ThinkingLevel;
|
|
@@ -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>;
|
|
@@ -8,6 +8,7 @@ import { installBusTracer } from "../core/bus-trace.js";
|
|
|
8
8
|
import { type ClioSettings, readSettings, type SettingsMutator, updateSettings } from "../core/config.js";
|
|
9
9
|
import { DEFAULT_DELEGATION_PERMISSION_TIMEOUT_MS } from "../core/defaults.js";
|
|
10
10
|
import { loadDomains } from "../core/domain-loader.js";
|
|
11
|
+
import type { SafeEventBus } from "../core/event-bus.js";
|
|
11
12
|
import { expandInlineFileReferencesAsync } from "../core/file-references.js";
|
|
12
13
|
import { setGitCommitAttributionEnabled } from "../core/git-commit-attribution.js";
|
|
13
14
|
import { configureGuardrails } from "../core/guardrails.js";
|
|
@@ -48,6 +49,7 @@ import { createDispatchDedupRegistration } from "../domains/dispatch/dedup.js";
|
|
|
48
49
|
import { agentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
|
|
49
50
|
import { readGateDecisionArtifacts, readPendingGateDecisions } from "../domains/dispatch/gate-decisions.js";
|
|
50
51
|
import { createDispatchDomainModule } from "../domains/dispatch/index.js";
|
|
52
|
+
import { configureRunEventJournal } from "../domains/dispatch/run-event-journal.js";
|
|
51
53
|
import { type ExtensionsContract, ExtensionsDomainModule } from "../domains/extensions/index.js";
|
|
52
54
|
import { type InteropContract, InteropDomainModule } from "../domains/interop/index.js";
|
|
53
55
|
import {
|
|
@@ -63,9 +65,13 @@ import {
|
|
|
63
65
|
createTaskMemoryTelemetrySink,
|
|
64
66
|
createTaskMemoryTrace,
|
|
65
67
|
loadMemoryRecordsSync,
|
|
68
|
+
proposeInjectedTaskMemory,
|
|
69
|
+
readTaskMemorySpendSummary,
|
|
66
70
|
renderTaskMemoryHandoffSource,
|
|
67
71
|
seedTaskMemoryFromNewestHandoff,
|
|
72
|
+
type TaskMemoryEntry,
|
|
68
73
|
type TaskMemoryModelClient,
|
|
74
|
+
type TaskMemoryStepUsage,
|
|
69
75
|
taskMemoryBankSize,
|
|
70
76
|
taskMemoryHandoffSeedOffer,
|
|
71
77
|
taskMemoryTracePath,
|
|
@@ -88,21 +94,27 @@ import {
|
|
|
88
94
|
writeMiddlewareDiagnosticToStderr,
|
|
89
95
|
} from "../domains/middleware/index.js";
|
|
90
96
|
import { createMemoryInterventionRegistration } from "../domains/middleware/memory-intervention.js";
|
|
97
|
+
import { announceMemoryStepEndpoint } from "../domains/middleware/memory-step-endpoint.js";
|
|
91
98
|
import { createTaskBoardReminderRegistration } from "../domains/middleware/task-board-reminder.js";
|
|
92
99
|
import { createTaskNudgeRegistration } from "../domains/middleware/task-nudge.js";
|
|
93
100
|
import { createWatchdogRegistration } from "../domains/middleware/watchdog.js";
|
|
101
|
+
import type { MuxContract } from "../domains/mux/index.js";
|
|
94
102
|
import type { ObservabilityContract } from "../domains/observability/index.js";
|
|
95
|
-
import { ObservabilityDomainModule } from "../domains/observability/index.js";
|
|
103
|
+
import { ObservabilityDomainModule, recordBackgroundMemoryStep } from "../domains/observability/index.js";
|
|
96
104
|
import type { PromptsContract } from "../domains/prompts/contract.js";
|
|
97
105
|
import { createPromptsDomainModule } from "../domains/prompts/index.js";
|
|
98
106
|
import type { ProvidersContract, TargetDescriptor, ThinkingLevel } from "../domains/providers/index.js";
|
|
99
107
|
import {
|
|
100
108
|
AGENT_ROLE_TOOLS_REQUIRED_REASON,
|
|
101
109
|
applyModelCapabilityPatch,
|
|
110
|
+
canonicalEndpointKey,
|
|
102
111
|
firstRuntimeResolutionError,
|
|
112
|
+
foregroundStreamUsage,
|
|
103
113
|
isOrchestratorEligibleRuntime,
|
|
114
|
+
normalizeCostProvenance,
|
|
104
115
|
ProvidersDomainModule,
|
|
105
116
|
refineRuntimeTargetWithModelHints,
|
|
117
|
+
registerForegroundStream,
|
|
106
118
|
resolveModelCapabilities,
|
|
107
119
|
resolveModelRuntimeCapabilitiesForProviders,
|
|
108
120
|
resolveRuntimeTarget,
|
|
@@ -110,6 +122,7 @@ import {
|
|
|
110
122
|
targetRequiresAuth,
|
|
111
123
|
VALID_THINKING_LEVELS,
|
|
112
124
|
} from "../domains/providers/index.js";
|
|
125
|
+
import { memoryInterventionModelMaxTokens } from "../domains/providers/model-runtime-capabilities.js";
|
|
113
126
|
import { getRuntimeRegistry } from "../domains/providers/registry.js";
|
|
114
127
|
import { registerBuiltinRuntimes } from "../domains/providers/runtimes/builtins.js";
|
|
115
128
|
import {
|
|
@@ -149,6 +162,7 @@ import {
|
|
|
149
162
|
import { createTaskBoardStore } from "../domains/session/task-board.js";
|
|
150
163
|
import { filterEntriesToActivePath } from "../domains/session/tree/active-path.js";
|
|
151
164
|
import { type ShareContract, ShareDomainModule } from "../domains/share/index.js";
|
|
165
|
+
import { ToolchainDomainModule } from "../domains/toolchain/index.js";
|
|
152
166
|
import { createUserTasksStore } from "../domains/user-tasks/store.js";
|
|
153
167
|
import { type AcpSafeSettingsPatch, type AcpSafeSettingsSnapshot, serveClioAcpAgent } from "../engine/acp/server.js";
|
|
154
168
|
import { createStdioServerTransport } from "../engine/acp/transport.js";
|
|
@@ -159,12 +173,13 @@ import {
|
|
|
159
173
|
INTERACTIVE_LOOP_BLOCK_BUDGET,
|
|
160
174
|
readOrchTurnToolCallBudget,
|
|
161
175
|
} from "../engine/loop-guard.js";
|
|
162
|
-
import { openSession, readSessionTailTurns, sessionCurrentPath, sessionPaths } from "../engine/session.js";
|
|
176
|
+
import { cwdHash, openSession, readSessionTailTurns, sessionCurrentPath, sessionPaths } from "../engine/session.js";
|
|
163
177
|
import type { EngineModel } from "../engine/types.js";
|
|
164
178
|
import { createChatLoop } from "../interactive/chat-loop.js";
|
|
165
179
|
import { type RunIo, startInteractive } from "../interactive/index.js";
|
|
166
180
|
import { buildModelReplayAgentMessagesFromTurns } from "../interactive/model-session-replay.js";
|
|
167
181
|
import type { BootOptions } from "./boot-options.js";
|
|
182
|
+
import { resolvePanesEnablement } from "./panes-activation.js";
|
|
168
183
|
|
|
169
184
|
export type { BootOptions, HeadlessSamplingOverrides } from "./boot-options.js";
|
|
170
185
|
|
|
@@ -268,6 +283,7 @@ function applyHeadlessSettingsOverlay(
|
|
|
268
283
|
interface CompactionResolution {
|
|
269
284
|
model: EngineModel;
|
|
270
285
|
targetId: string;
|
|
286
|
+
endpointKey: string | null;
|
|
271
287
|
apiKey?: string;
|
|
272
288
|
}
|
|
273
289
|
|
|
@@ -310,11 +326,27 @@ export async function resolveApiKeyForTarget(
|
|
|
310
326
|
return resolved.apiKey;
|
|
311
327
|
}
|
|
312
328
|
|
|
329
|
+
/**
|
|
330
|
+
* The background memory role, resolved to the endpoint it would call.
|
|
331
|
+
*
|
|
332
|
+
* The endpoint key is what lets the middleware decline a step that would land
|
|
333
|
+
* on the same inference scheduler the chat target is streaming against (#229,
|
|
334
|
+
* #250), and it is the same key dispatch admission counts slots on.
|
|
335
|
+
*/
|
|
336
|
+
interface BackgroundMemoryRoute {
|
|
337
|
+
client: TaskMemoryModelClient;
|
|
338
|
+
targetId: string;
|
|
339
|
+
wireModelId: string;
|
|
340
|
+
endpointKey: string | null;
|
|
341
|
+
modelMaxTokens(configuredMaxTokens: number): number;
|
|
342
|
+
}
|
|
343
|
+
|
|
313
344
|
function createBackgroundMemoryModelClient(
|
|
314
345
|
providers: ProvidersContract,
|
|
315
346
|
settings: Readonly<ClioSettings>,
|
|
316
347
|
timeoutMs: number,
|
|
317
|
-
|
|
348
|
+
bus: Pick<SafeEventBus, "emit"> | null,
|
|
349
|
+
): BackgroundMemoryRoute | null {
|
|
318
350
|
const targetId = settings.background.target?.trim();
|
|
319
351
|
const wireModelId = settings.background.model?.trim();
|
|
320
352
|
if (!targetId || !wireModelId) return null;
|
|
@@ -343,24 +375,63 @@ function createBackgroundMemoryModelClient(
|
|
|
343
375
|
const model = resolved.target.runtime.synthesizeModel(resolved.target.target, resolved.target.wireModelId, kbHit);
|
|
344
376
|
const refined = refineRuntimeTargetWithModelHints(resolved.target, model, providers.knowledgeBase);
|
|
345
377
|
applyModelCapabilityPatch(model, refined.capabilities);
|
|
378
|
+
const costProvenance = normalizeCostProvenance(refined.costProvenance);
|
|
379
|
+
const endpointKey = canonicalEndpointKey(refined.target);
|
|
346
380
|
return {
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
381
|
+
targetId,
|
|
382
|
+
wireModelId: refined.wireModelId,
|
|
383
|
+
endpointKey,
|
|
384
|
+
modelMaxTokens: (configuredMaxTokens) =>
|
|
385
|
+
memoryInterventionModelMaxTokens({
|
|
386
|
+
configuredMaxTokens,
|
|
387
|
+
thinkingMechanism: refined.modelRuntime.thinking.mechanism,
|
|
388
|
+
modelMaxTokens: refined.capabilityDecisions.maxTokens,
|
|
389
|
+
}),
|
|
390
|
+
client: {
|
|
391
|
+
// Wrapped at the layer that knows a request left the process: the step
|
|
392
|
+
// holds endpoint capacity while it is out and publishes the cache
|
|
393
|
+
// disturbance even when a timeout means the usage sink never sees it.
|
|
394
|
+
complete: announceMemoryStepEndpoint({ bus, endpointKey, targetId }, async (request) => {
|
|
395
|
+
const apiKey = targetRequiresAuth(refined.target, refined.runtime)
|
|
396
|
+
? (await providers.auth.resolveForTarget(refined.target, refined.runtime, { signal: request.signal })).apiKey
|
|
397
|
+
: LOCAL_API_KEY_FALLBACK;
|
|
398
|
+
const startedAt = Date.now();
|
|
399
|
+
const completion = await completeEngineText({
|
|
400
|
+
model,
|
|
401
|
+
systemPrompt: request.systemPrompt,
|
|
402
|
+
userPrompt: request.userPrompt,
|
|
403
|
+
maxTokens: request.maxTokens,
|
|
404
|
+
// Always off, never the operator's chat thinking level. A model that
|
|
405
|
+
// reasons anyway still works: `completeEngineText` keeps only text
|
|
406
|
+
// blocks, and the memory output budget leaves room for the preamble.
|
|
407
|
+
thinkingLevel: "off",
|
|
408
|
+
signal: request.signal,
|
|
409
|
+
timeoutMs,
|
|
410
|
+
...(apiKey === undefined ? {} : { apiKey }),
|
|
411
|
+
});
|
|
412
|
+
// The step is billed here whatever the policy later decides about the
|
|
413
|
+
// answer. A model that read a trajectory and chose silence spent the
|
|
414
|
+
// same prefill as one that produced a reminder.
|
|
415
|
+
return {
|
|
416
|
+
text: completion.text,
|
|
417
|
+
inputTokens: completion.inputTokens,
|
|
418
|
+
outputTokens: completion.outputTokens,
|
|
419
|
+
usage: {
|
|
420
|
+
targetId,
|
|
421
|
+
attributedModelId: refined.wireModelId,
|
|
422
|
+
input: completion.usage.input,
|
|
423
|
+
output: completion.usage.output,
|
|
424
|
+
cacheRead: completion.usage.cacheRead,
|
|
425
|
+
cacheWrite: completion.usage.cacheWrite,
|
|
426
|
+
reasoning: completion.usage.reasoning,
|
|
427
|
+
totalTokens: completion.usage.totalTokens,
|
|
428
|
+
costUsd: completion.usage.costUsd,
|
|
429
|
+
costProvenance,
|
|
430
|
+
durationMs: Date.now() - startedAt,
|
|
431
|
+
backend: completion.backend,
|
|
432
|
+
},
|
|
433
|
+
};
|
|
434
|
+
}),
|
|
364
435
|
},
|
|
365
436
|
};
|
|
366
437
|
}
|
|
@@ -463,7 +534,7 @@ async function resolveCompactionModel(
|
|
|
463
534
|
const model = synthesizeOrchestratorModel(providers, target, wireModelId);
|
|
464
535
|
if (!model) return null;
|
|
465
536
|
const apiKey = await resolveApiKeyForTarget(target, providers);
|
|
466
|
-
const resolution: CompactionResolution = { model, targetId };
|
|
537
|
+
const resolution: CompactionResolution = { model, targetId, endpointKey: canonicalEndpointKey(target) };
|
|
467
538
|
if (apiKey !== undefined) resolution.apiKey = apiKey;
|
|
468
539
|
return resolution;
|
|
469
540
|
}
|
|
@@ -591,12 +662,21 @@ async function runCompactionFlow(
|
|
|
591
662
|
const entries = filterEntriesToActivePath(readSessionEntriesForCompact(meta.id), activeLeafTurnId);
|
|
592
663
|
if (entries.length === 0) return null;
|
|
593
664
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
665
|
+
// A compaction summary is a full streamed request against the chat target.
|
|
666
|
+
// Hold the same canonical endpoint slot as an ordinary turn, /btw round, or
|
|
667
|
+
// pre-warm so dispatch admission and background memory see its real usage.
|
|
668
|
+
const releaseEndpointSlot = resolved.endpointKey === null ? () => {} : registerForegroundStream(resolved.endpointKey);
|
|
669
|
+
let result: CompactResult;
|
|
670
|
+
try {
|
|
671
|
+
result = await compact({
|
|
672
|
+
entries,
|
|
673
|
+
model: resolved.model,
|
|
674
|
+
...(resolved.apiKey !== undefined ? { apiKey: resolved.apiKey } : {}),
|
|
675
|
+
...(instructions !== undefined ? { instructions } : {}),
|
|
676
|
+
});
|
|
677
|
+
} finally {
|
|
678
|
+
releaseEndpointSlot();
|
|
679
|
+
}
|
|
600
680
|
if (result.messagesSummarized === 0 || result.summary.length === 0) return null;
|
|
601
681
|
|
|
602
682
|
const entry: Omit<CompactionSummaryEntry, "turnId" | "timestamp"> = {
|
|
@@ -776,6 +856,19 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
776
856
|
let effectiveSettingsForDispatch: (() => Readonly<ClioSettings>) | null = null;
|
|
777
857
|
let protectedArtifactStateForDispatch: (() => ProtectedArtifactState) | null = null;
|
|
778
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
|
+
|
|
779
872
|
const result = await loadDomains(
|
|
780
873
|
[
|
|
781
874
|
options.startupSettings ? createConfigDomainModule(options.startupSettings) : ConfigDomainModule,
|
|
@@ -795,6 +888,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
795
888
|
ShareDomainModule,
|
|
796
889
|
createContextDomainModule({ noContextFiles: options.noContextFiles === true }),
|
|
797
890
|
ProvidersDomainModule,
|
|
891
|
+
ToolchainDomainModule,
|
|
798
892
|
SafetyDomainModule,
|
|
799
893
|
createPromptsDomainModule({
|
|
800
894
|
noContextFiles: options.noContextFiles === true,
|
|
@@ -804,6 +898,16 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
804
898
|
SessionDomainModule,
|
|
805
899
|
ObservabilityDomainModule,
|
|
806
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
|
+
: []),
|
|
807
911
|
// Dispatch resolves worker targets through the session's effective
|
|
808
912
|
// settings view once it exists (assigned below, after the config
|
|
809
913
|
// contract loads); until then it falls back to the shared snapshot.
|
|
@@ -811,6 +915,11 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
811
915
|
getSettings: () => effectiveSettingsForDispatch?.(),
|
|
812
916
|
getProtectedArtifactState: () => protectedArtifactStateForDispatch?.() ?? { artifacts: [] },
|
|
813
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,
|
|
814
923
|
}),
|
|
815
924
|
LifecycleDomainModule,
|
|
816
925
|
],
|
|
@@ -873,6 +982,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
873
982
|
const resources = result.getContract<ResourcesContract>("resources");
|
|
874
983
|
const extensions = result.getContract<ExtensionsContract>("extensions");
|
|
875
984
|
const share = result.getContract<ShareContract>("share");
|
|
985
|
+
const mux = result.getContract<MuxContract>("mux");
|
|
876
986
|
const contextDomain = result.getContract<ContextContract>("context");
|
|
877
987
|
const interop = result.getContract<InteropContract>("interop");
|
|
878
988
|
// Boot detection resolves paths only: no `--version` subprocess and no skill
|
|
@@ -973,7 +1083,13 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
973
1083
|
// Guardrail policy (tool-call budgets, tool byte caps, dispatch ledger cap)
|
|
974
1084
|
// resolves settings-first with env as emergency override; install the
|
|
975
1085
|
// settings section before any guard registration or tool reads it.
|
|
976
|
-
|
|
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);
|
|
977
1093
|
|
|
978
1094
|
// Guard registrations on the middleware contract, in order: loop guard,
|
|
979
1095
|
// protected artifacts (last among guards so it absorbs protect_path effects
|
|
@@ -1079,6 +1195,53 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1079
1195
|
// telemetry row says which silence happened; this says what the model wrote.
|
|
1080
1196
|
const memoryTracePath = taskMemoryTracePath();
|
|
1081
1197
|
const memoryTrace = memoryTracePath === null ? null : createTaskMemoryTrace(memoryTracePath);
|
|
1198
|
+
// The route the last resolved memory client would call, kept so the endpoint
|
|
1199
|
+
// check and the cost row read the same resolution the step itself used.
|
|
1200
|
+
let backgroundMemoryRoute: BackgroundMemoryRoute | null = null;
|
|
1201
|
+
/**
|
|
1202
|
+
* Account for one background memory step exactly as a `/btw` side question is
|
|
1203
|
+
* accounted for: the in-process cost tracker under its own label so `/cost`
|
|
1204
|
+
* shows it while the session lives, and one durable out-of-turn row so
|
|
1205
|
+
* `clio-coder usage report` can still see it afterwards.
|
|
1206
|
+
*
|
|
1207
|
+
* Accounting only. The client wrapper (`announceMemoryStepEndpoint`) holds the
|
|
1208
|
+
* endpoint slot and publishes the disturbance; it sees the timed-out and
|
|
1209
|
+
* thrown steps this sink never hears about because their usage stays null.
|
|
1210
|
+
*/
|
|
1211
|
+
const recordBackgroundMemoryUsage = (usage: TaskMemoryStepUsage): void => {
|
|
1212
|
+
const meta = session?.current() ?? null;
|
|
1213
|
+
try {
|
|
1214
|
+
recordBackgroundMemoryStep({
|
|
1215
|
+
usage,
|
|
1216
|
+
stateDir: clioStateDir(),
|
|
1217
|
+
sessionId: meta?.id ?? null,
|
|
1218
|
+
// The identity the session ledger is filed under, so `usage report
|
|
1219
|
+
// --repo` selects these rows with the same hash it selects ledgers with.
|
|
1220
|
+
repoIdentity: meta ? meta.cwdHash || cwdHash(meta.cwd || process.cwd()) : null,
|
|
1221
|
+
...(observability === undefined ? {} : { observability }),
|
|
1222
|
+
});
|
|
1223
|
+
} catch {
|
|
1224
|
+
// Accounting is bookkeeping. Its failure never reaches the memory step.
|
|
1225
|
+
}
|
|
1226
|
+
};
|
|
1227
|
+
const proposeInjectedMemoryEntries = (entries: ReadonlyArray<TaskMemoryEntry>): void => {
|
|
1228
|
+
const meta = session?.current() ?? null;
|
|
1229
|
+
void proposeInjectedTaskMemory(clioDataDir(), {
|
|
1230
|
+
sessionId: meta?.id ?? null,
|
|
1231
|
+
cwd: meta?.cwd || process.cwd(),
|
|
1232
|
+
entries,
|
|
1233
|
+
})
|
|
1234
|
+
.then((result) => {
|
|
1235
|
+
for (const error of result.errors) {
|
|
1236
|
+
process.stderr.write(`[clio:memory] proposed record not written for ${error}\n`);
|
|
1237
|
+
}
|
|
1238
|
+
})
|
|
1239
|
+
.catch((error: unknown) => {
|
|
1240
|
+
process.stderr.write(
|
|
1241
|
+
`[clio:memory] proposed records not written: ${error instanceof Error ? error.message : String(error)}\n`,
|
|
1242
|
+
);
|
|
1243
|
+
});
|
|
1244
|
+
};
|
|
1082
1245
|
const memoryIntervention = createMemoryInterventionRegistration({
|
|
1083
1246
|
bank: taskMemoryBank,
|
|
1084
1247
|
telemetry: createTaskMemoryTelemetrySink(),
|
|
@@ -1093,10 +1256,28 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1093
1256
|
},
|
|
1094
1257
|
getModelClient: () => {
|
|
1095
1258
|
const settings = effectiveSettingsForDispatch?.();
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1259
|
+
backgroundMemoryRoute =
|
|
1260
|
+
settings === undefined
|
|
1261
|
+
? null
|
|
1262
|
+
: createBackgroundMemoryModelClient(providers, settings, settings.memory.intervention.timeoutMs, bus);
|
|
1263
|
+
return backgroundMemoryRoute?.client ?? null;
|
|
1264
|
+
},
|
|
1265
|
+
getModelMaxTokens: (configuredMaxTokens) =>
|
|
1266
|
+
backgroundMemoryRoute?.modelMaxTokens(configuredMaxTokens) ?? configuredMaxTokens,
|
|
1267
|
+
// A single-slot local server serves one request at a time, so a memory step
|
|
1268
|
+
// started while the operator's turn is streaming either waits behind it or
|
|
1269
|
+
// makes the server swap the resident model out to answer. The chat loop
|
|
1270
|
+
// registers its stream on the endpoint it streams against, so the two are
|
|
1271
|
+
// compared by the same canonical key dispatch admission counts slots on.
|
|
1272
|
+
backgroundEndpointBusy: () => {
|
|
1273
|
+
const endpointKey = backgroundMemoryRoute?.endpointKey ?? null;
|
|
1274
|
+
if (endpointKey === null) return false;
|
|
1275
|
+
// This runs before the client wrapper registers the admitted step, so the
|
|
1276
|
+
// count contains other requests only and the step cannot refuse itself.
|
|
1277
|
+
return (foregroundStreamUsage()[endpointKey] ?? 0) > 0;
|
|
1099
1278
|
},
|
|
1279
|
+
onStepUsage: (usage) => recordBackgroundMemoryUsage(usage),
|
|
1280
|
+
onInjectedEntries: (entries) => proposeInjectedMemoryEntries(entries),
|
|
1100
1281
|
});
|
|
1101
1282
|
middleware.registerHook(memoryIntervention);
|
|
1102
1283
|
const unsubscribeMemoryLoop = bus.on(BusChannels.LoopBlocked, () => memoryIntervention.signalLoop());
|
|
@@ -1243,6 +1424,19 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1243
1424
|
// Operator-initiated backgrounding is a TUI affordance: the registry is the
|
|
1244
1425
|
// one object the dispatch tool and the keypress both hold.
|
|
1245
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;
|
|
1246
1440
|
registerAllTools(toolRegistry, {
|
|
1247
1441
|
...(session
|
|
1248
1442
|
? {
|
|
@@ -1266,6 +1460,11 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1266
1460
|
// provenance and compete winner handling agree with the approval surface.
|
|
1267
1461
|
getAutonomy: resolveEffectiveAutonomy,
|
|
1268
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 } : {}),
|
|
1269
1468
|
getCostCeilingUsd: () => result.getContract<SchedulingContract>("scheduling")?.ceilingUsd() ?? 0,
|
|
1270
1469
|
...(config ? { getWorkerRosters: () => config.get().workers.rosters } : {}),
|
|
1271
1470
|
getSkillLoaderOptions: () => ({
|
|
@@ -1411,6 +1610,20 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1411
1610
|
mutateSaved?.(saved);
|
|
1412
1611
|
});
|
|
1413
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
|
+
};
|
|
1414
1627
|
const readAcpSafeSettings = (): AcpSafeSettingsSnapshot => {
|
|
1415
1628
|
const settings = getCurrentSettings();
|
|
1416
1629
|
return {
|
|
@@ -1569,6 +1782,12 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1569
1782
|
}
|
|
1570
1783
|
|
|
1571
1784
|
const chat = createChatLoop({
|
|
1785
|
+
// The pre-warm holds one slot on its endpoint while it runs, so dispatch
|
|
1786
|
+
// admission (#250) sees it exactly as it sees the orchestrator's own turn.
|
|
1787
|
+
registerPrewarmEndpointSlot: (runtime) => {
|
|
1788
|
+
const key = canonicalEndpointKey(runtime.runtimeResolution.target);
|
|
1789
|
+
return key === null ? null : registerForegroundStream(key);
|
|
1790
|
+
},
|
|
1572
1791
|
getSettings: getCurrentSettings,
|
|
1573
1792
|
providers,
|
|
1574
1793
|
middleware,
|
|
@@ -1628,6 +1847,11 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1628
1847
|
: {}),
|
|
1629
1848
|
toolRegistry,
|
|
1630
1849
|
hasAttachedDispatch: () => dispatchBackground.size() > 0,
|
|
1850
|
+
// The pre-warm buys latency for a person about to type the next turn. A
|
|
1851
|
+
// headless `run` submits its one prompt immediately and an unattended boot
|
|
1852
|
+
// never submits at all, so neither has latency to buy; the ACP surface has
|
|
1853
|
+
// an operator on the other end of the client and keeps it.
|
|
1854
|
+
isLatencySurface: () => interactive || acpMode,
|
|
1631
1855
|
});
|
|
1632
1856
|
|
|
1633
1857
|
// Coordinated shutdown (SIGINT/SIGTERM, TUI quit) must abort any in-flight
|
|
@@ -1872,6 +2096,20 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1872
2096
|
...(extensions ? { extensions } : {}),
|
|
1873
2097
|
...(interop ? { interop } : {}),
|
|
1874
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) } : {}),
|
|
1875
2113
|
toolRegistry,
|
|
1876
2114
|
...(session ? { session } : {}),
|
|
1877
2115
|
...(session ? { readSessionEntries: readCurrentSessionEntries } : {}),
|
|
@@ -1891,6 +2129,10 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1891
2129
|
bank,
|
|
1892
2130
|
activity: memoryIntervention.recentActivity(),
|
|
1893
2131
|
stepInFlight: memoryIntervention.stepInFlight(),
|
|
2132
|
+
// Folded from the telemetry ledger, which is durable across sessions,
|
|
2133
|
+
// so `/memory` answers what the tier has cost since it was turned on
|
|
2134
|
+
// rather than what it cost since this process started.
|
|
2135
|
+
spend: readTaskMemorySpendSummary(clioStateDir()),
|
|
1894
2136
|
};
|
|
1895
2137
|
},
|
|
1896
2138
|
getTaskMemorySeedOffer,
|
|
@@ -1980,7 +2222,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1980
2222
|
},
|
|
1981
2223
|
}
|
|
1982
2224
|
: {}),
|
|
1983
|
-
onSetThinkingLevel: (level) => {
|
|
2225
|
+
onSetThinkingLevel: (level, scope) => {
|
|
1984
2226
|
const current = getCurrentSettings();
|
|
1985
2227
|
const nextLevel =
|
|
1986
2228
|
resolveModelRuntimeCapabilitiesForProviders(
|
|
@@ -1989,7 +2231,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1989
2231
|
current.orchestrator.model,
|
|
1990
2232
|
level,
|
|
1991
2233
|
)?.thinking.effectiveLevel ?? "off";
|
|
1992
|
-
|
|
2234
|
+
applyRoutingAtScope({ orchestrator: { thinkingLevel: nextLevel } }, scope ?? "global");
|
|
1993
2235
|
},
|
|
1994
2236
|
onCycleThinking: () => {
|
|
1995
2237
|
const current = getCurrentSettings();
|
|
@@ -2006,7 +2248,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
2006
2248
|
);
|
|
2007
2249
|
updateSessionRouting({ orchestrator: { thinkingLevel: nextLevel } });
|
|
2008
2250
|
},
|
|
2009
|
-
onSelectModel: ({ target, model }) => {
|
|
2251
|
+
onSelectModel: ({ target, model }, scope) => {
|
|
2010
2252
|
const registry = getRuntimeRegistry();
|
|
2011
2253
|
const settings = getCurrentSettings();
|
|
2012
2254
|
const descriptor = settings.targets.find((e) => e.id === target);
|
|
@@ -2023,7 +2265,9 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
2023
2265
|
);
|
|
2024
2266
|
}
|
|
2025
2267
|
}
|
|
2026
|
-
|
|
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.
|
|
2027
2271
|
rememberRecentModel(`${target}/${model}`, getCurrentSettings().modelSelector.recentLimit);
|
|
2028
2272
|
},
|
|
2029
2273
|
writeSettings: (next) => applySettingsBlob(next),
|