@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
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
5
|
+
import { clioCacheDir } from "../core/xdg.js";
|
|
6
|
+
import type { MuxContract } from "../domains/mux/index.js";
|
|
7
|
+
import type { YaziEvent } from "../domains/mux/yazi/event-stream.js";
|
|
8
|
+
import { ensureYaziProfile, yaziProfileDir } from "../domains/mux/yazi/profile.js";
|
|
9
|
+
import {
|
|
10
|
+
createYaziSession,
|
|
11
|
+
resolveYaziBinaries,
|
|
12
|
+
type YaziProfileMode,
|
|
13
|
+
type YaziResolvedBinaries,
|
|
14
|
+
type YaziSession,
|
|
15
|
+
type YaziSessionMode,
|
|
16
|
+
type YaziSessionOpenResult,
|
|
17
|
+
type YaziSessionOptions,
|
|
18
|
+
} from "../domains/mux/yazi/session.js";
|
|
19
|
+
|
|
20
|
+
export const YAZI_PICK_MAX_PATHS = 32;
|
|
21
|
+
export const YAZI_PICK_MAX_CHARS = 4096;
|
|
22
|
+
export const YAZI_LIVENESS_MS = 5000;
|
|
23
|
+
|
|
24
|
+
export interface YaziBridgeSettings {
|
|
25
|
+
mode: YaziSessionMode;
|
|
26
|
+
profile: YaziProfileMode;
|
|
27
|
+
followCwd: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface YaziMentionBatch {
|
|
31
|
+
text: string;
|
|
32
|
+
inserted: number;
|
|
33
|
+
mentions: number;
|
|
34
|
+
plainPaths: number;
|
|
35
|
+
duplicates: number;
|
|
36
|
+
truncated: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface YaziBridgeStatus {
|
|
40
|
+
mode: YaziSessionMode | "closed";
|
|
41
|
+
paneId: string | null;
|
|
42
|
+
paneCwd: string | null;
|
|
43
|
+
lastLineAt: number | null;
|
|
44
|
+
droppedLines: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type YaziBridgeOpenResult =
|
|
48
|
+
| { status: "opened"; mode: YaziSessionMode; paneId: string | null; existing: boolean }
|
|
49
|
+
| Exclude<YaziSessionOpenResult, { status: "opened" }>;
|
|
50
|
+
|
|
51
|
+
export interface YaziBridge {
|
|
52
|
+
open(options?: { once?: boolean }): Promise<YaziBridgeOpenResult>;
|
|
53
|
+
status(): Readonly<YaziBridgeStatus>;
|
|
54
|
+
dispose(): void;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface YaziBridgeDeps {
|
|
58
|
+
mux?: MuxContract;
|
|
59
|
+
getDraft: () => string;
|
|
60
|
+
setDraft: (text: string) => void;
|
|
61
|
+
requestRender: () => void;
|
|
62
|
+
notice: (level: "info" | "warning", text: string) => void;
|
|
63
|
+
getCwd: () => string;
|
|
64
|
+
getSettings?: () => Readonly<YaziBridgeSettings>;
|
|
65
|
+
openSession?: (options: YaziSessionOptions) => Promise<YaziSessionOpenResult>;
|
|
66
|
+
/** TUI lease used only by the no-mux, in-terminal chooser. */
|
|
67
|
+
stopUi?: () => void;
|
|
68
|
+
startUi?: () => void;
|
|
69
|
+
runTerminalChooser?: (options: { cwd: string; profileMode: YaziProfileMode }) => Promise<YaziTerminalChooserResult>;
|
|
70
|
+
statPath?: (path: string) => "file" | "directory" | "other";
|
|
71
|
+
livenessMs?: number;
|
|
72
|
+
pickToken?: () => string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export type YaziTerminalChooserResult =
|
|
76
|
+
| { status: "chosen"; choice: { paths: ReadonlyArray<string>; cwd: string } }
|
|
77
|
+
| { status: "cancelled" }
|
|
78
|
+
| { status: "missing-binary"; binary: "yazi" | "ya"; detail: string }
|
|
79
|
+
| { status: "profile-error"; reason: string }
|
|
80
|
+
| { status: "unavailable"; reason: string };
|
|
81
|
+
|
|
82
|
+
export interface YaziTerminalChooserOptions {
|
|
83
|
+
cwd: string;
|
|
84
|
+
profileMode: YaziProfileMode;
|
|
85
|
+
stopUi: () => void;
|
|
86
|
+
startUi: () => void;
|
|
87
|
+
requestRender: () => void;
|
|
88
|
+
cacheDir?: string;
|
|
89
|
+
sessionId?: string;
|
|
90
|
+
resolveBinaries?: () => YaziResolvedBinaries;
|
|
91
|
+
ensureProfile?: typeof ensureYaziProfile;
|
|
92
|
+
spawnYazi?: (
|
|
93
|
+
file: string,
|
|
94
|
+
args: ReadonlyArray<string>,
|
|
95
|
+
options: { cwd: string; env: Readonly<NodeJS.ProcessEnv> },
|
|
96
|
+
) => { error?: Error };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function readOptional(path: string): string {
|
|
100
|
+
try {
|
|
101
|
+
return readFileSync(path, "utf8");
|
|
102
|
+
} catch {
|
|
103
|
+
return "";
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Run Yazi as a full-screen chooser when no pane host is usable.
|
|
109
|
+
*
|
|
110
|
+
* Resolution, profile generation, and chooser-file truncation all happen
|
|
111
|
+
* before the TUI lease is released. A missing or below-floor binary therefore
|
|
112
|
+
* leaves the screen intact and returns the shared doctor sentence verbatim.
|
|
113
|
+
*/
|
|
114
|
+
export async function runYaziTerminalChooser(options: YaziTerminalChooserOptions): Promise<YaziTerminalChooserResult> {
|
|
115
|
+
const binaries = (options.resolveBinaries ?? resolveYaziBinaries)();
|
|
116
|
+
if (!binaries.yaziPath) {
|
|
117
|
+
return { status: "missing-binary", binary: "yazi", detail: binaries.missingYaziDetail };
|
|
118
|
+
}
|
|
119
|
+
if (options.profileMode === "managed" && !binaries.yaPath) {
|
|
120
|
+
return {
|
|
121
|
+
status: "missing-binary",
|
|
122
|
+
binary: "ya",
|
|
123
|
+
detail: "the Yazi helper `ya` is not available; install the complete pinned Yazi tool",
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const cacheDir = options.cacheDir ?? clioCacheDir();
|
|
128
|
+
const sessionsDir = join(cacheDir, "yazi", "sessions");
|
|
129
|
+
mkdirSync(sessionsDir, { recursive: true });
|
|
130
|
+
const sessionId = options.sessionId ?? randomUUID();
|
|
131
|
+
const chooserPath = join(sessionsDir, `${sessionId}.chooser`);
|
|
132
|
+
const cwdPath = join(sessionsDir, `${sessionId}.cwd`);
|
|
133
|
+
const profile =
|
|
134
|
+
options.profileMode === "managed"
|
|
135
|
+
? (options.ensureProfile ?? ensureYaziProfile)({
|
|
136
|
+
yaPath: binaries.yaPath as string,
|
|
137
|
+
yaziPath: binaries.yaziPath,
|
|
138
|
+
profileDir: yaziProfileDir(cacheDir),
|
|
139
|
+
})
|
|
140
|
+
: null;
|
|
141
|
+
if (options.profileMode === "managed" && !profile) {
|
|
142
|
+
return { status: "profile-error", reason: "Clio could not generate a valid managed Yazi profile" };
|
|
143
|
+
}
|
|
144
|
+
writeFileSync(chooserPath, "");
|
|
145
|
+
writeFileSync(cwdPath, "");
|
|
146
|
+
|
|
147
|
+
const args = [options.cwd, "--chooser-file", chooserPath, "--cwd-file", cwdPath] as const;
|
|
148
|
+
const env = { ...process.env, ...(profile ? { YAZI_CONFIG_HOME: profile.dir } : {}) };
|
|
149
|
+
let processError: Error | undefined;
|
|
150
|
+
options.stopUi();
|
|
151
|
+
try {
|
|
152
|
+
const result = options.spawnYazi
|
|
153
|
+
? options.spawnYazi(binaries.yaziPath, args, { cwd: options.cwd, env })
|
|
154
|
+
: spawnSync(binaries.yaziPath, args, { cwd: options.cwd, env, stdio: "inherit" });
|
|
155
|
+
processError = result.error;
|
|
156
|
+
} catch (error) {
|
|
157
|
+
processError = error instanceof Error ? error : new Error(String(error));
|
|
158
|
+
} finally {
|
|
159
|
+
options.startUi();
|
|
160
|
+
options.requestRender();
|
|
161
|
+
}
|
|
162
|
+
if (processError) return { status: "unavailable", reason: `yazi chooser failed: ${processError.message}` };
|
|
163
|
+
|
|
164
|
+
const paths = readOptional(chooserPath)
|
|
165
|
+
.split("\n")
|
|
166
|
+
.filter((path) => path.length > 0);
|
|
167
|
+
if (paths.length === 0) return { status: "cancelled" };
|
|
168
|
+
return {
|
|
169
|
+
status: "chosen",
|
|
170
|
+
choice: { paths, cwd: readOptional(cwdPath).trim() || options.cwd },
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function containsAsciiWhitespace(value: string): boolean {
|
|
175
|
+
for (const character of value) {
|
|
176
|
+
const code = character.charCodeAt(0);
|
|
177
|
+
if (code === 32 || (code >= 9 && code <= 13)) return true;
|
|
178
|
+
}
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function relativeWhenInside(path: string, cwd: string): string {
|
|
183
|
+
const candidate = relative(cwd, path);
|
|
184
|
+
if (
|
|
185
|
+
candidate.length > 0 &&
|
|
186
|
+
candidate !== ".." &&
|
|
187
|
+
!candidate.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) &&
|
|
188
|
+
!isAbsolute(candidate)
|
|
189
|
+
) {
|
|
190
|
+
return candidate;
|
|
191
|
+
}
|
|
192
|
+
return path;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function draftContains(draft: string, item: string): boolean {
|
|
196
|
+
let from = 0;
|
|
197
|
+
while (from <= draft.length) {
|
|
198
|
+
const at = draft.indexOf(item, from);
|
|
199
|
+
if (at < 0) return false;
|
|
200
|
+
const before = at === 0 ? "" : (draft[at - 1] ?? "");
|
|
201
|
+
const after = draft[at + item.length] ?? "";
|
|
202
|
+
if ((before === "" || /\s/u.test(before)) && (after === "" || /\s/u.test(after))) return true;
|
|
203
|
+
from = at + item.length;
|
|
204
|
+
}
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function pathKind(path: string): "file" | "directory" | "other" {
|
|
209
|
+
try {
|
|
210
|
+
const stat = statSync(path);
|
|
211
|
+
if (stat.isFile()) return "file";
|
|
212
|
+
if (stat.isDirectory()) return "directory";
|
|
213
|
+
return "other";
|
|
214
|
+
} catch {
|
|
215
|
+
return "other";
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** Format one DDS or chooser batch for the composer without ever submitting it. */
|
|
220
|
+
export function formatYaziMentions(
|
|
221
|
+
paths: ReadonlyArray<string>,
|
|
222
|
+
options: {
|
|
223
|
+
cwd: string;
|
|
224
|
+
draft: string;
|
|
225
|
+
statPath?: (path: string) => "file" | "directory" | "other";
|
|
226
|
+
maxPaths?: number;
|
|
227
|
+
maxChars?: number;
|
|
228
|
+
},
|
|
229
|
+
): YaziMentionBatch {
|
|
230
|
+
const maxPaths = options.maxPaths ?? YAZI_PICK_MAX_PATHS;
|
|
231
|
+
const maxChars = options.maxChars ?? YAZI_PICK_MAX_CHARS;
|
|
232
|
+
const inspect = options.statPath ?? pathKind;
|
|
233
|
+
const rendered: string[] = [];
|
|
234
|
+
const seen = new Set<string>();
|
|
235
|
+
let mentions = 0;
|
|
236
|
+
let plainPaths = 0;
|
|
237
|
+
let duplicates = 0;
|
|
238
|
+
let truncated = Math.max(0, paths.length - maxPaths);
|
|
239
|
+
|
|
240
|
+
const candidates = paths.slice(0, maxPaths);
|
|
241
|
+
for (const [index, rawPath] of candidates.entries()) {
|
|
242
|
+
const absolute = isAbsolute(rawPath) ? rawPath : resolve(options.cwd, rawPath);
|
|
243
|
+
if (seen.has(absolute)) {
|
|
244
|
+
duplicates += 1;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
seen.add(absolute);
|
|
248
|
+
const kind = inspect(absolute);
|
|
249
|
+
let display = relativeWhenInside(absolute, options.cwd);
|
|
250
|
+
if (kind === "directory" && display !== "/" && !display.endsWith("/")) display = `${display}/`;
|
|
251
|
+
const mention = kind === "file" && !containsAsciiWhitespace(display);
|
|
252
|
+
const item = mention ? `@${display}` : `\`${display.replaceAll("`", "\\`")}\``;
|
|
253
|
+
if (draftContains(options.draft, item)) {
|
|
254
|
+
duplicates += 1;
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
const nextLength = rendered.length === 0 ? item.length : rendered.join(" ").length + 1 + item.length;
|
|
258
|
+
if (nextLength > maxChars) {
|
|
259
|
+
truncated += candidates.length - index;
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
rendered.push(item);
|
|
263
|
+
if (mention) mentions += 1;
|
|
264
|
+
else plainPaths += 1;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return {
|
|
268
|
+
text: rendered.join(" "),
|
|
269
|
+
inserted: rendered.length,
|
|
270
|
+
mentions,
|
|
271
|
+
plainPaths,
|
|
272
|
+
duplicates,
|
|
273
|
+
truncated,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function appendDraft(draft: string, addition: string): string {
|
|
278
|
+
if (addition.length === 0) return draft;
|
|
279
|
+
if (draft.length === 0) return addition;
|
|
280
|
+
return `${draft.replace(/\s+$/u, "")} ${addition}`;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/** Own the only path from a Yazi decision into the interactive composer. */
|
|
284
|
+
export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
285
|
+
const openSession = deps.openSession ?? createYaziSession;
|
|
286
|
+
let active: YaziSession | null = null;
|
|
287
|
+
let paneCwd: string | null = null;
|
|
288
|
+
let droppedLines = 0;
|
|
289
|
+
let disposed = false;
|
|
290
|
+
let generation = 0;
|
|
291
|
+
let livenessTimer: NodeJS.Timeout | null = null;
|
|
292
|
+
let sawLine = false;
|
|
293
|
+
|
|
294
|
+
const clearLiveness = (): void => {
|
|
295
|
+
if (livenessTimer) clearTimeout(livenessTimer);
|
|
296
|
+
livenessTimer = null;
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
const insert = (paths: ReadonlyArray<string>, cwd: string): void => {
|
|
300
|
+
const draft = deps.getDraft();
|
|
301
|
+
const batch = formatYaziMentions(paths, { cwd, draft, ...(deps.statPath ? { statPath: deps.statPath } : {}) });
|
|
302
|
+
if (batch.inserted === 0) {
|
|
303
|
+
if (batch.truncated > 0) {
|
|
304
|
+
deps.notice(
|
|
305
|
+
"warning",
|
|
306
|
+
`${batch.truncated} file-pane path${batch.truncated === 1 ? " was" : "s were"} omitted by the pick limits`,
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
deps.setDraft(appendDraft(draft, batch.text));
|
|
312
|
+
deps.requestRender();
|
|
313
|
+
deps.notice(
|
|
314
|
+
"info",
|
|
315
|
+
`${batch.inserted} ${batch.inserted === 1 ? "path" : "paths"} from the file pane added to the draft`,
|
|
316
|
+
);
|
|
317
|
+
if (batch.plainPaths > 0) {
|
|
318
|
+
deps.notice(
|
|
319
|
+
"info",
|
|
320
|
+
`${batch.plainPaths} ${batch.plainPaths === 1 ? "path was" : "paths were"} inserted as plain text because directories and spaced paths cannot be file mentions`,
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
if (batch.truncated > 0) {
|
|
324
|
+
deps.notice(
|
|
325
|
+
"warning",
|
|
326
|
+
`${batch.truncated} file-pane path${batch.truncated === 1 ? " was" : "s were"} omitted by the pick limits`,
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
const start = async (mode: YaziSessionMode, profileMode: YaziProfileMode): Promise<YaziBridgeOpenResult> => {
|
|
332
|
+
const mux = deps.mux;
|
|
333
|
+
if (!mux?.available()) return { status: "unavailable", reason: "the pane layer is not available" };
|
|
334
|
+
generation += 1;
|
|
335
|
+
const ownGeneration = generation;
|
|
336
|
+
const token = (deps.pickToken ?? randomUUID)();
|
|
337
|
+
sawLine = false;
|
|
338
|
+
paneCwd = deps.getCwd();
|
|
339
|
+
const result = await openSession({
|
|
340
|
+
mux,
|
|
341
|
+
mode,
|
|
342
|
+
profileMode,
|
|
343
|
+
cwd: deps.getCwd(),
|
|
344
|
+
pickToken: token,
|
|
345
|
+
onEvent: (event: YaziEvent) => {
|
|
346
|
+
if (disposed || ownGeneration !== generation) return;
|
|
347
|
+
sawLine = true;
|
|
348
|
+
if (event.kind === "cd") {
|
|
349
|
+
paneCwd = event.cwd;
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
if (event.values[0] !== token) {
|
|
353
|
+
droppedLines += 1;
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
insert(event.values.slice(1), paneCwd ?? deps.getCwd());
|
|
357
|
+
},
|
|
358
|
+
onChooser: (choice) => {
|
|
359
|
+
if (disposed || ownGeneration !== generation) return;
|
|
360
|
+
paneCwd = choice.cwd;
|
|
361
|
+
if (choice.paths.length > 0) insert(choice.paths, choice.cwd);
|
|
362
|
+
},
|
|
363
|
+
onStopped: () => {
|
|
364
|
+
if (ownGeneration !== generation) return;
|
|
365
|
+
clearLiveness();
|
|
366
|
+
active = null;
|
|
367
|
+
},
|
|
368
|
+
});
|
|
369
|
+
if (result.status !== "opened") return result;
|
|
370
|
+
if (disposed || ownGeneration !== generation) {
|
|
371
|
+
await result.session.close();
|
|
372
|
+
return { status: "unavailable", reason: "the file pane was closed while it was opening" };
|
|
373
|
+
}
|
|
374
|
+
active = result.session;
|
|
375
|
+
if (mode === "companion") {
|
|
376
|
+
livenessTimer = setTimeout(() => {
|
|
377
|
+
if (disposed || ownGeneration !== generation || sawLine || active === null) return;
|
|
378
|
+
const stale = active;
|
|
379
|
+
active = null;
|
|
380
|
+
deps.notice("warning", "the file-pane event stream did not start; reopening yazi in chooser mode");
|
|
381
|
+
void stale.close().finally(() => {
|
|
382
|
+
if (!disposed && ownGeneration === generation) void start("chooser", profileMode);
|
|
383
|
+
});
|
|
384
|
+
}, deps.livenessMs ?? YAZI_LIVENESS_MS);
|
|
385
|
+
livenessTimer.unref();
|
|
386
|
+
}
|
|
387
|
+
return { status: "opened", mode, paneId: result.session.pane.paneId, existing: false };
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
return {
|
|
391
|
+
async open(options = {}): Promise<YaziBridgeOpenResult> {
|
|
392
|
+
if (disposed) return { status: "unavailable", reason: "the file-pane bridge is closed" };
|
|
393
|
+
const settings = deps.getSettings?.() ?? { mode: "companion", profile: "managed", followCwd: true };
|
|
394
|
+
if (active) {
|
|
395
|
+
if (settings.followCwd) {
|
|
396
|
+
const cwd = deps.getCwd();
|
|
397
|
+
if (await active.pushCwd(cwd)) paneCwd = cwd;
|
|
398
|
+
}
|
|
399
|
+
return { status: "opened", mode: active.mode, paneId: active.pane.paneId, existing: true };
|
|
400
|
+
}
|
|
401
|
+
const mode = options.once || settings.profile === "user" ? "chooser" : settings.mode;
|
|
402
|
+
if (!deps.mux?.available()) {
|
|
403
|
+
const result = await (
|
|
404
|
+
deps.runTerminalChooser ??
|
|
405
|
+
((choiceOptions) =>
|
|
406
|
+
runYaziTerminalChooser({
|
|
407
|
+
...choiceOptions,
|
|
408
|
+
stopUi: deps.stopUi ?? (() => {}),
|
|
409
|
+
startUi: deps.startUi ?? (() => {}),
|
|
410
|
+
requestRender: deps.requestRender,
|
|
411
|
+
}))
|
|
412
|
+
)({ cwd: deps.getCwd(), profileMode: settings.profile });
|
|
413
|
+
if (result.status === "chosen") {
|
|
414
|
+
paneCwd = result.choice.cwd;
|
|
415
|
+
insert(result.choice.paths, result.choice.cwd);
|
|
416
|
+
}
|
|
417
|
+
if (result.status === "chosen" || result.status === "cancelled") {
|
|
418
|
+
return { status: "opened", mode: "chooser", paneId: null, existing: false };
|
|
419
|
+
}
|
|
420
|
+
return result;
|
|
421
|
+
}
|
|
422
|
+
return await start(mode, settings.profile);
|
|
423
|
+
},
|
|
424
|
+
status(): Readonly<YaziBridgeStatus> {
|
|
425
|
+
const snapshot = active?.snapshot();
|
|
426
|
+
return {
|
|
427
|
+
mode: active?.mode ?? "closed",
|
|
428
|
+
paneId: active?.pane.paneId ?? null,
|
|
429
|
+
paneCwd: paneCwd ?? snapshot?.paneCwd ?? null,
|
|
430
|
+
lastLineAt: snapshot?.lastLineAt ?? null,
|
|
431
|
+
droppedLines,
|
|
432
|
+
};
|
|
433
|
+
},
|
|
434
|
+
dispose(): void {
|
|
435
|
+
if (disposed) return;
|
|
436
|
+
disposed = true;
|
|
437
|
+
generation += 1;
|
|
438
|
+
clearLiveness();
|
|
439
|
+
const closing = active;
|
|
440
|
+
active = null;
|
|
441
|
+
if (closing) void closing.close();
|
|
442
|
+
},
|
|
443
|
+
};
|
|
444
|
+
}
|
package/src/tools/ask-user.ts
CHANGED
|
@@ -40,13 +40,27 @@ export interface AskUserQuestion {
|
|
|
40
40
|
|
|
41
41
|
export interface AskUserAnswer {
|
|
42
42
|
question: string;
|
|
43
|
+
/** The whole answer on one line: the chosen labels, then the typed text. */
|
|
43
44
|
answer: string;
|
|
45
|
+
/**
|
|
46
|
+
* The option labels the operator chose, in list order. Absent when they only
|
|
47
|
+
* typed. Present with no {@link value} is a label-only answer, which is how a
|
|
48
|
+
* reader tells "they picked the option" from "they picked it and typed a
|
|
49
|
+
* figure" (issue #228).
|
|
50
|
+
*/
|
|
51
|
+
options?: string[];
|
|
52
|
+
/** The operator's typed text, exactly as submitted. Absent when they only chose. */
|
|
53
|
+
value?: string;
|
|
44
54
|
}
|
|
45
55
|
|
|
46
56
|
export interface AskUserDecision {
|
|
47
57
|
key: string;
|
|
48
58
|
value: string;
|
|
49
59
|
label?: string;
|
|
60
|
+
/** The chosen labels behind `value`; derived by the harness, not model-supplied. */
|
|
61
|
+
options?: string[];
|
|
62
|
+
/** The typed text behind `value`; derived by the harness, not model-supplied. */
|
|
63
|
+
text?: string;
|
|
50
64
|
/** Question that produced this decision; derived by the harness, not model-supplied. */
|
|
51
65
|
source_question?: string;
|
|
52
66
|
}
|
|
@@ -299,6 +313,13 @@ export function cancelledAskUserResult(): AskUserResult {
|
|
|
299
313
|
return { answers: [], cancelled: true };
|
|
300
314
|
}
|
|
301
315
|
|
|
316
|
+
/** The chosen labels, dropped when the surface supplied nothing usable. */
|
|
317
|
+
function normalizeAnswerOptions(value: unknown): string[] | undefined {
|
|
318
|
+
if (!Array.isArray(value)) return undefined;
|
|
319
|
+
const labels = value.filter((entry): entry is string => typeof entry === "string" && entry.trim().length > 0);
|
|
320
|
+
return labels.length > 0 ? labels : undefined;
|
|
321
|
+
}
|
|
322
|
+
|
|
302
323
|
function normalizeAskUserResult(questions: ReadonlyArray<AskUserQuestion>, result: AskUserResult): AskUserResult {
|
|
303
324
|
if (result.cancelled === true) return cancelledAskUserResult();
|
|
304
325
|
const answers: AskUserAnswer[] = [];
|
|
@@ -308,7 +329,18 @@ function normalizeAskUserResult(questions: ReadonlyArray<AskUserQuestion>, resul
|
|
|
308
329
|
if (!raw) continue;
|
|
309
330
|
const question = typeof raw.question === "string" && raw.question.trim().length > 0 ? raw.question : fallbackQuestion;
|
|
310
331
|
const answer = typeof raw.answer === "string" ? raw.answer.trim() : "";
|
|
311
|
-
if (question.length
|
|
332
|
+
if (question.length === 0 || answer.length === 0) continue;
|
|
333
|
+
// The typed text keeps every byte the operator submitted. The one-line
|
|
334
|
+
// `answer` is a rendering of the same decision and is trimmed like any
|
|
335
|
+
// other display string; `value` is the record.
|
|
336
|
+
const options = normalizeAnswerOptions(raw.options);
|
|
337
|
+
const value = typeof raw.value === "string" && raw.value.length > 0 ? raw.value : undefined;
|
|
338
|
+
answers.push({
|
|
339
|
+
question,
|
|
340
|
+
answer,
|
|
341
|
+
...(options ? { options } : {}),
|
|
342
|
+
...(value !== undefined ? { value } : {}),
|
|
343
|
+
});
|
|
312
344
|
}
|
|
313
345
|
return { answers };
|
|
314
346
|
}
|
|
@@ -363,7 +395,12 @@ function transcriptQuestions(questions: ReadonlyArray<AskUserQuestion>): AskUser
|
|
|
363
395
|
}
|
|
364
396
|
|
|
365
397
|
function transcriptAnswers(answers: ReadonlyArray<AskUserAnswer>): AskUserTranscriptAnswer[] {
|
|
366
|
-
return answers.map((answer) => ({
|
|
398
|
+
return answers.map((answer) => ({
|
|
399
|
+
question: answer.question,
|
|
400
|
+
answer: answer.answer,
|
|
401
|
+
...(answer.options && answer.options.length > 0 ? { options: [...answer.options] } : {}),
|
|
402
|
+
...(answer.value !== undefined ? { value: answer.value } : {}),
|
|
403
|
+
}));
|
|
367
404
|
}
|
|
368
405
|
|
|
369
406
|
function toDecisionKey(value: string): string {
|
|
@@ -397,6 +434,8 @@ function decisionFromAnswer(
|
|
|
397
434
|
key,
|
|
398
435
|
value: answer.answer,
|
|
399
436
|
...(label ? { label } : {}),
|
|
437
|
+
...(answer.options && answer.options.length > 0 ? { options: [...answer.options] } : {}),
|
|
438
|
+
...(answer.value !== undefined ? { text: answer.value } : {}),
|
|
400
439
|
source_question: answer.question,
|
|
401
440
|
};
|
|
402
441
|
}
|
|
@@ -406,6 +445,8 @@ function toTranscriptDecision(decision: AskUserDecision): AskUserTranscriptDecis
|
|
|
406
445
|
key: toDecisionKey(decision.key),
|
|
407
446
|
value: decision.value,
|
|
408
447
|
...(decision.label ? { label: decision.label } : {}),
|
|
448
|
+
...(decision.options && decision.options.length > 0 ? { options: [...decision.options] } : {}),
|
|
449
|
+
...(decision.text !== undefined ? { text: decision.text } : {}),
|
|
409
450
|
...(decision.source_question ? { source_question: decision.source_question } : {}),
|
|
410
451
|
};
|
|
411
452
|
}
|
package/src/tools/bootstrap.ts
CHANGED
|
@@ -3,13 +3,16 @@ import type { SafeEventBus } from "../core/event-bus.js";
|
|
|
3
3
|
import type { AgentSpec } from "../domains/agents/spec.js";
|
|
4
4
|
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
5
5
|
import type { AgentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
|
|
6
|
+
import type { PanesOperations } from "../domains/mux/operations.js";
|
|
6
7
|
import type { AutonomyLevel } from "../domains/safety/autonomy.js";
|
|
7
8
|
import { builtin, toolPromptHintsForNames } from "./builtin-tool-catalog.js";
|
|
9
|
+
import type { CompeteMuxWorktrees } from "./compete-worktrees.js";
|
|
8
10
|
import { assertRegisteredBuiltinTools, type CoreToolBootstrapDeps, registerCoreTools } from "./core-bootstrap.js";
|
|
9
11
|
import { createDispatchRunEventRegistry, createDispatchTool } from "./dispatch.js";
|
|
10
12
|
import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
|
|
11
13
|
import { lazyTool } from "./lazy-tool.js";
|
|
12
14
|
import { monitorToolSurface } from "./monitor-surface.js";
|
|
15
|
+
import { panesToolSurface } from "./panes-surface.js";
|
|
13
16
|
import type { ToolRegistry } from "./registry.js";
|
|
14
17
|
import { steerToolSurface } from "./steer-surface.js";
|
|
15
18
|
|
|
@@ -25,6 +28,13 @@ export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
|
|
|
25
28
|
getCostCeilingUsd?: () => number;
|
|
26
29
|
getWorkerRosters?: () => WorkerRosters;
|
|
27
30
|
dispatchBackground?: DispatchBackgroundRegistry;
|
|
31
|
+
/** Optional herdr worktree lifecycle for compete candidates. */
|
|
32
|
+
competeMuxWorktrees?: CompeteMuxWorktrees;
|
|
33
|
+
/**
|
|
34
|
+
* Pane operations. Present only when a pane host answered detection, which
|
|
35
|
+
* is what keeps the `panes` tool out of the prompt on a machine with none.
|
|
36
|
+
*/
|
|
37
|
+
panes?: PanesOperations;
|
|
28
38
|
}
|
|
29
39
|
|
|
30
40
|
/**
|
|
@@ -36,7 +46,11 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
36
46
|
const registration = registerCoreTools(registry, deps);
|
|
37
47
|
if (deps.dispatch) {
|
|
38
48
|
const dispatch = deps.dispatch;
|
|
39
|
-
|
|
49
|
+
// Display tail only. In a composed process the dispatch domain writes the
|
|
50
|
+
// durable journal off its own progress channel, which covers every run
|
|
51
|
+
// rather than only the ones the model dispatched through this tool, so a
|
|
52
|
+
// second sink here would transcribe a tool-path run twice.
|
|
53
|
+
const dispatchRunEvents = createDispatchRunEventRegistry({ journal: null });
|
|
40
54
|
const dispatchToolDeps = {
|
|
41
55
|
dispatch,
|
|
42
56
|
runEvents: dispatchRunEvents,
|
|
@@ -48,6 +62,7 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
48
62
|
...(deps.getCostCeilingUsd ? { getCostCeilingUsd: deps.getCostCeilingUsd } : {}),
|
|
49
63
|
...(deps.getWorkerRosters ? { getWorkerRosters: deps.getWorkerRosters } : {}),
|
|
50
64
|
...(deps.dispatchBackground ? { background: deps.dispatchBackground } : {}),
|
|
65
|
+
...(deps.competeMuxWorktrees ? { competeWorktrees: { mux: deps.competeMuxWorktrees } } : {}),
|
|
51
66
|
};
|
|
52
67
|
registry.register({
|
|
53
68
|
...builtin(createDispatchTool(dispatchToolDeps), {
|
|
@@ -76,5 +91,14 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
76
91
|
),
|
|
77
92
|
});
|
|
78
93
|
}
|
|
79
|
-
|
|
94
|
+
if (deps.panes) {
|
|
95
|
+
const panes = deps.panes;
|
|
96
|
+
registry.register({
|
|
97
|
+
...builtin(
|
|
98
|
+
lazyTool(panesToolSurface, async () => (await import("./panes.js")).createPanesTool({ panes })),
|
|
99
|
+
{ path: "src/tools/panes.ts", scope: "core" },
|
|
100
|
+
),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
assertRegisteredBuiltinTools(registry, registration, Boolean(deps.dispatch), Boolean(deps.panes));
|
|
80
104
|
}
|
|
@@ -213,6 +213,21 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
213
213
|
},
|
|
214
214
|
costLatency: "local_fast",
|
|
215
215
|
},
|
|
216
|
+
[ToolNames.Panes]: {
|
|
217
|
+
objective: "Focus, open, close, and inventory the terminal panes Clio owns beside this session.",
|
|
218
|
+
uiLabel: "Panes",
|
|
219
|
+
// show and list land on the same state twice; open starts a second pane
|
|
220
|
+
// and close is a no-op the second time, so the surface as a whole is not.
|
|
221
|
+
retrySafety: "not_retry_safe",
|
|
222
|
+
resultSizePolicy: {
|
|
223
|
+
kind: "exact",
|
|
224
|
+
maxBytes: 8_192,
|
|
225
|
+
followUpHint: 'Call panes with action="list" to re-read the pane inventory.',
|
|
226
|
+
},
|
|
227
|
+
costLatency: "local_fast",
|
|
228
|
+
promptHint:
|
|
229
|
+
'When the operator asks to see a dispatched agent ("show me the tester"), call panes with action="show" and the agent id. Utility panes are presets only; an arbitrary command is the operator\'s own /panes open.',
|
|
230
|
+
},
|
|
216
231
|
// RETRIEVE: network-class.
|
|
217
232
|
[ToolNames.WebFetch]: {
|
|
218
233
|
objective: "Fetch HTTP(S) text for explicit external research.",
|