@iowarp/clio-coder 0.3.8 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +102 -0
- package/NOTICE +33 -0
- package/README.md +12 -3
- package/dist/{acp-U67UHUK2.js → acp-G5WJBNCT.js} +13 -12
- package/dist/{agents-YU6SGALZ.js → agents-FMV2Q5G4.js} +41 -36
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-5ZPJOIVG.js → auth-3IDSJEIK.js} +18 -18
- package/dist/{builtins-C6JMZVV6.js → builtins-XCZWXSC7.js} +5 -5
- package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
- package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
- package/dist/{chunk-XWSF374K.js → chunk-2OQE55CK.js} +3 -3
- package/dist/{chunk-5H3GB5BO.js → chunk-32KWKNSF.js} +8 -384
- package/dist/{chunk-KTYTFRMB.js → chunk-36EJLSQQ.js} +34 -36
- package/dist/{chunk-FHJEP5SW.js → chunk-3BT2XMV4.js} +19 -13
- package/dist/chunk-3DPEIQKN.js +113 -0
- package/dist/{chunk-GU2UIAFZ.js → chunk-3URVFKWK.js} +7 -7
- package/dist/{chunk-WEH5XRJQ.js → chunk-3XML7CDN.js} +3 -3
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
- package/dist/{chunk-VCBR6CU7.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-NMPKI6XL.js → chunk-6DB53AJS.js} +203 -25
- package/dist/{chunk-3BINW3FP.js → chunk-76ONBSIA.js} +2 -2
- package/dist/{chunk-26LEYJZH.js → chunk-7MCTRUCE.js} +2 -2
- package/dist/{chunk-TYPGUK6W.js → chunk-AB44T6BB.js} +111 -5
- package/dist/{chunk-K4XHGFR5.js → chunk-B7OBL7PK.js} +317 -721
- package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
- package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
- package/dist/{chunk-ZVJ5BLO2.js → chunk-BKFJHQCA.js} +154 -16
- package/dist/chunk-BKFM6EJV.js +462 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-ZNLWCMVZ.js → chunk-BPKCPIL7.js} +2 -2
- package/dist/{chunk-TLQJPP24.js → chunk-BUMFYQFY.js} +1394 -1349
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/chunk-C2LTL2W6.js +2447 -0
- package/dist/{chunk-ME6CCNFO.js → chunk-CODPRO7Q.js} +8 -8
- package/dist/{chunk-E77JEWSD.js → chunk-CTJ4RNAA.js} +7 -37
- package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
- package/dist/{chunk-7RFXX52T.js → chunk-DQITNCXG.js} +642 -172
- package/dist/{chunk-TTHACPOM.js → chunk-DYJP44XW.js} +578 -117
- package/dist/{chunk-2HFZQUHL.js → chunk-F4CKPOEQ.js} +18 -8
- package/dist/{chunk-DGSYXYMX.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GKF55TAZ.js +391 -0
- package/dist/{chunk-VWZOAB7K.js → chunk-GR5G2PVF.js} +9 -8
- package/dist/{chunk-4DGYLA73.js → chunk-GXNLGKAB.js} +80 -9
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/{chunk-IIZWH4XA.js → chunk-HI63TFOG.js} +5 -4
- package/dist/{chunk-WLFILSD5.js → chunk-HJJTYUHX.js} +113 -83
- package/dist/{chunk-TT36MB5S.js → chunk-HLW2MRKE.js} +3 -1
- package/dist/{chunk-PMDBGQSJ.js → chunk-HWHKMHUA.js} +7 -7
- package/dist/chunk-HZHHCK24.js +1631 -0
- package/dist/{chunk-WSB3FPX7.js → chunk-I5VEOC6I.js} +39 -143
- package/dist/chunk-IBEBSCYA.js +564 -0
- package/dist/chunk-IQ7KR472.js +362 -0
- package/dist/{chunk-A3WNZD3P.js → chunk-J4W7KFM7.js} +949 -972
- package/dist/{chunk-TB5666IT.js → chunk-JDG2WCRO.js} +5 -5
- package/dist/{chunk-N22QMJKY.js → chunk-K5C3NCBD.js} +4 -4
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-5C3AQNDW.js → chunk-KFZI4NIL.js} +216 -38
- package/dist/chunk-KMVISBZR.js +132 -0
- package/dist/{chunk-WXY7KU3G.js → chunk-LDQ2ZF2M.js} +2 -2
- package/dist/{chunk-XN3L4EYL.js → chunk-LQ3DZAMX.js} +3 -3
- package/dist/{chunk-U6MBIEMB.js → chunk-LY4S7GJC.js} +173 -144
- package/dist/{chunk-4SPRNWDE.js → chunk-MLKNTWH2.js} +19 -19
- package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-SPULKLCF.js → chunk-NHCZP4K7.js} +3 -3
- package/dist/chunk-NHLBIGRH.js +1506 -0
- package/dist/chunk-NQQH3YT7.js +302 -0
- package/dist/chunk-NYS75XW5.js +15 -0
- package/dist/{chunk-GN57SG4G.js → chunk-O4XIVISU.js} +10 -8
- package/dist/{chunk-EMYUUSFG.js → chunk-O6TL7WWY.js} +6 -6
- package/dist/chunk-OQBA45DZ.js +97 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
- package/dist/{chunk-J3YUBZWY.js → chunk-QBJA7R7N.js} +62 -6
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-2HEJ2F35.js → chunk-QLFS5GO2.js} +22 -10
- package/dist/{chunk-7RGZWPB6.js → chunk-QLL7ILRG.js} +95 -32
- package/dist/{chunk-YS5VLNH5.js → chunk-QREDIESB.js} +6 -6
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
- package/dist/chunk-RKKLTLYB.js +45 -0
- package/dist/{chunk-P43ETTHK.js → chunk-SJ5ZKQ4S.js} +2 -2
- package/dist/{chunk-GPIEI3LY.js → chunk-SP2RXXYO.js} +6 -54
- package/dist/chunk-SUCTJL45.js +45 -0
- package/dist/{chunk-DYIM5TJT.js → chunk-SUW5DORT.js} +263 -7
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/{chunk-FJ3H4MN5.js → chunk-TZ3SGWZZ.js} +3 -3
- package/dist/{chunk-MXKJU4JB.js → chunk-U77AMWDL.js} +91 -10
- package/dist/{chunk-5DHKRSMQ.js → chunk-ULC6OTWO.js} +11 -7
- package/dist/{chunk-RWSI4YD7.js → chunk-UM7N4G5A.js} +33 -12
- package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
- package/dist/{chunk-IGWKHNIQ.js → chunk-UXMFQ54G.js} +44 -37
- package/dist/{chunk-HFSBBKSQ.js → chunk-V5DHCITQ.js} +171 -3
- package/dist/{chunk-5WIGXA4T.js → chunk-VAZSBTKF.js} +111 -4
- package/dist/{chunk-VHN4MY6O.js → chunk-VEO4AP2K.js} +2 -2
- package/dist/{chunk-IJ7RPIYJ.js → chunk-VFA6GDY5.js} +65 -4
- package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
- package/dist/chunk-VO67MWHC.js +75 -0
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-TANS5ZJS.js → chunk-VYMXRQI6.js} +36 -22
- package/dist/{chunk-WWCZ5F23.js → chunk-W5VSYASO.js} +77 -16
- package/dist/{chunk-WNIJTQQK.js → chunk-WZR7K7ZX.js} +72 -116
- package/dist/{chunk-5Q2VVUKB.js → chunk-X3YGUTOB.js} +4 -4
- package/dist/chunk-X75E3D2N.js +686 -0
- package/dist/{chunk-VAWNZU7Z.js → chunk-YDFRH54B.js} +4 -4
- package/dist/chunk-YJX4SHTD.js +40 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/chunk-Z2RR6MAK.js +127 -0
- package/dist/{chunk-FBVTI2TJ.js → chunk-Z4TXYIEG.js} +12 -131
- package/dist/cli/index.js +47 -36
- package/dist/{clio-QVTYJ57A.js → clio-2JXHBBY5.js} +7 -7
- package/dist/{code-nav-FGGFIE7L.js → code-nav-3YYRMYNF.js} +8 -8
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
- package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
- package/dist/{config-LW5IJFQN.js → config-QZPCMYSO.js} +99 -63
- package/dist/{configure-7XIZCOU4.js → configure-TEGEBYCA.js} +23 -22
- package/dist/{context-Y6Y7QPR6.js → context-AV7OEZ4D.js} +12 -12
- package/dist/{context-L3WL3X7K.js → context-E6H5RNMC.js} +56 -47
- package/dist/{context-N52ZA626.js → context-GSXUE4CT.js} +29 -27
- package/dist/{context-clear-MBQRLSDQ.js → context-clear-SHIBYK6T.js} +55 -46
- package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
- package/dist/{context-working-set-GS6DSO7F.js → context-working-set-5ZGKPGZQ.js} +13 -13
- package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-EFMJT4LD.js} +93 -64
- package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
- package/dist/doctor-QOA5FNY5.js +313 -0
- package/dist/{eval-BEC2WHDA.js → eval-TFBYQH4H.js} +2032 -156
- package/dist/eval-inventory-SXH7PDKX.js +316 -0
- package/dist/{evidence-REJUMSKM.js → evidence-ERGESKGN.js} +203 -48
- package/dist/{evolve-PY5ZBA5K.js → evolve-VDXTSYCJ.js} +52 -43
- package/dist/{extensions-HVKU65YU.js → extensions-7BGBHN57.js} +13 -7
- package/dist/{fleet-7WZEWRFA.js → fleet-2RRVDF2V.js} +228 -108
- package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-VJ726XIA.js} +11 -11
- package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
- package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-JF5QOATM.js} +18 -15
- package/dist/fleet-inspect-VLY4S7QM.js +442 -0
- package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-AIZUEJOY.js} +5 -5
- package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-AJRPDMDV.js} +22 -19
- package/dist/fleet-verify-JFEL2L3H.js +175 -0
- package/dist/fleet-view-ZCON35AG.js +102 -0
- package/dist/{init-OG3TPGQG.js → init-DN2WWLFE.js} +72 -62
- package/dist/install-XGLBQY5E.js +13 -0
- package/dist/interop-OZBKXAYL.js +114 -0
- package/dist/{library-CNTMPLRF.js → library-YWZG7IMW.js} +21 -18
- package/dist/{memory-6IS7F275.js → memory-I4C4HMLW.js} +54 -45
- package/dist/{models-ENRJDA5W.js → models-CEYXJBO6.js} +33 -30
- package/dist/{monitor-XLDVO7TN.js → monitor-NZ6GCI3P.js} +59 -52
- package/dist/{orchestrator-6KSPYRHA.js → orchestrator-GCGQ4N5I.js} +7827 -7328
- package/dist/panes-HMABYVO4.js +58 -0
- package/dist/panes-KY6W3V2E.js +103 -0
- package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
- package/dist/{reset-RZ4ER727.js → reset-DQ6FGCSH.js} +13 -11
- package/dist/resources-BB3MVJMD.js +111 -0
- package/dist/{run-Y2CNK5RU.js → run-H2GQDUER.js} +119 -87
- package/dist/{share-A55GYP6Z.js → share-GTJN6A5O.js} +20 -17
- package/dist/{skills-ALC5J6AT.js → skills-L55TEW6R.js} +33 -24
- package/dist/{skills-eval-JPBEBYQU.js → skills-eval-XVXPH2JI.js} +67 -56
- package/dist/skills-inventory-S4MXPJFV.js +126 -0
- package/dist/slash-commands-ZSGASKJC.js +77 -0
- package/dist/{steer-GGWFUJUD.js → steer-RZGSCY4R.js} +4 -4
- package/dist/{support-MIETYA5E.js → support-PKEUNNQL.js} +6 -6
- package/dist/{targets-VGNXIR3S.js → targets-NCPZ644J.js} +68 -40
- package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-44SV3YCN.js} +6 -4
- package/dist/tools-DAF3DI3C.js +27 -0
- package/dist/{trace-PNCASAXC.js → trace-FYVW2MQA.js} +207 -10
- package/dist/tui-primitives-2AKXQNZK.js +13 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
- package/dist/{upgrade-FUSUAGHR.js → upgrade-3XPP6OQL.js} +27 -24
- package/dist/{usage-N4MKVHKD.js → usage-3NLHGTU2.js} +114 -62
- package/dist/{verifiers-YAWOJ3H2.js → verifiers-SSQONKRT.js} +172 -13
- package/dist/{verify-LTDHYBGY.js → verify-3U6J7FZI.js} +10 -10
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
- package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-CEHYGPGQ.js} +75 -65
- package/dist/with-panes-MKB46MPQ.js +782 -0
- package/dist/worker/entry.js +106 -75
- package/docs/README.md +3 -2
- package/docs/acp.md +24 -3
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +9 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +62 -3
- package/docs/commands-and-modes.md +31 -2
- package/docs/configuration-and-targets.md +69 -12
- package/docs/context-engine.md +63 -4
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +5 -5
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -0
- package/docs/eval-runner.md +262 -11
- package/docs/evals-internal.md +72 -2
- package/docs/evidence-and-memory.md +12 -11
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +1 -1
- package/docs/extensions-and-sharing.md +27 -1
- package/docs/fleet-dispatch.md +25 -4
- package/docs/installation-and-lifecycle.md +15 -2
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +55 -4
- package/docs/proactive-memory.md +127 -14
- package/docs/prompt-envelope-and-tools.md +19 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +19 -3
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +88 -1
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +5 -2
- package/src/cli/acp.ts +6 -2
- package/src/cli/agents.ts +1 -1
- package/src/cli/argv.ts +25 -0
- package/src/cli/config-inspect.ts +33 -6
- package/src/cli/config.ts +1 -1
- package/src/cli/configure.ts +23 -21
- package/src/cli/doctor-panes.ts +124 -0
- package/src/cli/doctor-state-size.ts +82 -0
- package/src/cli/doctor-toolchain.ts +57 -0
- package/src/cli/doctor.ts +22 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +93 -16
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/extensions.ts +5 -1
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +810 -0
- package/src/cli/fleet.ts +179 -39
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +5 -2
- package/src/cli/run.ts +58 -0
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +44 -13
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +85 -5
- package/src/cli/usage.ts +63 -14
- package/src/cli/verifiers-inspect.ts +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/core/bus-events.ts +33 -1
- package/src/core/cache-telemetry.ts +42 -0
- package/src/core/config.ts +67 -0
- package/src/core/defaults.ts +124 -8
- package/src/core/endpoint-key.ts +27 -0
- package/src/core/residency-target-key.ts +25 -0
- package/src/core/response-schema.ts +80 -6
- package/src/core/theme-token-hex.ts +43 -0
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +164 -35
- package/src/domains/config/classify.ts +6 -0
- package/src/domains/context/codewiki/coordinator.ts +12 -4
- package/src/domains/dispatch/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +52 -14
- package/src/domains/dispatch/capacity-lease.ts +118 -9
- package/src/domains/dispatch/contract.ts +11 -0
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/execution-plan.ts +44 -4
- package/src/domains/dispatch/extension.ts +378 -82
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-run.ts +87 -4
- package/src/domains/dispatch/gate-decisions.ts +11 -1
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/heartbeat.ts +32 -8
- package/src/domains/dispatch/index.ts +22 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/orphan-recovery.ts +5 -0
- package/src/domains/dispatch/reservation-store.ts +139 -11
- package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +598 -0
- package/src/domains/dispatch/state.ts +49 -1
- package/src/domains/dispatch/types.ts +13 -0
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-spawn.ts +25 -11
- package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
- package/src/domains/dispatch/write-boundary.ts +62 -1
- package/src/domains/eval/artifacts/store.ts +62 -0
- package/src/domains/eval/compare/behavioral.ts +224 -0
- package/src/domains/eval/compare/compare.ts +342 -2
- package/src/domains/eval/compare/envelope.ts +128 -0
- package/src/domains/eval/compare/gates.ts +24 -6
- package/src/domains/eval/compare/thresholds.ts +30 -3
- package/src/domains/eval/execution-provenance.ts +240 -0
- package/src/domains/eval/inventory.ts +113 -0
- package/src/domains/eval/metrics/aggregate.ts +136 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
- package/src/domains/eval/metrics/tracked.ts +413 -0
- package/src/domains/eval/provenance.ts +117 -0
- package/src/domains/eval/reports/comparison.ts +128 -0
- package/src/domains/eval/reports/junit.ts +17 -3
- package/src/domains/eval/reports/markdown.ts +3 -3
- package/src/domains/eval/reports/text.ts +14 -0
- package/src/domains/eval/run-compare.ts +20 -0
- package/src/domains/eval/runners/clio-run.ts +127 -0
- package/src/domains/eval/runners/external-command.ts +28 -3
- package/src/domains/eval/schema/adapter.ts +111 -0
- package/src/domains/eval/schema/artifact.ts +20 -0
- package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
- package/src/domains/eval/schema/behavioral.ts +520 -0
- package/src/domains/eval/schema/execution-envelope.ts +194 -0
- package/src/domains/eval/schema/serving.ts +105 -0
- package/src/domains/eval/schema/suite.ts +38 -8
- package/src/domains/eval/schema/validate.ts +58 -3
- package/src/domains/eval/schema/verdict.ts +237 -0
- package/src/domains/eval/suites/resolve.ts +2 -0
- package/src/domains/eval/suites/run.ts +264 -33
- package/src/domains/eval/verifiers/command.ts +2 -1
- package/src/domains/eval/workspaces/temp-copy.ts +145 -13
- package/src/domains/evidence/build.ts +2 -13
- package/src/domains/evidence/eval.ts +2 -12
- package/src/domains/evidence/findings-markdown.ts +33 -0
- package/src/domains/evidence/run-trust.ts +7 -113
- package/src/domains/evidence/store.ts +6 -0
- package/src/domains/evidence/trust-projection.ts +2 -2
- package/src/domains/extensions/compatibility.ts +285 -0
- package/src/domains/extensions/discovery.ts +38 -3
- package/src/domains/extensions/resources.ts +1 -1
- package/src/domains/extensions/state.ts +12 -3
- package/src/domains/extensions/types.ts +2 -0
- package/src/domains/lifecycle/doctor.ts +69 -1
- package/src/domains/memory/index.ts +14 -1
- package/src/domains/memory/task-bank-promotion.ts +64 -0
- package/src/domains/memory/task-memory-policy.ts +82 -17
- package/src/domains/memory/task-memory-spend.ts +131 -0
- package/src/domains/memory/task-memory-status.ts +7 -0
- package/src/domains/memory/task-memory-telemetry.ts +3 -0
- package/src/domains/middleware/index.ts +1 -0
- package/src/domains/middleware/memory-intervention.ts +97 -21
- package/src/domains/middleware/memory-step-endpoint.ts +71 -0
- package/src/domains/mux/contract.ts +434 -0
- package/src/domains/mux/detect.ts +158 -0
- package/src/domains/mux/extension.ts +47 -0
- package/src/domains/mux/index.ts +96 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +164 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +49 -0
- package/src/domains/mux/socket-client.ts +816 -0
- package/src/domains/mux/types.ts +222 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +180 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +228 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/background-memory-usage.ts +140 -0
- package/src/domains/observability/cost.ts +22 -1
- package/src/domains/observability/index.ts +9 -0
- package/src/domains/observability/out-of-turn-usage.ts +51 -2
- package/src/domains/observability/trace-store.ts +234 -2
- package/src/domains/prompts/compiler.ts +100 -13
- package/src/domains/providers/endpoint-capacity.ts +228 -0
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +20 -3
- package/src/domains/providers/index.ts +32 -0
- package/src/domains/providers/model-runtime-capabilities.ts +32 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
- package/src/domains/providers/runtime-resolution.ts +8 -1
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
- package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
- package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- package/src/domains/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/target-descriptor.ts +2 -0
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/prompts/loader.ts +95 -33
- package/src/domains/resources/skills/loader.ts +33 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/safety/call-target.ts +52 -0
- package/src/domains/safety/run-effects.ts +35 -4
- package/src/domains/session/context-accounting.ts +52 -1
- package/src/domains/session/context-ledger.ts +37 -13
- package/src/domains/session/index.ts +6 -0
- package/src/domains/session/prompt-cache.ts +140 -0
- package/src/domains/session/prompt-manifest.ts +42 -0
- package/src/domains/toolchain/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/adapter.ts +18 -3
- package/src/engine/acp/server.ts +413 -70
- package/src/engine/acp/types.ts +19 -1
- package/src/engine/ai.ts +35 -0
- package/src/engine/apis/llamacpp-residency.ts +55 -3
- package/src/engine/apis/lmstudio.ts +25 -5
- package/src/engine/apis/ollama-native.ts +2 -1
- package/src/engine/apis/openai-completions.ts +80 -17
- package/src/engine/apis/residency-lock.ts +3 -1
- package/src/engine/apis/residency.ts +34 -1
- package/src/engine/claude/sdk-module.ts +98 -0
- package/src/engine/claude/sdk-runtime.ts +19 -11
- package/src/engine/provider-payload.ts +29 -1
- package/src/engine/tui-primitives.ts +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-runtime.ts +2 -13
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +279 -35
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/chat-loop-messages.ts +26 -7
- package/src/interactive/chat-loop.ts +318 -41
- package/src/interactive/chat-panel.ts +62 -8
- package/src/interactive/clio-editor.ts +45 -8
- package/src/interactive/context-activity.ts +5 -1
- package/src/interactive/context-meter.ts +1 -1
- package/src/interactive/context-overlay.ts +41 -10
- package/src/interactive/cost-overlay.ts +66 -6
- package/src/interactive/council-grid.ts +1 -3
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +102 -20
- package/src/interactive/fleet-run-preview.ts +41 -15
- package/src/interactive/handoff-round.ts +41 -2
- package/src/interactive/interactive-application.ts +177 -7
- package/src/interactive/interactive-input-runtime.ts +15 -0
- package/src/interactive/interactive-presentation.ts +4 -0
- package/src/interactive/interactive-shell.ts +20 -17
- package/src/interactive/interactive-slash-runtime.ts +63 -10
- package/src/interactive/memory-overlay.ts +9 -0
- package/src/interactive/modal-marker.ts +170 -0
- package/src/interactive/mutation-preview.ts +295 -0
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +58 -2
- package/src/interactive/overlay-general-openers.ts +17 -0
- package/src/interactive/overlay-key-routing.ts +52 -3
- package/src/interactive/overlay-lifecycle.ts +56 -7
- package/src/interactive/overlay-model-selectors.ts +40 -3
- package/src/interactive/overlay-permission-lifecycle.ts +112 -24
- package/src/interactive/overlay-session-lifecycle.ts +73 -9
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +1 -0
- package/src/interactive/overlays/ask-user.ts +227 -49
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +1 -0
- package/src/interactive/overlays/cwd-fallback.ts +1 -0
- package/src/interactive/overlays/decisions.ts +11 -11
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +1 -0
- package/src/interactive/overlays/handoff-review.ts +1 -0
- package/src/interactive/overlays/help-reference.ts +6 -0
- package/src/interactive/overlays/interop.ts +1 -0
- package/src/interactive/overlays/library-install-confirm.ts +1 -0
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +1 -0
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +1 -0
- package/src/interactive/overlays/prompts.ts +12 -1
- package/src/interactive/overlays/session-selector.ts +1 -0
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +614 -45
- package/src/interactive/overlays/side-question.ts +1 -0
- package/src/interactive/overlays/skills-hub.ts +3 -11
- package/src/interactive/overlays/tree-selector.ts +1 -0
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +292 -0
- package/src/interactive/permission-hint.ts +34 -2
- package/src/interactive/permission-overlay.ts +159 -9
- package/src/interactive/prewarm.ts +197 -0
- package/src/interactive/render-trace.ts +162 -15
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/tool-execution.ts +4 -0
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/side-question.ts +58 -1
- package/src/interactive/slash-commands.ts +251 -15
- package/src/interactive/status/controller.ts +11 -0
- package/src/interactive/status/state-machine.ts +54 -2
- package/src/interactive/status/types.ts +7 -0
- package/src/interactive/tasks-overlay.ts +1 -0
- package/src/interactive/terminal-lease.ts +2 -0
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +346 -33
- package/src/interactive/turn-persistence.ts +14 -4
- package/src/interactive/turn-prewarm.ts +364 -0
- package/src/interactive/turn-queues.ts +7 -4
- package/src/interactive/turn-runtime.ts +8 -1
- package/src/interactive/turn-state.ts +23 -0
- package/src/interactive/view/artifacts.ts +109 -1
- package/src/interactive/view/view-overlay.ts +29 -3
- package/src/interactive/watch-pane.ts +152 -0
- package/src/interactive/worker-progress.ts +7 -1
- package/src/interactive/worker-receipts.ts +19 -1
- package/src/interactive/worker-stream.ts +5 -0
- package/src/interactive/yazi-bridge.ts +444 -0
- package/src/tools/ask-user.ts +43 -2
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +15 -0
- package/src/tools/compete-worktrees.ts +83 -2
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +14 -3
- package/src/tools/dispatch-arguments.ts +20 -20
- package/src/tools/dispatch-plan.ts +17 -9
- package/src/tools/dispatch-run-events.ts +134 -19
- package/src/tools/dispatch-runner.ts +29 -7
- package/src/tools/dispatch-scout.ts +1 -1
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/executables.ts +17 -14
- package/src/tools/observation.ts +54 -4
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- package/src/tools/registry.ts +16 -0
- package/dist/chunk-AOCYTWAV.js +0 -449
- package/dist/chunk-HLE42MG7.js +0 -37
- package/dist/chunk-HWUFFB6L.js +0 -83
- package/dist/chunk-JOZYP4GM.js +0 -279
- package/dist/doctor-M7YEDGAE.js +0 -91
package/src/engine/acp/server.ts
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { realpathSync } from "node:fs";
|
|
3
3
|
import { isAbsolute, resolve as resolvePath } from "node:path";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
BusChannels,
|
|
6
|
+
type DispatchCompletedPayload,
|
|
7
|
+
type DispatchEnqueuedPayload,
|
|
8
|
+
type DispatchFailedPayload,
|
|
9
|
+
type DispatchProgressPayload,
|
|
10
|
+
type DispatchStartedPayload,
|
|
11
|
+
type LoopBlockedPayload,
|
|
12
|
+
} from "../../core/bus-events.js";
|
|
5
13
|
import { DEFAULT_DELEGATION_PERMISSION_TIMEOUT_MS } from "../../core/defaults.js";
|
|
6
14
|
import type { SafeEventBus } from "../../core/event-bus.js";
|
|
7
15
|
import { MAX_TIMER_DELAY_MS } from "../../core/timers.js";
|
|
@@ -33,6 +41,7 @@ import type {
|
|
|
33
41
|
AcpToolKind,
|
|
34
42
|
} from "./types.js";
|
|
35
43
|
import {
|
|
44
|
+
ACP_AGENT_META_KEY,
|
|
36
45
|
ACP_MAX_CHUNK_BYTES,
|
|
37
46
|
ACP_MAX_RAW_RECORD_BYTES,
|
|
38
47
|
ACP_MAX_STRING_BYTES,
|
|
@@ -173,6 +182,25 @@ interface ActivePrompt {
|
|
|
173
182
|
interface AcpToolCallSnapshot {
|
|
174
183
|
rawInput: Record<string, unknown>;
|
|
175
184
|
locations?: AcpToolCallLocation[];
|
|
185
|
+
/** Exact title and kind this call was announced under, replayed by later updates. */
|
|
186
|
+
title: string;
|
|
187
|
+
kind: AcpToolKind;
|
|
188
|
+
/**
|
|
189
|
+
* Delegated agents this call spawned, oldest first, bounded by
|
|
190
|
+
* {@link ACP_MAX_TOOL_CALL_AGENTS}. A dispatch tool that fans out reports one
|
|
191
|
+
* entry per run, which is what lets a client label the segment with the
|
|
192
|
+
* agents that actually ran under it rather than with the product name.
|
|
193
|
+
*/
|
|
194
|
+
agents?: AcpAgentAttribution[];
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** One `clio-coder/agent` attribution entry. `role` names where the identity came from. */
|
|
198
|
+
interface AcpAgentAttribution {
|
|
199
|
+
version: 1;
|
|
200
|
+
role: "orchestrator" | "worker";
|
|
201
|
+
agentId: string;
|
|
202
|
+
runId?: string;
|
|
203
|
+
node?: string;
|
|
176
204
|
}
|
|
177
205
|
|
|
178
206
|
interface AcpServerUsage {
|
|
@@ -299,6 +327,74 @@ const ACP_MAX_TOOL_TITLE_BYTES = 512;
|
|
|
299
327
|
const ACP_MAX_LIVE_TOOL_CALLS = 128;
|
|
300
328
|
const ACP_MAX_REPLAY_TOOL_CALLS = 8192;
|
|
301
329
|
|
|
330
|
+
/**
|
|
331
|
+
* Bus channels this server is willing to forward over the opt-in
|
|
332
|
+
* `clio-coder/event` notification. Nothing outside this list is forwardable:
|
|
333
|
+
* the list is the allowlist, and a client's requested kinds are intersected
|
|
334
|
+
* with it rather than trusted. `safety.loopBlocked` was the first member; the
|
|
335
|
+
* dispatch lifecycle joined it so a client can draw a live fleet board from
|
|
336
|
+
* reported facts instead of inferring one from tool titles or timing.
|
|
337
|
+
*/
|
|
338
|
+
const ACP_FORWARDABLE_EVENT_KINDS = [
|
|
339
|
+
"safety.loopBlocked",
|
|
340
|
+
"dispatch.enqueued",
|
|
341
|
+
"dispatch.started",
|
|
342
|
+
"dispatch.progress",
|
|
343
|
+
"dispatch.completed",
|
|
344
|
+
"dispatch.failed",
|
|
345
|
+
] as const;
|
|
346
|
+
|
|
347
|
+
type AcpForwardableEventKind = (typeof ACP_FORWARDABLE_EVENT_KINDS)[number];
|
|
348
|
+
|
|
349
|
+
/** A client may name at most this many kinds; an over-long list refuses the whole opt-in. */
|
|
350
|
+
const ACP_MAX_REQUESTED_EVENT_KINDS = 16;
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Sanitized, bounded preview of a dispatched task. The exact task is the
|
|
354
|
+
* operator's own prose and can be arbitrarily long, so what crosses is a
|
|
355
|
+
* control-character-stripped prefix carrying the standard truncation marker;
|
|
356
|
+
* the exact text never leaves the process.
|
|
357
|
+
*/
|
|
358
|
+
const ACP_MAX_DISPATCH_TASK_PREVIEW_BYTES = 160;
|
|
359
|
+
|
|
360
|
+
/** Wire bound for the short identifiers a dispatch event carries. */
|
|
361
|
+
const ACP_MAX_DISPATCH_ID_BYTES = 128;
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Progress events forwarded per run before the stream is capped. One run
|
|
365
|
+
* publishes one progress fact per worker event, which is unbounded; a client
|
|
366
|
+
* only needs enough to know the run is alive, so the cap is announced with a
|
|
367
|
+
* final `truncated` frame rather than by silently going quiet.
|
|
368
|
+
*/
|
|
369
|
+
const ACP_MAX_DISPATCH_PROGRESS_EVENTS = 256;
|
|
370
|
+
|
|
371
|
+
/** Live dispatch runs whose progress counters this server tracks at once. */
|
|
372
|
+
const ACP_MAX_TRACKED_DISPATCH_RUNS = 512;
|
|
373
|
+
|
|
374
|
+
/** Delegated agents recorded against one tool call before further ones are dropped. */
|
|
375
|
+
const ACP_MAX_TOOL_CALL_AGENTS = 16;
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Attribution for a frame this server produced on the main session. Every live
|
|
379
|
+
* frame carries it, so a client never has to decide whether an unattributed
|
|
380
|
+
* frame means "the orchestrator" or "identity unavailable".
|
|
381
|
+
*/
|
|
382
|
+
const ORCHESTRATOR_ATTRIBUTION: AcpAgentAttribution = {
|
|
383
|
+
version: 1,
|
|
384
|
+
role: "orchestrator",
|
|
385
|
+
agentId: "orchestrator",
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
const ORCHESTRATOR_UPDATE_META: Record<string, unknown> = {
|
|
389
|
+
[ACP_AGENT_META_KEY]: [ORCHESTRATOR_ATTRIBUTION],
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
/** The `_meta` a tool-call frame carries: its own agents when it spawned any, else the orchestrator. */
|
|
393
|
+
function toolCallUpdateMeta(snapshot: AcpToolCallSnapshot | undefined): Record<string, unknown> {
|
|
394
|
+
if (snapshot?.agents === undefined || snapshot.agents.length === 0) return ORCHESTRATOR_UPDATE_META;
|
|
395
|
+
return { [ACP_AGENT_META_KEY]: [ORCHESTRATOR_ATTRIBUTION, ...snapshot.agents] };
|
|
396
|
+
}
|
|
397
|
+
|
|
302
398
|
/** Depth past which `boundRawRecord` stops walking and elides the subtree. */
|
|
303
399
|
const ACP_MAX_RAW_RECORD_DEPTH = 8;
|
|
304
400
|
|
|
@@ -691,8 +787,9 @@ function sendUpdate(
|
|
|
691
787
|
sessionId: string,
|
|
692
788
|
active: ActivePrompt,
|
|
693
789
|
update: Record<string, unknown>,
|
|
790
|
+
meta: Record<string, unknown> = ORCHESTRATOR_UPDATE_META,
|
|
694
791
|
): void {
|
|
695
|
-
const params: AcpSessionUpdateParams = { sessionId, update };
|
|
792
|
+
const params: AcpSessionUpdateParams = { sessionId, update, _meta: meta };
|
|
696
793
|
active.updatesSent += 1;
|
|
697
794
|
transport.notify("session/update", params);
|
|
698
795
|
}
|
|
@@ -722,12 +819,18 @@ function settleOpenToolCalls(
|
|
|
722
819
|
text: string,
|
|
723
820
|
): void {
|
|
724
821
|
for (const toolCallId of active.openToolCalls) {
|
|
725
|
-
sendUpdate(
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
822
|
+
sendUpdate(
|
|
823
|
+
transport,
|
|
824
|
+
sessionId,
|
|
825
|
+
active,
|
|
826
|
+
{
|
|
827
|
+
sessionUpdate: "tool_call_update",
|
|
828
|
+
toolCallId,
|
|
829
|
+
status: "failed" satisfies AcpToolCallStatus,
|
|
830
|
+
content: toolCallContent(text),
|
|
831
|
+
},
|
|
832
|
+
toolCallUpdateMeta(active.toolCallSnapshots.get(toolCallId)),
|
|
833
|
+
);
|
|
731
834
|
// The sweep is a terminal update like any other, so a late end for a swept
|
|
732
835
|
// id cannot reopen the call the client has already seen fail.
|
|
733
836
|
active.terminalToolCalls.add(toolCallId);
|
|
@@ -794,13 +897,15 @@ function handleChatEvent(
|
|
|
794
897
|
const snapshot: AcpToolCallSnapshot = {
|
|
795
898
|
rawInput: boundRawRecord(event.args),
|
|
796
899
|
...(locations !== null ? { locations } : {}),
|
|
900
|
+
title: boundString(toolName ?? "tool", ACP_MAX_TOOL_TITLE_BYTES),
|
|
901
|
+
kind: toolKind(toolName),
|
|
797
902
|
};
|
|
798
903
|
active.toolCallSnapshots.set(toolCallId, snapshot);
|
|
799
904
|
sendUpdate(transport, sessionId, active, {
|
|
800
905
|
sessionUpdate: "tool_call",
|
|
801
906
|
toolCallId,
|
|
802
|
-
title:
|
|
803
|
-
kind:
|
|
907
|
+
title: snapshot.title,
|
|
908
|
+
kind: snapshot.kind,
|
|
804
909
|
status: "in_progress" satisfies AcpToolCallStatus,
|
|
805
910
|
rawInput: snapshot.rawInput,
|
|
806
911
|
...(snapshot.locations !== undefined ? { locations: snapshot.locations } : {}),
|
|
@@ -826,15 +931,21 @@ function handleChatEvent(
|
|
|
826
931
|
active.openToolCalls.delete(toolCallId);
|
|
827
932
|
active.terminalToolCalls.add(toolCallId);
|
|
828
933
|
const output = boundString(outputText(event.result), ACP_MAX_CHUNK_BYTES);
|
|
829
|
-
sendUpdate(
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
934
|
+
sendUpdate(
|
|
935
|
+
transport,
|
|
936
|
+
sessionId,
|
|
937
|
+
active,
|
|
938
|
+
{
|
|
939
|
+
sessionUpdate: "tool_call_update",
|
|
940
|
+
toolCallId,
|
|
941
|
+
title: boundString(toolName ?? "tool", ACP_MAX_TOOL_TITLE_BYTES),
|
|
942
|
+
kind: toolKind(toolName),
|
|
943
|
+
status: toolStatus(event),
|
|
944
|
+
...(output.length > 0 ? { content: toolCallContent(output) } : {}),
|
|
945
|
+
rawOutput: boundRawRecord({ result: event.result, isError: event.isError === true }),
|
|
946
|
+
},
|
|
947
|
+
toolCallUpdateMeta(active.toolCallSnapshots.get(toolCallId)),
|
|
948
|
+
);
|
|
838
949
|
return;
|
|
839
950
|
}
|
|
840
951
|
if (event.type === "message_end") {
|
|
@@ -1500,9 +1611,24 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1500
1611
|
const sessions = new Map<string, AcpServerSession>();
|
|
1501
1612
|
const workspaceInstanceId = randomUUID();
|
|
1502
1613
|
let initialized = false;
|
|
1503
|
-
|
|
1614
|
+
const enabledEventKinds = new Set<AcpForwardableEventKind>();
|
|
1504
1615
|
let eventSequence = 0;
|
|
1616
|
+
/**
|
|
1617
|
+
* Per-run progress counters for the forwarded dispatch stream, insertion
|
|
1618
|
+
* ordered. A terminal event removes its run; the cap evicts the oldest live
|
|
1619
|
+
* run rather than refusing the newest, so a leaked run cannot starve the
|
|
1620
|
+
* board of the run an operator is actually watching.
|
|
1621
|
+
*/
|
|
1622
|
+
const dispatchProgress = new Map<string, { count: number; capped: boolean }>();
|
|
1505
1623
|
let activeSessionId: string | null = null;
|
|
1624
|
+
/**
|
|
1625
|
+
* The one session this process hosts, from the moment it is bound until it is
|
|
1626
|
+
* closed. Distinct from {@link activeSessionId}, which is only set while a
|
|
1627
|
+
* prompt is running: a detached dispatch run legitimately finishes after the
|
|
1628
|
+
* turn that started it, and a client keyed on the bound session still needs
|
|
1629
|
+
* that outcome so its board does not leave the run running forever.
|
|
1630
|
+
*/
|
|
1631
|
+
let boundSessionId: string | null = null;
|
|
1506
1632
|
let activePromptState: ActivePrompt | null = null;
|
|
1507
1633
|
let sessionCreated = false;
|
|
1508
1634
|
let promptSettled: Promise<void> | null = null;
|
|
@@ -1541,48 +1667,244 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1541
1667
|
options.chat.cancel();
|
|
1542
1668
|
},
|
|
1543
1669
|
});
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1670
|
+
/**
|
|
1671
|
+
* Sends one frame of the opt-in stream. Every forwarded channel goes through
|
|
1672
|
+
* here so the envelope, the sequence, and the opt-in check cannot drift per
|
|
1673
|
+
* channel. Nothing is sent before a session exists: the envelope's
|
|
1674
|
+
* `sessionId` is the client's only way to bind a fact to what it is showing.
|
|
1675
|
+
*/
|
|
1676
|
+
const forwardEvent = (
|
|
1677
|
+
kind: AcpForwardableEventKind,
|
|
1678
|
+
turnId: string | null,
|
|
1679
|
+
terminal: boolean,
|
|
1680
|
+
payload: Record<string, unknown>,
|
|
1681
|
+
): void => {
|
|
1682
|
+
const sessionId = activeSessionId ?? boundSessionId;
|
|
1683
|
+
if (!initialized || !enabledEventKinds.has(kind) || sessionId === null) return;
|
|
1684
|
+
eventSequence += 1;
|
|
1685
|
+
try {
|
|
1686
|
+
options.transport.notify("clio-coder/event", {
|
|
1687
|
+
version: 1,
|
|
1688
|
+
workspaceInstanceId,
|
|
1689
|
+
sessionId,
|
|
1690
|
+
turnId,
|
|
1691
|
+
sequence: eventSequence,
|
|
1692
|
+
kind,
|
|
1693
|
+
terminal,
|
|
1694
|
+
payload,
|
|
1695
|
+
});
|
|
1696
|
+
} catch {
|
|
1697
|
+
options.diagnostics?.("failed to send an opted-in ACP event");
|
|
1698
|
+
}
|
|
1699
|
+
};
|
|
1700
|
+
|
|
1701
|
+
/**
|
|
1702
|
+
* The identity every dispatch frame carries. The exact task never crosses:
|
|
1703
|
+
* what goes on the wire is a control-character-stripped, byte-bounded prefix
|
|
1704
|
+
* carrying the standard truncation marker, so a client can label a run
|
|
1705
|
+
* without receiving the operator's prose. A run whose id or agent cannot be
|
|
1706
|
+
* represented safely is dropped rather than forwarded under a repaired
|
|
1707
|
+
* identity, because a board keyed on a rewritten id merges distinct runs.
|
|
1708
|
+
*/
|
|
1709
|
+
const dispatchIdentity = (payload: {
|
|
1710
|
+
runId: string;
|
|
1711
|
+
agentId: string;
|
|
1712
|
+
task?: string | undefined;
|
|
1713
|
+
node?: string | undefined;
|
|
1714
|
+
}): { runId: string; agentId: string; taskPreview: string | null; node: string | null } | null => {
|
|
1715
|
+
const runId = safeStoredIdentifier(payload.runId, ACP_MAX_DISPATCH_ID_BYTES);
|
|
1716
|
+
const agentId = safeStoredIdentifier(payload.agentId, ACP_MAX_DISPATCH_ID_BYTES);
|
|
1717
|
+
if (runId === null || agentId === null) return null;
|
|
1718
|
+
const preview =
|
|
1719
|
+
payload.task === undefined ? "" : safeStoredString(payload.task, ACP_MAX_DISPATCH_TASK_PREVIEW_BYTES).trim();
|
|
1720
|
+
return {
|
|
1721
|
+
runId,
|
|
1722
|
+
agentId,
|
|
1723
|
+
taskPreview: preview.length === 0 ? null : preview,
|
|
1724
|
+
node: safeStoredIdentifier(payload.node, ACP_MAX_DISPATCH_ID_BYTES),
|
|
1725
|
+
};
|
|
1726
|
+
};
|
|
1727
|
+
|
|
1728
|
+
/** Forgets a run's progress counter and keeps the live map inside its cap. */
|
|
1729
|
+
const trackDispatchRun = (runId: string): { count: number; capped: boolean } => {
|
|
1730
|
+
const existing = dispatchProgress.get(runId);
|
|
1731
|
+
if (existing !== undefined) return existing;
|
|
1732
|
+
if (dispatchProgress.size >= ACP_MAX_TRACKED_DISPATCH_RUNS) {
|
|
1733
|
+
const oldest = dispatchProgress.keys().next();
|
|
1734
|
+
if (!oldest.done) dispatchProgress.delete(oldest.value);
|
|
1735
|
+
}
|
|
1736
|
+
const created = { count: 0, capped: false };
|
|
1737
|
+
dispatchProgress.set(runId, created);
|
|
1738
|
+
return created;
|
|
1739
|
+
};
|
|
1740
|
+
|
|
1741
|
+
const safeCount = (value: unknown): number | null =>
|
|
1742
|
+
typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : null;
|
|
1743
|
+
|
|
1744
|
+
const unsubscribeEvents: Array<() => void> = [];
|
|
1745
|
+
if (options.bus !== undefined) {
|
|
1746
|
+
const bus = options.bus;
|
|
1747
|
+
unsubscribeEvents.push(
|
|
1748
|
+
bus.on(BusChannels.LoopBlocked, (payload: LoopBlockedPayload) => {
|
|
1749
|
+
// Loop blocks describe the turn that is running, so unlike a dispatch
|
|
1750
|
+
// run they are meaningless outside one.
|
|
1751
|
+
if (activePromptState === null) return;
|
|
1752
|
+
if (
|
|
1753
|
+
!Number.isSafeInteger(payload.repeatCount) ||
|
|
1754
|
+
payload.repeatCount < 1 ||
|
|
1755
|
+
!Number.isSafeInteger(payload.blocksThisTurn) ||
|
|
1756
|
+
payload.blocksThisTurn < 1 ||
|
|
1757
|
+
!Number.isSafeInteger(payload.budget) ||
|
|
1758
|
+
payload.budget < 1 ||
|
|
1759
|
+
!(["block", "lockout", "stop"] as ReadonlyArray<string>).includes(payload.disposition) ||
|
|
1760
|
+
payload.interrupted !== (payload.disposition === "stop")
|
|
1761
|
+
) {
|
|
1762
|
+
return;
|
|
1763
|
+
}
|
|
1764
|
+
const tool = safeStoredString(payload.tool, 64).trim();
|
|
1765
|
+
if (tool.length === 0) return;
|
|
1766
|
+
forwardEvent("safety.loopBlocked", safeStoredIdentifier(payload.turnId, ACP_MAX_SESSION_ID_BYTES), false, {
|
|
1767
|
+
toolCallId: null,
|
|
1768
|
+
tool,
|
|
1769
|
+
repeatCount: payload.repeatCount,
|
|
1770
|
+
blocksThisTurn: payload.blocksThisTurn,
|
|
1771
|
+
budget: payload.budget,
|
|
1772
|
+
disposition: payload.disposition,
|
|
1773
|
+
interrupted: payload.interrupted,
|
|
1774
|
+
shape: null,
|
|
1581
1775
|
});
|
|
1582
|
-
}
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1776
|
+
}),
|
|
1777
|
+
);
|
|
1778
|
+
unsubscribeEvents.push(
|
|
1779
|
+
bus.on(BusChannels.DispatchEnqueued, (payload: DispatchEnqueuedPayload) => {
|
|
1780
|
+
const identity = dispatchIdentity(payload);
|
|
1781
|
+
if (identity === null) return;
|
|
1782
|
+
trackDispatchRun(identity.runId);
|
|
1783
|
+
forwardEvent("dispatch.enqueued", null, false, {
|
|
1784
|
+
...identity,
|
|
1785
|
+
origin: safeStoredIdentifier(payload.requestOrigin, 64),
|
|
1786
|
+
attempt: null,
|
|
1787
|
+
});
|
|
1788
|
+
}),
|
|
1789
|
+
);
|
|
1790
|
+
unsubscribeEvents.push(
|
|
1791
|
+
bus.on(BusChannels.DispatchStarted, (payload: DispatchStartedPayload) => {
|
|
1792
|
+
const identity = dispatchIdentity(payload);
|
|
1793
|
+
if (identity === null) return;
|
|
1794
|
+
trackDispatchRun(identity.runId);
|
|
1795
|
+
// A run started by a tool call this turn already put on the wire is
|
|
1796
|
+
// the one place the harness knows which agent produced a tool
|
|
1797
|
+
// segment. Record it and re-announce the call so a client can label
|
|
1798
|
+
// the segment while the worker is still running.
|
|
1799
|
+
attributeRunToToolCall(payload.parentToolCallId, identity);
|
|
1800
|
+
forwardEvent("dispatch.started", null, false, {
|
|
1801
|
+
...identity,
|
|
1802
|
+
origin: safeStoredIdentifier(payload.requestOrigin, 64),
|
|
1803
|
+
attempt: safeCount(payload.attempt),
|
|
1804
|
+
});
|
|
1805
|
+
}),
|
|
1806
|
+
);
|
|
1807
|
+
unsubscribeEvents.push(
|
|
1808
|
+
bus.on(BusChannels.DispatchProgress, (payload: DispatchProgressPayload) => {
|
|
1809
|
+
const identity = dispatchIdentity(payload);
|
|
1810
|
+
if (identity === null) return;
|
|
1811
|
+
const state = trackDispatchRun(identity.runId);
|
|
1812
|
+
if (state.capped) return;
|
|
1813
|
+
state.count += 1;
|
|
1814
|
+
const capped = state.count > ACP_MAX_DISPATCH_PROGRESS_EVENTS;
|
|
1815
|
+
if (capped) state.capped = true;
|
|
1816
|
+
// The worker/ACP event that triggered this crossed a process boundary
|
|
1817
|
+
// and is typed `unknown`; none of it goes on the wire. What a board
|
|
1818
|
+
// needs is that the run is alive and roughly how much it has done.
|
|
1819
|
+
forwardEvent("dispatch.progress", null, false, {
|
|
1820
|
+
runId: identity.runId,
|
|
1821
|
+
agentId: identity.agentId,
|
|
1822
|
+
progressCount: state.count,
|
|
1823
|
+
truncated: capped,
|
|
1824
|
+
});
|
|
1825
|
+
}),
|
|
1826
|
+
);
|
|
1827
|
+
unsubscribeEvents.push(
|
|
1828
|
+
bus.on(BusChannels.DispatchCompleted, (payload: DispatchCompletedPayload) => {
|
|
1829
|
+
const identity = dispatchIdentity(payload);
|
|
1830
|
+
if (identity === null) return;
|
|
1831
|
+
dispatchProgress.delete(identity.runId);
|
|
1832
|
+
forwardEvent("dispatch.completed", null, true, {
|
|
1833
|
+
runId: identity.runId,
|
|
1834
|
+
agentId: identity.agentId,
|
|
1835
|
+
outcome: safeStoredIdentifier(payload.outcome, 64),
|
|
1836
|
+
outcomeCode: safeStoredIdentifier(payload.outcomeCode, 64),
|
|
1837
|
+
durationMs: safeCount(payload.durationMs),
|
|
1838
|
+
tokenCount: safeCount(payload.tokenCount),
|
|
1839
|
+
});
|
|
1840
|
+
}),
|
|
1841
|
+
);
|
|
1842
|
+
unsubscribeEvents.push(
|
|
1843
|
+
bus.on(BusChannels.DispatchFailed, (payload: DispatchFailedPayload) => {
|
|
1844
|
+
const identity = dispatchIdentity(payload);
|
|
1845
|
+
if (identity === null) return;
|
|
1846
|
+
dispatchProgress.delete(identity.runId);
|
|
1847
|
+
// `outcomeDetail` is free-form failure prose that legitimately quotes
|
|
1848
|
+
// paths, argv, and provider bodies. The taxonomy crosses; the prose
|
|
1849
|
+
// does not.
|
|
1850
|
+
forwardEvent("dispatch.failed", null, true, {
|
|
1851
|
+
runId: identity.runId,
|
|
1852
|
+
agentId: identity.agentId,
|
|
1853
|
+
outcome: safeStoredIdentifier(payload.outcome, 64),
|
|
1854
|
+
reason: safeStoredIdentifier(payload.reason, 64),
|
|
1855
|
+
durationMs: safeCount(payload.durationMs),
|
|
1856
|
+
});
|
|
1857
|
+
}),
|
|
1858
|
+
);
|
|
1859
|
+
}
|
|
1860
|
+
const unsubscribeEventStream = (): void => {
|
|
1861
|
+
for (const unsubscribe of unsubscribeEvents) unsubscribe();
|
|
1862
|
+
unsubscribeEvents.length = 0;
|
|
1863
|
+
dispatchProgress.clear();
|
|
1864
|
+
};
|
|
1865
|
+
|
|
1866
|
+
/**
|
|
1867
|
+
* Records a delegated agent against the tool call that spawned it and
|
|
1868
|
+
* re-announces that call so the attribution reaches the client while the
|
|
1869
|
+
* worker is running. Nothing is minted here: an id with no open call this
|
|
1870
|
+
* turn binds to nothing, exactly as on the permission path.
|
|
1871
|
+
*/
|
|
1872
|
+
function attributeRunToToolCall(
|
|
1873
|
+
parentToolCallId: string | undefined,
|
|
1874
|
+
identity: { runId: string; agentId: string; node: string | null },
|
|
1875
|
+
): void {
|
|
1876
|
+
const active = activePromptState;
|
|
1877
|
+
if (active === null || activeSessionId === null) return;
|
|
1878
|
+
if (parentToolCallId === undefined || parentToolCallId.length === 0) return;
|
|
1879
|
+
const wireId = openWireIdFor(active, parentToolCallId);
|
|
1880
|
+
if (wireId === null) return;
|
|
1881
|
+
const snapshot = active.toolCallSnapshots.get(wireId);
|
|
1882
|
+
if (snapshot === undefined) return;
|
|
1883
|
+
const agents = snapshot.agents ?? [];
|
|
1884
|
+
if (agents.length >= ACP_MAX_TOOL_CALL_AGENTS) return;
|
|
1885
|
+
if (agents.some((agent) => agent.runId === identity.runId)) return;
|
|
1886
|
+
agents.push({
|
|
1887
|
+
version: 1,
|
|
1888
|
+
role: "worker",
|
|
1889
|
+
agentId: identity.agentId,
|
|
1890
|
+
runId: identity.runId,
|
|
1891
|
+
...(identity.node !== null ? { node: identity.node } : {}),
|
|
1892
|
+
});
|
|
1893
|
+
snapshot.agents = agents;
|
|
1894
|
+
sendUpdate(
|
|
1895
|
+
options.transport,
|
|
1896
|
+
activeSessionId,
|
|
1897
|
+
active,
|
|
1898
|
+
{
|
|
1899
|
+
sessionUpdate: "tool_call_update",
|
|
1900
|
+
toolCallId: wireId,
|
|
1901
|
+
title: snapshot.title,
|
|
1902
|
+
kind: snapshot.kind,
|
|
1903
|
+
status: "in_progress" satisfies AcpToolCallStatus,
|
|
1904
|
+
},
|
|
1905
|
+
toolCallUpdateMeta(snapshot),
|
|
1906
|
+
);
|
|
1907
|
+
}
|
|
1586
1908
|
|
|
1587
1909
|
const requireInitialized = (): void => {
|
|
1588
1910
|
if (!initialized) throw new AcpRequestError(-32000, "initialize must be called first", { code: "not_initialized" });
|
|
@@ -1671,15 +1993,21 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1671
1993
|
const eventRequest =
|
|
1672
1994
|
clientMeta !== null && isRecord(clientMeta["clio-coder/events"]) ? clientMeta["clio-coder/events"] : null;
|
|
1673
1995
|
const requestedEventKinds = eventRequest !== null ? eventRequest.kinds : null;
|
|
1674
|
-
|
|
1996
|
+
// A malformed request refuses the whole opt-in rather than the offending
|
|
1997
|
+
// entry: a client that sent an unrepresentable kind does not know what it
|
|
1998
|
+
// asked for, and silently honouring the rest of its list hides that.
|
|
1999
|
+
enabledEventKinds.clear();
|
|
2000
|
+
if (
|
|
1675
2001
|
eventRequest !== null &&
|
|
1676
2002
|
eventRequest.version === 1 &&
|
|
1677
2003
|
Array.isArray(requestedEventKinds) &&
|
|
1678
|
-
requestedEventKinds.length <=
|
|
1679
|
-
requestedEventKinds.every(
|
|
1680
|
-
|
|
1681
|
-
)
|
|
1682
|
-
|
|
2004
|
+
requestedEventKinds.length <= ACP_MAX_REQUESTED_EVENT_KINDS &&
|
|
2005
|
+
requestedEventKinds.every((kind) => typeof kind === "string" && utf8Bytes(kind) <= 64 && !hasControlCharacters(kind))
|
|
2006
|
+
) {
|
|
2007
|
+
for (const kind of ACP_FORWARDABLE_EVENT_KINDS) {
|
|
2008
|
+
if (requestedEventKinds.includes(kind)) enabledEventKinds.add(kind);
|
|
2009
|
+
}
|
|
2010
|
+
}
|
|
1683
2011
|
const canLoadSession =
|
|
1684
2012
|
options.session !== undefined &&
|
|
1685
2013
|
options.readSessionEntries !== undefined &&
|
|
@@ -1717,12 +2045,16 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1717
2045
|
list: options.providers !== undefined,
|
|
1718
2046
|
probe: options.providers !== undefined,
|
|
1719
2047
|
},
|
|
2048
|
+
// Per-frame agent attribution on `session/update`. Announced so a
|
|
2049
|
+
// client can tell "this agent produced nothing" apart from "this
|
|
2050
|
+
// peer does not report identity at all".
|
|
2051
|
+
[ACP_AGENT_META_KEY]: { version: 1, meta: ACP_AGENT_META_KEY },
|
|
1720
2052
|
...(options.bus
|
|
1721
2053
|
? {
|
|
1722
2054
|
"clio-coder/events": {
|
|
1723
2055
|
version: 1,
|
|
1724
2056
|
notification: "clio-coder/event",
|
|
1725
|
-
kinds:
|
|
2057
|
+
kinds: ACP_FORWARDABLE_EVENT_KINDS,
|
|
1726
2058
|
workspaceInstanceId,
|
|
1727
2059
|
},
|
|
1728
2060
|
}
|
|
@@ -1730,7 +2062,15 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1730
2062
|
...(options.toolRegistry !== undefined ? { "clio-coder/tools": "mediated" } : {}),
|
|
1731
2063
|
},
|
|
1732
2064
|
},
|
|
1733
|
-
authMethods: [
|
|
2065
|
+
authMethods: [
|
|
2066
|
+
{
|
|
2067
|
+
id: "clio-login",
|
|
2068
|
+
name: "Clio Target Auth & Setup",
|
|
2069
|
+
description: "Configure models, API keys, and target endpoints in terminal",
|
|
2070
|
+
type: "terminal",
|
|
2071
|
+
args: ["auth", "login"],
|
|
2072
|
+
},
|
|
2073
|
+
],
|
|
1734
2074
|
} satisfies AcpInitializeResponse;
|
|
1735
2075
|
});
|
|
1736
2076
|
|
|
@@ -1767,6 +2107,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1767
2107
|
};
|
|
1768
2108
|
sessionCreated = true;
|
|
1769
2109
|
sessions.set(id, session);
|
|
2110
|
+
boundSessionId = id;
|
|
1770
2111
|
// NewSessionResponse is { sessionId, modes?, models?, _meta? }; cwd is not a
|
|
1771
2112
|
// schema field. Clio runs a single-session-per-process server pinned to the
|
|
1772
2113
|
// launch cwd, so no extra fields are needed.
|
|
@@ -1840,6 +2181,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1840
2181
|
};
|
|
1841
2182
|
sessionCreated = true;
|
|
1842
2183
|
sessions.set(id, session);
|
|
2184
|
+
boundSessionId = id;
|
|
1843
2185
|
for (const replayParams of replay.params) options.transport.notify("session/update", replayParams);
|
|
1844
2186
|
return {
|
|
1845
2187
|
_meta: {
|
|
@@ -2134,6 +2476,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
2134
2476
|
}
|
|
2135
2477
|
if (options.session?.current()?.id === session.id) await options.session.close();
|
|
2136
2478
|
sessions.delete(session.id);
|
|
2479
|
+
if (boundSessionId === session.id) boundSessionId = null;
|
|
2137
2480
|
closedSessionIds.add(session.id);
|
|
2138
2481
|
return {};
|
|
2139
2482
|
});
|
|
@@ -2230,7 +2573,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
2230
2573
|
return await new Promise<number>((resolve) => {
|
|
2231
2574
|
options.transport.onClose(() => {
|
|
2232
2575
|
permission.unregister();
|
|
2233
|
-
|
|
2576
|
+
unsubscribeEventStream();
|
|
2234
2577
|
permission.cancelPending("ACP transport closed");
|
|
2235
2578
|
for (const session of sessions.values()) cancelSession(session, "ACP transport closed");
|
|
2236
2579
|
const inFlight = promptSettled;
|
package/src/engine/acp/types.ts
CHANGED
|
@@ -7,6 +7,13 @@ import type { AgentMessage } from "../types.js";
|
|
|
7
7
|
*/
|
|
8
8
|
export const ACP_USAGE_META_KEY = "clio-coder/usage";
|
|
9
9
|
export const ACP_SESSION_META_KEY = "clio-coder/session";
|
|
10
|
+
/**
|
|
11
|
+
* Per-frame agent attribution on `session/update`. It names which agent
|
|
12
|
+
* produced the frame so a client can label a message, reasoning item, or tool
|
|
13
|
+
* call instead of attributing every frame to the product. Purely additive: a
|
|
14
|
+
* client that does not read it sees exactly the frames it saw before.
|
|
15
|
+
*/
|
|
16
|
+
export const ACP_AGENT_META_KEY = "clio-coder/agent";
|
|
10
17
|
|
|
11
18
|
/**
|
|
12
19
|
* Wire bounds for one prompt turn (CONTRACT C001 §3). A client renders every
|
|
@@ -87,11 +94,20 @@ export interface AcpImplementationInfo {
|
|
|
87
94
|
version?: string;
|
|
88
95
|
}
|
|
89
96
|
|
|
97
|
+
export interface AcpAuthMethod {
|
|
98
|
+
id: string;
|
|
99
|
+
name: string;
|
|
100
|
+
description?: string;
|
|
101
|
+
type: "agent" | "terminal";
|
|
102
|
+
args?: string[];
|
|
103
|
+
env?: Record<string, string>;
|
|
104
|
+
}
|
|
105
|
+
|
|
90
106
|
export interface AcpInitializeResponse {
|
|
91
107
|
protocolVersion?: number;
|
|
92
108
|
agentCapabilities?: Record<string, unknown>;
|
|
93
109
|
agentInfo?: AcpImplementationInfo;
|
|
94
|
-
authMethods?:
|
|
110
|
+
authMethods?: AcpAuthMethod[];
|
|
95
111
|
}
|
|
96
112
|
|
|
97
113
|
export interface AcpSessionInfo {
|
|
@@ -141,6 +157,8 @@ export interface AcpToolCallUpdate {
|
|
|
141
157
|
export interface AcpSessionUpdateParams {
|
|
142
158
|
sessionId?: string;
|
|
143
159
|
update?: Record<string, unknown>;
|
|
160
|
+
/** Namespaced extension slot; carries replay and agent-attribution metadata. */
|
|
161
|
+
_meta?: Record<string, unknown>;
|
|
144
162
|
}
|
|
145
163
|
|
|
146
164
|
export type AcpPermissionOptionKind = "allow_once" | "allow_always" | "reject_once" | "reject_always" | string;
|