@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,4 +1,5 @@
|
|
|
1
1
|
import { isAbsolute, relative, resolve } from "node:path";
|
|
2
|
+
import { effectiveToolCall } from "../../tools/surface.js";
|
|
2
3
|
|
|
3
4
|
export type SessionArtifactTool = "artifact" | "write" | "edit";
|
|
4
5
|
export type SessionArtifactKind = "plan" | "review" | "report";
|
|
@@ -61,7 +62,13 @@ export function foldSessionArtifacts(
|
|
|
61
62
|
if (!isRecord(raw) || raw.kind !== "message" || raw.role !== "tool_result") continue;
|
|
62
63
|
if (typeof raw.turnId !== "string" || typeof raw.timestamp !== "string") continue;
|
|
63
64
|
const payload = raw.payload;
|
|
64
|
-
if (!isRecord(payload) ||
|
|
65
|
+
if (!isRecord(payload) || typeof payload.toolName !== "string") continue;
|
|
66
|
+
const result = payload.result;
|
|
67
|
+
const details = isRecord(result) && isRecord(result.details) ? result.details : null;
|
|
68
|
+
// An artifact written through the gateway is recorded under `gateway`
|
|
69
|
+
// with the capability stamped on its details; it is the same write.
|
|
70
|
+
const toolName = effectiveToolCall(payload.toolName, undefined, details ?? undefined).toolName;
|
|
71
|
+
if (!isSessionArtifactTool(toolName)) continue;
|
|
65
72
|
if (
|
|
66
73
|
payload.isError === true ||
|
|
67
74
|
payload.outcome === "error" ||
|
|
@@ -71,12 +78,10 @@ export function foldSessionArtifacts(
|
|
|
71
78
|
) {
|
|
72
79
|
continue;
|
|
73
80
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const artifactKind =
|
|
77
|
-
payload.toolName === "artifact" && isSessionArtifactKind(result.details.kind) ? result.details.kind : undefined;
|
|
81
|
+
if (!isRecord(result) || details === null || !Array.isArray(details.paths)) continue;
|
|
82
|
+
const artifactKind = toolName === "artifact" && isSessionArtifactKind(details.kind) ? details.kind : undefined;
|
|
78
83
|
const pathsSeenInResult = new Set<string>();
|
|
79
|
-
for (const recordedPath of
|
|
84
|
+
for (const recordedPath of details.paths) {
|
|
80
85
|
if (typeof recordedPath !== "string" || recordedPath.trim().length === 0) continue;
|
|
81
86
|
const normalized = normalizedWorkspacePath(recordedPath, workspace);
|
|
82
87
|
if (normalized === null || pathsSeenInResult.has(normalized)) continue;
|
|
@@ -86,7 +91,7 @@ export function foldSessionArtifacts(
|
|
|
86
91
|
writeIndex += 1;
|
|
87
92
|
lastByPath.set(normalized, {
|
|
88
93
|
path: recordedPath,
|
|
89
|
-
tool:
|
|
94
|
+
tool: toolName,
|
|
90
95
|
...(artifactKind ? { artifactKind } : {}),
|
|
91
96
|
turnId: raw.turnId,
|
|
92
97
|
timestamp: raw.timestamp,
|
|
@@ -9,9 +9,8 @@ import {
|
|
|
9
9
|
/**
|
|
10
10
|
* The session task board: the live state behind the `tasks` tool, the footer
|
|
11
11
|
* tasks row, and the /tasks overlay. Every mutation persists a full-snapshot
|
|
12
|
-
* `taskLedger` entry
|
|
13
|
-
*
|
|
14
|
-
* resume/fork without any side-car state.
|
|
12
|
+
* `taskLedger` entry, so the board is replayable from the JSONL alone and
|
|
13
|
+
* survives resume/fork without any side-car state.
|
|
15
14
|
*
|
|
16
15
|
* Shape mapping onto TaskLedgerEntry:
|
|
17
16
|
* - the board title is the single top-level goal
|
|
@@ -13,10 +13,8 @@
|
|
|
13
13
|
* every surface's accounting, which is the same thing the tools/interactive
|
|
14
14
|
* boundary rule exists to prevent.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* cancelled partial persists a fully populated all-zero usage object, so
|
|
19
|
-
* counting it would add an API call worth nothing.
|
|
16
|
+
* Failed/aborted calls with reported usage still consumed resources. Skip
|
|
17
|
+
* only all-zero SDK placeholders, whose accounting was never observed.
|
|
20
18
|
*/
|
|
21
19
|
|
|
22
20
|
import {
|
|
@@ -39,6 +37,7 @@ export interface LedgerUsageCall {
|
|
|
39
37
|
output: number;
|
|
40
38
|
cacheRead: number;
|
|
41
39
|
cacheWrite: number;
|
|
40
|
+
cacheWrite1h?: number;
|
|
42
41
|
reasoningTokens: number;
|
|
43
42
|
totalTokens: number;
|
|
44
43
|
costUsd: number;
|
|
@@ -58,7 +57,7 @@ function numberAt(source: Record<string, unknown>, key: string): number {
|
|
|
58
57
|
}
|
|
59
58
|
|
|
60
59
|
function reasoningTokensOf(usage: Record<string, unknown>): number {
|
|
61
|
-
const direct = numberAt(usage, "reasoningTokens");
|
|
60
|
+
const direct = numberAt(usage, "reasoning") || numberAt(usage, "reasoningTokens");
|
|
62
61
|
if (direct > 0) return direct;
|
|
63
62
|
const details = usage.outputTokensDetails ?? usage.completionTokensDetails;
|
|
64
63
|
if (details && typeof details === "object") return numberAt(details as Record<string, unknown>, "reasoningTokens");
|
|
@@ -109,6 +108,7 @@ export function ledgerUsageCalls(
|
|
|
109
108
|
output: usage.output,
|
|
110
109
|
cacheRead: usage.cacheRead,
|
|
111
110
|
cacheWrite: usage.cacheWrite,
|
|
111
|
+
...(usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: usage.cacheWrite1h }),
|
|
112
112
|
reasoningTokens: usage.reasoning,
|
|
113
113
|
totalTokens: usage.totalTokens,
|
|
114
114
|
costUsd: usage.cost.total,
|
|
@@ -129,8 +129,6 @@ export function ledgerUsageCalls(
|
|
|
129
129
|
const payload = entry.payload;
|
|
130
130
|
if (!payload || typeof payload !== "object" || Array.isArray(payload)) continue;
|
|
131
131
|
const record = payload as Record<string, unknown>;
|
|
132
|
-
const stopReason = record.stopReason;
|
|
133
|
-
if (stopReason === "aborted" || stopReason === "error") continue;
|
|
134
132
|
const rawUsage = record.usage;
|
|
135
133
|
if (!rawUsage || typeof rawUsage !== "object" || Array.isArray(rawUsage)) continue;
|
|
136
134
|
const usage = rawUsage as Record<string, unknown>;
|
|
@@ -156,6 +154,7 @@ export function ledgerUsageCalls(
|
|
|
156
154
|
output,
|
|
157
155
|
cacheRead,
|
|
158
156
|
cacheWrite,
|
|
157
|
+
...(typeof usage.cacheWrite1h === "number" ? { cacheWrite1h: numberAt(usage, "cacheWrite1h") } : {}),
|
|
159
158
|
reasoningTokens: reasoningTokensOf(usage),
|
|
160
159
|
totalTokens,
|
|
161
160
|
costUsd,
|
package/src/engine/acp/server.ts
CHANGED
|
@@ -2559,6 +2559,17 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
2559
2559
|
}
|
|
2560
2560
|
const text = promptText(params);
|
|
2561
2561
|
if (text.length === 0) throw new AcpRequestError(-32602, "prompt text is required", { code: "invalid_params" });
|
|
2562
|
+
// Check the same credential authority as the runtime, without resolving or
|
|
2563
|
+
// echoing a secret. Desktop services do not inherit a terminal's API keys.
|
|
2564
|
+
const targetId = routingSnapshot().target;
|
|
2565
|
+
const target = targetId ? options.providers?.getTarget(targetId) : undefined;
|
|
2566
|
+
const runtime = target ? options.providers?.getRuntime(target.runtime) : undefined;
|
|
2567
|
+
if (target && runtime && options.providers && !options.providers.auth.statusForTarget(target, runtime).available) {
|
|
2568
|
+
throw new AcpRequestError(-32000, "credentials for the selected target are unavailable", {
|
|
2569
|
+
code: "prompt_not_admitted",
|
|
2570
|
+
reason: "authentication-required",
|
|
2571
|
+
});
|
|
2572
|
+
}
|
|
2562
2573
|
if (options.session?.current()?.id !== session.id && options.session) options.session.resume(session.id);
|
|
2563
2574
|
const active = createActivePromptState();
|
|
2564
2575
|
session.activePrompt = active;
|
package/src/engine/ai.ts
CHANGED
|
@@ -76,6 +76,7 @@ export interface EngineTextCompletionResult {
|
|
|
76
76
|
output: number;
|
|
77
77
|
cacheRead: number;
|
|
78
78
|
cacheWrite: number;
|
|
79
|
+
cacheWrite1h?: number;
|
|
79
80
|
reasoning: number;
|
|
80
81
|
totalTokens: number;
|
|
81
82
|
costUsd: number;
|
|
@@ -110,6 +111,7 @@ export async function completeEngineText(input: EngineTextCompletionInput): Prom
|
|
|
110
111
|
output: response.usage.output,
|
|
111
112
|
cacheRead: response.usage.cacheRead,
|
|
112
113
|
cacheWrite: response.usage.cacheWrite,
|
|
114
|
+
...(response.usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: response.usage.cacheWrite1h }),
|
|
113
115
|
reasoning: response.usage.reasoning ?? 0,
|
|
114
116
|
totalTokens: response.usage.totalTokens,
|
|
115
117
|
costUsd: response.usage.cost.total,
|
|
@@ -35,6 +35,7 @@ import type { LocalModelQuirks, SamplingProfile } from "../../domains/providers/
|
|
|
35
35
|
import type { LiteLLMTargetSettings, LmStudioTargetSettings } from "../../domains/providers/types/target-descriptor.js";
|
|
36
36
|
import { filterGemmaChannelStream, usesGemmaChannelMarkers } from "../gemma-channel-filter.js";
|
|
37
37
|
import { HarmonyResponseParser } from "../harmony-response.js";
|
|
38
|
+
import { captureErrorBody, restoreTruncatedErrorBody } from "../provider-error-body.js";
|
|
38
39
|
import { createSentinelStripper, stripTokenizerSentinels } from "../strip-tokenizer-sentinels.js";
|
|
39
40
|
import { ensureLlamaCppResidency } from "./llamacpp-residency.js";
|
|
40
41
|
import { ensureLmStudioResidency } from "./lmstudio.js";
|
|
@@ -110,6 +111,8 @@ interface ResponseModelIdCapture {
|
|
|
110
111
|
backendTimings: BackendCompletionTimings | null;
|
|
111
112
|
backendTimingsSource: BackendTimingsSource | null;
|
|
112
113
|
gatewayRouting: GatewayRoutingObservation | null;
|
|
114
|
+
/** Latest non-2xx body, read from a clone before the SDK truncates its copy. */
|
|
115
|
+
errorBody: Promise<string | null> | null;
|
|
113
116
|
buffer: string;
|
|
114
117
|
decoder: TextDecoder | null;
|
|
115
118
|
}
|
|
@@ -212,6 +215,7 @@ function captureResponseModelId(response: Response, capture: ResponseModelIdCapt
|
|
|
212
215
|
if (runtimeMetadata(model)?.runtimeId === "litellm") {
|
|
213
216
|
capture.gatewayRouting = liteLLMGatewayRoutingFromHeaders(response.headers);
|
|
214
217
|
}
|
|
218
|
+
if (!response.ok) capture.errorBody = captureErrorBody(response);
|
|
215
219
|
if (!response.body || !response.headers.get("content-type")?.toLowerCase().includes("text/event-stream")) {
|
|
216
220
|
return response;
|
|
217
221
|
}
|
|
@@ -247,6 +251,7 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
|
|
|
247
251
|
backendTimings: null,
|
|
248
252
|
backendTimingsSource: backendTimingsSourceForModel(model),
|
|
249
253
|
gatewayRouting: null,
|
|
254
|
+
errorBody: null,
|
|
250
255
|
buffer: "",
|
|
251
256
|
decoder: new TextDecoder(),
|
|
252
257
|
};
|
|
@@ -271,6 +276,9 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
|
|
|
271
276
|
if (capture.gatewayRouting !== null) event.message.gatewayRouting = capture.gatewayRouting;
|
|
272
277
|
if (capture.backendTimings !== null) event.message.backendTimings = capture.backendTimings;
|
|
273
278
|
} else if (event.type === "error") {
|
|
279
|
+
if (event.error.errorMessage !== undefined && capture.errorBody !== null) {
|
|
280
|
+
event.error.errorMessage = restoreTruncatedErrorBody(event.error.errorMessage, await capture.errorBody);
|
|
281
|
+
}
|
|
274
282
|
event.error.responseModelIdObservation = observation;
|
|
275
283
|
if (capture.gatewayRouting !== null) event.error.gatewayRouting = capture.gatewayRouting;
|
|
276
284
|
if (capture.backendTimings !== null) event.error.backendTimings = capture.backendTimings;
|
|
@@ -546,11 +554,15 @@ function applyLmStudioPayload(
|
|
|
546
554
|
return next;
|
|
547
555
|
}
|
|
548
556
|
|
|
549
|
-
function applyLlamaCppPromptCachePayload(
|
|
557
|
+
function applyLlamaCppPromptCachePayload(
|
|
558
|
+
payload: Record<string, unknown>,
|
|
559
|
+
model: Model<Api>,
|
|
560
|
+
retention: StreamOptions["cacheRetention"],
|
|
561
|
+
): Record<string, unknown> {
|
|
550
562
|
const metadata = runtimeMetadata(model);
|
|
551
563
|
if (model.provider !== "llamacpp" || metadata?.runtimeId !== "llamacpp") return payload;
|
|
552
564
|
if (payload.cache_prompt !== undefined) return payload;
|
|
553
|
-
return { ...payload, cache_prompt:
|
|
565
|
+
return { ...payload, cache_prompt: retention !== "none" };
|
|
554
566
|
}
|
|
555
567
|
|
|
556
568
|
function shouldApplyLlamaCppPromptCache(model: Model<"openai-completions">): boolean {
|
|
@@ -562,13 +574,14 @@ function shouldApplyLlamaCppPromptCache(model: Model<"openai-completions">): boo
|
|
|
562
574
|
function composeThinkingOnPayload(
|
|
563
575
|
resolved: ResolvedModelRuntimeCapabilities,
|
|
564
576
|
base: AnyOnPayload | undefined,
|
|
577
|
+
retention: StreamOptions["cacheRetention"],
|
|
565
578
|
): AnyOnPayload {
|
|
566
579
|
return async (payload, model) => {
|
|
567
580
|
if (!isPlainRecord(payload)) {
|
|
568
581
|
return base ? await base(payload, model) : undefined;
|
|
569
582
|
}
|
|
570
583
|
const next = applyLmStudioPayload(
|
|
571
|
-
applyThinkingPayload(applyLlamaCppPromptCachePayload(payload, model), resolved.thinking, resolved, model),
|
|
584
|
+
applyThinkingPayload(applyLlamaCppPromptCachePayload(payload, model, retention), resolved.thinking, resolved, model),
|
|
572
585
|
model,
|
|
573
586
|
resolved,
|
|
574
587
|
);
|
|
@@ -625,7 +638,7 @@ function withSamplingOverrides<TOptions extends StreamOptions>(
|
|
|
625
638
|
applied.mechanism === "on-off" ||
|
|
626
639
|
applied.mechanism === "none"
|
|
627
640
|
) {
|
|
628
|
-
merged.onPayload = composeThinkingOnPayload(resolved, options?.onPayload);
|
|
641
|
+
merged.onPayload = composeThinkingOnPayload(resolved, options?.onPayload, options?.cacheRetention);
|
|
629
642
|
}
|
|
630
643
|
return merged as TOptions;
|
|
631
644
|
}
|
package/src/engine/loop-guard.ts
CHANGED
|
@@ -949,6 +949,13 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
949
949
|
return true;
|
|
950
950
|
},
|
|
951
951
|
evaluate(input): ReadonlyArray<MiddlewareEffect> {
|
|
952
|
+
// A nested invocation (the gateway calling the capability the model
|
|
953
|
+
// asked for) is the same model call the outer gateway occurrence
|
|
954
|
+
// already counted and fingerprinted. Counting it again would spend
|
|
955
|
+
// the worker cap and the turn budget twice per gateway call, and its
|
|
956
|
+
// inner fingerprint would never repeat across a model's retries the
|
|
957
|
+
// outer one does not already show.
|
|
958
|
+
if (input.metadata?.nested === true) return [];
|
|
952
959
|
if (input.hook === "after_tool") {
|
|
953
960
|
recordSuccessfulResult(input);
|
|
954
961
|
recordResultForStagnation(input);
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One bounded-output warm through the eventual caller's engine request path.
|
|
3
|
+
* Copies portable context, applies public Pi transforms and payload hooks,
|
|
4
|
+
* and consumes the response without running tools or appending conversation.
|
|
5
|
+
* Admission and lifecycle remain with the caller. A matching serialized
|
|
6
|
+
* prefix is only a reuse candidate; the backend decides actual cache reuse.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Agent } from "@earendil-works/pi-agent-core";
|
|
10
|
+
import type { BackendCompletionTimings } from "../core/cache-telemetry.js";
|
|
11
|
+
import { streamSimple } from "./ai.js";
|
|
12
|
+
import { estimateInputTokensFromContext } from "./apis/output-budget.js";
|
|
13
|
+
import type { AgentMessage, AgentTool, EngineModel, Usage } from "./types.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The one user message appended so the chat template renders the prefix up to
|
|
17
|
+
* the user turn. One character: it has to exist for the template to close the
|
|
18
|
+
* prefix, and everything after the last shared byte is re-evaluated by the real
|
|
19
|
+
* turn anyway.
|
|
20
|
+
*/
|
|
21
|
+
export const PREWARM_USER_TEXT = ".";
|
|
22
|
+
|
|
23
|
+
/** Output budget for the round. The tokens the model produces are not the point. */
|
|
24
|
+
export const PREWARM_MAX_TOKENS = 1;
|
|
25
|
+
|
|
26
|
+
/** Which trigger asked for the pre-warm. Recorded on the ledger entry. */
|
|
27
|
+
export type PrewarmTrigger = "session-start" | "resume" | "compaction";
|
|
28
|
+
|
|
29
|
+
export interface PrewarmContext {
|
|
30
|
+
systemPrompt: string;
|
|
31
|
+
messages: ReadonlyArray<AgentMessage>;
|
|
32
|
+
tools: ReadonlyArray<AgentTool>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The roles pi-agent-core's default `convertToLlm` keeps when it turns the
|
|
37
|
+
* agent's message list into provider messages. The pre-warm applies the same
|
|
38
|
+
* filter so its message array is the one a turn would send, not the agent's
|
|
39
|
+
* internal list.
|
|
40
|
+
*/
|
|
41
|
+
const LLM_MESSAGE_ROLES: ReadonlySet<string> = new Set(["user", "assistant", "toolResult"]);
|
|
42
|
+
|
|
43
|
+
export interface PrewarmRoundInput {
|
|
44
|
+
model: EngineModel;
|
|
45
|
+
/** Live agent state the next turn would send. Read-only; the round copies it. */
|
|
46
|
+
state: {
|
|
47
|
+
systemPrompt: string;
|
|
48
|
+
messages: ReadonlyArray<AgentMessage>;
|
|
49
|
+
tools: ReadonlyArray<AgentTool>;
|
|
50
|
+
thinkingLevel: string;
|
|
51
|
+
};
|
|
52
|
+
apiKey?: string;
|
|
53
|
+
signal?: AbortSignal;
|
|
54
|
+
/** Admission bound on the engine's input estimate, after context selection. */
|
|
55
|
+
maxInputTokens?: number;
|
|
56
|
+
/** Public Pi preparation hooks of the eventual caller. No tools or agent loop are executed. */
|
|
57
|
+
agent?: Pick<
|
|
58
|
+
Agent,
|
|
59
|
+
| "transformContext"
|
|
60
|
+
| "convertToLlm"
|
|
61
|
+
| "streamFunction"
|
|
62
|
+
| "onPayload"
|
|
63
|
+
| "onResponse"
|
|
64
|
+
| "sessionId"
|
|
65
|
+
| "thinkingBudgets"
|
|
66
|
+
| "transport"
|
|
67
|
+
| "maxRetryDelayMs"
|
|
68
|
+
>;
|
|
69
|
+
/** Test seam. Production uses the engine dispatcher a turn runs on. */
|
|
70
|
+
streamFn?: typeof streamSimple;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface PrewarmRoundResult {
|
|
74
|
+
/** True when the operator submitted (or the session moved) before the round settled. */
|
|
75
|
+
aborted: boolean;
|
|
76
|
+
/** Provider usage for the round; null when the backend reported none. */
|
|
77
|
+
usage: Usage | null;
|
|
78
|
+
/** Backend prefill and prediction timings when the server reported them. */
|
|
79
|
+
backend: BackendCompletionTimings | null;
|
|
80
|
+
/** Wall clock the round spent, in the shape a turn's assistant entry uses. */
|
|
81
|
+
timing: { ttftMs: number | null; apiMs: number };
|
|
82
|
+
/** Provider error text when the round failed outright. */
|
|
83
|
+
errorMessage: string | null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function usageOf(message: unknown): Usage | null {
|
|
87
|
+
if (message === null || typeof message !== "object") return null;
|
|
88
|
+
const usage = (message as { usage?: unknown }).usage;
|
|
89
|
+
if (usage === null || typeof usage !== "object") return null;
|
|
90
|
+
const record = usage as Usage;
|
|
91
|
+
// Pi initializes missing usage to zero, including on aborted/error calls.
|
|
92
|
+
// A warm with no observed tokens cannot be called a measured free request.
|
|
93
|
+
return [record.input, record.output, record.cacheRead, record.cacheWrite, record.cost?.total].some(
|
|
94
|
+
(value) => typeof value === "number" && Number.isFinite(value) && value > 0,
|
|
95
|
+
)
|
|
96
|
+
? record
|
|
97
|
+
: null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function backendOf(message: unknown): BackendCompletionTimings | null {
|
|
101
|
+
if (message === null || typeof message !== "object") return null;
|
|
102
|
+
const backend = (message as { backendTimings?: unknown }).backendTimings;
|
|
103
|
+
return backend !== null && typeof backend === "object" ? (backend as BackendCompletionTimings) : null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Prompt tokens the backend actually processed for one pre-warm. The server's
|
|
108
|
+
* own prompt count is authoritative when it reported one; otherwise the
|
|
109
|
+
* provider usage prompt side, cached tokens folded in, is the honest figure.
|
|
110
|
+
* Null when neither exists, which is different from a measured zero.
|
|
111
|
+
*/
|
|
112
|
+
export function prewarmPromptTokens(result: Pick<PrewarmRoundResult, "usage" | "backend">): number | null {
|
|
113
|
+
if (result.backend) return result.backend.promptTokens;
|
|
114
|
+
const usage = result.usage;
|
|
115
|
+
if (!usage) return null;
|
|
116
|
+
const total = (usage.input || 0) + (usage.cacheRead || 0) + (usage.cacheWrite || 0);
|
|
117
|
+
return total > 0 ? total : null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Send the prefix and wait for the backend to acknowledge it. Resolves rather
|
|
122
|
+
* than rejects on a provider failure: a pre-warm is an optimization, and a
|
|
123
|
+
* backend that refuses it must not be able to break the session it was warming.
|
|
124
|
+
*/
|
|
125
|
+
export async function runPrewarmRound(input: PrewarmRoundInput): Promise<PrewarmRoundResult> {
|
|
126
|
+
// pi-agent-core maps `thinkingLevel: "off"` onto an absent `reasoning`; the
|
|
127
|
+
// pre-warm has to make the same mapping or the thinking composition resolves
|
|
128
|
+
// against a different level and the rendered template moves.
|
|
129
|
+
const options: Record<string, unknown> = { maxTokens: PREWARM_MAX_TOKENS };
|
|
130
|
+
// Narrow residency authority without changing prompt rendering. A warm may
|
|
131
|
+
// not inherit the foreground turn's implicit load/unload authorization.
|
|
132
|
+
const metadata = (input.model as EngineModel & { clioCoder?: Record<string, unknown> }).clioCoder;
|
|
133
|
+
const model = metadata ? { ...input.model, clioCoder: { ...metadata, lifecycle: "user-managed" } } : input.model;
|
|
134
|
+
if (metadata?.runtimeId === "llamacpp") {
|
|
135
|
+
// A worker that disappeared after admission must not be JIT-loaded by
|
|
136
|
+
// the pinned llama router. This query is independent of prompt bytes.
|
|
137
|
+
options.fetch = (request: string | URL | Request, init?: RequestInit) => {
|
|
138
|
+
const url = new URL(request instanceof Request ? request.url : request);
|
|
139
|
+
url.searchParams.set("autoload", "false");
|
|
140
|
+
return fetch(request instanceof Request ? new Request(url, request) : url, init);
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (input.state.thinkingLevel !== "off") options.reasoning = input.state.thinkingLevel;
|
|
144
|
+
if (input.apiKey !== undefined) options.apiKey = input.apiKey;
|
|
145
|
+
if (input.signal !== undefined) options.signal = input.signal;
|
|
146
|
+
if (input.agent) {
|
|
147
|
+
for (const key of [
|
|
148
|
+
"onPayload",
|
|
149
|
+
"onResponse",
|
|
150
|
+
"sessionId",
|
|
151
|
+
"thinkingBudgets",
|
|
152
|
+
"transport",
|
|
153
|
+
"maxRetryDelayMs",
|
|
154
|
+
] as const) {
|
|
155
|
+
if (input.agent[key] !== undefined) options[key] = input.agent[key];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const send = input.streamFn ?? input.agent?.streamFunction ?? streamSimple;
|
|
160
|
+
const startedAt = performance.now();
|
|
161
|
+
let firstDeltaAt: number | null = null;
|
|
162
|
+
const elapsed = (): number => Math.round(Math.max(0, performance.now() - startedAt));
|
|
163
|
+
const ttft = (): number | null => (firstDeltaAt === null ? null : Math.round(Math.max(0, firstDeltaAt - startedAt)));
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
input.signal?.throwIfAborted();
|
|
167
|
+
let messages: AgentMessage[] = [
|
|
168
|
+
...structuredClone([...input.state.messages]),
|
|
169
|
+
{ role: "user", content: [{ type: "text", text: PREWARM_USER_TEXT }], timestamp: Date.now() },
|
|
170
|
+
];
|
|
171
|
+
if (input.agent?.transformContext) messages = await input.agent.transformContext(messages, input.signal);
|
|
172
|
+
const converted = input.agent
|
|
173
|
+
? await input.agent.convertToLlm(messages)
|
|
174
|
+
: messages.filter((message) => LLM_MESSAGE_ROLES.has(message.role));
|
|
175
|
+
input.signal?.throwIfAborted();
|
|
176
|
+
const context = {
|
|
177
|
+
systemPrompt: input.state.systemPrompt,
|
|
178
|
+
messages: converted,
|
|
179
|
+
tools: [...input.state.tools],
|
|
180
|
+
} as Parameters<typeof streamSimple>[1];
|
|
181
|
+
if (input.maxInputTokens !== undefined && estimateInputTokensFromContext(context) > input.maxInputTokens) {
|
|
182
|
+
throw new Error("pre-warm input estimate exceeds its token budget");
|
|
183
|
+
}
|
|
184
|
+
const events = await send(
|
|
185
|
+
model,
|
|
186
|
+
context as unknown as Parameters<typeof streamSimple>[1],
|
|
187
|
+
options as unknown as Parameters<typeof streamSimple>[2],
|
|
188
|
+
);
|
|
189
|
+
for await (const event of events) {
|
|
190
|
+
const hasDelta =
|
|
191
|
+
event.type === "toolcall_start" ||
|
|
192
|
+
((event.type === "text_delta" || event.type === "thinking_delta" || event.type === "toolcall_delta") &&
|
|
193
|
+
event.delta.length > 0);
|
|
194
|
+
if (firstDeltaAt === null && hasDelta) firstDeltaAt = performance.now();
|
|
195
|
+
if (event.type === "done") {
|
|
196
|
+
return {
|
|
197
|
+
aborted: false,
|
|
198
|
+
usage: usageOf(event.message),
|
|
199
|
+
backend: backendOf(event.message),
|
|
200
|
+
timing: { ttftMs: ttft(), apiMs: elapsed() },
|
|
201
|
+
errorMessage: null,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
if (event.type === "error") {
|
|
205
|
+
const failed = event.error as { stopReason?: unknown; errorMessage?: unknown };
|
|
206
|
+
const aborted = event.reason === "aborted" || failed.stopReason === "aborted" || input.signal?.aborted === true;
|
|
207
|
+
return {
|
|
208
|
+
aborted,
|
|
209
|
+
usage: usageOf(event.error),
|
|
210
|
+
backend: backendOf(event.error),
|
|
211
|
+
timing: { ttftMs: ttft(), apiMs: elapsed() },
|
|
212
|
+
errorMessage: aborted ? null : typeof failed.errorMessage === "string" ? failed.errorMessage : "pre-warm failed",
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
} catch (error) {
|
|
217
|
+
return {
|
|
218
|
+
aborted: input.signal?.aborted === true,
|
|
219
|
+
usage: null,
|
|
220
|
+
backend: null,
|
|
221
|
+
timing: { ttftMs: ttft(), apiMs: elapsed() },
|
|
222
|
+
errorMessage: input.signal?.aborted === true ? null : error instanceof Error ? error.message : String(error),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
aborted: input.signal?.aborted === true,
|
|
227
|
+
usage: null,
|
|
228
|
+
backend: null,
|
|
229
|
+
timing: { ttftMs: ttft(), apiMs: elapsed() },
|
|
230
|
+
errorMessage: null,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
@@ -2,6 +2,7 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import { closeSync, constants, fstatSync, openSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { isAbsolute } from "node:path";
|
|
4
4
|
import type { Api, AssistantMessageEventStream, Model, StreamOptions } from "@earendil-works/pi-ai";
|
|
5
|
+
import type { TargetCacheSettings } from "../domains/providers/types/target-descriptor.js";
|
|
5
6
|
import { findEngineEnvKeys } from "./env-api-keys.js";
|
|
6
7
|
|
|
7
8
|
/** Process-owned opt-in reaches every native engine call, including prewarm and workers. */
|
|
@@ -11,7 +12,11 @@ export function instrumentProviderCall<T extends StreamOptions>(
|
|
|
11
12
|
invoke: (options: T | undefined) => AssistantMessageEventStream,
|
|
12
13
|
): AssistantMessageEventStream {
|
|
13
14
|
let effective = options;
|
|
14
|
-
|
|
15
|
+
const configured = (model as Model<Api> & { clioCoder?: { cache?: TargetCacheSettings } }).clioCoder?.cache?.retention;
|
|
16
|
+
if (options?.cacheRetention === undefined && configured !== undefined) {
|
|
17
|
+
effective = { ...options, cacheRetention: configured } as T;
|
|
18
|
+
}
|
|
19
|
+
if (model.api === "anthropic-messages" && effective?.cacheRetention === undefined) {
|
|
15
20
|
const retention = process.env.CLIO_CODER_ANTHROPIC_CACHE_RETENTION;
|
|
16
21
|
if (retention !== undefined && retention !== "") {
|
|
17
22
|
if (retention !== "none" && retention !== "short" && retention !== "long") {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi-ai formats an HTTP error from the parsed JSON body and keeps only its first
|
|
3
|
+
* 4000 characters. Clio's fetch wrapper sees the same response first, so the
|
|
4
|
+
* discarded tail can be restored when the captured body provably is the one the
|
|
5
|
+
* SDK truncated. Anything else leaves the SDK diagnostic unchanged.
|
|
6
|
+
*/
|
|
7
|
+
const SDK_BODY_CHARS = 4000;
|
|
8
|
+
const SDK_MARKER = /\.\.\. \[truncated (\d+) chars\]/u;
|
|
9
|
+
/** Bounds both the capture read and the restored diagnostic kept in the ledger. */
|
|
10
|
+
export const MAX_RESTORED_ERROR_BODY_CHARS = 65_536;
|
|
11
|
+
const MAX_CAPTURE_BYTES = 4 * 1024 * 1024;
|
|
12
|
+
|
|
13
|
+
/** Read a clone so the SDK still owns the original body. Never throws. */
|
|
14
|
+
export async function captureErrorBody(response: Response): Promise<string | null> {
|
|
15
|
+
if (response.ok || response.body === null) return null;
|
|
16
|
+
try {
|
|
17
|
+
const reader = response.clone().body?.getReader();
|
|
18
|
+
if (reader === undefined) return null;
|
|
19
|
+
const decoder = new TextDecoder();
|
|
20
|
+
let text = "";
|
|
21
|
+
let bytes = 0;
|
|
22
|
+
for (;;) {
|
|
23
|
+
const { done, value } = await reader.read();
|
|
24
|
+
if (done) break;
|
|
25
|
+
bytes += value.byteLength;
|
|
26
|
+
// A body too large to hold cannot be compared exactly; keep the SDK text.
|
|
27
|
+
if (bytes > MAX_CAPTURE_BYTES) {
|
|
28
|
+
await reader.cancel().catch(() => {});
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
text += decoder.decode(value, { stream: true });
|
|
32
|
+
}
|
|
33
|
+
return text + decoder.decode();
|
|
34
|
+
} catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function restoreTruncatedErrorBody(message: string, capturedBody: string | null): string {
|
|
40
|
+
if (capturedBody === null) return message;
|
|
41
|
+
const marker = SDK_MARKER.exec(message);
|
|
42
|
+
if (marker === null || marker.index < SDK_BODY_CHARS) return message;
|
|
43
|
+
let parsed: unknown;
|
|
44
|
+
try {
|
|
45
|
+
parsed = JSON.parse(capturedBody);
|
|
46
|
+
} catch {
|
|
47
|
+
return message;
|
|
48
|
+
}
|
|
49
|
+
const start = marker.index - SDK_BODY_CHARS;
|
|
50
|
+
const kept = message.slice(start, marker.index);
|
|
51
|
+
const dropped = Number(marker[1]);
|
|
52
|
+
// The openai SDK exposes the body's `error` member when present, else the body.
|
|
53
|
+
const nested = typeof parsed === "object" && parsed !== null ? (parsed as { error?: unknown }).error : undefined;
|
|
54
|
+
for (const candidate of [nested, parsed]) {
|
|
55
|
+
if (typeof candidate !== "object" || candidate === null) continue;
|
|
56
|
+
const full = JSON.stringify(candidate).trim();
|
|
57
|
+
if (full.length - SDK_BODY_CHARS !== dropped || !full.startsWith(kept)) continue;
|
|
58
|
+
const restored =
|
|
59
|
+
full.length > MAX_RESTORED_ERROR_BODY_CHARS
|
|
60
|
+
? `${full.slice(0, MAX_RESTORED_ERROR_BODY_CHARS)}... [truncated ${full.length - MAX_RESTORED_ERROR_BODY_CHARS} chars]`
|
|
61
|
+
: full;
|
|
62
|
+
return `${message.slice(0, start)}${restored}${message.slice(marker.index + marker[0].length)}`;
|
|
63
|
+
}
|
|
64
|
+
return message;
|
|
65
|
+
}
|