@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
|
@@ -11,6 +11,7 @@ import type { PermissionRequiredMeta, ToolRegistry } from "../tools/registry.js"
|
|
|
11
11
|
import { approvalParkedNotice, autonomyDeniedNotice, workerEscalationNotice } from "./bus-notices.js";
|
|
12
12
|
import type { ToolApprovalStateEvent } from "./chat-loop.js";
|
|
13
13
|
import type { NoticeLevel } from "./command-output.js";
|
|
14
|
+
import { createMutationInspector, type MutationInspector, mutationFacts } from "./mutation-preview.js";
|
|
14
15
|
import type { OverlayState } from "./overlay-key-routing.js";
|
|
15
16
|
import { type ApprovalRequestView, askAxis, describeCallTarget } from "./permission-overlay.js";
|
|
16
17
|
|
|
@@ -35,6 +36,7 @@ interface WorkerEscalationEntry {
|
|
|
35
36
|
axis: ApprovalRequestView["axis"];
|
|
36
37
|
reason: string;
|
|
37
38
|
target?: string;
|
|
39
|
+
fallback: "deny" | "fail";
|
|
38
40
|
}
|
|
39
41
|
|
|
40
42
|
export interface OverlayPermissionLifecycleDeps {
|
|
@@ -43,7 +45,12 @@ export interface OverlayPermissionLifecycleDeps {
|
|
|
43
45
|
dispatch: Pick<DispatchContract, "resolveWorkerPermission">;
|
|
44
46
|
getAutonomy(): string;
|
|
45
47
|
getOverlayState(): OverlayState;
|
|
46
|
-
|
|
48
|
+
/**
|
|
49
|
+
* Open the dialog for one parked call. `inspect` carries the complete
|
|
50
|
+
* mutation text and is the only channel that does; it is process-local by
|
|
51
|
+
* construction, so it is passed here rather than folded into the view.
|
|
52
|
+
*/
|
|
53
|
+
openPermissionOverlay(view: ApprovalRequestView, inspect?: MutationInspector): boolean;
|
|
47
54
|
closeOverlay(): void;
|
|
48
55
|
appendNotice(level: NoticeLevel, text: string): void;
|
|
49
56
|
applyApprovalState(event: ToolApprovalStateEvent): void;
|
|
@@ -131,6 +138,9 @@ function mainApprovalRequestView(
|
|
|
131
138
|
? { kind: "net" as const, ruleId: axisFromDecision.ruleId }
|
|
132
139
|
: { kind: "autonomy" as const, level: autonomy });
|
|
133
140
|
const target = describeCallTarget(call.tool, call.args);
|
|
141
|
+
// Facts only. The mutation text stays in the inspector the overlay opener
|
|
142
|
+
// gets; this object reaches the transcript row and the approval-state event.
|
|
143
|
+
const mutation = mutationFacts(call.tool, call.args);
|
|
134
144
|
return {
|
|
135
145
|
requestId: meta?.requestId ?? "permission-pending",
|
|
136
146
|
tool: call.tool,
|
|
@@ -144,10 +154,21 @@ function mainApprovalRequestView(
|
|
|
144
154
|
: {}),
|
|
145
155
|
...(call.tool === ToolNames.AskUser ? { exposure: askUserExposure(call.args) } : {}),
|
|
146
156
|
...(target.length > 0 ? { target } : {}),
|
|
157
|
+
...(mutation !== null ? { mutation } : {}),
|
|
147
158
|
...(queueDepth !== undefined && queueDepth > 1 ? { queueDepth } : {}),
|
|
148
159
|
};
|
|
149
160
|
}
|
|
150
161
|
|
|
162
|
+
/**
|
|
163
|
+
* The inspector for a main-agent ask, or undefined when there is nothing local
|
|
164
|
+
* to read. A worker escalation never gets one: its arguments stay in the
|
|
165
|
+
* worker, and the card says so rather than implying an inspection it cannot do.
|
|
166
|
+
*/
|
|
167
|
+
function mainMutationInspector(call: ClassifierCall, view: ApprovalRequestView): MutationInspector | undefined {
|
|
168
|
+
if (view.mutation === undefined) return undefined;
|
|
169
|
+
return createMutationInspector(call.tool, call.args, view.mutation);
|
|
170
|
+
}
|
|
171
|
+
|
|
151
172
|
function workerEscalationEntry(payload: PermissionRequestedPayload, autonomy: string): WorkerEscalationEntry | null {
|
|
152
173
|
if (!isLiveWorkerEscalationRequest(payload) || typeof payload.requestId !== "string") return null;
|
|
153
174
|
const origin = typeof payload.origin === "string" ? payload.origin : undefined;
|
|
@@ -170,6 +191,7 @@ function workerEscalationEntry(payload: PermissionRequestedPayload, autonomy: st
|
|
|
170
191
|
...(typeof payload.target === "string" && payload.target.length > 0
|
|
171
192
|
? { target: sanitizeCallTargetText(payload.target).slice(0, 200) }
|
|
172
193
|
: {}),
|
|
194
|
+
fallback: payload.fallback === "fail" ? "fail" : "deny",
|
|
173
195
|
};
|
|
174
196
|
}
|
|
175
197
|
|
|
@@ -187,42 +209,87 @@ function workerApprovalRequestView(entry: WorkerEscalationEntry): ApprovalReques
|
|
|
187
209
|
|
|
188
210
|
export function createOverlayPermissionLifecycle(deps: OverlayPermissionLifecycleDeps): OverlayPermissionLifecycle {
|
|
189
211
|
let pendingPermission: { call: ClassifierCall; decision: SafetyDecision; meta?: PermissionRequiredMeta } | null = null;
|
|
190
|
-
let pendingWorker:
|
|
212
|
+
let pendingWorker: WorkerEscalationEntry | null = null;
|
|
191
213
|
const workerQueue: WorkerEscalationEntry[] = [];
|
|
192
214
|
const announcedRequestIds = new Set<string>();
|
|
193
215
|
/** Worker escalations already surfaced, so one request parks the operator once. */
|
|
194
216
|
const announcedWorkerRequestIds = new Set<string>();
|
|
217
|
+
/** Expiry notices already printed, including a decision that lost the terminal-state race. */
|
|
218
|
+
const expiredWorkerRequestIds = new Set<string>();
|
|
195
219
|
let confirmed = false;
|
|
196
220
|
let stopping = false;
|
|
221
|
+
let withdrawingWorker = false;
|
|
197
222
|
|
|
198
|
-
const openWorker = (entry: WorkerEscalationEntry):
|
|
199
|
-
if (deps.
|
|
200
|
-
|
|
201
|
-
pendingWorker = { runId: entry.runId, requestId: entry.requestId, agentId: entry.agentId };
|
|
223
|
+
const openWorker = (entry: WorkerEscalationEntry): boolean => {
|
|
224
|
+
if (!deps.openPermissionOverlay(workerApprovalRequestView(entry))) return false;
|
|
225
|
+
pendingWorker = entry;
|
|
202
226
|
pendingPermission = null;
|
|
203
227
|
confirmed = false;
|
|
228
|
+
return true;
|
|
204
229
|
};
|
|
205
230
|
const maybeOpenWorker = (): void => {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
if (next) openWorker(next);
|
|
231
|
+
const next = workerQueue[0];
|
|
232
|
+
if (next && openWorker(next)) workerQueue.shift();
|
|
209
233
|
};
|
|
210
234
|
const retryPending = (): void => {
|
|
211
235
|
maybeOpenWorker();
|
|
212
|
-
if (deps.getOverlayState()
|
|
236
|
+
if (deps.getOverlayState() !== "permission-confirm" && deps.toolRegistry?.hasParkedCalls()) {
|
|
213
237
|
deps.toolRegistry.renotifyHead();
|
|
214
238
|
}
|
|
215
239
|
};
|
|
240
|
+
const announceWorkerExpiry = (
|
|
241
|
+
entry: WorkerEscalationEntry,
|
|
242
|
+
fallback: "deny" | "fail",
|
|
243
|
+
cause: "timeout" | "terminal" | "late-answer",
|
|
244
|
+
): void => {
|
|
245
|
+
if (!markPermissionRequestSurfaced(expiredWorkerRequestIds, entry.requestId)) return;
|
|
246
|
+
const why =
|
|
247
|
+
cause === "timeout"
|
|
248
|
+
? "expired after its escalation timeout"
|
|
249
|
+
: cause === "terminal"
|
|
250
|
+
? "expired when its run ended"
|
|
251
|
+
: "expired before the operator decision arrived";
|
|
252
|
+
deps.appendNotice(
|
|
253
|
+
"warn",
|
|
254
|
+
`Worker approval request ${entry.requestId} for ${entry.agentId} (${entry.runId}) ${why}; fallback ${fallback} applied.`,
|
|
255
|
+
);
|
|
256
|
+
};
|
|
257
|
+
const removeQueuedWorkers = (matches: (entry: WorkerEscalationEntry) => boolean): WorkerEscalationEntry[] => {
|
|
258
|
+
const removed: WorkerEscalationEntry[] = [];
|
|
259
|
+
for (let index = workerQueue.length - 1; index >= 0; index -= 1) {
|
|
260
|
+
const entry = workerQueue[index];
|
|
261
|
+
if (entry === undefined || !matches(entry)) continue;
|
|
262
|
+
removed.unshift(entry);
|
|
263
|
+
workerQueue.splice(index, 1);
|
|
264
|
+
}
|
|
265
|
+
return removed;
|
|
266
|
+
};
|
|
267
|
+
const withdrawWorkers = (
|
|
268
|
+
matches: (entry: WorkerEscalationEntry) => boolean,
|
|
269
|
+
cause: "timeout" | "terminal",
|
|
270
|
+
fallback?: "deny" | "fail",
|
|
271
|
+
): void => {
|
|
272
|
+
const active = pendingWorker !== null && matches(pendingWorker) ? pendingWorker : null;
|
|
273
|
+
const expired = [...(active === null ? [] : [active]), ...removeQueuedWorkers(matches)];
|
|
274
|
+
if (expired.length === 0) return;
|
|
275
|
+
if (active !== null) {
|
|
276
|
+
pendingWorker = null;
|
|
277
|
+
confirmed = false;
|
|
278
|
+
withdrawingWorker = true;
|
|
279
|
+
deps.closeOverlay();
|
|
280
|
+
}
|
|
281
|
+
for (const entry of expired) announceWorkerExpiry(entry, fallback ?? entry.fallback, cause);
|
|
282
|
+
deps.requestRender();
|
|
283
|
+
};
|
|
216
284
|
|
|
217
285
|
const unsubscribePermission =
|
|
218
286
|
deps.toolRegistry?.onPermissionRequired((call, decision, meta) => {
|
|
219
287
|
const autonomy = deps.getAutonomy();
|
|
220
288
|
const view = mainApprovalRequestView(call, decision, meta, autonomy, deps.toolRegistry?.parkedCount());
|
|
221
|
-
// The dialog states the tool,
|
|
222
|
-
//
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
// screen), which is the case where it is the operator's only signal.
|
|
289
|
+
// The dialog states the tool, target, action class, asking axis, and
|
|
290
|
+
// decision keys. Another modal is interrupted so this prompt can take
|
|
291
|
+
// focus. The notice remains for a second queued approval or a frame that
|
|
292
|
+
// could not mount, when it is the operator's only additional signal.
|
|
226
293
|
const announceParked = (): void => {
|
|
227
294
|
if (!markPermissionRequestSurfaced(announcedRequestIds, meta.requestId)) return;
|
|
228
295
|
const notice = approvalParkedNotice(call.tool, decision, autonomy);
|
|
@@ -236,11 +303,7 @@ export function createOverlayPermissionLifecycle(deps: OverlayPermissionLifecycl
|
|
|
236
303
|
view,
|
|
237
304
|
});
|
|
238
305
|
}
|
|
239
|
-
if (deps.
|
|
240
|
-
announceParked();
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
if (!deps.openPermissionOverlay(view)) {
|
|
306
|
+
if (!deps.openPermissionOverlay(view, mainMutationInspector(call, view))) {
|
|
244
307
|
announceParked();
|
|
245
308
|
return;
|
|
246
309
|
}
|
|
@@ -260,6 +323,18 @@ export function createOverlayPermissionLifecycle(deps: OverlayPermissionLifecycl
|
|
|
260
323
|
workerQueue.push(entry);
|
|
261
324
|
maybeOpenWorker();
|
|
262
325
|
});
|
|
326
|
+
const unsubscribeWorkerResolution = deps.bus.on(BusChannels.PermissionResolved, (payload) => {
|
|
327
|
+
if (typeof payload.requestId !== "string") return;
|
|
328
|
+
if (payload.decidedBy !== "timeout" && payload.status !== "expired") return;
|
|
329
|
+
const fallback = payload.fallback === "fail" ? "fail" : "deny";
|
|
330
|
+
withdrawWorkers((entry) => entry.requestId === payload.requestId, "timeout", fallback);
|
|
331
|
+
});
|
|
332
|
+
const withdrawTerminalRun = (payload: { runId?: unknown }): void => {
|
|
333
|
+
if (typeof payload.runId !== "string") return;
|
|
334
|
+
withdrawWorkers((entry) => entry.runId === payload.runId, "terminal");
|
|
335
|
+
};
|
|
336
|
+
const unsubscribeWorkerCompleted = deps.bus.on(BusChannels.DispatchCompleted, withdrawTerminalRun);
|
|
337
|
+
const unsubscribeWorkerFailed = deps.bus.on(BusChannels.DispatchFailed, withdrawTerminalRun);
|
|
263
338
|
|
|
264
339
|
const unsubscribeAutonomy =
|
|
265
340
|
deps.toolRegistry?.onAutonomyDenied((_call, decision, level) => {
|
|
@@ -269,6 +344,12 @@ export function createOverlayPermissionLifecycle(deps: OverlayPermissionLifecycl
|
|
|
269
344
|
}) ?? (() => {});
|
|
270
345
|
|
|
271
346
|
const onPermissionOverlayClosed = (): void => {
|
|
347
|
+
if (withdrawingWorker) {
|
|
348
|
+
withdrawingWorker = false;
|
|
349
|
+
confirmed = false;
|
|
350
|
+
retryPending();
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
272
353
|
const permission = pendingPermission;
|
|
273
354
|
const worker = pendingWorker;
|
|
274
355
|
pendingPermission = null;
|
|
@@ -279,10 +360,14 @@ export function createOverlayPermissionLifecycle(deps: OverlayPermissionLifecycl
|
|
|
279
360
|
try {
|
|
280
361
|
deps.dispatch.resolveWorkerPermission?.(worker.runId, worker.requestId, wasConfirmed ? "approve" : "deny");
|
|
281
362
|
} catch (error) {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
)
|
|
363
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
364
|
+
if (
|
|
365
|
+
/run or assignment '.+' is not active|run '.+' is (?:aborting|terminating)|no longer accepts input/u.test(message)
|
|
366
|
+
) {
|
|
367
|
+
announceWorkerExpiry(worker, worker.fallback, "late-answer");
|
|
368
|
+
} else {
|
|
369
|
+
deps.appendNotice("warn", `Could not deliver permission decision to run ${worker.runId}: ${message}`);
|
|
370
|
+
}
|
|
286
371
|
}
|
|
287
372
|
} else if (wasConfirmed && permission) {
|
|
288
373
|
deps.bus.emit(BusChannels.PermissionResolved, {
|
|
@@ -364,6 +449,9 @@ export function createOverlayPermissionLifecycle(deps: OverlayPermissionLifecycl
|
|
|
364
449
|
dispose: () => {
|
|
365
450
|
unsubscribePermission();
|
|
366
451
|
unsubscribeWorker();
|
|
452
|
+
unsubscribeWorkerResolution();
|
|
453
|
+
unsubscribeWorkerCompleted();
|
|
454
|
+
unsubscribeWorkerFailed();
|
|
367
455
|
unsubscribeAutonomy();
|
|
368
456
|
},
|
|
369
457
|
};
|
|
@@ -403,19 +403,83 @@ export function createOverlaySessionLifecycle(deps: OverlaySessionLifecycleDeps)
|
|
|
403
403
|
void runHandoffExtraction(session, fromSessionId, verdict.goal);
|
|
404
404
|
}
|
|
405
405
|
|
|
406
|
+
/** Characters of the second round's answer quoted in the terminal refusal. */
|
|
407
|
+
const HANDOFF_REFUSAL_QUOTE_CHARS = 200;
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* A refusal that says what was asked for and what came back, not only that no
|
|
411
|
+
* JSON object arrived. Both rounds are named, so an operator reading it knows
|
|
412
|
+
* two model calls were spent and on what.
|
|
413
|
+
*/
|
|
414
|
+
function terminalHandoffRefusal(firstReason: string, secondReason: string, secondText: string): string {
|
|
415
|
+
const answered = secondText.replace(/\s+/g, " ").trim().slice(0, HANDOFF_REFUSAL_QUOTE_CHARS);
|
|
416
|
+
return [
|
|
417
|
+
"the extraction round could not produce a handoff record after one repair attempt.",
|
|
418
|
+
`Asked for: one JSON object with decisions, facts, files, commands, and openQuestions.`,
|
|
419
|
+
`Round 1: ${firstReason}.`,
|
|
420
|
+
`Round 2: ${secondReason}.`,
|
|
421
|
+
`Round 2 returned: ${answered.length > 0 ? answered : "(nothing)"}`,
|
|
422
|
+
].join(" ");
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Extract, then repair once.
|
|
427
|
+
*
|
|
428
|
+
* A local model that answers with prose around the object, or with nothing
|
|
429
|
+
* parseable, used to end `/handoff` outright: every downstream behavior (the
|
|
430
|
+
* dropped-path listing, the `e` editor, accept-mints-a-session) was
|
|
431
|
+
* unreachable and the operator had paid for the round either way (issue
|
|
432
|
+
* #223). Exactly one repair round follows, quoting what came back and what
|
|
433
|
+
* the parser objected to, and both rounds bill through the same out-of-turn
|
|
434
|
+
* usage store.
|
|
435
|
+
*/
|
|
436
|
+
async function extractWithOneRepair(
|
|
437
|
+
goal: string,
|
|
438
|
+
): Promise<
|
|
439
|
+
| { ok: true; parsed: Extract<ReturnType<typeof parseHandoffExtraction>, { ok: true }> }
|
|
440
|
+
| { ok: false; level: "error" | "warn"; reason: string }
|
|
441
|
+
> {
|
|
442
|
+
const first = await deps.chat.extractHandoff(goal);
|
|
443
|
+
if (first.status !== "answered") {
|
|
444
|
+
return {
|
|
445
|
+
ok: false,
|
|
446
|
+
level: first.status === "failed" ? "error" : "warn",
|
|
447
|
+
reason: first.status === "aborted" ? "the extraction round was cancelled" : first.reason,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
const parsedFirst = parseHandoffExtraction(first.text);
|
|
451
|
+
if (parsedFirst.ok) return { ok: true, parsed: parsedFirst };
|
|
452
|
+
|
|
453
|
+
const second = await deps.chat.extractHandoff(goal, {
|
|
454
|
+
repair: { complaint: parsedFirst.reason, previous: first.text },
|
|
455
|
+
});
|
|
456
|
+
if (second.status !== "answered") {
|
|
457
|
+
return {
|
|
458
|
+
ok: false,
|
|
459
|
+
level: second.status === "failed" ? "error" : "warn",
|
|
460
|
+
reason:
|
|
461
|
+
second.status === "aborted"
|
|
462
|
+
? "the repair round was cancelled"
|
|
463
|
+
: `round 1 could not be read (${parsedFirst.reason}); the repair round then failed: ${second.reason}`,
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
const parsedSecond = parseHandoffExtraction(second.text);
|
|
467
|
+
if (parsedSecond.ok) return { ok: true, parsed: parsedSecond };
|
|
468
|
+
return {
|
|
469
|
+
ok: false,
|
|
470
|
+
level: "error",
|
|
471
|
+
reason: terminalHandoffRefusal(parsedFirst.reason, parsedSecond.reason, second.text),
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
|
|
406
475
|
async function runHandoffExtraction(session: SessionContract, fromSessionId: string, goal: string): Promise<void> {
|
|
407
476
|
const notice = deps.getSlashNotice();
|
|
408
|
-
const
|
|
409
|
-
if (
|
|
410
|
-
|
|
411
|
-
emitCommandNotice(notice, outcome.status === "failed" ? "error" : "warn", "handoff", reason);
|
|
412
|
-
return;
|
|
413
|
-
}
|
|
414
|
-
const parsed = parseHandoffExtraction(outcome.text);
|
|
415
|
-
if (!parsed.ok) {
|
|
416
|
-
emitCommandNotice(notice, "error", "handoff", parsed.reason);
|
|
477
|
+
const extraction = await extractWithOneRepair(goal);
|
|
478
|
+
if (!extraction.ok) {
|
|
479
|
+
emitCommandNotice(notice, extraction.level, "handoff", extraction.reason);
|
|
417
480
|
return;
|
|
418
481
|
}
|
|
482
|
+
const parsed = extraction.parsed;
|
|
419
483
|
const meta = session.current();
|
|
420
484
|
const cwd = typeof meta?.cwd === "string" && meta.cwd.length > 0 ? meta.cwd : null;
|
|
421
485
|
const entries = deps.readStructuredEntries(fromSessionId);
|
|
@@ -20,12 +20,15 @@ export interface OverlayTransitionsDeps {
|
|
|
20
20
|
export interface OverlayTransitions {
|
|
21
21
|
state: OverlayState;
|
|
22
22
|
handle: OverlayHandle | null;
|
|
23
|
+
/** Raise a permission prompt while preserving the modal it interrupted. */
|
|
24
|
+
showPermission(handle: OverlayHandle): boolean;
|
|
23
25
|
close(): void;
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
export function createOverlayTransitions(deps: OverlayTransitionsDeps): OverlayTransitions {
|
|
27
29
|
let state: OverlayState = "closed";
|
|
28
30
|
let handle: OverlayHandle | null = null;
|
|
31
|
+
let interrupted: { state: OverlayState; handle: OverlayHandle | null } | null = null;
|
|
29
32
|
|
|
30
33
|
return {
|
|
31
34
|
get state() {
|
|
@@ -44,6 +47,13 @@ export function createOverlayTransitions(deps: OverlayTransitionsDeps): OverlayT
|
|
|
44
47
|
set handle(next) {
|
|
45
48
|
handle = next;
|
|
46
49
|
},
|
|
50
|
+
showPermission(nextHandle) {
|
|
51
|
+
if (state === "permission-confirm") return false;
|
|
52
|
+
interrupted = state === "closed" ? null : { state, handle };
|
|
53
|
+
state = "permission-confirm";
|
|
54
|
+
handle = nextHandle;
|
|
55
|
+
return true;
|
|
56
|
+
},
|
|
47
57
|
close,
|
|
48
58
|
};
|
|
49
59
|
|
|
@@ -55,12 +65,16 @@ export function createOverlayTransitions(deps: OverlayTransitionsDeps): OverlayT
|
|
|
55
65
|
return;
|
|
56
66
|
}
|
|
57
67
|
const leaving = state;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
68
|
+
const leavingHandle = handle;
|
|
69
|
+
const restoring = leaving === "permission-confirm" ? interrupted : null;
|
|
70
|
+
interrupted = null;
|
|
71
|
+
state = restoring?.state ?? "closed";
|
|
72
|
+
handle = restoring?.handle ?? null;
|
|
73
|
+
if (restoring === null) deps.stopDispatchBoardTicker();
|
|
74
|
+
leavingHandle?.hide();
|
|
62
75
|
if (leaving === "permission-confirm") deps.onPermissionOverlayClosed();
|
|
63
76
|
else deps.onOverlayClosed?.();
|
|
77
|
+
restoring?.handle?.focus();
|
|
64
78
|
deps.renderContextIsland();
|
|
65
79
|
deps.renderTaskIsland();
|
|
66
80
|
deps.requestRender();
|