@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,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of recent durable dispatch runs.
|
|
3
|
+
*
|
|
4
|
+
* `fleet view` is an operator-directed terminal surface: it accepts a run id,
|
|
5
|
+
* prints native evidence paths, and can follow one alternate-screen view. The
|
|
6
|
+
* GUI cannot safely reuse that transport. This command accepts no identifier
|
|
7
|
+
* or path, selects a bounded newest-first window itself, and emits only the
|
|
8
|
+
* already-sanitized view model fields a typed host adapter can further narrow.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
COUNCIL_TOPOLOGY_MAX_COUNCILS,
|
|
13
|
+
COUNCIL_TOPOLOGY_MAX_MEMBERS,
|
|
14
|
+
COUNCIL_TOPOLOGY_MAX_SCAN,
|
|
15
|
+
COUNCIL_TOPOLOGY_MAX_TURNS,
|
|
16
|
+
type CouncilApproval,
|
|
17
|
+
type CouncilOrigin,
|
|
18
|
+
type CouncilSynthesisKind,
|
|
19
|
+
councilTopologies,
|
|
20
|
+
} from "../domains/dispatch/council-topology.js";
|
|
21
|
+
import type { ExecutionRole } from "../domains/dispatch/execution-role.js";
|
|
22
|
+
import { listFleetRuns, openLedger } from "../domains/dispatch/state.js";
|
|
23
|
+
import type { RunOutcome, RunStatus } from "../domains/dispatch/types.js";
|
|
24
|
+
import { sanitizeCallTargetText } from "../domains/safety/call-target.js";
|
|
25
|
+
import { truncateToWidth } from "../engine/tui-primitives.js";
|
|
26
|
+
import { loadFleetRunViewModel, loadRunViewModel } from "./fleet-view.js";
|
|
27
|
+
|
|
28
|
+
export const FLEET_INSPECT_MAX_RUNS = 8;
|
|
29
|
+
export const FLEET_INSPECT_MAX_EVENTS = 32;
|
|
30
|
+
export const FLEET_INSPECT_MAX_ROOTS = 4;
|
|
31
|
+
export const FLEET_INSPECT_MAX_STEPS = 24;
|
|
32
|
+
export const FLEET_INSPECT_MAX_COUNCILS = COUNCIL_TOPOLOGY_MAX_COUNCILS;
|
|
33
|
+
export const FLEET_INSPECT_MAX_COUNCIL_MEMBERS = COUNCIL_TOPOLOGY_MAX_MEMBERS;
|
|
34
|
+
export const FLEET_INSPECT_MAX_COUNCIL_TURNS = COUNCIL_TOPOLOGY_MAX_TURNS;
|
|
35
|
+
|
|
36
|
+
const IDENTITY_WIDTH = 128;
|
|
37
|
+
const TASK_WIDTH = 400;
|
|
38
|
+
const EVENT_LABEL_WIDTH = 96;
|
|
39
|
+
const EVENT_DETAIL_WIDTH = 240;
|
|
40
|
+
const OUTCOME_WIDTH = 160;
|
|
41
|
+
const STEP_ID_WIDTH = 96;
|
|
42
|
+
|
|
43
|
+
export type FleetInspectEvidenceState = "pending" | "verified" | "failed" | "unavailable";
|
|
44
|
+
|
|
45
|
+
export interface FleetInspectEvent {
|
|
46
|
+
readonly at: string;
|
|
47
|
+
readonly label: string;
|
|
48
|
+
readonly detail: string | null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface FleetInspectRun {
|
|
52
|
+
readonly runId: string;
|
|
53
|
+
readonly agentId: string;
|
|
54
|
+
readonly model: string;
|
|
55
|
+
readonly target: string;
|
|
56
|
+
readonly node: string;
|
|
57
|
+
readonly phase: string;
|
|
58
|
+
readonly startedAt: string;
|
|
59
|
+
readonly elapsedMs: number;
|
|
60
|
+
readonly task: string | null;
|
|
61
|
+
readonly journal: "available" | "missing";
|
|
62
|
+
readonly events: readonly FleetInspectEvent[];
|
|
63
|
+
readonly eventsTruncated: boolean;
|
|
64
|
+
readonly evidence: Readonly<{
|
|
65
|
+
state: FleetInspectEvidenceState;
|
|
66
|
+
summary: string;
|
|
67
|
+
}>;
|
|
68
|
+
readonly outcome: string | null;
|
|
69
|
+
readonly outcomeDetail: string | null;
|
|
70
|
+
readonly terminal: boolean;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface FleetInspectRootStep {
|
|
74
|
+
readonly stepId: string;
|
|
75
|
+
/** The run the step terminated on, or null when the step never ran. */
|
|
76
|
+
readonly runId: string | null;
|
|
77
|
+
readonly agentId: string | null;
|
|
78
|
+
readonly outcome: string;
|
|
79
|
+
readonly detail: string | null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* One fleet root's step index.
|
|
84
|
+
*
|
|
85
|
+
* A root is not a run: it has no ledger row, receipt, or journal, so nothing
|
|
86
|
+
* here is a transcript. What it answers is the question the run window alone
|
|
87
|
+
* cannot, which is which planned steps a fleet had and which run each one
|
|
88
|
+
* terminated on. That turns the flat recent-run list into something an operator
|
|
89
|
+
* can trace back to the fleet that dispatched it.
|
|
90
|
+
*/
|
|
91
|
+
export interface FleetInspectRoot {
|
|
92
|
+
readonly rootId: string;
|
|
93
|
+
readonly fleet: string;
|
|
94
|
+
readonly startedAt: string;
|
|
95
|
+
readonly elapsedMs: number;
|
|
96
|
+
readonly running: boolean;
|
|
97
|
+
readonly resumedFrom: string | null;
|
|
98
|
+
readonly plannedSteps: number;
|
|
99
|
+
readonly recordedSteps: number;
|
|
100
|
+
readonly steps: readonly FleetInspectRootStep[];
|
|
101
|
+
readonly stepsTruncated: boolean;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface FleetInspectCouncilTurn {
|
|
105
|
+
readonly round: number;
|
|
106
|
+
readonly runId: string;
|
|
107
|
+
readonly status: RunStatus;
|
|
108
|
+
readonly outcome: RunOutcome | null;
|
|
109
|
+
readonly terminal: boolean;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface FleetInspectCouncilMember {
|
|
113
|
+
readonly label: string;
|
|
114
|
+
readonly agentId: string;
|
|
115
|
+
readonly target: string;
|
|
116
|
+
readonly model: string;
|
|
117
|
+
readonly executionRole: ExecutionRole;
|
|
118
|
+
readonly turns: readonly FleetInspectCouncilTurn[];
|
|
119
|
+
readonly turnsTruncated: boolean;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export interface FleetInspectCouncilJudge {
|
|
123
|
+
readonly runId: string;
|
|
124
|
+
readonly agentId: string;
|
|
125
|
+
readonly target: string;
|
|
126
|
+
readonly model: string;
|
|
127
|
+
readonly status: RunStatus;
|
|
128
|
+
readonly outcome: RunOutcome | null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* One council's topology, reconstructed from the same ledger the run window
|
|
133
|
+
* reads.
|
|
134
|
+
*
|
|
135
|
+
* A council is not a fleet root and owns no record of its own: it is a set of
|
|
136
|
+
* ordinary runs sharing a group stamp. What this carries is the shape of that
|
|
137
|
+
* set. The members' answers, the judge's synthesis prose, and the vote tally are
|
|
138
|
+
* free model text inside receipt output and stay on the host permanently, so a
|
|
139
|
+
* council row says who was seated, where each voice ran, how many rounds it
|
|
140
|
+
* took, and whether a synthesis was reached, and nothing about what was said.
|
|
141
|
+
*/
|
|
142
|
+
export interface FleetInspectCouncil {
|
|
143
|
+
readonly group: string;
|
|
144
|
+
readonly startedAt: string;
|
|
145
|
+
readonly endedAt: string | null;
|
|
146
|
+
readonly running: boolean;
|
|
147
|
+
readonly roundsPlanned: number | null;
|
|
148
|
+
readonly roundsObserved: number;
|
|
149
|
+
readonly origin: CouncilOrigin | null;
|
|
150
|
+
readonly approval: CouncilApproval | null;
|
|
151
|
+
readonly members: readonly FleetInspectCouncilMember[];
|
|
152
|
+
readonly membersTruncated: boolean;
|
|
153
|
+
readonly membersRejected: number;
|
|
154
|
+
readonly synthesis: Readonly<{
|
|
155
|
+
kind: CouncilSynthesisKind | null;
|
|
156
|
+
sealedRunId: string | null;
|
|
157
|
+
judge: FleetInspectCouncilJudge | null;
|
|
158
|
+
}>;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export interface FleetInspectSnapshot {
|
|
162
|
+
readonly version: 1;
|
|
163
|
+
readonly generatedAt: string;
|
|
164
|
+
readonly runs: readonly FleetInspectRun[];
|
|
165
|
+
readonly truncated: boolean;
|
|
166
|
+
readonly roots: readonly FleetInspectRoot[];
|
|
167
|
+
readonly rootsTruncated: boolean;
|
|
168
|
+
readonly councils: readonly FleetInspectCouncil[];
|
|
169
|
+
readonly councilsTruncated: boolean;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function bounded(value: string, width: number): string {
|
|
173
|
+
const sanitized = sanitizeCallTargetText(value);
|
|
174
|
+
if (sanitized.length === 0) return "unavailable";
|
|
175
|
+
return sanitizeCallTargetText(truncateToWidth(sanitized, width, "…", false));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function evidenceProjection(text: string): FleetInspectRun["evidence"] {
|
|
179
|
+
if (text.startsWith("receipt pending;")) {
|
|
180
|
+
return {
|
|
181
|
+
state: "pending",
|
|
182
|
+
summary: "Receipt pending; this run has not finalized.",
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
if (text.startsWith("RECEIPT INTEGRITY FAILED:")) {
|
|
186
|
+
return {
|
|
187
|
+
state: "failed",
|
|
188
|
+
summary: "Clio Coder rejected the stored receipt's integrity.",
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (text.startsWith("receipt unavailable:")) {
|
|
192
|
+
return {
|
|
193
|
+
state: "unavailable",
|
|
194
|
+
summary: "The durable receipt is unavailable.",
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
if (text.startsWith("trust v")) {
|
|
198
|
+
return { state: "verified", summary: bounded(text, EVENT_DETAIL_WIDTH) };
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
state: "unavailable",
|
|
202
|
+
summary: "Receipt trust could not be classified.",
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** Pure command payload builder, exported so the fixed CLI contract is testable without subprocess output capture. */
|
|
207
|
+
export function fleetInspectSnapshot(now: () => number = Date.now): FleetInspectSnapshot {
|
|
208
|
+
const ledgerRows = openLedger().list();
|
|
209
|
+
const selected = ledgerRows.slice(0, FLEET_INSPECT_MAX_RUNS);
|
|
210
|
+
// The council window is deliberately wider than the run window. A single
|
|
211
|
+
// council is up to five members over three rounds plus a judge and its sealed
|
|
212
|
+
// report, so a council that finished an hour ago holds no row in the eight
|
|
213
|
+
// newest runs. Selecting it from the same already-open ledger costs nothing
|
|
214
|
+
// but the scan; a second child process reading the same file would not.
|
|
215
|
+
const topology = councilTopologies(ledgerRows.slice(0, COUNCIL_TOPOLOGY_MAX_SCAN));
|
|
216
|
+
const runs: FleetInspectRun[] = [];
|
|
217
|
+
for (const row of selected) {
|
|
218
|
+
const model = loadRunViewModel(row.id, { now });
|
|
219
|
+
if (model === null) continue;
|
|
220
|
+
const visibleEvents = model.transcript.slice(-FLEET_INSPECT_MAX_EVENTS);
|
|
221
|
+
runs.push({
|
|
222
|
+
runId: bounded(model.runId, IDENTITY_WIDTH),
|
|
223
|
+
agentId: bounded(model.agentId, IDENTITY_WIDTH),
|
|
224
|
+
model: bounded(model.model, IDENTITY_WIDTH),
|
|
225
|
+
target: bounded(model.target, IDENTITY_WIDTH),
|
|
226
|
+
node: bounded(model.node, IDENTITY_WIDTH),
|
|
227
|
+
phase: bounded(model.phase, IDENTITY_WIDTH),
|
|
228
|
+
startedAt: model.startedAt,
|
|
229
|
+
elapsedMs: model.elapsedMs,
|
|
230
|
+
task: model.task === undefined ? null : bounded(model.task, TASK_WIDTH),
|
|
231
|
+
journal: model.journalPresent ? "available" : "missing",
|
|
232
|
+
events: visibleEvents.map((event) => ({
|
|
233
|
+
at: event.at,
|
|
234
|
+
label: bounded(event.label, EVENT_LABEL_WIDTH),
|
|
235
|
+
detail: event.detail === undefined ? null : bounded(event.detail, EVENT_DETAIL_WIDTH),
|
|
236
|
+
})),
|
|
237
|
+
eventsTruncated: model.transcriptTruncated || model.transcript.length > visibleEvents.length,
|
|
238
|
+
evidence: evidenceProjection(model.evidence),
|
|
239
|
+
outcome: model.outcome === null ? null : bounded(model.outcome, OUTCOME_WIDTH),
|
|
240
|
+
outcomeDetail: model.outcomeDetail === null ? null : bounded(model.outcomeDetail, OUTCOME_WIDTH),
|
|
241
|
+
terminal: model.terminal,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
const rootRecords = listFleetRuns();
|
|
245
|
+
const selectedRoots = rootRecords.slice(0, FLEET_INSPECT_MAX_ROOTS);
|
|
246
|
+
const roots: FleetInspectRoot[] = [];
|
|
247
|
+
for (const record of selectedRoots) {
|
|
248
|
+
const model = loadFleetRunViewModel(record.id, { now });
|
|
249
|
+
if (model === null) continue;
|
|
250
|
+
// The planned order is the order the operator wrote the fleet in, so the
|
|
251
|
+
// index keeps its head rather than its tail: an operator reading a step
|
|
252
|
+
// index is looking for where the fleet got to, not where it ended.
|
|
253
|
+
const visibleSteps = model.steps.slice(0, FLEET_INSPECT_MAX_STEPS);
|
|
254
|
+
roots.push({
|
|
255
|
+
rootId: bounded(model.rootId, IDENTITY_WIDTH),
|
|
256
|
+
fleet: bounded(model.fleet, IDENTITY_WIDTH),
|
|
257
|
+
startedAt: model.startedAt,
|
|
258
|
+
elapsedMs: model.elapsedMs,
|
|
259
|
+
running: model.running,
|
|
260
|
+
resumedFrom: model.resumedFrom === null ? null : bounded(model.resumedFrom, IDENTITY_WIDTH),
|
|
261
|
+
plannedSteps: model.plannedSteps,
|
|
262
|
+
recordedSteps: model.recordedSteps,
|
|
263
|
+
steps: visibleSteps.map((step) => ({
|
|
264
|
+
stepId: bounded(step.stepId, STEP_ID_WIDTH),
|
|
265
|
+
runId: step.runId === null ? null : bounded(step.runId, IDENTITY_WIDTH),
|
|
266
|
+
agentId: step.agentId === null ? null : bounded(step.agentId, IDENTITY_WIDTH),
|
|
267
|
+
outcome: bounded(step.outcome, OUTCOME_WIDTH),
|
|
268
|
+
detail: step.detail === undefined ? null : bounded(step.detail, OUTCOME_WIDTH),
|
|
269
|
+
})),
|
|
270
|
+
stepsTruncated: model.steps.length > visibleSteps.length,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
const councils: FleetInspectCouncil[] = topology.councils.map((council) => ({
|
|
274
|
+
group: bounded(council.group, IDENTITY_WIDTH),
|
|
275
|
+
startedAt: council.startedAt,
|
|
276
|
+
endedAt: council.endedAt,
|
|
277
|
+
running: council.running,
|
|
278
|
+
roundsPlanned: council.roundsPlanned,
|
|
279
|
+
roundsObserved: council.roundsObserved,
|
|
280
|
+
origin: council.origin,
|
|
281
|
+
approval: council.approval,
|
|
282
|
+
members: council.members.map((member) => ({
|
|
283
|
+
label: bounded(member.label, IDENTITY_WIDTH),
|
|
284
|
+
agentId: bounded(member.agentId, IDENTITY_WIDTH),
|
|
285
|
+
target: bounded(member.targetId, IDENTITY_WIDTH),
|
|
286
|
+
model: bounded(member.wireModelId, IDENTITY_WIDTH),
|
|
287
|
+
executionRole: member.executionRole,
|
|
288
|
+
turns: member.turns.map((turn) => ({
|
|
289
|
+
round: turn.round,
|
|
290
|
+
runId: bounded(turn.runId, IDENTITY_WIDTH),
|
|
291
|
+
status: turn.status,
|
|
292
|
+
outcome: turn.outcome,
|
|
293
|
+
terminal: turn.terminal,
|
|
294
|
+
})),
|
|
295
|
+
turnsTruncated: member.turnsTruncated,
|
|
296
|
+
})),
|
|
297
|
+
membersTruncated: council.membersTruncated,
|
|
298
|
+
membersRejected: council.membersRejected,
|
|
299
|
+
synthesis: {
|
|
300
|
+
kind: council.synthesis.kind,
|
|
301
|
+
sealedRunId: council.synthesis.sealedRunId === null ? null : bounded(council.synthesis.sealedRunId, IDENTITY_WIDTH),
|
|
302
|
+
judge:
|
|
303
|
+
council.synthesis.judge === null
|
|
304
|
+
? null
|
|
305
|
+
: {
|
|
306
|
+
runId: bounded(council.synthesis.judge.runId, IDENTITY_WIDTH),
|
|
307
|
+
agentId: bounded(council.synthesis.judge.agentId, IDENTITY_WIDTH),
|
|
308
|
+
target: bounded(council.synthesis.judge.targetId, IDENTITY_WIDTH),
|
|
309
|
+
model: bounded(council.synthesis.judge.wireModelId, IDENTITY_WIDTH),
|
|
310
|
+
status: council.synthesis.judge.status,
|
|
311
|
+
outcome: council.synthesis.judge.outcome,
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
}));
|
|
315
|
+
return {
|
|
316
|
+
version: 1,
|
|
317
|
+
generatedAt: new Date(now()).toISOString(),
|
|
318
|
+
runs,
|
|
319
|
+
truncated: ledgerRows.length > selected.length || runs.length !== selected.length,
|
|
320
|
+
roots,
|
|
321
|
+
rootsTruncated: rootRecords.length > selectedRoots.length || roots.length !== selectedRoots.length,
|
|
322
|
+
councils,
|
|
323
|
+
councilsTruncated: topology.truncated || ledgerRows.length > COUNCIL_TOPOLOGY_MAX_SCAN,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export function runFleetInspect(args: ReadonlyArray<string>): number {
|
|
328
|
+
if (args.length !== 1 || args[0] !== "--json") {
|
|
329
|
+
process.stderr.write("clio-coder fleet inspect: usage: clio-coder fleet inspect --json\n");
|
|
330
|
+
return 2;
|
|
331
|
+
}
|
|
332
|
+
process.stdout.write(`${JSON.stringify(fleetInspectSnapshot(), null, 2)}\n`);
|
|
333
|
+
return 0;
|
|
334
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-authenticate one run's sealed receipt, right now.
|
|
3
|
+
*
|
|
4
|
+
* `fleet inspect --json` already reports receipt trust, but it reports it as of
|
|
5
|
+
* the moment the snapshot was taken. This command reads the receipt and its
|
|
6
|
+
* ledger envelope off disk and runs the integrity check again, which is the
|
|
7
|
+
* only way to learn that a receipt trusted an hour ago no longer verifies.
|
|
8
|
+
* That is the whole difference, and it is why this exists beside the snapshot
|
|
9
|
+
* rather than inside it.
|
|
10
|
+
*
|
|
11
|
+
* Like `evidence inspect --json` it takes an identifier, because an operator
|
|
12
|
+
* names the run. A GUI host may only pass back a run id it served inside its
|
|
13
|
+
* current bounded window; see `apps/workbench/artifact-allowlist.ts`.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { readFileSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { clioStateDir } from "../core/xdg.js";
|
|
19
|
+
import { openLedger } from "../domains/dispatch/state.js";
|
|
20
|
+
import type { RunEnvelope, RunReceipt } from "../domains/dispatch/types.js";
|
|
21
|
+
import { inspectRunReceiptTrustStatus, TRUST_STATUS_AXES, type TrustStatusAxis } from "../domains/evidence/index.js";
|
|
22
|
+
|
|
23
|
+
/** Same vocabulary `fleet inspect --json` reports, so the two are comparable. */
|
|
24
|
+
export type FleetVerifyState = "pending" | "verified" | "failed" | "unavailable";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Why a receipt did not authenticate, as a closed set.
|
|
28
|
+
*
|
|
29
|
+
* The harness composes most of these from literals, but one branch interpolates
|
|
30
|
+
* a thrown error's message, which can carry anything including a path. So the
|
|
31
|
+
* reason is classified rather than quoted, and anything unrecognised becomes
|
|
32
|
+
* `unclassified` instead of arriving as prose.
|
|
33
|
+
*/
|
|
34
|
+
export const FLEET_VERIFY_REASONS = [
|
|
35
|
+
"integrity-mismatch",
|
|
36
|
+
"ledger-mismatch",
|
|
37
|
+
"integrity-invalid",
|
|
38
|
+
"execution-role-invalid",
|
|
39
|
+
"routing-intent-invalid",
|
|
40
|
+
"route-decision-invalid",
|
|
41
|
+
"receipt-unreadable",
|
|
42
|
+
"envelope-unavailable",
|
|
43
|
+
"unclassified",
|
|
44
|
+
] as const;
|
|
45
|
+
export type FleetVerifyReason = (typeof FLEET_VERIFY_REASONS)[number];
|
|
46
|
+
|
|
47
|
+
export interface FleetVerifySnapshot {
|
|
48
|
+
readonly version: 1;
|
|
49
|
+
readonly verifiedAt: string;
|
|
50
|
+
readonly runId: string;
|
|
51
|
+
readonly state: FleetVerifyState;
|
|
52
|
+
/** Null whenever the receipt authenticated or has not been sealed yet. */
|
|
53
|
+
readonly reason: FleetVerifyReason | null;
|
|
54
|
+
readonly axes: Readonly<Record<TrustStatusAxis, string>>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export class FleetVerifyUnknownRunError extends Error {
|
|
58
|
+
override readonly name = "FleetVerifyUnknownRunError";
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function classify(reason: string): FleetVerifyReason {
|
|
62
|
+
if (reason.startsWith("integrity mismatch")) return "integrity-mismatch";
|
|
63
|
+
// The harness names the diverging field after this prefix. Which field it was
|
|
64
|
+
// is a detail of the receipt, so the classification keeps the fact and drops
|
|
65
|
+
// the name rather than passing a fragment of the record through.
|
|
66
|
+
if (reason.startsWith("ledger mismatch")) return "ledger-mismatch";
|
|
67
|
+
if (reason.startsWith("integrity invalid")) return "integrity-invalid";
|
|
68
|
+
if (reason.startsWith("execution role invalid")) return "execution-role-invalid";
|
|
69
|
+
if (reason.startsWith("routing intent invalid")) return "routing-intent-invalid";
|
|
70
|
+
if (reason.startsWith("route decision invalid")) return "route-decision-invalid";
|
|
71
|
+
if (reason.startsWith("receipt unavailable")) return "receipt-unreadable";
|
|
72
|
+
if (reason.startsWith("run ledger envelope unavailable")) return "envelope-unavailable";
|
|
73
|
+
return "unclassified";
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function loadReceipt(envelope: RunEnvelope): RunReceipt | null {
|
|
77
|
+
const path = envelope.receiptPath ?? join(clioStateDir(), "receipts", `${envelope.id}.json`);
|
|
78
|
+
try {
|
|
79
|
+
return JSON.parse(readFileSync(path, "utf8")) as RunReceipt;
|
|
80
|
+
} catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Pure payload builder, exported so the fixed contract is testable without subprocess capture. */
|
|
86
|
+
export function fleetVerifySnapshot(runId: string, now: () => number = Date.now): FleetVerifySnapshot {
|
|
87
|
+
const envelope = openLedger().get(runId);
|
|
88
|
+
if (envelope === null) throw new FleetVerifyUnknownRunError(`unknown run '${runId}'`);
|
|
89
|
+
const verifiedAt = new Date(now()).toISOString();
|
|
90
|
+
const receipt = loadReceipt(envelope);
|
|
91
|
+
const inspection = inspectRunReceiptTrustStatus(receipt, envelope);
|
|
92
|
+
const axes = Object.fromEntries(TRUST_STATUS_AXES.map((axis) => [axis, inspection.status[axis].state])) as Record<
|
|
93
|
+
TrustStatusAxis,
|
|
94
|
+
string
|
|
95
|
+
>;
|
|
96
|
+
|
|
97
|
+
// A run that has not finalized has nothing to authenticate yet, which is a
|
|
98
|
+
// different answer from one whose receipt failed to authenticate.
|
|
99
|
+
if (receipt === null && envelope.receiptPath === null && envelope.endedAt === null) {
|
|
100
|
+
return { version: 1, verifiedAt, runId: envelope.id, state: "pending", reason: null, axes };
|
|
101
|
+
}
|
|
102
|
+
if (inspection.integrity.ok) {
|
|
103
|
+
return { version: 1, verifiedAt, runId: envelope.id, state: "verified", reason: null, axes };
|
|
104
|
+
}
|
|
105
|
+
const reason = classify(inspection.integrity.reason);
|
|
106
|
+
return {
|
|
107
|
+
version: 1,
|
|
108
|
+
verifiedAt,
|
|
109
|
+
runId: envelope.id,
|
|
110
|
+
// A receipt that could not be read at all is a missing artifact; one that
|
|
111
|
+
// was read and did not authenticate is a failure, and the two must not be
|
|
112
|
+
// reported as the same thing.
|
|
113
|
+
state: reason === "receipt-unreadable" || reason === "envelope-unavailable" ? "unavailable" : "failed",
|
|
114
|
+
reason,
|
|
115
|
+
axes,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function runFleetVerify(args: ReadonlyArray<string>): number {
|
|
120
|
+
const runId = args[0];
|
|
121
|
+
if (args.length !== 2 || runId === undefined || runId.startsWith("-") || args[1] !== "--json") {
|
|
122
|
+
process.stderr.write("clio-coder fleet verify: usage: clio-coder fleet verify <runId> --json\n");
|
|
123
|
+
return 2;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
process.stdout.write(`${JSON.stringify(fleetVerifySnapshot(runId), null, 2)}\n`);
|
|
127
|
+
return 0;
|
|
128
|
+
} catch (error) {
|
|
129
|
+
if (!(error instanceof FleetVerifyUnknownRunError)) throw error;
|
|
130
|
+
process.stderr.write(`clio-coder fleet verify: ${error.message}\n`);
|
|
131
|
+
return 1;
|
|
132
|
+
}
|
|
133
|
+
}
|