@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
package/src/tools/grep.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { statSync } from "node:fs";
|
|
2
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
2
3
|
import path, { join, relative } from "node:path";
|
|
4
|
+
import { setImmediate as yieldToLoop } from "node:timers/promises";
|
|
3
5
|
import { Type } from "typebox";
|
|
4
6
|
import { ToolNames } from "../core/tool-names.js";
|
|
5
7
|
import { StringEnum } from "../engine/ai.js";
|
|
@@ -18,7 +20,16 @@ import {
|
|
|
18
20
|
} from "./observation.js";
|
|
19
21
|
import { resolveReadPath, toPosixPath } from "./path-utils.js";
|
|
20
22
|
import type { ToolInvokeOptions, ToolResult, ToolSpec } from "./registry.js";
|
|
21
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
createSearchDiagnostics,
|
|
25
|
+
finishSearch,
|
|
26
|
+
newSearchCompleteness,
|
|
27
|
+
type SearchCompleteness,
|
|
28
|
+
searchNotice,
|
|
29
|
+
skipSearchPath,
|
|
30
|
+
spawnLineStream,
|
|
31
|
+
validateSearchPatternSize,
|
|
32
|
+
} from "./spawn-hygiene.js";
|
|
22
33
|
import { GREP_MAX_LINE_LENGTH, truncateHead, truncateLine } from "./truncate.js";
|
|
23
34
|
|
|
24
35
|
const DEFAULT_LIMIT = 100;
|
|
@@ -68,6 +79,8 @@ interface RenderedLine {
|
|
|
68
79
|
}
|
|
69
80
|
|
|
70
81
|
interface GrepRenderInput {
|
|
82
|
+
search: SearchCompleteness;
|
|
83
|
+
fallback?: boolean;
|
|
71
84
|
withheldPaths: number;
|
|
72
85
|
mode: GrepMode;
|
|
73
86
|
lines: RenderedLine[];
|
|
@@ -88,16 +101,21 @@ const NO_MATCH_OUTPUT = "No matches found";
|
|
|
88
101
|
* rendering when anything was cut, and close the envelope.
|
|
89
102
|
*/
|
|
90
103
|
function renderGrepResult(input: GrepRenderInput): ToolResult {
|
|
91
|
-
const { mode, lines, matchCount, limitHit, limit, linesTruncated, reservation, options } = input;
|
|
104
|
+
const { mode, lines, matchCount, limitHit, limit, linesTruncated, reservation, options, search } = input;
|
|
105
|
+
const fallbackNotice = input.fallback
|
|
106
|
+
? "\n[Fallback search uses GENERATED_DIRS only; .gitignore is not applied.]"
|
|
107
|
+
: "";
|
|
92
108
|
if (lines.length === 0) {
|
|
93
109
|
return finalizeObservation({
|
|
94
110
|
tool: ToolNames.Grep,
|
|
95
111
|
withheldPaths: input.withheldPaths,
|
|
96
112
|
unit: MODE_UNITS[mode],
|
|
97
|
-
output:
|
|
113
|
+
output:
|
|
114
|
+
(search.complete ? NO_MATCH_OUTPUT : "Search incomplete") + searchNotice(search, 0, "matches") + fallbackNotice,
|
|
115
|
+
details: { search },
|
|
98
116
|
shownCount: 0,
|
|
99
|
-
totalCount: 0,
|
|
100
|
-
truncated:
|
|
117
|
+
totalCount: search.complete ? 0 : null,
|
|
118
|
+
truncated: !search.complete,
|
|
101
119
|
reservation,
|
|
102
120
|
...(options ? { options } : {}),
|
|
103
121
|
});
|
|
@@ -115,7 +133,11 @@ function renderGrepResult(input: GrepRenderInput): ToolResult {
|
|
|
115
133
|
} else {
|
|
116
134
|
shownCount = truncation.outputLines;
|
|
117
135
|
}
|
|
118
|
-
|
|
136
|
+
if (truncation.truncated && search.complete) {
|
|
137
|
+
search.complete = false;
|
|
138
|
+
search.reason = "limit";
|
|
139
|
+
}
|
|
140
|
+
const truncated = !search.complete || limitHit || truncation.truncated;
|
|
119
141
|
const next = limitHit ? `limit=${limit * 2}` : truncation.truncated && mode === "content" ? "mode=files" : undefined;
|
|
120
142
|
let output = truncation.content;
|
|
121
143
|
if (linesTruncated) {
|
|
@@ -125,12 +147,13 @@ function renderGrepResult(input: GrepRenderInput): ToolResult {
|
|
|
125
147
|
tool: ToolNames.Grep,
|
|
126
148
|
withheldPaths: input.withheldPaths,
|
|
127
149
|
unit: MODE_UNITS[mode],
|
|
128
|
-
output,
|
|
150
|
+
output: output + searchNotice(search, shownCount, "matches") + fallbackNotice,
|
|
151
|
+
details: { search },
|
|
129
152
|
// Offload only when the byte cap cut collected content; a bare match
|
|
130
153
|
// limit continues via `next`, and the offload would duplicate the body.
|
|
131
154
|
...(truncation.truncated ? { fullOutput } : {}),
|
|
132
155
|
shownCount,
|
|
133
|
-
totalCount:
|
|
156
|
+
totalCount: search.complete ? matchCount : null,
|
|
134
157
|
truncated,
|
|
135
158
|
...(next !== undefined ? { next } : {}),
|
|
136
159
|
reservation,
|
|
@@ -237,22 +260,31 @@ async function runRipgrep(input: RgSearchInput): Promise<ToolResult> {
|
|
|
237
260
|
}
|
|
238
261
|
};
|
|
239
262
|
|
|
263
|
+
const search = newSearchCompleteness();
|
|
264
|
+
const diagnostics = createSearchDiagnostics(search, (filePath) => input.pathFilter.allows(path.resolve(filePath)));
|
|
240
265
|
const result = await spawnLineStream(input.rgPath, buildRgArgs(input), {
|
|
241
266
|
...(input.options?.signal ? { signal: input.options.signal } : {}),
|
|
242
267
|
onLine: input.mode === "content" ? onContentLine : onListLine,
|
|
268
|
+
onStderrLine: diagnostics.onLine,
|
|
243
269
|
});
|
|
244
|
-
|
|
245
|
-
if (result.
|
|
270
|
+
finishSearch(search, result);
|
|
271
|
+
if (result.spawnError !== null) return { kind: "error", message: `grep: failed to run rg: ${result.spawnError}` };
|
|
272
|
+
if (
|
|
273
|
+
!result.aborted &&
|
|
274
|
+
!result.timedOut &&
|
|
275
|
+
!result.stoppedEarly &&
|
|
276
|
+
result.exitCode !== 0 &&
|
|
277
|
+
result.exitCode !== 1 &&
|
|
278
|
+
matchCount === 0 &&
|
|
279
|
+
(diagnostics.realError || (search.skipped.count === 0 && !search.skipped.unknown))
|
|
280
|
+
) {
|
|
246
281
|
return {
|
|
247
282
|
kind: "error",
|
|
248
|
-
message: `grep: rg
|
|
283
|
+
message: `grep: rg rejected the search or failed (exit code ${result.exitCode}). Check the pattern and search path.`,
|
|
249
284
|
};
|
|
250
285
|
}
|
|
251
|
-
if (result.spawnError !== null) return { kind: "error", message: `grep: failed to run rg: ${result.spawnError}` };
|
|
252
|
-
if (!result.stoppedEarly && result.exitCode !== 0 && result.exitCode !== 1) {
|
|
253
|
-
return { kind: "error", message: `grep: ${result.stderr.trim() || `ripgrep exited with code ${result.exitCode}`}` };
|
|
254
|
-
}
|
|
255
286
|
return renderGrepResult({
|
|
287
|
+
search,
|
|
256
288
|
withheldPaths: input.pathFilter.withheldPaths,
|
|
257
289
|
mode: input.mode,
|
|
258
290
|
lines: rendered,
|
|
@@ -310,7 +342,8 @@ interface FallbackSearchInput {
|
|
|
310
342
|
* already-in-memory file content, never a second read. Aggregates the same
|
|
311
343
|
* three mode shapes as the rg path.
|
|
312
344
|
*/
|
|
313
|
-
function fallbackGrep(input: FallbackSearchInput): ToolResult {
|
|
345
|
+
async function fallbackGrep(input: FallbackSearchInput): Promise<ToolResult> {
|
|
346
|
+
const search = newSearchCompleteness();
|
|
314
347
|
const built = buildMatchRegex(input.pattern, input.literal, input.ignoreCase);
|
|
315
348
|
if (!built.ok) return { kind: "error", message: built.message };
|
|
316
349
|
const regex = built.regex;
|
|
@@ -337,21 +370,32 @@ function fallbackGrep(input: FallbackSearchInput): ToolResult {
|
|
|
337
370
|
rendered.push({ text: truncatedLine.text, isMatch });
|
|
338
371
|
};
|
|
339
372
|
|
|
340
|
-
const searchFile = (filePath: string): void => {
|
|
341
|
-
if (limitHit || !input.pathFilter.allows(filePath)) return;
|
|
373
|
+
const searchFile = async (filePath: string): Promise<void> => {
|
|
374
|
+
if (limitHit || signal?.aborted || !input.pathFilter.allows(filePath)) return;
|
|
342
375
|
let buffer: Buffer;
|
|
343
376
|
try {
|
|
344
|
-
const
|
|
345
|
-
if (!
|
|
346
|
-
|
|
377
|
+
const fileStat = await stat(filePath);
|
|
378
|
+
if (!fileStat.isFile() || fileStat.size > FALLBACK_MAX_FILE_BYTES) {
|
|
379
|
+
skipSearchPath(search, filePath, input.pathFilter.allows);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
buffer = await readFile(filePath);
|
|
347
383
|
} catch {
|
|
384
|
+
skipSearchPath(search, filePath, input.pathFilter.allows);
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
if (looksBinary(buffer)) {
|
|
388
|
+
skipSearchPath(search, filePath, input.pathFilter.allows);
|
|
348
389
|
return;
|
|
349
390
|
}
|
|
350
|
-
if (looksBinary(buffer)) return;
|
|
351
391
|
const lines = buffer.toString("utf8").replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
|
|
352
392
|
const rel = formatPath(filePath, input.searchPath, input.isDirectory);
|
|
353
393
|
let fileMatches = 0;
|
|
354
394
|
for (let i = 0; i < lines.length; i += 1) {
|
|
395
|
+
if (i % 1024 === 0) {
|
|
396
|
+
await yieldToLoop();
|
|
397
|
+
if (signal?.aborted) return;
|
|
398
|
+
}
|
|
355
399
|
const lineText = lines[i] ?? "";
|
|
356
400
|
regex.lastIndex = 0;
|
|
357
401
|
if (!regex.test(lineText)) continue;
|
|
@@ -384,35 +428,46 @@ function fallbackGrep(input: FallbackSearchInput): ToolResult {
|
|
|
384
428
|
}
|
|
385
429
|
};
|
|
386
430
|
|
|
387
|
-
const walk = (dir: string): void => {
|
|
431
|
+
const walk = async (dir: string): Promise<void> => {
|
|
432
|
+
await yieldToLoop();
|
|
388
433
|
if (limitHit || signal?.aborted) return;
|
|
389
434
|
let entries: import("node:fs").Dirent[];
|
|
390
435
|
try {
|
|
391
|
-
entries =
|
|
436
|
+
entries = (await readdir(dir, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name));
|
|
392
437
|
} catch {
|
|
438
|
+
skipSearchPath(search, dir, input.pathFilter.allows);
|
|
393
439
|
return;
|
|
394
440
|
}
|
|
395
441
|
for (const entry of entries) {
|
|
396
442
|
if (limitHit || signal?.aborted) return;
|
|
397
443
|
const absPath = join(dir, entry.name);
|
|
444
|
+
if (!input.pathFilter.allows(absPath)) continue;
|
|
398
445
|
if (entry.isDirectory()) {
|
|
399
446
|
if (ignored.has(entry.name)) continue;
|
|
400
|
-
walk(absPath);
|
|
447
|
+
await walk(absPath);
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
450
|
+
if (!entry.isFile()) {
|
|
451
|
+
skipSearchPath(search, absPath, input.pathFilter.allows);
|
|
401
452
|
continue;
|
|
402
453
|
}
|
|
403
|
-
if (!entry.isFile()) continue;
|
|
404
454
|
if (globMatcher) {
|
|
405
455
|
const relPath = normalizeGlobInput(relative(input.searchPath, absPath));
|
|
406
456
|
if (!globMatcher.test(relPath)) continue;
|
|
407
457
|
}
|
|
408
|
-
searchFile(absPath);
|
|
458
|
+
await searchFile(absPath);
|
|
409
459
|
}
|
|
410
460
|
};
|
|
411
461
|
|
|
412
|
-
if (input.isDirectory) walk(input.searchPath);
|
|
413
|
-
else searchFile(input.searchPath);
|
|
414
|
-
if (signal?.aborted)
|
|
462
|
+
if (input.isDirectory) await walk(input.searchPath);
|
|
463
|
+
else await searchFile(input.searchPath);
|
|
464
|
+
if (signal?.aborted || limitHit) {
|
|
465
|
+
search.complete = false;
|
|
466
|
+
search.reason = signal?.aborted ? "cancelled" : "limit";
|
|
467
|
+
}
|
|
415
468
|
return renderGrepResult({
|
|
469
|
+
fallback: true,
|
|
470
|
+
search,
|
|
416
471
|
withheldPaths: input.pathFilter.withheldPaths,
|
|
417
472
|
mode: input.mode,
|
|
418
473
|
lines: rendered,
|
|
@@ -427,7 +482,7 @@ function fallbackGrep(input: FallbackSearchInput): ToolResult {
|
|
|
427
482
|
|
|
428
483
|
export const grepTool: ToolSpec = {
|
|
429
484
|
name: ToolNames.Grep,
|
|
430
|
-
description: `Search file contents with ripgrep. mode=content (default) returns matching lines with paths and line numbers, mode=files returns only matching file paths, mode=count returns per-file match counts. Respects .gitignore and skips generated dirs unless include_ignored=true. Capped at ${DEFAULT_LIMIT} matches by default; truncated results say how to continue and where the full output was saved.`,
|
|
485
|
+
description: `Search file contents with ripgrep. mode=content (default) returns matching lines with paths and line numbers, mode=files returns only matching file paths, mode=count returns per-file match counts. Respects .gitignore and skips generated dirs unless include_ignored=true. Without rg, the async fallback uses GENERATED_DIRS only and does not apply .gitignore; unreadable, binary, oversized files and symlinks are reported as skipped. Capped at ${DEFAULT_LIMIT} matches by default; truncated results say how to continue and where the full output was saved.`,
|
|
431
486
|
parameters: Type.Object({
|
|
432
487
|
pattern: Type.String({ description: "Search pattern (regex by default)." }),
|
|
433
488
|
path: Type.Optional(Type.String({ description: "Directory or file to search." })),
|
|
@@ -499,7 +554,7 @@ export const grepTool: ToolSpec = {
|
|
|
499
554
|
if (rgPath) return await runRipgrep({ rgPath, ...shared });
|
|
500
555
|
// rg absent (offline/weak node): degrade to a bounded pure-Node search
|
|
501
556
|
// instead of failing content search outright.
|
|
502
|
-
return fallbackGrep(shared);
|
|
557
|
+
return await fallbackGrep(shared);
|
|
503
558
|
} finally {
|
|
504
559
|
releaseObservation(reservation);
|
|
505
560
|
}
|
|
@@ -64,6 +64,9 @@ function createCommandTool(extension: LoadableExtension, tool: ExtensionCommandT
|
|
|
64
64
|
parameters: tool.inputSchema as TSchema,
|
|
65
65
|
baseActionClass: "execute",
|
|
66
66
|
executionMode: "sequential",
|
|
67
|
+
// Reached through gateway find/describe/call; the spec, its execute
|
|
68
|
+
// class, and its bash projection are unchanged by the placement.
|
|
69
|
+
placement: "gateway",
|
|
67
70
|
sourceInfo: { path: extension.manifestPath, scope: "domain", extension: extension.provenance },
|
|
68
71
|
metadata: {
|
|
69
72
|
objective: tool.description,
|
|
@@ -3,10 +3,11 @@ import { dirname, join } from "node:path";
|
|
|
3
3
|
import { toPosixPath } from "./path-utils.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* Shared exclusions for path-walking OBSERVE tools. Native rg/fd searches
|
|
7
|
+
* honor gitignore rules as well as generated-directory and internal-state
|
|
8
|
+
* exclusions. Pure-Node fallback walkers apply GENERATED_DIRS and internal
|
|
9
|
+
* exclusions only; they do not interpret .gitignore or .ignore files, so their
|
|
10
|
+
* visible paths can differ from native searches.
|
|
10
11
|
*
|
|
11
12
|
* The policy has three layers:
|
|
12
13
|
* 1. ALWAYS excluded: clio-internal state and .git. Never searchable unless
|
|
@@ -14,7 +15,8 @@ import { toPosixPath } from "./path-utils.js";
|
|
|
14
15
|
* .clio-coder explicitly means the caller wants those paths).
|
|
15
16
|
* 2. .gitignore: honored natively by rg/fd. Outside a git repo the binaries
|
|
16
17
|
* get --no-require-git so plain .gitignore/.ignore files still apply;
|
|
17
|
-
*
|
|
18
|
+
* fallback walkers do not apply this layer. Inside a repo the default
|
|
19
|
+
* git-aware behavior keeps parent ignore rules
|
|
18
20
|
* from leaking across nested-repo boundaries.
|
|
19
21
|
* 3. GENERATED_DIRS: universal build/dependency noise force-excluded even
|
|
20
22
|
* when a project forgets to gitignore it.
|
package/src/tools/ls.ts
CHANGED
|
@@ -1,27 +1,84 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { lstat, opendir, readlink, stat } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { setImmediate as yieldToLoop } from "node:timers/promises";
|
|
3
4
|
import { Type } from "typebox";
|
|
4
5
|
import { ToolNames } from "../core/tool-names.js";
|
|
6
|
+
import { createSafetyPolicyEngine } from "../domains/safety/policy-engine.js";
|
|
5
7
|
import {
|
|
6
|
-
|
|
8
|
+
commitObservationReservation,
|
|
7
9
|
finalizeObservation,
|
|
8
10
|
OBSERVE_SELF_CAPS,
|
|
9
11
|
observationBudgetExhausted,
|
|
12
|
+
releaseObservation,
|
|
10
13
|
reserveObservation,
|
|
11
14
|
} from "./observation.js";
|
|
12
15
|
import { resolveReadPath } from "./path-utils.js";
|
|
13
16
|
import type { ToolResult, ToolSpec } from "./registry.js";
|
|
17
|
+
import { newSearchCompleteness, skipSearchPath } from "./spawn-hygiene.js";
|
|
14
18
|
import { truncateHead } from "./truncate.js";
|
|
15
19
|
|
|
16
20
|
const DEFAULT_LIMIT = 500;
|
|
17
21
|
|
|
18
22
|
function parseLimit(value: unknown): number {
|
|
19
|
-
return typeof value === "number" && value
|
|
23
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 1 ? Math.floor(value) : DEFAULT_LIMIT;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface ListingEntry {
|
|
27
|
+
name: string;
|
|
28
|
+
order: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const compareEntries = (a: ListingEntry, b: ListingEntry): number =>
|
|
32
|
+
a.name.toLowerCase().localeCompare(b.name.toLowerCase()) || a.order - b.order;
|
|
33
|
+
|
|
34
|
+
/** A max heap retains the earliest names, preserving directory read order for collation ties. */
|
|
35
|
+
export class BoundedListingSelection {
|
|
36
|
+
private readonly entries: ListingEntry[] = [];
|
|
37
|
+
private nextOrder = 0;
|
|
38
|
+
constructor(private readonly limit: number) {}
|
|
39
|
+
get retained(): number {
|
|
40
|
+
return this.entries.length;
|
|
41
|
+
}
|
|
42
|
+
private entryAt(index: number): ListingEntry {
|
|
43
|
+
const entry = this.entries[index];
|
|
44
|
+
if (!entry) throw new Error("Invalid listing heap index");
|
|
45
|
+
return entry;
|
|
46
|
+
}
|
|
47
|
+
add(name: string): void {
|
|
48
|
+
const entry = { name, order: this.nextOrder++ };
|
|
49
|
+
if (this.entries.length < this.limit) {
|
|
50
|
+
this.entries.push(entry);
|
|
51
|
+
let i = this.entries.length - 1;
|
|
52
|
+
while (i > 0) {
|
|
53
|
+
const parent = Math.floor((i - 1) / 2);
|
|
54
|
+
if (compareEntries(this.entryAt(parent), entry) >= 0) break;
|
|
55
|
+
this.entries[i] = this.entryAt(parent);
|
|
56
|
+
i = parent;
|
|
57
|
+
}
|
|
58
|
+
this.entries[i] = entry;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (compareEntries(entry, this.entryAt(0)) >= 0) return;
|
|
62
|
+
this.entries[0] = entry;
|
|
63
|
+
let i = 0;
|
|
64
|
+
while (2 * i + 1 < this.entries.length) {
|
|
65
|
+
let child = 2 * i + 1;
|
|
66
|
+
if (child + 1 < this.entries.length && compareEntries(this.entryAt(child + 1), this.entryAt(child)) > 0) child++;
|
|
67
|
+
if (compareEntries(entry, this.entryAt(child)) >= 0) break;
|
|
68
|
+
this.entries[i] = this.entryAt(child);
|
|
69
|
+
i = child;
|
|
70
|
+
}
|
|
71
|
+
this.entries[i] = entry;
|
|
72
|
+
}
|
|
73
|
+
sorted(): string[] {
|
|
74
|
+
return [...this.entries].sort(compareEntries).map((entry) => entry.name);
|
|
75
|
+
}
|
|
20
76
|
}
|
|
21
77
|
|
|
22
78
|
export const lsTool: ToolSpec = {
|
|
23
79
|
name: ToolNames.Ls,
|
|
24
|
-
description:
|
|
80
|
+
description:
|
|
81
|
+
'List directory entries sorted alphabetically, "/" suffix for directories, dotfiles included. Symlinks render as name@ -> target, broken links as name@ (broken), and inaccessible entries are marked and counted.',
|
|
25
82
|
parameters: Type.Object({
|
|
26
83
|
path: Type.Optional(Type.String({ description: "Directory to list." })),
|
|
27
84
|
limit: Type.Optional(Type.Number({ description: `Max entries (default ${DEFAULT_LIMIT}).` })),
|
|
@@ -34,7 +91,7 @@ export const lsTool: ToolSpec = {
|
|
|
34
91
|
const limit = parseLimit(args.limit);
|
|
35
92
|
|
|
36
93
|
try {
|
|
37
|
-
const rootStat =
|
|
94
|
+
const rootStat = await stat(root);
|
|
38
95
|
if (!rootStat.isDirectory()) {
|
|
39
96
|
return { kind: "error", message: `ls: not a directory: ${root}` };
|
|
40
97
|
}
|
|
@@ -53,32 +110,63 @@ export const lsTool: ToolSpec = {
|
|
|
53
110
|
});
|
|
54
111
|
}
|
|
55
112
|
|
|
113
|
+
commitObservationReservation(reservation);
|
|
56
114
|
try {
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
115
|
+
const policy = options?.allowsObservationPath ? undefined : createSafetyPolicyEngine({ cwd: process.cwd() });
|
|
116
|
+
const allows =
|
|
117
|
+
options?.allowsObservationPath ??
|
|
118
|
+
((entryPath: string) =>
|
|
119
|
+
policy?.evaluate({ tool: "read", args: { path: entryPath } }).reasonCode !== "path-policy:zeroAccessPaths");
|
|
120
|
+
let withheldPaths = 0;
|
|
121
|
+
let visibleCount = 0;
|
|
122
|
+
let scanned = 0;
|
|
123
|
+
const selection = new BoundedListingSelection(limit);
|
|
124
|
+
// Alphabetical selection requires examining every name, but only limit
|
|
125
|
+
// names are retained. No metadata calls are made for unselected entries.
|
|
126
|
+
for await (const entry of await opendir(root)) {
|
|
127
|
+
if (++scanned % 128 === 0) await yieldToLoop();
|
|
128
|
+
if (options?.signal?.aborted) return { kind: "error", message: "ls: operation aborted during enumeration" };
|
|
129
|
+
if (!allows(path.join(root, entry.name))) {
|
|
130
|
+
withheldPaths++;
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
visibleCount++;
|
|
134
|
+
selection.add(entry.name);
|
|
135
|
+
}
|
|
136
|
+
const entries = selection.sorted();
|
|
61
137
|
const outputEntries: string[] = [];
|
|
62
|
-
|
|
138
|
+
const entryLimitReached = visibleCount > limit;
|
|
139
|
+
const search = newSearchCompleteness();
|
|
63
140
|
for (const entry of entries) {
|
|
64
|
-
|
|
65
|
-
entryLimitReached = true;
|
|
66
|
-
break;
|
|
67
|
-
}
|
|
141
|
+
const entryPath = path.join(root, entry);
|
|
68
142
|
try {
|
|
69
|
-
const entryStat =
|
|
70
|
-
|
|
143
|
+
const entryStat = await lstat(entryPath);
|
|
144
|
+
if (entryStat.isSymbolicLink()) {
|
|
145
|
+
const target = await readlink(entryPath);
|
|
146
|
+
try {
|
|
147
|
+
await stat(entryPath);
|
|
148
|
+
outputEntries.push(`${entry}@ -> ${target}`);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
151
|
+
outputEntries.push(`${entry}@ (${code === "ENOENT" || code === "ENOTDIR" ? "broken" : "unreadable"})`);
|
|
152
|
+
skipSearchPath(search, entryPath);
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
outputEntries.push(entryStat.isDirectory() ? `${entry}/` : entry);
|
|
156
|
+
}
|
|
71
157
|
} catch {
|
|
72
|
-
|
|
158
|
+
outputEntries.push(`${entry} (unreadable)`);
|
|
159
|
+
skipSearchPath(search, entryPath);
|
|
73
160
|
}
|
|
74
161
|
}
|
|
75
162
|
|
|
76
163
|
if (outputEntries.length === 0) {
|
|
77
164
|
return finalizeObservation({
|
|
78
165
|
tool: ToolNames.Ls,
|
|
79
|
-
withheldPaths
|
|
166
|
+
withheldPaths,
|
|
80
167
|
unit: "entries",
|
|
81
168
|
output: "(empty directory)",
|
|
169
|
+
details: { skipped: search.skipped, selection: { scanned, retained: selection.retained } },
|
|
82
170
|
shownCount: 0,
|
|
83
171
|
totalCount: 0,
|
|
84
172
|
truncated: false,
|
|
@@ -95,14 +183,15 @@ export const lsTool: ToolSpec = {
|
|
|
95
183
|
const truncated = entryLimitReached || truncation.truncated;
|
|
96
184
|
return finalizeObservation({
|
|
97
185
|
tool: ToolNames.Ls,
|
|
98
|
-
withheldPaths
|
|
186
|
+
withheldPaths,
|
|
99
187
|
unit: "entries",
|
|
100
188
|
output: truncation.content,
|
|
189
|
+
details: { skipped: search.skipped, selection: { scanned, retained: selection.retained } },
|
|
101
190
|
// Offload only when the byte cap cut collected entries; a bare
|
|
102
191
|
// entry limit continues via `next`.
|
|
103
192
|
...(truncation.truncated ? { fullOutput } : {}),
|
|
104
193
|
shownCount: truncation.outputLines,
|
|
105
|
-
totalCount:
|
|
194
|
+
totalCount: visibleCount,
|
|
106
195
|
truncated,
|
|
107
196
|
...(entryLimitReached ? { next: `limit=${limit * 2}` } : {}),
|
|
108
197
|
reservation,
|
|
@@ -111,6 +200,8 @@ export const lsTool: ToolSpec = {
|
|
|
111
200
|
} catch (err) {
|
|
112
201
|
const msg = err instanceof Error ? err.message : String(err);
|
|
113
202
|
return { kind: "error", message: `ls: ${msg}` };
|
|
203
|
+
} finally {
|
|
204
|
+
releaseObservation(reservation);
|
|
114
205
|
}
|
|
115
206
|
},
|
|
116
207
|
};
|
package/src/tools/policy.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type BuiltinToolName, isBuiltinToolName, type ToolName, ToolNames } from "../core/tool-names.js";
|
|
2
2
|
import { type ActionClass, classify } from "../domains/safety/action-classifier.js";
|
|
3
|
+
import { DATA_OBSERVATION_SELF_CAP_BYTES, GATEWAY_FIND_SELF_CAP_BYTES } from "./gateway/caps.js";
|
|
3
4
|
import { OBSERVATION_POLICY_SLACK_BYTES, OBSERVE_SELF_CAPS } from "./observation.js";
|
|
4
5
|
import { readMaxBytes } from "./read.js";
|
|
5
6
|
import type { ToolExecutionMode, ToolSpec } from "./registry.js";
|
|
@@ -11,7 +12,15 @@ import type { ToolExecutionMode, ToolSpec } from "./registry.js";
|
|
|
11
12
|
* differently from what the policy engine assumes.
|
|
12
13
|
*/
|
|
13
14
|
|
|
14
|
-
export type ToolPlane =
|
|
15
|
+
export type ToolPlane =
|
|
16
|
+
| "observe"
|
|
17
|
+
| "mutate"
|
|
18
|
+
| "execute"
|
|
19
|
+
| "orchestrate"
|
|
20
|
+
| "retrieve"
|
|
21
|
+
| "interact"
|
|
22
|
+
| "artifact"
|
|
23
|
+
| "gateway";
|
|
15
24
|
|
|
16
25
|
interface PlaneExpectation {
|
|
17
26
|
plane: ToolPlane;
|
|
@@ -29,6 +38,12 @@ export const TOOL_PLANES: Readonly<Record<BuiltinToolName, PlaneExpectation>> =
|
|
|
29
38
|
[ToolNames.CodeNav]: { plane: "observe", actionClass: "read", executionMode: "parallel" },
|
|
30
39
|
[ToolNames.Context]: { plane: "observe", actionClass: "read", executionMode: "parallel" },
|
|
31
40
|
[ToolNames.CredentialPresent]: { plane: "observe", actionClass: "read", executionMode: "parallel" },
|
|
41
|
+
// clio_docs and clio_library are the bundled-documentation and recipe-catalog
|
|
42
|
+
// reads that used to be context scopes; same envelope, same read class.
|
|
43
|
+
[ToolNames.ClioDocs]: { plane: "observe", actionClass: "read", executionMode: "parallel" },
|
|
44
|
+
[ToolNames.ClioLibrary]: { plane: "observe", actionClass: "read", executionMode: "parallel" },
|
|
45
|
+
// data streams structured files and never writes; parallel like read.
|
|
46
|
+
[ToolNames.Data]: { plane: "observe", actionClass: "read", executionMode: "parallel" },
|
|
32
47
|
[ToolNames.Write]: { plane: "mutate", actionClass: "write", executionMode: "sequential" },
|
|
33
48
|
[ToolNames.Edit]: { plane: "mutate", actionClass: "write", executionMode: "sequential" },
|
|
34
49
|
[ToolNames.Bash]: { plane: "execute", actionClass: "execute", executionMode: "sequential" },
|
|
@@ -36,6 +51,9 @@ export const TOOL_PLANES: Readonly<Record<BuiltinToolName, PlaneExpectation>> =
|
|
|
36
51
|
// its containment posture, read class for its safety disposition.
|
|
37
52
|
[ToolNames.Git]: { plane: "execute", actionClass: "read", executionMode: "parallel" },
|
|
38
53
|
[ToolNames.Verify]: { plane: "execute", actionClass: "execute", executionMode: "sequential" },
|
|
54
|
+
// run_script runs one interpreter over one workspace script and projects
|
|
55
|
+
// itself to a bash command for the policy engine; execute class, sequential.
|
|
56
|
+
[ToolNames.RunScript]: { plane: "execute", actionClass: "execute", executionMode: "sequential" },
|
|
39
57
|
[ToolNames.Dispatch]: { plane: "orchestrate", actionClass: "dispatch", executionMode: "sequential" },
|
|
40
58
|
// monitor never mutates a run, so it stays read class and parallel.
|
|
41
59
|
[ToolNames.Monitor]: { plane: "orchestrate", actionClass: "read", executionMode: "parallel" },
|
|
@@ -62,16 +80,25 @@ export const TOOL_PLANES: Readonly<Record<BuiltinToolName, PlaneExpectation>> =
|
|
|
62
80
|
// nothing else. Read class so it never trips a safety gate; sequential so
|
|
63
81
|
// two decisions in one batch never race the supersede lookup.
|
|
64
82
|
[ToolNames.Decide]: { plane: "orchestrate", actionClass: "read", executionMode: "sequential" },
|
|
83
|
+
// web_read is the GET-only half of the split: no method, headers, or body,
|
|
84
|
+
// so it is never an outward action.
|
|
85
|
+
[ToolNames.WebRead]: { plane: "retrieve", actionClass: "read", executionMode: "parallel" },
|
|
65
86
|
[ToolNames.WebFetch]: { plane: "retrieve", actionClass: "read", executionMode: "parallel" },
|
|
66
87
|
[ToolNames.AskUser]: { plane: "interact", actionClass: "read", executionMode: "sequential" },
|
|
67
88
|
[ToolNames.Artifact]: { plane: "artifact", actionClass: "write", executionMode: "sequential" },
|
|
89
|
+
// gateway lists, describes, and calls secondary capabilities. Its own class
|
|
90
|
+
// is read; a call carries the capability's class through the same admission.
|
|
91
|
+
// Sequential because a call may park for approval or run a sequential
|
|
92
|
+
// capability, and two such calls in one batch must not interleave.
|
|
93
|
+
[ToolNames.Gateway]: { plane: "gateway", actionClass: "read", executionMode: "sequential" },
|
|
68
94
|
};
|
|
69
95
|
|
|
70
96
|
/**
|
|
71
97
|
* OBSERVE envelope members and their self-caps. The registry policy cap must
|
|
72
98
|
* sit at or above self cap + slack so the envelope's own notice line survives
|
|
73
99
|
* the backstop. credential_present sits in the OBSERVE plane but returns a
|
|
74
|
-
* typed boolean, so it carries no envelope cap.
|
|
100
|
+
* typed boolean, so it carries no envelope cap. The gateway is listed for its
|
|
101
|
+
* find listing, which uses the envelope's JSON stub rule.
|
|
75
102
|
*/
|
|
76
103
|
const OBSERVE_ENVELOPE_SELF_CAPS: ReadonlyArray<[BuiltinToolName, () => number]> = [
|
|
77
104
|
[ToolNames.Read, () => readMaxBytes()],
|
|
@@ -79,16 +106,11 @@ const OBSERVE_ENVELOPE_SELF_CAPS: ReadonlyArray<[BuiltinToolName, () => number]>
|
|
|
79
106
|
[ToolNames.Find, () => OBSERVE_SELF_CAPS.find],
|
|
80
107
|
[ToolNames.Ls, () => OBSERVE_SELF_CAPS.ls],
|
|
81
108
|
[ToolNames.CodeNav, () => OBSERVE_SELF_CAPS.codeNav],
|
|
82
|
-
[
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
OBSERVE_SELF_CAPS.contextSkills,
|
|
88
|
-
OBSERVE_SELF_CAPS.contextWorkspace,
|
|
89
|
-
OBSERVE_SELF_CAPS.contextLibrary,
|
|
90
|
-
),
|
|
91
|
-
],
|
|
109
|
+
[ToolNames.Context, () => Math.max(OBSERVE_SELF_CAPS.contextSkills, OBSERVE_SELF_CAPS.contextWorkspace)],
|
|
110
|
+
[ToolNames.ClioDocs, () => OBSERVE_SELF_CAPS.contextDocs],
|
|
111
|
+
[ToolNames.ClioLibrary, () => OBSERVE_SELF_CAPS.contextLibrary],
|
|
112
|
+
[ToolNames.Data, () => DATA_OBSERVATION_SELF_CAP_BYTES],
|
|
113
|
+
[ToolNames.Gateway, () => GATEWAY_FIND_SELF_CAP_BYTES],
|
|
92
114
|
];
|
|
93
115
|
|
|
94
116
|
const SESSION_BOUND_TOOLS = new Set<ToolName>([]);
|
|
@@ -104,7 +126,7 @@ const PANES_BOUND_TOOLS = new Set<ToolName>([ToolNames.Panes]);
|
|
|
104
126
|
*/
|
|
105
127
|
const LEDGER_BOUND_TOOLS = new Set<ToolName>([ToolNames.Ledger]);
|
|
106
128
|
/** The RETRIEVE plane, omitted wholesale by a hermetic run (tools/network-policy.ts). */
|
|
107
|
-
const NETWORK_BOUND_TOOLS = new Set<ToolName>([ToolNames.WebFetch]);
|
|
129
|
+
const NETWORK_BOUND_TOOLS = new Set<ToolName>([ToolNames.WebRead, ToolNames.WebFetch]);
|
|
108
130
|
|
|
109
131
|
export interface BuiltinToolPolicyOptions {
|
|
110
132
|
includeSessionTools?: boolean;
|
|
@@ -58,11 +58,15 @@ export const TOOL_PRESENTATION: Readonly<Record<string, ToolPresentationPolicy>>
|
|
|
58
58
|
[ToolNames.CodeNav]: FOLDED,
|
|
59
59
|
[ToolNames.Context]: FOLDED,
|
|
60
60
|
[ToolNames.CredentialPresent]: FOLDED,
|
|
61
|
+
[ToolNames.ClioDocs]: FOLDED,
|
|
62
|
+
[ToolNames.ClioLibrary]: FOLDED,
|
|
63
|
+
[ToolNames.Data]: FOLDED,
|
|
61
64
|
[ToolNames.Write]: FOLDED_WITH_DIFF,
|
|
62
65
|
[ToolNames.Edit]: FOLDED_WITH_DIFF,
|
|
63
66
|
[ToolNames.Bash]: FOLDED,
|
|
64
67
|
[ToolNames.Git]: FOLDED,
|
|
65
68
|
[ToolNames.Verify]: FOLDED,
|
|
69
|
+
[ToolNames.RunScript]: FOLDED,
|
|
66
70
|
[ToolNames.Dispatch]: FOLDED,
|
|
67
71
|
[ToolNames.Monitor]: FOLDED,
|
|
68
72
|
[ToolNames.Steer]: FOLDED,
|
|
@@ -71,9 +75,11 @@ export const TOOL_PRESENTATION: Readonly<Record<string, ToolPresentationPolicy>>
|
|
|
71
75
|
[ToolNames.Panes]: FOLDED,
|
|
72
76
|
[ToolNames.Limitation]: FOLDED,
|
|
73
77
|
[ToolNames.Decide]: FOLDED,
|
|
78
|
+
[ToolNames.WebRead]: FOLDED,
|
|
74
79
|
[ToolNames.WebFetch]: FOLDED,
|
|
75
80
|
[ToolNames.AskUser]: FOLDED,
|
|
76
81
|
[ToolNames.Artifact]: FOLDED,
|
|
82
|
+
[ToolNames.Gateway]: FOLDED,
|
|
77
83
|
};
|
|
78
84
|
|
|
79
85
|
function readStringField(args: unknown, key: string): string | null {
|