@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
package/src/cli/panes.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { printError } from "./shared.js";
|
|
2
|
+
import { runToolsCommand } from "./tools.js";
|
|
3
|
+
|
|
4
|
+
const HELP = `clio-coder panes install [--force] [--json]
|
|
5
|
+
|
|
6
|
+
Install the pane multiplexer Clio drives. This is an alias for
|
|
7
|
+
\`clio-coder tools install herdr\`; the toolchain command is where every pinned
|
|
8
|
+
external program is managed, and \`clio-coder tools status herdr\` explains
|
|
9
|
+
which copy Clio would run.
|
|
10
|
+
`;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The user-facing verb for the pane layer's one setup step.
|
|
14
|
+
*
|
|
15
|
+
* Panes are the feature; herdr is the program behind it. Naming the program in
|
|
16
|
+
* a command an operator types is a leak, so the alias exists and routes to the
|
|
17
|
+
* generic installer rather than the reverse.
|
|
18
|
+
*/
|
|
19
|
+
export async function runPanesCommand(argv: ReadonlyArray<string> = []): Promise<number> {
|
|
20
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
21
|
+
process.stdout.write(HELP);
|
|
22
|
+
return 0;
|
|
23
|
+
}
|
|
24
|
+
const [subcommand, ...rest] = argv;
|
|
25
|
+
if (subcommand === undefined) {
|
|
26
|
+
process.stdout.write(HELP);
|
|
27
|
+
return 2;
|
|
28
|
+
}
|
|
29
|
+
if (subcommand !== "install") {
|
|
30
|
+
printError(`unknown panes command: ${subcommand}`);
|
|
31
|
+
process.stderr.write(HELP);
|
|
32
|
+
return 2;
|
|
33
|
+
}
|
|
34
|
+
return runToolsCommand(["install", "herdr", ...rest]);
|
|
35
|
+
}
|
package/src/cli/reset.ts
CHANGED
|
@@ -15,7 +15,7 @@ Each level clears exactly the root (or file) it names and nothing else.
|
|
|
15
15
|
Levels (combinable except --all):
|
|
16
16
|
--state state root only (default). Holds every session transcript, so a
|
|
17
17
|
reset is the end of resume, /view, and the audit behind them.
|
|
18
|
-
--data data root only: memory, evidence, evals (durable products)
|
|
18
|
+
--data data root only: memory, evidence, evals, vendored tools (durable products)
|
|
19
19
|
--cache cache root only
|
|
20
20
|
--auth credentials.yaml only
|
|
21
21
|
--config settings.yaml only
|
|
@@ -42,7 +42,10 @@ Safety:
|
|
|
42
42
|
const ROOT_NOTES: Readonly<Record<string, string>> = {
|
|
43
43
|
state:
|
|
44
44
|
"the state root holds every session transcript and the audit trail beside it; resume and /view lose their history",
|
|
45
|
-
|
|
45
|
+
// Vendored tools are named because they are the one durable product a reset
|
|
46
|
+
// cannot regenerate from anything local: getting them back is a download.
|
|
47
|
+
data:
|
|
48
|
+
"the data root holds durable products (memory, evidence, evals, and any vendored external tools, which a reinstall re-downloads)",
|
|
46
49
|
};
|
|
47
50
|
|
|
48
51
|
interface ParsedResetArgs {
|
package/src/cli/run.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { createContextDomainModule } from "../domains/context/runtime.js";
|
|
|
11
11
|
import type { DispatchContract, DispatchRequest } from "../domains/dispatch/contract.js";
|
|
12
12
|
import { agentRoleFactsResolver, requestExecutionRole } from "../domains/dispatch/execution-role.js";
|
|
13
13
|
import { createDispatchDomainModule } from "../domains/dispatch/index.js";
|
|
14
|
+
import { configureRunEventJournal } from "../domains/dispatch/run-event-journal.js";
|
|
14
15
|
import type { RunReceipt } from "../domains/dispatch/types.js";
|
|
15
16
|
import { ensureClioState, LifecycleDomainModule } from "../domains/lifecycle/index.js";
|
|
16
17
|
import {
|
|
@@ -158,6 +159,45 @@ export function explicitSkillPathErrors(skillPaths: ReadonlyArray<string>): stri
|
|
|
158
159
|
return errors;
|
|
159
160
|
}
|
|
160
161
|
|
|
162
|
+
/**
|
|
163
|
+
* The TUI's verdict for a command-shaped token the registry does not own,
|
|
164
|
+
* applied to a headless task. Returns the refusal message, or null when the
|
|
165
|
+
* task is not an unknown command.
|
|
166
|
+
*
|
|
167
|
+
* `parseSlashCommand` is the canonical shape test and the canonical registry
|
|
168
|
+
* walk, so a token that is one word of letters, digits, hyphens, or colons and
|
|
169
|
+
* names no command lands here exactly as it does in the editor. Prose keeps
|
|
170
|
+
* reaching the model: an absolute path such as `/home/user/notes` carries a
|
|
171
|
+
* separator and is not one word, and `\/tmp is full` is the same escape the
|
|
172
|
+
* editor honors.
|
|
173
|
+
*
|
|
174
|
+
* A prompt template claims the token before the refusal does. Only membership
|
|
175
|
+
* is checked, not expansion: a template that exists but refuses (an untrusted
|
|
176
|
+
* project root, an unreadable body) has its own message, which the headless
|
|
177
|
+
* boot path already prints from the expansion itself. Deciding that here would
|
|
178
|
+
* duplicate the trust rules and put two refusals on one token.
|
|
179
|
+
*
|
|
180
|
+
* Both modules are imported lazily, so a task that does not start with a slash
|
|
181
|
+
* pays for neither. The laziness is a startup-cost choice and nothing more: for
|
|
182
|
+
* bundle partitioning a dynamic import is worse than a static one, because a
|
|
183
|
+
* dynamically imported module becomes a chunk split point by itself. What keeps
|
|
184
|
+
* this edge safe is the other end. `slash-commands.ts` is a declared CLI seam
|
|
185
|
+
* whose own imports stay off the interactive render graph, so reaching it does
|
|
186
|
+
* not make this file a second reacher of the chunk the instant shell's Stage 0
|
|
187
|
+
* closure sits on. Boundaries rule6 in `tests/boundaries/check-boundaries.ts`
|
|
188
|
+
* holds both halves of that.
|
|
189
|
+
*/
|
|
190
|
+
export async function unknownSlashCommandRefusal(task: string): Promise<string | null> {
|
|
191
|
+
if (!task.trim().startsWith("/")) return null;
|
|
192
|
+
const { parseSlashCommand } = await import("../interactive/slash-commands.js");
|
|
193
|
+
const command = parseSlashCommand(task);
|
|
194
|
+
if (command.kind !== "unknown-command") return null;
|
|
195
|
+
const { loadPromptTemplates } = await import("../domains/resources/index.js");
|
|
196
|
+
const templates = loadPromptTemplates({ cwd: process.cwd() });
|
|
197
|
+
if (templates.items.some((template) => template.name === command.token)) return null;
|
|
198
|
+
return `/${command.token} is not a command. Type /help for the list.`;
|
|
199
|
+
}
|
|
200
|
+
|
|
161
201
|
export async function runClioRun(
|
|
162
202
|
args: ReadonlyArray<string>,
|
|
163
203
|
options: { apiKey?: string; noContextFiles?: boolean; noSkills?: boolean; skillPaths?: ReadonlyArray<string> } = {},
|
|
@@ -218,6 +258,15 @@ export async function runClioRun(
|
|
|
218
258
|
if (!assembled) return 2;
|
|
219
259
|
|
|
220
260
|
if (parsed.agentId === undefined) {
|
|
261
|
+
// A mistyped slash command is a usage error, not a task. Refusing it
|
|
262
|
+
// here keeps it from booting a session and spending a model turn on a
|
|
263
|
+
// command that was never run, which is what the TUI has always done
|
|
264
|
+
// and what docs/extensions-and-sharing.md documents for both surfaces.
|
|
265
|
+
const slashRefusal = await unknownSlashCommandRefusal(assembled.prompt);
|
|
266
|
+
if (slashRefusal !== null) {
|
|
267
|
+
process.stderr.write(`clio-coder run: ${slashRefusal}\n`);
|
|
268
|
+
return 2;
|
|
269
|
+
}
|
|
221
270
|
// An explicit --target override is a one-run target; a missing id is an
|
|
222
271
|
// operator config error, not an assistant response. Reject it before the
|
|
223
272
|
// headless turn so the resolver diagnostic never streams to stdout as a
|
|
@@ -314,11 +363,20 @@ async function runDispatch(
|
|
|
314
363
|
createDispatchDomainModule({
|
|
315
364
|
getSettings: () => effectiveSettings,
|
|
316
365
|
autonomyOverride: parsed.autonomy !== undefined,
|
|
366
|
+
// This path iterates `handle.events` itself and builds no dispatch
|
|
367
|
+
// event registry, so the domain is the only thing that can write the
|
|
368
|
+
// run's durable transcript.
|
|
369
|
+
journalRunEvents: true,
|
|
317
370
|
}),
|
|
318
371
|
LifecycleDomainModule,
|
|
319
372
|
]);
|
|
320
373
|
const config = loaded.getContract<ConfigContract>("config");
|
|
321
374
|
const baseSettings = config?.get() ?? readSettings();
|
|
375
|
+
// Install `panes.journal` the same way the interactive composition root
|
|
376
|
+
// does. The journal never reads settings.yaml itself: it sits on the
|
|
377
|
+
// dispatch event path, where a settings read would be both a cost and a
|
|
378
|
+
// throw site.
|
|
379
|
+
configureRunEventJournal(baseSettings.panes.journal);
|
|
322
380
|
effectiveSettings =
|
|
323
381
|
parsed.autonomy === undefined ? baseSettings : { ...structuredClone(baseSettings), autonomy: parsed.autonomy };
|
|
324
382
|
const dispatch = loaded.getContract<DispatchContract>("dispatch");
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of this installation's installed skills.
|
|
3
|
+
*
|
|
4
|
+
* `skills list --json` already emits a machine-readable listing, and a GUI host
|
|
5
|
+
* reading it gets two things wrong. Without `--all` it sees only the skills the
|
|
6
|
+
* model may load, which is `trusted && !disableModelInvocation`, so a surface
|
|
7
|
+
* rendering trust and invocability off that payload prints "trusted" and
|
|
8
|
+
* "allowed" on every row and structurally cannot print anything else. And the
|
|
9
|
+
* rows it does get are the full loaded records, carrying the SKILL.md body, the
|
|
10
|
+
* file path, the base directory, and two content hashes, so every consumer has
|
|
11
|
+
* to re-derive the same redaction.
|
|
12
|
+
*
|
|
13
|
+
* This command answers both. It loads once, reports every installed skill
|
|
14
|
+
* whether or not the model can reach it, says which ones it can, and carries
|
|
15
|
+
* only fields that are safe by construction. It is a separate subcommand rather
|
|
16
|
+
* than a flag on `skills inspect`, because that one names a skill and a fixed
|
|
17
|
+
* read a host may run must take no identifier at all.
|
|
18
|
+
*
|
|
19
|
+
* Held back deliberately: the skill body, its file path, its base directory,
|
|
20
|
+
* both hashes, the install and registry URLs, and the free-text loader
|
|
21
|
+
* diagnostics. Whether a skill has an upstream to update from crosses; where
|
|
22
|
+
* that upstream is does not.
|
|
23
|
+
*
|
|
24
|
+
* Marketplace discovery is deliberately not here. `library list --json` already
|
|
25
|
+
* folds `discoverMarketplaceSkills` into its catalog, so every installable
|
|
26
|
+
* skill already crosses through that read, and a second one would report the
|
|
27
|
+
* same rows under a different name.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import {
|
|
31
|
+
loadSkills,
|
|
32
|
+
type ResourceDiagnostic,
|
|
33
|
+
type Skill,
|
|
34
|
+
type SkillCatalogInvalidReason,
|
|
35
|
+
skillCatalogValidity,
|
|
36
|
+
} from "../domains/resources/index.js";
|
|
37
|
+
|
|
38
|
+
/** Wire bound on the emitted skill list. */
|
|
39
|
+
const MAX_SKILLS_INVENTORY_SKILLS = 64;
|
|
40
|
+
/** Wire bound on each skill's declared tool policy. */
|
|
41
|
+
const MAX_SKILLS_INVENTORY_TOOLS = 32;
|
|
42
|
+
|
|
43
|
+
const TOOL_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
|
|
44
|
+
|
|
45
|
+
type SkillAuditState = "pass" | "warn" | "fail" | "unknown" | "not-reported";
|
|
46
|
+
|
|
47
|
+
interface SkillsInventoryDiagnosticCounts {
|
|
48
|
+
readonly errors: number;
|
|
49
|
+
readonly warnings: number;
|
|
50
|
+
readonly collisions: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface SkillsInventorySkill {
|
|
54
|
+
readonly name: string;
|
|
55
|
+
readonly description: string;
|
|
56
|
+
readonly scope: string;
|
|
57
|
+
readonly source: string;
|
|
58
|
+
/** Whether the skill's root is trusted enough for the model to see it at all. */
|
|
59
|
+
readonly trusted: boolean;
|
|
60
|
+
/** Whether the skill's own frontmatter permits model invocation. */
|
|
61
|
+
readonly modelInvocable: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* The effective answer, which is both of the above.
|
|
64
|
+
*
|
|
65
|
+
* Reported rather than left to be inferred because it is the fact an
|
|
66
|
+
* operator is actually asking about, and because a listing filtered to it
|
|
67
|
+
* cannot state it.
|
|
68
|
+
*/
|
|
69
|
+
readonly modelVisible: boolean;
|
|
70
|
+
readonly precedence: number;
|
|
71
|
+
readonly diagnostics: SkillsInventoryDiagnosticCounts;
|
|
72
|
+
/** Tools the skill narrows itself to. The harness intersects these with host policy. */
|
|
73
|
+
readonly allowedTools: readonly string[];
|
|
74
|
+
readonly disallowedTools: readonly string[];
|
|
75
|
+
/** True when a dispatched worker installed this, rather than the operator. */
|
|
76
|
+
readonly installedByWorker: boolean;
|
|
77
|
+
/** True when provenance records an upstream, so `skills update` has something to fetch. */
|
|
78
|
+
readonly updatable: boolean;
|
|
79
|
+
readonly audit: SkillAuditState;
|
|
80
|
+
readonly installedAt: string | null;
|
|
81
|
+
readonly updatedAt: string | null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
interface SkillsInventorySnapshot {
|
|
85
|
+
readonly version: 1;
|
|
86
|
+
readonly generatedAt: string;
|
|
87
|
+
/** The verdict `skills validate` reaches, from the rule both callers share. */
|
|
88
|
+
readonly valid: boolean;
|
|
89
|
+
readonly invalidReason: SkillCatalogInvalidReason | null;
|
|
90
|
+
/** Every installed skill the loader resolved, before the wire bound. */
|
|
91
|
+
readonly total: number;
|
|
92
|
+
/** How many of those the model may actually load by name. */
|
|
93
|
+
readonly modelVisible: number;
|
|
94
|
+
readonly diagnostics: SkillsInventoryDiagnosticCounts;
|
|
95
|
+
readonly skills: readonly SkillsInventorySkill[];
|
|
96
|
+
readonly skillsTruncated: boolean;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const AUDIT_STATES: ReadonlySet<string> = new Set(["pass", "warn", "fail", "unknown"]);
|
|
100
|
+
|
|
101
|
+
function countDiagnostics(diagnostics: ReadonlyArray<ResourceDiagnostic>): SkillsInventoryDiagnosticCounts {
|
|
102
|
+
let errors = 0;
|
|
103
|
+
let warnings = 0;
|
|
104
|
+
let collisions = 0;
|
|
105
|
+
for (const diag of diagnostics) {
|
|
106
|
+
if (diag.type === "error") errors += 1;
|
|
107
|
+
else if (diag.type === "collision") collisions += 1;
|
|
108
|
+
else warnings += 1;
|
|
109
|
+
}
|
|
110
|
+
return { errors, warnings, collisions };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Tool names are already-crossing identifiers: the agent catalog carries the
|
|
115
|
+
* same class. They are re-enforced structurally here anyway, because a skill's
|
|
116
|
+
* frontmatter is operator-authored and the loader does not hold it to a shape.
|
|
117
|
+
*/
|
|
118
|
+
function toolPolicy(value: ReadonlyArray<string> | undefined): string[] {
|
|
119
|
+
if (value === undefined) return [];
|
|
120
|
+
const tools: string[] = [];
|
|
121
|
+
for (const tool of value) {
|
|
122
|
+
if (tools.length >= MAX_SKILLS_INVENTORY_TOOLS) break;
|
|
123
|
+
if (typeof tool !== "string" || tool.length > 64 || !TOOL_PATTERN.test(tool)) continue;
|
|
124
|
+
if (!tools.includes(tool)) tools.push(tool);
|
|
125
|
+
}
|
|
126
|
+
return tools;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function timestamp(value: string | undefined): string | null {
|
|
130
|
+
if (value === undefined) return null;
|
|
131
|
+
const parsed = Date.parse(value);
|
|
132
|
+
return Number.isFinite(parsed) ? new Date(parsed).toISOString() : null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function projectSkill(skill: Skill): SkillsInventorySkill {
|
|
136
|
+
const provenance = skill.provenance;
|
|
137
|
+
const audit = provenance?.audit;
|
|
138
|
+
return {
|
|
139
|
+
name: skill.name,
|
|
140
|
+
description: skill.description,
|
|
141
|
+
scope: skill.scope,
|
|
142
|
+
source: skill.source,
|
|
143
|
+
trusted: skill.trusted,
|
|
144
|
+
modelInvocable: !skill.disableModelInvocation,
|
|
145
|
+
modelVisible: skill.trusted && !skill.disableModelInvocation,
|
|
146
|
+
precedence: skill.precedence,
|
|
147
|
+
diagnostics: countDiagnostics(skill.diagnostics),
|
|
148
|
+
allowedTools: toolPolicy(skill.allowedTools),
|
|
149
|
+
disallowedTools: toolPolicy(skill.disallowedTools),
|
|
150
|
+
installedByWorker: provenance?.installedBy === "worker",
|
|
151
|
+
// The URL itself is a host-side fact; that one exists is what tells the
|
|
152
|
+
// operator whether an update has anywhere to come from.
|
|
153
|
+
updatable: provenance?.installUrl !== undefined || provenance?.registryUrl !== undefined,
|
|
154
|
+
audit: audit !== undefined && AUDIT_STATES.has(audit) ? (audit as SkillAuditState) : "not-reported",
|
|
155
|
+
installedAt: timestamp(provenance?.installedAt),
|
|
156
|
+
updatedAt: timestamp(provenance?.updatedAt),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function skillsInventorySnapshot(now: () => number = Date.now, cwd: string = process.cwd()): SkillsInventorySnapshot {
|
|
161
|
+
const list = loadSkills({ cwd });
|
|
162
|
+
const validity = skillCatalogValidity(list);
|
|
163
|
+
const projected = list.items.map(projectSkill);
|
|
164
|
+
const skills = projected.slice(0, MAX_SKILLS_INVENTORY_SKILLS);
|
|
165
|
+
return {
|
|
166
|
+
version: 1,
|
|
167
|
+
generatedAt: new Date(now()).toISOString(),
|
|
168
|
+
valid: validity.ok,
|
|
169
|
+
invalidReason: validity.reason,
|
|
170
|
+
total: projected.length,
|
|
171
|
+
modelVisible: projected.filter((skill) => skill.modelVisible).length,
|
|
172
|
+
diagnostics: countDiagnostics(list.diagnostics),
|
|
173
|
+
skills,
|
|
174
|
+
skillsTruncated: skills.length < projected.length,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function runSkillsInventory(args: ReadonlyArray<string>): number {
|
|
179
|
+
if (args.length !== 1 || args[0] !== "--json") {
|
|
180
|
+
process.stderr.write("clio-coder skills inventory: usage: clio-coder skills inventory --json\n");
|
|
181
|
+
return 2;
|
|
182
|
+
}
|
|
183
|
+
process.stdout.write(`${JSON.stringify(skillsInventorySnapshot(), null, 2)}\n`);
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
package/src/cli/skills.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
type ResourceDiagnostic,
|
|
9
9
|
type Skill,
|
|
10
10
|
type SkillUpdateReport,
|
|
11
|
+
skillCatalogValidity,
|
|
11
12
|
updateSkills,
|
|
12
13
|
} from "../domains/resources/index.js";
|
|
13
14
|
import { formatColumns, printError, printOk } from "./shared.js";
|
|
@@ -18,6 +19,7 @@ Manage local Clio and Agent Skills-compatible skills.
|
|
|
18
19
|
|
|
19
20
|
Commands:
|
|
20
21
|
clio-coder skills list [--json] [--all]
|
|
22
|
+
clio-coder skills inventory --json
|
|
21
23
|
clio-coder skills search <query> [--json]
|
|
22
24
|
clio-coder skills inspect <name> [--json]
|
|
23
25
|
clio-coder skills validate [path] [--json]
|
|
@@ -27,6 +29,10 @@ Commands:
|
|
|
27
29
|
clio-coder skills sync [--force]
|
|
28
30
|
clio-coder skills eval <name|path> [--scenario <id>] [--target <id>] [--workspace <path>] [--timeout <seconds>] [--trust-fixtures] [--allow-network] [--json]
|
|
29
31
|
|
|
32
|
+
inventory is the fixed machine-readable read a GUI host may run. Unlike a bare
|
|
33
|
+
list it reports every installed skill, not only the ones the model may load, and
|
|
34
|
+
says which are which; it carries no body, path, hash, or install URL.
|
|
35
|
+
|
|
30
36
|
search covers installed skills plus the local marketplace: CLIO_CODER_SKILL_CATALOG_DIR,
|
|
31
37
|
a repo skills/ catalog, or the catalog and skill-marketplace.json index the
|
|
32
38
|
installed clio-coder package carries. Installing from the shipped catalog copies
|
|
@@ -249,6 +255,12 @@ function validationLoad(pathArg: string | undefined): ReturnType<typeof loadSkil
|
|
|
249
255
|
}
|
|
250
256
|
|
|
251
257
|
export async function runSkillsCommand(argv: ReadonlyArray<string>): Promise<number> {
|
|
258
|
+
// Routed before the shared parser so the fixed read stays exactly fixed: no
|
|
259
|
+
// skills flag can reach it, and no flag it does not name can be spent on it.
|
|
260
|
+
if (argv[0] === "inventory") {
|
|
261
|
+
const { runSkillsInventory } = await import("./skills-inventory.js");
|
|
262
|
+
return runSkillsInventory(argv.slice(1));
|
|
263
|
+
}
|
|
252
264
|
let parsed: Parsed;
|
|
253
265
|
try {
|
|
254
266
|
parsed = parse(argv);
|
|
@@ -365,19 +377,10 @@ export async function runSkillsCommand(argv: ReadonlyArray<string>): Promise<num
|
|
|
365
377
|
return 2;
|
|
366
378
|
}
|
|
367
379
|
const list = validationLoad(pathArg);
|
|
368
|
-
//
|
|
369
|
-
//
|
|
370
|
-
//
|
|
371
|
-
|
|
372
|
-
// is among the loaded skills and they do not fail validation.
|
|
373
|
-
const loadedPaths = new Set(list.items.map((skill) => skill.filePath));
|
|
374
|
-
const hasInvalidDiagnostic = list.diagnostics.some(
|
|
375
|
-
(diag) =>
|
|
376
|
-
diag.type === "error" ||
|
|
377
|
-
diag.type === "collision" ||
|
|
378
|
-
(diag.type === "warning" && diag.path !== undefined && !loadedPaths.has(diag.path)),
|
|
379
|
-
);
|
|
380
|
-
const ok = list.items.length > 0 && !hasInvalidDiagnostic;
|
|
380
|
+
// The rule itself lives in the loader, because `skills inspect --json`
|
|
381
|
+
// reports the same verdict to a GUI host and a verdict that drifts
|
|
382
|
+
// between the terminal and the browser is worse than no verdict.
|
|
383
|
+
const { ok } = skillCatalogValidity(list);
|
|
381
384
|
if (parsed.json) {
|
|
382
385
|
process.stdout.write(`${JSON.stringify({ ok, skills: list.items, diagnostics: list.diagnostics }, null, 2)}\n`);
|
|
383
386
|
} else {
|
package/src/cli/targets.ts
CHANGED
|
@@ -14,6 +14,7 @@ import { ConfigDomainModule } from "../domains/config/index.js";
|
|
|
14
14
|
import { ensureClioState } from "../domains/lifecycle/index.js";
|
|
15
15
|
import type { ProvidersContract, TargetStatus } from "../domains/providers/contract.js";
|
|
16
16
|
import {
|
|
17
|
+
endpointCapacityForStatus,
|
|
17
18
|
isDispatchEligibleRuntime,
|
|
18
19
|
isOrchestratorEligibleRuntime,
|
|
19
20
|
ProvidersDomainModule,
|
|
@@ -24,7 +25,7 @@ import type { CapabilityFlags } from "../domains/providers/types/capability-flag
|
|
|
24
25
|
import type { RuntimeTier } from "../domains/providers/types/runtime-descriptor.js";
|
|
25
26
|
import { runConfigureCommand, runTargetRemove, runTargetRename } from "./configure.js";
|
|
26
27
|
import { printError, printOk } from "./shared.js";
|
|
27
|
-
import { column, terminalColumns, truncate } from "./text-layout.js";
|
|
28
|
+
import { column, terminalColumns, truncate, wrapPlain } from "./text-layout.js";
|
|
28
29
|
|
|
29
30
|
const HEADER: ReadonlyArray<string> = ["id", "tier", "runtime", "auth", "url", "model", "health", "caps", "notes"];
|
|
30
31
|
type ProviderOutputTier = RuntimeTier | "unknown";
|
|
@@ -805,9 +806,11 @@ export interface TargetTableRow {
|
|
|
805
806
|
health: string;
|
|
806
807
|
caps: string;
|
|
807
808
|
notes: string;
|
|
809
|
+
/** Full degraded-health reason, kept separately so a narrow table can repeat it below the row. */
|
|
810
|
+
diagnostic?: string;
|
|
808
811
|
}
|
|
809
812
|
|
|
810
|
-
type TargetTableColumn = keyof TargetTableRow
|
|
813
|
+
type TargetTableColumn = Exclude<keyof TargetTableRow, "diagnostic">;
|
|
811
814
|
type TargetTableWidths = Record<TargetTableColumn, number>;
|
|
812
815
|
|
|
813
816
|
const TABLE_COLUMNS: ReadonlyArray<TargetTableColumn> = [
|
|
@@ -918,20 +921,35 @@ export function formatTargetTable(
|
|
|
918
921
|
rows: ReadonlyArray<TargetTableRow>,
|
|
919
922
|
width: number,
|
|
920
923
|
paintHealth: (cell: string, row: TargetTableRow) => string = (cell) => cell,
|
|
921
|
-
): { header: string; rows: ReadonlyArray<string
|
|
924
|
+
): { header: string; rows: ReadonlyArray<string>; details: ReadonlyArray<ReadonlyArray<string>> } {
|
|
922
925
|
const widths = tableWidths(rows, width);
|
|
923
926
|
const line = (cells: ReadonlyArray<string>): string => cells.join(" ".repeat(TABLE_GAP)).trimEnd();
|
|
927
|
+
const formatted = rows.map((row) => {
|
|
928
|
+
const cells = TABLE_COLUMNS.map((key) => column(row[key], widths[key]));
|
|
929
|
+
const plain = line(cells);
|
|
930
|
+
const rendered =
|
|
931
|
+
plain.length > width
|
|
932
|
+
? truncate(plain, width)
|
|
933
|
+
: line(cells.map((cell, index) => (TABLE_COLUMNS[index] === "health" ? paintHealth(cell, row) : cell)));
|
|
934
|
+
const diagnosticFits = !row.diagnostic || (plain.length <= width && widths.notes >= row.diagnostic.length);
|
|
935
|
+
const details = diagnosticFits ? [] : targetDiagnosticDetails(row.diagnostic ?? "", width);
|
|
936
|
+
return { rendered, details };
|
|
937
|
+
});
|
|
924
938
|
return {
|
|
925
939
|
header: truncate(line(TABLE_COLUMNS.map((key, index) => column(HEADER[index] ?? key, widths[key]))), width),
|
|
926
|
-
rows:
|
|
927
|
-
|
|
928
|
-
const plain = line(cells);
|
|
929
|
-
if (plain.length > width) return truncate(plain, width);
|
|
930
|
-
return line(cells.map((cell, index) => (TABLE_COLUMNS[index] === "health" ? paintHealth(cell, row) : cell)));
|
|
931
|
-
}),
|
|
940
|
+
rows: formatted.map(({ rendered }) => rendered),
|
|
941
|
+
details: formatted.map(({ details }) => details),
|
|
932
942
|
};
|
|
933
943
|
}
|
|
934
944
|
|
|
945
|
+
/** Indented diagnostic text that retains every word when the table row cannot. */
|
|
946
|
+
function targetDiagnosticDetails(diagnostic: string, width: number): string[] {
|
|
947
|
+
const indent = 2;
|
|
948
|
+
return wrapPlain(`reason: ${diagnostic}`, Math.max(8, width - indent), indent).map((line, index) =>
|
|
949
|
+
index === 0 ? `${" ".repeat(indent)}${line}` : line,
|
|
950
|
+
);
|
|
951
|
+
}
|
|
952
|
+
|
|
935
953
|
function renderTable(providers: ProvidersContract, entries: ReadonlyArray<TargetStatus>): void {
|
|
936
954
|
const sorted = [...entries].sort(compareStatusByTier);
|
|
937
955
|
const table = formatTargetTable(
|
|
@@ -950,10 +968,12 @@ function renderTable(providers: ProvidersContract, entries: ReadonlyArray<Target
|
|
|
950
968
|
process.stdout.write(`${chalk.bold(table.header)}\n`);
|
|
951
969
|
}
|
|
952
970
|
process.stdout.write(`${table.rows[index] ?? ""}\n`);
|
|
971
|
+
for (const detail of table.details[index] ?? []) process.stdout.write(`${detail}\n`);
|
|
953
972
|
}
|
|
954
973
|
}
|
|
955
974
|
|
|
956
975
|
export function targetTableRow(providers: ProvidersContract, status: TargetStatus): TargetTableRow {
|
|
976
|
+
const diagnostic = degradedHealthDiagnostic(status);
|
|
957
977
|
return {
|
|
958
978
|
id: status.target.id,
|
|
959
979
|
tier: statusTier(status),
|
|
@@ -964,6 +984,7 @@ export function targetTableRow(providers: ProvidersContract, status: TargetStatu
|
|
|
964
984
|
health: status.health.status,
|
|
965
985
|
caps: capabilityBadges(status.capabilities),
|
|
966
986
|
notes: formatNotes(status),
|
|
987
|
+
...(diagnostic ? { diagnostic } : {}),
|
|
967
988
|
};
|
|
968
989
|
}
|
|
969
990
|
|
|
@@ -1044,22 +1065,29 @@ export function formatContextWindow(
|
|
|
1044
1065
|
: `ctx ${window}`;
|
|
1045
1066
|
}
|
|
1046
1067
|
|
|
1047
|
-
function formatNotes(status: TargetStatus): string {
|
|
1068
|
+
export function formatNotes(status: TargetStatus): string {
|
|
1048
1069
|
const parts: string[] = [];
|
|
1070
|
+
const diagnostic = degradedHealthDiagnostic(status);
|
|
1071
|
+
// The health diagnosis leads because gateway, context, and residency facts
|
|
1072
|
+
// are supplementary once the target says it cannot serve its default model.
|
|
1073
|
+
if (diagnostic) parts.push(diagnostic);
|
|
1074
|
+
const endpoint = endpointCapacityForStatus(status);
|
|
1075
|
+
if (endpoint) parts.push(`slots ${endpoint.limit}`);
|
|
1049
1076
|
if (status.target.gateway) parts.push("gateway");
|
|
1050
1077
|
if (status.runtime?.auth === "oauth") parts.push("oauth");
|
|
1051
1078
|
if (status.runtime?.auth === "claude-cli") parts.push("claude-cli");
|
|
1052
1079
|
if (status.capabilities.contextWindow > 0) parts.push(formatContextWindow(status));
|
|
1053
1080
|
if (!status.available && status.reason) parts.push(status.reason);
|
|
1054
|
-
// A reachable target that cannot serve its own default is degraded, and the
|
|
1055
|
-
// row has to say why or the model column reads as a model that works.
|
|
1056
|
-
if (status.health.status === "degraded" && status.health.lastError) parts.push(status.health.lastError);
|
|
1057
1081
|
const residency = residentModelsSummary(status.discoveredModelStates);
|
|
1058
1082
|
if (residency) parts.push(residency);
|
|
1059
1083
|
if (status.probeNotes && status.probeNotes.length > 0) parts.push(`note: ${status.probeNotes.join("; ")}`);
|
|
1060
1084
|
return parts.join(" ");
|
|
1061
1085
|
}
|
|
1062
1086
|
|
|
1087
|
+
function degradedHealthDiagnostic(status: TargetStatus): string | null {
|
|
1088
|
+
return status.health.status === "degraded" && status.health.lastError ? status.health.lastError : null;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1063
1091
|
function statusTier(status: TargetStatus): ProviderOutputTier {
|
|
1064
1092
|
return status.runtime?.tier ?? "unknown";
|
|
1065
1093
|
}
|
|
@@ -1120,6 +1148,7 @@ interface SerializedStatus {
|
|
|
1120
1148
|
tier: ProviderOutputTier;
|
|
1121
1149
|
detectedReasoning: boolean | null;
|
|
1122
1150
|
reasoningCandidateModelId: string | null;
|
|
1151
|
+
endpointCapacity?: ReturnType<typeof endpointCapacityForStatus>;
|
|
1123
1152
|
}
|
|
1124
1153
|
|
|
1125
1154
|
function serializeStatus(
|
|
@@ -1141,6 +1170,8 @@ function serializeStatus(
|
|
|
1141
1170
|
detectedReasoning: extras.detectedReasoning,
|
|
1142
1171
|
reasoningCandidateModelId: extras.candidateModelId,
|
|
1143
1172
|
};
|
|
1173
|
+
const endpointCapacity = endpointCapacityForStatus(status);
|
|
1174
|
+
if (endpointCapacity !== null) out.endpointCapacity = endpointCapacity;
|
|
1144
1175
|
if (status.contextWindowProvenance !== undefined) {
|
|
1145
1176
|
out.contextWindowProvenance = status.contextWindowProvenance;
|
|
1146
1177
|
}
|