@iowarp/clio-coder 0.4.8 → 0.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +82 -0
- package/README.md +7 -6
- package/dist/{acp-JWPQZM2D.js → acp-ZWZCPS2A.js} +13 -13
- package/dist/{agents-4GCDIRVX.js → agents-LYSOWZUE.js} +53 -52
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-SYAKTDQE.js → auth-WBQGKWQ5.js} +27 -27
- package/dist/{background-OW67WMYR.js → background-BUMOBAQN.js} +4 -4
- package/dist/{builtins-TKS63VNV.js → builtins-ODRJOEDI.js} +7 -7
- package/dist/{chunk-JLBVCROW.js → chunk-2DRRZ57Q.js} +33 -24
- package/dist/chunk-2JBZYUPY.js +105 -0
- package/dist/chunk-2KUBKL63.js +336 -0
- package/dist/{chunk-K45LHSCI.js → chunk-2VBWFXYE.js} +7 -3
- package/dist/{chunk-XTLJDC2X.js → chunk-2X2R3UTH.js} +23 -18
- package/dist/{chunk-5HULHKT2.js → chunk-37LW32LZ.js} +5 -5
- package/dist/{chunk-W7KNI3F5.js → chunk-3AND2EFU.js} +5 -5
- package/dist/{chunk-36XSBPXL.js → chunk-3RDHGNU7.js} +95 -27
- package/dist/{chunk-BIY22UUK.js → chunk-3SUDBGEI.js} +11 -10
- package/dist/{chunk-3IQOZRQ6.js → chunk-3TQN67I2.js} +7 -7
- package/dist/{chunk-KWJXCL2X.js → chunk-3U4BL2EV.js} +3 -3
- package/dist/{chunk-RBES4TCZ.js → chunk-3UQADNG2.js} +3 -3
- package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
- package/dist/{chunk-MWMW53WW.js → chunk-4ATBOFRP.js} +649 -193
- package/dist/{chunk-QGIC5SX5.js → chunk-4DNL43EZ.js} +3 -3
- package/dist/{chunk-GVU4CXPJ.js → chunk-4HFJKRGZ.js} +113 -54
- package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
- package/dist/{chunk-LZDLYSUN.js → chunk-5RTEFNBP.js} +3 -3
- package/dist/{chunk-HMGAKB7E.js → chunk-64XJW7NT.js} +15 -15
- package/dist/{chunk-EXKUF426.js → chunk-7FBCRWVT.js} +280 -280
- package/dist/{chunk-K3W6BF5C.js → chunk-7JSOSVLP.js} +2 -2
- package/dist/{chunk-WFTSK7N3.js → chunk-7N3OLLSL.js} +4 -4
- package/dist/{chunk-JRA6OBHY.js → chunk-A6DULIMH.js} +17 -5
- package/dist/{chunk-R5NRX5N4.js → chunk-AB3QXXBC.js} +2 -2
- package/dist/chunk-ACCECAH4.js +49 -0
- package/dist/{chunk-GJBJHJNY.js → chunk-AM6CEP2K.js} +5 -5
- package/dist/{chunk-MUXNDNMZ.js → chunk-AY4XE6GN.js} +19 -13
- package/dist/{chunk-MATCRH3M.js → chunk-BBA2TAWV.js} +9 -9
- package/dist/{chunk-PMUUAABD.js → chunk-BMNVVKEW.js} +9 -9
- package/dist/{chunk-TOPICHGR.js → chunk-CTGZCEI6.js} +2 -2
- package/dist/{chunk-L75H5B3B.js → chunk-DIAJYJYG.js} +2 -2
- package/dist/{chunk-JIMWEYWO.js → chunk-EHZRAB4U.js} +2 -2
- package/dist/{chunk-YXANQGCX.js → chunk-EM2DIQAJ.js} +6 -6
- package/dist/{chunk-JCVIL6TY.js → chunk-ETF4ROKH.js} +4 -4
- package/dist/{chunk-5W4FRA5Q.js → chunk-F2YM3JY4.js} +483 -253
- package/dist/{chunk-YGIV24MF.js → chunk-FEBQWHJT.js} +21 -16
- package/dist/{chunk-PGEFOTJB.js → chunk-FPS4R2RN.js} +5 -4
- package/dist/{chunk-XC5POIL4.js → chunk-G5R53COU.js} +1 -1
- package/dist/chunk-GHXGMFQ5.js +40 -0
- package/dist/{chunk-QLKCCC2J.js → chunk-GJDRMBDI.js} +14 -14
- package/dist/{chunk-2ZWLMA3T.js → chunk-GREYLTZ5.js} +7 -7
- package/dist/{chunk-YXFKLMX2.js → chunk-H2WSCZZT.js} +22 -6
- package/dist/{chunk-FNVPQQYT.js → chunk-H6IUCY6Q.js} +2 -2
- package/dist/{chunk-5C2OQHLR.js → chunk-H72DCH3E.js} +92 -203
- package/dist/{chunk-JYKUMHCQ.js → chunk-H7TXJR23.js} +21 -21
- package/dist/chunk-HBJQQTKM.js +40 -0
- package/dist/chunk-HCVKSGNZ.js +990 -0
- package/dist/{chunk-ARRUMZ7X.js → chunk-I47EJPYL.js} +3 -3
- package/dist/{chunk-YKIIWURD.js → chunk-IALGWTLO.js} +3 -3
- package/dist/{chunk-FB3KTE2J.js → chunk-IALZJE37.js} +4 -4
- package/dist/{chunk-RAUOKUZV.js → chunk-IC7JXLOM.js} +15 -10
- package/dist/{chunk-LLCGGVSW.js → chunk-IOSVTTCD.js} +7 -7
- package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
- package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
- package/dist/{chunk-UDAK6GR2.js → chunk-JIYWMQZ5.js} +2 -2
- package/dist/{chunk-O3HSB2YL.js → chunk-JKU34ACI.js} +2 -2
- package/dist/{chunk-6X7VOCDY.js → chunk-JTR3VSV3.js} +3 -3
- package/dist/{chunk-O2QJDRWP.js → chunk-JU6MAMRJ.js} +4 -4
- package/dist/chunk-JURMQWVJ.js +15 -0
- package/dist/{chunk-STC6CWUZ.js → chunk-K3XN4LZ4.js} +5 -5
- package/dist/{chunk-ATB3Q7YO.js → chunk-KIVFXGBM.js} +27 -2
- package/dist/{chunk-WJWNZXRM.js → chunk-KOAHT3N2.js} +2 -2
- package/dist/chunk-KP5BPXR3.js +73 -0
- package/dist/{chunk-K53E2PTW.js → chunk-KRJQG47M.js} +3 -3
- package/dist/{chunk-IILXVWJY.js → chunk-KW6OJ7IY.js} +19 -21
- package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
- package/dist/{chunk-2U2U5POA.js → chunk-L4RUTLRL.js} +5 -5
- package/dist/{chunk-QYSAZMSH.js → chunk-LGTVWPRN.js} +2 -2
- package/dist/{chunk-KGP3UQGJ.js → chunk-LSQW6KZO.js} +5 -5
- package/dist/{chunk-P4JS3MH5.js → chunk-LWJYOHT3.js} +8 -8
- package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
- package/dist/{chunk-5D2FNBMG.js → chunk-MJ4QEJVT.js} +2 -2
- package/dist/{chunk-RM3XJX7P.js → chunk-MO65K5CH.js} +5 -5
- package/dist/{chunk-H5DPSUBB.js → chunk-MTOZEQHL.js} +3 -3
- package/dist/{chunk-6R5MBXBJ.js → chunk-NBPA5QM6.js} +2 -2
- package/dist/{chunk-H77XBUBM.js → chunk-NMBEW4PP.js} +3 -3
- package/dist/{chunk-QWUSS2QP.js → chunk-NPLLK3HO.js} +67 -87
- package/dist/{chunk-K5UJD6MM.js → chunk-NSYGPIVW.js} +5 -5
- package/dist/{context-EZZPT2ZV.js → chunk-NXTV5OI5.js} +30 -84
- package/dist/{chunk-F7Y6QTPL.js → chunk-NYDG4QP4.js} +4 -4
- package/dist/{chunk-PFZJMXIY.js → chunk-OA2GDACN.js} +2 -2
- package/dist/{chunk-Q32C6AWI.js → chunk-PJI57EC6.js} +4 -4
- package/dist/{chunk-EFXMQYI6.js → chunk-PJJBUGMR.js} +52 -52
- package/dist/{chunk-ICYIUNO4.js → chunk-PNJE7JPS.js} +18 -3
- package/dist/chunk-PP23PZEV.js +1347 -0
- package/dist/chunk-PPIFDSBK.js +409 -0
- package/dist/{chunk-RFULVPBX.js → chunk-PTFISXQO.js} +6 -5
- package/dist/{chunk-JV25I7ID.js → chunk-QB33Z5S7.js} +5 -5
- package/dist/{chunk-D55WO5J7.js → chunk-QGNII5VC.js} +8 -8
- package/dist/{chunk-RKFNU5UA.js → chunk-QI72X67S.js} +104 -27
- package/dist/chunk-QKHZZFKH.js +98 -0
- package/dist/{chunk-5UG6EZI3.js → chunk-RDKX2PME.js} +4 -4
- package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
- package/dist/{chunk-BE4I3UJ2.js → chunk-RQROVOV3.js} +15 -13
- package/dist/{chunk-TEHVMHOK.js → chunk-S34A7BSP.js} +3 -3
- package/dist/{chunk-4P6M2TTE.js → chunk-SJETVJHX.js} +2 -2
- package/dist/{chunk-OPC4DQD6.js → chunk-SJMNU4ZS.js} +2 -2
- package/dist/{chunk-2JSCCEKO.js → chunk-SLLG2G44.js} +2 -2
- package/dist/{chunk-EPYATQMG.js → chunk-SQAZN2V3.js} +42 -16
- package/dist/{chunk-E2NSPYLC.js → chunk-SQBT46OF.js} +5 -5
- package/dist/{chunk-WTZVSMQZ.js → chunk-TCUOGIL2.js} +5 -5
- package/dist/{chunk-RRZFRIJP.js → chunk-TIWPKCVO.js} +5 -5
- package/dist/{chunk-QLAGXTTV.js → chunk-UIU7MGZ3.js} +5 -1
- package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
- package/dist/{chunk-PJ5H5B7A.js → chunk-VPWGADBG.js} +18 -18
- package/dist/{chunk-GEYX2NZ5.js → chunk-VWFCAK34.js} +6 -6
- package/dist/{chunk-44U2OUSM.js → chunk-W72LLZAV.js} +2 -2
- package/dist/{chunk-ORRNGQDV.js → chunk-WGRDABW7.js} +4 -4
- package/dist/{chunk-RNLAPBJL.js → chunk-XFLSL7BT.js} +2 -2
- package/dist/{chunk-2SXGG2IV.js → chunk-XJZEDCNT.js} +6 -6
- package/dist/{chunk-UB33F3YW.js → chunk-XLLEL3K7.js} +5 -5
- package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
- package/dist/{chunk-WS4FOGLY.js → chunk-XNZWWDC3.js} +2 -2
- package/dist/{chunk-P7GTE4FX.js → chunk-XRECG65F.js} +2 -2
- package/dist/chunk-XTQ7MEJG.js +457 -0
- package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
- package/dist/{chunk-OEMFEL26.js → chunk-Y3M2T5RO.js} +3 -3
- package/dist/{chunk-HP7KJ5O2.js → chunk-YPQOPFP7.js} +6 -6
- package/dist/{chunk-MEHBW2SP.js → chunk-YQYINEJI.js} +6 -6
- package/dist/{chunk-RXI7K4J5.js → chunk-ZF6CV4WZ.js} +1338 -217
- package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
- package/dist/{chunk-526ABLHD.js → chunk-ZKQ63XZ5.js} +12 -35
- package/dist/{chunk-PAQVETLA.js → chunk-ZKVMDNAN.js} +5 -5
- package/dist/cli/index.js +47 -37
- package/dist/{clio-BPBAPZGA.js → clio-JUDCLNHC.js} +7 -7
- package/dist/clio-context-tools-FT672MNZ.js +136 -0
- package/dist/{code-nav-KBQ3RIFK.js → code-nav-7OVCTP2Z.js} +28 -26
- package/dist/{components-6DKAXWFN.js → components-OZXZMDWU.js} +5 -5
- package/dist/{config-FWL5JK2H.js → config-P3ZQVF63.js} +80 -75
- package/dist/{config-graph-ACDB26L2.js → config-graph-GKAOBAS5.js} +74 -70
- package/dist/{configure-ZIZ4YV62.js → configure-25LRYZJG.js} +45 -44
- package/dist/context-72VQV7JX.js +73 -0
- package/dist/{context-VIL5MFRH.js → context-COWRWXP3.js} +74 -70
- package/dist/{context-Z3GOBHDK.js → context-WB3D474G.js} +12 -12
- package/dist/{context-clear-ZPB3L7MN.js → context-clear-Y4LYMWC6.js} +70 -66
- package/dist/{context-working-set-2GLBVF7L.js → context-working-set-TMZYVC7A.js} +15 -14
- package/dist/data-tool-KMBWKKWR.js +2987 -0
- package/dist/{detail-VSBWYSGZ.js → detail-4GLROGY5.js} +71 -67
- package/dist/{dispatch-runner-EEEHGKX4.js → dispatch-runner-TR3LBP5P.js} +92 -88
- package/dist/{docs-VMMWFVHL.js → docs-ZK777W2G.js} +3 -3
- package/dist/{doctor-V5L4IQGP.js → doctor-WC4OV2OB.js} +61 -59
- package/dist/{eval-VJYJ2BV3.js → eval-FUNWJNUJ.js} +45 -45
- package/dist/{evals-J2H5V6DD.js → evals-L73EBHSU.js} +4 -4
- package/dist/{evidence-Y35YSXH6.js → evidence-AVJ2RTHX.js} +80 -76
- package/dist/{evidence-POWAEBEW.js → evidence-P4NZOAK7.js} +70 -66
- package/dist/{evidence-XCCCLS36.js → evidence-Y55WKYHH.js} +79 -75
- package/dist/{evolve-GPG72VB6.js → evolve-MAWKRYWF.js} +75 -71
- package/dist/{extensions-YIZ7W3DA.js → extensions-PYQH3H47.js} +8 -8
- package/dist/{fleet-2MDCQ2VK.js → fleet-M4H2QBWT.js} +84 -80
- package/dist/{fleet-W2AF3TOJ.js → fleet-ULBXXRDR.js} +123 -119
- package/dist/{fleet-commands-WS56G26H.js → fleet-commands-7NNC4JZU.js} +17 -16
- package/dist/{fleet-decisions-MYGZ3JW7.js → fleet-decisions-EHEY7KPU.js} +9 -9
- package/dist/{fleet-graph-ELTBXBAV.js → fleet-graph-LQ2AHZT3.js} +15 -15
- package/dist/{fleet-inspect-45IK73L4.js → fleet-inspect-5IGBIIYZ.js} +76 -72
- package/dist/{fleet-preflight-T5NCZKHE.js → fleet-preflight-UTTNOKMG.js} +7 -2
- package/dist/{fleet-validate-VG4JBLA4.js → fleet-validate-YGILJKA6.js} +20 -20
- package/dist/{fleet-verify-VTSABAYO.js → fleet-verify-AUWTCDKR.js} +70 -66
- package/dist/{fleet-view-XC7WMKSS.js → fleet-view-TGUFCY5A.js} +73 -69
- package/dist/{init-VTJNNTIP.js → init-GFN2Z7NF.js} +94 -90
- package/dist/{interop-IU6BNA7C.js → interop-EF5JUWWK.js} +21 -21
- package/dist/{inventory-QPQUTUUZ.js → inventory-I6VJDDYF.js} +73 -69
- package/dist/{library-Q3NWL5CM.js → library-3J5IO2OJ.js} +13 -13
- package/dist/{library-LF7DLU6S.js → library-IJTOFTDS.js} +16 -15
- package/dist/{library-HUTAS57T.js → library-Z3KZSHPE.js} +27 -27
- package/dist/{library-import-PPW4YUC5.js → library-import-IMKFLDHX.js} +21 -21
- package/dist/{library-inventory-DIRVFRZU.js → library-inventory-CQP5D6GU.js} +13 -13
- package/dist/{library-validation-XHUZ3INE.js → library-validation-33UTX7AI.js} +11 -11
- package/dist/mcp-5FWZKUS6.js +26 -0
- package/dist/{memory-Z2LSKNV6.js → memory-36CWN67Y.js} +75 -71
- package/dist/{models-3FTREYPY.js → models-KQ6PQJJQ.js} +49 -49
- package/dist/{monitor-HF2MQRB3.js → monitor-XX6ZD6KC.js} +83 -79
- package/dist/{orchestrator-UYPA6W4S.js → orchestrator-SK6HDAOP.js} +1337 -772
- package/dist/{panes-736XB73K.js → panes-L27QRXUH.js} +12 -12
- package/dist/{panes-C4P3PIWT.js → panes-LXZIWNOZ.js} +4 -4
- package/dist/{paths-JQ4QYIYB.js → paths-7DJDU4P4.js} +5 -5
- package/dist/{preload-XSLRYH3Y.js → preload-K2TDYI4Y.js} +70 -66
- package/dist/{reset-V7QSPZYE.js → reset-73VU3XNT.js} +10 -10
- package/dist/{resources-OJGDFHYT.js → resources-3BYJYVYL.js} +16 -16
- package/dist/{run-T354SMDW.js → run-AR7PY6GW.js} +132 -128
- package/dist/run-script-H2KUDIII.js +41 -0
- package/dist/{settings-MWZXO6RV.js → settings-3VMBMWID.js} +4 -4
- package/dist/{share-Y5ZKJPND.js → share-HVWH4FPF.js} +21 -21
- package/dist/{skills-4GLZC4LN.js → skills-5TYEY75Q.js} +22 -22
- package/dist/{skills-eval-L5T7GODM.js → skills-eval-CK3MD63Z.js} +96 -87
- package/dist/{skills-inventory-LASKXEZI.js → skills-inventory-KSFYG3I6.js} +16 -16
- package/dist/{slash-commands-OIMRU36D.js → slash-commands-DMVHML7P.js} +47 -44
- package/dist/{steer-KMAM2Y2C.js → steer-XCD6V3EW.js} +4 -4
- package/dist/{support-AWC3XKPX.js → support-JAZL6VBR.js} +7 -7
- package/dist/{system-CD75NYBU.js → system-3TDQRMZZ.js} +26 -26
- package/dist/{targets-VSZX2J2S.js → targets-EZKHAYRN.js} +66 -65
- package/dist/{tasks-AN567LYH.js → tasks-SNEFHWYW.js} +12 -12
- package/dist/{terminal-lease-6KTWNHVY.js → terminal-lease-BNLFA4OF.js} +8 -7
- package/dist/{tools-AGRK3V5J.js → tools-7IM6BDCE.js} +12 -12
- package/dist/{trace-P4MQZD33.js → trace-C3MBGD4S.js} +8 -8
- package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
- package/dist/{uninstall-BRUTEPIC.js → uninstall-WWLOSZ42.js} +10 -10
- package/dist/{upgrade-SBCGHQGJ.js → upgrade-ETK2JNSJ.js} +37 -47
- package/dist/{usage-BIDVTO6V.js → usage-S2HOB7BZ.js} +93 -89
- package/dist/{verifiers-LTGCAMXS.js → verifiers-QDTEVH7R.js} +24 -22
- package/dist/{verify-OZU4LLNP.js → verify-SUKUK6XM.js} +15 -14
- package/dist/web/client/assets/{abnfDiagram-VCTEODGH-C5wfoHm3.js → abnfDiagram-VCTEODGH-BznNOe_I.js} +1 -1
- package/dist/web/client/assets/{arc-oH91sfLl.js → arc-Pry-7G1_.js} +1 -1
- package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
- package/dist/web/client/assets/{blockDiagram-I7D4REHJ-wi0_CYHL.js → blockDiagram-I7D4REHJ-prINbpbM.js} +1 -1
- package/dist/web/client/assets/{c4Diagram-7LVT6UL2-DV7NYc2W.js → c4Diagram-7LVT6UL2-DkVRKtyU.js} +1 -1
- package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
- package/dist/web/client/assets/{chunk-4HAMMTFA-Bhsegh3F.js → chunk-4HAMMTFA-CV0Z1ApC.js} +1 -1
- package/dist/web/client/assets/{chunk-75Z2AOVW-RQCckcQG.js → chunk-75Z2AOVW-D34Nohxq.js} +1 -1
- package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
- package/dist/web/client/assets/{chunk-F27PBJKO-BcNqv2x1.js → chunk-F27PBJKO-CmRojxkG.js} +1 -1
- package/dist/web/client/assets/{chunk-GMAD6QVW-Bq8JWiZT.js → chunk-GMAD6QVW-ClYZmc73.js} +1 -1
- package/dist/web/client/assets/{chunk-GVQU2GXP-DbchrAeJ.js → chunk-GVQU2GXP-B2BiHFt-.js} +1 -1
- package/dist/web/client/assets/{chunk-IMKFNOWR-DrpvjocK.js → chunk-IMKFNOWR-BGApZ8nP.js} +1 -1
- package/dist/web/client/assets/{chunk-L3NEJ4N5-DHLmTnCe.js → chunk-L3NEJ4N5-DIzCgpkY.js} +1 -1
- package/dist/web/client/assets/{chunk-OSK3NFVY-CsRbtN9n.js → chunk-OSK3NFVY-BPT-yePv.js} +1 -1
- package/dist/web/client/assets/{chunk-P2QGCYS3-aqPbxoMh.js → chunk-P2QGCYS3-BC1WTc2t.js} +1 -1
- package/dist/web/client/assets/{chunk-POPQ4Y6H-Dl5vw0h0.js → chunk-POPQ4Y6H-BSjzBmZU.js} +1 -1
- package/dist/web/client/assets/{chunk-PWAF6VOD-D7OBRSdO.js → chunk-PWAF6VOD-BIjLs86Z.js} +1 -1
- package/dist/web/client/assets/{chunk-SHT3W25Y-CdKCIwuB.js → chunk-SHT3W25Y-CduDz2cm.js} +1 -1
- package/dist/web/client/assets/{chunk-SVP7TREG-B94Nu_1-.js → chunk-SVP7TREG-XUn4pPAP.js} +1 -1
- package/dist/web/client/assets/{chunk-TICWLB2K-jjRQI_hk.js → chunk-TICWLB2K-DcBy2DKy.js} +1 -1
- package/dist/web/client/assets/{chunk-XXDRQBXY-azkbKE37.js → chunk-XXDRQBXY-DqAYeljN.js} +1 -1
- package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
- package/dist/web/client/assets/{cynefin-OW5HDTMX--i9RDU5f.js → cynefin-OW5HDTMX-BecPbyM6.js} +1 -1
- package/dist/web/client/assets/{cynefinDiagram-5FMLGOSQ-cRcvyBdp.js → cynefinDiagram-5FMLGOSQ-BzMzFwyT.js} +1 -1
- package/dist/web/client/assets/{dagre-GXQ25YYZ-C9mZmAPe.js → dagre-GXQ25YYZ-CAWJmRMG.js} +1 -1
- package/dist/web/client/assets/{diagram-S7CK7UJ4-Oj_zlLDY.js → diagram-S7CK7UJ4--lp0ALmn.js} +1 -1
- package/dist/web/client/assets/{diagram-UQ7AKVKN-BWKbbfcR.js → diagram-UQ7AKVKN-gKUnsjcj.js} +1 -1
- package/dist/web/client/assets/{diagram-VSXAHHWV-C3N3f7DO.js → diagram-VSXAHHWV-BoN5D1Gh.js} +1 -1
- package/dist/web/client/assets/{diagram-VX7I27RA-CtDKDAWe.js → diagram-VX7I27RA-BMtuswQ6.js} +1 -1
- package/dist/web/client/assets/{diagram-Z3DM3KII-B8bkBRCz.js → diagram-Z3DM3KII-DtU8LXrA.js} +1 -1
- package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/web/client/assets/{ebnfDiagram-PWID7BFC-CskW-Whx.js → ebnfDiagram-PWID7BFC-DDcnv9BH.js} +1 -1
- package/dist/web/client/assets/{erDiagram-RLTQ6QDP-C-83cgCW.js → erDiagram-RLTQ6QDP-DvRb4iDL.js} +1 -1
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
- package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
- package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
- package/dist/web/client/assets/{gitGraph-4MIJSDKK-B40cQtBE.js → gitGraph-4MIJSDKK-DjD_AAMj.js} +1 -1
- package/dist/web/client/assets/{gitGraphDiagram-WWUBYQGX-CH-7P7Di.js → gitGraphDiagram-WWUBYQGX-CDyN9n2u.js} +1 -1
- package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
- package/dist/web/client/assets/{info-A6RAGUB7-eCCE9D_Q.js → info-A6RAGUB7-C_XK8Hq0.js} +1 -1
- package/dist/web/client/assets/{infoDiagram-27XIBGKW-DRnvqMjM.js → infoDiagram-27XIBGKW-DIe4tJ1i.js} +1 -1
- package/dist/web/client/assets/{ishikawaDiagram-5VMMS53U-DBA_55wp.js → ishikawaDiagram-5VMMS53U-CVl5unKI.js} +1 -1
- package/dist/web/client/assets/{journeyDiagram-3NMN7TZE-C-ewpNl7.js → journeyDiagram-3NMN7TZE-CPEB1Vt8.js} +1 -1
- package/dist/web/client/assets/{kanban-definition-UXKFOSKX-B1taGsu0.js → kanban-definition-UXKFOSKX-j-9WXjYQ.js} +1 -1
- package/dist/web/client/assets/{line-lZ0kyxDI.js → line-BIDAcEtX.js} +1 -1
- package/dist/web/client/assets/{linear-DIc8FgZj.js → linear-SzVmGSw4.js} +1 -1
- package/dist/web/client/assets/{mermaid-parser.core-SXolxpXw.js → mermaid-parser.core-Ux4vssh0.js} +3 -3
- package/dist/web/client/assets/{mermaid.core-DXgQtkNg.js → mermaid.core-CDuwVKeh.js} +4 -4
- package/dist/web/client/assets/{mindmap-definition-YA3MSWOX-DXJas9K7.js → mindmap-definition-YA3MSWOX-5MlQEeQ6.js} +1 -1
- package/dist/web/client/assets/{packet-AYTQ26CC-OqVl_07o.js → packet-AYTQ26CC-DRO66c9Q.js} +1 -1
- package/dist/web/client/assets/{pegDiagram-XKGWAZYB-CPE_zdfN.js → pegDiagram-XKGWAZYB-BakZnSjM.js} +1 -1
- package/dist/web/client/assets/{pie-WAS4IAKB-DAxnMBLe.js → pie-WAS4IAKB-BEzcmhz8.js} +1 -1
- package/dist/web/client/assets/{pieDiagram-E7YTZNPT-Uwjpufxv.js → pieDiagram-E7YTZNPT-DpmqgoPt.js} +1 -1
- package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
- package/dist/web/client/assets/{quadrantDiagram-AXDQQJYC-Bjs4yjgs.js → quadrantDiagram-AXDQQJYC-DuMPwwV2.js} +1 -1
- package/dist/web/client/assets/{radar-RG4KPBEZ-CuCKjHM3.js → radar-RG4KPBEZ-Djm3oXl5.js} +1 -1
- package/dist/web/client/assets/{railroad-74A4TZTK-CnQK-Cc1.js → railroad-74A4TZTK-Cpvkwsao.js} +1 -1
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
- package/dist/web/client/assets/{railroadDiagram-O6MQD6OU-BDDIPNLL.js → railroadDiagram-O6MQD6OU-CgMS4B6R.js} +1 -1
- package/dist/web/client/assets/{requirementDiagram-BXWQKSXE-B5Ydyxc1.js → requirementDiagram-BXWQKSXE-CX5eoNdN.js} +1 -1
- package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/web/client/assets/{sankeyDiagram-P5KCCOFB-Bw2Qym75.js → sankeyDiagram-P5KCCOFB-CODBX2N3.js} +1 -1
- package/dist/web/client/assets/{sequenceDiagram-WJ2MYXX4-BZf36nO0.js → sequenceDiagram-WJ2MYXX4-eUhhF8OR.js} +1 -1
- package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
- package/dist/web/client/assets/{stateDiagram-D77RDMKH-DnH6JRkp.js → stateDiagram-D77RDMKH-vR6l0NC2.js} +1 -1
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
- package/dist/web/client/assets/{swimlanes-42K2YHIH-D9PZmtZg.js → swimlanes-42K2YHIH-v9Tw_zX7.js} +1 -1
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
- package/dist/web/client/assets/{timeline-definition-24CTP7MA-CrkZZBo7.js → timeline-definition-24CTP7MA-DxianbhU.js} +1 -1
- package/dist/web/client/assets/{treeView-Q6P3EWNA-C9zDShoC.js → treeView-Q6P3EWNA-DLxnZb9R.js} +1 -1
- package/dist/web/client/assets/{treemap-WGGIJYW6-B-plj9yK.js → treemap-WGGIJYW6-I7UnZ6xJ.js} +1 -1
- package/dist/web/client/assets/{vennDiagram-4TSXK5OY-VeOdaphN.js → vennDiagram-4TSXK5OY-Ar7M8Mrj.js} +1 -1
- package/dist/web/client/assets/{wardley-WFR3VGLG-Wl1P_m6L.js → wardley-WFR3VGLG-B8ZSHeDu.js} +1 -1
- package/dist/web/client/assets/{wardleyDiagram-VM6X3IG4-B85-R9t2.js → wardleyDiagram-VM6X3IG4-Qks2FmIn.js} +1 -1
- package/dist/web/client/assets/{xychartDiagram-S5SC5T6Z-BrD8OW8m.js → xychartDiagram-S5SC5T6Z-BBBjRtiE.js} +1 -1
- package/dist/web/client/index.html +3 -1
- package/dist/web/reads-worker.js +17 -17
- package/dist/web/server.js +25 -25
- package/dist/{web-EU6ATJWA.js → web-EMGUGGEI.js} +3 -3
- package/dist/{web-fetch-U22Q7HV4.js → web-fetch-6BRRVQON.js} +22 -5
- package/dist/{wiki-generate-LZRLFG6I.js → wiki-generate-XHSJTDOP.js} +104 -100
- package/dist/{with-panes-X5CZOGML.js → with-panes-Z6BTEHMZ.js} +11 -11
- package/dist/worker/entry.js +101 -87
- package/docs/README.md +1 -1
- package/docs/architecture/artifact-placement.md +12 -1
- package/docs/architecture/library.md +1 -1
- package/docs/architecture/prompt-envelope-and-tools.md +37 -27
- package/docs/architecture/safety-model.md +19 -6
- package/docs/architecture/session-lifecycle.md +10 -4
- package/docs/architecture/tui-design.md +37 -14
- package/docs/guide/commands-and-modes.md +39 -19
- package/docs/guide/configuration-and-targets.md +7 -5
- package/docs/guide/configuration-reference.md +116 -13
- package/docs/guide/environment-variables.md +2 -5
- package/docs/guide/fleet-dispatch.md +3 -2
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/installation-and-lifecycle.md +2 -2
- package/docs/guide/resource-library.md +1 -1
- package/docs/guide/tool-usage.md +166 -64
- package/docs/guide/troubleshooting.md +1 -1
- package/docs/process/documentation-guide.md +1 -0
- package/docs/process/fleet-demo-runbook.md +6 -6
- package/docs/process/scientific-validation.md +22 -2
- package/docs/process/tool-audit-v0.4.9.md +357 -0
- package/package.json +1 -1
- package/src/cli/argv.ts +31 -0
- package/src/cli/clio.ts +17 -13
- package/src/cli/config.ts +4 -0
- package/src/cli/doctor-panes.ts +1 -1
- package/src/cli/doctor.ts +3 -1
- package/src/cli/index.ts +14 -1
- package/src/cli/mcp.ts +106 -0
- package/src/cli/skills-eval.ts +8 -2
- package/src/cli/upgrade.ts +34 -38
- package/src/cli/verifiers.ts +1 -1
- package/src/core/bash-exec.ts +27 -4
- package/src/core/config.ts +2 -1
- package/src/core/defaults.ts +10 -1
- package/src/core/event-bus.ts +1 -1
- package/src/core/run-records.ts +438 -0
- package/src/core/safe-exec.ts +506 -56
- package/src/core/skill-activation.ts +5 -3
- package/src/core/termination.ts +3 -3
- package/src/core/tool-names.ts +33 -12
- package/src/domains/context/clio-md.ts +1 -1
- package/src/domains/context/worker/pressure.ts +6 -2
- package/src/domains/context/working-set/path-index.ts +7 -2
- package/src/domains/dispatch/code-step.ts +7 -2
- package/src/domains/dispatch/contract.ts +7 -0
- package/src/domains/dispatch/execution-role.ts +3 -3
- package/src/domains/dispatch/execution-scheduler.ts +204 -79
- package/src/domains/dispatch/extension.ts +131 -14
- package/src/domains/dispatch/fleet-preflight.ts +18 -3
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/gate-decisions.ts +3 -3
- package/src/domains/dispatch/heartbeat.ts +1 -1
- package/src/domains/dispatch/host-verification.ts +16 -14
- package/src/domains/dispatch/receipt-findings.ts +3 -4
- package/src/domains/dispatch/reservation-store.ts +7 -9
- package/src/domains/dispatch/route-facts.ts +1 -1
- package/src/domains/dispatch/state.ts +3 -3
- package/src/domains/dispatch/types.ts +1 -1
- package/src/domains/evidence/build.ts +35 -7
- package/src/domains/gateway/mcp/client.ts +923 -0
- package/src/domains/gateway/mcp/config.ts +456 -0
- package/src/domains/gateway/mcp/index.ts +88 -0
- package/src/domains/gateway/mcp/protocol.ts +273 -0
- package/src/domains/gateway/mcp/trust.ts +263 -0
- package/src/domains/lifecycle/doctor.ts +17 -3
- package/src/domains/mux/contract.ts +5 -9
- package/src/domains/mux/detect.ts +1 -1
- package/src/domains/mux/extension.ts +1 -1
- package/src/domains/mux/protocol.ts +5 -7
- package/src/domains/mux/socket-client.ts +3 -3
- package/src/domains/observability/accountability.ts +2 -2
- package/src/domains/observability/contract.ts +7 -3
- package/src/domains/observability/evidence-index.ts +2 -2
- package/src/domains/observability/projection.ts +10 -0
- package/src/domains/prompts/compiler.ts +41 -23
- package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
- package/src/domains/prompts/fragments/operating/skills.md +12 -10
- package/src/domains/providers/index.ts +5 -1
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
- package/src/domains/providers/probe/http.ts +44 -59
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
- package/src/domains/safety/action-classifier.ts +17 -1
- package/src/domains/safety/call-target.ts +14 -0
- package/src/domains/safety/contract.ts +1 -1
- package/src/domains/safety/finish-contract.ts +9 -3
- package/src/domains/safety/loop-detector.ts +1 -1
- package/src/domains/safety/policy-engine.ts +7 -0
- package/src/domains/safety/protected-artifacts.ts +3 -4
- package/src/domains/safety/rejection-feedback.ts +1 -1
- package/src/domains/safety/scope.ts +2 -3
- package/src/domains/safety/validation-contract.ts +3 -2
- package/src/domains/scheduling/budget.ts +5 -3
- package/src/domains/scheduling/contract.ts +2 -1
- package/src/domains/scheduling/extension.ts +3 -3
- package/src/domains/session/compaction/branch-summary.ts +1 -1
- package/src/domains/session/compaction/compact.ts +25 -2
- package/src/domains/session/compaction/cut-point.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +5 -10
- package/src/domains/session/contract.ts +1 -1
- package/src/domains/session/cwd-fallback.ts +2 -2
- package/src/domains/session/handoff.ts +5 -1
- package/src/domains/session/history.ts +6 -0
- package/src/domains/session/manager.ts +14 -7
- package/src/domains/session/retry.ts +2 -1
- package/src/domains/session/session-artifacts.ts +12 -7
- package/src/domains/session/task-board.ts +2 -3
- package/src/engine/apis/openai-completions.ts +8 -0
- package/src/engine/loop-guard.ts +7 -0
- package/src/engine/provider-error-body.ts +65 -0
- package/src/engine/session.ts +118 -29
- package/src/engine/worker-runtime.ts +3 -0
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +18 -2
- package/src/interactive/chat-loop-policy.ts +1 -0
- package/src/interactive/chat-loop.ts +8 -4
- package/src/interactive/chat-panel.ts +23 -9
- package/src/interactive/chat-renderer.ts +33 -11
- package/src/interactive/clio-editor.ts +13 -5
- package/src/interactive/dispatch-board.ts +70 -30
- package/src/interactive/editor-submit.ts +30 -25
- package/src/interactive/footer/widgets.ts +12 -9
- package/src/interactive/interactive-presentation.ts +2 -3
- package/src/interactive/mux-bridge.ts +3 -7
- package/src/interactive/overlay-general-openers.ts +14 -7
- package/src/interactive/overlays/cwd-fallback.ts +1 -1
- package/src/interactive/overlays/library-model.ts +114 -35
- package/src/interactive/overlays/library.ts +52 -5
- package/src/interactive/overlays/list-overlay.ts +4 -1
- package/src/interactive/overlays/session-selector.ts +28 -23
- package/src/interactive/overlays/settings.ts +20 -1
- package/src/interactive/overlays/tree-selector.ts +47 -10
- package/src/interactive/panes-runtime.ts +1 -1
- package/src/interactive/renderers/compaction-summary.ts +1 -1
- package/src/interactive/renderers/provider-error.ts +118 -0
- package/src/interactive/renderers/retry-status.ts +59 -23
- package/src/interactive/renderers/tool-execution.ts +67 -7
- package/src/interactive/renderers/worker-answer.ts +198 -0
- package/src/interactive/renderers/worker-entry.ts +57 -163
- package/src/interactive/slash-commands.ts +26 -1
- package/src/interactive/slash-spec.ts +2 -2
- package/src/interactive/theme/labels.ts +66 -30
- package/src/interactive/turn-persistence.ts +6 -1
- package/src/interactive/turn-recovery.ts +2 -1
- package/src/interactive/turn-runtime.ts +22 -5
- package/src/interactive/view/artifacts.ts +3 -2
- package/src/interactive/view/view-overlay.ts +96 -20
- package/src/tools/agent-tools.ts +21 -7
- package/src/tools/artifact.ts +16 -8
- package/src/tools/bash.ts +90 -11
- package/src/tools/bootstrap.ts +42 -4
- package/src/tools/builtin-tool-catalog.ts +72 -7
- package/src/tools/context/index.ts +27 -31
- package/src/tools/context/library.ts +3 -1
- package/src/tools/context/surface.ts +12 -26
- package/src/tools/core-bootstrap.ts +72 -1
- package/src/tools/data/csv.ts +1189 -0
- package/src/tools/data/index.ts +308 -0
- package/src/tools/data/json.ts +1799 -0
- package/src/tools/data/jsonl.ts +561 -0
- package/src/tools/data/shared.ts +452 -0
- package/src/tools/edit-diff.ts +0 -7
- package/src/tools/edit.ts +115 -18
- package/src/tools/file-mutation-queue.ts +114 -4
- package/src/tools/find.ts +108 -29
- package/src/tools/gateway/caps.ts +11 -0
- package/src/tools/gateway/clio-context-surface.ts +41 -0
- package/src/tools/gateway/clio-context-tools.ts +77 -0
- package/src/tools/gateway/data-surface.ts +138 -0
- package/src/tools/gateway/data-tool.ts +201 -0
- package/src/tools/gateway/index.ts +342 -0
- package/src/tools/gateway/mcp-capabilities.ts +469 -0
- package/src/tools/grep.ts +88 -33
- package/src/tools/harness-extensions.ts +3 -0
- package/src/tools/ignore-policy.ts +7 -5
- package/src/tools/ls.ts +111 -20
- package/src/tools/policy.ts +35 -13
- package/src/tools/presentation.ts +6 -0
- package/src/tools/read.ts +634 -156
- package/src/tools/registry.ts +94 -6
- package/src/tools/run-script.ts +997 -0
- package/src/tools/spawn-hygiene.ts +157 -5
- package/src/tools/surface.ts +163 -0
- package/src/tools/verify/authoring.ts +8 -3
- package/src/tools/verify/catalog.ts +14 -1
- package/src/tools/verify/numeric.ts +367 -59
- package/src/tools/verify/perf.ts +171 -9
- package/src/tools/verify/scripts.ts +178 -26
- package/src/tools/web-fetch-surface.ts +22 -0
- package/src/tools/web-fetch.ts +26 -1
- package/src/tools/write.ts +45 -19
- package/dist/chunk-B6UM3OZC.js +0 -15
- package/dist/chunk-GJ24ODAX.js +0 -196
- package/dist/chunk-LZCCBLRC.js +0 -57
- package/dist/web/client/assets/architecture-7GRP2DOG-EGozsYEO.js +0 -1
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-z9FokbJl.js +0 -36
- package/dist/web/client/assets/channel-CiUWbHN9.js +0 -1
- package/dist/web/client/assets/chunk-DU6HZSFF-C5USiOAy.js +0 -125
- package/dist/web/client/assets/classDiagram-ZZMXUADV-CMODalmo.js +0 -1
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-CMODalmo.js +0 -1
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-RbQL23qS.js +0 -1
- package/dist/web/client/assets/dist-D0_q-A2b.js +0 -1
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-DjVq8wKU.js +0 -1
- package/dist/web/client/assets/flowDiagram-HODETNUW-BUiCBGXt.js +0 -1
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-B2lb8lvF.js +0 -292
- package/dist/web/client/assets/index-FSIC94pi.js +0 -83
- package/dist/web/client/assets/prism-core-BngLtbUd.js +0 -1
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-BcW01NZG.js +0 -1
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-B7YCEDDd.js +0 -1
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-DjNZbSTZ.js +0 -1
- package/dist/web/client/assets/src-yeptRXpt.js +0 -1
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-C7QtHeK4.js +0 -1
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-CBZlPFky.js +0 -8
package/src/engine/session.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Clio session JSONL writer + reader
|
|
2
|
+
* Clio session JSONL writer + reader.
|
|
3
3
|
*
|
|
4
4
|
* On-disk layout under `clioStateDir()`:
|
|
5
5
|
* sessions/<cwdHash>/<sessionId>/
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Atomicity:
|
|
11
11
|
* - Appends go to an O_APPEND fd held for the writer's lifetime; each line
|
|
12
|
-
*
|
|
12
|
+
* uses complete byte writes. fsync is debounced after appends and forced on
|
|
13
13
|
* checkpoint (`persistTree`) and `close`. A torn last line from a crash
|
|
14
14
|
* is tolerated by the reader (skipped with a warning).
|
|
15
15
|
* - `replaceEntries` rewrites current.jsonl via `writeJsonlFileAtomic`
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
constants as fsConstants,
|
|
29
29
|
fstatSync,
|
|
30
30
|
fsyncSync,
|
|
31
|
+
ftruncateSync,
|
|
31
32
|
mkdirSync,
|
|
32
33
|
openSync,
|
|
33
34
|
readdirSync,
|
|
@@ -35,6 +36,7 @@ import {
|
|
|
35
36
|
readSync,
|
|
36
37
|
renameSync,
|
|
37
38
|
statSync,
|
|
39
|
+
unlinkSync,
|
|
38
40
|
writeSync,
|
|
39
41
|
} from "node:fs";
|
|
40
42
|
import { dirname, join, resolve } from "node:path";
|
|
@@ -197,6 +199,31 @@ function serializeJsonl(entries: ReadonlyArray<unknown>): string {
|
|
|
197
199
|
return `${lines.join("\n")}\n`;
|
|
198
200
|
}
|
|
199
201
|
|
|
202
|
+
/** Complete UTF-8 bytes even when write(2) makes only partial progress. */
|
|
203
|
+
function writeAll(fd: number, bytes: Buffer): void {
|
|
204
|
+
let offset = 0;
|
|
205
|
+
while (offset < bytes.length) {
|
|
206
|
+
const written = writeSync(fd, bytes, offset, bytes.length - offset);
|
|
207
|
+
if (written <= 0) throw new Error(`session JSONL write made no progress after ${offset} of ${bytes.length} bytes`);
|
|
208
|
+
offset += written;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** Roll back a failed append so a retry cannot fuse onto its partial record. */
|
|
213
|
+
function appendAll(fd: number, bytes: Buffer): void {
|
|
214
|
+
const size = fstatSync(fd).size;
|
|
215
|
+
try {
|
|
216
|
+
writeAll(fd, bytes);
|
|
217
|
+
} catch (error) {
|
|
218
|
+
try {
|
|
219
|
+
ftruncateSync(fd, size);
|
|
220
|
+
} catch (rollbackError) {
|
|
221
|
+
throw new AggregateError([error, rollbackError], "session JSONL append and rollback failed; reopen to recover");
|
|
222
|
+
}
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
200
227
|
/**
|
|
201
228
|
* Rewrite a JSONL file through `<target>.tmp` and rename over the target.
|
|
202
229
|
* A crash or interruption before the rename leaves the original target
|
|
@@ -213,10 +240,21 @@ function writeJsonlFileAtomic(
|
|
|
213
240
|
const tmp = `${targetPath}.tmp`;
|
|
214
241
|
const fd = openSync(tmp, "w");
|
|
215
242
|
try {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
243
|
+
try {
|
|
244
|
+
writeAll(fd, Buffer.from(body, "utf8"));
|
|
245
|
+
fsyncSync(fd);
|
|
246
|
+
} finally {
|
|
247
|
+
closeSync(fd);
|
|
248
|
+
}
|
|
249
|
+
} catch (error) {
|
|
250
|
+
// A missing target can recover from .tmp, so an incomplete write
|
|
251
|
+
// must not leave a candidate that recovery could promote.
|
|
252
|
+
try {
|
|
253
|
+
unlinkSync(tmp);
|
|
254
|
+
} catch (cleanupError) {
|
|
255
|
+
throw new AggregateError([error, cleanupError], "session JSONL write and temporary cleanup failed");
|
|
256
|
+
}
|
|
257
|
+
throw error;
|
|
220
258
|
}
|
|
221
259
|
options.beforeRename?.(tmp, targetPath);
|
|
222
260
|
renameSync(tmp, targetPath);
|
|
@@ -633,10 +671,7 @@ export function appendSessionFileEntry(targetPath: string, entry: unknown): void
|
|
|
633
671
|
const line = Buffer.from(`${endsWithNewline(appendPath) ? "" : "\n"}${serialized}\n`, "utf8");
|
|
634
672
|
const fd = openSync(appendPath, fsConstants.O_WRONLY | fsConstants.O_APPEND);
|
|
635
673
|
try {
|
|
636
|
-
|
|
637
|
-
if (written !== line.length) {
|
|
638
|
-
throw new Error(`short session JSONL append: wrote ${written} of ${line.length} bytes`);
|
|
639
|
-
}
|
|
674
|
+
appendAll(fd, line);
|
|
640
675
|
fsyncSync(fd);
|
|
641
676
|
} finally {
|
|
642
677
|
closeSync(fd);
|
|
@@ -655,6 +690,9 @@ function createWriter(
|
|
|
655
690
|
let closed = false;
|
|
656
691
|
let appendFd: number | null = null;
|
|
657
692
|
let fsyncTimer: NodeJS.Timeout | null = null;
|
|
693
|
+
// Descriptor cleanup must not discard accepted bytes or rollback changes
|
|
694
|
+
// still owed to the next debounce, checkpoint, flush, or close.
|
|
695
|
+
let pendingFsync = false;
|
|
658
696
|
|
|
659
697
|
// One-time normalization for resumes of pre-header files: rewrite once so
|
|
660
698
|
// fd-appended lines land after a header. Disk and memory match from here on.
|
|
@@ -668,7 +706,10 @@ function createWriter(
|
|
|
668
706
|
appendFd = openSync(paths.current, "a");
|
|
669
707
|
// Terminating the fragment keeps the reader's torn-tail behavior:
|
|
670
708
|
// it skips exactly one invalid line with a warning.
|
|
671
|
-
if (tornTail)
|
|
709
|
+
if (tornTail) {
|
|
710
|
+
pendingFsync = true;
|
|
711
|
+
appendAll(appendFd, Buffer.from("\n"));
|
|
712
|
+
}
|
|
672
713
|
return appendFd;
|
|
673
714
|
}
|
|
674
715
|
|
|
@@ -676,28 +717,52 @@ function createWriter(
|
|
|
676
717
|
if (fsyncTimer !== null) return;
|
|
677
718
|
fsyncTimer = setTimeout(() => {
|
|
678
719
|
fsyncTimer = null;
|
|
679
|
-
if (appendFd === null) return;
|
|
680
720
|
try {
|
|
681
|
-
|
|
721
|
+
flushPendingAppends();
|
|
682
722
|
} catch {
|
|
683
|
-
//
|
|
723
|
+
// Keep the obligation pending. Explicit flush/checkpoint/close
|
|
724
|
+
// retries and reports an error if storage is still unavailable.
|
|
684
725
|
}
|
|
685
726
|
}, APPEND_FSYNC_DEBOUNCE_MS);
|
|
686
727
|
fsyncTimer.unref?.();
|
|
687
728
|
}
|
|
688
729
|
|
|
730
|
+
function flushPendingAppends(): void {
|
|
731
|
+
if (appendFd !== null) {
|
|
732
|
+
fsyncSync(appendFd);
|
|
733
|
+
pendingFsync = false;
|
|
734
|
+
return;
|
|
735
|
+
}
|
|
736
|
+
if (!pendingFsync || stateRootRemoved()) return;
|
|
737
|
+
// Reopen without O_CREAT or tail normalization: flushing after a failed
|
|
738
|
+
// append must neither recreate removed state nor alter retained bytes.
|
|
739
|
+
const fd = openSync(paths.current, fsConstants.O_WRONLY | fsConstants.O_APPEND);
|
|
740
|
+
try {
|
|
741
|
+
fsyncSync(fd);
|
|
742
|
+
} catch (error) {
|
|
743
|
+
try {
|
|
744
|
+
closeSync(fd);
|
|
745
|
+
} catch (closeError) {
|
|
746
|
+
throw new AggregateError([error, closeError], "session JSONL flush and close failed");
|
|
747
|
+
}
|
|
748
|
+
throw error;
|
|
749
|
+
}
|
|
750
|
+
closeSync(fd);
|
|
751
|
+
pendingFsync = false;
|
|
752
|
+
}
|
|
753
|
+
|
|
689
754
|
function closeAppendFd(opts: { flush: boolean }): void {
|
|
755
|
+
if (opts.flush) flushPendingAppends();
|
|
690
756
|
if (fsyncTimer !== null) {
|
|
691
757
|
clearTimeout(fsyncTimer);
|
|
692
758
|
fsyncTimer = null;
|
|
693
759
|
}
|
|
694
760
|
if (appendFd === null) return;
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
}
|
|
761
|
+
const fd = appendFd;
|
|
762
|
+
// A failed close can already have released the OS descriptor. Never
|
|
763
|
+
// retain that ambiguous number for a later append or duplicate close.
|
|
764
|
+
appendFd = null;
|
|
765
|
+
closeSync(fd);
|
|
701
766
|
}
|
|
702
767
|
|
|
703
768
|
function appendLine(entry: unknown): void {
|
|
@@ -705,7 +770,21 @@ function createWriter(
|
|
|
705
770
|
if (serialized === undefined) {
|
|
706
771
|
throw new Error("session JSONL entry is not serializable");
|
|
707
772
|
}
|
|
708
|
-
|
|
773
|
+
try {
|
|
774
|
+
const fd = openAppendFd();
|
|
775
|
+
pendingFsync = true;
|
|
776
|
+
appendAll(fd, Buffer.from(`${serialized}\n`, "utf8"));
|
|
777
|
+
} catch (error) {
|
|
778
|
+
// Reopening rechecks the tail even if rollback itself failed.
|
|
779
|
+
try {
|
|
780
|
+
closeAppendFd({ flush: false });
|
|
781
|
+
} catch (closeError) {
|
|
782
|
+
throw new AggregateError([error, closeError], "session JSONL append and close failed");
|
|
783
|
+
} finally {
|
|
784
|
+
scheduleFsync();
|
|
785
|
+
}
|
|
786
|
+
throw error;
|
|
787
|
+
}
|
|
709
788
|
scheduleFsync();
|
|
710
789
|
}
|
|
711
790
|
|
|
@@ -747,7 +826,7 @@ function createWriter(
|
|
|
747
826
|
},
|
|
748
827
|
async persistTree(): Promise<void> {
|
|
749
828
|
// Checkpoint: make appended lines durable alongside the tree.
|
|
750
|
-
|
|
829
|
+
flushPendingAppends();
|
|
751
830
|
// `paths` was resolved at construction, but atomicWrite mkdirs the
|
|
752
831
|
// session directory again, so an uninstall that has already removed the
|
|
753
832
|
// state root would be undone here. Fsyncing the held fd first is safe
|
|
@@ -756,7 +835,7 @@ function createWriter(
|
|
|
756
835
|
atomicWrite(paths.tree, JSON.stringify(tree, null, 2));
|
|
757
836
|
},
|
|
758
837
|
flushAppends(): void {
|
|
759
|
-
|
|
838
|
+
flushPendingAppends();
|
|
760
839
|
},
|
|
761
840
|
async close(): Promise<void> {
|
|
762
841
|
if (closed) return;
|
|
@@ -827,7 +906,10 @@ export function openSession(id: string): ClioSessionReader {
|
|
|
827
906
|
};
|
|
828
907
|
}
|
|
829
908
|
|
|
830
|
-
export function resumeSession(
|
|
909
|
+
export function resumeSession(
|
|
910
|
+
id: string,
|
|
911
|
+
options: { sessionFormatVersion?: number } = {},
|
|
912
|
+
): {
|
|
831
913
|
meta: ClioSessionMeta;
|
|
832
914
|
writer: ClioSessionWriter;
|
|
833
915
|
tree: ReadonlyArray<SessionTreeNode>;
|
|
@@ -835,13 +917,20 @@ export function resumeSession(id: string): {
|
|
|
835
917
|
const dir = findSessionDir(id);
|
|
836
918
|
const metaPath = join(dir, "meta.json");
|
|
837
919
|
const meta = readMetaFile(metaPath);
|
|
838
|
-
// resume reopens an active session; clear endedAt if it was set by a prior close
|
|
839
|
-
if (meta.endedAt !== null) {
|
|
840
|
-
meta.endedAt = null;
|
|
841
|
-
atomicWrite(metaPath, JSON.stringify(meta, null, 2));
|
|
842
|
-
}
|
|
843
920
|
const existingFileEntries = readSessionFileEntries(join(dir, "current.jsonl"));
|
|
844
921
|
const existingTree = recoverTreeFromJsonl(readTreeFile(join(dir, "tree.json")), existingFileEntries);
|
|
845
922
|
const writer = createWriter(meta, existingTree, existingFileEntries);
|
|
923
|
+
// Prepare headerless ledgers before publishing that a closed session has
|
|
924
|
+
// reopened. A failed normalization must preserve its prior ended state.
|
|
925
|
+
// Reopening and a migration restamp are one atomic publication: a refused
|
|
926
|
+
// resume can never leave the session marked open under its old version.
|
|
927
|
+
const restamp = options.sessionFormatVersion;
|
|
928
|
+
const restamped = restamp !== undefined && meta.sessionFormatVersion !== restamp;
|
|
929
|
+
if (meta.endedAt !== null || restamped) {
|
|
930
|
+
const reopened = { ...meta, endedAt: null, ...(restamped ? { sessionFormatVersion: restamp } : {}) };
|
|
931
|
+
atomicWrite(metaPath, JSON.stringify(reopened, null, 2));
|
|
932
|
+
meta.endedAt = null;
|
|
933
|
+
if (restamped) meta.sessionFormatVersion = restamp;
|
|
934
|
+
}
|
|
846
935
|
return { meta, writer, tree: existingTree };
|
|
847
936
|
}
|
|
@@ -621,6 +621,9 @@ export function startWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): Wo
|
|
|
621
621
|
correlationId: `worker-model-round-${workerModelRound}`,
|
|
622
622
|
toolResultMaxBytes: workerSettings.context.toolResultMaxBytes,
|
|
623
623
|
supportsImages: model.input.includes("image"),
|
|
624
|
+
// The admitted capability list, so the gateway calls only what the
|
|
625
|
+
// recipe declared: the same bound the attached schemas already honor.
|
|
626
|
+
allowedTools: input.allowedTools,
|
|
624
627
|
...(agentSkillPolicy ? { pendingSkillPolicy: agentSkillPolicy } : {}),
|
|
625
628
|
}),
|
|
626
629
|
});
|
|
@@ -28,6 +28,8 @@ export interface BootOptions {
|
|
|
28
28
|
startupSettings?: Readonly<ClioSettings>;
|
|
29
29
|
/** `--with-panes` / `--no-panes`. The flag beats `panes.enabled` in both directions. */
|
|
30
30
|
panes?: "with" | "without";
|
|
31
|
+
/** Global `--autonomy <level>`: a one-session override for the interactive app; settings.yaml is untouched. */
|
|
32
|
+
autonomy?: AutonomyLevel;
|
|
31
33
|
headless?: {
|
|
32
34
|
prompt: string;
|
|
33
35
|
images?: ReadonlyArray<ImageContent>;
|
|
@@ -120,6 +120,7 @@ import {
|
|
|
120
120
|
isOrchestratorEligibleRuntime,
|
|
121
121
|
normalizeCostProvenance,
|
|
122
122
|
ProvidersDomainModule,
|
|
123
|
+
probeCapabilitiesForModel,
|
|
123
124
|
refineRuntimeTargetWithModelHints,
|
|
124
125
|
registerForegroundStream,
|
|
125
126
|
resolveEndpointCapacities,
|
|
@@ -603,6 +604,17 @@ function agentRoleToolWarnings(providers: ProvidersContract, settings: Readonly<
|
|
|
603
604
|
if (!status) continue;
|
|
604
605
|
const capabilities = resolveModelCapabilities(status, wireModelId, providers.knowledgeBase);
|
|
605
606
|
if (supportsAgentRoleTools(capabilities)) continue;
|
|
607
|
+
// A target that was never probed has reported nothing about this model:
|
|
608
|
+
// the flag is only the runtime's conservative floor. Dispatch admission
|
|
609
|
+
// probes the route itself before it refuses a worker.
|
|
610
|
+
const declared =
|
|
611
|
+
status.target.capabilities?.tools ?? providers.knowledgeBase?.lookup(wireModelId)?.entry.capabilities?.tools;
|
|
612
|
+
if (
|
|
613
|
+
declared === undefined &&
|
|
614
|
+
status.health.lastCheckAt === null &&
|
|
615
|
+
probeCapabilitiesForModel(status, wireModelId) === null
|
|
616
|
+
)
|
|
617
|
+
continue;
|
|
606
618
|
warnings.push(
|
|
607
619
|
`${role.label} model '${wireModelId}' on target '${targetId}' ${AGENT_ROLE_TOOLS_REQUIRED_REASON}. ` +
|
|
608
620
|
`Pick another model, or state the correction in a model-catalog.d entry if the provider's flag is wrong.`,
|
|
@@ -1184,7 +1196,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1184
1196
|
createDispatchDomainModule({
|
|
1185
1197
|
getSettings: () => effectiveSettingsForDispatch?.(),
|
|
1186
1198
|
getProtectedArtifactState: () => protectedArtifactStateForDispatch?.() ?? { artifacts: [] },
|
|
1187
|
-
autonomyOverride: options.headless?.autonomy !== undefined,
|
|
1199
|
+
autonomyOverride: (options.headless?.autonomy ?? options.autonomy) !== undefined,
|
|
1188
1200
|
// The domain owns the durable journal here, not the dispatch
|
|
1189
1201
|
// tool's event registry: `/run`, a watchdog run, and a model
|
|
1190
1202
|
// dispatch all have to leave the same transcript behind, and only
|
|
@@ -1568,6 +1580,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1568
1580
|
const resolveBaselineAutonomy = (): AutonomyLevel =>
|
|
1569
1581
|
effectiveSettingsForDispatch?.().safety.autonomy ??
|
|
1570
1582
|
options.headless?.autonomy ??
|
|
1583
|
+
options.autonomy ??
|
|
1571
1584
|
(config?.get() ?? readSettings()).safety.autonomy ??
|
|
1572
1585
|
"auto-edit";
|
|
1573
1586
|
const resolveEffectiveAutonomy = (): AutonomyLevel => activeAcpSessionAutonomy ?? resolveBaselineAutonomy();
|
|
@@ -1726,6 +1739,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1726
1739
|
})
|
|
1727
1740
|
: null;
|
|
1728
1741
|
registerAllTools(toolRegistry, {
|
|
1742
|
+
termination,
|
|
1729
1743
|
captureWorkerContext: () => chat.captureWorkerContext?.() ?? null,
|
|
1730
1744
|
...(session
|
|
1731
1745
|
? {
|
|
@@ -1788,8 +1802,10 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1788
1802
|
// flag was keyed by the bare word, which wrote a top-level `autonomy` key
|
|
1789
1803
|
// nothing reads, so `run --autonomy full-auto` compiled and admitted at
|
|
1790
1804
|
// whatever settings.yaml said.
|
|
1805
|
+
// The interactive `clio-coder --autonomy <level>` seeds the same override.
|
|
1806
|
+
const startupAutonomy = options.headless?.autonomy ?? options.autonomy;
|
|
1791
1807
|
const sessionOverrides: SessionOverrides = new Map(
|
|
1792
|
-
|
|
1808
|
+
startupAutonomy === undefined ? [] : [["safety.autonomy", startupAutonomy]],
|
|
1793
1809
|
);
|
|
1794
1810
|
// The effective view is derived by deep-cloning the saved snapshot, and it
|
|
1795
1811
|
// is read on the tool-admission hot path (every call resolves autonomy
|
|
@@ -14,5 +14,6 @@ export function normalizeRetrySettings(raw: RawRetrySettings): RetrySettings {
|
|
|
14
14
|
baseDelayMs: normalizeNonNegativeInteger(raw?.baseDelayMs, DEFAULT_RETRY_SETTINGS.baseDelayMs),
|
|
15
15
|
maxDelayMs: normalizeNonNegativeInteger(raw?.maxDelayMs, DEFAULT_RETRY_SETTINGS.maxDelayMs),
|
|
16
16
|
streamStallMs: normalizeNonNegativeInteger(raw?.streamStallMs, DEFAULT_RETRY_SETTINGS.streamStallMs),
|
|
17
|
+
firstTokenStallMs: normalizeNonNegativeInteger(raw?.firstTokenStallMs, DEFAULT_RETRY_SETTINGS.firstTokenStallMs),
|
|
17
18
|
};
|
|
18
19
|
}
|
|
@@ -345,8 +345,8 @@ export interface ChatLoop {
|
|
|
345
345
|
* in-memory `state.messages` for a single bridge message carrying the
|
|
346
346
|
* summary, and emit the standard summary notice. Used by `/context compact`
|
|
347
347
|
* slash command so the next user turn ships only the bridge plus the new
|
|
348
|
-
* text to the provider
|
|
349
|
-
*
|
|
348
|
+
* text to the provider. When no session or compaction dependencies are
|
|
349
|
+
* wired, it skips compaction and emits a user-visible
|
|
350
350
|
* notice so the `/context compact` handler does not have to mirror the logic.
|
|
351
351
|
*/
|
|
352
352
|
compact(instructions?: string): Promise<void>;
|
|
@@ -686,10 +686,13 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
686
686
|
(policy?.requests.length ?? 0) > 0)
|
|
687
687
|
) {
|
|
688
688
|
const entries = filterEntriesToActivePath(deps.readSessionEntries?.() ?? [], state.lastTurnId ?? undefined);
|
|
689
|
+
// A loaded skill that declares no tool narrowing arms no surface, yet its
|
|
690
|
+
// instructions are in context. Record it from the loading policy: an
|
|
691
|
+
// unknown selection would block every later compaction of this session.
|
|
689
692
|
const selection = next
|
|
690
693
|
? mainSkillContextState(entries, next)
|
|
691
|
-
:
|
|
692
|
-
?
|
|
694
|
+
: policy !== undefined && policy.loadedSkillNames.size > 0
|
|
695
|
+
? mainSkillContextState(entries, policy)
|
|
693
696
|
: { version: 1 as const, activationRefs: [] };
|
|
694
697
|
const data = selection ?? { version: 1 as const, activationRefs: [], unknown: true as const };
|
|
695
698
|
if (JSON.stringify(data) !== JSON.stringify(latestSkillContextState(entries))) {
|
|
@@ -1289,6 +1292,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1289
1292
|
images,
|
|
1290
1293
|
options.requestContinuation === true,
|
|
1291
1294
|
text,
|
|
1295
|
+
options.display?.text,
|
|
1292
1296
|
);
|
|
1293
1297
|
// An interrupt was submitted while a run was active, so no caller drew
|
|
1294
1298
|
// it in the transcript; render it here, after the cancel notice and the
|
|
@@ -12,7 +12,8 @@ import { codeInk } from "./renderers/code-ink.js";
|
|
|
12
12
|
import { createMermaidMarkdownTransform } from "./renderers/mermaid.js";
|
|
13
13
|
import { styleTaggedNotice } from "./renderers/notice.js";
|
|
14
14
|
import { previewBudget, previewRows } from "./renderers/preview.js";
|
|
15
|
-
import {
|
|
15
|
+
import { presentProviderError, providerErrorEvidence } from "./renderers/provider-error.js";
|
|
16
|
+
import { renderRetryStatus } from "./renderers/retry-status.js";
|
|
16
17
|
import {
|
|
17
18
|
canGroupObservation,
|
|
18
19
|
renderToolAwaitingApproval,
|
|
@@ -223,7 +224,12 @@ type AssistantSegment = TextSegment | ToolSegment | ErrorSegment | ThinkingSegme
|
|
|
223
224
|
* A caller-rendered block receives the frame's transcript detail policy so a
|
|
224
225
|
* block such as the operator's `!` bash row follows the same preset as the panel. Blocks that ignore it are unaffected.
|
|
225
226
|
*/
|
|
226
|
-
type ReplayBlockRenderer = (
|
|
227
|
+
type ReplayBlockRenderer = (
|
|
228
|
+
width: number,
|
|
229
|
+
detail: TranscriptDetailPolicy,
|
|
230
|
+
unbounded?: boolean,
|
|
231
|
+
terminalRows?: number,
|
|
232
|
+
) => string[];
|
|
227
233
|
|
|
228
234
|
type TranscriptEntry =
|
|
229
235
|
| { role: "user"; text: string; status?: () => UserTurnStatus }
|
|
@@ -460,7 +466,7 @@ function scopeTerminalErrorAfterSuccessfulTool(
|
|
|
460
466
|
const reason = terminalError.slice("[error] ".length);
|
|
461
467
|
const timedOut = /\b(?:timed?\s*out|timeout)\b/i.test(reason);
|
|
462
468
|
const modelFailure = timedOut
|
|
463
|
-
?
|
|
469
|
+
? `main model response timed out after successful tool result: ${reason}`
|
|
464
470
|
: `main model response failed after successful tool result: ${reason}`;
|
|
465
471
|
const detachedDispatchSucceeded = successfulTools.some(
|
|
466
472
|
(segment) =>
|
|
@@ -604,9 +610,9 @@ function renderTextSegmentLines(seg: TextSegment, width: number): string[] {
|
|
|
604
610
|
* message text rather than plain markdown, so a failed turn is visibly a
|
|
605
611
|
* failure. Each source line wraps to width and carries the error color.
|
|
606
612
|
*/
|
|
607
|
-
function renderErrorSegmentLines(seg: ErrorSegment, width: number): string[] {
|
|
613
|
+
function renderErrorSegmentLines(seg: ErrorSegment, width: number, unbounded: boolean): string[] {
|
|
608
614
|
const out: string[] = [];
|
|
609
|
-
for (const line of seg.text.split("\n")) {
|
|
615
|
+
for (const line of (unbounded ? providerErrorEvidence(seg.text) : presentProviderError(seg.text)).split("\n")) {
|
|
610
616
|
for (const wrapped of wrapTextWithAnsi(line, width)) {
|
|
611
617
|
out.push(`${RED_CRIT}${wrapped}${RESET}`);
|
|
612
618
|
}
|
|
@@ -813,7 +819,7 @@ function renderEntryLines(
|
|
|
813
819
|
terminalRows: number,
|
|
814
820
|
): string[] {
|
|
815
821
|
if (entry.role === "replayBlock") {
|
|
816
|
-
return entry.renderBlock(width, detail);
|
|
822
|
+
return entry.renderBlock(width, detail, unboundedToolBodies, terminalRows);
|
|
817
823
|
}
|
|
818
824
|
if (entry.role === "user") {
|
|
819
825
|
const contentWidth = Math.max(1, width - PROSE_GUTTER_WIDTH);
|
|
@@ -827,7 +833,7 @@ function renderEntryLines(
|
|
|
827
833
|
return rendered;
|
|
828
834
|
}
|
|
829
835
|
if (entry.role === "retryStatus") {
|
|
830
|
-
return
|
|
836
|
+
return renderRetryStatus(entry.status, width, detail, unboundedToolBodies, terminalRows);
|
|
831
837
|
}
|
|
832
838
|
if (entry.role === "worker") {
|
|
833
839
|
return renderWorkerEntryLines(entry.state, width, { detail, terminalRows, unbounded: unboundedToolBodies });
|
|
@@ -888,8 +894,13 @@ function renderEntryLines(
|
|
|
888
894
|
labeled = true;
|
|
889
895
|
continue;
|
|
890
896
|
}
|
|
891
|
-
|
|
892
|
-
seg.kind === "text"
|
|
897
|
+
let rendered =
|
|
898
|
+
seg.kind === "text"
|
|
899
|
+
? renderTextSegmentLines(seg, proseWidth)
|
|
900
|
+
: renderErrorSegmentLines(seg, proseWidth, unboundedToolBodies);
|
|
901
|
+
if (seg.kind === "error" && !unboundedToolBodies) {
|
|
902
|
+
rendered = previewRows(rendered, previewBudget(detail.errorRows, terminalRows), proseWidth);
|
|
903
|
+
}
|
|
893
904
|
if (rendered.length === 0) continue;
|
|
894
905
|
const isSkillSuggestion = seg.kind === "text" && findSkillSuggestionLine(seg) !== null;
|
|
895
906
|
if (!labeled && !isSkillSuggestion) {
|
|
@@ -1331,6 +1342,7 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1331
1342
|
for (const entry of transcript) {
|
|
1332
1343
|
if (entry.role === "assistant") {
|
|
1333
1344
|
for (const seg of entry.segments) {
|
|
1345
|
+
if (seg.kind === "error") add("Provider or terminal error", () => providerErrorEvidence(seg.text).split("\n"));
|
|
1334
1346
|
if (seg.kind === "thinking" && seg.text) add("Thinking · supplied reasoning", () => seg.text.split("\n"));
|
|
1335
1347
|
if (seg.kind === "tool")
|
|
1336
1348
|
add(`${seg.name} · ${seg.id}`, () =>
|
|
@@ -1350,6 +1362,8 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1350
1362
|
),
|
|
1351
1363
|
);
|
|
1352
1364
|
}
|
|
1365
|
+
} else if (entry.role === "retryStatus" && entry.status.errorMessage) {
|
|
1366
|
+
add("Provider retry diagnostic", () => providerErrorEvidence(entry.status.errorMessage ?? "").split("\n"));
|
|
1353
1367
|
} else if (entry.role === "worker") {
|
|
1354
1368
|
add(`${entry.state.agentId} · worker ${entry.state.runId}`, () =>
|
|
1355
1369
|
renderWorkerEntryLines(entry.state, 120, { unbounded: true }),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Coalescing wrapper around chat events
|
|
2
|
+
* Coalescing wrapper around chat events.
|
|
3
3
|
*
|
|
4
4
|
* Streaming responses fire text, thinking, and cumulative tool-result updates
|
|
5
5
|
* at very high frequency. The TUI's per-event `requestRender()` call rebuilt the
|
|
@@ -53,12 +53,12 @@ import { wrapTextWithAnsi } from "../engine/tui.js";
|
|
|
53
53
|
import type { AgentMessage } from "../engine/types.js";
|
|
54
54
|
import { toolResultPresentationText } from "../tools/result-disposition.js";
|
|
55
55
|
import type { ChatLoopEvent, RetryStatusPayload } from "./chat-loop.js";
|
|
56
|
-
import { isSelfExplainingAbort, toolResultSummary } from "./chat-loop-messages.js";
|
|
56
|
+
import { hasStructuredToolCall, isSelfExplainingAbort, toolResultSummary } from "./chat-loop-messages.js";
|
|
57
57
|
import type { ChatPanel } from "./chat-panel.js";
|
|
58
58
|
import { renderBranchSummaryEntry } from "./renderers/branch-summary.js";
|
|
59
59
|
import { renderCompactionSummaryEntry } from "./renderers/compaction-summary.js";
|
|
60
60
|
import { styleTaggedNotice } from "./renderers/notice.js";
|
|
61
|
-
import {
|
|
61
|
+
import { renderRetryStatus } from "./renderers/retry-status.js";
|
|
62
62
|
import { renderBashTranscriptExecution, renderToolResultOnly } from "./renderers/tool-execution.js";
|
|
63
63
|
import {
|
|
64
64
|
classifyStreamEvent,
|
|
@@ -644,6 +644,7 @@ const LEADING_SYSTEM_REMINDER = /^\s*<system-reminder>[\s\S]*?<\/system-reminder
|
|
|
644
644
|
*/
|
|
645
645
|
function replayedUserText(entry: MessageEntry): string {
|
|
646
646
|
const obj = payloadObject(entry.payload);
|
|
647
|
+
if (typeof obj?.displayText === "string" && obj.displayText.length > 0) return obj.displayText;
|
|
647
648
|
if (typeof obj?.operatorText === "string") return obj.operatorText;
|
|
648
649
|
let text = extractTurnText(entry.payload);
|
|
649
650
|
for (;;) {
|
|
@@ -823,7 +824,13 @@ function renderBashExecutionEntry(
|
|
|
823
824
|
);
|
|
824
825
|
}
|
|
825
826
|
|
|
826
|
-
function renderRetryStatusEntry(
|
|
827
|
+
function renderRetryStatusEntry(
|
|
828
|
+
entry: CustomEntry,
|
|
829
|
+
width: number,
|
|
830
|
+
detail: TranscriptDetailPolicy,
|
|
831
|
+
unbounded: boolean,
|
|
832
|
+
terminalRows: number,
|
|
833
|
+
): string[] {
|
|
827
834
|
const data = payloadObject(entry.data);
|
|
828
835
|
if (!data) return wrapTextWithAnsi(styleTaggedNotice("[retry] status"), width);
|
|
829
836
|
const rawPhase = data.phase;
|
|
@@ -848,7 +855,7 @@ function renderRetryStatusEntry(entry: CustomEntry, width: number): string[] {
|
|
|
848
855
|
...(typeof data.delayMs === "number" ? { delayMs: data.delayMs } : {}),
|
|
849
856
|
...(typeof data.seconds === "number" ? { seconds: data.seconds } : {}),
|
|
850
857
|
};
|
|
851
|
-
return
|
|
858
|
+
return renderRetryStatus(status, width, detail, unbounded, terminalRows);
|
|
852
859
|
}
|
|
853
860
|
|
|
854
861
|
/**
|
|
@@ -868,8 +875,14 @@ function rendersCustomEntry(entry: CustomEntry): boolean {
|
|
|
868
875
|
return entry.display === true;
|
|
869
876
|
}
|
|
870
877
|
|
|
871
|
-
function renderCustomEntry(
|
|
872
|
-
|
|
878
|
+
function renderCustomEntry(
|
|
879
|
+
entry: CustomEntry,
|
|
880
|
+
width: number,
|
|
881
|
+
detail: TranscriptDetailPolicy,
|
|
882
|
+
unbounded: boolean,
|
|
883
|
+
terminalRows: number,
|
|
884
|
+
): string[] {
|
|
885
|
+
if (entry.customType === "retryStatus") return renderRetryStatusEntry(entry, width, detail, unbounded, terminalRows);
|
|
873
886
|
if (entry.customType === HANDOFF_SEED_CUSTOM_TYPE && isHandoffSeedData(entry.data)) {
|
|
874
887
|
return wrapTextWithAnsi(styleTaggedNotice(`[handoff] carried from session ${entry.data.fromSessionId}`), width);
|
|
875
888
|
}
|
|
@@ -1211,8 +1224,7 @@ export function buildReplayAgentMessagesFromTurns(
|
|
|
1211
1224
|
* Rehydrate a chat panel from a persisted session's turn list. The
|
|
1212
1225
|
* interactive layer calls this after /resume or /fork so the user sees the
|
|
1213
1226
|
* prior transcript instead of a blank pane; without it, swapping the
|
|
1214
|
-
* session contract updated meta but left the visible chat untouched
|
|
1215
|
-
* (Row 51 and Row 52 on the Phase 12 ledger).
|
|
1227
|
+
* session contract updated meta but left the visible chat untouched.
|
|
1216
1228
|
*
|
|
1217
1229
|
* Replays a structured SessionEntry stream. Compaction summaries, branch
|
|
1218
1230
|
* summaries, bash executions, custom entries, and metadata entries are
|
|
@@ -1270,9 +1282,16 @@ export function rehydrateChatPanelFromTurns(
|
|
|
1270
1282
|
(message as { stopReason?: string; errorMessage?: string }).stopReason = failure.stopReason;
|
|
1271
1283
|
(message as { stopReason?: string; errorMessage?: string }).errorMessage = failure.errorMessage;
|
|
1272
1284
|
}
|
|
1285
|
+
const stopReason = (message as { stopReason?: string }).stopReason;
|
|
1286
|
+
const terminalFailure = stopReason === "error" || stopReason === "aborted" || stopReason === "length";
|
|
1287
|
+
const continues = !terminalFailure && (stopReason === "toolUse" || hasStructuredToolCall(message));
|
|
1288
|
+
// Tool-use messages continue this run. Settling before their tool rows
|
|
1289
|
+
// exist can attach a Done receipt to an earlier visible failure.
|
|
1290
|
+
// Keep incomplete replay pending until a terminal assistant arrives.
|
|
1291
|
+
if (continues) chatPanel.applyEvent({ type: "message_start", message });
|
|
1273
1292
|
chatPanel.applyEvent({ type: "message_end", message });
|
|
1274
1293
|
runAssistantMessages.push(message);
|
|
1275
|
-
chatPanel.applyEvent({ type: "agent_end", messages: runAssistantMessages });
|
|
1294
|
+
if (!continues) chatPanel.applyEvent({ type: "agent_end", messages: runAssistantMessages });
|
|
1276
1295
|
}
|
|
1277
1296
|
break;
|
|
1278
1297
|
}
|
|
@@ -1348,7 +1367,10 @@ export function rehydrateChatPanelFromTurns(
|
|
|
1348
1367
|
break;
|
|
1349
1368
|
}
|
|
1350
1369
|
case "custom":
|
|
1351
|
-
if (rendersCustomEntry(entry))
|
|
1370
|
+
if (rendersCustomEntry(entry))
|
|
1371
|
+
chatPanel.appendReplayBlock((width, detail, unbounded, terminalRows = 40) =>
|
|
1372
|
+
renderCustomEntry(entry, width, detail, unbounded === true || options.unboundedToolBodies === true, terminalRows),
|
|
1373
|
+
);
|
|
1352
1374
|
break;
|
|
1353
1375
|
case "modelChange":
|
|
1354
1376
|
chatPanel.appendReplayBlock((width) => renderModelChangeEntry(entry, width));
|
|
@@ -11,6 +11,7 @@ import { fitHintEntries } from "./overlay-frame.js";
|
|
|
11
11
|
import { type PermissionInspectionHint, permissionHintEntries } from "./permission-hint.js";
|
|
12
12
|
import type { ClioTheme } from "./theme/index.js";
|
|
13
13
|
import { clioTheme, editorTheme, GLYPH, rule } from "./theme/index.js";
|
|
14
|
+
import { fitIdentityLabel, formatTargetLabel, type TargetIdentity } from "./theme/labels.js";
|
|
14
15
|
import type { TurnPreparationPhase } from "./turn-state.js";
|
|
15
16
|
|
|
16
17
|
const REVERSE_VIDEO_BLANK = `${String.fromCharCode(27)}[7m ${String.fromCharCode(27)}[0m`;
|
|
@@ -26,8 +27,8 @@ function hasScrollIndicator(line: string): boolean {
|
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
export interface EditorChrome {
|
|
29
|
-
/**
|
|
30
|
-
getModelLabel: () => string;
|
|
30
|
+
/** Raw route fields from presentation; startup/legacy labels remain opaque strings. */
|
|
31
|
+
getModelLabel: () => TargetIdentity | string;
|
|
31
32
|
/** Effective thinking level, e.g. `high` / `off`. */
|
|
32
33
|
getThinkingLabel: () => string;
|
|
33
34
|
/** Whether Enter currently targets the active Clio response. */
|
|
@@ -90,8 +91,15 @@ function styledThinkingHint(theme: ClioTheme, value: string): string {
|
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
|
|
93
|
-
function styledRailLabel(theme: ClioTheme, chrome: EditorChrome): string {
|
|
94
|
-
|
|
94
|
+
function styledRailLabel(theme: ClioTheme, chrome: EditorChrome, width: number): string {
|
|
95
|
+
const thinking = styledThinkingHint(theme, chrome.getThinkingLabel());
|
|
96
|
+
const identity = chrome.getModelLabel();
|
|
97
|
+
const room = Math.max(1, width - visibleWidth(thinking) - 3);
|
|
98
|
+
const model =
|
|
99
|
+
typeof identity === "string"
|
|
100
|
+
? fitIdentityLabel(identity, room)
|
|
101
|
+
: formatTargetLabel(identity.targetId, identity.modelId, { width: room });
|
|
102
|
+
return `${theme.fg("dim", model)} ${theme.fg("dim", "·")} ${thinking}`;
|
|
95
103
|
}
|
|
96
104
|
|
|
97
105
|
function composerMode(chrome: EditorChrome, text: string): ComposerMode {
|
|
@@ -250,7 +258,7 @@ export class ClioEditor extends Editor {
|
|
|
250
258
|
lines[0] = rule(theme, safeWidth, {
|
|
251
259
|
left: mode,
|
|
252
260
|
leftToken: modeToken(mode),
|
|
253
|
-
right: styledRailLabel(theme, this.chrome),
|
|
261
|
+
right: styledRailLabel(theme, this.chrome, Math.max(1, safeWidth - visibleWidth(mode) - 5)),
|
|
254
262
|
fillToken: "frameStrong",
|
|
255
263
|
rightRaw: true,
|
|
256
264
|
rightTail: theme.style("frameStrong", "─", { bold: true }),
|