@iowarp/clio-coder 0.4.7 → 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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +111 -0
- package/CONTRIBUTING.md +83 -74
- package/README.md +69 -47
- package/dist/{acp-W3Y3TRHD.js → acp-ZWZCPS2A.js} +15 -15
- package/dist/{agents-J4ICNLQ3.js → agents-LYSOWZUE.js} +61 -59
- package/dist/assets/codewiki.json +1 -1
- package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
- package/dist/assets/web-notices/hono-LICENSE +21 -0
- package/dist/{auth-X2UJUMOC.js → auth-WBQGKWQ5.js} +27 -27
- package/dist/background-BUMOBAQN.js +37 -0
- package/dist/{builtins-XLXWWSRF.js → builtins-ODRJOEDI.js} +7 -7
- package/dist/{chunk-C3G5PNUO.js → chunk-2DRRZ57Q.js} +36 -27
- package/dist/chunk-2JBZYUPY.js +105 -0
- package/dist/chunk-2KUBKL63.js +336 -0
- package/dist/chunk-2VBWFXYE.js +198 -0
- package/dist/{chunk-XZ6UFQ52.js → chunk-2X2R3UTH.js} +25 -15
- package/dist/{chunk-M6Z2V6YU.js → chunk-37LW32LZ.js} +5 -5
- package/dist/{chunk-6LRLOJHQ.js → chunk-3AND2EFU.js} +11 -62
- package/dist/{chunk-FQOOGXBH.js → chunk-3RDHGNU7.js} +101 -33
- package/dist/{chunk-D2T66PDV.js → chunk-3SUDBGEI.js} +41 -208
- package/dist/{chunk-5AJPUR72.js → chunk-3TQN67I2.js} +9 -9
- package/dist/{chunk-LBFQMYS3.js → chunk-3U4BL2EV.js} +5 -3
- package/dist/{chunk-UFYNOQK4.js → chunk-3UQADNG2.js} +7 -7
- package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
- package/dist/{chunk-NO7J45X6.js → chunk-4ATBOFRP.js} +713 -218
- package/dist/{chunk-ECOMVOHP.js → chunk-4DNL43EZ.js} +3 -3
- package/dist/{chunk-WT5TRMO4.js → chunk-4HFJKRGZ.js} +255 -82
- package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
- package/dist/{chunk-WURGVOZJ.js → chunk-5RTEFNBP.js} +18 -14
- package/dist/{config-YXARKGTX.js → chunk-64XJW7NT.js} +24 -268
- package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
- package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
- package/dist/{chunk-MZNWZUJM.js → chunk-7FBCRWVT.js} +288 -288
- package/dist/{chunk-UA6W4XFJ.js → chunk-7JSOSVLP.js} +2 -2
- package/dist/chunk-7N3OLLSL.js +637 -0
- package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
- package/dist/{chunk-N37QC5FV.js → chunk-A6DULIMH.js} +21 -9
- package/dist/{fleet-decisions-S3PTZV2D.js → chunk-AB3QXXBC.js} +5 -41
- package/dist/chunk-ACCECAH4.js +49 -0
- package/dist/{chunk-CP3HIR5H.js → chunk-AM6CEP2K.js} +20 -19
- package/dist/chunk-AUHVBIDW.js +19 -0
- package/dist/{chunk-BQQ5MXUC.js → chunk-AY4XE6GN.js} +19 -13
- package/dist/{chunk-ISNCCX42.js → chunk-BBA2TAWV.js} +10 -9
- package/dist/chunk-BFPHMSK7.js +169 -0
- package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
- package/dist/{chunk-DO7M3LSX.js → chunk-BMNVVKEW.js} +40 -93
- package/dist/{chunk-VTYHHQ57.js → chunk-CTGZCEI6.js} +2 -2
- package/dist/{chunk-RTLNFZMD.js → chunk-DIAJYJYG.js} +3 -3
- package/dist/chunk-EHZRAB4U.js +63 -0
- package/dist/{chunk-KS7ETA3P.js → chunk-EM2DIQAJ.js} +3 -3
- package/dist/{chunk-MNQN3X6Y.js → chunk-ETF4ROKH.js} +5 -5
- package/dist/{chunk-WN552PKN.js → chunk-F2YM3JY4.js} +744 -1134
- package/dist/{chunk-7EEGBKV4.js → chunk-FEBQWHJT.js} +24 -19
- package/dist/{chunk-4QKAITQT.js → chunk-FPS4R2RN.js} +74 -10
- package/dist/chunk-G5R53COU.js +68 -0
- package/dist/chunk-GHXGMFQ5.js +40 -0
- package/dist/{chunk-GFQ7P2UF.js → chunk-GJDRMBDI.js} +10 -10
- package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
- package/dist/{chunk-NCCQ6DVS.js → chunk-GREYLTZ5.js} +8 -8
- package/dist/{chunk-HOX4YZ2K.js → chunk-H2WSCZZT.js} +19 -3
- package/dist/{chunk-3LXJOICS.js → chunk-H6IUCY6Q.js} +2 -2
- package/dist/{chunk-BO4XV5VX.js → chunk-H72DCH3E.js} +95 -206
- package/dist/{chunk-SEDI5K5B.js → chunk-H7TXJR23.js} +20 -20
- package/dist/chunk-HBJQQTKM.js +40 -0
- package/dist/chunk-HCVKSGNZ.js +990 -0
- package/dist/chunk-HVCAY2FH.js +67 -0
- package/dist/{chunk-34XHRVKG.js → chunk-I47EJPYL.js} +3 -3
- package/dist/{chunk-4N2RZ4TO.js → chunk-IALGWTLO.js} +3 -3
- package/dist/{chunk-IQCNVLO6.js → chunk-IALZJE37.js} +10 -7
- package/dist/{chunk-DLIYANB7.js → chunk-IC7JXLOM.js} +16 -11
- package/dist/{chunk-G4LGUTOE.js → chunk-IOSVTTCD.js} +5 -5
- package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
- package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
- package/dist/{chunk-TN5FW4XY.js → chunk-JIYWMQZ5.js} +12 -9
- package/dist/{chunk-T7QQBNLH.js → chunk-JKU34ACI.js} +10 -8
- package/dist/chunk-JOBN2YQQ.js +176 -0
- package/dist/chunk-JOL2QRLE.js +152 -0
- package/dist/{chunk-GXIWHXDB.js → chunk-JTR3VSV3.js} +3 -3
- package/dist/{chunk-T334FW2H.js → chunk-JU6MAMRJ.js} +7 -7
- package/dist/chunk-JURMQWVJ.js +15 -0
- package/dist/{chunk-CULVKYTK.js → chunk-K3XN4LZ4.js} +5 -5
- package/dist/{chunk-3T4DXWP6.js → chunk-KIVFXGBM.js} +27 -7
- package/dist/chunk-KKRXONXG.js +43 -0
- package/dist/{chunk-YPRSNUTC.js → chunk-KOAHT3N2.js} +2 -2
- package/dist/chunk-KP5BPXR3.js +73 -0
- package/dist/{chunk-UA3W4FGC.js → chunk-KRJQG47M.js} +6 -6
- package/dist/{chunk-GI5RRMAH.js → chunk-KW6OJ7IY.js} +19 -21
- package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
- package/dist/{chunk-MZHXENL7.js → chunk-L4RUTLRL.js} +8 -8
- package/dist/{chunk-P5SC4DLJ.js → chunk-LGTVWPRN.js} +2 -2
- package/dist/{chunk-65BGHOUR.js → chunk-LSQW6KZO.js} +5 -5
- package/dist/{chunk-TZHN5ITX.js → chunk-LWJYOHT3.js} +8 -8
- package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
- package/dist/chunk-MJ4QEJVT.js +185 -0
- package/dist/{chunk-T4TY5GG3.js → chunk-MO65K5CH.js} +5 -5
- package/dist/{chunk-TZ6UVP2H.js → chunk-MTOZEQHL.js} +8 -8
- package/dist/chunk-MZDPF35R.js +45 -0
- package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
- package/dist/{chunk-KAFMW7WM.js → chunk-NBPA5QM6.js} +2 -2
- package/dist/{chunk-EUEXGXXR.js → chunk-NMBEW4PP.js} +5 -5
- package/dist/{chunk-SELG4SUR.js → chunk-NPLLK3HO.js} +72 -89
- package/dist/{chunk-VCRVEDUC.js → chunk-NSYGPIVW.js} +5 -5
- package/dist/{context-7HJEWTTP.js → chunk-NXTV5OI5.js} +36 -90
- package/dist/{chunk-IMOD2YPV.js → chunk-NYDG4QP4.js} +9 -19
- package/dist/{chunk-6CA2BHOR.js → chunk-OA2GDACN.js} +5 -5
- package/dist/{chunk-A67NR5AT.js → chunk-PJI57EC6.js} +14 -11
- package/dist/{chunk-IJMW64DX.js → chunk-PJJBUGMR.js} +50 -50
- package/dist/{chunk-CPXGJI2A.js → chunk-PNJE7JPS.js} +20 -5
- package/dist/chunk-PP23PZEV.js +1347 -0
- package/dist/chunk-PPIFDSBK.js +409 -0
- package/dist/{chunk-T52TPHYC.js → chunk-PTFISXQO.js} +8 -7
- package/dist/{chunk-C6GEXX4L.js → chunk-QB33Z5S7.js} +5 -5
- package/dist/{chunk-VMATUZB6.js → chunk-QGNII5VC.js} +10 -10
- package/dist/{chunk-TLTGZTXI.js → chunk-QI72X67S.js} +104 -27
- package/dist/chunk-QKHZZFKH.js +98 -0
- package/dist/{chunk-PFLOULP3.js → chunk-RDKX2PME.js} +4 -4
- package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
- package/dist/chunk-RPMNIFRY.js +65 -0
- package/dist/{chunk-L3Z5ANCV.js → chunk-RQROVOV3.js} +13 -11
- package/dist/{chunk-6YHPAAZR.js → chunk-S34A7BSP.js} +3 -3
- package/dist/{chunk-5ZSZEYJK.js → chunk-SJETVJHX.js} +2 -2
- package/dist/{chunk-77CZRFTE.js → chunk-SJMNU4ZS.js} +2 -2
- package/dist/chunk-SLLG2G44.js +85 -0
- package/dist/{chunk-GVZFCJHE.js → chunk-SQAZN2V3.js} +48 -22
- package/dist/{chunk-2O2LVQQK.js → chunk-SQBT46OF.js} +2 -2
- package/dist/{chunk-ZGIGW4ZG.js → chunk-TCUOGIL2.js} +5 -5
- package/dist/{chunk-DACXIVVF.js → chunk-TIWPKCVO.js} +5 -5
- package/dist/{chunk-5CMARGPF.js → chunk-UIU7MGZ3.js} +11 -2
- package/dist/chunk-USBBEKHW.js +177 -0
- package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
- package/dist/{chunk-MBJO5VNZ.js → chunk-VPWGADBG.js} +33 -33
- package/dist/{chunk-UUQ5G6EZ.js → chunk-VWFCAK34.js} +6 -6
- package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
- package/dist/{chunk-4MFBBY2Z.js → chunk-W72LLZAV.js} +3 -3
- package/dist/{chunk-4UHVS5T7.js → chunk-WGRDABW7.js} +8 -8
- package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
- package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
- package/dist/{chunk-6YA46L5A.js → chunk-XFLSL7BT.js} +2 -2
- package/dist/{chunk-QKWL7SYE.js → chunk-XJZEDCNT.js} +50 -39
- package/dist/{chunk-UWD3JD5X.js → chunk-XLLEL3K7.js} +10 -10
- package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
- package/dist/chunk-XNZWWDC3.js +686 -0
- package/dist/{chunk-WBVKKTUT.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-WB7POC6M.js → chunk-Y3M2T5RO.js} +6 -6
- package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
- package/dist/{chunk-EUZRMP4Y.js → chunk-YPQOPFP7.js} +20 -20
- package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
- package/dist/{chunk-BAU36233.js → chunk-YQYINEJI.js} +9 -9
- package/dist/{chunk-CE64C5K5.js → chunk-ZF6CV4WZ.js} +1356 -235
- package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
- package/dist/{chunk-IZYTT3CD.js → chunk-ZKQ63XZ5.js} +16 -39
- package/dist/{chunk-6TAATXXH.js → chunk-ZKVMDNAN.js} +7 -7
- package/dist/chunk-ZST3FRCV.js +132 -0
- package/dist/cli/index.js +50 -38
- package/dist/{clio-L2P7S2R2.js → clio-JUDCLNHC.js} +11 -11
- package/dist/clio-context-tools-FT672MNZ.js +136 -0
- package/dist/{code-nav-B5LNX4KU.js → code-nav-7OVCTP2Z.js} +39 -37
- package/dist/{components-63MMQKUT.js → components-OZXZMDWU.js} +11 -11
- package/dist/config-P3ZQVF63.js +275 -0
- package/dist/config-graph-GKAOBAS5.js +160 -0
- package/dist/{configure-LMVQJ46J.js → configure-25LRYZJG.js} +56 -55
- package/dist/context-72VQV7JX.js +73 -0
- package/dist/{context-YG2LZDYZ.js → context-COWRWXP3.js} +89 -83
- package/dist/{context-XSZKKFBW.js → context-WB3D474G.js} +16 -16
- package/dist/{context-clear-AC5NXHM2.js → context-clear-Y4LYMWC6.js} +88 -82
- package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
- package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
- package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-TMZYVC7A.js} +27 -25
- package/dist/data-tool-KMBWKKWR.js +2987 -0
- package/dist/{detail-H73BEF2N.js → detail-4GLROGY5.js} +89 -83
- package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-TR3LBP5P.js} +113 -107
- package/dist/docs-ZK777W2G.js +101 -0
- package/dist/{doctor-EQYJOGUG.js → doctor-WC4OV2OB.js} +76 -73
- package/dist/{eval-4P7O6CCE.js → eval-FUNWJNUJ.js} +88 -73
- package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
- package/dist/evals-L73EBHSU.js +104 -0
- package/dist/{evidence-O76QF7TZ.js → evidence-AVJ2RTHX.js} +99 -93
- package/dist/{evidence-D6GUSYJW.js → evidence-P4NZOAK7.js} +88 -82
- package/dist/evidence-Y55WKYHH.js +246 -0
- package/dist/{evolve-H47BCETS.js → evolve-MAWKRYWF.js} +93 -87
- package/dist/{extensions-NNL3ZOCU.js → extensions-PYQH3H47.js} +14 -13
- package/dist/fleet-M4H2QBWT.js +268 -0
- package/dist/{fleet-KMNS6NOM.js → fleet-ULBXXRDR.js} +146 -138
- package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-7NNC4JZU.js} +18 -17
- package/dist/fleet-decisions-EHEY7KPU.js +52 -0
- package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-LQ2AHZT3.js} +24 -24
- package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-5IGBIIYZ.js} +98 -258
- package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-UTTNOKMG.js} +9 -4
- package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-YGILJKA6.js} +29 -29
- package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-AUWTCDKR.js} +88 -82
- package/dist/{fleet-view-BHJFW26B.js → fleet-view-TGUFCY5A.js} +90 -84
- package/dist/{init-XAT5N5YM.js → init-GFN2Z7NF.js} +111 -104
- package/dist/install-6PIF6F6W.js +19 -0
- package/dist/{interop-FVECHFKG.js → interop-EF5JUWWK.js} +29 -29
- package/dist/{inventory-7KFQGLCV.js → inventory-I6VJDDYF.js} +90 -84
- package/dist/library-3J5IO2OJ.js +75 -0
- package/dist/{library-QAPAO23R.js → library-IJTOFTDS.js} +20 -19
- package/dist/{library-NY2XOT75.js → library-Z3KZSHPE.js} +35 -35
- package/dist/{library-import-5Y6MAS3R.js → library-import-IMKFLDHX.js} +29 -29
- package/dist/{library-inventory-JT6HWITQ.js → library-inventory-CQP5D6GU.js} +21 -21
- package/dist/{library-validation-EQUH25DC.js → library-validation-33UTX7AI.js} +19 -19
- package/dist/mcp-5FWZKUS6.js +26 -0
- package/dist/{memory-DYVTTCP6.js → memory-36CWN67Y.js} +93 -87
- package/dist/{models-MASFJ6Y2.js → models-KQ6PQJJQ.js} +57 -56
- package/dist/{monitor-YMP4NXJJ.js → monitor-XX6ZD6KC.js} +98 -91
- package/dist/{orchestrator-AFQRRTEI.js → orchestrator-SK6HDAOP.js} +1537 -832
- package/dist/{panes-NICTHQCV.js → panes-L27QRXUH.js} +14 -14
- package/dist/{panes-D3Y2KFG5.js → panes-LXZIWNOZ.js} +4 -4
- package/dist/{paths-PSFAUIGO.js → paths-7DJDU4P4.js} +6 -6
- package/dist/{preload-5Q7VXRFJ.js → preload-K2TDYI4Y.js} +88 -82
- package/dist/{reset-7NKZK7JN.js → reset-73VU3XNT.js} +13 -13
- package/dist/{resources-NILSIZAT.js → resources-3BYJYVYL.js} +24 -24
- package/dist/{run-BPZGEBZV.js → run-AR7PY6GW.js} +144 -136
- package/dist/run-script-H2KUDIII.js +41 -0
- package/dist/settings-3VMBMWID.js +72 -0
- package/dist/{share-EZ6ERBMH.js → share-HVWH4FPF.js} +30 -30
- package/dist/{skills-BTVVNYVM.js → skills-5TYEY75Q.js} +30 -30
- package/dist/{skills-eval-UY34MNK7.js → skills-eval-CK3MD63Z.js} +114 -103
- package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-KSFYG3I6.js} +24 -24
- package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-DMVHML7P.js} +60 -57
- package/dist/{steer-2B3EQGFH.js → steer-XCD6V3EW.js} +4 -4
- package/dist/{support-L2SOL3IE.js → support-JAZL6VBR.js} +7 -7
- package/dist/system-3TDQRMZZ.js +116 -0
- package/dist/{targets-44VKGFLN.js → targets-EZKHAYRN.js} +74 -72
- package/dist/{tasks-3KODKFU7.js → tasks-SNEFHWYW.js} +18 -18
- package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-BNLFA4OF.js} +8 -7
- package/dist/{tools-3UB7TEVR.js → tools-7IM6BDCE.js} +12 -12
- package/dist/{trace-TAMIU4OJ.js → trace-C3MBGD4S.js} +16 -65
- package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
- package/dist/{uninstall-QYVRPEM4.js → uninstall-WWLOSZ42.js} +35 -10
- package/dist/{upgrade-7PMKM2JH.js → upgrade-ETK2JNSJ.js} +42 -51
- package/dist/{usage-6EQV7EQK.js → usage-S2HOB7BZ.js} +112 -102
- package/dist/{verifiers-JLITWSHU.js → verifiers-QDTEVH7R.js} +26 -24
- package/dist/{verify-T7NAEVIG.js → verify-SUKUK6XM.js} +16 -15
- package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
- package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +1 -0
- package/dist/web/client/assets/arc-Pry-7G1_.js +1 -0
- 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/array-BifhSqXX.js +1 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
- package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +129 -0
- package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +38 -0
- package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
- package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +62 -0
- package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +2 -0
- package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
- package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +1 -0
- package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
- package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +72 -0
- package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +1 -0
- package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +231 -0
- package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +1 -0
- package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +10 -0
- package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +1 -0
- package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +1 -0
- package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +1 -0
- package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +168 -0
- package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +88 -0
- package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +206 -0
- package/dist/web/client/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- 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/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
- package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
- package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +1 -0
- package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +62 -0
- package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
- package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
- package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +4 -0
- package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +30 -0
- package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +41 -0
- package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +3 -0
- package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +24 -0
- package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +24 -0
- package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +1 -0
- package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +99 -0
- 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-DjD_AAMj.js +1 -0
- package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +106 -0
- package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
- package/dist/web/client/assets/index-Dsi52apB.css +1 -0
- package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +1 -0
- package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +2 -0
- package/dist/web/client/assets/init-C-OQMol4.js +1 -0
- package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +70 -0
- package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +139 -0
- package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +89 -0
- package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
- package/dist/web/client/assets/line-BIDAcEtX.js +1 -0
- package/dist/web/client/assets/linear-SzVmGSw4.js +1 -0
- package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +7 -0
- package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +44 -0
- package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +96 -0
- package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
- package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
- package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
- package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +1 -0
- package/dist/web/client/assets/path-fybaL0A-.js +1 -0
- package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +1 -0
- package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +1 -0
- package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +39 -0
- package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
- package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
- package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
- package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
- package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
- package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
- package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
- package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
- package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
- package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
- package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
- package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
- package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
- package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
- package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
- package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
- package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
- package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
- package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
- package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
- package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
- package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
- package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
- package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
- package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
- package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
- package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
- package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
- package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
- package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
- package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +7 -0
- package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +1 -0
- package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +1 -0
- 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-CgMS4B6R.js +1 -0
- package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +84 -0
- package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +40 -0
- package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +162 -0
- package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
- package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +1 -0
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
- package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +1 -0
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
- package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +120 -0
- package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +1 -0
- package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +1 -0
- package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +34 -0
- package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +1 -0
- package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +78 -0
- package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +7 -0
- package/dist/web/client/clio-coder-logo.webp +0 -0
- package/dist/web/client/icon-192.png +0 -0
- package/dist/web/client/icon-512.png +0 -0
- package/dist/web/client/index.html +6 -0
- package/dist/web/client/manifest.webmanifest +15 -0
- package/dist/web/client/offline.css +55 -0
- package/dist/web/client/offline.html +5 -0
- package/dist/web/client/offline.js +27 -0
- package/dist/web/client/sw.js +34 -0
- package/dist/web/ops-worker.js +37 -0
- package/dist/web/reads-worker.js +1726 -0
- package/dist/web/server.js +8499 -0
- package/dist/web-EMGUGGEI.js +13 -0
- package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-6BRRVQON.js} +22 -5
- package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-XHSJTDOP.js} +120 -113
- package/dist/{with-panes-CHFC7HGI.js → with-panes-Z6BTEHMZ.js} +12 -12
- package/dist/worker/entry.js +113 -99
- package/docs/README.md +28 -27
- package/docs/architecture/acp.md +5 -9
- package/docs/architecture/alcf-provider.md +0 -3
- package/docs/architecture/architecture.md +0 -3
- package/docs/architecture/artifact-placement.md +12 -4
- package/docs/architecture/artifact-versions.md +0 -3
- package/docs/architecture/capacity-and-scheduling.md +0 -3
- package/docs/architecture/context-engine.md +0 -3
- package/docs/architecture/context-working-set.md +0 -3
- package/docs/architecture/dispatch-architecture-rationale.md +0 -3
- package/docs/architecture/dispatch-typed-intent.md +0 -3
- package/docs/architecture/evidence-and-memory.md +0 -3
- package/docs/architecture/library.md +1 -3
- package/docs/architecture/middleware-and-components.md +0 -3
- package/docs/architecture/model-catalog.md +1 -4
- package/docs/architecture/observability.md +0 -3
- package/docs/architecture/pi-boundary.md +6 -9
- package/docs/architecture/prompt-envelope-and-tools.md +37 -30
- package/docs/architecture/provider-adapter-cookbook.md +1 -4
- package/docs/architecture/safety-model.md +19 -9
- package/docs/architecture/session-lifecycle.md +10 -7
- package/docs/architecture/time-conventions.md +0 -3
- package/docs/architecture/trace-store.md +28 -20
- package/docs/architecture/tui-design.md +38 -18
- package/docs/architecture/worker-context.md +1 -3
- package/docs/architecture/worker-dispatch-mechanics.md +1 -4
- package/docs/guide/authoring-plugins.md +1 -3
- package/docs/guide/built-in-agents.md +0 -3
- package/docs/guide/commands-and-modes.md +41 -25
- package/docs/guide/configuration-and-targets.md +204 -9
- package/docs/guide/configuration-reference.md +125 -17
- package/docs/guide/environment-variables.md +2 -8
- package/docs/guide/exit-codes-and-output.md +0 -3
- package/docs/guide/extensions-and-sharing.md +0 -3
- package/docs/guide/fleet-dispatch.md +3 -5
- package/docs/guide/glossary.md +1 -4
- package/docs/guide/harness-extensions.md +0 -2
- package/docs/guide/installation-and-lifecycle.md +3 -6
- package/docs/guide/interop.md +0 -2
- package/docs/guide/panes-and-files.md +0 -3
- package/docs/guide/plugins.md +0 -3
- package/docs/guide/proactive-memory.md +0 -3
- package/docs/guide/resource-library.md +1 -3
- package/docs/guide/skills-marketplace.md +0 -2
- package/docs/guide/tool-usage.md +166 -67
- package/docs/guide/troubleshooting.md +1 -4
- package/docs/history/config-knobs-audit.md +0 -3
- package/docs/history/release-cut-checklist.md +0 -3
- package/docs/process/development-pipeline.md +0 -3
- package/docs/process/documentation-coverage.md +3 -3
- package/docs/process/documentation-guide.md +16 -22
- package/docs/process/eval-runner.md +0 -3
- package/docs/process/evals-internal.md +0 -3
- package/docs/process/evolution.md +0 -3
- package/docs/process/fleet-demo-runbook.md +6 -9
- package/docs/process/git-commit-provenance.md +0 -3
- package/docs/process/performance-methodology.md +1 -4
- package/docs/process/release-cut-checklist.md +114 -221
- package/docs/process/scientific-validation.md +23 -6
- package/docs/process/tool-audit-v0.4.9.md +357 -0
- package/library/registry.yaml +2 -2
- package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
- package/library/skills/meta/clio-coder-test/evals.md +16 -2
- package/library/skills/meta/clio-coder-test/plugin.json +1 -1
- package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
- package/library/skills/registry.yaml +2 -2
- package/library/skills/skill-marketplace.json +1 -1
- package/package.json +13 -11
- package/src/cli/argv.ts +31 -0
- package/src/cli/clio.ts +17 -13
- package/src/cli/config.ts +4 -0
- package/src/cli/docs.ts +65 -328
- package/src/cli/doctor-panes.ts +1 -1
- package/src/cli/doctor.ts +3 -1
- package/src/cli/index.ts +17 -2
- package/src/cli/mcp.ts +106 -0
- package/src/cli/skills-eval.ts +8 -2
- package/src/cli/trace.ts +4 -65
- package/src/cli/uninstall.ts +26 -0
- package/src/cli/upgrade.ts +34 -38
- package/src/cli/usage.ts +3 -0
- package/src/cli/verifiers.ts +1 -1
- package/src/cli/web.ts +79 -0
- package/src/core/bash-exec.ts +27 -4
- package/src/core/bus-events.ts +3 -4
- package/src/core/config.ts +73 -1
- package/src/core/defaults.ts +10 -1
- package/src/core/domain-loader.ts +37 -28
- 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 +16 -12
- package/src/core/tool-names.ts +33 -12
- package/src/domains/agents/contract.ts +1 -1
- package/src/domains/agents/extension.ts +18 -10
- package/src/domains/config/extension.ts +5 -4
- 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 +206 -26
- 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/index.ts +1 -0
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-findings.ts +3 -4
- package/src/domains/dispatch/receipt-integrity.ts +3 -0
- package/src/domains/dispatch/reservation-store.ts +7 -9
- package/src/domains/dispatch/route-facts.ts +1 -1
- package/src/domains/dispatch/state.ts +4 -5
- package/src/domains/dispatch/types.ts +3 -1
- package/src/domains/eval/metrics/tracked.ts +22 -2
- package/src/domains/evidence/build.ts +35 -7
- package/src/domains/extensions/operator-runtime.ts +3 -1
- 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/middleware/hooks.ts +2 -2
- 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/background-memory-usage.ts +3 -0
- package/src/domains/observability/compaction-usage.ts +2 -0
- package/src/domains/observability/contract.ts +7 -3
- package/src/domains/observability/cost.ts +5 -0
- package/src/domains/observability/evidence-index.ts +2 -2
- package/src/domains/observability/extension.ts +1 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -0
- package/src/domains/observability/projection.ts +10 -0
- package/src/domains/observability/trace-store.ts +65 -5
- package/src/domains/prompts/compiler.ts +41 -23
- package/src/domains/prompts/extension.ts +4 -17
- 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/cache-deployment.ts +147 -0
- package/src/domains/providers/catalog.ts +12 -7
- package/src/domains/providers/extension.ts +27 -5
- package/src/domains/providers/index.ts +6 -1
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
- package/src/domains/providers/plugins.ts +3 -13
- package/src/domains/providers/probe/http.ts +44 -59
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +4 -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/providers/types/target-descriptor.ts +17 -0
- 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 +29 -3
- 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/entries.ts +1 -0
- 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/domains/session/usage.ts +6 -7
- package/src/engine/acp/server.ts +11 -0
- package/src/engine/ai.ts +2 -0
- package/src/engine/apis/openai-completions.ts +17 -4
- package/src/engine/loop-guard.ts +7 -0
- package/src/engine/prewarm.ts +232 -0
- package/src/engine/provider-diagnostics.ts +6 -1
- 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 +38 -18
- package/src/interactive/chat-loop-messages.ts +3 -0
- package/src/interactive/chat-loop-policy.ts +1 -0
- package/src/interactive/chat-loop.ts +10 -12
- 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/prewarm.ts +11 -197
- 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/session-usage-reseed.ts +2 -0
- package/src/interactive/side-question.ts +2 -0
- 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-context.ts +1 -0
- package/src/interactive/turn-persistence.ts +9 -1
- package/src/interactive/turn-prewarm.ts +126 -19
- package/src/interactive/turn-recovery.ts +2 -1
- package/src/interactive/turn-runtime.ts +36 -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 +80 -11
- 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 +106 -8
- 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/src/worker/spec-contract.ts +27 -0
- package/dist/chunk-B6UM3OZC.js +0 -15
- package/dist/chunk-GJ24ODAX.js +0 -196
- package/dist/chunk-HRAKUPIH.js +0 -57
- package/dist/docs-BL7ROUFN.js +0 -292
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
1
2
|
import type { SessionContract } from "../../domains/session/contract.js";
|
|
2
3
|
import type { TreeSnapshot, TreeSnapshotNode } from "../../domains/session/tree/navigator.js";
|
|
3
4
|
import {
|
|
@@ -21,17 +22,19 @@ const VISIBLE_ROWS = 16;
|
|
|
21
22
|
* /tree navigator overlay. Behaviors:
|
|
22
23
|
* - One row per node, indented two spaces per branch level (not per message)
|
|
23
24
|
* - Shift+T toggles operator-local timestamps on/off
|
|
25
|
+
* - `p` filters to nodes whose session cwd matches the current cwd
|
|
26
|
+
* - `s` cycles between tree order and most recent first
|
|
24
27
|
* - `e` enters label edit submode (Enter commits, Esc cancels)
|
|
25
28
|
* - Enter on a row switches the active append point to that turn id
|
|
26
29
|
* - Esc closes the overlay
|
|
27
30
|
*
|
|
28
|
-
* Cwd-toggle (`p`) and sort-order (`s`) are not implemented.
|
|
29
|
-
*
|
|
30
31
|
* The overlay queries `session.tree()` on open and after any mutation so
|
|
31
32
|
* label edits are reflected without a close/reopen cycle.
|
|
32
33
|
*/
|
|
33
34
|
export interface OpenTreeOverlayDeps {
|
|
34
|
-
session: SessionContract
|
|
35
|
+
session: Pick<SessionContract, "tree" | "editLabel">;
|
|
36
|
+
/** The current workspace directory. Defaults to the process cwd. */
|
|
37
|
+
cwd?: string;
|
|
35
38
|
onSwitchTurn: (turnId: string) => void;
|
|
36
39
|
onClose: () => void;
|
|
37
40
|
}
|
|
@@ -204,6 +207,8 @@ export class TreeOverlayView implements Component {
|
|
|
204
207
|
private highlight = 0;
|
|
205
208
|
private scrollTop = 0;
|
|
206
209
|
private showTimestamps = false;
|
|
210
|
+
private currentCwdOnly = false;
|
|
211
|
+
private sortOrder: "tree" | "recent" = "tree";
|
|
207
212
|
private submode: Submode = "browse";
|
|
208
213
|
private labelBuffer = "";
|
|
209
214
|
private readonly labelInput = new Input();
|
|
@@ -221,7 +226,8 @@ export class TreeOverlayView implements Component {
|
|
|
221
226
|
initial: TreeSnapshot | null,
|
|
222
227
|
) {
|
|
223
228
|
this.snapshot = initial;
|
|
224
|
-
this.rows =
|
|
229
|
+
this.rows = [];
|
|
230
|
+
this.rebuildRows();
|
|
225
231
|
}
|
|
226
232
|
|
|
227
233
|
private invalidateLayout(): void {
|
|
@@ -242,15 +248,27 @@ export class TreeOverlayView implements Component {
|
|
|
242
248
|
return this.rows[this.highlight] ?? null;
|
|
243
249
|
}
|
|
244
250
|
|
|
251
|
+
private rebuildRows(): void {
|
|
252
|
+
const selectedId = this.currentRow()?.node.id;
|
|
253
|
+
const snapshot = this.snapshot;
|
|
254
|
+
const matchesCwd = snapshot?.meta.cwd && resolve(snapshot.meta.cwd) === resolve(this.deps.cwd ?? process.cwd());
|
|
255
|
+
this.rows = snapshot && (!this.currentCwdOnly || matchesCwd) ? flattenTreeSnapshot(snapshot) : [];
|
|
256
|
+
if (this.sortOrder === "recent") {
|
|
257
|
+
this.rows.sort((a, b) => Date.parse(b.node.at) - Date.parse(a.node.at));
|
|
258
|
+
this.rows = this.rows.map((row) => ({ ...row, depth: 0 }));
|
|
259
|
+
}
|
|
260
|
+
const selectedIndex = this.rows.findIndex((row) => row.node.id === selectedId);
|
|
261
|
+
this.highlight = selectedIndex < 0 ? 0 : selectedIndex;
|
|
262
|
+
this.invalidateLayout();
|
|
263
|
+
}
|
|
264
|
+
|
|
245
265
|
private refresh(): void {
|
|
246
266
|
try {
|
|
247
267
|
this.snapshot = this.deps.session.tree();
|
|
248
|
-
this.rows = flattenTreeSnapshot(this.snapshot);
|
|
249
268
|
} catch {
|
|
250
269
|
this.snapshot = null;
|
|
251
|
-
this.rows = [];
|
|
252
270
|
}
|
|
253
|
-
this.
|
|
271
|
+
this.rebuildRows();
|
|
254
272
|
}
|
|
255
273
|
|
|
256
274
|
render(width: number): string[] {
|
|
@@ -262,7 +280,14 @@ export class TreeOverlayView implements Component {
|
|
|
262
280
|
if (this.rows.length === 0) {
|
|
263
281
|
// The overlay navigates the CURRENT session's turn tree; an empty
|
|
264
282
|
// tree means no turns yet, not a missing session list.
|
|
265
|
-
lines.push(
|
|
283
|
+
lines.push(
|
|
284
|
+
theme.fg(
|
|
285
|
+
"muted",
|
|
286
|
+
this.currentCwdOnly && this.snapshot && Object.keys(this.snapshot.nodesById).length > 0
|
|
287
|
+
? "(no turns match the current cwd; press p to show all)"
|
|
288
|
+
: "(no turns in this session yet)",
|
|
289
|
+
),
|
|
290
|
+
);
|
|
266
291
|
} else {
|
|
267
292
|
const end = Math.min(this.rows.length, this.scrollTop + VISIBLE_ROWS);
|
|
268
293
|
for (let i = this.scrollTop; i < end; i++) {
|
|
@@ -303,6 +328,8 @@ export class TreeOverlayView implements Component {
|
|
|
303
328
|
{ key: "↑↓", verb: "move" },
|
|
304
329
|
{ key: "Enter", verb: "switch" },
|
|
305
330
|
{ key: "e", verb: "label" },
|
|
331
|
+
{ key: "p", verb: `cwd:${this.currentCwdOnly ? "current" : "all"}` },
|
|
332
|
+
{ key: "s", verb: this.sortOrder },
|
|
306
333
|
{ key: "Shift+T", verb: `ts:${tsLabel}` },
|
|
307
334
|
]);
|
|
308
335
|
}
|
|
@@ -328,7 +355,17 @@ export class TreeOverlayView implements Component {
|
|
|
328
355
|
this.deps.onClose();
|
|
329
356
|
return;
|
|
330
357
|
}
|
|
331
|
-
|
|
358
|
+
if (data === "p") {
|
|
359
|
+
this.currentCwdOnly = !this.currentCwdOnly;
|
|
360
|
+
this.rebuildRows();
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
if (data === "s") {
|
|
364
|
+
this.sortOrder = this.sortOrder === "tree" ? "recent" : "tree";
|
|
365
|
+
this.rebuildRows();
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
// Filtering and sorting remain available when the visible list is empty.
|
|
332
369
|
if (this.rows.length === 0) return;
|
|
333
370
|
// Arrows: CSI A/B for up/down.
|
|
334
371
|
if (matchesKey(data, "up")) {
|
|
@@ -406,7 +443,7 @@ export class TreeOverlayView implements Component {
|
|
|
406
443
|
}
|
|
407
444
|
}
|
|
408
445
|
|
|
409
|
-
function loadInitialSnapshot(session:
|
|
446
|
+
function loadInitialSnapshot(session: OpenTreeOverlayDeps["session"]): TreeSnapshot | null {
|
|
410
447
|
try {
|
|
411
448
|
return session.tree();
|
|
412
449
|
} catch {
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* ladder *before* the pane is split: `openUtilityPane` delivers its command by
|
|
7
7
|
* sending `exec <argv>` into the pane's shell, so a binary that is not there
|
|
8
8
|
* kills the pane the instant it appears, and the operator sees a flicker
|
|
9
|
-
* instead of an install hint
|
|
9
|
+
* instead of an install hint. Every
|
|
10
10
|
* mutation is scoped to panes Clio created, because the contract's registry
|
|
11
11
|
* refuses anything else.
|
|
12
12
|
*
|
|
@@ -1,197 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
*
|
|
13
|
-
* The payload is not hand-assembled. It goes through `streamSimple`, the same
|
|
14
|
-
* dispatcher `createEngineAgent` hands pi-agent-core as its `streamFn`, with the
|
|
15
|
-
* same system prompt, the same tool schemas, the same replayed messages, and the
|
|
16
|
-
* same thinking level, so `withSamplingOverrides`, the thinking composition, and
|
|
17
|
-
* `cache_prompt` resolve exactly as they do for a turn. Any byte that differs
|
|
18
|
-
* ahead of the user turn would defeat the purpose.
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import type { BackendCompletionTimings } from "../core/cache-telemetry.js";
|
|
22
|
-
import { streamSimple } from "../engine/ai.js";
|
|
23
|
-
import type { AgentMessage, AgentTool, EngineModel, Usage } from "../engine/types.js";
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* The one user message appended so the chat template renders the prefix up to
|
|
27
|
-
* the user turn. One character: it has to exist for the template to close the
|
|
28
|
-
* prefix, and everything after the last shared byte is re-evaluated by the real
|
|
29
|
-
* turn anyway.
|
|
30
|
-
*/
|
|
31
|
-
export const PREWARM_USER_TEXT = ".";
|
|
32
|
-
|
|
33
|
-
/** Output budget for the round. The tokens the model produces are not the point. */
|
|
34
|
-
export const PREWARM_MAX_TOKENS = 1;
|
|
35
|
-
|
|
36
|
-
/** Which trigger asked for the pre-warm. Recorded on the ledger entry. */
|
|
37
|
-
export type PrewarmTrigger = "session-start" | "resume" | "compaction";
|
|
38
|
-
|
|
39
|
-
export interface PrewarmContext {
|
|
40
|
-
systemPrompt: string;
|
|
41
|
-
messages: ReadonlyArray<AgentMessage>;
|
|
42
|
-
tools: ReadonlyArray<AgentTool>;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* The roles pi-agent-core's default `convertToLlm` keeps when it turns the
|
|
47
|
-
* agent's message list into provider messages. The pre-warm applies the same
|
|
48
|
-
* filter so its message array is the one a turn would send, not the agent's
|
|
49
|
-
* internal list.
|
|
50
|
-
*/
|
|
51
|
-
const LLM_MESSAGE_ROLES: ReadonlySet<string> = new Set(["user", "assistant", "toolResult"]);
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* The prefix of the next turn's request: system prompt, tool schemas, and the
|
|
55
|
-
* replayed conversation, with no user turn yet.
|
|
56
|
-
*/
|
|
57
|
-
function prewarmPrefix(state: {
|
|
58
|
-
systemPrompt: string;
|
|
59
|
-
messages: ReadonlyArray<AgentMessage>;
|
|
60
|
-
tools: ReadonlyArray<AgentTool>;
|
|
61
|
-
}): PrewarmContext {
|
|
62
|
-
return {
|
|
63
|
-
systemPrompt: state.systemPrompt,
|
|
64
|
-
messages: state.messages.filter((message) => LLM_MESSAGE_ROLES.has((message as { role?: string }).role ?? "")),
|
|
65
|
-
tools: [...state.tools],
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export interface PrewarmRoundInput {
|
|
70
|
-
model: EngineModel;
|
|
71
|
-
/** Live agent state the next turn would send. Read-only; the round copies it. */
|
|
72
|
-
state: {
|
|
73
|
-
systemPrompt: string;
|
|
74
|
-
messages: ReadonlyArray<AgentMessage>;
|
|
75
|
-
tools: ReadonlyArray<AgentTool>;
|
|
76
|
-
thinkingLevel: string;
|
|
77
|
-
};
|
|
78
|
-
apiKey?: string;
|
|
79
|
-
signal?: AbortSignal;
|
|
80
|
-
/** Test seam. Production uses the engine dispatcher a turn runs on. */
|
|
81
|
-
streamFn?: typeof streamSimple;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export interface PrewarmRoundResult {
|
|
85
|
-
/** True when the operator submitted (or the session moved) before the round settled. */
|
|
86
|
-
aborted: boolean;
|
|
87
|
-
/** Provider usage for the round; null when the backend reported none. */
|
|
88
|
-
usage: Usage | null;
|
|
89
|
-
/** Backend prefill and prediction timings when the server reported them. */
|
|
90
|
-
backend: BackendCompletionTimings | null;
|
|
91
|
-
/** Wall clock the round spent, in the shape a turn's assistant entry uses. */
|
|
92
|
-
timing: { ttftMs: number | null; apiMs: number };
|
|
93
|
-
/** Provider error text when the round failed outright. */
|
|
94
|
-
errorMessage: string | null;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function usageOf(message: unknown): Usage | null {
|
|
98
|
-
if (message === null || typeof message !== "object") return null;
|
|
99
|
-
const usage = (message as { usage?: unknown }).usage;
|
|
100
|
-
return usage !== null && typeof usage === "object" ? (usage as Usage) : null;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function backendOf(message: unknown): BackendCompletionTimings | null {
|
|
104
|
-
if (message === null || typeof message !== "object") return null;
|
|
105
|
-
const backend = (message as { backendTimings?: unknown }).backendTimings;
|
|
106
|
-
return backend !== null && typeof backend === "object" ? (backend as BackendCompletionTimings) : null;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Prompt tokens the backend actually processed for one pre-warm. The server's
|
|
111
|
-
* own prompt count is authoritative when it reported one; otherwise the
|
|
112
|
-
* provider usage prompt side, cached tokens folded in, is the honest figure.
|
|
113
|
-
* Null when neither exists, which is different from a measured zero.
|
|
114
|
-
*/
|
|
115
|
-
export function prewarmPromptTokens(result: Pick<PrewarmRoundResult, "usage" | "backend">): number | null {
|
|
116
|
-
if (result.backend) return result.backend.promptTokens;
|
|
117
|
-
const usage = result.usage;
|
|
118
|
-
if (!usage) return null;
|
|
119
|
-
const total = (usage.input || 0) + (usage.cacheRead || 0) + (usage.cacheWrite || 0);
|
|
120
|
-
return total > 0 ? total : null;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Send the prefix and wait for the backend to acknowledge it. Resolves rather
|
|
125
|
-
* than rejects on a provider failure: a pre-warm is an optimization, and a
|
|
126
|
-
* backend that refuses it must not be able to break the session it was warming.
|
|
127
|
-
*/
|
|
128
|
-
export async function runPrewarmRound(input: PrewarmRoundInput): Promise<PrewarmRoundResult> {
|
|
129
|
-
const prefix = prewarmPrefix(input.state);
|
|
130
|
-
const context = {
|
|
131
|
-
systemPrompt: prefix.systemPrompt,
|
|
132
|
-
messages: [
|
|
133
|
-
...prefix.messages,
|
|
134
|
-
{ role: "user", content: [{ type: "text", text: PREWARM_USER_TEXT }], timestamp: Date.now() },
|
|
135
|
-
],
|
|
136
|
-
tools: prefix.tools,
|
|
137
|
-
};
|
|
138
|
-
// pi-agent-core maps `thinkingLevel: "off"` onto an absent `reasoning`; the
|
|
139
|
-
// pre-warm has to make the same mapping or the thinking composition resolves
|
|
140
|
-
// against a different level and the rendered template moves.
|
|
141
|
-
const options: Record<string, unknown> = { maxTokens: PREWARM_MAX_TOKENS };
|
|
142
|
-
if (input.state.thinkingLevel !== "off") options.reasoning = input.state.thinkingLevel;
|
|
143
|
-
if (input.apiKey !== undefined) options.apiKey = input.apiKey;
|
|
144
|
-
if (input.signal !== undefined) options.signal = input.signal;
|
|
145
|
-
|
|
146
|
-
const send = input.streamFn ?? streamSimple;
|
|
147
|
-
const startedAt = performance.now();
|
|
148
|
-
let firstDeltaAt: number | null = null;
|
|
149
|
-
const elapsed = (): number => Math.round(Math.max(0, performance.now() - startedAt));
|
|
150
|
-
const ttft = (): number | null => (firstDeltaAt === null ? null : Math.round(Math.max(0, firstDeltaAt - startedAt)));
|
|
151
|
-
|
|
152
|
-
try {
|
|
153
|
-
const events = send(
|
|
154
|
-
input.model,
|
|
155
|
-
context as unknown as Parameters<typeof streamSimple>[1],
|
|
156
|
-
options as unknown as Parameters<typeof streamSimple>[2],
|
|
157
|
-
);
|
|
158
|
-
for await (const event of events) {
|
|
159
|
-
if (firstDeltaAt === null && event.type !== "start") firstDeltaAt = performance.now();
|
|
160
|
-
if (event.type === "done") {
|
|
161
|
-
return {
|
|
162
|
-
aborted: false,
|
|
163
|
-
usage: usageOf(event.message),
|
|
164
|
-
backend: backendOf(event.message),
|
|
165
|
-
timing: { ttftMs: ttft(), apiMs: elapsed() },
|
|
166
|
-
errorMessage: null,
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
if (event.type === "error") {
|
|
170
|
-
const failed = event.error as { stopReason?: unknown; errorMessage?: unknown };
|
|
171
|
-
const aborted = event.reason === "aborted" || failed.stopReason === "aborted" || input.signal?.aborted === true;
|
|
172
|
-
return {
|
|
173
|
-
aborted,
|
|
174
|
-
usage: usageOf(event.error),
|
|
175
|
-
backend: backendOf(event.error),
|
|
176
|
-
timing: { ttftMs: ttft(), apiMs: elapsed() },
|
|
177
|
-
errorMessage: aborted ? null : typeof failed.errorMessage === "string" ? failed.errorMessage : "pre-warm failed",
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
} catch (error) {
|
|
182
|
-
return {
|
|
183
|
-
aborted: input.signal?.aborted === true,
|
|
184
|
-
usage: null,
|
|
185
|
-
backend: null,
|
|
186
|
-
timing: { ttftMs: ttft(), apiMs: elapsed() },
|
|
187
|
-
errorMessage: input.signal?.aborted === true ? null : error instanceof Error ? error.message : String(error),
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
return {
|
|
191
|
-
aborted: input.signal?.aborted === true,
|
|
192
|
-
usage: null,
|
|
193
|
-
backend: null,
|
|
194
|
-
timing: { ttftMs: ttft(), apiMs: elapsed() },
|
|
195
|
-
errorMessage: null,
|
|
196
|
-
};
|
|
197
|
-
}
|
|
1
|
+
/** Compatibility entry point; engine preparation is shared with headless callers. */
|
|
2
|
+
export {
|
|
3
|
+
PREWARM_MAX_TOKENS,
|
|
4
|
+
PREWARM_USER_TEXT,
|
|
5
|
+
type PrewarmContext,
|
|
6
|
+
type PrewarmRoundInput,
|
|
7
|
+
type PrewarmRoundResult,
|
|
8
|
+
type PrewarmTrigger,
|
|
9
|
+
prewarmPromptTokens,
|
|
10
|
+
runPrewarmRound,
|
|
11
|
+
} from "../engine/prewarm.js";
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { stripVTControlCharacters } from "node:util";
|
|
2
|
+
import { redactSecretsText } from "../../domains/evidence/redact.js";
|
|
3
|
+
import { redactSecretString } from "../../domains/safety/redaction.js";
|
|
4
|
+
|
|
5
|
+
const SCAN_LIMIT = 8_192;
|
|
6
|
+
const DISPLAY_LIMIT = 600;
|
|
7
|
+
const ROUTE_ADVICE_TAIL = 1_024;
|
|
8
|
+
|
|
9
|
+
/** Discard incomplete control sequences at the scan boundary, including their payload. */
|
|
10
|
+
function terminalSafePrefix(value: string, limit: number): string {
|
|
11
|
+
const end = Math.min(value.length, limit);
|
|
12
|
+
const parts: string[] = [];
|
|
13
|
+
let start = 0;
|
|
14
|
+
let i = 0;
|
|
15
|
+
while (i < end) {
|
|
16
|
+
const code = value.charCodeAt(i);
|
|
17
|
+
if (code !== 27 && !(code >= 0x80 && code <= 0x9f)) {
|
|
18
|
+
i++;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
parts.push(value.slice(start, i));
|
|
22
|
+
const introducer = code === 27 ? value.charCodeAt(++i) : code;
|
|
23
|
+
i++;
|
|
24
|
+
if (introducer === 91 || introducer === 0x9b) {
|
|
25
|
+
while (i < end) {
|
|
26
|
+
const next = value.charCodeAt(i++);
|
|
27
|
+
if (next >= 0x40 && next <= 0x7e) break;
|
|
28
|
+
}
|
|
29
|
+
} else if ([93, 80, 88, 94, 95, 0x9d, 0x90, 0x98, 0x9e, 0x9f].includes(introducer)) {
|
|
30
|
+
while (i < end) {
|
|
31
|
+
const next = value.charCodeAt(i++);
|
|
32
|
+
if (next === 7 || next === 0x9c) break;
|
|
33
|
+
if (next === 27 && i < end && value.charCodeAt(i) === 92) {
|
|
34
|
+
i++;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
start = i;
|
|
40
|
+
}
|
|
41
|
+
parts.push(value.slice(start, end));
|
|
42
|
+
return stripVTControlCharacters(parts.join(""));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Available evidence is sanitized and redacted only when explicitly inspected. */
|
|
46
|
+
export function providerErrorEvidence(value: string, scanLimit = value.length): string {
|
|
47
|
+
return redactSecretsText(
|
|
48
|
+
redactSecretString(terminalSafePrefix(value, scanLimit)).replace(
|
|
49
|
+
/(\b(?:authorization["']?\s*[:=]\s*["']?\s*)?(?:Bearer|Basic)\s+)[^\s"'<>]+/gi,
|
|
50
|
+
"$1[redacted]",
|
|
51
|
+
),
|
|
52
|
+
{ count: 0 },
|
|
53
|
+
).replace(/[\p{Cc}\p{Cf}]/gu, (char) => (char === "\n" || char === "\t" ? char : " "));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** A bounded projection; never use this to replace a persisted diagnostic. */
|
|
57
|
+
export function presentProviderError(value: string): string {
|
|
58
|
+
const available = providerErrorEvidence(value, SCAN_LIMIT);
|
|
59
|
+
// Preserve the actual Clio wrapper suffix; never infer a retry policy from
|
|
60
|
+
// provider error codes. A restored body can push this advice past the scan
|
|
61
|
+
// window, so a long diagnostic is matched on its bounded tail instead.
|
|
62
|
+
const beyondScan = value.length > SCAN_LIMIT;
|
|
63
|
+
const routeParts = (beyondScan ? providerErrorEvidence(value.slice(-ROUTE_ADVICE_TAIL)) : available).match(
|
|
64
|
+
/\n\n((LiteLLM route [^\n]+ failed\.) (Clio did not retry or substitute another model); (select a different route with \/model, then resend\.))$/,
|
|
65
|
+
);
|
|
66
|
+
const routeAdvice = routeParts?.[1];
|
|
67
|
+
const sample =
|
|
68
|
+
routeAdvice && !beyondScan ? available.slice(0, available.length - routeAdvice.length).trimEnd() : available;
|
|
69
|
+
let summary = sample;
|
|
70
|
+
const jsonStart = sample.indexOf("{");
|
|
71
|
+
const html = /<!doctype\s+html|<html\b/i.test(sample);
|
|
72
|
+
if (html) {
|
|
73
|
+
const title = sample.match(/<title[^>]*>([^<]*)<\/title>/i)?.[1];
|
|
74
|
+
const prefix = sample.slice(0, sample.indexOf("<")).trim();
|
|
75
|
+
summary = [
|
|
76
|
+
prefix,
|
|
77
|
+
title,
|
|
78
|
+
routeAdvice ? "" : "Provider returned an HTML error page. Check the provider or gateway endpoint.",
|
|
79
|
+
]
|
|
80
|
+
.filter(Boolean)
|
|
81
|
+
.join("; ");
|
|
82
|
+
} else if (jsonStart >= 0) {
|
|
83
|
+
// Decode only quoted diagnostic strings, never parse and round numeric
|
|
84
|
+
// source facts. The scan and every allocation are bounded by SCAN_LIMIT.
|
|
85
|
+
const fields = [...sample.matchAll(/"(?:message|detail|type|code)"\s*:\s*"((?:[^"\\]|\\.)*)/g)].map((match) => {
|
|
86
|
+
const quoted = match[1];
|
|
87
|
+
if (quoted === undefined) return "";
|
|
88
|
+
try {
|
|
89
|
+
// A bounded prefix of an unfinished quoted field is still useful
|
|
90
|
+
// prose. The matcher excludes a dangling escape at the boundary.
|
|
91
|
+
const decoded: unknown = JSON.parse(`"${quoted}"`);
|
|
92
|
+
return typeof decoded === "string" ? providerErrorEvidence(decoded) : "";
|
|
93
|
+
} catch {
|
|
94
|
+
return "";
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
if (fields.some(Boolean))
|
|
98
|
+
summary = [sample.slice(0, jsonStart).trim(), ...new Set(fields)].filter(Boolean).join("; ");
|
|
99
|
+
}
|
|
100
|
+
const status =
|
|
101
|
+
sample.match(/\b(?:HTTP(?:\/\d(?:\.\d)?)?\s*|status(?:_code)?["']?\s*[:=]\s*)([45]\d\d)\b/i)?.[1] ??
|
|
102
|
+
sample.match(/"(?:status|status_?code)"\s*:\s*([45]\d{2})(?=\s*[,}])/i)?.[1] ??
|
|
103
|
+
sample.match(/"error"\s*:\s*\{[^{}]*?"code"\s*:\s*([45]\d{2})(?=\s*[,}])/i)?.[1];
|
|
104
|
+
if (status && !summary.includes(status)) summary = `HTTP ${status}; ${summary}`;
|
|
105
|
+
summary = summary.replace(/\s+/g, " ").trim();
|
|
106
|
+
if (routeAdvice) {
|
|
107
|
+
// Keep route recovery ahead of long body detail so row clipping cannot
|
|
108
|
+
// spend the entire primary preview on the provider payload.
|
|
109
|
+
const prefix = summary.slice(0, 60);
|
|
110
|
+
const identity = routeParts?.[2];
|
|
111
|
+
const policy = routeParts?.[3];
|
|
112
|
+
const remedy = routeParts?.[4];
|
|
113
|
+
const advice = identity && policy && remedy ? `${remedy} ${policy}. ${identity}` : routeAdvice;
|
|
114
|
+
summary = `${prefix}${summary.length > 60 ? " ..." : ""}; ${advice}`;
|
|
115
|
+
}
|
|
116
|
+
const shortened = summary.length > DISPLAY_LIMIT || value.length > SCAN_LIMIT || summary !== sample.trim();
|
|
117
|
+
return `${summary.slice(0, DISPLAY_LIMIT)}${shortened ? " ... [available diagnostic: /view transcript]" : ""}`;
|
|
118
|
+
}
|
|
@@ -1,32 +1,30 @@
|
|
|
1
|
+
import { truncateToWidth, wrapTextWithAnsi } from "../../engine/tui.js";
|
|
1
2
|
import type { RetryStatusPayload } from "../chat-loop.js";
|
|
3
|
+
import { clioTheme } from "../theme/index.js";
|
|
4
|
+
import type { TranscriptDetailPolicy } from "../transcript-detail.js";
|
|
2
5
|
import { styleTaggedNotice } from "./notice.js";
|
|
6
|
+
import { previewBudget, previewRows } from "./preview.js";
|
|
7
|
+
import { presentProviderError, providerErrorEvidence } from "./provider-error.js";
|
|
3
8
|
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
return `${characters.slice(0, RETRY_ERROR_MAX_CHARS).join("").trimEnd()}${RETRY_ERROR_TRUNCATION_MARKER}`;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function rawRetryStatus(status: RetryStatusPayload): string {
|
|
14
|
-
// Both live and replay renderers wrap this notice to their terminal width, so
|
|
15
|
-
// ordinary errors keep their complete remedy. Raw provider failures can also
|
|
16
|
-
// be an HTML proxy page, though; keep a generous ceiling so one retry does not
|
|
17
|
-
// turn that page into hundreds of transcript rows.
|
|
18
|
-
const suffix = status.errorMessage ? `: ${boundedRetryError(status.errorMessage)}` : "";
|
|
9
|
+
function rawRetryStatus(status: RetryStatusPayload, unbounded: boolean): string {
|
|
10
|
+
const showError = unbounded || (status.phase !== "waiting" && status.phase !== "retrying");
|
|
11
|
+
const suffix =
|
|
12
|
+
showError && status.errorMessage
|
|
13
|
+
? `: ${unbounded ? providerErrorEvidence(status.errorMessage) : presentProviderError(status.errorMessage)}`
|
|
14
|
+
: "";
|
|
19
15
|
if (status.phase === "waiting") {
|
|
20
|
-
return `[retry]
|
|
16
|
+
return `[retry] provider retry ${status.attempt}/${status.maxAttempts} in ${status.seconds ?? 0}s${suffix}`;
|
|
21
17
|
}
|
|
22
18
|
if (status.phase === "scheduled") {
|
|
23
19
|
const seconds = Math.ceil((status.delayMs ?? 0) / 1000);
|
|
24
|
-
return `[retry]
|
|
20
|
+
return `[retry] provider retry ${status.attempt}/${status.maxAttempts} scheduled in ${seconds}s${suffix}`;
|
|
25
21
|
}
|
|
26
|
-
if (status.phase === "retrying")
|
|
27
|
-
|
|
28
|
-
if (status.phase === "
|
|
29
|
-
|
|
22
|
+
if (status.phase === "retrying")
|
|
23
|
+
return `[retry] provider retry ${status.attempt}/${status.maxAttempts} running${suffix}`;
|
|
24
|
+
if (status.phase === "cancelled")
|
|
25
|
+
return `[retry] provider retry cancelled (${status.attempt}/${status.maxAttempts})${suffix}`;
|
|
26
|
+
if (status.phase === "exhausted") return `[retry] provider retry exhausted (${status.attempt})${suffix}`;
|
|
27
|
+
return `[retry] provider retry recovered after ${status.attempt} attempt(s)`;
|
|
30
28
|
}
|
|
31
29
|
|
|
32
30
|
/**
|
|
@@ -34,6 +32,44 @@ function rawRetryStatus(status: RetryStatusPayload): string {
|
|
|
34
32
|
* renders in warning and the body in muted via the shared notice styler, so the
|
|
35
33
|
* live retry line and the replayed one read identically.
|
|
36
34
|
*/
|
|
37
|
-
export function formatRetryStatus(status: RetryStatusPayload): string {
|
|
38
|
-
return styleTaggedNotice(rawRetryStatus(status));
|
|
35
|
+
export function formatRetryStatus(status: RetryStatusPayload, unbounded = false): string {
|
|
36
|
+
return styleTaggedNotice(rawRetryStatus(status, unbounded));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Reserve diagnosis space even when a short terminal permits only two rows. */
|
|
40
|
+
export function renderRetryStatus(
|
|
41
|
+
status: RetryStatusPayload,
|
|
42
|
+
width: number,
|
|
43
|
+
detail: TranscriptDetailPolicy,
|
|
44
|
+
unbounded = false,
|
|
45
|
+
terminalRows = 40,
|
|
46
|
+
): string[] {
|
|
47
|
+
if (unbounded) return wrapTextWithAnsi(formatRetryStatus(status, true), width);
|
|
48
|
+
const limit = previewBudget(detail.errorRows, terminalRows);
|
|
49
|
+
const { errorMessage, ...heading } = status;
|
|
50
|
+
if (!errorMessage || status.phase === "waiting" || status.phase === "retrying" || status.phase === "recovered") {
|
|
51
|
+
return previewRows(wrapTextWithAnsi(formatRetryStatus(heading), width), limit, width);
|
|
52
|
+
}
|
|
53
|
+
// One heading row leaves room for the failure itself, not just a View hint.
|
|
54
|
+
const headingRow = truncateToWidth(formatRetryStatus(heading), width);
|
|
55
|
+
const diagnosis = presentProviderError(errorMessage);
|
|
56
|
+
const rows = wrapTextWithAnsi(diagnosis, width);
|
|
57
|
+
if (limit === 2 && rows.length > 1) {
|
|
58
|
+
const hint = " /view";
|
|
59
|
+
return [
|
|
60
|
+
headingRow,
|
|
61
|
+
clioTheme().fg(
|
|
62
|
+
"muted",
|
|
63
|
+
truncateToWidth(`${truncateToWidth(diagnosis, Math.max(1, width - hint.length))}${hint}`, width),
|
|
64
|
+
),
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
return [
|
|
68
|
+
headingRow,
|
|
69
|
+
...previewRows(
|
|
70
|
+
rows.map((row) => clioTheme().fg("muted", row)),
|
|
71
|
+
limit - 1,
|
|
72
|
+
width,
|
|
73
|
+
),
|
|
74
|
+
];
|
|
39
75
|
}
|