@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
|
@@ -3,6 +3,7 @@ import type { ClioSettings } from "../core/config.js";
|
|
|
3
3
|
import type { SafeEventBus } from "../core/event-bus.js";
|
|
4
4
|
import { expandInlineFileReferencesAsync } from "../core/file-references.js";
|
|
5
5
|
import type { PendingSkillRequest } from "../core/skill-activation.js";
|
|
6
|
+
import { clioStateDir } from "../core/xdg.js";
|
|
6
7
|
import type { AgentsContract } from "../domains/agents/contract.js";
|
|
7
8
|
import type { ClioKeybinding } from "../domains/config/keybindings.js";
|
|
8
9
|
import type { ContextState } from "../domains/context/index.js";
|
|
@@ -11,6 +12,8 @@ import type { ExtensionsContract } from "../domains/extensions/index.js";
|
|
|
11
12
|
import type { InteropContract } from "../domains/interop/index.js";
|
|
12
13
|
import type { TaskMemoryOperatorStatus } from "../domains/memory/index.js";
|
|
13
14
|
import { openDetachedBatchViews } from "../domains/middleware/index.js";
|
|
15
|
+
import type { MuxContract } from "../domains/mux/index.js";
|
|
16
|
+
import type { PanesOperations, PanesWatchController } from "../domains/mux/operations.js";
|
|
14
17
|
import type { ObservabilityContract } from "../domains/observability/index.js";
|
|
15
18
|
import type { ProvidersContract, ThinkingLevel } from "../domains/providers/index.js";
|
|
16
19
|
import type { ResourcesContract } from "../domains/resources/index.js";
|
|
@@ -39,8 +42,11 @@ import { createProcessInteractiveShell, getActiveRenderTrace } from "./interacti
|
|
|
39
42
|
import { createInteractiveSlashRuntime, resolveAvailableThinkingLevels } from "./interactive-slash-runtime.js";
|
|
40
43
|
import { createInteractiveSubscriptions } from "./interactive-subscriptions.js";
|
|
41
44
|
import { createInteractiveTickers } from "./interactive-tickers.js";
|
|
45
|
+
import type { createMuxBridge } from "./mux-bridge.js";
|
|
42
46
|
import { createOverlayLifecycle, type OverlayLifecycleController, type OverlayState } from "./overlay-lifecycle.js";
|
|
43
47
|
import { interopOverlaySurface } from "./overlays/interop.js";
|
|
48
|
+
import { paneWatchDecision } from "./pane-policy.js";
|
|
49
|
+
import { writeInputWedgeDump } from "./render-trace.js";
|
|
44
50
|
import { settleChatBeforeSessionSwitch } from "./session-switch-settlement.js";
|
|
45
51
|
import { createSessionTranscript } from "./session-transcript.js";
|
|
46
52
|
import type {
|
|
@@ -51,7 +57,9 @@ import type {
|
|
|
51
57
|
} from "./slash-commands.js";
|
|
52
58
|
import { processAutoPacingAllowed, resolveSmoothStreamingMode } from "./stream-pacing-policy.js";
|
|
53
59
|
import type { TerminalLease } from "./terminal-lease.js";
|
|
60
|
+
import type { createWatchPaneController } from "./watch-pane.js";
|
|
54
61
|
import { createWorkspaceFacts } from "./workspace-facts.js";
|
|
62
|
+
import type { createYaziBridge, YaziBridge } from "./yazi-bridge.js";
|
|
55
63
|
|
|
56
64
|
export {
|
|
57
65
|
IDLE_LEADER_STATE,
|
|
@@ -128,6 +136,36 @@ export interface InteractiveDeps {
|
|
|
128
136
|
extensions?: ExtensionsContract;
|
|
129
137
|
interop?: InteropContract;
|
|
130
138
|
share?: ShareContract;
|
|
139
|
+
/**
|
|
140
|
+
* Pane layer. A `none` contract still reaches the interactive surface so the
|
|
141
|
+
* files preset can use its terminal chooser; every mux operation remains
|
|
142
|
+
* best-effort and never reaches a dispatch or a turn.
|
|
143
|
+
*/
|
|
144
|
+
mux?: MuxContract;
|
|
145
|
+
/**
|
|
146
|
+
* Pane-layer operations behind `/panes` and the `panes` tool. Built by the
|
|
147
|
+
* composition root so the tool registry and this surface drive one instance.
|
|
148
|
+
*/
|
|
149
|
+
panes?: PanesOperations;
|
|
150
|
+
/**
|
|
151
|
+
* Factory seam for the dispatch-to-pane bridge, so a contract test can drive
|
|
152
|
+
* it without a TUI. Production leaves it unset and gets `createMuxBridge`.
|
|
153
|
+
*/
|
|
154
|
+
createMuxBridge?: typeof createMuxBridge;
|
|
155
|
+
/** Bind the file-pane return path after the composer and TUI exist. */
|
|
156
|
+
attachYaziBridge?: (bridge: YaziBridge) => () => void;
|
|
157
|
+
/**
|
|
158
|
+
* Watch-pane factory from the `--with-panes` composition root; absent on a
|
|
159
|
+
* plain boot. The controller it builds backs Enter in the workers view.
|
|
160
|
+
*/
|
|
161
|
+
createWatchPane?: typeof createWatchPaneController;
|
|
162
|
+
/** Bind the watch controller into the shared PanesOperations for `/panes show`. */
|
|
163
|
+
attachWatchPane?: (controller: PanesWatchController) => () => void;
|
|
164
|
+
/**
|
|
165
|
+
* File-pane factory. Supplied by the `--with-panes` composition root (or a
|
|
166
|
+
* contract test); absent on a plain boot, which therefore loads no yazi code.
|
|
167
|
+
*/
|
|
168
|
+
createYaziBridge?: typeof createYaziBridge;
|
|
131
169
|
/**
|
|
132
170
|
* Shared tool registry. When wired, the permission overlay opens automatically
|
|
133
171
|
* whenever a tool call is parked waiting for operator confirmation, and the
|
|
@@ -171,12 +209,19 @@ export interface InteractiveDeps {
|
|
|
171
209
|
registerAskUserHandler?: (handler: AskUserHandler) => () => void;
|
|
172
210
|
/** Live CLIO-CODER.md and memory state for the footer Context quadrant. */
|
|
173
211
|
getContextState?: (cwd?: string) => ContextState;
|
|
174
|
-
/**
|
|
175
|
-
|
|
212
|
+
/**
|
|
213
|
+
* Persist a thinking level set by `/thinking <level>` or `/model <pattern>:<level>`.
|
|
214
|
+
* Scope "session" leaves settings.yaml alone; omitted means the historical
|
|
215
|
+
* write-through, which is what the Shift+Tab cycle and `/thinking` still want.
|
|
216
|
+
*/
|
|
217
|
+
onSetThinkingLevel?: (level: ThinkingLevel, scope?: "session" | "global") => void;
|
|
176
218
|
/** Persist the next thinking level when Shift+Tab is pressed. */
|
|
177
219
|
onCycleThinking?: () => void;
|
|
178
|
-
/**
|
|
179
|
-
|
|
220
|
+
/**
|
|
221
|
+
* Apply the orchestrator target selected in /model at the scope the operator
|
|
222
|
+
* chose. "session" routes this session only and never touches settings.yaml.
|
|
223
|
+
*/
|
|
224
|
+
onSelectModel?: (ref: { target: string; model: string }, scope: "session" | "global") => void;
|
|
180
225
|
/** Write handler the /settings overlay uses to persist cycled values. */
|
|
181
226
|
writeSettings?: (next: ClioSettings) => void;
|
|
182
227
|
/**
|
|
@@ -429,6 +474,21 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
429
474
|
});
|
|
430
475
|
const { terminal, tui } = shell;
|
|
431
476
|
const renderTrace = getActiveRenderTrace();
|
|
477
|
+
// SIGTERM is the kill an operator reaches for when a pane stops answering, so
|
|
478
|
+
// it is where the always-on input-wedge ring has to land (#224). It writes
|
|
479
|
+
// synchronously from its own listener rather than from a termination hook: a
|
|
480
|
+
// session wedged badly enough to be killed may never reach the coordinator's
|
|
481
|
+
// asynchronous drain, and this dump has to survive that.
|
|
482
|
+
const dumpInputWedgeOnTerminate = renderTrace
|
|
483
|
+
? (): void => {
|
|
484
|
+
try {
|
|
485
|
+
writeInputWedgeDump(clioStateDir(), renderTrace.snapshotInputWedge());
|
|
486
|
+
} catch {
|
|
487
|
+
// Best effort. The process is ending either way.
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
: null;
|
|
491
|
+
if (dumpInputWedgeOnTerminate) process.on("SIGTERM", dumpInputWedgeOnTerminate);
|
|
432
492
|
const visibleEventIngress = new WeakMap<
|
|
433
493
|
object,
|
|
434
494
|
{ sequence: number; traceSequence: number; generation: number; ingressAt: number }
|
|
@@ -498,6 +558,11 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
498
558
|
getLeaderArmed: () => leaderArmed,
|
|
499
559
|
getShutdownArmed: () => shutdownArmed,
|
|
500
560
|
isAwaitingApproval: () => overlayLifecycle?.getState() === "permission-confirm",
|
|
561
|
+
getPermissionInspection: () => {
|
|
562
|
+
if (overlayLifecycle === undefined || overlayLifecycle === null) return "none";
|
|
563
|
+
if (!overlayLifecycle.canInspectMutation()) return "none";
|
|
564
|
+
return overlayLifecycle.isInspectingMutation() ? "open" : "closed";
|
|
565
|
+
},
|
|
501
566
|
resolveVisibleEventSequence: (event) => visibleEventIngress.get(event)?.traceSequence ?? null,
|
|
502
567
|
resolveStreamIngress: (event) => visibleEventIngress.get(event) ?? null,
|
|
503
568
|
commitFrame: (reason) => shell.commitCurrentFrame(reason === "teardown" ? 300 : 30_000),
|
|
@@ -545,6 +610,31 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
545
610
|
chatRenderer,
|
|
546
611
|
io,
|
|
547
612
|
} = presentation;
|
|
613
|
+
// The factory arrives only from an active `--with-panes` boot (or a test); a
|
|
614
|
+
// plain session has no deps.panes and no factory, and loads no yazi code.
|
|
615
|
+
const yaziBridge =
|
|
616
|
+
deps.panes && deps.createYaziBridge
|
|
617
|
+
? deps.createYaziBridge({
|
|
618
|
+
...(deps.mux ? { mux: deps.mux } : {}),
|
|
619
|
+
getDraft: () => editor.getText(),
|
|
620
|
+
setDraft: (text) => editor.setText(text),
|
|
621
|
+
requestRender: () => tui.requestRender(),
|
|
622
|
+
notice: (level, text) => notify(level, text, `yazi:${level}`),
|
|
623
|
+
getCwd: () => process.cwd(),
|
|
624
|
+
getSettings: () =>
|
|
625
|
+
deps.getSettings?.().panes.yazi ?? {
|
|
626
|
+
mode: "companion",
|
|
627
|
+
profile: "managed",
|
|
628
|
+
followCwd: true,
|
|
629
|
+
},
|
|
630
|
+
stopUi: () => tui.stop(),
|
|
631
|
+
startUi: () => {
|
|
632
|
+
tui.start();
|
|
633
|
+
tui.requestRender(true);
|
|
634
|
+
},
|
|
635
|
+
})
|
|
636
|
+
: null;
|
|
637
|
+
const detachYaziBridge = yaziBridge ? deps.attachYaziBridge?.(yaziBridge) : undefined;
|
|
548
638
|
refreshPresentationFooter = () => footer.refresh();
|
|
549
639
|
const agentProgress = createAgentProgress(terminal);
|
|
550
640
|
// Desktop notifications are a protocol write on the terminal owner, issued
|
|
@@ -618,7 +708,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
618
708
|
chat: deps.chat,
|
|
619
709
|
chatPanel: {
|
|
620
710
|
appendReplayBlock: (...args) => chatRenderer.mutate(() => chatPanel.appendReplayBlock(...args), "slash-output"),
|
|
621
|
-
appendUser: (text) => chatRenderer.mutate(() => chatPanel.appendUser(text), "user-submit"),
|
|
711
|
+
appendUser: (text, status) => chatRenderer.mutate(() => chatPanel.appendUser(text, status), "user-submit"),
|
|
622
712
|
clearFoldOverrides: () => chatRenderer.mutate(() => chatPanel.clearFoldOverrides(), "output-detail"),
|
|
623
713
|
},
|
|
624
714
|
beforeSemanticSubmit: () => chatRenderer.flush(),
|
|
@@ -659,7 +749,9 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
659
749
|
openMemory: () => openMemoryOverlayState(),
|
|
660
750
|
...(deps.seedTaskMemory ? { seedTaskMemory: deps.seedTaskMemory } : {}),
|
|
661
751
|
openView: (filter) => openViewOverlayState(filter),
|
|
752
|
+
...(deps.panes ? { panes: deps.panes } : {}),
|
|
662
753
|
openModel: () => openModelOverlayState(),
|
|
754
|
+
openModelScope: (ref) => openModelScopeState(ref),
|
|
663
755
|
openSettings: (section, rowId) => openSettingsOverlayState(section, rowId),
|
|
664
756
|
openResume: () => openResumeOverlayState(),
|
|
665
757
|
startNewSession: () => startNewSession(),
|
|
@@ -767,6 +859,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
767
859
|
openMemoryOverlayState,
|
|
768
860
|
openViewOverlayState,
|
|
769
861
|
openModelOverlayState,
|
|
862
|
+
openModelScopeState,
|
|
770
863
|
openSettingsOverlayState,
|
|
771
864
|
openResumeOverlayState,
|
|
772
865
|
openTreeOverlayState,
|
|
@@ -844,6 +937,64 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
844
937
|
};
|
|
845
938
|
notify(outcome.ok ? "success" : "info", outcome.message, "dispatch:background");
|
|
846
939
|
};
|
|
940
|
+
// Built only when a pane host answered detection, so a session with no
|
|
941
|
+
// panes subscribes to nothing and the bus handlers do not exist at all.
|
|
942
|
+
// The factories arrive from the `--with-panes` composition root (or a
|
|
943
|
+
// test); a plain session loads none of the bridge code.
|
|
944
|
+
const mux = deps.mux;
|
|
945
|
+
const muxBridge =
|
|
946
|
+
mux && mux.mode !== "none" && deps.createMuxBridge
|
|
947
|
+
? deps.createMuxBridge({
|
|
948
|
+
bus: deps.bus,
|
|
949
|
+
mux,
|
|
950
|
+
notificationsPolicy: () => deps.getSettings?.().panes.notifications ?? "failures",
|
|
951
|
+
log: (level, message) => {
|
|
952
|
+
if (level === "warning") notify("warning", message, "mux:bridge");
|
|
953
|
+
},
|
|
954
|
+
notice: (level, text) => appendNotice(level, text, busNoticeSink),
|
|
955
|
+
})
|
|
956
|
+
: null;
|
|
957
|
+
// The workers-view watch pane: opened on Enter over a live run, retargeted
|
|
958
|
+
// by arrow keys through its selection file. `/panes show` and the panes
|
|
959
|
+
// tool drive the same controller through the shared operations object.
|
|
960
|
+
const watchPane =
|
|
961
|
+
mux && mux.mode !== "none" && deps.createWatchPane
|
|
962
|
+
? deps.createWatchPane({ mux, getCwd: () => process.cwd() })
|
|
963
|
+
: null;
|
|
964
|
+
const detachWatchPane = watchPane ? deps.attachWatchPane?.(watchPane) : undefined;
|
|
965
|
+
const selectedWatchableRun = (): { runId: string; agentId: string } | null => {
|
|
966
|
+
if (!watchPane) return null;
|
|
967
|
+
const row = dispatchBoard.selectedRow();
|
|
968
|
+
if (!row) return null;
|
|
969
|
+
const decision = paneWatchDecision({ source: "workers-view", runStatus: row.status });
|
|
970
|
+
return decision.open ? { runId: row.runId, agentId: row.agentId } : null;
|
|
971
|
+
};
|
|
972
|
+
/**
|
|
973
|
+
* Enter in the workers view. True means the watch pane took the key; false
|
|
974
|
+
* (panes off, nothing watchable under the policy) falls back to the inline
|
|
975
|
+
* worker-progress detail, so a terminal run's Enter still expands its card.
|
|
976
|
+
*/
|
|
977
|
+
const watchSelectedDispatch = (): boolean => {
|
|
978
|
+
const selected = selectedWatchableRun();
|
|
979
|
+
if (!watchPane || !selected) return false;
|
|
980
|
+
void watchPane.watch(selected.runId).then((result) => {
|
|
981
|
+
if (result.status === "watching") {
|
|
982
|
+
if (result.opened) {
|
|
983
|
+
notify("success", `watching ${selected.agentId} (${selected.runId}) in a pane`, "panes:watch");
|
|
984
|
+
}
|
|
985
|
+
} else {
|
|
986
|
+
notify("warning", result.reason, "panes:watch");
|
|
987
|
+
}
|
|
988
|
+
tui.requestRender();
|
|
989
|
+
});
|
|
990
|
+
return true;
|
|
991
|
+
};
|
|
992
|
+
/** Arrow keys: the watch pane follows the cursor, but only once it exists. */
|
|
993
|
+
const followBoardSelection = (): void => {
|
|
994
|
+
if (!watchPane?.isOpen()) return;
|
|
995
|
+
const selected = selectedWatchableRun();
|
|
996
|
+
if (selected) watchPane.follow(selected.runId);
|
|
997
|
+
};
|
|
847
998
|
const interactiveSubscriptions = createInteractiveSubscriptions({
|
|
848
999
|
bus: deps.bus,
|
|
849
1000
|
refreshFooter: () => footer.refresh(),
|
|
@@ -894,7 +1045,18 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
894
1045
|
onShutdownArmedChange: (armed) => {
|
|
895
1046
|
shutdownArmed = armed;
|
|
896
1047
|
},
|
|
897
|
-
dispatchBoard
|
|
1048
|
+
dispatchBoard: {
|
|
1049
|
+
selectPrevious: () => {
|
|
1050
|
+
dispatchBoard.selectPrevious();
|
|
1051
|
+
followBoardSelection();
|
|
1052
|
+
},
|
|
1053
|
+
selectNext: () => {
|
|
1054
|
+
dispatchBoard.selectNext();
|
|
1055
|
+
followBoardSelection();
|
|
1056
|
+
},
|
|
1057
|
+
toggleDetail: () => dispatchBoard.toggleDetail(),
|
|
1058
|
+
},
|
|
1059
|
+
watchSelectedDispatch,
|
|
898
1060
|
steerSelectedDispatch,
|
|
899
1061
|
cancelSelectedDispatch,
|
|
900
1062
|
cancelActiveEditorBash: () => editorSubmit.cancelActiveEditorBash(),
|
|
@@ -933,7 +1095,14 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
933
1095
|
disposeOverlay: overlayLifecycle.dispose,
|
|
934
1096
|
stopAgentProgress: agentProgress.stop,
|
|
935
1097
|
disposeChat: () => deps.chat.dispose(),
|
|
936
|
-
disposeSubscriptions:
|
|
1098
|
+
disposeSubscriptions: () => {
|
|
1099
|
+
detachYaziBridge?.();
|
|
1100
|
+
yaziBridge?.dispose();
|
|
1101
|
+
detachWatchPane?.();
|
|
1102
|
+
watchPane?.dispose();
|
|
1103
|
+
muxBridge?.dispose();
|
|
1104
|
+
interactiveSubscriptions.dispose();
|
|
1105
|
+
},
|
|
937
1106
|
},
|
|
938
1107
|
beforeStopUi: (() => {
|
|
939
1108
|
let settlement: Promise<void> | null = null;
|
|
@@ -949,6 +1118,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
949
1118
|
cancelParkedCalls: (reason) => deps.toolRegistry?.cancelParkedCalls(reason),
|
|
950
1119
|
onShutdown: async () => {
|
|
951
1120
|
try {
|
|
1121
|
+
if (dumpInputWedgeOnTerminate) process.off("SIGTERM", dumpInputWedgeOnTerminate);
|
|
952
1122
|
await deps.onShutdown();
|
|
953
1123
|
} finally {
|
|
954
1124
|
if (lease) await lease.close();
|
|
@@ -60,6 +60,10 @@ export interface InteractiveInputRuntimeDeps {
|
|
|
60
60
|
closeOverlay(): void;
|
|
61
61
|
confirmPermission(): void;
|
|
62
62
|
stopTurnFromPermission(): void;
|
|
63
|
+
canInspectMutation(): boolean;
|
|
64
|
+
isInspectingMutation(): boolean;
|
|
65
|
+
toggleMutationInspection(): void;
|
|
66
|
+
scrollMutationInspection(delta: number): void;
|
|
63
67
|
cancelAskUser(): void;
|
|
64
68
|
toggleFooterDashboardState(): void;
|
|
65
69
|
toggleDispatchBoardOverlay(): void;
|
|
@@ -78,6 +82,8 @@ export interface InteractiveInputRuntimeDeps {
|
|
|
78
82
|
selectNext(): void;
|
|
79
83
|
toggleDetail(): void;
|
|
80
84
|
};
|
|
85
|
+
/** Enter in the workers view; false falls through to the detail toggle. */
|
|
86
|
+
watchSelectedDispatch: () => boolean;
|
|
81
87
|
steerSelectedDispatch: () => void;
|
|
82
88
|
cancelSelectedDispatch: () => void;
|
|
83
89
|
cancelActiveEditorBash: () => boolean;
|
|
@@ -213,6 +219,10 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
|
|
|
213
219
|
confirmPermission: () => deps.overlay.confirmPermission(),
|
|
214
220
|
stopTurnFromPermission: () => deps.overlay.stopTurnFromPermission(),
|
|
215
221
|
composerHasDraft: () => deps.editor.getText().length > 0,
|
|
222
|
+
canInspectMutation: () => deps.overlay.canInspectMutation(),
|
|
223
|
+
isInspectingMutation: () => deps.overlay.isInspectingMutation(),
|
|
224
|
+
toggleMutationInspection: () => deps.overlay.toggleMutationInspection(),
|
|
225
|
+
scrollMutationInspection: (delta) => deps.overlay.scrollMutationInspection(delta),
|
|
216
226
|
editDraft: (data) => {
|
|
217
227
|
deps.editor.handleInput?.(data);
|
|
218
228
|
deps.requestRender();
|
|
@@ -230,6 +240,11 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
|
|
|
230
240
|
deps.dispatchBoard.toggleDetail();
|
|
231
241
|
deps.requestRender();
|
|
232
242
|
},
|
|
243
|
+
watchSelectedDispatch: () => {
|
|
244
|
+
const handled = deps.watchSelectedDispatch();
|
|
245
|
+
if (handled) deps.requestRender();
|
|
246
|
+
return handled;
|
|
247
|
+
},
|
|
233
248
|
steerSelectedDispatch: deps.steerSelectedDispatch,
|
|
234
249
|
cancelSelectedDispatch: deps.cancelSelectedDispatch,
|
|
235
250
|
cancelAskUser: () => deps.overlay.cancelAskUser(),
|
|
@@ -99,6 +99,8 @@ export interface InteractivePresentationDeps {
|
|
|
99
99
|
getShutdownArmed?: () => boolean;
|
|
100
100
|
/** Whether a permission prompt owns the keyboard, for the composer's CONFIRM rail. */
|
|
101
101
|
isAwaitingApproval?: () => boolean;
|
|
102
|
+
/** Whether that prompt has a mutation to inspect, and whether it is open (issue #254). */
|
|
103
|
+
getPermissionInspection?: () => import("./permission-hint.js").PermissionInspectionHint;
|
|
102
104
|
getCwd?: () => string;
|
|
103
105
|
resolveVisibleEventSequence?: (event: ChatLoopEvent) => number | null;
|
|
104
106
|
resolveStreamIngress?: (
|
|
@@ -418,6 +420,8 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
|
|
|
418
420
|
},
|
|
419
421
|
isStreaming: () => deps.chat.isStreaming(),
|
|
420
422
|
...(deps.isAwaitingApproval ? { isAwaitingApproval: deps.isAwaitingApproval } : {}),
|
|
423
|
+
...(deps.getPermissionInspection ? { getPermissionInspection: deps.getPermissionInspection } : {}),
|
|
424
|
+
getTurnPreparation: () => deps.chat.turnPreparation().phase,
|
|
421
425
|
willEnterSteer: (text) => willEnterSteerActiveWork(deps, text),
|
|
422
426
|
getSubmitKeyLabel: () => formatKeyLabel(keybindings.getKeys("tui.input.submit")[0], "Enter"),
|
|
423
427
|
getNewlineKeyLabel: () => formatKeyLabel(keybindings.getKeys("tui.input.newLine")[0], "Shift+Enter"),
|
|
@@ -158,9 +158,11 @@ export function createInteractiveShell<TTerminal extends Terminal, TTui extends
|
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
/**
|
|
161
|
-
* Trace for the current process, created once
|
|
162
|
-
*
|
|
163
|
-
*
|
|
161
|
+
* Trace for the current process, created once per interactive shell. It writes
|
|
162
|
+
* a JSONL file when CLIO_CODER_RENDER_TRACE names one and otherwise keeps only
|
|
163
|
+
* its bounded input-wedge ring in memory. The panel wires its render metrics
|
|
164
|
+
* into the same instance, so the frame rows carry both the build cost and the
|
|
165
|
+
* write cost.
|
|
164
166
|
*/
|
|
165
167
|
let activeRenderTrace: RenderTrace | null = null;
|
|
166
168
|
|
|
@@ -203,20 +205,21 @@ export function createProcessInteractiveShell(
|
|
|
203
205
|
let restoreRoot: (() => void) | null = null;
|
|
204
206
|
let backpressure: StdoutBackpressureGate | null = null;
|
|
205
207
|
let observedBackpressure = false;
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}
|
|
219
|
-
|
|
208
|
+
let candidate: RenderTrace | null = null;
|
|
209
|
+
try {
|
|
210
|
+
// A null path is the ring-only mode: no file, but the input-wedge ring still
|
|
211
|
+
// fills, because the operator who hits a wedge did not arm a trace before it
|
|
212
|
+
// happened (#224).
|
|
213
|
+
candidate = createRenderTrace(tracePath);
|
|
214
|
+
restoreStdout = traceProcessStdout(candidate);
|
|
215
|
+
activeRenderTrace = candidate;
|
|
216
|
+
} catch {
|
|
217
|
+
// A diagnostics path must never prevent the interactive application from starting.
|
|
218
|
+
restoreStdout?.();
|
|
219
|
+
restoreStdout = null;
|
|
220
|
+
void candidate?.close().catch(() => {});
|
|
221
|
+
activeRenderTrace = null;
|
|
222
|
+
}
|
|
220
223
|
const trace = activeRenderTrace;
|
|
221
224
|
if (trace && options.onFirstFrameCommit) trace.onFirstFrameCommit(options.onFirstFrameCommit);
|
|
222
225
|
let firstFrameDelivered = false;
|
|
@@ -9,6 +9,7 @@ import type { AgentsContract } from "../domains/agents/contract.js";
|
|
|
9
9
|
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
10
10
|
import { agentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
|
|
11
11
|
import type { ExtensionsContract } from "../domains/extensions/index.js";
|
|
12
|
+
import type { PanesOperations } from "../domains/mux/operations.js";
|
|
12
13
|
import {
|
|
13
14
|
type ProvidersContract,
|
|
14
15
|
type ResolvedThinkingCapability,
|
|
@@ -36,6 +37,7 @@ import { runOperatorRecall } from "./context-recall-command.js";
|
|
|
36
37
|
import { renderSessionHtml } from "./export-html/index.js";
|
|
37
38
|
import { dateLocal } from "./format-time.js";
|
|
38
39
|
import type { OracleDigestSources } from "./oracle.js";
|
|
40
|
+
import type { PendingModelScope } from "./overlays/model-scope.js";
|
|
39
41
|
import type { SettingsCenterRowId, SettingsSectionId } from "./overlays/settings.js";
|
|
40
42
|
import {
|
|
41
43
|
type ContextClearCommandOptions,
|
|
@@ -48,7 +50,7 @@ import {
|
|
|
48
50
|
type SlashCommandDispatchResult,
|
|
49
51
|
type TaskMemorySeedCommandResult,
|
|
50
52
|
} from "./slash-commands.js";
|
|
51
|
-
import {
|
|
53
|
+
import { verifyReceiptFileReport } from "./view/artifacts.js";
|
|
52
54
|
import type { WorkerEntryState } from "./worker-stream.js";
|
|
53
55
|
|
|
54
56
|
const EXPORT_RENDER_WIDTH = 100;
|
|
@@ -62,6 +64,7 @@ export interface InteractiveSlashSubmitExpansion {
|
|
|
62
64
|
|
|
63
65
|
type SlashChat = Pick<ChatLoop, "getSessionId" | "isStreaming" | "submit">;
|
|
64
66
|
type SlashChatPanel = Pick<ChatPanel, "appendReplayBlock" | "appendUser" | "clearFoldOverrides">;
|
|
67
|
+
type UserTurnStatus = import("./chat-panel.js").UserTurnStatus;
|
|
65
68
|
type SlashResources = Pick<ResourcesContract, "prompts" | "expandPromptTemplate" | "reload">;
|
|
66
69
|
type SlashExtensions = Pick<ExtensionsContract, "list">;
|
|
67
70
|
type SlashAgents = Pick<AgentsContract, "getSpec" | "listSpecs">;
|
|
@@ -88,8 +91,8 @@ export interface InteractiveSlashRuntimeDeps {
|
|
|
88
91
|
* making a value permanent stays the Settings overlay's explicit choice.
|
|
89
92
|
*/
|
|
90
93
|
commitSetting?: (id: string, next: ClioSettings, scope: "session" | "global") => void;
|
|
91
|
-
onSelectModel?: (ref: { target: string; model: string }) => void;
|
|
92
|
-
onSetThinkingLevel?: (level: ThinkingLevel) => void;
|
|
94
|
+
onSelectModel?: (ref: { target: string; model: string }, scope: "session" | "global") => void;
|
|
95
|
+
onSetThinkingLevel?: (level: ThinkingLevel, scope?: "session" | "global") => void;
|
|
93
96
|
onCompact?: (instructions: string | undefined) => Promise<void>;
|
|
94
97
|
onInit?: (options: InitCommandOptions, io?: RunIo) => Promise<void>;
|
|
95
98
|
onContextClear?: (options: ContextClearCommandOptions) => Promise<void>;
|
|
@@ -134,7 +137,14 @@ export interface InteractiveSlashRuntimeDeps {
|
|
|
134
137
|
openMemory: () => void;
|
|
135
138
|
seedTaskMemory?: () => TaskMemorySeedCommandResult;
|
|
136
139
|
openView: (filter?: string) => void;
|
|
140
|
+
/** Pane-layer operations behind `/panes`. Absent when the mux resolved to `none`. */
|
|
141
|
+
panes?: PanesOperations;
|
|
137
142
|
openModel: () => void;
|
|
143
|
+
/**
|
|
144
|
+
* Ask where a resolved `/model <pattern>` swap lands before anything applies.
|
|
145
|
+
* Absent on a host with no overlay layer, where the swap stays session-scoped.
|
|
146
|
+
*/
|
|
147
|
+
openModelScope?: (ref: PendingModelScope) => void;
|
|
138
148
|
openSettings: (section?: SettingsSectionId, rowId?: SettingsCenterRowId) => void;
|
|
139
149
|
openResume: () => void;
|
|
140
150
|
startNewSession: () => void;
|
|
@@ -199,6 +209,7 @@ export function resolveAvailableThinkingLevels(
|
|
|
199
209
|
export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps): InteractiveSlashRuntime {
|
|
200
210
|
let activeContextInit = false;
|
|
201
211
|
let latestAdmission: Promise<void> = Promise.resolve();
|
|
212
|
+
let latestLocalOperation: Promise<void> = Promise.resolve();
|
|
202
213
|
let activeAdmissionSignal: AbortSignal | undefined;
|
|
203
214
|
const cwd = (): string => deps.getCwd?.() ?? process.cwd();
|
|
204
215
|
const resources = deps.resources;
|
|
@@ -245,9 +256,13 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
245
256
|
const willQueue = deps.chat.isStreaming();
|
|
246
257
|
deps.recordSubmittedTurn();
|
|
247
258
|
deps.refreshFooter();
|
|
248
|
-
|
|
259
|
+
// The row is painted now, so the operator sees their prompt land, but
|
|
260
|
+
// it is marked pending until the durable append at admission: nothing
|
|
261
|
+
// is in the ledger yet, and a refused preflight must not leave a row
|
|
262
|
+
// that reads like a committed turn (issue #251).
|
|
263
|
+
let rowStatus: UserTurnStatus = "pending";
|
|
264
|
+
if (!willQueue) deps.chatPanel.appendUser(sub.text, () => rowStatus);
|
|
249
265
|
deps.requestRender();
|
|
250
|
-
deps.beforeSemanticSubmit?.();
|
|
251
266
|
let acknowledgeAdmission = (): void => {};
|
|
252
267
|
const admitted = new Promise<void>((resolve) => {
|
|
253
268
|
acknowledgeAdmission = resolve;
|
|
@@ -257,7 +272,19 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
257
272
|
...(sub.workingContextPaths.length > 0 ? { workingContextPaths: sub.workingContextPaths } : {}),
|
|
258
273
|
...(sub.pendingSkillRequests.length > 0 ? { pendingSkillRequests: sub.pendingSkillRequests } : {}),
|
|
259
274
|
...(awaitAdmission && willQueue ? { steering: "end-of-turn" as const } : {}),
|
|
260
|
-
...(
|
|
275
|
+
...(!willQueue
|
|
276
|
+
? {
|
|
277
|
+
onPreparationVisible: async () => {
|
|
278
|
+
deps.beforeSemanticSubmit?.();
|
|
279
|
+
await deps.settleVisibleFrame?.("submit-preparing");
|
|
280
|
+
},
|
|
281
|
+
}
|
|
282
|
+
: {}),
|
|
283
|
+
onAdmitted: () => {
|
|
284
|
+
rowStatus = "committed";
|
|
285
|
+
deps.requestRender();
|
|
286
|
+
if (awaitAdmission) acknowledgeAdmission();
|
|
287
|
+
},
|
|
261
288
|
});
|
|
262
289
|
const settlement = turn
|
|
263
290
|
.then(() => deps.settleVisibleFrame?.("submit-return"))
|
|
@@ -265,7 +292,13 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
265
292
|
const msg = err instanceof Error ? err.message : String(err);
|
|
266
293
|
deps.io.stderr(`[interactive] chat failed: ${msg}\n`);
|
|
267
294
|
})
|
|
268
|
-
.finally(
|
|
295
|
+
.finally(() => {
|
|
296
|
+
// Settlement without admission is a refusal: the probe failed, the
|
|
297
|
+
// overflow preflight blocked the request, or the submit became a
|
|
298
|
+
// steer. Say so on the row rather than leaving a phantom turn.
|
|
299
|
+
if (rowStatus === "pending") rowStatus = willQueue ? "committed" : "refused";
|
|
300
|
+
deps.requestRender();
|
|
301
|
+
});
|
|
269
302
|
return awaitAdmission ? Promise.race([admitted, settlement]) : settlement;
|
|
270
303
|
} catch (err) {
|
|
271
304
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -413,6 +446,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
413
446
|
return result;
|
|
414
447
|
},
|
|
415
448
|
openView: deps.openView,
|
|
449
|
+
...(deps.panes ? { panes: deps.panes } : {}),
|
|
416
450
|
setThinkingLevel: (level) => {
|
|
417
451
|
const settings = deps.getSettings?.();
|
|
418
452
|
if (!settings || !deps.onSetThinkingLevel) return { status: "unavailable" };
|
|
@@ -462,9 +496,20 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
462
496
|
openModel: deps.openModel,
|
|
463
497
|
providers: deps.providers,
|
|
464
498
|
applyModelRef: (ref) => {
|
|
465
|
-
|
|
466
|
-
|
|
499
|
+
// A mid-conversation swap used to rewrite the orchestrator role in
|
|
500
|
+
// settings.yaml with no prompt, so the next launch could come up on a
|
|
501
|
+
// dead endpoint (smoke pass 2, G3). The scope dialog owns the commit
|
|
502
|
+
// now, and it applies nothing until the operator answers.
|
|
503
|
+
if (deps.openModelScope) {
|
|
504
|
+
deps.openModelScope(ref);
|
|
505
|
+
return "pending";
|
|
506
|
+
}
|
|
507
|
+
// No overlay layer to ask with: session scope is the answer that cannot
|
|
508
|
+
// outlive the session that chose it.
|
|
509
|
+
deps.onSelectModel?.({ target: ref.target, model: ref.model }, "session");
|
|
510
|
+
if (ref.thinkingLevel) deps.onSetThinkingLevel?.(ref.thinkingLevel, "session");
|
|
467
511
|
deps.requestRender();
|
|
512
|
+
return "applied";
|
|
468
513
|
},
|
|
469
514
|
openSettings: deps.openSettings,
|
|
470
515
|
openResume: deps.openResume,
|
|
@@ -611,7 +656,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
611
656
|
})
|
|
612
657
|
.finally(deps.requestRender);
|
|
613
658
|
},
|
|
614
|
-
verifyReceipt: (runId) =>
|
|
659
|
+
verifyReceipt: (runId) => verifyReceiptFileReport(deps.stateDir, runId),
|
|
615
660
|
...(deps.listWorkerRuns ? { listWorkerRuns: deps.listWorkerRuns } : {}),
|
|
616
661
|
// The user-turn path, minus expansion. A worker's answer is literal text:
|
|
617
662
|
// running it through the prompt, skill, and @file expanders would let a
|
|
@@ -621,6 +666,9 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
621
666
|
latestAdmission = admitChat(text, activeAdmissionSignal);
|
|
622
667
|
void latestAdmission;
|
|
623
668
|
},
|
|
669
|
+
runLocalOperation: (operation) => {
|
|
670
|
+
latestLocalOperation = latestLocalOperation.catch(() => undefined).then(operation);
|
|
671
|
+
},
|
|
624
672
|
render: deps.requestRender,
|
|
625
673
|
};
|
|
626
674
|
|
|
@@ -630,8 +678,12 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
630
678
|
dispatchCommand: (text) => dispatchSlashCommand(parseSlashCommand(text), context),
|
|
631
679
|
admitCommand: async (text, signal) => {
|
|
632
680
|
signal?.throwIfAborted();
|
|
681
|
+
// Pane opens and focus changes mutate a remote registry. A following
|
|
682
|
+
// slash read must observe their settled state, just as the tool path does.
|
|
683
|
+
await latestLocalOperation;
|
|
633
684
|
const command = parseSlashCommand(text);
|
|
634
685
|
const before = latestAdmission;
|
|
686
|
+
const localBefore = latestLocalOperation;
|
|
635
687
|
const previousSignal = activeAdmissionSignal;
|
|
636
688
|
activeAdmissionSignal = signal;
|
|
637
689
|
try {
|
|
@@ -640,6 +692,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
640
692
|
activeAdmissionSignal = previousSignal;
|
|
641
693
|
}
|
|
642
694
|
if (latestAdmission !== before) await latestAdmission;
|
|
695
|
+
if (latestLocalOperation !== localBefore) await latestLocalOperation;
|
|
643
696
|
},
|
|
644
697
|
};
|
|
645
698
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
describeTaskMemoryActivity,
|
|
3
|
+
formatTaskMemorySpend,
|
|
3
4
|
type MemoryProposalResult,
|
|
4
5
|
type MemoryRecord,
|
|
5
6
|
type TaskMemoryActivityEvent,
|
|
@@ -38,6 +39,12 @@ export function formatMemoryStatusLine(status: TaskMemoryOperatorStatus, content
|
|
|
38
39
|
theme.fg("muted", `last ${status.lastDecision ?? "none"}`),
|
|
39
40
|
];
|
|
40
41
|
if (status.stepInFlight) units.push(theme.fg("reason", "step running"));
|
|
42
|
+
// Lifetime cost of the background plane, beside the state of the current
|
|
43
|
+
// session. The tier spent 137,205 tokens over 14 days on the operator's own
|
|
44
|
+
// machine before any surface said so (#229), and a hit rate is the one figure
|
|
45
|
+
// that says whether that spend is buying anything.
|
|
46
|
+
const spend = status.spend === null || status.spend === undefined ? "" : formatTaskMemorySpend(status.spend);
|
|
47
|
+
if (spend.length > 0) units.push(theme.fg("dim", spend));
|
|
41
48
|
return fitUnits(theme, "", units, width);
|
|
42
49
|
}
|
|
43
50
|
|
|
@@ -172,6 +179,7 @@ function memorySignature(status: TaskMemoryOperatorStatus, records: ReadonlyArra
|
|
|
172
179
|
String(status.size),
|
|
173
180
|
status.lastDecision ?? "none",
|
|
174
181
|
status.stepInFlight ? "running" : "idle",
|
|
182
|
+
`${status.spend?.llmSteps ?? 0}:${status.spend?.injections ?? 0}:${status.spend?.totalTokens ?? 0}`,
|
|
175
183
|
];
|
|
176
184
|
for (const record of records) parts.push(`r:${record.id}:${record.approved}:${record.rejectedAt ?? ""}`);
|
|
177
185
|
for (const entry of bankEntries(status.bank)) {
|
|
@@ -350,6 +358,7 @@ export function openMemoryOverlay(
|
|
|
350
358
|
const handle = showClioOverlayFrame(tui, view, {
|
|
351
359
|
anchor: "center",
|
|
352
360
|
width: MEMORY_OVERLAY_WIDTH,
|
|
361
|
+
markerId: "memory",
|
|
353
362
|
title: () => "Memory",
|
|
354
363
|
footerHint: () => view.getHint(),
|
|
355
364
|
});
|