@iowarp/clio-coder 0.4.9 → 0.5.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/.claude-plugin/marketplace.json +11 -3
- package/CHANGELOG.md +153 -0
- package/CODE_OF_CONDUCT.md +10 -0
- package/CONTRIBUTING.md +208 -382
- package/NOTICE +8 -2
- package/README.md +199 -418
- package/ROADMAP.md +82 -0
- package/SECURITY.md +14 -11
- package/dist/acp-KS7ARGV6.js +132 -0
- package/dist/agents-YOGJ2YEJ.js +163 -0
- package/dist/assets/codewiki.json +1 -1
- package/dist/auth-CEDCO6O6.js +557 -0
- package/dist/background-YWTBPSQU.js +39 -0
- package/dist/builtins-GDYO4RTR.js +23 -0
- package/dist/chunk-27YTM2CV.js +175 -0
- package/dist/chunk-2AF6YC7Q.js +75 -0
- package/dist/chunk-2DTIWSAW.js +381 -0
- package/dist/chunk-2EMLKSCX.js +262 -0
- package/dist/chunk-2OJ3YZQP.js +665 -0
- package/dist/chunk-2VLYHHFT.js +35 -0
- package/dist/chunk-2WVPJF3Z.js +204 -0
- package/dist/chunk-33OASOS6.js +176 -0
- package/dist/chunk-3BD2LXYJ.js +19 -0
- package/dist/chunk-3JHUFKG7.js +30 -0
- package/dist/chunk-3JLTRPN7.js +711 -0
- package/dist/chunk-3LT34CAM.js +2796 -0
- package/dist/chunk-3O5JWP4L.js +1670 -0
- package/dist/chunk-3UW3KU4A.js +21 -0
- package/dist/chunk-4A6YRGV4.js +569 -0
- package/dist/chunk-4D2BRCZ3.js +67 -0
- package/dist/chunk-4SYHGVDE.js +668 -0
- package/dist/chunk-4VDHLCF5.js +66 -0
- package/dist/chunk-4WOOTKFD.js +637 -0
- package/dist/chunk-4WV4PI66.js +80 -0
- package/dist/chunk-53OXPRI6.js +195 -0
- package/dist/chunk-55RMDDFM.js +1347 -0
- package/dist/chunk-56XP4FJU.js +2025 -0
- package/dist/chunk-5B3RTYAK.js +123 -0
- package/dist/chunk-5CD243WE.js +45 -0
- package/dist/chunk-5JQR5B4D.js +709 -0
- package/dist/chunk-5KQEUIWM.js +597 -0
- package/dist/chunk-5LP5FNNR.js +915 -0
- package/dist/chunk-62UK7AGW.js +9344 -0
- package/dist/chunk-6CTHLZFB.js +563 -0
- package/dist/chunk-6EJYVCTN.js +23 -0
- package/dist/chunk-6OWUM2NC.js +12289 -0
- package/dist/chunk-6RJMYYIE.js +1023 -0
- package/dist/chunk-6W75D37F.js +643 -0
- package/dist/chunk-733ZBT5P.js +1721 -0
- package/dist/chunk-77DCC6JZ.js +3710 -0
- package/dist/chunk-7QXCO3AF.js +156 -0
- package/dist/chunk-7RET77VB.js +481 -0
- package/dist/chunk-A4MVRV4C.js +65 -0
- package/dist/chunk-ALJWT6O6.js +93 -0
- package/dist/chunk-AVSR2HKI.js +232 -0
- package/dist/chunk-B7GY6QER.js +42 -0
- package/dist/chunk-BFOSV5EZ.js +178 -0
- package/dist/chunk-BGOIM7NB.js +103 -0
- package/dist/chunk-BJH6WFIB.js +372 -0
- package/dist/chunk-BOBCCDJ6.js +1533 -0
- package/dist/chunk-BRCOSE7O.js +117 -0
- package/dist/chunk-BYFHHCFV.js +601 -0
- package/dist/chunk-C2CPOIH2.js +83 -0
- package/dist/chunk-C7AQTPCE.js +694 -0
- package/dist/chunk-CBAQPTDU.js +165 -0
- package/dist/chunk-CDQ2UC6W.js +125 -0
- package/dist/chunk-CN6SW5DC.js +177 -0
- package/dist/chunk-CRHPCPZP.js +132 -0
- package/dist/chunk-CTFPFW3H.js +44 -0
- package/dist/chunk-D3KWFOUT.js +103 -0
- package/dist/chunk-D65E25JG.js +185 -0
- package/dist/chunk-DCGHJQ2U.js +236 -0
- package/dist/chunk-DE2LU267.js +106 -0
- package/dist/chunk-DF6PI6GN.js +97 -0
- package/dist/chunk-DGC6X6XR.js +53 -0
- package/dist/chunk-DOUISWEE.js +526 -0
- package/dist/chunk-DR3TAEUA.js +188 -0
- package/dist/chunk-DVTBERFY.js +33 -0
- package/dist/chunk-DXSETN72.js +1051 -0
- package/dist/chunk-DZLR4UEH.js +128 -0
- package/dist/chunk-E6IPKW2E.js +77 -0
- package/dist/chunk-EG4ARXPC.js +139 -0
- package/dist/chunk-EKV4UBCM.js +652 -0
- package/dist/chunk-EOJPDNUP.js +1325 -0
- package/dist/chunk-EX57VVWW.js +4157 -0
- package/dist/chunk-EYTLV3W3.js +5937 -0
- package/dist/chunk-EZD2BXGP.js +475 -0
- package/dist/chunk-EZDCA34W.js +314 -0
- package/dist/chunk-FD2I4KBR.js +33 -0
- package/dist/chunk-FD3IAHQM.js +27 -0
- package/dist/chunk-FFYTC2KQ.js +416 -0
- package/dist/chunk-FGSQHUCK.js +110 -0
- package/dist/chunk-GCQFN7YI.js +32 -0
- package/dist/chunk-GGPF6LLE.js +38 -0
- package/dist/chunk-GGWI3OVM.js +215 -0
- package/dist/chunk-GLIQT7SU.js +172 -0
- package/dist/chunk-GN7QBEEI.js +95 -0
- package/dist/chunk-GRHOXDKB.js +1104 -0
- package/dist/chunk-HMN2C6YL.js +54 -0
- package/dist/chunk-HOEDA42N.js +310 -0
- package/dist/chunk-HOYZUKG7.js +192 -0
- package/dist/chunk-HQVN7G4F.js +1021 -0
- package/dist/chunk-HSQQFDB3.js +519 -0
- package/dist/chunk-I4ELN5BX.js +47 -0
- package/dist/chunk-I4Y4WKZR.js +386 -0
- package/dist/chunk-IFPDAD7R.js +797 -0
- package/dist/chunk-IN7DGBVS.js +582 -0
- package/dist/chunk-ISHUS7HC.js +396 -0
- package/dist/chunk-JPXLJSGR.js +191 -0
- package/dist/chunk-JQCLXSFI.js +69 -0
- package/dist/chunk-KBUTSJSR.js +61 -0
- package/dist/chunk-KW5HXKLJ.js +56 -0
- package/dist/chunk-L4APUGCT.js +139 -0
- package/dist/chunk-L7G7K4I2.js +505 -0
- package/dist/chunk-LAR7DX5E.js +1840 -0
- package/dist/chunk-LAVUQX3B.js +462 -0
- package/dist/chunk-LJRBX7QR.js +116 -0
- package/dist/chunk-LNOXCGN2.js +1864 -0
- package/dist/chunk-LTWH2ACR.js +23002 -0
- package/dist/chunk-LYJJ6546.js +661 -0
- package/dist/chunk-M2IPMWCN.js +457 -0
- package/dist/chunk-MGLRTOCK.js +101 -0
- package/dist/chunk-MZF5IKZT.js +160 -0
- package/dist/chunk-N24R6KWS.js +386 -0
- package/dist/chunk-NASYVWDB.js +604 -0
- package/dist/chunk-NBXFPI7U.js +195 -0
- package/dist/chunk-NDPF2N2L.js +400 -0
- package/dist/chunk-NFSK2VNU.js +446 -0
- package/dist/chunk-NG3QQSXY.js +43 -0
- package/dist/chunk-NOCSM22Y.js +63 -0
- package/dist/chunk-NVPXXW2H.js +1143 -0
- package/dist/chunk-O63U2I6I.js +30 -0
- package/dist/chunk-OJXOA6YU.js +98 -0
- package/dist/chunk-OPD7GL6F.js +1196 -0
- package/dist/chunk-OQ2EOAHA.js +14399 -0
- package/dist/chunk-OV62D6KO.js +688 -0
- package/dist/chunk-OZ76TLGU.js +740 -0
- package/dist/chunk-P4GNZPXO.js +1156 -0
- package/dist/chunk-PS6JAWJZ.js +78 -0
- package/dist/chunk-PXRCXGLK.js +1865 -0
- package/dist/chunk-QDUUOZ3S.js +108 -0
- package/dist/chunk-QG6I2T5E.js +1416 -0
- package/dist/chunk-QHSBROEW.js +308 -0
- package/dist/chunk-QNUQ7K7D.js +46 -0
- package/dist/chunk-QZTTRSJE.js +333 -0
- package/dist/chunk-R2UUNSNQ.js +1605 -0
- package/dist/chunk-R7FGRZNF.js +1794 -0
- package/dist/chunk-RNDCROSG.js +199 -0
- package/dist/chunk-S36CXHO2.js +302 -0
- package/dist/chunk-SJGS3GDI.js +575 -0
- package/dist/chunk-SQZHXUB3.js +510 -0
- package/dist/chunk-SUTLW6ND.js +686 -0
- package/dist/chunk-SYF7FVBL.js +179 -0
- package/dist/chunk-T2MDZES3.js +1577 -0
- package/dist/chunk-T33IYTZM.js +1146 -0
- package/dist/chunk-TDGYTWM6.js +49 -0
- package/dist/chunk-TGL5FZVD.js +132 -0
- package/dist/chunk-TGWZXJ7L.js +1205 -0
- package/dist/chunk-TKDRT2DF.js +114 -0
- package/dist/chunk-TV2EBCSQ.js +152 -0
- package/dist/chunk-U26XXPJS.js +367 -0
- package/dist/chunk-U5QU5ZOD.js +419 -0
- package/dist/chunk-U6YTUVOX.js +1011 -0
- package/dist/chunk-UCINIRHW.js +188 -0
- package/dist/chunk-UJD5MPP6.js +52 -0
- package/dist/chunk-URCXX7WJ.js +146 -0
- package/dist/chunk-UX2L5CUD.js +898 -0
- package/dist/chunk-UZVYEF57.js +114 -0
- package/dist/chunk-V35KZDUZ.js +218 -0
- package/dist/chunk-VESL6DQY.js +1058 -0
- package/dist/chunk-VKHLUZNO.js +986 -0
- package/dist/chunk-VOYUCAQF.js +584 -0
- package/dist/chunk-VYRQHORQ.js +414 -0
- package/dist/chunk-W53XSRQE.js +245 -0
- package/dist/chunk-X4CEFOSG.js +226 -0
- package/dist/chunk-XDHUDE5K.js +380 -0
- package/dist/chunk-XISLDHEL.js +1290 -0
- package/dist/chunk-XM34YQ2Y.js +169 -0
- package/dist/chunk-XMDBTYCH.js +661 -0
- package/dist/chunk-XS2QPZJE.js +449 -0
- package/dist/chunk-YBUECLAF.js +618 -0
- package/dist/chunk-YQ6XEFVK.js +332 -0
- package/dist/chunk-YYLCPDCC.js +990 -0
- package/dist/chunk-Z4GLJ6J4.js +1035 -0
- package/dist/chunk-ZARZ4POR.js +210 -0
- package/dist/chunk-ZJPORZTC.js +119 -0
- package/dist/chunk-ZNUZ3EXD.js +243 -0
- package/dist/chunk-ZPST2KQO.js +49 -0
- package/dist/chunk-ZR5YA6ZF.js +512 -0
- package/dist/chunk-ZU4JPCPR.js +319 -0
- package/dist/chunk-ZUKUCZYZ.js +39 -0
- package/dist/cli/index.js +56 -45
- package/dist/clio-K2PBVCEM.js +27 -0
- package/dist/clio-context-tools-GR4OHFSO.js +145 -0
- package/dist/code-nav-4X3OI6DK.js +715 -0
- package/dist/codewiki/build-worker.js +4 -4
- package/dist/compile-cache-YRB6QRO7.js +18 -0
- package/dist/components-RQOJ6NUR.js +675 -0
- package/dist/config-Q5J7UBAB.js +291 -0
- package/dist/config-XE7XYZLU.js +38 -0
- package/dist/config-graph-P3555574.js +175 -0
- package/dist/configure-KIJ32ZO6.js +104 -0
- package/dist/context-LFBQOSXT.js +344 -0
- package/dist/context-NNLBES2Y.js +82 -0
- package/dist/context-WBH3KSVR.js +302 -0
- package/dist/context-clear-YOHMQ6SQ.js +208 -0
- package/dist/context-index-X2N5UAIF.js +120 -0
- package/dist/context-map-HOSMGUG2.js +555 -0
- package/dist/context-working-set-MRAEVDNV.js +1564 -0
- package/dist/data-tool-JJPBGMQJ.js +2986 -0
- package/dist/detail-RHJOTGN4.js +139 -0
- package/dist/dispatch-runner-NC7PYNIO.js +2477 -0
- package/dist/docs-K4GBWRUX.js +342 -0
- package/dist/doctor-S5KZ2GTN.js +1138 -0
- package/dist/doctor-deep-2EJQSHIZ.js +130 -0
- package/dist/domain-loader-MB34FDPD.js +13 -0
- package/dist/eval-3D6M36N7.js +5220 -0
- package/dist/eval-inventory-SM3HNM47.js +260 -0
- package/dist/evals-FO6JEUCN.js +104 -0
- package/dist/evidence-6IYN52ET.js +262 -0
- package/dist/evidence-JVECPI3F.js +250 -0
- package/dist/evidence-XNVPPLVK.js +410 -0
- package/dist/evolve-TLPUDJDM.js +634 -0
- package/dist/extensions-ROZJ5X3J.js +311 -0
- package/dist/fleet-6RJWIOEO.js +284 -0
- package/dist/fleet-WKVBF5SZ.js +942 -0
- package/dist/fleet-commands-L6WFT7KZ.js +76 -0
- package/dist/fleet-decisions-BTQMWU5A.js +55 -0
- package/dist/fleet-graph-553DZ67Q.js +141 -0
- package/dist/fleet-inspect-236FZPRB.js +329 -0
- package/dist/fleet-new-CKUXP3CO.js +48 -0
- package/dist/fleet-preflight-NZQHABWO.js +95 -0
- package/dist/fleet-validate-7NLAE26R.js +96 -0
- package/dist/fleet-verify-E3RO6A5W.js +226 -0
- package/dist/fleet-view-KMZQY7YJ.js +144 -0
- package/dist/gui/client/assets/abnfDiagram-VCTEODGH-DPBWQwNn.js +1 -0
- package/dist/gui/client/assets/architecture-7GRP2DOG-D1w8FrFW.js +1 -0
- package/dist/gui/client/assets/architectureDiagram-5GKGNRK7-CVPgKd1-.js +36 -0
- package/dist/gui/client/assets/blockDiagram-I7D4REHJ-BLmnqkK5.js +129 -0
- package/dist/gui/client/assets/c4Diagram-7LVT6UL2-4AU9cfM7.js +38 -0
- package/dist/gui/client/assets/channel-DwFZ0m8S.js +1 -0
- package/dist/gui/client/assets/chunk-4HAMMTFA-EOWkKCav.js +62 -0
- package/dist/gui/client/assets/chunk-75Z2AOVW-CygeoIMl.js +2 -0
- package/dist/gui/client/assets/chunk-DU6HZSFF-s27fViLb.js +125 -0
- package/dist/gui/client/assets/chunk-F27PBJKO-BrHvwLsZ.js +1 -0
- package/dist/gui/client/assets/chunk-GMAD6QVW-DzPh-7jt.js +72 -0
- package/dist/gui/client/assets/chunk-GVQU2GXP-pIaQkIzm.js +1 -0
- package/dist/gui/client/assets/chunk-IMKFNOWR-BGJVE_Br.js +231 -0
- package/dist/gui/client/assets/chunk-L3NEJ4N5-B3YLuhww.js +1 -0
- package/dist/gui/client/assets/chunk-OSK3NFVY-BRj61HHU.js +10 -0
- package/dist/gui/client/assets/chunk-P2QGCYS3-Sno90KxP.js +1 -0
- package/dist/gui/client/assets/chunk-POPQ4Y6H-Cw8NTbxr.js +1 -0
- package/dist/gui/client/assets/chunk-PWAF6VOD-BIhHgz37.js +1 -0
- package/dist/gui/client/assets/chunk-SHT3W25Y-Cqv7npBj.js +168 -0
- package/dist/gui/client/assets/chunk-SVP7TREG-Hxzl6Dee.js +88 -0
- package/dist/gui/client/assets/chunk-TICWLB2K-CIFVyVP2.js +206 -0
- package/dist/gui/client/assets/classDiagram-ZZMXUADV-BJbAiI_w.js +1 -0
- package/dist/gui/client/assets/classDiagram-v2-VYDZK3BY-BJbAiI_w.js +1 -0
- package/dist/gui/client/assets/cynefin-OW5HDTMX-DecLWZ-y.js +1 -0
- package/dist/gui/client/assets/cynefinDiagram-5FMLGOSQ-CK-T2N-D.js +62 -0
- package/dist/gui/client/assets/dagre-GXQ25YYZ-C0dfg-OS.js +4 -0
- package/dist/gui/client/assets/diagram-S7CK7UJ4-EaJukVh-.js +30 -0
- package/dist/gui/client/assets/diagram-UQ7AKVKN-xcOucEtP.js +41 -0
- package/dist/gui/client/assets/diagram-VSXAHHWV-3AUJACMf.js +3 -0
- package/dist/gui/client/assets/diagram-VX7I27RA-TPknLqam.js +24 -0
- package/dist/gui/client/assets/diagram-Z3DM3KII-wa1q3YMF.js +24 -0
- package/dist/gui/client/assets/ebnfDiagram-PWID7BFC-JBCF2-s7.js +1 -0
- package/dist/gui/client/assets/erDiagram-RLTQ6QDP-CmXjXPc4.js +99 -0
- package/dist/gui/client/assets/eventmodeling-NTZA5JFV-D_1aJWYl.js +1 -0
- package/dist/gui/client/assets/flowDiagram-HODETNUW-BQtZlael.js +1 -0
- package/dist/gui/client/assets/framework-Bq-znqwW.js +9 -0
- package/dist/gui/client/assets/ganttDiagram-EL5Y4UJY-IPaL_kaa.js +292 -0
- package/dist/gui/client/assets/gitGraph-4MIJSDKK-Oy0Q3hoc.js +1 -0
- package/dist/gui/client/assets/gitGraphDiagram-WWUBYQGX-jtAuBmbc.js +106 -0
- package/dist/gui/client/assets/index-CuFuBEdL.css +1 -0
- package/dist/gui/client/assets/index-hMbEIsX0.js +87 -0
- package/dist/gui/client/assets/info-A6RAGUB7-UtEs1tv7.js +1 -0
- package/dist/gui/client/assets/infoDiagram-27XIBGKW-hlwR1pBW.js +2 -0
- package/dist/gui/client/assets/ishikawaDiagram-5VMMS53U-C6vMtfsd.js +70 -0
- package/dist/gui/client/assets/journeyDiagram-3NMN7TZE-EAwAl_PS.js +139 -0
- package/dist/gui/client/assets/kanban-definition-UXKFOSKX-CQOhRKHW.js +89 -0
- package/dist/gui/client/assets/line-DbcwGZTW.js +1 -0
- package/dist/gui/client/assets/mermaid-parser.core-C2QfVcHd.js +7 -0
- package/dist/gui/client/assets/mermaid.core-N9qUTre1.js +44 -0
- package/dist/gui/client/assets/mindmap-definition-YA3MSWOX-BR_FL9gK.js +96 -0
- package/dist/gui/client/assets/packet-AYTQ26CC-CbBJ2oAa.js +1 -0
- package/dist/gui/client/assets/pegDiagram-XKGWAZYB-BruU0IHM.js +1 -0
- package/dist/gui/client/assets/pie-WAS4IAKB-BWdSng4H.js +1 -0
- package/dist/gui/client/assets/pieDiagram-E7YTZNPT-CR3ljgdU.js +39 -0
- package/dist/gui/client/assets/quadrantDiagram-AXDQQJYC-C-boKslr.js +7 -0
- package/dist/gui/client/assets/radar-RG4KPBEZ-CGlOnAKG.js +1 -0
- package/dist/gui/client/assets/railroad-74A4TZTK-CDvuAlyC.js +1 -0
- package/dist/gui/client/assets/railroad-abnf-HS5TGJTU-CQUA9crC.js +1 -0
- package/dist/gui/client/assets/railroad-ebnf-LZEXJU2U-CD857gxq.js +1 -0
- package/dist/gui/client/assets/railroad-peg-WCYAUIDC-DUV4k35E.js +1 -0
- package/dist/gui/client/assets/railroadDiagram-O6MQD6OU-DMR4LXmA.js +1 -0
- package/dist/gui/client/assets/requirementDiagram-BXWQKSXE-DVltaF6c.js +84 -0
- package/dist/gui/client/assets/sankeyDiagram-P5KCCOFB-CHdNz472.js +40 -0
- package/dist/gui/client/assets/sequenceDiagram-WJ2MYXX4-DaMafIty.js +162 -0
- package/dist/gui/client/assets/stateDiagram-D77RDMKH-CEbBHqn3.js +1 -0
- package/dist/gui/client/assets/stateDiagram-v2-MP3YSRHH-B3JgDdFg.js +1 -0
- package/dist/gui/client/assets/swimlanes-42K2YHIH-BlPHndnJ.js +1 -0
- package/dist/gui/client/assets/swimlanesDiagram-VR7AAH4N-BPabHwsZ.js +8 -0
- package/dist/gui/client/assets/timeline-definition-24CTP7MA-E4Y1lPBI.js +120 -0
- package/dist/gui/client/assets/treeView-Q6P3EWNA-DrY0uhTN.js +1 -0
- package/dist/gui/client/assets/treemap-WGGIJYW6-CVotnLHf.js +1 -0
- package/dist/gui/client/assets/vennDiagram-4TSXK5OY-DJNrLIOF.js +34 -0
- package/dist/gui/client/assets/wardley-WFR3VGLG-ClOpAp5S.js +1 -0
- package/dist/gui/client/assets/wardleyDiagram-VM6X3IG4-qhMoKOXc.js +78 -0
- package/dist/gui/client/assets/xychartDiagram-S5SC5T6Z-CTuXoo9R.js +7 -0
- package/dist/gui/client/index.html +6 -0
- package/dist/gui/ops-worker.js +167 -0
- package/dist/gui/reads-worker.js +473 -0
- package/dist/gui/server.js +9780 -0
- package/dist/gui-QJS7XQMV.js +16 -0
- package/dist/init-DV5B6HQG.js +354 -0
- package/dist/install-6C45YXFP.js +19 -0
- package/dist/install-O7NSRU2W.js +13 -0
- package/dist/interactive-OXGYZYAS.js +22381 -0
- package/dist/interop-J7UOBOSF.js +254 -0
- package/dist/inventory-OEGIL6PY.js +144 -0
- package/dist/library-B3UPGY4V.js +83 -0
- package/dist/library-MXQA5DLT.js +309 -0
- package/dist/library-ROZAMUIL.js +496 -0
- package/dist/library-import-2LTWOVBD.js +190 -0
- package/dist/library-inventory-LJ3XHLWO.js +60 -0
- package/dist/library-validation-DARHHUNW.js +46 -0
- package/dist/mcp-2GSPYQ54.js +28 -0
- package/dist/memory-J3STUUIK.js +537 -0
- package/dist/models-Y3GMFJ2V.js +314 -0
- package/dist/monitor-LHNH577J.js +811 -0
- package/dist/orchestrator-DTAPXULA.js +12117 -0
- package/dist/panes-A743ONZ5.js +103 -0
- package/dist/panes-CTNO57ZY.js +76 -0
- package/dist/paths-3SBYJQDP.js +68 -0
- package/dist/preload-OJBMAIXF.js +140 -0
- package/dist/providers-CMETPZNS.js +232 -0
- package/dist/registry-37T4U6X2.js +15 -0
- package/dist/reset-O7EUCYWO.js +346 -0
- package/dist/resources-FY6XYFN2.js +189 -0
- package/dist/run-H64MEVTA.js +1067 -0
- package/dist/run-script-PQ5NRU3X.js +42 -0
- package/dist/settings-SNIQNXCW.js +73 -0
- package/dist/settings-controls-X6GMCPVG.js +202 -0
- package/dist/share-CAFMMQLM.js +299 -0
- package/dist/skills-ERKQUC7L.js +114 -0
- package/dist/skills-eval-CQ23MYQK.js +1099 -0
- package/dist/skills-inventory-TVUYJDVN.js +142 -0
- package/dist/slash-commands-ROG3KIFJ.js +107 -0
- package/dist/startup-background-KDWCQMWT.js +247 -0
- package/dist/steer-KKYXJSH4.js +77 -0
- package/dist/support-M3RCUUEL.js +40 -0
- package/dist/system-ZDW44ZGX.js +142 -0
- package/dist/target-runtimes-PWA22WVW.js +73 -0
- package/dist/targets-AJWA6E7Z.js +1207 -0
- package/dist/tasks-6L2JJRC5.js +39 -0
- package/dist/terminal-lease-YFUSDPAD.js +432 -0
- package/dist/tools-5XJUABRD.js +30 -0
- package/dist/trace-LA5MVR4Y.js +527 -0
- package/dist/tree-sitter-TQW3Y52T.js +4673 -0
- package/dist/tui-primitives-IUCVWLH5.js +19 -0
- package/dist/uninstall-SAWGGXAB.js +448 -0
- package/dist/upgrade-HSNSVTZG.js +300 -0
- package/dist/usage-XSILDHKF.js +1083 -0
- package/dist/verifiers-ECA5GIHL.js +633 -0
- package/dist/verify-R6QQCCEB.js +31 -0
- package/dist/version-PLZYB5KW.js +22 -0
- package/dist/web-fetch-PVZNMBOB.js +803 -0
- package/dist/wiki-generate-RP22WP5K.js +647 -0
- package/dist/with-panes-W3PAZPRF.js +629 -0
- package/dist/worker/entry.js +324 -284
- package/dist/workspace-check-3764ZKC2.js +83 -0
- package/docs/README.md +26 -10
- package/docs/architecture/acp.md +179 -12
- package/docs/architecture/artifact-placement.md +1 -1
- package/docs/architecture/capacity-and-scheduling.md +7 -8
- package/docs/architecture/context-engine.md +350 -95
- package/docs/architecture/model-catalog.md +18 -11
- package/docs/architecture/observability.md +1 -1
- package/docs/architecture/pi-boundary.md +59 -6
- package/docs/architecture/prompt-envelope-and-tools.md +147 -39
- package/docs/architecture/provider-adapter-cookbook.md +2 -2
- package/docs/architecture/safety-model.md +18 -4
- package/docs/architecture/trace-store.md +2 -2
- package/docs/architecture/tui-design.md +41 -81
- package/docs/architecture/worker-dispatch-mechanics.md +9 -1
- package/docs/gui/README.md +69 -0
- package/docs/gui/boundary-doctrine.md +104 -0
- package/docs/gui/chat-rendering-spec.md +1440 -0
- package/docs/gui/cli-surface-routing.md +148 -0
- package/docs/gui/delivery-order.md +53 -0
- package/docs/gui/event-bus-coverage.md +103 -0
- package/docs/gui/inspector-presentation.md +71 -0
- package/docs/gui/parity/01-cli-surface.md +74 -0
- package/docs/gui/parity/02-slash-and-surfaces.md +110 -0
- package/docs/gui/parity/03-domains-and-plan.md +69 -0
- package/docs/gui/performance-baseline.md +76 -0
- package/docs/gui/settings-write-surface.md +267 -0
- package/docs/gui/workflow-coverage.md +64 -0
- package/docs/guide/built-in-agents.md +1 -1
- package/docs/guide/commands-and-modes.md +256 -99
- package/docs/guide/configuration-and-targets.md +485 -124
- package/docs/guide/configuration-reference.md +165 -82
- package/docs/guide/doctor.md +127 -0
- package/docs/guide/environment-variables.md +1 -1
- package/docs/guide/exit-codes-and-output.md +3 -1
- package/docs/guide/extensions-and-sharing.md +3 -14
- package/docs/guide/fleet-dispatch.md +231 -45
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/installation-and-lifecycle.md +27 -16
- package/docs/guide/interop.md +2 -2
- package/docs/guide/proactive-memory.md +154 -68
- package/docs/guide/resource-library.md +4 -0
- package/docs/guide/skills-marketplace.md +8 -4
- package/docs/guide/slurm.md +88 -0
- package/docs/guide/tool-usage.md +134 -11
- package/docs/guide/troubleshooting.md +4 -2
- package/docs/process/battletest-2026-09-20-fixes.md +161 -0
- package/docs/process/configure-tree-proposal.md +637 -0
- package/docs/process/documentation-coverage.md +8 -0
- package/docs/process/documentation-guide.md +18 -1
- package/docs/process/eval-runner.md +58 -14
- package/docs/process/performance-methodology.md +11 -3
- package/docs/process/release-cut-checklist.md +29 -3
- package/docs/process/tool-audit-v0.4.9.md +3 -0
- package/examples/extensions/README.md +1 -3
- package/examples/extensions/lab-status/clio-coder-extension.json +1 -1
- package/examples/extensions/measurements/clio-coder-extension.json +1 -1
- package/library/registry.yaml +30 -5
- package/library/skills/git/fix-issue/SKILL.md +2 -1
- package/library/skills/git/fix-issue/plugin.json +1 -1
- package/library/skills/git/ship/SKILL.md +2 -1
- package/library/skills/git/ship/plugin.json +1 -1
- package/library/skills/meta/clio-coder-test/SKILL.md +5 -6
- package/library/skills/meta/clio-coder-test/evals.md +2 -2
- package/library/skills/meta/clio-coder-test/references/test-map.md +2 -2
- package/library/skills/registry.yaml +9 -5
- package/library/skills/research/slurm-jobs/SKILL.md +110 -0
- package/library/skills/research/slurm-jobs/evals.md +39 -0
- package/library/skills/research/slurm-jobs/plugin.json +23 -0
- package/library/skills/skill-marketplace.json +18 -2
- package/package.json +15 -10
- package/src/cli/args.ts +59 -0
- package/src/cli/argv.ts +7 -0
- package/src/cli/clio.ts +9 -1
- package/src/cli/configure-controls.ts +136 -0
- package/src/cli/configure-onboarding.ts +24 -7
- package/src/cli/configure-quick.ts +32 -7
- package/src/cli/configure-target.ts +11 -1
- package/src/cli/configure.ts +253 -256
- package/src/cli/docs-server.ts +290 -0
- package/src/cli/docs.ts +60 -15
- package/src/cli/doctor-deep.ts +126 -0
- package/src/cli/doctor-hpc.ts +122 -0
- package/src/cli/doctor-slurm.ts +130 -0
- package/src/cli/doctor-task-worktrees.ts +88 -0
- package/src/cli/doctor.ts +165 -16
- package/src/cli/fleet-verify.ts +3 -2
- package/src/cli/gui.ts +111 -0
- package/src/cli/index.ts +14 -4
- package/src/cli/library.ts +2 -7
- package/src/cli/modes/json-stream.ts +4 -2
- package/src/cli/modes/print.ts +252 -25
- package/src/cli/run.ts +199 -71
- package/src/cli/skills.ts +25 -7
- package/src/cli/targets.ts +87 -9
- package/src/cli/uninstall.ts +28 -8
- package/src/cli/usage.ts +2 -1
- package/src/cli/workspace-check.ts +71 -0
- package/src/core/bash-exec.ts +8 -2
- package/src/core/bus-events.ts +32 -3
- package/src/core/cache-telemetry.ts +3 -2
- package/src/core/compile-cache.ts +11 -1
- package/src/core/config.ts +59 -6
- package/src/core/defaults.ts +27 -5
- package/src/core/diagnostics.ts +25 -0
- package/src/core/event-bus.ts +2 -1
- package/src/core/gateway-routing.ts +10 -3
- package/src/core/git-commit-attribution.ts +2 -1
- package/src/core/naming-compat.ts +6 -4
- package/src/core/package-root.ts +0 -9
- package/src/core/path-canonical.ts +143 -24
- package/src/core/residency-target-key.ts +2 -6
- package/src/core/run-overrides.ts +1 -1
- package/src/core/settings-awareness.ts +108 -0
- package/src/core/settings-controls.ts +673 -0
- package/src/core/settings-navigation.ts +116 -0
- package/src/core/theme-token-hex.ts +19 -9
- package/src/core/turn-constraints.ts +52 -0
- package/src/domains/agents/builtins/scout.md +7 -17
- package/src/domains/agents/catalog.ts +5 -1
- package/src/domains/agents/extension.ts +2 -1
- package/src/domains/agents/registry.ts +4 -3
- package/src/domains/agents/result-contract.ts +132 -1
- package/src/domains/config/classify.ts +11 -7
- package/src/domains/config/extension.ts +5 -1
- package/src/domains/config/keybindings.ts +2 -2
- package/src/domains/context/codewiki/coordinator.ts +10 -0
- package/src/domains/context/worker/snapshot.ts +6 -3
- package/src/domains/dispatch/active-route-planner.ts +2 -0
- package/src/domains/dispatch/agent-candidates.ts +5 -1
- package/src/domains/dispatch/capability-match.ts +1 -1
- package/src/domains/dispatch/contract.ts +28 -0
- package/src/domains/dispatch/event-pump.ts +37 -3
- package/src/domains/dispatch/extension.ts +391 -48
- package/src/domains/dispatch/failure-classification.ts +37 -2
- package/src/domains/dispatch/receipt-integrity.ts +3 -0
- package/src/domains/dispatch/run-identity.ts +10 -3
- package/src/domains/dispatch/target-breaker.ts +163 -0
- package/src/domains/dispatch/types.ts +29 -2
- package/src/domains/dispatch/worker-model-loads.ts +66 -0
- package/src/domains/dispatch/worker-protocol.ts +20 -1
- package/src/domains/dispatch/worker-spawn.ts +28 -2
- package/src/domains/eval/artifacts/redact.ts +9 -0
- package/src/domains/eval/metrics/noop.ts +61 -0
- package/src/domains/eval/reports/junit.ts +5 -1
- package/src/domains/eval/reports/text.ts +7 -0
- package/src/domains/eval/runners/clio-run.ts +19 -8
- package/src/domains/eval/runners/external-command.ts +29 -4
- package/src/domains/eval/schema/adapter.ts +6 -2
- package/src/domains/eval/schema/suite.ts +2 -0
- package/src/domains/eval/schema/validate.ts +3 -0
- package/src/domains/eval/suites/run.ts +167 -26
- package/src/domains/evidence/detail.ts +3 -2
- package/src/domains/extensions/operator-runtime.ts +11 -4
- package/src/domains/gateway/mcp/client.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +42 -26
- package/src/domains/lifecycle/migrations/2026-09-18-ollama-runtime-id.ts +38 -0
- package/src/domains/lifecycle/migrations/index.ts +2 -0
- package/src/domains/middleware/demo-guidance.ts +36 -0
- package/src/domains/middleware/dispatch-nudge.ts +1 -1
- package/src/domains/middleware/memory-intervention.ts +51 -4
- package/src/domains/middleware/runtime.ts +5 -4
- package/src/domains/middleware/skills-reminder.ts +29 -52
- package/src/domains/middleware/task-nudge.ts +1 -0
- package/src/domains/middleware/watchdog.ts +4 -0
- package/src/domains/observability/extension.ts +2 -1
- package/src/domains/observability/out-of-turn-usage.ts +3 -2
- package/src/domains/observability/projection.ts +3 -2
- package/src/domains/observability/worker-progress.ts +48 -0
- package/src/domains/prompts/compiler.ts +148 -52
- package/src/domains/prompts/contract.ts +3 -3
- package/src/domains/prompts/demo-guidance.ts +8 -0
- package/src/domains/prompts/extension.ts +12 -7
- package/src/domains/prompts/fragments/identity/clio.md +2 -1
- package/src/domains/prompts/fragments/identity/docs-routing.md +2 -0
- package/src/domains/prompts/fragments/identity/self-awareness.md +4 -0
- package/src/domains/prompts/fragments/operating/contract.md +16 -7
- package/src/domains/prompts/fragments/operating/delegation.md +29 -13
- package/src/domains/prompts/fragments/operating/skills.md +18 -10
- package/src/domains/prompts/fragments/operating/worker.md +2 -0
- package/src/domains/providers/cache-deployment.ts +45 -2
- package/src/domains/providers/contract.ts +52 -11
- package/src/domains/providers/extension.ts +230 -53
- package/src/domains/providers/model-discovery.ts +22 -8
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +5 -7
- package/src/domains/providers/plugins.ts +3 -4
- package/src/domains/providers/probe/fingerprint.ts +2 -2
- package/src/domains/providers/probe/reasoning.ts +9 -16
- package/src/domains/providers/probe/tool-call.ts +236 -0
- package/src/domains/providers/registry.ts +51 -8
- package/src/domains/providers/runtime-resolution.ts +60 -12
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -1
- package/src/domains/providers/runtimes/builtins.ts +2 -2
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +57 -41
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -1
- package/src/domains/providers/runtimes/common/ollama-model-ids.ts +11 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +53 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +3 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +7 -13
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +7 -17
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +1 -0
- package/src/domains/providers/runtimes/local-native/ollama.ts +211 -0
- package/src/domains/providers/runtimes/protocol/litellm.ts +77 -65
- package/src/domains/providers/support.ts +1 -1
- package/src/domains/providers/types/local-model-quirks.ts +2 -3
- package/src/domains/providers/types/runtime-descriptor.ts +23 -3
- package/src/domains/providers/types/target-descriptor.ts +15 -3
- package/src/domains/resources/collision.ts +7 -2
- package/src/domains/resources/index.ts +1 -0
- package/src/domains/resources/library-actions.ts +4 -2
- package/src/domains/resources/library-inventory.ts +6 -2
- package/src/domains/resources/prompts/loader.ts +20 -7
- package/src/domains/resources/skills/availability.ts +56 -0
- package/src/domains/resources/skills/loader.ts +20 -9
- package/src/domains/safety/action-classifier.ts +282 -31
- package/src/domains/safety/audit.ts +2 -1
- package/src/domains/safety/autonomy.ts +54 -11
- package/src/domains/safety/decision-presentation.ts +17 -4
- package/src/domains/safety/finish-contract-registration.ts +25 -1
- package/src/domains/safety/finish-contract.ts +20 -5
- package/src/domains/safety/path-policy.ts +6 -2
- package/src/domains/safety/policy-engine.ts +168 -48
- package/src/domains/safety/protected-artifacts.ts +527 -16
- package/src/domains/safety/read-scope.ts +120 -0
- package/src/domains/safety/skill-authority.ts +52 -16
- package/src/domains/scheduling/cluster.ts +14 -3
- package/src/domains/scheduling/contract.ts +7 -0
- package/src/domains/scheduling/extension.ts +20 -9
- package/src/domains/scheduling/local-capacity.ts +160 -0
- package/src/domains/session/context-accounting.ts +44 -31
- package/src/domains/session/context-ledger.ts +10 -3
- package/src/domains/session/entries.ts +4 -0
- package/src/domains/session/history.ts +1 -1
- package/src/domains/session/prompt-cache.ts +1 -0
- package/src/domains/session/prompt-manifest.ts +3 -1
- package/src/domains/session/retry.ts +4 -6
- package/src/domains/session/task-board.ts +19 -4
- package/src/domains/session/tree/preview.ts +3 -2
- package/src/engine/acp/commands.ts +653 -0
- package/src/engine/acp/server.ts +639 -20
- package/src/engine/acp/tool-mediator.ts +30 -7
- package/src/engine/acp/types.ts +58 -0
- package/src/engine/agent.ts +55 -10
- package/src/engine/ai.ts +11 -2
- package/src/engine/api-registry.ts +5 -4
- package/src/engine/apis/degraded-inference.ts +243 -0
- package/src/engine/apis/llamacpp-residency.ts +50 -6
- package/src/engine/apis/lmstudio-residency.ts +3 -5
- package/src/engine/apis/lmstudio.ts +137 -31
- package/src/engine/apis/ollama-http.ts +118 -0
- package/src/engine/apis/ollama-native.ts +216 -97
- package/src/engine/apis/openai-completions.ts +191 -189
- package/src/engine/apis/output-budget.ts +3 -1
- package/src/engine/apis/residency-lock.ts +2 -1
- package/src/engine/apis/residency.ts +339 -89
- package/src/engine/apis/sampling-overrides.ts +23 -2
- package/src/engine/apis/types.ts +1 -2
- package/src/engine/claude/tool-safety.ts +30 -5
- package/src/engine/context.ts +13 -0
- package/src/engine/env-api-keys.ts +2 -1
- package/src/engine/gemma-channel-filter.ts +3 -2
- package/src/engine/instrumented-tui.ts +25 -0
- package/src/engine/loop-guard.ts +172 -6
- package/src/engine/pi-mono-names.ts +16 -0
- package/src/engine/prewarm.ts +44 -15
- package/src/engine/provider-payload.ts +52 -14
- package/src/engine/session.ts +4 -2
- package/src/engine/worker-events.ts +9 -1
- package/src/engine/worker-runtime.ts +269 -42
- package/src/engine/worker-tools.ts +8 -3
- package/src/entry/boot-options.ts +23 -0
- package/src/entry/orchestrator.ts +207 -36
- package/src/interactive/assistant-generation-timing.ts +52 -0
- package/src/interactive/chat-loop-messages.ts +4 -1
- package/src/interactive/chat-loop.ts +59 -9
- package/src/interactive/chat-panel.ts +10 -1
- package/src/interactive/clio-editor.ts +51 -79
- package/src/interactive/context-meter.ts +1 -0
- package/src/interactive/context-overlay.ts +21 -8
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/dispatch-board.ts +39 -8
- package/src/interactive/editor-bash.ts +0 -34
- package/src/interactive/editor-rails.ts +43 -0
- package/src/interactive/editor-submit.ts +34 -2
- package/src/interactive/footer/dashboard.ts +67 -38
- package/src/interactive/footer/demo-hints.ts +40 -0
- package/src/interactive/footer/key-hints.ts +21 -0
- package/src/interactive/footer/notifications.ts +1 -1
- package/src/interactive/footer/pages.ts +486 -0
- package/src/interactive/footer/system-metrics.ts +147 -0
- package/src/interactive/footer/widgets.ts +158 -63
- package/src/interactive/footer-panel.ts +29 -7
- package/src/interactive/interactive-application.ts +109 -21
- package/src/interactive/interactive-event-projection.ts +6 -2
- package/src/interactive/interactive-presentation.ts +25 -29
- package/src/interactive/interactive-slash-runtime.ts +32 -18
- package/src/interactive/interactive-subscriptions.ts +25 -5
- package/src/interactive/interactive-tickers.ts +21 -5
- package/src/interactive/keybinding-manager.ts +9 -0
- package/src/interactive/overlay-frame.ts +29 -7
- package/src/interactive/overlay-lifecycle.ts +5 -3
- package/src/interactive/overlay-model-selectors.ts +4 -0
- package/src/interactive/overlay-permission-lifecycle.ts +6 -5
- package/src/interactive/overlays/ask-user.ts +103 -110
- package/src/interactive/overlays/help-reference.ts +1 -0
- package/src/interactive/overlays/message-picker.ts +3 -29
- package/src/interactive/overlays/session-selector.ts +3 -2
- package/src/interactive/overlays/settings-sections.ts +2 -30
- package/src/interactive/overlays/settings.ts +310 -607
- package/src/interactive/permission-hint.ts +3 -3
- package/src/interactive/permission-overlay.ts +45 -27
- package/src/interactive/renderers/doctor-report.ts +43 -0
- package/src/interactive/renderers/tool-execution.ts +87 -62
- package/src/interactive/renderers/worker-entry.ts +76 -3
- package/src/interactive/side-question.ts +3 -1
- package/src/interactive/slash-commands.ts +78 -23
- package/src/interactive/startup-background.ts +131 -0
- package/src/interactive/startup-diagnostics.ts +16 -0
- package/src/interactive/status/state-machine.ts +16 -3
- package/src/interactive/status/types.ts +2 -0
- package/src/interactive/status/verbs.ts +1 -1
- package/src/interactive/terminal-lease.ts +26 -22
- package/src/interactive/theme/components.ts +1 -1
- package/src/interactive/theme/rules.ts +1 -1
- package/src/interactive/theme/tokens.ts +16 -10
- package/src/interactive/transcript-detail.ts +4 -0
- package/src/interactive/turn-context.ts +56 -20
- package/src/interactive/turn-middleware.ts +57 -9
- package/src/interactive/turn-prewarm.ts +121 -18
- package/src/interactive/turn-recovery.ts +10 -8
- package/src/interactive/turn-runtime.ts +74 -29
- package/src/interactive/turn-state.ts +3 -0
- package/src/interactive/welcome-art.ts +36 -0
- package/src/interactive/welcome-dashboard.ts +209 -49
- package/src/interactive/worker-replay.ts +4 -0
- package/src/interactive/worker-stream.ts +17 -2
- package/src/tools/agent-tools.ts +22 -1
- package/src/tools/builtin-tool-catalog.ts +2 -2
- package/src/tools/codewiki/code-nav.ts +1 -1
- package/src/tools/codewiki/shared.ts +39 -1
- package/src/tools/compete-worktrees.ts +8 -91
- package/src/tools/context/docs-engine.ts +44 -12
- package/src/tools/context/index.ts +126 -22
- package/src/tools/context/library.ts +1 -1
- package/src/tools/context/surface.ts +12 -7
- package/src/tools/core-bootstrap.ts +3 -0
- package/src/tools/dispatch-runner.ts +18 -0
- package/src/tools/dispatch-schema.ts +187 -206
- package/src/tools/edit.ts +46 -42
- package/src/tools/file-mutation-queue.ts +25 -26
- package/src/tools/gateway/clio-context-surface.ts +1 -1
- package/src/tools/gateway/index.ts +7 -3
- package/src/tools/gateway/mcp-capabilities.ts +5 -3
- package/src/tools/grep.ts +14 -2
- package/src/tools/ls.ts +1 -4
- package/src/tools/monitor.ts +14 -1
- package/src/tools/observation.ts +1 -3
- package/src/tools/path-utils.ts +51 -18
- package/src/tools/process-lease.ts +99 -0
- package/src/tools/read.ts +1 -1
- package/src/tools/registry.ts +71 -9
- package/src/tools/task-worktree.ts +296 -17
- package/src/tools/tasks.ts +29 -7
- package/src/tools/worker-evidence.ts +60 -1
- package/src/tools/worktree-root.ts +252 -0
- package/src/tools/write.ts +34 -30
- package/src/worker/entry.ts +18 -1
- package/src/worker/protocol.ts +54 -1
- package/src/worker/spec-contract.ts +22 -2
- package/dist/acp-ZWZCPS2A.js +0 -130
- package/dist/agents-LYSOWZUE.js +0 -150
- package/dist/auth-WBQGKWQ5.js +0 -551
- package/dist/background-BUMOBAQN.js +0 -37
- package/dist/builtins-ODRJOEDI.js +0 -22
- package/dist/chunk-2DRRZ57Q.js +0 -571
- package/dist/chunk-2JBZYUPY.js +0 -105
- package/dist/chunk-2VBWFXYE.js +0 -198
- package/dist/chunk-2X2R3UTH.js +0 -1018
- package/dist/chunk-32KJPXAM.js +0 -75
- package/dist/chunk-37LW32LZ.js +0 -32
- package/dist/chunk-3A3CUMKA.js +0 -54
- package/dist/chunk-3AND2EFU.js +0 -215
- package/dist/chunk-3RDHGNU7.js +0 -647
- package/dist/chunk-3SUDBGEI.js +0 -1323
- package/dist/chunk-3TQN67I2.js +0 -396
- package/dist/chunk-3U4BL2EV.js +0 -103
- package/dist/chunk-3UQADNG2.js +0 -302
- package/dist/chunk-434LRQ6Z.js +0 -13441
- package/dist/chunk-4ATBOFRP.js +0 -7802
- package/dist/chunk-4DNL43EZ.js +0 -139
- package/dist/chunk-4HFJKRGZ.js +0 -5250
- package/dist/chunk-555E2WVV.js +0 -322
- package/dist/chunk-5GZICIYO.js +0 -462
- package/dist/chunk-5PHVPU4G.js +0 -160
- package/dist/chunk-5RTEFNBP.js +0 -197
- package/dist/chunk-64XJW7NT.js +0 -380
- package/dist/chunk-6TKOFFGE.js +0 -1058
- package/dist/chunk-6UJ7RDI7.js +0 -1143
- package/dist/chunk-7FBCRWVT.js +0 -1801
- package/dist/chunk-7JSOSVLP.js +0 -283
- package/dist/chunk-7N3OLLSL.js +0 -637
- package/dist/chunk-7QQRPB2E.js +0 -915
- package/dist/chunk-A6DULIMH.js +0 -986
- package/dist/chunk-AB3QXXBC.js +0 -123
- package/dist/chunk-ACCECAH4.js +0 -49
- package/dist/chunk-AM6CEP2K.js +0 -2120
- package/dist/chunk-AUHVBIDW.js +0 -19
- package/dist/chunk-AY4XE6GN.js +0 -665
- package/dist/chunk-BBA2TAWV.js +0 -667
- package/dist/chunk-BFPHMSK7.js +0 -169
- package/dist/chunk-BMNVVKEW.js +0 -604
- package/dist/chunk-CKK25WN3.js +0 -72
- package/dist/chunk-CTGZCEI6.js +0 -33
- package/dist/chunk-DIAJYJYG.js +0 -446
- package/dist/chunk-DVNAPPXU.js +0 -27
- package/dist/chunk-DXVMLM3Z.js +0 -92
- package/dist/chunk-E3LEPLQ2.js +0 -68
- package/dist/chunk-EHZRAB4U.js +0 -63
- package/dist/chunk-EM2DIQAJ.js +0 -179
- package/dist/chunk-EM2WNQS2.js +0 -93
- package/dist/chunk-ETF4ROKH.js +0 -595
- package/dist/chunk-F2YM3JY4.js +0 -22513
- package/dist/chunk-FEBQWHJT.js +0 -1023
- package/dist/chunk-FPS4R2RN.js +0 -1975
- package/dist/chunk-GD55RTIW.js +0 -33
- package/dist/chunk-GJDRMBDI.js +0 -573
- package/dist/chunk-GREYLTZ5.js +0 -658
- package/dist/chunk-H2WSCZZT.js +0 -238
- package/dist/chunk-H6IUCY6Q.js +0 -117
- package/dist/chunk-H72DCH3E.js +0 -563
- package/dist/chunk-H7TXJR23.js +0 -705
- package/dist/chunk-HBJQQTKM.js +0 -40
- package/dist/chunk-HCVKSGNZ.js +0 -990
- package/dist/chunk-HVCAY2FH.js +0 -67
- package/dist/chunk-I47EJPYL.js +0 -1377
- package/dist/chunk-IALGWTLO.js +0 -36
- package/dist/chunk-IALZJE37.js +0 -1710
- package/dist/chunk-IC7JXLOM.js +0 -1577
- package/dist/chunk-IOSVTTCD.js +0 -108
- package/dist/chunk-IPTPMLA6.js +0 -475
- package/dist/chunk-IZZI3SKQ.js +0 -128
- package/dist/chunk-JABWPKFY.js +0 -27
- package/dist/chunk-JIYWMQZ5.js +0 -175
- package/dist/chunk-JKU34ACI.js +0 -693
- package/dist/chunk-JOBN2YQQ.js +0 -176
- package/dist/chunk-JOL2QRLE.js +0 -152
- package/dist/chunk-JTR3VSV3.js +0 -44
- package/dist/chunk-JU6MAMRJ.js +0 -362
- package/dist/chunk-JURMQWVJ.js +0 -15
- package/dist/chunk-K2BLQC5E.js +0 -262
- package/dist/chunk-K3XN4LZ4.js +0 -402
- package/dist/chunk-KIVFXGBM.js +0 -688
- package/dist/chunk-KKRXONXG.js +0 -43
- package/dist/chunk-KOAHT3N2.js +0 -395
- package/dist/chunk-KP5BPXR3.js +0 -73
- package/dist/chunk-KQ6IDQIB.js +0 -39
- package/dist/chunk-KRJQG47M.js +0 -1289
- package/dist/chunk-KW6OJ7IY.js +0 -221
- package/dist/chunk-L3NBWLSN.js +0 -314
- package/dist/chunk-L4RUTLRL.js +0 -59
- package/dist/chunk-LGTVWPRN.js +0 -47
- package/dist/chunk-LSQW6KZO.js +0 -200
- package/dist/chunk-LTR5QCLS.js +0 -446
- package/dist/chunk-LWJYOHT3.js +0 -165
- package/dist/chunk-M6YLF66Z.js +0 -2687
- package/dist/chunk-MJ4QEJVT.js +0 -185
- package/dist/chunk-MO65K5CH.js +0 -1148
- package/dist/chunk-MTOZEQHL.js +0 -637
- package/dist/chunk-MZDPF35R.js +0 -45
- package/dist/chunk-MZKYVIWW.js +0 -188
- package/dist/chunk-NBPA5QM6.js +0 -386
- package/dist/chunk-NMBEW4PP.js +0 -688
- package/dist/chunk-NPLLK3HO.js +0 -3610
- package/dist/chunk-NSYGPIVW.js +0 -39
- package/dist/chunk-NXTV5OI5.js +0 -1020
- package/dist/chunk-NYDG4QP4.js +0 -689
- package/dist/chunk-OA2GDACN.js +0 -146
- package/dist/chunk-PJI57EC6.js +0 -236
- package/dist/chunk-PJJBUGMR.js +0 -4484
- package/dist/chunk-PNJE7JPS.js +0 -50
- package/dist/chunk-PP23PZEV.js +0 -1347
- package/dist/chunk-PPIFDSBK.js +0 -409
- package/dist/chunk-PTFISXQO.js +0 -319
- package/dist/chunk-QB33Z5S7.js +0 -1865
- package/dist/chunk-QGNII5VC.js +0 -110
- package/dist/chunk-QH3ZTUOA.js +0 -113
- package/dist/chunk-QI72X67S.js +0 -481
- package/dist/chunk-QJMRYTCX.js +0 -56
- package/dist/chunk-QKHZZFKH.js +0 -98
- package/dist/chunk-RDKX2PME.js +0 -66
- package/dist/chunk-RL7LJYN4.js +0 -66
- package/dist/chunk-RPMNIFRY.js +0 -65
- package/dist/chunk-RQROVOV3.js +0 -670
- package/dist/chunk-S34A7BSP.js +0 -97
- package/dist/chunk-SJETVJHX.js +0 -119
- package/dist/chunk-SJMNU4ZS.js +0 -634
- package/dist/chunk-SL2RDHKO.js +0 -19
- package/dist/chunk-SLLG2G44.js +0 -85
- package/dist/chunk-SQAZN2V3.js +0 -2744
- package/dist/chunk-SQBT46OF.js +0 -814
- package/dist/chunk-SRCEQKQS.js +0 -165
- package/dist/chunk-TCUOGIL2.js +0 -52
- package/dist/chunk-TIWPKCVO.js +0 -42
- package/dist/chunk-U44YYLVV.js +0 -1529
- package/dist/chunk-UIU7MGZ3.js +0 -486
- package/dist/chunk-USBBEKHW.js +0 -177
- package/dist/chunk-VHKTOLEW.js +0 -1416
- package/dist/chunk-VPWGADBG.js +0 -3151
- package/dist/chunk-VQD7NH7Z.js +0 -356
- package/dist/chunk-VWFCAK34.js +0 -697
- package/dist/chunk-W5RM7YAH.js +0 -78
- package/dist/chunk-W72LLZAV.js +0 -243
- package/dist/chunk-WGRDABW7.js +0 -207
- package/dist/chunk-WWRV5RJI.js +0 -165
- package/dist/chunk-XCUDZQLX.js +0 -195
- package/dist/chunk-XFLSL7BT.js +0 -386
- package/dist/chunk-XJZEDCNT.js +0 -391
- package/dist/chunk-XLLEL3K7.js +0 -709
- package/dist/chunk-XNZWWDC3.js +0 -686
- package/dist/chunk-XRECG65F.js +0 -308
- package/dist/chunk-XTQ7MEJG.js +0 -457
- package/dist/chunk-XW2UZICE.js +0 -372
- package/dist/chunk-Y3M2T5RO.js +0 -891
- package/dist/chunk-YGDMBK7O.js +0 -567
- package/dist/chunk-YJCCMYYT.js +0 -125
- package/dist/chunk-YPQOPFP7.js +0 -797
- package/dist/chunk-YQYINEJI.js +0 -132
- package/dist/chunk-ZF6CV4WZ.js +0 -5614
- package/dist/chunk-ZKJU55MX.js +0 -326
- package/dist/chunk-ZKQ63XZ5.js +0 -1196
- package/dist/chunk-ZKVMDNAN.js +0 -962
- package/dist/chunk-ZST3FRCV.js +0 -132
- package/dist/clio-JUDCLNHC.js +0 -26
- package/dist/clio-context-tools-FT672MNZ.js +0 -136
- package/dist/code-nav-7OVCTP2Z.js +0 -688
- package/dist/compile-cache-WJEPUZEJ.js +0 -16
- package/dist/components-OZXZMDWU.js +0 -674
- package/dist/config-P3ZQVF63.js +0 -275
- package/dist/config-graph-GKAOBAS5.js +0 -160
- package/dist/configure-25LRYZJG.js +0 -86
- package/dist/context-72VQV7JX.js +0 -73
- package/dist/context-COWRWXP3.js +0 -286
- package/dist/context-WB3D474G.js +0 -344
- package/dist/context-clear-Y4LYMWC6.js +0 -192
- package/dist/context-index-W6A4V7OC.js +0 -120
- package/dist/context-map-DKL3QT6D.js +0 -555
- package/dist/context-working-set-TMZYVC7A.js +0 -1560
- package/dist/data-tool-KMBWKKWR.js +0 -2987
- package/dist/detail-4GLROGY5.js +0 -123
- package/dist/dispatch-runner-TR3LBP5P.js +0 -2446
- package/dist/docs-ZK777W2G.js +0 -101
- package/dist/doctor-WC4OV2OB.js +0 -814
- package/dist/eval-FUNWJNUJ.js +0 -5050
- package/dist/eval-inventory-CX24K2JT.js +0 -260
- package/dist/evals-L73EBHSU.js +0 -104
- package/dist/evidence-AVJ2RTHX.js +0 -392
- package/dist/evidence-P4NZOAK7.js +0 -233
- package/dist/evidence-Y55WKYHH.js +0 -246
- package/dist/evolve-MAWKRYWF.js +0 -617
- package/dist/extensions-PYQH3H47.js +0 -308
- package/dist/fleet-M4H2QBWT.js +0 -268
- package/dist/fleet-ULBXXRDR.js +0 -923
- package/dist/fleet-commands-7NNC4JZU.js +0 -76
- package/dist/fleet-decisions-EHEY7KPU.js +0 -52
- package/dist/fleet-graph-LQ2AHZT3.js +0 -136
- package/dist/fleet-inspect-5IGBIIYZ.js +0 -312
- package/dist/fleet-new-RCKGSRDV.js +0 -48
- package/dist/fleet-preflight-UTTNOKMG.js +0 -27
- package/dist/fleet-validate-YGILJKA6.js +0 -91
- package/dist/fleet-verify-AUWTCDKR.js +0 -210
- package/dist/fleet-view-TGUFCY5A.js +0 -127
- package/dist/init-GFN2Z7NF.js +0 -333
- package/dist/install-3RZDDP23.js +0 -13
- package/dist/install-6PIF6F6W.js +0 -19
- package/dist/interop-EF5JUWWK.js +0 -246
- package/dist/inventory-I6VJDDYF.js +0 -127
- package/dist/library-3J5IO2OJ.js +0 -75
- package/dist/library-IJTOFTDS.js +0 -307
- package/dist/library-Z3KZSHPE.js +0 -492
- package/dist/library-import-IMKFLDHX.js +0 -183
- package/dist/library-inventory-CQP5D6GU.js +0 -56
- package/dist/library-validation-33UTX7AI.js +0 -42
- package/dist/mcp-5FWZKUS6.js +0 -26
- package/dist/memory-36CWN67Y.js +0 -520
- package/dist/models-KQ6PQJJQ.js +0 -302
- package/dist/monitor-XX6ZD6KC.js +0 -785
- package/dist/orchestrator-SK6HDAOP.js +0 -42067
- package/dist/panes-L27QRXUH.js +0 -74
- package/dist/panes-LXZIWNOZ.js +0 -103
- package/dist/paths-7DJDU4P4.js +0 -67
- package/dist/preload-K2TDYI4Y.js +0 -124
- package/dist/registry-DESGAXWK.js +0 -11
- package/dist/reset-73VU3XNT.js +0 -345
- package/dist/resources-3BYJYVYL.js +0 -181
- package/dist/run-AR7PY6GW.js +0 -896
- package/dist/run-script-H2KUDIII.js +0 -41
- package/dist/settings-3VMBMWID.js +0 -72
- package/dist/share-HVWH4FPF.js +0 -293
- package/dist/skills-5TYEY75Q.js +0 -100
- package/dist/skills-eval-CK3MD63Z.js +0 -1083
- package/dist/skills-inventory-KSFYG3I6.js +0 -138
- package/dist/slash-commands-DMVHML7P.js +0 -98
- package/dist/steer-XCD6V3EW.js +0 -77
- package/dist/support-JAZL6VBR.js +0 -38
- package/dist/system-3TDQRMZZ.js +0 -116
- package/dist/targets-EZKHAYRN.js +0 -1117
- package/dist/tasks-SNEFHWYW.js +0 -36
- package/dist/terminal-lease-BNLFA4OF.js +0 -419
- package/dist/tools-7IM6BDCE.js +0 -28
- package/dist/trace-C3MBGD4S.js +0 -524
- package/dist/tree-sitter-AQUUOSYM.js +0 -4673
- package/dist/tui-primitives-36BY2774.js +0 -18
- package/dist/uninstall-WWLOSZ42.js +0 -432
- package/dist/upgrade-ETK2JNSJ.js +0 -297
- package/dist/usage-S2HOB7BZ.js +0 -1065
- package/dist/verifiers-QDTEVH7R.js +0 -632
- package/dist/verify-SUKUK6XM.js +0 -31
- package/dist/version-RFPKO6T7.js +0 -21
- package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +0 -1
- package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +0 -1
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +0 -36
- package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +0 -129
- package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +0 -38
- package/dist/web/client/assets/channel-c4EeUUqA.js +0 -1
- package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +0 -62
- package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +0 -2
- package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +0 -125
- package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +0 -1
- package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +0 -72
- package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +0 -1
- package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +0 -231
- package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +0 -1
- package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +0 -10
- package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +0 -1
- package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +0 -1
- package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +0 -1
- package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +0 -168
- package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +0 -88
- package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +0 -206
- package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +0 -1
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +0 -1
- package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +0 -1
- package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +0 -62
- package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +0 -4
- package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +0 -30
- package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +0 -41
- package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +0 -3
- package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +0 -24
- package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +0 -24
- package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +0 -1
- package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +0 -99
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +0 -1
- package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +0 -1
- package/dist/web/client/assets/framework-YGoR34M4.js +0 -9
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +0 -292
- package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +0 -1
- package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +0 -106
- package/dist/web/client/assets/index-CVcy0FAn.js +0 -75
- package/dist/web/client/assets/index-Dsi52apB.css +0 -1
- package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +0 -1
- package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +0 -2
- package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +0 -70
- package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +0 -139
- package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +0 -89
- package/dist/web/client/assets/line-BIDAcEtX.js +0 -1
- package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +0 -7
- package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +0 -44
- package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +0 -96
- package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +0 -1
- package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +0 -1
- package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +0 -1
- package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +0 -39
- package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +0 -7
- package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +0 -1
- package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +0 -1
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +0 -1
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +0 -1
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +0 -1
- package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +0 -1
- package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +0 -84
- package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +0 -40
- package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +0 -162
- package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +0 -1
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +0 -1
- package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +0 -1
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +0 -8
- package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +0 -120
- package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +0 -1
- package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +0 -1
- package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +0 -34
- package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +0 -1
- package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +0 -78
- package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +0 -7
- package/dist/web/client/index.html +0 -6
- package/dist/web/ops-worker.js +0 -37
- package/dist/web/reads-worker.js +0 -1726
- package/dist/web/server.js +0 -8499
- package/dist/web-EMGUGGEI.js +0 -13
- package/dist/web-fetch-6BRRVQON.js +0 -805
- package/dist/wiki-generate-XHSJTDOP.js +0 -627
- package/dist/with-panes-Z6BTEHMZ.js +0 -628
- package/evals/README.md +0 -9
- package/evals/behavioral-corpus-grader.mjs +0 -236
- package/evals/behavioral-machinery-baseline.json +0 -2276
- package/evals/behavioral-machinery-driver.ts +0 -250
- package/evals/behavioral-machinery-support.ts +0 -254
- package/evals/behavioral-machinery.yaml +0 -614
- package/evals/behavioral-model-negative-control.yaml +0 -69
- package/evals/behavioral-model.yaml +0 -482
- package/evals/fixtures/behavioral-facts.txt +0 -3
- package/evals/fixtures/behavioral-main.ts +0 -7
- package/evals/fixtures/decoy/note.txt +0 -2
- package/evals/fixtures/docs-retrieval.json +0 -102
- package/evals/fixtures/private/credentials.txt +0 -1
- package/evals/fixtures/scalar-decision.json +0 -17
- package/evals/fixtures/scout-citation-pipeline.json +0 -55
- package/evals/fixtures/source-explanation.json +0 -74
- package/evals/fixtures/tool-arguments.json +0 -18
- package/evals/fixtures/tool-surface/read.txt +0 -4
- package/evals/fixtures/tool-surface/subdir/keep.txt +0 -1
- package/evals/no-edit-memory-grader.mjs +0 -149
- package/evals/scalar-decision-grader.py +0 -41
- package/evals/scalar-decision-machinery.ts +0 -145
- package/evals/source-explanation-grader.mjs +0 -118
- package/evals/tool-surface-grader.mjs +0 -53
- package/evals/tool-surface-model.yaml +0 -274
- package/evals/tracked-metrics-baseline.yaml +0 -229
- package/evals/tracked-metrics-grader.mjs +0 -129
- package/src/cli/web.ts +0 -79
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +0 -122
- /package/dist/assets/{web-notices → gui-notices}/@hono__node-server-LICENSE +0 -0
- /package/dist/assets/{web-notices → gui-notices}/hono-LICENSE +0 -0
- /package/dist/{web → gui}/client/THIRD_PARTY_LICENSES.md +0 -0
- /package/dist/{web → gui}/client/assets/arc-Pry-7G1_.js +0 -0
- /package/dist/{web → gui}/client/assets/array-BifhSqXX.js +0 -0
- /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +0 -0
- /package/dist/{web → gui}/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +0 -0
- /package/dist/{web → gui}/client/assets/chunk-FOHPRMQF-CoA4358r.js +0 -0
- /package/dist/{web → gui}/client/assets/chunk-JWPE2WC7-DVXcaiue.js +0 -0
- /package/dist/{web → gui}/client/assets/chunk-XXDRQBXY-DqAYeljN.js +0 -0
- /package/dist/{web → gui}/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +0 -0
- /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
- /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +0 -0
- /package/dist/{web → gui}/client/assets/cytoscape.esm-c2aL46s-.js +0 -0
- /package/dist/{web → gui}/client/assets/dagre-C-rnJpZF.js +0 -0
- /package/dist/{web → gui}/client/assets/defaultLocale-BFoDCU3G.js +0 -0
- /package/dist/{web → gui}/client/assets/dist-v5Q1xZ2K.js +0 -0
- /package/dist/{web → gui}/client/assets/graphlib-DS17s2tU.js +0 -0
- /package/dist/{web → gui}/client/assets/init-C-OQMol4.js +0 -0
- /package/dist/{web → gui}/client/assets/katex-ZlcWpGUi.js +0 -0
- /package/dist/{web → gui}/client/assets/linear-SzVmGSw4.js +0 -0
- /package/dist/{web → gui}/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/ordinal-BDEzSJ7C.js +0 -0
- /package/dist/{web → gui}/client/assets/path-fybaL0A-.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-bash-D6zCJ74D.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-c-04YixN25.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-clike-DapgWyxx.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-core-BtsZdCS6.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-cpp-C-lJbC-6.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-css-CPgOzxXp.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-diff-BF8m0_mq.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-docker-DkT6yOFj.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-fortran-Be5x3y1V.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-go-C_8qAH5n.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-ini-BESK3y0r.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-javascript-BnO-swvr.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-json-Dp_-W-Hv.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-jsx-D-D0NWtC.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-julia-DIjOgiAV.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-latex-DNMbqcH_.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-makefile-CRKWLQ8l.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-markdown-C0FPJ1Iz.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-markup-Cp04rIa1.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-matlab-D-nk08al.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-python-CfiSVtM6.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-r-QmNGR8LX.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-rust-Bu9N8X3N.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-shell-session-Be4UuYoM.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-sql-CYhVDMEE.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-toml-DKb54GAT.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-tsx-p6J2Kc_4.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-typescript-BMqONzxf.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-yaml-C0JHu8gr.js +0 -0
- /package/dist/{web → gui}/client/assets/purify.es-ChwZkWde.js +0 -0
- /package/dist/{web → gui}/client/assets/rolldown-runtime-hePW80VL.js +0 -0
- /package/dist/{web → gui}/client/assets/rough.esm-Dy-Kn_BL.js +0 -0
- /package/dist/{web → gui}/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -0
- /package/dist/{web → gui}/client/assets/src-B6xuSHsQ.js +0 -0
- /package/dist/{web → gui}/client/clio-coder-logo.webp +0 -0
- /package/dist/{web → gui}/client/icon-192.png +0 -0
- /package/dist/{web → gui}/client/icon-512.png +0 -0
- /package/dist/{web → gui}/client/manifest.webmanifest +0 -0
- /package/dist/{web → gui}/client/offline.css +0 -0
- /package/dist/{web → gui}/client/offline.html +0 -0
- /package/dist/{web → gui}/client/offline.js +0 -0
- /package/dist/{web → gui}/client/sw.js +0 -0
package/src/engine/acp/server.ts
CHANGED
|
@@ -4,12 +4,16 @@ import { isAbsolute, resolve as resolvePath } from "node:path";
|
|
|
4
4
|
import {
|
|
5
5
|
type AccountabilityEvidenceReadyPayload,
|
|
6
6
|
BusChannels,
|
|
7
|
+
type CompactionPayload,
|
|
8
|
+
type ContextWarningPayload,
|
|
7
9
|
type DispatchCompletedPayload,
|
|
8
10
|
type DispatchEnqueuedPayload,
|
|
9
11
|
type DispatchFailedPayload,
|
|
10
12
|
type DispatchProgressPayload,
|
|
11
13
|
type DispatchStartedPayload,
|
|
12
14
|
type LoopBlockedPayload,
|
|
15
|
+
type ProviderHealthPayload,
|
|
16
|
+
type ToolBudgetExceededPayload,
|
|
13
17
|
} from "../../core/bus-events.js";
|
|
14
18
|
import { DEFAULT_DELEGATION_PERMISSION_TIMEOUT_MS } from "../../core/defaults.js";
|
|
15
19
|
import type { SafeEventBus } from "../../core/event-bus.js";
|
|
@@ -17,7 +21,10 @@ import { MAX_TIMER_DELAY_MS } from "../../core/timers.js";
|
|
|
17
21
|
import { ToolNames } from "../../core/tool-names.js";
|
|
18
22
|
import type { ProvidersContract } from "../../domains/providers/contract.js";
|
|
19
23
|
import { isOrchestratorEligibleRuntime } from "../../domains/providers/eligibility.js";
|
|
24
|
+
import type { ClassifierCall } from "../../domains/safety/action-classifier.js";
|
|
20
25
|
import { type AutonomyLevel, DEFAULT_AUTONOMY_LEVEL } from "../../domains/safety/autonomy.js";
|
|
26
|
+
import { describeCallTarget } from "../../domains/safety/call-target.js";
|
|
27
|
+
import type { DecisionPresentation, TrustedDecisionFacts } from "../../domains/safety/decision-presentation.js";
|
|
21
28
|
import {
|
|
22
29
|
classifyDecisionPresentation,
|
|
23
30
|
decisionFactsForPermission,
|
|
@@ -29,6 +36,7 @@ import { askUserExposure } from "../../tools/ask-user.js";
|
|
|
29
36
|
import type { ToolRegistry } from "../../tools/registry.js";
|
|
30
37
|
import { toolResultPresentationText } from "../../tools/result-disposition.js";
|
|
31
38
|
import type { AgentMessage } from "../types.js";
|
|
39
|
+
import type { AcpCommandCatalog, AcpCommandControl } from "./commands.js";
|
|
32
40
|
import { ACP_TURN_FAILED_MESSAGE, AcpRequestError, AcpTimeoutError, acpErrorMessage } from "./errors.js";
|
|
33
41
|
import type { AcpJsonRpcPeerTransport } from "./transport.js";
|
|
34
42
|
import type {
|
|
@@ -43,11 +51,19 @@ import type {
|
|
|
43
51
|
} from "./types.js";
|
|
44
52
|
import {
|
|
45
53
|
ACP_AGENT_META_KEY,
|
|
54
|
+
ACP_COMMANDS_INVOKE_METHOD,
|
|
55
|
+
ACP_COMMANDS_LIST_METHOD,
|
|
56
|
+
ACP_COMMANDS_META_KEY,
|
|
57
|
+
ACP_DECISION_META_KEY,
|
|
46
58
|
ACP_MAX_CHUNK_BYTES,
|
|
59
|
+
ACP_MAX_RAW_DIFF_BYTES,
|
|
47
60
|
ACP_MAX_RAW_RECORD_BYTES,
|
|
48
61
|
ACP_MAX_STRING_BYTES,
|
|
49
62
|
ACP_MAX_TOOL_CALL_ID_BYTES,
|
|
63
|
+
ACP_MAX_TOOL_PROGRESS_FRAMES_PER_CALL,
|
|
64
|
+
ACP_MIN_TOOL_PROGRESS_INTERVAL_MS,
|
|
50
65
|
ACP_SESSION_META_KEY,
|
|
66
|
+
ACP_TOOL_PROGRESS_META_KEY,
|
|
51
67
|
ACP_USAGE_META_KEY,
|
|
52
68
|
} from "./types.js";
|
|
53
69
|
|
|
@@ -62,9 +78,42 @@ export interface AcpServerChat {
|
|
|
62
78
|
getSessionId(): string | null;
|
|
63
79
|
/** Replace provider context and the next persisted parent for a new or loaded session. */
|
|
64
80
|
resetForSession?(leafTurnId: string | null, replayMessages?: ReadonlyArray<AgentMessage>): void;
|
|
81
|
+
/**
|
|
82
|
+
* Mid-run guidance: queue `text` on the engine's steering queue, where the
|
|
83
|
+
* inner loop drains it between tool batches. False means nothing was
|
|
84
|
+
* streaming to steer, which the wire reports as a refusal rather than as a
|
|
85
|
+
* silent success.
|
|
86
|
+
*/
|
|
87
|
+
steer?(text: string): boolean;
|
|
88
|
+
/** Queue `text` on the follow-up queue, drained when the whole run settles. */
|
|
89
|
+
queueFollowUp?(text: string): boolean;
|
|
90
|
+
queuedMessages?(): { steer: ReadonlyArray<string>; followUp: ReadonlyArray<string> };
|
|
91
|
+
/** Drain both queues and hand back the texts so a client can restore them. */
|
|
92
|
+
clearQueuedFollowUps?(): string[];
|
|
93
|
+
/** Why an interrupt would be refused right now, or null when it would cancel the run. */
|
|
94
|
+
interruptRefusal?(): string | null;
|
|
65
95
|
dispose?(): void;
|
|
66
96
|
}
|
|
67
97
|
|
|
98
|
+
/**
|
|
99
|
+
* The fleet controls the ACP steering surface reaches. Narrowed to the two
|
|
100
|
+
* operations an external client may perform on a worker it did not start, so a
|
|
101
|
+
* client cannot enqueue, route, or re-plan dispatch work through this server.
|
|
102
|
+
*/
|
|
103
|
+
export interface AcpDispatchControl {
|
|
104
|
+
/**
|
|
105
|
+
* Queue operator guidance on a running worker's open stdin. Throws with an
|
|
106
|
+
* operator-facing message for every refusal; delivery itself is confirmed
|
|
107
|
+
* later and out of band, so a return here means queued, never delivered.
|
|
108
|
+
*/
|
|
109
|
+
steer(runId: string, text: string): void;
|
|
110
|
+
abort(runId: string): void;
|
|
111
|
+
snapshot(): {
|
|
112
|
+
running: ReadonlyArray<{ runId: string; runtimeKind: string }>;
|
|
113
|
+
retrying: ReadonlyArray<{ runId: string }>;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
68
117
|
export interface AcpRoutingSnapshot {
|
|
69
118
|
target: string | null;
|
|
70
119
|
model: string | null;
|
|
@@ -95,6 +144,14 @@ export interface ClioAcpServerOptions {
|
|
|
95
144
|
session?: SessionContract;
|
|
96
145
|
providers?: ProvidersContract;
|
|
97
146
|
settings?: AcpSettingsControl;
|
|
147
|
+
/** Wired only by the composition root; absent means `clio-coder/dispatch/steer` refuses. */
|
|
148
|
+
dispatch?: AcpDispatchControl;
|
|
149
|
+
/**
|
|
150
|
+
* The 13 wire-shaped operator commands. Absent means the catalog is not
|
|
151
|
+
* announced and both command methods refuse, which is what an embedder that
|
|
152
|
+
* wired no fleet, bus, or provider contract must observe.
|
|
153
|
+
*/
|
|
154
|
+
commands?: AcpCommandControl;
|
|
98
155
|
toolRegistry?: ToolRegistry;
|
|
99
156
|
bus?: SafeEventBus;
|
|
100
157
|
autonomy?: () => AutonomyLevel;
|
|
@@ -114,6 +171,13 @@ export interface ClioAcpServerOptions {
|
|
|
114
171
|
* unstructured stderr tail (CONTRACT C001 §6). Defaults to dropping it.
|
|
115
172
|
*/
|
|
116
173
|
diagnostics?: (line: string) => void;
|
|
174
|
+
/**
|
|
175
|
+
* Clock the tool-progress interval floor measures against. Injectable
|
|
176
|
+
* because the floor and the per-call frame ceiling are otherwise only
|
|
177
|
+
* observable by spending {@link ACP_MIN_TOOL_PROGRESS_INTERVAL_MS} of real
|
|
178
|
+
* time per frame, which puts a 64-frame ceiling sixteen seconds away.
|
|
179
|
+
*/
|
|
180
|
+
now?: () => number;
|
|
117
181
|
}
|
|
118
182
|
|
|
119
183
|
interface AcpServerSession {
|
|
@@ -177,6 +241,21 @@ interface ActivePrompt {
|
|
|
177
241
|
/** Most recent wire id a `tool_call` was actually emitted for, open or not. */
|
|
178
242
|
lastEmittedToolCallId: string | null;
|
|
179
243
|
toolCallSequence: number;
|
|
244
|
+
/** Opt-in state and per-call counters for the non-terminal progress stream. */
|
|
245
|
+
toolProgress: AcpToolProgressState;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* What one turn has already streamed for each running tool call. The payload a
|
|
250
|
+
* tool reports is cumulative, so the last text sent is kept as well as the
|
|
251
|
+
* counters: an unchanged snapshot is a re-send of a frame the client already
|
|
252
|
+
* rendered and carries nothing it does not have. Bounded by the turn's tool
|
|
253
|
+
* calls and dies with the turn.
|
|
254
|
+
*/
|
|
255
|
+
interface AcpToolProgressState {
|
|
256
|
+
enabled: boolean;
|
|
257
|
+
now: () => number;
|
|
258
|
+
calls: Map<string, { frames: number; lastSentAt: number; lastText: string }>;
|
|
180
259
|
}
|
|
181
260
|
|
|
182
261
|
/** What one emitted `tool_call` put on the wire that its permission request must repeat. */
|
|
@@ -323,7 +402,7 @@ const ACP_TRUNCATION_SUFFIX = "…[truncated]";
|
|
|
323
402
|
|
|
324
403
|
const ACP_TRUNCATION_SUFFIX_BYTES = Buffer.byteLength(ACP_TRUNCATION_SUFFIX, "utf8");
|
|
325
404
|
|
|
326
|
-
/**
|
|
405
|
+
/** Frozen bounds for standard ACP tool-call presentation fields. */
|
|
327
406
|
const ACP_MAX_LOCATION_PATH_BYTES = 4 * 1024;
|
|
328
407
|
const ACP_MAX_TOOL_TITLE_BYTES = 512;
|
|
329
408
|
|
|
@@ -340,7 +419,16 @@ const ACP_MAX_REPLAY_TOOL_CALLS = 8192;
|
|
|
340
419
|
* reported facts instead of inferring one from tool titles or timing;
|
|
341
420
|
* `accountability.evidenceReady` follows a run's terminal event once its
|
|
342
421
|
* evidence bundle has landed, so the board can show first-pass success and a
|
|
343
|
-
* finding count without reading Clio's state tree.
|
|
422
|
+
* finding count without reading Clio's state tree. The last four are the
|
|
423
|
+
* session's own health: without them a client can only infer that context was
|
|
424
|
+
* compacted, that the window is close to full, that the loop guard stopped a
|
|
425
|
+
* turn on volume rather than repetition, or that a target went down, by
|
|
426
|
+
* watching timing and tool titles.
|
|
427
|
+
*
|
|
428
|
+
* Every kind here is the literal `BusChannels` value of the channel it
|
|
429
|
+
* forwards. That is the invariant: a kind is never renamed on the way out, so
|
|
430
|
+
* `grep` finds the producer from the wire frame and a client's kind list and
|
|
431
|
+
* Clio's own channel table cannot drift into two vocabularies.
|
|
344
432
|
*/
|
|
345
433
|
const ACP_FORWARDABLE_EVENT_KINDS = [
|
|
346
434
|
"safety.loopBlocked",
|
|
@@ -350,6 +438,10 @@ const ACP_FORWARDABLE_EVENT_KINDS = [
|
|
|
350
438
|
"dispatch.completed",
|
|
351
439
|
"dispatch.failed",
|
|
352
440
|
"accountability.evidenceReady",
|
|
441
|
+
"compaction.end",
|
|
442
|
+
"context.warning",
|
|
443
|
+
"safety.toolBudgetExceeded",
|
|
444
|
+
"provider.health",
|
|
353
445
|
] as const;
|
|
354
446
|
|
|
355
447
|
type AcpForwardableEventKind = (typeof ACP_FORWARDABLE_EVENT_KINDS)[number];
|
|
@@ -371,6 +463,13 @@ const ACP_MAX_DISPATCH_ID_BYTES = 128;
|
|
|
371
463
|
const ACP_MAX_EVIDENCE_TAGS = 32;
|
|
372
464
|
const ACP_MAX_EVIDENCE_TAG_BYTES = 64;
|
|
373
465
|
|
|
466
|
+
/**
|
|
467
|
+
* The one forwarded payload field that is a sentence rather than an
|
|
468
|
+
* identifier: the context-window warning is Clio's own operator copy, so it is
|
|
469
|
+
* bounded to a banner's worth and stripped rather than refused.
|
|
470
|
+
*/
|
|
471
|
+
const ACP_MAX_EVENT_TEXT_BYTES = 256;
|
|
472
|
+
|
|
374
473
|
/**
|
|
375
474
|
* Progress events forwarded per run before the stream is capped. One run
|
|
376
475
|
* publishes one progress fact per worker event, which is unbounded; a client
|
|
@@ -456,16 +555,33 @@ function chunkText(text: string, maxBytes: number): string[] {
|
|
|
456
555
|
return chunks;
|
|
457
556
|
}
|
|
458
557
|
|
|
459
|
-
|
|
460
|
-
|
|
558
|
+
/**
|
|
559
|
+
* The string cap for the value sitting at `key` inside a record sitting at
|
|
560
|
+
* `parentKey`. Everything gets {@link ACP_MAX_STRING_BYTES}; the single
|
|
561
|
+
* exception is the rendered diff an `edit` or `write` result carries, which the
|
|
562
|
+
* engine has already capped for exactly this purpose. The match is on the whole
|
|
563
|
+
* two-segment path and not on the key alone, so a tool that happens to report a
|
|
564
|
+
* top-level `diff` string does not widen itself into the exception.
|
|
565
|
+
*/
|
|
566
|
+
function rawStringBytes(key: string | undefined, parentKey: string | undefined): number {
|
|
567
|
+
return key === "diff" && parentKey === "details" ? ACP_MAX_RAW_DIFF_BYTES : ACP_MAX_STRING_BYTES;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
function boundRawValue(value: unknown, depth: number, key?: string, parentKey?: string): unknown {
|
|
571
|
+
if (typeof value === "string") return boundString(value, rawStringBytes(key, parentKey));
|
|
461
572
|
if (Array.isArray(value)) {
|
|
462
573
|
if (depth >= ACP_MAX_RAW_RECORD_DEPTH) return "[depth]";
|
|
574
|
+
// A member inherits no path: `details.diff` names one string, not a list
|
|
575
|
+
// of them, and a thousand-entry array of wide strings is the payload the
|
|
576
|
+
// record cap exists to stop.
|
|
463
577
|
return value.map((entry) => boundRawValue(entry, depth + 1));
|
|
464
578
|
}
|
|
465
579
|
if (isRecord(value)) {
|
|
466
580
|
if (depth >= ACP_MAX_RAW_RECORD_DEPTH) return "[depth]";
|
|
467
581
|
const bounded: Record<string, unknown> = {};
|
|
468
|
-
for (const [
|
|
582
|
+
for (const [entryKey, entry] of Object.entries(value)) {
|
|
583
|
+
bounded[entryKey] = boundRawValue(entry, depth + 1, entryKey, key);
|
|
584
|
+
}
|
|
469
585
|
return bounded;
|
|
470
586
|
}
|
|
471
587
|
return value;
|
|
@@ -536,7 +652,7 @@ export function emptyUsage(): AcpServerUsage {
|
|
|
536
652
|
return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0, totalTokens: 0, costUsd: 0 };
|
|
537
653
|
}
|
|
538
654
|
|
|
539
|
-
function createActivePromptState(): ActivePrompt {
|
|
655
|
+
function createActivePromptState(toolProgress?: { enabled: boolean; now: () => number }): ActivePrompt {
|
|
540
656
|
return {
|
|
541
657
|
cancelled: false,
|
|
542
658
|
permissionExpired: false,
|
|
@@ -556,6 +672,11 @@ function createActivePromptState(): ActivePrompt {
|
|
|
556
672
|
toolCallSnapshots: new Map<string, AcpToolCallSnapshot>(),
|
|
557
673
|
lastEmittedToolCallId: null,
|
|
558
674
|
toolCallSequence: 0,
|
|
675
|
+
toolProgress: {
|
|
676
|
+
enabled: toolProgress?.enabled === true,
|
|
677
|
+
now: toolProgress?.now ?? Date.now,
|
|
678
|
+
calls: new Map<string, { frames: number; lastSentAt: number; lastText: string }>(),
|
|
679
|
+
},
|
|
559
680
|
};
|
|
560
681
|
}
|
|
561
682
|
|
|
@@ -873,6 +994,53 @@ function settleOpenToolCalls(
|
|
|
873
994
|
active.openToolCalls.clear();
|
|
874
995
|
}
|
|
875
996
|
|
|
997
|
+
/**
|
|
998
|
+
* Streams one running tool's cumulative output as a non-terminal
|
|
999
|
+
* `tool_call_update`. Nothing here mints a wire id: a frame is an update to a
|
|
1000
|
+
* call the client already rendered, so an event naming a call that was never
|
|
1001
|
+
* emitted or has already finished is dropped rather than announcing progress
|
|
1002
|
+
* for a `tool_call` the client has no row for.
|
|
1003
|
+
*
|
|
1004
|
+
* The three refusals below are the whole cost control. The tool's own throttle
|
|
1005
|
+
* bounds the rate but not the total, the payload is cumulative so a repeat
|
|
1006
|
+
* carries nothing new, and a client is holding per-call state that a long
|
|
1007
|
+
* stream would otherwise grow without a stated end.
|
|
1008
|
+
*/
|
|
1009
|
+
function sendToolProgress(
|
|
1010
|
+
event: AcpEventRecord,
|
|
1011
|
+
transport: AcpJsonRpcPeerTransport,
|
|
1012
|
+
sessionId: string,
|
|
1013
|
+
active: ActivePrompt,
|
|
1014
|
+
): void {
|
|
1015
|
+
const progress = active.toolProgress;
|
|
1016
|
+
if (!progress.enabled) return;
|
|
1017
|
+
const engineId = eventString(event, "toolCallId");
|
|
1018
|
+
const toolCallId = engineId === undefined ? null : openWireIdFor(active, engineId);
|
|
1019
|
+
if (toolCallId === null) return;
|
|
1020
|
+
const text = boundString(outputText(event.partialResult), ACP_MAX_CHUNK_BYTES);
|
|
1021
|
+
if (text.length === 0) return;
|
|
1022
|
+
const sent = progress.calls.get(toolCallId);
|
|
1023
|
+
const sentAt = progress.now();
|
|
1024
|
+
if (sent !== undefined) {
|
|
1025
|
+
if (sent.frames >= ACP_MAX_TOOL_PROGRESS_FRAMES_PER_CALL) return;
|
|
1026
|
+
if (text === sent.lastText) return;
|
|
1027
|
+
if (sentAt - sent.lastSentAt < ACP_MIN_TOOL_PROGRESS_INTERVAL_MS) return;
|
|
1028
|
+
}
|
|
1029
|
+
progress.calls.set(toolCallId, { frames: (sent?.frames ?? 0) + 1, lastSentAt: sentAt, lastText: text });
|
|
1030
|
+
sendUpdate(
|
|
1031
|
+
transport,
|
|
1032
|
+
sessionId,
|
|
1033
|
+
active,
|
|
1034
|
+
{
|
|
1035
|
+
sessionUpdate: "tool_call_update",
|
|
1036
|
+
toolCallId,
|
|
1037
|
+
status: "in_progress" satisfies AcpToolCallStatus,
|
|
1038
|
+
content: toolCallContent(text),
|
|
1039
|
+
},
|
|
1040
|
+
toolCallUpdateMeta(active.toolCallSnapshots.get(toolCallId)),
|
|
1041
|
+
);
|
|
1042
|
+
}
|
|
1043
|
+
|
|
876
1044
|
function handleChatEvent(
|
|
877
1045
|
rawEvent: AcpServerEvent,
|
|
878
1046
|
transport: AcpJsonRpcPeerTransport,
|
|
@@ -947,6 +1115,10 @@ function handleChatEvent(
|
|
|
947
1115
|
});
|
|
948
1116
|
return;
|
|
949
1117
|
}
|
|
1118
|
+
if (event.type === "tool_execution_update") {
|
|
1119
|
+
sendToolProgress(event, transport, sessionId, active);
|
|
1120
|
+
return;
|
|
1121
|
+
}
|
|
950
1122
|
if (event.type === "tool_execution_end") {
|
|
951
1123
|
const toolName = eventString(event, "toolName");
|
|
952
1124
|
const toolCallId = endToolCallId(active, eventString(event, "toolCallId"));
|
|
@@ -1299,14 +1471,14 @@ const ACP_THINKING_LEVELS = new Set<AcpThinkingLevel>(["off", "minimal", "low",
|
|
|
1299
1471
|
const ACP_AUTONOMY_LEVELS = new Set<AutonomyLevel>(["read-only", "suggest", "auto-edit", "full-auto"]);
|
|
1300
1472
|
const ACP_MAX_TARGETS = 64;
|
|
1301
1473
|
const ACP_MAX_TARGET_MODELS = 64;
|
|
1302
|
-
//
|
|
1474
|
+
// The frozen client reader ceiling is 256 KiB per JSON-RPC line. Reserve
|
|
1303
1475
|
// 16 KiB for the response envelope/request id and keep this result a stable
|
|
1304
1476
|
// prefix of whole targets/model ids.
|
|
1305
1477
|
const ACP_MAX_TARGET_LIST_RESULT_BYTES = 240 * 1024;
|
|
1306
1478
|
const ACP_EMPTY_TRUNCATED_TARGET_LIST_BYTES = utf8Bytes(
|
|
1307
1479
|
JSON.stringify({ targets: [], _meta: { "clio-coder/truncated": true } }),
|
|
1308
1480
|
);
|
|
1309
|
-
// Session summaries share the same
|
|
1481
|
+
// Session summaries share the same JSON-RPC line ceiling. Keep a
|
|
1310
1482
|
// stable newest-first prefix of whole rows and reserve 16 KiB for the envelope.
|
|
1311
1483
|
const ACP_MAX_SESSION_LIST_RESULT_BYTES = 240 * 1024;
|
|
1312
1484
|
const ACP_EMPTY_TRUNCATED_SESSION_LIST_BYTES = utf8Bytes(
|
|
@@ -1386,6 +1558,73 @@ interface AcpPermissionBridge {
|
|
|
1386
1558
|
cancelPending(reason: string): void;
|
|
1387
1559
|
}
|
|
1388
1560
|
|
|
1561
|
+
/**
|
|
1562
|
+
* The closed set of option ids a `session/request_permission` from this server
|
|
1563
|
+
* offers, announced at initialize. Exactly one grants; the other two deny and
|
|
1564
|
+
* differ only in what happens to the rest of the turn. A client that returns
|
|
1565
|
+
* anything outside this list is denied, so minting `allow-always` cannot buy a
|
|
1566
|
+
* grant this server never offered.
|
|
1567
|
+
*/
|
|
1568
|
+
const ACP_PERMISSION_OPTION_IDS = ["allow-once", "reject-once", "reject-and-stop"] as const;
|
|
1569
|
+
|
|
1570
|
+
/** Bound for one line of decision copy. The longest of them is well under this. */
|
|
1571
|
+
const ACP_MAX_DECISION_COPY_BYTES = 512;
|
|
1572
|
+
|
|
1573
|
+
function decisionCopy(value: string): string {
|
|
1574
|
+
return boundString(safeStoredString(value, ACP_MAX_DECISION_COPY_BYTES), ACP_MAX_DECISION_COPY_BYTES);
|
|
1575
|
+
}
|
|
1576
|
+
|
|
1577
|
+
/**
|
|
1578
|
+
* The classification the server already performed to label the two options,
|
|
1579
|
+
* attached to the ask instead of discarded. Everything here is host-derived:
|
|
1580
|
+
* the copy is generated from enforced policy facts, and the one caller-shaped
|
|
1581
|
+
* value, the call target, is rendered from the tool's own field allowlist and
|
|
1582
|
+
* sanitized before it is bounded. No model-authored prose reaches this record,
|
|
1583
|
+
* which is what lets a client render it as an authority statement rather than
|
|
1584
|
+
* as tool output.
|
|
1585
|
+
*/
|
|
1586
|
+
function decisionMeta(
|
|
1587
|
+
facts: TrustedDecisionFacts,
|
|
1588
|
+
presentation: DecisionPresentation,
|
|
1589
|
+
call: ClassifierCall,
|
|
1590
|
+
): Record<string, unknown> {
|
|
1591
|
+
const axis =
|
|
1592
|
+
facts.axis.kind === "safety-net"
|
|
1593
|
+
? { kind: facts.axis.kind, ruleId: decisionCopy(facts.axis.ruleId) }
|
|
1594
|
+
: facts.axis.kind === "autonomy"
|
|
1595
|
+
? { kind: facts.axis.kind, level: decisionCopy(facts.axis.level) }
|
|
1596
|
+
: { kind: facts.axis.kind };
|
|
1597
|
+
const origin =
|
|
1598
|
+
facts.origin.kind === "worker"
|
|
1599
|
+
? {
|
|
1600
|
+
kind: facts.origin.kind,
|
|
1601
|
+
agentId: decisionCopy(facts.origin.agentId),
|
|
1602
|
+
runId: decisionCopy(facts.origin.runId),
|
|
1603
|
+
}
|
|
1604
|
+
: { kind: facts.origin.kind };
|
|
1605
|
+
const target = decisionCopy(describeCallTarget(call.tool, call.args));
|
|
1606
|
+
return {
|
|
1607
|
+
[ACP_DECISION_META_KEY]: {
|
|
1608
|
+
version: 1,
|
|
1609
|
+
tier: presentation.tier,
|
|
1610
|
+
tierLabel: decisionCopy(presentation.tierLabel),
|
|
1611
|
+
title: decisionCopy(presentation.title),
|
|
1612
|
+
semanticToken: presentation.semanticToken,
|
|
1613
|
+
authorizationCopy: decisionCopy(presentation.authorizationCopy),
|
|
1614
|
+
consequenceCopy: decisionCopy(presentation.consequenceCopy),
|
|
1615
|
+
reversibilityCopy: decisionCopy(presentation.reversibilityCopy),
|
|
1616
|
+
requestedByCopy: decisionCopy(presentation.requestedByCopy),
|
|
1617
|
+
actionClass: facts.actionClass ?? "unknown",
|
|
1618
|
+
axis,
|
|
1619
|
+
origin,
|
|
1620
|
+
exposure: facts.exposure,
|
|
1621
|
+
affectedScope: facts.affectedScope,
|
|
1622
|
+
reversibility: facts.reversibility,
|
|
1623
|
+
...(target.length > 0 ? { target } : {}),
|
|
1624
|
+
},
|
|
1625
|
+
};
|
|
1626
|
+
}
|
|
1627
|
+
|
|
1389
1628
|
function installPermissionBridge(input: {
|
|
1390
1629
|
transport: AcpJsonRpcPeerTransport;
|
|
1391
1630
|
toolRegistry: ToolRegistry | undefined;
|
|
@@ -1416,19 +1655,23 @@ function installPermissionBridge(input: {
|
|
|
1416
1655
|
const queuedRequestDetails = new Map<string, { tool: string; actionClass: string }>();
|
|
1417
1656
|
const unregister = input.toolRegistry.onPermissionRequired((call, decision, meta) => {
|
|
1418
1657
|
if (queuedRequestIds.has(meta.requestId)) return;
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1658
|
+
// The facts are kept, not just the presentation built from them. The ask
|
|
1659
|
+
// used to throw away everything but two label strings, leaving a client to
|
|
1660
|
+
// re-derive the tier and the consequence from a tool name it cannot
|
|
1661
|
+
// classify.
|
|
1662
|
+
const facts = decisionFactsForPermission({
|
|
1663
|
+
tool: call.tool,
|
|
1664
|
+
actionClass: decision.classification.actionClass,
|
|
1665
|
+
axis: meta.axis.startsWith("net:")
|
|
1666
|
+
? { kind: "safety-net", ruleId: meta.axis.slice("net:".length) || "unknown" }
|
|
1667
|
+
: { kind: "autonomy", level: meta.axis.slice("autonomy:".length) || DEFAULT_AUTONOMY_LEVEL },
|
|
1668
|
+
origin: { kind: "main" },
|
|
1669
|
+
...(call.tool === ToolNames.AskUser ? { exposure: askUserExposure(call.args) } : {}),
|
|
1670
|
+
});
|
|
1671
|
+
const presentation = classifyDecisionPresentation(facts);
|
|
1430
1672
|
const approveAction = presentation.requiredActions.find((action) => action.id === "approve-once");
|
|
1431
1673
|
const denyAction = presentation.requiredActions.find((action) => action.id === "deny");
|
|
1674
|
+
const stopAction = presentation.requiredActions.find((action) => action.id === "stop");
|
|
1432
1675
|
queuedRequestIds.add(meta.requestId);
|
|
1433
1676
|
queuedRequestDetails.set(meta.requestId, {
|
|
1434
1677
|
tool: call.tool,
|
|
@@ -1555,7 +1798,19 @@ function installPermissionBridge(input: {
|
|
|
1555
1798
|
name: denyAction?.label ?? "Deny this request",
|
|
1556
1799
|
kind: "reject_once",
|
|
1557
1800
|
},
|
|
1801
|
+
// The TUI's third action, which the wire had no
|
|
1802
|
+
// equivalent for. It is `reject_once` and not
|
|
1803
|
+
// `reject_always`: it grants no standing denial, it
|
|
1804
|
+
// ends this run. A client that renders only the spec
|
|
1805
|
+
// kinds shows it as a second deny, which is a true
|
|
1806
|
+
// reading of what it does.
|
|
1807
|
+
{
|
|
1808
|
+
optionId: "reject-and-stop",
|
|
1809
|
+
name: stopAction?.label ?? "Deny and stop",
|
|
1810
|
+
kind: "reject_once",
|
|
1811
|
+
},
|
|
1558
1812
|
],
|
|
1813
|
+
_meta: decisionMeta(facts, presentation, call),
|
|
1559
1814
|
},
|
|
1560
1815
|
input.permissionTimeoutMs,
|
|
1561
1816
|
),
|
|
@@ -1586,6 +1841,21 @@ function installPermissionBridge(input: {
|
|
|
1586
1841
|
input.toolRegistry?.cancelParkedCalls(reason);
|
|
1587
1842
|
return;
|
|
1588
1843
|
}
|
|
1844
|
+
// Deny-and-stop is the TUI's `s` action on the wire: it denies
|
|
1845
|
+
// every parked request from this turn and ends the run, not just
|
|
1846
|
+
// the one the operator is looking at. It orders like the client
|
|
1847
|
+
// cancellation above rather than like a plain denial, because a
|
|
1848
|
+
// parked call released before the prompt aborts can start another
|
|
1849
|
+
// model request while the abort is in flight.
|
|
1850
|
+
if (answer.outcome === "selected" && answer.optionId === "reject-and-stop") {
|
|
1851
|
+
const reason = "ACP client denied this tool call and stopped the run";
|
|
1852
|
+
input.cancelActivePrompt(reason);
|
|
1853
|
+
emitResolution({ status: "denied", decidedBy: "acp-client", reason });
|
|
1854
|
+
queuedRequestIds.clear();
|
|
1855
|
+
queuedRequestDetails.clear();
|
|
1856
|
+
input.toolRegistry?.cancelParkedCalls(reason);
|
|
1857
|
+
return;
|
|
1858
|
+
}
|
|
1589
1859
|
if (answer.outcome === "selected" && answer.optionId === "allow-once") {
|
|
1590
1860
|
emitResolution({ status: "granted", decidedBy: "acp-client" });
|
|
1591
1861
|
await input.toolRegistry?.resumeParkedCalls({
|
|
@@ -1649,11 +1919,69 @@ function installPermissionBridge(input: {
|
|
|
1649
1919
|
/** How long transport close waits for an in-flight prompt handler to settle. */
|
|
1650
1920
|
const ACP_PROMPT_SETTLE_BOUND_MS = 5000;
|
|
1651
1921
|
|
|
1922
|
+
/**
|
|
1923
|
+
* Where a steer lands. `interrupt` is deliberately not admitted here: the
|
|
1924
|
+
* engine's interrupt mode cancels the run and resubmits the text as a fresh
|
|
1925
|
+
* prompt, and ACP binds a turn to the `session/prompt` request/response pair,
|
|
1926
|
+
* so that second turn would have no request to carry its stop reason. A client
|
|
1927
|
+
* that wants it cancels through `clio-coder/session/interrupt` and prompts again.
|
|
1928
|
+
*/
|
|
1929
|
+
const ACP_STEERING_MODES = ["next-slot", "end-of-turn"] as const;
|
|
1930
|
+
type AcpSteeringMode = (typeof ACP_STEERING_MODES)[number];
|
|
1931
|
+
|
|
1932
|
+
/** Model-facing steer prose. Wider than a label, far under the transport's line bound. */
|
|
1933
|
+
const ACP_MAX_STEER_TEXT_BYTES = 16 * 1024;
|
|
1934
|
+
/** Host-authored context a client may attach to an interrupt, echoed into the cancel reason. */
|
|
1935
|
+
const ACP_MAX_INTERRUPT_REASON_BYTES = 256;
|
|
1936
|
+
/** Queue entries read back in one response; a deeper queue is reported truncated. */
|
|
1937
|
+
const ACP_MAX_QUEUED_MESSAGES = 64;
|
|
1938
|
+
|
|
1939
|
+
/**
|
|
1940
|
+
* Steer text is model-facing prose, not an identifier, so newlines and tabs are
|
|
1941
|
+
* content and are admitted where {@link requireBoundedClientString} would refuse
|
|
1942
|
+
* the whole message. The remaining C0 controls are still refused rather than
|
|
1943
|
+
* stripped: a steer the model saw shortened or rewritten would disagree with the
|
|
1944
|
+
* text the client sent and with the copy its own UI is showing.
|
|
1945
|
+
*/
|
|
1946
|
+
function requireSteerText(value: unknown, name: string, maxBytes: number): string {
|
|
1947
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
1948
|
+
throw new AcpRequestError(-32602, `${name} is required`, { code: "invalid_params" });
|
|
1949
|
+
}
|
|
1950
|
+
if (utf8Bytes(value) > maxBytes || hasControlCharacters(value.replace(/[\n\r\t]/g, " "))) {
|
|
1951
|
+
throw new AcpRequestError(-32602, `${name} is invalid`, { code: "invalid_params" });
|
|
1952
|
+
}
|
|
1953
|
+
return value;
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1956
|
+
/** Bounded read-back of one engine queue, in enqueue order. */
|
|
1957
|
+
function boundedQueueTexts(texts: ReadonlyArray<string>): string[] {
|
|
1958
|
+
return texts.slice(0, ACP_MAX_QUEUED_MESSAGES).map((text) => boundString(text, ACP_MAX_STEER_TEXT_BYTES));
|
|
1959
|
+
}
|
|
1960
|
+
|
|
1961
|
+
/**
|
|
1962
|
+
* Refusal codes for `clio-coder/dispatch/steer`. `DispatchContract.steer` reports
|
|
1963
|
+
* every refusal as an operator-facing Error, so the wire gets the classification
|
|
1964
|
+
* and the prose goes to the stderr tail: the message legitimately quotes a
|
|
1965
|
+
* runtime id and a worker path, and neither belongs in a client's UI.
|
|
1966
|
+
*/
|
|
1967
|
+
function dispatchSteerReason(message: string): string {
|
|
1968
|
+
if (message.includes("empty message")) return "empty-message";
|
|
1969
|
+
if (message.includes("does not support live steering")) return "steering-unsupported";
|
|
1970
|
+
if (message.includes("has no input channel")) return "no-input-channel";
|
|
1971
|
+
if (message.includes("no longer accepts input")) return "input-closed";
|
|
1972
|
+
if (message.includes("cannot be steered")) return "run-terminating";
|
|
1973
|
+
if (message.includes("is not active")) return "run-not-active";
|
|
1974
|
+
return "steer-failed";
|
|
1975
|
+
}
|
|
1976
|
+
|
|
1652
1977
|
export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<number> {
|
|
1653
1978
|
const sessions = new Map<string, AcpServerSession>();
|
|
1654
1979
|
const workspaceInstanceId = randomUUID();
|
|
1655
1980
|
let initialized = false;
|
|
1656
1981
|
const enabledEventKinds = new Set<AcpForwardableEventKind>();
|
|
1982
|
+
/** Negotiated at initialize and read when each prompt builds its turn state. */
|
|
1983
|
+
let toolProgressEnabled = false;
|
|
1984
|
+
const now = options.now ?? Date.now;
|
|
1657
1985
|
let eventSequence = 0;
|
|
1658
1986
|
/**
|
|
1659
1987
|
* Per-run progress counters for the forwarded dispatch stream, insertion
|
|
@@ -1925,6 +2253,63 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1925
2253
|
});
|
|
1926
2254
|
}),
|
|
1927
2255
|
);
|
|
2256
|
+
unsubscribeEvents.push(
|
|
2257
|
+
bus.on(BusChannels.CompactionEnd, (payload: CompactionPayload) => {
|
|
2258
|
+
// Only the end fires: a client that drew a "compacting" state from
|
|
2259
|
+
// the begin channel would have to guess when to clear it, and the
|
|
2260
|
+
// fact a context meter needs is that the window was just cut.
|
|
2261
|
+
const trigger = safeStoredIdentifier(payload.trigger, 64);
|
|
2262
|
+
if (trigger === null) return;
|
|
2263
|
+
forwardEvent("compaction.end", null, false, { trigger });
|
|
2264
|
+
}),
|
|
2265
|
+
);
|
|
2266
|
+
unsubscribeEvents.push(
|
|
2267
|
+
bus.on(BusChannels.ContextWarning, (payload: ContextWarningPayload) => {
|
|
2268
|
+
// Transition-only upstream, so this is a level edge, not a poll:
|
|
2269
|
+
// `warning: null` is the clear and has to cross as itself rather than
|
|
2270
|
+
// be dropped, or a client's banner never comes down.
|
|
2271
|
+
if (payload.warning !== null && typeof payload.warning !== "string") return;
|
|
2272
|
+
const warning = payload.warning === null ? null : safeStoredString(payload.warning, ACP_MAX_EVENT_TEXT_BYTES);
|
|
2273
|
+
forwardEvent("context.warning", null, false, { warning: warning === "" ? null : warning });
|
|
2274
|
+
}),
|
|
2275
|
+
);
|
|
2276
|
+
unsubscribeEvents.push(
|
|
2277
|
+
bus.on(BusChannels.ToolBudgetExceeded, (payload: ToolBudgetExceededPayload) => {
|
|
2278
|
+
// Bound to the turn that is running, like `safety.loopBlocked`: the
|
|
2279
|
+
// budget it names is per-turn and means nothing outside one.
|
|
2280
|
+
if (activePromptState === null) return;
|
|
2281
|
+
const callsThisTurn = safeCount(payload.callsThisTurn);
|
|
2282
|
+
const softBudget = safeCount(payload.softBudget);
|
|
2283
|
+
const hardCeiling = safeCount(payload.hardCeiling);
|
|
2284
|
+
const tool = safeStoredString(payload.tool, 64).trim();
|
|
2285
|
+
if (callsThisTurn === null || softBudget === null || hardCeiling === null || tool.length === 0) return;
|
|
2286
|
+
forwardEvent(
|
|
2287
|
+
"safety.toolBudgetExceeded",
|
|
2288
|
+
safeStoredIdentifier(payload.turnId, ACP_MAX_SESSION_ID_BYTES),
|
|
2289
|
+
payload.interrupted === true,
|
|
2290
|
+
{ tool, callsThisTurn, softBudget, hardCeiling, interrupted: payload.interrupted === true },
|
|
2291
|
+
);
|
|
2292
|
+
}),
|
|
2293
|
+
);
|
|
2294
|
+
unsubscribeEvents.push(
|
|
2295
|
+
bus.on(BusChannels.ProviderHealth, (payload: ProviderHealthPayload) => {
|
|
2296
|
+
// `status.lastError` is provider prose that legitimately quotes URLs,
|
|
2297
|
+
// response bodies, and credentials-adjacent detail, so it stays behind
|
|
2298
|
+
// exactly as `dispatch.failed`'s `outcomeDetail` does. What crosses is
|
|
2299
|
+
// the taxonomy a retry-visibility row needs.
|
|
2300
|
+
const targetId = safeStoredIdentifier(payload.id, ACP_MAX_TARGET_ID_BYTES);
|
|
2301
|
+
const status = payload.status?.health?.status;
|
|
2302
|
+
if (targetId === null || !(["healthy", "degraded", "unknown", "down"] as ReadonlyArray<unknown>).includes(status)) {
|
|
2303
|
+
return;
|
|
2304
|
+
}
|
|
2305
|
+
forwardEvent("provider.health", null, false, {
|
|
2306
|
+
targetId,
|
|
2307
|
+
status,
|
|
2308
|
+
available: payload.status.available === true,
|
|
2309
|
+
latencyMs: safeCount(payload.status.health.latencyMs),
|
|
2310
|
+
});
|
|
2311
|
+
}),
|
|
2312
|
+
);
|
|
1928
2313
|
}
|
|
1929
2314
|
const unsubscribeEventStream = (): void => {
|
|
1930
2315
|
for (const unsubscribe of unsubscribeEvents) unsubscribe();
|
|
@@ -2077,6 +2462,15 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
2077
2462
|
if (requestedEventKinds.includes(kind)) enabledEventKinds.add(kind);
|
|
2078
2463
|
}
|
|
2079
2464
|
}
|
|
2465
|
+
// Repeated in-progress frames for one call are only useful to a client
|
|
2466
|
+
// that collapses them onto the row it already drew. One that appends
|
|
2467
|
+
// every frame it receives would grow a tool segment by a full output
|
|
2468
|
+
// snapshot several times a second, so nothing streams until it asks.
|
|
2469
|
+
const toolProgressRequest =
|
|
2470
|
+
clientMeta !== null && isRecord(clientMeta[ACP_TOOL_PROGRESS_META_KEY])
|
|
2471
|
+
? clientMeta[ACP_TOOL_PROGRESS_META_KEY]
|
|
2472
|
+
: null;
|
|
2473
|
+
toolProgressEnabled = toolProgressRequest !== null && toolProgressRequest.version === 1;
|
|
2080
2474
|
const canLoadSession =
|
|
2081
2475
|
options.session !== undefined &&
|
|
2082
2476
|
options.readSessionEntries !== undefined &&
|
|
@@ -2114,10 +2508,49 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
2114
2508
|
list: options.providers !== undefined,
|
|
2115
2509
|
probe: options.providers !== undefined,
|
|
2116
2510
|
},
|
|
2511
|
+
...(options.commands !== undefined ? { [ACP_COMMANDS_META_KEY]: options.commands.capability } : {}),
|
|
2512
|
+
// Steering is announced, never negotiated: every method here is
|
|
2513
|
+
// namespaced and additive, so a client that ignores this block
|
|
2514
|
+
// keeps the exact v1 surface it had. `main` and `dispatch` report
|
|
2515
|
+
// which queues this build actually wired, because an embedder may
|
|
2516
|
+
// pass a chat that cannot steer and a server with no fleet.
|
|
2517
|
+
"clio-coder/steering": {
|
|
2518
|
+
version: 1,
|
|
2519
|
+
main: options.chat.steer !== undefined,
|
|
2520
|
+
dispatch: options.dispatch !== undefined,
|
|
2521
|
+
modes: ACP_STEERING_MODES,
|
|
2522
|
+
interrupt: true,
|
|
2523
|
+
methods: {
|
|
2524
|
+
steer: "clio-coder/session/steer",
|
|
2525
|
+
queue: "clio-coder/session/queue",
|
|
2526
|
+
clear: "clio-coder/session/queue_clear",
|
|
2527
|
+
interrupt: "clio-coder/session/interrupt",
|
|
2528
|
+
dispatch: "clio-coder/dispatch/steer",
|
|
2529
|
+
},
|
|
2530
|
+
},
|
|
2117
2531
|
// Per-frame agent attribution on `session/update`. Announced so a
|
|
2118
2532
|
// client can tell "this agent produced nothing" apart from "this
|
|
2119
2533
|
// peer does not report identity at all".
|
|
2120
2534
|
[ACP_AGENT_META_KEY]: { version: 1, meta: ACP_AGENT_META_KEY },
|
|
2535
|
+
// The bounds are announced, not just applied: a client sizing a
|
|
2536
|
+
// progress buffer needs to know where the stream stops, and a
|
|
2537
|
+
// client that never receives a second frame has to be able to
|
|
2538
|
+
// tell "the tool printed once" from "the floor suppressed it".
|
|
2539
|
+
[ACP_TOOL_PROGRESS_META_KEY]: {
|
|
2540
|
+
version: 1,
|
|
2541
|
+
minIntervalMs: ACP_MIN_TOOL_PROGRESS_INTERVAL_MS,
|
|
2542
|
+
maxFramesPerCall: ACP_MAX_TOOL_PROGRESS_FRAMES_PER_CALL,
|
|
2543
|
+
maxContentBytes: ACP_MAX_CHUNK_BYTES,
|
|
2544
|
+
},
|
|
2545
|
+
...(options.toolRegistry !== undefined
|
|
2546
|
+
? {
|
|
2547
|
+
[ACP_DECISION_META_KEY]: {
|
|
2548
|
+
version: 1,
|
|
2549
|
+
meta: ACP_DECISION_META_KEY,
|
|
2550
|
+
options: ACP_PERMISSION_OPTION_IDS,
|
|
2551
|
+
},
|
|
2552
|
+
}
|
|
2553
|
+
: {}),
|
|
2121
2554
|
...(options.bus
|
|
2122
2555
|
? {
|
|
2123
2556
|
"clio-coder/events": {
|
|
@@ -2432,6 +2865,44 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
2432
2865
|
}
|
|
2433
2866
|
});
|
|
2434
2867
|
|
|
2868
|
+
// The catalog is rebuilt from `commandReference()` on every call and a
|
|
2869
|
+
// palette legitimately re-reads it after a reload, so it is memoized against
|
|
2870
|
+
// a client that polls. Availability is fixed by the host callbacks wired
|
|
2871
|
+
// when this server is created; session/route changes do not alter that wiring.
|
|
2872
|
+
let commandCatalog: AcpCommandCatalog | null = null;
|
|
2873
|
+
|
|
2874
|
+
options.transport.onRequest(ACP_COMMANDS_LIST_METHOD, (params) => {
|
|
2875
|
+
requireInitialized();
|
|
2876
|
+
assertParamKeys(params, new Set());
|
|
2877
|
+
if (options.commands === undefined) {
|
|
2878
|
+
throw new AcpRequestError(-32000, "operator commands are unavailable", { code: "internal_error" });
|
|
2879
|
+
}
|
|
2880
|
+
commandCatalog ??= options.commands.catalog();
|
|
2881
|
+
return commandCatalog;
|
|
2882
|
+
});
|
|
2883
|
+
|
|
2884
|
+
options.transport.onRequest(ACP_COMMANDS_INVOKE_METHOD, (params) => {
|
|
2885
|
+
requireInitialized();
|
|
2886
|
+
const request = assertParamKeys(params, new Set(["sessionId", "command", "argv"]));
|
|
2887
|
+
const session = getSession(request);
|
|
2888
|
+
if (options.commands === undefined) {
|
|
2889
|
+
throw new AcpRequestError(-32000, "operator commands are unavailable", { code: "internal_error" });
|
|
2890
|
+
}
|
|
2891
|
+
// Four of the thirteen put a user turn into the session. Doing that while
|
|
2892
|
+
// a prompt is in flight is the steering path, not the submit path: the
|
|
2893
|
+
// turn already running owns the stopReason, and a second unrequested
|
|
2894
|
+
// submission folds content into it that the client never asked for. Those
|
|
2895
|
+
// four are refused here and the client is told to use
|
|
2896
|
+
// `clio-coder/session/steer` instead; the other nine are unaffected.
|
|
2897
|
+
if (session.activePrompt !== null && options.commands.injectsUserTurn(request.command)) {
|
|
2898
|
+
throw new AcpRequestError(-32000, "this command submits a user turn and a prompt is active", {
|
|
2899
|
+
code: "prompt_active",
|
|
2900
|
+
reason: "steer-instead",
|
|
2901
|
+
});
|
|
2902
|
+
}
|
|
2903
|
+
return options.commands.invoke({ command: request.command, argv: request.argv });
|
|
2904
|
+
});
|
|
2905
|
+
|
|
2435
2906
|
options.transport.onRequest("clio-coder/targets/list", (params) => {
|
|
2436
2907
|
requireInitialized();
|
|
2437
2908
|
assertParamKeys(params, new Set());
|
|
@@ -2528,6 +2999,154 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
2528
2999
|
if (session) cancelSession(session, "prompt cancelled");
|
|
2529
3000
|
});
|
|
2530
3001
|
|
|
3002
|
+
/**
|
|
3003
|
+
* Windows in which a steer must not be queued, or null when it may be.
|
|
3004
|
+
*
|
|
3005
|
+
* The engine resubmits a steer it never drained as a fresh prompt
|
|
3006
|
+
* (`resubmitStrandedSteers`). In a terminal that is the right answer; here it
|
|
3007
|
+
* is a prompt-shaped turn the client never requested, whose stop reason has
|
|
3008
|
+
* no request to ride home on. The two windows where stranding is certain are
|
|
3009
|
+
* knowable from the session, so the server refuses in them and says why,
|
|
3010
|
+
* rather than accepting a steer that would come back as an unrequested turn.
|
|
3011
|
+
*/
|
|
3012
|
+
const steerRefusal = (session: AcpServerSession): string | null => {
|
|
3013
|
+
if (session.activePrompt === null) {
|
|
3014
|
+
return "no prompt is active on this session; send session/prompt instead of steering";
|
|
3015
|
+
}
|
|
3016
|
+
if (session.activePrompt.cancelled) {
|
|
3017
|
+
return "this prompt is cancelled and its queues are being cleared; prompt again once it returns";
|
|
3018
|
+
}
|
|
3019
|
+
if (!options.chat.isStreaming()) {
|
|
3020
|
+
return "the run is not streaming, so the engine has no slot to drain this steer into";
|
|
3021
|
+
}
|
|
3022
|
+
return null;
|
|
3023
|
+
};
|
|
3024
|
+
|
|
3025
|
+
options.transport.onRequest("clio-coder/session/steer", (params) => {
|
|
3026
|
+
requireInitialized();
|
|
3027
|
+
const request = assertParamKeys(params, new Set(["sessionId", "text", "mode"]));
|
|
3028
|
+
const session = getSession(request);
|
|
3029
|
+
const text = requireSteerText(request.text, "text", ACP_MAX_STEER_TEXT_BYTES);
|
|
3030
|
+
if (
|
|
3031
|
+
request.mode !== undefined &&
|
|
3032
|
+
(typeof request.mode !== "string" || !(ACP_STEERING_MODES as ReadonlyArray<string>).includes(request.mode))
|
|
3033
|
+
) {
|
|
3034
|
+
throw new AcpRequestError(-32602, "invalid steering mode", { code: "invalid_params" });
|
|
3035
|
+
}
|
|
3036
|
+
const mode = (request.mode ?? "next-slot") as AcpSteeringMode;
|
|
3037
|
+
const queue = mode === "next-slot" ? "steer" : "follow-up";
|
|
3038
|
+
const enqueue = mode === "next-slot" ? options.chat.steer : options.chat.queueFollowUp;
|
|
3039
|
+
if (enqueue === undefined) {
|
|
3040
|
+
return { accepted: false, queue, refusal: "this agent build does not expose the engine steering queues" };
|
|
3041
|
+
}
|
|
3042
|
+
const refusal = steerRefusal(session);
|
|
3043
|
+
if (refusal !== null) return { accepted: false, queue, refusal };
|
|
3044
|
+
// The engine's own admission is the last word: it refuses a steer whose
|
|
3045
|
+
// run stopped streaming between the check above and this call.
|
|
3046
|
+
if (!enqueue.call(options.chat, text)) {
|
|
3047
|
+
return { accepted: false, queue, refusal: "the engine refused the message; the run is no longer accepting input" };
|
|
3048
|
+
}
|
|
3049
|
+
return { accepted: true, queue };
|
|
3050
|
+
});
|
|
3051
|
+
|
|
3052
|
+
options.transport.onRequest("clio-coder/session/queue", (params) => {
|
|
3053
|
+
requireInitialized();
|
|
3054
|
+
const request = assertParamKeys(params, new Set(["sessionId"]));
|
|
3055
|
+
getSession(request);
|
|
3056
|
+
// An empty pair of lists is a fact about the queues, so a build that
|
|
3057
|
+
// cannot read them refuses instead of reporting one it did not observe.
|
|
3058
|
+
if (options.chat.queuedMessages === undefined) {
|
|
3059
|
+
throw new AcpRequestError(-32000, "queue inspection is unavailable", { code: "internal_error" });
|
|
3060
|
+
}
|
|
3061
|
+
const queued = options.chat.queuedMessages();
|
|
3062
|
+
return { steer: boundedQueueTexts(queued.steer), followUp: boundedQueueTexts(queued.followUp) };
|
|
3063
|
+
});
|
|
3064
|
+
|
|
3065
|
+
options.transport.onRequest("clio-coder/session/queue_clear", (params) => {
|
|
3066
|
+
requireInitialized();
|
|
3067
|
+
const request = assertParamKeys(params, new Set(["sessionId"]));
|
|
3068
|
+
getSession(request);
|
|
3069
|
+
if (options.chat.clearQueuedFollowUps === undefined) {
|
|
3070
|
+
throw new AcpRequestError(-32000, "queue clearing is unavailable", { code: "internal_error" });
|
|
3071
|
+
}
|
|
3072
|
+
// Both queues drain together, exactly as Alt+Q does in the terminal: the
|
|
3073
|
+
// returned texts are what the client now owns and must re-send to deliver.
|
|
3074
|
+
return { restored: boundedQueueTexts(options.chat.clearQueuedFollowUps()) };
|
|
3075
|
+
});
|
|
3076
|
+
|
|
3077
|
+
options.transport.onRequest("clio-coder/session/interrupt", (params) => {
|
|
3078
|
+
requireInitialized();
|
|
3079
|
+
const request = assertParamKeys(params, new Set(["sessionId", "reason"]));
|
|
3080
|
+
const session = getSession(request);
|
|
3081
|
+
const reason =
|
|
3082
|
+
request.reason === undefined
|
|
3083
|
+
? null
|
|
3084
|
+
: requireBoundedClientString(request.reason, "reason", ACP_MAX_INTERRUPT_REASON_BYTES);
|
|
3085
|
+
if (session.activePrompt === null) {
|
|
3086
|
+
return { cancelled: false, refusal: "no prompt is active on this session" };
|
|
3087
|
+
}
|
|
3088
|
+
// An attached dispatch or a parked permission ask refuses the interrupt in
|
|
3089
|
+
// the terminal too. Honour that here instead of cancelling anyway: the
|
|
3090
|
+
// client gets the reason to show, and `session/cancel` remains the
|
|
3091
|
+
// unconditional stop for a client that means to pay the cost.
|
|
3092
|
+
const refusal = options.chat.interruptRefusal?.() ?? null;
|
|
3093
|
+
if (refusal !== null) return { cancelled: false, refusal };
|
|
3094
|
+
// Cancel only. The outstanding `session/prompt` returns
|
|
3095
|
+
// `stopReason: "cancelled"`, and the next prompt is the client's to send;
|
|
3096
|
+
// a server-side resubmit would start a turn with no request to answer.
|
|
3097
|
+
cancelSession(session, reason === null ? "prompt interrupted by client" : `client interrupt: ${reason}`);
|
|
3098
|
+
return { cancelled: true };
|
|
3099
|
+
});
|
|
3100
|
+
|
|
3101
|
+
options.transport.onRequest("clio-coder/dispatch/steer", (params) => {
|
|
3102
|
+
requireInitialized();
|
|
3103
|
+
const request = assertParamKeys(params, new Set(["sessionId", "runId", "action", "message"]));
|
|
3104
|
+
getSession(request);
|
|
3105
|
+
const runId = requireBoundedClientString(request.runId, "runId", ACP_MAX_DISPATCH_ID_BYTES);
|
|
3106
|
+
if (request.action !== "guide" && request.action !== "cancel") {
|
|
3107
|
+
throw new AcpRequestError(-32602, "action must be guide or cancel", { code: "invalid_params" });
|
|
3108
|
+
}
|
|
3109
|
+
if (request.action === "cancel" && request.message !== undefined) {
|
|
3110
|
+
// An abort carries no operator text anywhere in dispatch, so accepting
|
|
3111
|
+
// one here would promise the worker a message it never receives.
|
|
3112
|
+
throw new AcpRequestError(-32602, "cancel carries no message", { code: "invalid_params" });
|
|
3113
|
+
}
|
|
3114
|
+
const dispatch = options.dispatch;
|
|
3115
|
+
if (dispatch === undefined) return { accepted: false, reason: "dispatch-unavailable" };
|
|
3116
|
+
if (request.action === "cancel") {
|
|
3117
|
+
// `abort` reports nothing, so the fact has to be established before it
|
|
3118
|
+
// is claimed: an abort against an id this fleet never ran would poison
|
|
3119
|
+
// that control root for a future attempt and still answer "accepted".
|
|
3120
|
+
let live = false;
|
|
3121
|
+
try {
|
|
3122
|
+
const snapshot = dispatch.snapshot();
|
|
3123
|
+
live = snapshot.running.some((run) => run.runId === runId) || snapshot.retrying.some((run) => run.runId === runId);
|
|
3124
|
+
} catch {
|
|
3125
|
+
return { accepted: false, reason: "fleet-unavailable" };
|
|
3126
|
+
}
|
|
3127
|
+
if (!live) return { accepted: false, reason: "run-not-active" };
|
|
3128
|
+
try {
|
|
3129
|
+
dispatch.abort(runId);
|
|
3130
|
+
} catch {
|
|
3131
|
+
return { accepted: false, reason: "cancel-failed" };
|
|
3132
|
+
}
|
|
3133
|
+
return { accepted: true };
|
|
3134
|
+
}
|
|
3135
|
+
const message = requireSteerText(request.message, "message", ACP_MAX_STEER_TEXT_BYTES);
|
|
3136
|
+
try {
|
|
3137
|
+
dispatch.steer(runId, message);
|
|
3138
|
+
} catch (err) {
|
|
3139
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
3140
|
+
options.diagnostics?.(`dispatch steer refused: ${acpErrorMessage(detail)}`);
|
|
3141
|
+
return { accepted: false, reason: dispatchSteerReason(detail) };
|
|
3142
|
+
}
|
|
3143
|
+
// Queued, not delivered. The frame is on the worker's stdin; the worker
|
|
3144
|
+
// acknowledges acceptance later with `clio_coder_steer_received`, and that
|
|
3145
|
+
// ack's `sequence` never returns through this contract, so no sequence is
|
|
3146
|
+
// reported rather than a guessed one.
|
|
3147
|
+
return { accepted: true };
|
|
3148
|
+
});
|
|
3149
|
+
|
|
2531
3150
|
options.transport.onRequest("session/close", async (params) => {
|
|
2532
3151
|
requireInitialized();
|
|
2533
3152
|
const id = sessionIdOf(params);
|
|
@@ -2571,7 +3190,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
2571
3190
|
});
|
|
2572
3191
|
}
|
|
2573
3192
|
if (options.session?.current()?.id !== session.id && options.session) options.session.resume(session.id);
|
|
2574
|
-
const active = createActivePromptState();
|
|
3193
|
+
const active = createActivePromptState({ enabled: toolProgressEnabled, now });
|
|
2575
3194
|
session.activePrompt = active;
|
|
2576
3195
|
activePromptState = active;
|
|
2577
3196
|
activeSessionId = session.id;
|