@iowarp/clio-coder 0.4.8 → 0.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +82 -0
- package/README.md +7 -6
- package/dist/{acp-JWPQZM2D.js → acp-ZWZCPS2A.js} +13 -13
- package/dist/{agents-4GCDIRVX.js → agents-LYSOWZUE.js} +53 -52
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-SYAKTDQE.js → auth-WBQGKWQ5.js} +27 -27
- package/dist/{background-OW67WMYR.js → background-BUMOBAQN.js} +4 -4
- package/dist/{builtins-TKS63VNV.js → builtins-ODRJOEDI.js} +7 -7
- package/dist/{chunk-JLBVCROW.js → chunk-2DRRZ57Q.js} +33 -24
- package/dist/chunk-2JBZYUPY.js +105 -0
- package/dist/chunk-2KUBKL63.js +336 -0
- package/dist/{chunk-K45LHSCI.js → chunk-2VBWFXYE.js} +7 -3
- package/dist/{chunk-XTLJDC2X.js → chunk-2X2R3UTH.js} +23 -18
- package/dist/{chunk-5HULHKT2.js → chunk-37LW32LZ.js} +5 -5
- package/dist/{chunk-W7KNI3F5.js → chunk-3AND2EFU.js} +5 -5
- package/dist/{chunk-36XSBPXL.js → chunk-3RDHGNU7.js} +95 -27
- package/dist/{chunk-BIY22UUK.js → chunk-3SUDBGEI.js} +11 -10
- package/dist/{chunk-3IQOZRQ6.js → chunk-3TQN67I2.js} +7 -7
- package/dist/{chunk-KWJXCL2X.js → chunk-3U4BL2EV.js} +3 -3
- package/dist/{chunk-RBES4TCZ.js → chunk-3UQADNG2.js} +3 -3
- package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
- package/dist/{chunk-MWMW53WW.js → chunk-4ATBOFRP.js} +649 -193
- package/dist/{chunk-QGIC5SX5.js → chunk-4DNL43EZ.js} +3 -3
- package/dist/{chunk-GVU4CXPJ.js → chunk-4HFJKRGZ.js} +113 -54
- package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
- package/dist/{chunk-LZDLYSUN.js → chunk-5RTEFNBP.js} +3 -3
- package/dist/{chunk-HMGAKB7E.js → chunk-64XJW7NT.js} +15 -15
- package/dist/{chunk-EXKUF426.js → chunk-7FBCRWVT.js} +280 -280
- package/dist/{chunk-K3W6BF5C.js → chunk-7JSOSVLP.js} +2 -2
- package/dist/{chunk-WFTSK7N3.js → chunk-7N3OLLSL.js} +4 -4
- package/dist/{chunk-JRA6OBHY.js → chunk-A6DULIMH.js} +17 -5
- package/dist/{chunk-R5NRX5N4.js → chunk-AB3QXXBC.js} +2 -2
- package/dist/chunk-ACCECAH4.js +49 -0
- package/dist/{chunk-GJBJHJNY.js → chunk-AM6CEP2K.js} +5 -5
- package/dist/{chunk-MUXNDNMZ.js → chunk-AY4XE6GN.js} +19 -13
- package/dist/{chunk-MATCRH3M.js → chunk-BBA2TAWV.js} +9 -9
- package/dist/{chunk-PMUUAABD.js → chunk-BMNVVKEW.js} +9 -9
- package/dist/{chunk-TOPICHGR.js → chunk-CTGZCEI6.js} +2 -2
- package/dist/{chunk-L75H5B3B.js → chunk-DIAJYJYG.js} +2 -2
- package/dist/{chunk-JIMWEYWO.js → chunk-EHZRAB4U.js} +2 -2
- package/dist/{chunk-YXANQGCX.js → chunk-EM2DIQAJ.js} +6 -6
- package/dist/{chunk-JCVIL6TY.js → chunk-ETF4ROKH.js} +4 -4
- package/dist/{chunk-5W4FRA5Q.js → chunk-F2YM3JY4.js} +483 -253
- package/dist/{chunk-YGIV24MF.js → chunk-FEBQWHJT.js} +21 -16
- package/dist/{chunk-PGEFOTJB.js → chunk-FPS4R2RN.js} +5 -4
- package/dist/{chunk-XC5POIL4.js → chunk-G5R53COU.js} +1 -1
- package/dist/chunk-GHXGMFQ5.js +40 -0
- package/dist/{chunk-QLKCCC2J.js → chunk-GJDRMBDI.js} +14 -14
- package/dist/{chunk-2ZWLMA3T.js → chunk-GREYLTZ5.js} +7 -7
- package/dist/{chunk-YXFKLMX2.js → chunk-H2WSCZZT.js} +22 -6
- package/dist/{chunk-FNVPQQYT.js → chunk-H6IUCY6Q.js} +2 -2
- package/dist/{chunk-5C2OQHLR.js → chunk-H72DCH3E.js} +92 -203
- package/dist/{chunk-JYKUMHCQ.js → chunk-H7TXJR23.js} +21 -21
- package/dist/chunk-HBJQQTKM.js +40 -0
- package/dist/chunk-HCVKSGNZ.js +990 -0
- package/dist/{chunk-ARRUMZ7X.js → chunk-I47EJPYL.js} +3 -3
- package/dist/{chunk-YKIIWURD.js → chunk-IALGWTLO.js} +3 -3
- package/dist/{chunk-FB3KTE2J.js → chunk-IALZJE37.js} +4 -4
- package/dist/{chunk-RAUOKUZV.js → chunk-IC7JXLOM.js} +15 -10
- package/dist/{chunk-LLCGGVSW.js → chunk-IOSVTTCD.js} +7 -7
- package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
- package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
- package/dist/{chunk-UDAK6GR2.js → chunk-JIYWMQZ5.js} +2 -2
- package/dist/{chunk-O3HSB2YL.js → chunk-JKU34ACI.js} +2 -2
- package/dist/{chunk-6X7VOCDY.js → chunk-JTR3VSV3.js} +3 -3
- package/dist/{chunk-O2QJDRWP.js → chunk-JU6MAMRJ.js} +4 -4
- package/dist/chunk-JURMQWVJ.js +15 -0
- package/dist/{chunk-STC6CWUZ.js → chunk-K3XN4LZ4.js} +5 -5
- package/dist/{chunk-ATB3Q7YO.js → chunk-KIVFXGBM.js} +27 -2
- package/dist/{chunk-WJWNZXRM.js → chunk-KOAHT3N2.js} +2 -2
- package/dist/chunk-KP5BPXR3.js +73 -0
- package/dist/{chunk-K53E2PTW.js → chunk-KRJQG47M.js} +3 -3
- package/dist/{chunk-IILXVWJY.js → chunk-KW6OJ7IY.js} +19 -21
- package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
- package/dist/{chunk-2U2U5POA.js → chunk-L4RUTLRL.js} +5 -5
- package/dist/{chunk-QYSAZMSH.js → chunk-LGTVWPRN.js} +2 -2
- package/dist/{chunk-KGP3UQGJ.js → chunk-LSQW6KZO.js} +5 -5
- package/dist/{chunk-P4JS3MH5.js → chunk-LWJYOHT3.js} +8 -8
- package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
- package/dist/{chunk-5D2FNBMG.js → chunk-MJ4QEJVT.js} +2 -2
- package/dist/{chunk-RM3XJX7P.js → chunk-MO65K5CH.js} +5 -5
- package/dist/{chunk-H5DPSUBB.js → chunk-MTOZEQHL.js} +3 -3
- package/dist/{chunk-6R5MBXBJ.js → chunk-NBPA5QM6.js} +2 -2
- package/dist/{chunk-H77XBUBM.js → chunk-NMBEW4PP.js} +3 -3
- package/dist/{chunk-QWUSS2QP.js → chunk-NPLLK3HO.js} +67 -87
- package/dist/{chunk-K5UJD6MM.js → chunk-NSYGPIVW.js} +5 -5
- package/dist/{context-EZZPT2ZV.js → chunk-NXTV5OI5.js} +30 -84
- package/dist/{chunk-F7Y6QTPL.js → chunk-NYDG4QP4.js} +4 -4
- package/dist/{chunk-PFZJMXIY.js → chunk-OA2GDACN.js} +2 -2
- package/dist/{chunk-Q32C6AWI.js → chunk-PJI57EC6.js} +4 -4
- package/dist/{chunk-EFXMQYI6.js → chunk-PJJBUGMR.js} +52 -52
- package/dist/{chunk-ICYIUNO4.js → chunk-PNJE7JPS.js} +18 -3
- package/dist/chunk-PP23PZEV.js +1347 -0
- package/dist/chunk-PPIFDSBK.js +409 -0
- package/dist/{chunk-RFULVPBX.js → chunk-PTFISXQO.js} +6 -5
- package/dist/{chunk-JV25I7ID.js → chunk-QB33Z5S7.js} +5 -5
- package/dist/{chunk-D55WO5J7.js → chunk-QGNII5VC.js} +8 -8
- package/dist/{chunk-RKFNU5UA.js → chunk-QI72X67S.js} +104 -27
- package/dist/chunk-QKHZZFKH.js +98 -0
- package/dist/{chunk-5UG6EZI3.js → chunk-RDKX2PME.js} +4 -4
- package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
- package/dist/{chunk-BE4I3UJ2.js → chunk-RQROVOV3.js} +15 -13
- package/dist/{chunk-TEHVMHOK.js → chunk-S34A7BSP.js} +3 -3
- package/dist/{chunk-4P6M2TTE.js → chunk-SJETVJHX.js} +2 -2
- package/dist/{chunk-OPC4DQD6.js → chunk-SJMNU4ZS.js} +2 -2
- package/dist/{chunk-2JSCCEKO.js → chunk-SLLG2G44.js} +2 -2
- package/dist/{chunk-EPYATQMG.js → chunk-SQAZN2V3.js} +42 -16
- package/dist/{chunk-E2NSPYLC.js → chunk-SQBT46OF.js} +5 -5
- package/dist/{chunk-WTZVSMQZ.js → chunk-TCUOGIL2.js} +5 -5
- package/dist/{chunk-RRZFRIJP.js → chunk-TIWPKCVO.js} +5 -5
- package/dist/{chunk-QLAGXTTV.js → chunk-UIU7MGZ3.js} +5 -1
- package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
- package/dist/{chunk-PJ5H5B7A.js → chunk-VPWGADBG.js} +18 -18
- package/dist/{chunk-GEYX2NZ5.js → chunk-VWFCAK34.js} +6 -6
- package/dist/{chunk-44U2OUSM.js → chunk-W72LLZAV.js} +2 -2
- package/dist/{chunk-ORRNGQDV.js → chunk-WGRDABW7.js} +4 -4
- package/dist/{chunk-RNLAPBJL.js → chunk-XFLSL7BT.js} +2 -2
- package/dist/{chunk-2SXGG2IV.js → chunk-XJZEDCNT.js} +6 -6
- package/dist/{chunk-UB33F3YW.js → chunk-XLLEL3K7.js} +5 -5
- package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
- package/dist/{chunk-WS4FOGLY.js → chunk-XNZWWDC3.js} +2 -2
- package/dist/{chunk-P7GTE4FX.js → chunk-XRECG65F.js} +2 -2
- package/dist/chunk-XTQ7MEJG.js +457 -0
- package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
- package/dist/{chunk-OEMFEL26.js → chunk-Y3M2T5RO.js} +3 -3
- package/dist/{chunk-HP7KJ5O2.js → chunk-YPQOPFP7.js} +6 -6
- package/dist/{chunk-MEHBW2SP.js → chunk-YQYINEJI.js} +6 -6
- package/dist/{chunk-RXI7K4J5.js → chunk-ZF6CV4WZ.js} +1338 -217
- package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
- package/dist/{chunk-526ABLHD.js → chunk-ZKQ63XZ5.js} +12 -35
- package/dist/{chunk-PAQVETLA.js → chunk-ZKVMDNAN.js} +5 -5
- package/dist/cli/index.js +47 -37
- package/dist/{clio-BPBAPZGA.js → clio-JUDCLNHC.js} +7 -7
- package/dist/clio-context-tools-FT672MNZ.js +136 -0
- package/dist/{code-nav-KBQ3RIFK.js → code-nav-7OVCTP2Z.js} +28 -26
- package/dist/{components-6DKAXWFN.js → components-OZXZMDWU.js} +5 -5
- package/dist/{config-FWL5JK2H.js → config-P3ZQVF63.js} +80 -75
- package/dist/{config-graph-ACDB26L2.js → config-graph-GKAOBAS5.js} +74 -70
- package/dist/{configure-ZIZ4YV62.js → configure-25LRYZJG.js} +45 -44
- package/dist/context-72VQV7JX.js +73 -0
- package/dist/{context-VIL5MFRH.js → context-COWRWXP3.js} +74 -70
- package/dist/{context-Z3GOBHDK.js → context-WB3D474G.js} +12 -12
- package/dist/{context-clear-ZPB3L7MN.js → context-clear-Y4LYMWC6.js} +70 -66
- package/dist/{context-working-set-2GLBVF7L.js → context-working-set-TMZYVC7A.js} +15 -14
- package/dist/data-tool-KMBWKKWR.js +2987 -0
- package/dist/{detail-VSBWYSGZ.js → detail-4GLROGY5.js} +71 -67
- package/dist/{dispatch-runner-EEEHGKX4.js → dispatch-runner-TR3LBP5P.js} +92 -88
- package/dist/{docs-VMMWFVHL.js → docs-ZK777W2G.js} +3 -3
- package/dist/{doctor-V5L4IQGP.js → doctor-WC4OV2OB.js} +61 -59
- package/dist/{eval-VJYJ2BV3.js → eval-FUNWJNUJ.js} +45 -45
- package/dist/{evals-J2H5V6DD.js → evals-L73EBHSU.js} +4 -4
- package/dist/{evidence-Y35YSXH6.js → evidence-AVJ2RTHX.js} +80 -76
- package/dist/{evidence-POWAEBEW.js → evidence-P4NZOAK7.js} +70 -66
- package/dist/{evidence-XCCCLS36.js → evidence-Y55WKYHH.js} +79 -75
- package/dist/{evolve-GPG72VB6.js → evolve-MAWKRYWF.js} +75 -71
- package/dist/{extensions-YIZ7W3DA.js → extensions-PYQH3H47.js} +8 -8
- package/dist/{fleet-2MDCQ2VK.js → fleet-M4H2QBWT.js} +84 -80
- package/dist/{fleet-W2AF3TOJ.js → fleet-ULBXXRDR.js} +123 -119
- package/dist/{fleet-commands-WS56G26H.js → fleet-commands-7NNC4JZU.js} +17 -16
- package/dist/{fleet-decisions-MYGZ3JW7.js → fleet-decisions-EHEY7KPU.js} +9 -9
- package/dist/{fleet-graph-ELTBXBAV.js → fleet-graph-LQ2AHZT3.js} +15 -15
- package/dist/{fleet-inspect-45IK73L4.js → fleet-inspect-5IGBIIYZ.js} +76 -72
- package/dist/{fleet-preflight-T5NCZKHE.js → fleet-preflight-UTTNOKMG.js} +7 -2
- package/dist/{fleet-validate-VG4JBLA4.js → fleet-validate-YGILJKA6.js} +20 -20
- package/dist/{fleet-verify-VTSABAYO.js → fleet-verify-AUWTCDKR.js} +70 -66
- package/dist/{fleet-view-XC7WMKSS.js → fleet-view-TGUFCY5A.js} +73 -69
- package/dist/{init-VTJNNTIP.js → init-GFN2Z7NF.js} +94 -90
- package/dist/{interop-IU6BNA7C.js → interop-EF5JUWWK.js} +21 -21
- package/dist/{inventory-QPQUTUUZ.js → inventory-I6VJDDYF.js} +73 -69
- package/dist/{library-Q3NWL5CM.js → library-3J5IO2OJ.js} +13 -13
- package/dist/{library-LF7DLU6S.js → library-IJTOFTDS.js} +16 -15
- package/dist/{library-HUTAS57T.js → library-Z3KZSHPE.js} +27 -27
- package/dist/{library-import-PPW4YUC5.js → library-import-IMKFLDHX.js} +21 -21
- package/dist/{library-inventory-DIRVFRZU.js → library-inventory-CQP5D6GU.js} +13 -13
- package/dist/{library-validation-XHUZ3INE.js → library-validation-33UTX7AI.js} +11 -11
- package/dist/mcp-5FWZKUS6.js +26 -0
- package/dist/{memory-Z2LSKNV6.js → memory-36CWN67Y.js} +75 -71
- package/dist/{models-3FTREYPY.js → models-KQ6PQJJQ.js} +49 -49
- package/dist/{monitor-HF2MQRB3.js → monitor-XX6ZD6KC.js} +83 -79
- package/dist/{orchestrator-UYPA6W4S.js → orchestrator-SK6HDAOP.js} +1337 -772
- package/dist/{panes-736XB73K.js → panes-L27QRXUH.js} +12 -12
- package/dist/{panes-C4P3PIWT.js → panes-LXZIWNOZ.js} +4 -4
- package/dist/{paths-JQ4QYIYB.js → paths-7DJDU4P4.js} +5 -5
- package/dist/{preload-XSLRYH3Y.js → preload-K2TDYI4Y.js} +70 -66
- package/dist/{reset-V7QSPZYE.js → reset-73VU3XNT.js} +10 -10
- package/dist/{resources-OJGDFHYT.js → resources-3BYJYVYL.js} +16 -16
- package/dist/{run-T354SMDW.js → run-AR7PY6GW.js} +132 -128
- package/dist/run-script-H2KUDIII.js +41 -0
- package/dist/{settings-MWZXO6RV.js → settings-3VMBMWID.js} +4 -4
- package/dist/{share-Y5ZKJPND.js → share-HVWH4FPF.js} +21 -21
- package/dist/{skills-4GLZC4LN.js → skills-5TYEY75Q.js} +22 -22
- package/dist/{skills-eval-L5T7GODM.js → skills-eval-CK3MD63Z.js} +96 -87
- package/dist/{skills-inventory-LASKXEZI.js → skills-inventory-KSFYG3I6.js} +16 -16
- package/dist/{slash-commands-OIMRU36D.js → slash-commands-DMVHML7P.js} +47 -44
- package/dist/{steer-KMAM2Y2C.js → steer-XCD6V3EW.js} +4 -4
- package/dist/{support-AWC3XKPX.js → support-JAZL6VBR.js} +7 -7
- package/dist/{system-CD75NYBU.js → system-3TDQRMZZ.js} +26 -26
- package/dist/{targets-VSZX2J2S.js → targets-EZKHAYRN.js} +66 -65
- package/dist/{tasks-AN567LYH.js → tasks-SNEFHWYW.js} +12 -12
- package/dist/{terminal-lease-6KTWNHVY.js → terminal-lease-BNLFA4OF.js} +8 -7
- package/dist/{tools-AGRK3V5J.js → tools-7IM6BDCE.js} +12 -12
- package/dist/{trace-P4MQZD33.js → trace-C3MBGD4S.js} +8 -8
- package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
- package/dist/{uninstall-BRUTEPIC.js → uninstall-WWLOSZ42.js} +10 -10
- package/dist/{upgrade-SBCGHQGJ.js → upgrade-ETK2JNSJ.js} +37 -47
- package/dist/{usage-BIDVTO6V.js → usage-S2HOB7BZ.js} +93 -89
- package/dist/{verifiers-LTGCAMXS.js → verifiers-QDTEVH7R.js} +24 -22
- package/dist/{verify-OZU4LLNP.js → verify-SUKUK6XM.js} +15 -14
- package/dist/web/client/assets/{abnfDiagram-VCTEODGH-C5wfoHm3.js → abnfDiagram-VCTEODGH-BznNOe_I.js} +1 -1
- package/dist/web/client/assets/{arc-oH91sfLl.js → arc-Pry-7G1_.js} +1 -1
- package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
- package/dist/web/client/assets/{blockDiagram-I7D4REHJ-wi0_CYHL.js → blockDiagram-I7D4REHJ-prINbpbM.js} +1 -1
- package/dist/web/client/assets/{c4Diagram-7LVT6UL2-DV7NYc2W.js → c4Diagram-7LVT6UL2-DkVRKtyU.js} +1 -1
- package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
- package/dist/web/client/assets/{chunk-4HAMMTFA-Bhsegh3F.js → chunk-4HAMMTFA-CV0Z1ApC.js} +1 -1
- package/dist/web/client/assets/{chunk-75Z2AOVW-RQCckcQG.js → chunk-75Z2AOVW-D34Nohxq.js} +1 -1
- package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
- package/dist/web/client/assets/{chunk-F27PBJKO-BcNqv2x1.js → chunk-F27PBJKO-CmRojxkG.js} +1 -1
- package/dist/web/client/assets/{chunk-GMAD6QVW-Bq8JWiZT.js → chunk-GMAD6QVW-ClYZmc73.js} +1 -1
- package/dist/web/client/assets/{chunk-GVQU2GXP-DbchrAeJ.js → chunk-GVQU2GXP-B2BiHFt-.js} +1 -1
- package/dist/web/client/assets/{chunk-IMKFNOWR-DrpvjocK.js → chunk-IMKFNOWR-BGApZ8nP.js} +1 -1
- package/dist/web/client/assets/{chunk-L3NEJ4N5-DHLmTnCe.js → chunk-L3NEJ4N5-DIzCgpkY.js} +1 -1
- package/dist/web/client/assets/{chunk-OSK3NFVY-CsRbtN9n.js → chunk-OSK3NFVY-BPT-yePv.js} +1 -1
- package/dist/web/client/assets/{chunk-P2QGCYS3-aqPbxoMh.js → chunk-P2QGCYS3-BC1WTc2t.js} +1 -1
- package/dist/web/client/assets/{chunk-POPQ4Y6H-Dl5vw0h0.js → chunk-POPQ4Y6H-BSjzBmZU.js} +1 -1
- package/dist/web/client/assets/{chunk-PWAF6VOD-D7OBRSdO.js → chunk-PWAF6VOD-BIjLs86Z.js} +1 -1
- package/dist/web/client/assets/{chunk-SHT3W25Y-CdKCIwuB.js → chunk-SHT3W25Y-CduDz2cm.js} +1 -1
- package/dist/web/client/assets/{chunk-SVP7TREG-B94Nu_1-.js → chunk-SVP7TREG-XUn4pPAP.js} +1 -1
- package/dist/web/client/assets/{chunk-TICWLB2K-jjRQI_hk.js → chunk-TICWLB2K-DcBy2DKy.js} +1 -1
- package/dist/web/client/assets/{chunk-XXDRQBXY-azkbKE37.js → chunk-XXDRQBXY-DqAYeljN.js} +1 -1
- package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
- package/dist/web/client/assets/{cynefin-OW5HDTMX--i9RDU5f.js → cynefin-OW5HDTMX-BecPbyM6.js} +1 -1
- package/dist/web/client/assets/{cynefinDiagram-5FMLGOSQ-cRcvyBdp.js → cynefinDiagram-5FMLGOSQ-BzMzFwyT.js} +1 -1
- package/dist/web/client/assets/{dagre-GXQ25YYZ-C9mZmAPe.js → dagre-GXQ25YYZ-CAWJmRMG.js} +1 -1
- package/dist/web/client/assets/{diagram-S7CK7UJ4-Oj_zlLDY.js → diagram-S7CK7UJ4--lp0ALmn.js} +1 -1
- package/dist/web/client/assets/{diagram-UQ7AKVKN-BWKbbfcR.js → diagram-UQ7AKVKN-gKUnsjcj.js} +1 -1
- package/dist/web/client/assets/{diagram-VSXAHHWV-C3N3f7DO.js → diagram-VSXAHHWV-BoN5D1Gh.js} +1 -1
- package/dist/web/client/assets/{diagram-VX7I27RA-CtDKDAWe.js → diagram-VX7I27RA-BMtuswQ6.js} +1 -1
- package/dist/web/client/assets/{diagram-Z3DM3KII-B8bkBRCz.js → diagram-Z3DM3KII-DtU8LXrA.js} +1 -1
- package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/web/client/assets/{ebnfDiagram-PWID7BFC-CskW-Whx.js → ebnfDiagram-PWID7BFC-DDcnv9BH.js} +1 -1
- package/dist/web/client/assets/{erDiagram-RLTQ6QDP-C-83cgCW.js → erDiagram-RLTQ6QDP-DvRb4iDL.js} +1 -1
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
- package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
- package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
- package/dist/web/client/assets/{gitGraph-4MIJSDKK-B40cQtBE.js → gitGraph-4MIJSDKK-DjD_AAMj.js} +1 -1
- package/dist/web/client/assets/{gitGraphDiagram-WWUBYQGX-CH-7P7Di.js → gitGraphDiagram-WWUBYQGX-CDyN9n2u.js} +1 -1
- package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
- package/dist/web/client/assets/{info-A6RAGUB7-eCCE9D_Q.js → info-A6RAGUB7-C_XK8Hq0.js} +1 -1
- package/dist/web/client/assets/{infoDiagram-27XIBGKW-DRnvqMjM.js → infoDiagram-27XIBGKW-DIe4tJ1i.js} +1 -1
- package/dist/web/client/assets/{ishikawaDiagram-5VMMS53U-DBA_55wp.js → ishikawaDiagram-5VMMS53U-CVl5unKI.js} +1 -1
- package/dist/web/client/assets/{journeyDiagram-3NMN7TZE-C-ewpNl7.js → journeyDiagram-3NMN7TZE-CPEB1Vt8.js} +1 -1
- package/dist/web/client/assets/{kanban-definition-UXKFOSKX-B1taGsu0.js → kanban-definition-UXKFOSKX-j-9WXjYQ.js} +1 -1
- package/dist/web/client/assets/{line-lZ0kyxDI.js → line-BIDAcEtX.js} +1 -1
- package/dist/web/client/assets/{linear-DIc8FgZj.js → linear-SzVmGSw4.js} +1 -1
- package/dist/web/client/assets/{mermaid-parser.core-SXolxpXw.js → mermaid-parser.core-Ux4vssh0.js} +3 -3
- package/dist/web/client/assets/{mermaid.core-DXgQtkNg.js → mermaid.core-CDuwVKeh.js} +4 -4
- package/dist/web/client/assets/{mindmap-definition-YA3MSWOX-DXJas9K7.js → mindmap-definition-YA3MSWOX-5MlQEeQ6.js} +1 -1
- package/dist/web/client/assets/{packet-AYTQ26CC-OqVl_07o.js → packet-AYTQ26CC-DRO66c9Q.js} +1 -1
- package/dist/web/client/assets/{pegDiagram-XKGWAZYB-CPE_zdfN.js → pegDiagram-XKGWAZYB-BakZnSjM.js} +1 -1
- package/dist/web/client/assets/{pie-WAS4IAKB-DAxnMBLe.js → pie-WAS4IAKB-BEzcmhz8.js} +1 -1
- package/dist/web/client/assets/{pieDiagram-E7YTZNPT-Uwjpufxv.js → pieDiagram-E7YTZNPT-DpmqgoPt.js} +1 -1
- package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
- package/dist/web/client/assets/{quadrantDiagram-AXDQQJYC-Bjs4yjgs.js → quadrantDiagram-AXDQQJYC-DuMPwwV2.js} +1 -1
- package/dist/web/client/assets/{radar-RG4KPBEZ-CuCKjHM3.js → radar-RG4KPBEZ-Djm3oXl5.js} +1 -1
- package/dist/web/client/assets/{railroad-74A4TZTK-CnQK-Cc1.js → railroad-74A4TZTK-Cpvkwsao.js} +1 -1
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
- package/dist/web/client/assets/{railroadDiagram-O6MQD6OU-BDDIPNLL.js → railroadDiagram-O6MQD6OU-CgMS4B6R.js} +1 -1
- package/dist/web/client/assets/{requirementDiagram-BXWQKSXE-B5Ydyxc1.js → requirementDiagram-BXWQKSXE-CX5eoNdN.js} +1 -1
- package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/web/client/assets/{sankeyDiagram-P5KCCOFB-Bw2Qym75.js → sankeyDiagram-P5KCCOFB-CODBX2N3.js} +1 -1
- package/dist/web/client/assets/{sequenceDiagram-WJ2MYXX4-BZf36nO0.js → sequenceDiagram-WJ2MYXX4-eUhhF8OR.js} +1 -1
- package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
- package/dist/web/client/assets/{stateDiagram-D77RDMKH-DnH6JRkp.js → stateDiagram-D77RDMKH-vR6l0NC2.js} +1 -1
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
- package/dist/web/client/assets/{swimlanes-42K2YHIH-D9PZmtZg.js → swimlanes-42K2YHIH-v9Tw_zX7.js} +1 -1
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
- package/dist/web/client/assets/{timeline-definition-24CTP7MA-CrkZZBo7.js → timeline-definition-24CTP7MA-DxianbhU.js} +1 -1
- package/dist/web/client/assets/{treeView-Q6P3EWNA-C9zDShoC.js → treeView-Q6P3EWNA-DLxnZb9R.js} +1 -1
- package/dist/web/client/assets/{treemap-WGGIJYW6-B-plj9yK.js → treemap-WGGIJYW6-I7UnZ6xJ.js} +1 -1
- package/dist/web/client/assets/{vennDiagram-4TSXK5OY-VeOdaphN.js → vennDiagram-4TSXK5OY-Ar7M8Mrj.js} +1 -1
- package/dist/web/client/assets/{wardley-WFR3VGLG-Wl1P_m6L.js → wardley-WFR3VGLG-B8ZSHeDu.js} +1 -1
- package/dist/web/client/assets/{wardleyDiagram-VM6X3IG4-B85-R9t2.js → wardleyDiagram-VM6X3IG4-Qks2FmIn.js} +1 -1
- package/dist/web/client/assets/{xychartDiagram-S5SC5T6Z-BrD8OW8m.js → xychartDiagram-S5SC5T6Z-BBBjRtiE.js} +1 -1
- package/dist/web/client/index.html +3 -1
- package/dist/web/reads-worker.js +17 -17
- package/dist/web/server.js +25 -25
- package/dist/{web-EU6ATJWA.js → web-EMGUGGEI.js} +3 -3
- package/dist/{web-fetch-U22Q7HV4.js → web-fetch-6BRRVQON.js} +22 -5
- package/dist/{wiki-generate-LZRLFG6I.js → wiki-generate-XHSJTDOP.js} +104 -100
- package/dist/{with-panes-X5CZOGML.js → with-panes-Z6BTEHMZ.js} +11 -11
- package/dist/worker/entry.js +101 -87
- package/docs/README.md +1 -1
- package/docs/architecture/artifact-placement.md +12 -1
- package/docs/architecture/library.md +1 -1
- package/docs/architecture/prompt-envelope-and-tools.md +37 -27
- package/docs/architecture/safety-model.md +19 -6
- package/docs/architecture/session-lifecycle.md +10 -4
- package/docs/architecture/tui-design.md +37 -14
- package/docs/guide/commands-and-modes.md +39 -19
- package/docs/guide/configuration-and-targets.md +7 -5
- package/docs/guide/configuration-reference.md +116 -13
- package/docs/guide/environment-variables.md +2 -5
- package/docs/guide/fleet-dispatch.md +3 -2
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/installation-and-lifecycle.md +2 -2
- package/docs/guide/resource-library.md +1 -1
- package/docs/guide/tool-usage.md +166 -64
- package/docs/guide/troubleshooting.md +1 -1
- package/docs/process/documentation-guide.md +1 -0
- package/docs/process/fleet-demo-runbook.md +6 -6
- package/docs/process/scientific-validation.md +22 -2
- package/docs/process/tool-audit-v0.4.9.md +357 -0
- package/package.json +1 -1
- package/src/cli/argv.ts +31 -0
- package/src/cli/clio.ts +17 -13
- package/src/cli/config.ts +4 -0
- package/src/cli/doctor-panes.ts +1 -1
- package/src/cli/doctor.ts +3 -1
- package/src/cli/index.ts +14 -1
- package/src/cli/mcp.ts +106 -0
- package/src/cli/skills-eval.ts +8 -2
- package/src/cli/upgrade.ts +34 -38
- package/src/cli/verifiers.ts +1 -1
- package/src/core/bash-exec.ts +27 -4
- package/src/core/config.ts +2 -1
- package/src/core/defaults.ts +10 -1
- package/src/core/event-bus.ts +1 -1
- package/src/core/run-records.ts +438 -0
- package/src/core/safe-exec.ts +506 -56
- package/src/core/skill-activation.ts +5 -3
- package/src/core/termination.ts +3 -3
- package/src/core/tool-names.ts +33 -12
- package/src/domains/context/clio-md.ts +1 -1
- package/src/domains/context/worker/pressure.ts +6 -2
- package/src/domains/context/working-set/path-index.ts +7 -2
- package/src/domains/dispatch/code-step.ts +7 -2
- package/src/domains/dispatch/contract.ts +7 -0
- package/src/domains/dispatch/execution-role.ts +3 -3
- package/src/domains/dispatch/execution-scheduler.ts +204 -79
- package/src/domains/dispatch/extension.ts +131 -14
- package/src/domains/dispatch/fleet-preflight.ts +18 -3
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/gate-decisions.ts +3 -3
- package/src/domains/dispatch/heartbeat.ts +1 -1
- package/src/domains/dispatch/host-verification.ts +16 -14
- package/src/domains/dispatch/receipt-findings.ts +3 -4
- package/src/domains/dispatch/reservation-store.ts +7 -9
- package/src/domains/dispatch/route-facts.ts +1 -1
- package/src/domains/dispatch/state.ts +3 -3
- package/src/domains/dispatch/types.ts +1 -1
- package/src/domains/evidence/build.ts +35 -7
- package/src/domains/gateway/mcp/client.ts +923 -0
- package/src/domains/gateway/mcp/config.ts +456 -0
- package/src/domains/gateway/mcp/index.ts +88 -0
- package/src/domains/gateway/mcp/protocol.ts +273 -0
- package/src/domains/gateway/mcp/trust.ts +263 -0
- package/src/domains/lifecycle/doctor.ts +17 -3
- package/src/domains/mux/contract.ts +5 -9
- package/src/domains/mux/detect.ts +1 -1
- package/src/domains/mux/extension.ts +1 -1
- package/src/domains/mux/protocol.ts +5 -7
- package/src/domains/mux/socket-client.ts +3 -3
- package/src/domains/observability/accountability.ts +2 -2
- package/src/domains/observability/contract.ts +7 -3
- package/src/domains/observability/evidence-index.ts +2 -2
- package/src/domains/observability/projection.ts +10 -0
- package/src/domains/prompts/compiler.ts +41 -23
- package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
- package/src/domains/prompts/fragments/operating/skills.md +12 -10
- package/src/domains/providers/index.ts +5 -1
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
- package/src/domains/providers/probe/http.ts +44 -59
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
- package/src/domains/safety/action-classifier.ts +17 -1
- package/src/domains/safety/call-target.ts +14 -0
- package/src/domains/safety/contract.ts +1 -1
- package/src/domains/safety/finish-contract.ts +9 -3
- package/src/domains/safety/loop-detector.ts +1 -1
- package/src/domains/safety/policy-engine.ts +7 -0
- package/src/domains/safety/protected-artifacts.ts +3 -4
- package/src/domains/safety/rejection-feedback.ts +1 -1
- package/src/domains/safety/scope.ts +2 -3
- package/src/domains/safety/validation-contract.ts +3 -2
- package/src/domains/scheduling/budget.ts +5 -3
- package/src/domains/scheduling/contract.ts +2 -1
- package/src/domains/scheduling/extension.ts +3 -3
- package/src/domains/session/compaction/branch-summary.ts +1 -1
- package/src/domains/session/compaction/compact.ts +25 -2
- package/src/domains/session/compaction/cut-point.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +5 -10
- package/src/domains/session/contract.ts +1 -1
- package/src/domains/session/cwd-fallback.ts +2 -2
- package/src/domains/session/handoff.ts +5 -1
- package/src/domains/session/history.ts +6 -0
- package/src/domains/session/manager.ts +14 -7
- package/src/domains/session/retry.ts +2 -1
- package/src/domains/session/session-artifacts.ts +12 -7
- package/src/domains/session/task-board.ts +2 -3
- package/src/engine/apis/openai-completions.ts +8 -0
- package/src/engine/loop-guard.ts +7 -0
- package/src/engine/provider-error-body.ts +65 -0
- package/src/engine/session.ts +118 -29
- package/src/engine/worker-runtime.ts +3 -0
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +18 -2
- package/src/interactive/chat-loop-policy.ts +1 -0
- package/src/interactive/chat-loop.ts +8 -4
- package/src/interactive/chat-panel.ts +23 -9
- package/src/interactive/chat-renderer.ts +33 -11
- package/src/interactive/clio-editor.ts +13 -5
- package/src/interactive/dispatch-board.ts +70 -30
- package/src/interactive/editor-submit.ts +30 -25
- package/src/interactive/footer/widgets.ts +12 -9
- package/src/interactive/interactive-presentation.ts +2 -3
- package/src/interactive/mux-bridge.ts +3 -7
- package/src/interactive/overlay-general-openers.ts +14 -7
- package/src/interactive/overlays/cwd-fallback.ts +1 -1
- package/src/interactive/overlays/library-model.ts +114 -35
- package/src/interactive/overlays/library.ts +52 -5
- package/src/interactive/overlays/list-overlay.ts +4 -1
- package/src/interactive/overlays/session-selector.ts +28 -23
- package/src/interactive/overlays/settings.ts +20 -1
- package/src/interactive/overlays/tree-selector.ts +47 -10
- package/src/interactive/panes-runtime.ts +1 -1
- package/src/interactive/renderers/compaction-summary.ts +1 -1
- package/src/interactive/renderers/provider-error.ts +118 -0
- package/src/interactive/renderers/retry-status.ts +59 -23
- package/src/interactive/renderers/tool-execution.ts +67 -7
- package/src/interactive/renderers/worker-answer.ts +198 -0
- package/src/interactive/renderers/worker-entry.ts +57 -163
- package/src/interactive/slash-commands.ts +26 -1
- package/src/interactive/slash-spec.ts +2 -2
- package/src/interactive/theme/labels.ts +66 -30
- package/src/interactive/turn-persistence.ts +6 -1
- package/src/interactive/turn-recovery.ts +2 -1
- package/src/interactive/turn-runtime.ts +22 -5
- package/src/interactive/view/artifacts.ts +3 -2
- package/src/interactive/view/view-overlay.ts +96 -20
- package/src/tools/agent-tools.ts +21 -7
- package/src/tools/artifact.ts +16 -8
- package/src/tools/bash.ts +90 -11
- package/src/tools/bootstrap.ts +42 -4
- package/src/tools/builtin-tool-catalog.ts +72 -7
- package/src/tools/context/index.ts +27 -31
- package/src/tools/context/library.ts +3 -1
- package/src/tools/context/surface.ts +12 -26
- package/src/tools/core-bootstrap.ts +72 -1
- package/src/tools/data/csv.ts +1189 -0
- package/src/tools/data/index.ts +308 -0
- package/src/tools/data/json.ts +1799 -0
- package/src/tools/data/jsonl.ts +561 -0
- package/src/tools/data/shared.ts +452 -0
- package/src/tools/edit-diff.ts +0 -7
- package/src/tools/edit.ts +115 -18
- package/src/tools/file-mutation-queue.ts +114 -4
- package/src/tools/find.ts +108 -29
- package/src/tools/gateway/caps.ts +11 -0
- package/src/tools/gateway/clio-context-surface.ts +41 -0
- package/src/tools/gateway/clio-context-tools.ts +77 -0
- package/src/tools/gateway/data-surface.ts +138 -0
- package/src/tools/gateway/data-tool.ts +201 -0
- package/src/tools/gateway/index.ts +342 -0
- package/src/tools/gateway/mcp-capabilities.ts +469 -0
- package/src/tools/grep.ts +88 -33
- package/src/tools/harness-extensions.ts +3 -0
- package/src/tools/ignore-policy.ts +7 -5
- package/src/tools/ls.ts +111 -20
- package/src/tools/policy.ts +35 -13
- package/src/tools/presentation.ts +6 -0
- package/src/tools/read.ts +634 -156
- package/src/tools/registry.ts +94 -6
- package/src/tools/run-script.ts +997 -0
- package/src/tools/spawn-hygiene.ts +157 -5
- package/src/tools/surface.ts +163 -0
- package/src/tools/verify/authoring.ts +8 -3
- package/src/tools/verify/catalog.ts +14 -1
- package/src/tools/verify/numeric.ts +367 -59
- package/src/tools/verify/perf.ts +171 -9
- package/src/tools/verify/scripts.ts +178 -26
- package/src/tools/web-fetch-surface.ts +22 -0
- package/src/tools/web-fetch.ts +26 -1
- package/src/tools/write.ts +45 -19
- package/dist/chunk-B6UM3OZC.js +0 -15
- package/dist/chunk-GJ24ODAX.js +0 -196
- package/dist/chunk-LZCCBLRC.js +0 -57
- package/dist/web/client/assets/architecture-7GRP2DOG-EGozsYEO.js +0 -1
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-z9FokbJl.js +0 -36
- package/dist/web/client/assets/channel-CiUWbHN9.js +0 -1
- package/dist/web/client/assets/chunk-DU6HZSFF-C5USiOAy.js +0 -125
- package/dist/web/client/assets/classDiagram-ZZMXUADV-CMODalmo.js +0 -1
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-CMODalmo.js +0 -1
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-RbQL23qS.js +0 -1
- package/dist/web/client/assets/dist-D0_q-A2b.js +0 -1
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-DjVq8wKU.js +0 -1
- package/dist/web/client/assets/flowDiagram-HODETNUW-BUiCBGXt.js +0 -1
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-B2lb8lvF.js +0 -292
- package/dist/web/client/assets/index-FSIC94pi.js +0 -83
- package/dist/web/client/assets/prism-core-BngLtbUd.js +0 -1
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-BcW01NZG.js +0 -1
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-B7YCEDDd.js +0 -1
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-DjNZbSTZ.js +0 -1
- package/dist/web/client/assets/src-yeptRXpt.js +0 -1
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-C7QtHeK4.js +0 -1
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-CBZlPFky.js +0 -8
|
@@ -1,14 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { lstatSync, readlinkSync, realpathSync } from "node:fs";
|
|
3
|
+
import { lstat, mkdir, open, readlink, realpath, rename, stat, unlink } from "node:fs/promises";
|
|
4
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
3
5
|
|
|
4
6
|
const fileMutationQueues = new Map<string, Promise<void>>();
|
|
5
7
|
|
|
6
|
-
function mutationQueueKey(filePath: string): string {
|
|
8
|
+
function mutationQueueKey(filePath: string, depth = 0): string {
|
|
7
9
|
const resolved = resolve(filePath);
|
|
10
|
+
if (depth > 40) throw new Error("Too many symbolic links");
|
|
8
11
|
try {
|
|
9
12
|
return realpathSync.native(resolved);
|
|
10
13
|
} catch {
|
|
11
|
-
|
|
14
|
+
try {
|
|
15
|
+
if (lstatSync(resolved).isSymbolicLink()) {
|
|
16
|
+
return mutationQueueKey(resolve(dirname(resolved), readlinkSync(resolved)), depth + 1);
|
|
17
|
+
}
|
|
18
|
+
} catch {
|
|
19
|
+
// Missing paths still share a key through the nearest real ancestor.
|
|
20
|
+
}
|
|
21
|
+
const parent = dirname(resolved);
|
|
22
|
+
return parent === resolved ? resolved : join(mutationQueueKey(parent, depth), basename(resolved));
|
|
12
23
|
}
|
|
13
24
|
}
|
|
14
25
|
|
|
@@ -33,3 +44,102 @@ export async function withFileMutationQueue<T>(filePath: string, fn: () => Promi
|
|
|
33
44
|
}
|
|
34
45
|
}
|
|
35
46
|
}
|
|
47
|
+
|
|
48
|
+
export interface FileIdentity {
|
|
49
|
+
bytes: number;
|
|
50
|
+
mtimeMs: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface AtomicPublishResult {
|
|
54
|
+
before: FileIdentity | null;
|
|
55
|
+
after: FileIdentity;
|
|
56
|
+
/** Publication succeeded, but directory durability could not be confirmed. */
|
|
57
|
+
durabilityWarning?: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface AtomicPublishOptions {
|
|
61
|
+
/** Test seam. Must either perform the rename or throw before publishing. */
|
|
62
|
+
rename?: (tempPath: string, targetPath: string) => Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function resolvePublishTarget(filePath: string, depth = 0): Promise<string> {
|
|
66
|
+
if (depth > 40) throw new Error("Too many symbolic links");
|
|
67
|
+
const absolute = resolve(filePath);
|
|
68
|
+
try {
|
|
69
|
+
const info = await lstat(absolute);
|
|
70
|
+
if (info.isSymbolicLink()) {
|
|
71
|
+
return resolvePublishTarget(resolve(dirname(absolute), await readlink(absolute)), depth + 1);
|
|
72
|
+
}
|
|
73
|
+
if (!info.isFile()) throw new Error(`Refusing non-file target (including directories): ${filePath}`);
|
|
74
|
+
} catch (error) {
|
|
75
|
+
if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
|
|
76
|
+
}
|
|
77
|
+
await mkdir(dirname(absolute), { recursive: true });
|
|
78
|
+
return join(await realpath(dirname(absolute)), basename(absolute));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Atomically replaces the resolved target, preserving symlinks and existing mode bits.
|
|
83
|
+
* Call inside withFileMutationQueue when a read/modify/write transaction is needed.
|
|
84
|
+
* External writers are not locked; the last rename wins. Atomicity and durability
|
|
85
|
+
* depend on the filesystem's rename/fsync guarantees, including on shared storage.
|
|
86
|
+
* Ownership, timestamps, ACLs, and extended attributes are not copied.
|
|
87
|
+
*/
|
|
88
|
+
export async function publishFileAtomically(
|
|
89
|
+
filePath: string,
|
|
90
|
+
content: string | Uint8Array,
|
|
91
|
+
options: AtomicPublishOptions = {},
|
|
92
|
+
): Promise<AtomicPublishResult> {
|
|
93
|
+
let tempPath: string | undefined;
|
|
94
|
+
try {
|
|
95
|
+
const target = await resolvePublishTarget(filePath);
|
|
96
|
+
const previous = await stat(target).catch((error: NodeJS.ErrnoException) => {
|
|
97
|
+
if (error.code === "ENOENT") return null;
|
|
98
|
+
throw error;
|
|
99
|
+
});
|
|
100
|
+
if (previous && !previous.isFile()) throw new Error(`Refusing directory or non-file target: ${filePath}`);
|
|
101
|
+
tempPath = join(dirname(target), `.clio-coder-publish-${randomUUID()}.tmp`);
|
|
102
|
+
const handle = await open(tempPath, "wx", previous ? previous.mode & 0o7777 : 0o666);
|
|
103
|
+
let after: FileIdentity;
|
|
104
|
+
try {
|
|
105
|
+
await handle.writeFile(content);
|
|
106
|
+
if (previous) await handle.chmod(previous.mode & 0o7777);
|
|
107
|
+
await handle.sync();
|
|
108
|
+
const info = await handle.stat();
|
|
109
|
+
after = { bytes: info.size, mtimeMs: info.mtimeMs };
|
|
110
|
+
} finally {
|
|
111
|
+
await handle.close();
|
|
112
|
+
}
|
|
113
|
+
await (options.rename ?? rename)(tempPath, target);
|
|
114
|
+
tempPath = undefined;
|
|
115
|
+
const result: AtomicPublishResult = {
|
|
116
|
+
before: previous ? { bytes: previous.size, mtimeMs: previous.mtimeMs } : null,
|
|
117
|
+
after,
|
|
118
|
+
};
|
|
119
|
+
// Rename is the commit point. A later durability failure cannot honestly
|
|
120
|
+
// be described as an unpublished write or safely rolled back over other writers.
|
|
121
|
+
try {
|
|
122
|
+
const directory = await open(dirname(target), "r");
|
|
123
|
+
try {
|
|
124
|
+
await directory.sync();
|
|
125
|
+
} finally {
|
|
126
|
+
await directory.close();
|
|
127
|
+
}
|
|
128
|
+
} catch (error) {
|
|
129
|
+
result.durabilityWarning = `Published, but directory fsync was unavailable or failed: ${String(error)}`;
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
} catch (error) {
|
|
133
|
+
let cleanup = "";
|
|
134
|
+
if (tempPath) {
|
|
135
|
+
try {
|
|
136
|
+
await unlink(tempPath);
|
|
137
|
+
} catch (cleanupError) {
|
|
138
|
+
if ((cleanupError as NodeJS.ErrnoException).code !== "ENOENT") {
|
|
139
|
+
cleanup = ` Temporary file cleanup failed at ${tempPath}: ${String(cleanupError)}`;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
throw new Error(`Nothing was published: ${String(error)}.${cleanup}`, { cause: error });
|
|
144
|
+
}
|
|
145
|
+
}
|
package/src/tools/find.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync, statSync } from "node:fs";
|
|
2
2
|
import { readdir } from "node:fs/promises";
|
|
3
|
-
import { join, relative } from "node:path";
|
|
3
|
+
import { join, relative, resolve } from "node:path";
|
|
4
4
|
import { Type } from "typebox";
|
|
5
5
|
import { ToolNames } from "../core/tool-names.js";
|
|
6
6
|
import { StringEnum } from "../engine/ai.js";
|
|
@@ -18,7 +18,16 @@ import {
|
|
|
18
18
|
} from "./observation.js";
|
|
19
19
|
import { resolveReadPath, toPosixPath } from "./path-utils.js";
|
|
20
20
|
import type { ToolInvokeOptions, ToolResult, ToolSpec } from "./registry.js";
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
createSearchDiagnostics,
|
|
23
|
+
finishSearch,
|
|
24
|
+
newSearchCompleteness,
|
|
25
|
+
type SearchCompleteness,
|
|
26
|
+
searchNotice,
|
|
27
|
+
skipSearchPath,
|
|
28
|
+
spawnLineStream,
|
|
29
|
+
validateSearchPatternSize,
|
|
30
|
+
} from "./spawn-hygiene.js";
|
|
22
31
|
import { truncateHead } from "./truncate.js";
|
|
23
32
|
|
|
24
33
|
const DEFAULT_LIMIT = 500;
|
|
@@ -32,9 +41,9 @@ type FindOrder = "path" | "mtime";
|
|
|
32
41
|
// Build fd's argv. Ignore semantics (hidden files, .gitignore honoring,
|
|
33
42
|
// generated-dir excludes, include_ignored) come entirely from the shared
|
|
34
43
|
// ignore policy so grep and find never disagree about tree visibility.
|
|
35
|
-
function buildFdArgs(pattern: string, searchPath: string,
|
|
44
|
+
function buildFdArgs(pattern: string, searchPath: string, collectLimit: number, includeIgnored: boolean): string[] {
|
|
36
45
|
const args = ["--glob", "--color=never", ...fdIgnoreArgs(searchPath, includeIgnored)];
|
|
37
|
-
args.push("--max-results", String(
|
|
46
|
+
args.push("--show-errors", "--max-results", String(collectLimit));
|
|
38
47
|
let effectivePattern = pattern;
|
|
39
48
|
if (pattern.includes("/")) {
|
|
40
49
|
args.push("--full-path");
|
|
@@ -52,33 +61,45 @@ async function fdFind(
|
|
|
52
61
|
searchPath: string,
|
|
53
62
|
collectLimit: number,
|
|
54
63
|
includeIgnored: boolean,
|
|
64
|
+
search: SearchCompleteness,
|
|
65
|
+
allows: (path: string) => boolean,
|
|
55
66
|
signal?: AbortSignal,
|
|
56
67
|
): Promise<{ ok: true; paths: string[] } | { ok: false; message: string }> {
|
|
57
68
|
const lines: string[] = [];
|
|
69
|
+
const diagnostics = createSearchDiagnostics(search, (path) => allows(resolve(process.cwd(), path)));
|
|
58
70
|
const result = await spawnLineStream(fdPath, buildFdArgs(pattern, searchPath, collectLimit, includeIgnored), {
|
|
59
71
|
...(signal ? { signal } : {}),
|
|
72
|
+
onStderrLine: diagnostics.onLine,
|
|
60
73
|
onLine(line, stop) {
|
|
61
74
|
lines.push(line);
|
|
62
75
|
if (lines.length >= collectLimit) stop();
|
|
63
76
|
},
|
|
64
77
|
});
|
|
65
|
-
|
|
66
|
-
if (result.timedOut) {
|
|
78
|
+
finishSearch(search, result);
|
|
79
|
+
if (!result.aborted && !result.timedOut && !result.stoppedEarly && result.exitCode !== 0) {
|
|
80
|
+
search.complete = false;
|
|
81
|
+
search.reason = "errors";
|
|
82
|
+
}
|
|
83
|
+
if (result.spawnError !== null) return { ok: false, message: `find: failed to run fd: ${result.spawnError}` };
|
|
84
|
+
if (
|
|
85
|
+
!result.aborted &&
|
|
86
|
+
!result.timedOut &&
|
|
87
|
+
!result.stoppedEarly &&
|
|
88
|
+
result.exitCode !== 0 &&
|
|
89
|
+
lines.length === 0 &&
|
|
90
|
+
(diagnostics.realError || (search.skipped.count === 0 && !search.skipped.unknown))
|
|
91
|
+
) {
|
|
67
92
|
return {
|
|
68
93
|
ok: false,
|
|
69
|
-
message: `find: fd
|
|
94
|
+
message: `find: fd rejected the search or failed (exit code ${result.exitCode}). Check the glob and search path.`,
|
|
70
95
|
};
|
|
71
96
|
}
|
|
72
|
-
if (result.spawnError !== null) return { ok: false, message: `find: failed to run fd: ${result.spawnError}` };
|
|
73
|
-
if (!result.stoppedEarly && result.exitCode !== 0 && lines.length === 0) {
|
|
74
|
-
return { ok: false, message: `find: ${result.stderr.trim() || `fd exited with code ${result.exitCode}`}` };
|
|
75
|
-
}
|
|
76
97
|
const paths = lines
|
|
77
|
-
.map((rawLine) => rawLine.replace(/\r$/, "")
|
|
98
|
+
.map((rawLine) => rawLine.replace(/\r$/, ""))
|
|
78
99
|
.filter((line) => line.length > 0)
|
|
79
100
|
.map((line) => {
|
|
80
101
|
const hadTrailingSlash = line.endsWith("/") || line.endsWith("\\");
|
|
81
|
-
let relPath =
|
|
102
|
+
let relPath = relative(searchPath, line);
|
|
82
103
|
if (hadTrailingSlash && !relPath.endsWith("/")) relPath += "/";
|
|
83
104
|
return toPosixPath(relPath);
|
|
84
105
|
});
|
|
@@ -94,6 +115,8 @@ async function fallbackFind(
|
|
|
94
115
|
searchPath: string,
|
|
95
116
|
collectLimit: number,
|
|
96
117
|
includeIgnored: boolean,
|
|
118
|
+
search: SearchCompleteness,
|
|
119
|
+
allows: (path: string) => boolean,
|
|
97
120
|
signal?: AbortSignal,
|
|
98
121
|
): Promise<string[]> {
|
|
99
122
|
const matcher = compileGlobRegex(pattern.includes("/") ? pattern : `**/${pattern}`);
|
|
@@ -105,11 +128,13 @@ async function fallbackFind(
|
|
|
105
128
|
try {
|
|
106
129
|
entries = (await readdir(dir, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name));
|
|
107
130
|
} catch {
|
|
131
|
+
skipSearchPath(search, dir, allows);
|
|
108
132
|
return;
|
|
109
133
|
}
|
|
110
134
|
for (const entry of entries) {
|
|
111
135
|
if (out.length >= collectLimit || signal?.aborted) return;
|
|
112
136
|
const absPath = join(dir, entry.name);
|
|
137
|
+
if (!allows(absPath)) continue;
|
|
113
138
|
if (entry.isDirectory() && !entry.isSymbolicLink()) {
|
|
114
139
|
if (ignored.has(entry.name)) continue;
|
|
115
140
|
const relDir = `${toPosixPath(relative(searchPath, absPath))}/`;
|
|
@@ -117,7 +142,13 @@ async function fallbackFind(
|
|
|
117
142
|
await walk(absPath);
|
|
118
143
|
continue;
|
|
119
144
|
}
|
|
120
|
-
if (
|
|
145
|
+
if (entry.isSymbolicLink()) {
|
|
146
|
+
try {
|
|
147
|
+
if (statSync(absPath).isDirectory()) skipSearchPath(search, absPath, allows);
|
|
148
|
+
} catch {
|
|
149
|
+
skipSearchPath(search, absPath, allows);
|
|
150
|
+
}
|
|
151
|
+
} else if (!entry.isFile()) continue;
|
|
121
152
|
const relPath = toPosixPath(relative(searchPath, absPath));
|
|
122
153
|
if (matcher.test(normalizeGlobInput(relPath))) out.push(relPath);
|
|
123
154
|
}
|
|
@@ -133,14 +164,21 @@ interface OrderedPaths {
|
|
|
133
164
|
candidateCap: number | null;
|
|
134
165
|
}
|
|
135
166
|
|
|
136
|
-
function orderByMtime(
|
|
167
|
+
function orderByMtime(
|
|
168
|
+
paths: string[],
|
|
169
|
+
searchPath: string,
|
|
170
|
+
limit: number,
|
|
171
|
+
candidateCap: number,
|
|
172
|
+
search: SearchCompleteness,
|
|
173
|
+
): OrderedPaths {
|
|
137
174
|
const candidateCapHit = paths.length >= candidateCap;
|
|
138
175
|
const stamped = paths.map((relPath) => {
|
|
139
176
|
let mtimeMs = 0;
|
|
140
177
|
try {
|
|
141
178
|
mtimeMs = statSync(join(searchPath, relPath)).mtimeMs;
|
|
142
179
|
} catch {
|
|
143
|
-
// Entries that vanish mid-scan sort last
|
|
180
|
+
// Entries that vanish mid-scan sort last and remain explicitly incomplete.
|
|
181
|
+
skipSearchPath(search, join(searchPath, relPath));
|
|
144
182
|
}
|
|
145
183
|
return { relPath, mtimeMs };
|
|
146
184
|
});
|
|
@@ -149,6 +187,8 @@ function orderByMtime(paths: string[], searchPath: string, limit: number, candid
|
|
|
149
187
|
}
|
|
150
188
|
|
|
151
189
|
function renderFindResult(input: {
|
|
190
|
+
search: SearchCompleteness;
|
|
191
|
+
fallback: boolean;
|
|
152
192
|
withheldPaths: number;
|
|
153
193
|
ordered: OrderedPaths;
|
|
154
194
|
collected: number;
|
|
@@ -158,16 +198,27 @@ function renderFindResult(input: {
|
|
|
158
198
|
reservation: ObservationReservation;
|
|
159
199
|
options: ToolInvokeOptions | undefined;
|
|
160
200
|
}): ToolResult {
|
|
161
|
-
const { ordered, collected, collectLimit, limit, order, reservation, options } = input;
|
|
201
|
+
const { ordered, collected, collectLimit, limit, order, reservation, options, search } = input;
|
|
202
|
+
if ((collected > limit || collected >= collectLimit || ordered.candidateCapHit) && search.complete) {
|
|
203
|
+
search.complete = false;
|
|
204
|
+
search.reason = "limit";
|
|
205
|
+
}
|
|
206
|
+
const coverageNotice = input.fallback
|
|
207
|
+
? "\n[Fallback search uses GENERATED_DIRS only; .gitignore is not applied.]"
|
|
208
|
+
: "\n[Native fd search: skipped symlinked directories are not counted.]";
|
|
162
209
|
if (ordered.paths.length === 0) {
|
|
163
210
|
return finalizeObservation({
|
|
164
211
|
tool: ToolNames.Find,
|
|
165
212
|
withheldPaths: input.withheldPaths,
|
|
166
213
|
unit: "paths",
|
|
167
|
-
output:
|
|
214
|
+
output:
|
|
215
|
+
(search.complete ? "No visible files found matching pattern" : "Search incomplete") +
|
|
216
|
+
searchNotice(search, 0, "paths") +
|
|
217
|
+
coverageNotice,
|
|
218
|
+
details: { search, symlinkDirectories: { counted: input.fallback } },
|
|
168
219
|
shownCount: 0,
|
|
169
|
-
totalCount:
|
|
170
|
-
truncated:
|
|
220
|
+
totalCount: search.complete ? 0 : null,
|
|
221
|
+
truncated: !search.complete,
|
|
171
222
|
...(collected >= collectLimit ? { next: `limit=${limit * 2}` } : {}),
|
|
172
223
|
reservation,
|
|
173
224
|
...(options ? { options } : {}),
|
|
@@ -181,10 +232,14 @@ function renderFindResult(input: {
|
|
|
181
232
|
const limitHit = collected > limit || collected >= collectLimit;
|
|
182
233
|
// Unknown totals: the collector stopped at its cap, so matches beyond it
|
|
183
234
|
// exist but were never counted.
|
|
184
|
-
|
|
185
|
-
|
|
235
|
+
if (truncation.truncated && search.complete) {
|
|
236
|
+
search.complete = false;
|
|
237
|
+
search.reason = "limit";
|
|
238
|
+
}
|
|
239
|
+
const totalKnown = search.complete;
|
|
240
|
+
const truncated = !search.complete || limitHit || ordered.candidateCapHit || truncation.truncated;
|
|
186
241
|
const next = limitHit ? `limit=${limit * 2}` : ordered.candidateCapHit ? "order=path" : undefined;
|
|
187
|
-
const details: Record<string, unknown> = {};
|
|
242
|
+
const details: Record<string, unknown> = { search, symlinkDirectories: { counted: input.fallback } };
|
|
188
243
|
if (order === "mtime" && ordered.candidateCap !== null) {
|
|
189
244
|
details.candidates = {
|
|
190
245
|
cap: ordered.candidateCap,
|
|
@@ -197,7 +252,7 @@ function renderFindResult(input: {
|
|
|
197
252
|
tool: ToolNames.Find,
|
|
198
253
|
withheldPaths: input.withheldPaths,
|
|
199
254
|
unit: "paths",
|
|
200
|
-
output: truncation.content,
|
|
255
|
+
output: truncation.content + searchNotice(search, truncation.outputLines, "paths") + coverageNotice,
|
|
201
256
|
// Offload only when the byte cap cut collected paths; a bare result
|
|
202
257
|
// limit continues via `next`, and the offload would duplicate the body.
|
|
203
258
|
...(truncation.truncated ? { fullOutput } : {}),
|
|
@@ -214,7 +269,7 @@ function renderFindResult(input: {
|
|
|
214
269
|
export const findTool: ToolSpec = {
|
|
215
270
|
name: ToolNames.Find,
|
|
216
271
|
description:
|
|
217
|
-
"Find files and directories by glob pattern (supports *, **, ?, [abc]); returns paths relative to the search directory. Respects .gitignore and skips generated dirs (node_modules, dist, build, ...) unless include_ignored=true. order=path (default) returns fd's native order; order=mtime returns newest first from a bounded candidate set. Truncated results say how to continue and where the full list was saved.",
|
|
272
|
+
"Find files and directories by glob pattern (supports *, **, ?, [abc]); returns paths relative to the search directory. Respects .gitignore and skips generated dirs (node_modules, dist, build, ...) unless include_ignored=true. Symlinked directories are never followed. Only the fallback counts skipped symlinked directories; native fd leaves that count unmeasured, as indicated by details.symlinkDirectories.counted=false. Without fd the fallback uses GENERATED_DIRS only, with no .gitignore support. order=path (default) returns fd's native order; order=mtime returns newest first from a bounded candidate set. Truncated results say how to continue and where the full list was saved.",
|
|
218
273
|
parameters: Type.Object({
|
|
219
274
|
pattern: Type.String({ description: "Glob pattern, e.g. 'src/**/*.ts'." }),
|
|
220
275
|
path: Type.Optional(Type.String({ description: "Directory to search in." })),
|
|
@@ -260,28 +315,52 @@ export const findTool: ToolSpec = {
|
|
|
260
315
|
commitObservationReservation(reservation);
|
|
261
316
|
try {
|
|
262
317
|
let collectedPaths: string[];
|
|
318
|
+
const search = newSearchCompleteness();
|
|
319
|
+
const pathFilter = createObservationPathFilter(process.cwd(), options?.allowsObservationPath);
|
|
263
320
|
const fdPath = resolveFdBinary();
|
|
264
321
|
if (fdPath) {
|
|
265
|
-
const result = await fdFind(
|
|
322
|
+
const result = await fdFind(
|
|
323
|
+
fdPath,
|
|
324
|
+
pattern,
|
|
325
|
+
searchPath,
|
|
326
|
+
collectLimit,
|
|
327
|
+
includeIgnored,
|
|
328
|
+
search,
|
|
329
|
+
pathFilter.allows,
|
|
330
|
+
options?.signal,
|
|
331
|
+
);
|
|
266
332
|
if (!result.ok) return { kind: "error", message: result.message };
|
|
267
333
|
collectedPaths = result.paths;
|
|
268
334
|
} else {
|
|
269
335
|
try {
|
|
270
|
-
collectedPaths = await fallbackFind(
|
|
336
|
+
collectedPaths = await fallbackFind(
|
|
337
|
+
pattern,
|
|
338
|
+
searchPath,
|
|
339
|
+
collectLimit,
|
|
340
|
+
includeIgnored,
|
|
341
|
+
search,
|
|
342
|
+
pathFilter.allows,
|
|
343
|
+
options?.signal,
|
|
344
|
+
);
|
|
271
345
|
} catch (err) {
|
|
272
346
|
const message = err instanceof Error ? err.message : String(err);
|
|
273
347
|
return { kind: "error", message: `find: ${message}` };
|
|
274
348
|
}
|
|
275
349
|
}
|
|
276
350
|
|
|
351
|
+
if (options?.signal?.aborted) {
|
|
352
|
+
search.complete = false;
|
|
353
|
+
search.reason = "cancelled";
|
|
354
|
+
}
|
|
277
355
|
const collectedCount = collectedPaths.length;
|
|
278
|
-
const pathFilter = createObservationPathFilter(process.cwd(), options?.allowsObservationPath);
|
|
279
356
|
collectedPaths = collectedPaths.filter((entry) => pathFilter.allows(join(searchPath, entry)));
|
|
280
357
|
const ordered: OrderedPaths =
|
|
281
358
|
order === "mtime"
|
|
282
|
-
? orderByMtime(collectedPaths, searchPath, limit, collectLimit)
|
|
359
|
+
? orderByMtime(collectedPaths, searchPath, limit, collectLimit, search)
|
|
283
360
|
: { paths: collectedPaths.slice(0, limit), candidateCapHit: false, candidateCap: null };
|
|
284
361
|
return renderFindResult({
|
|
362
|
+
search,
|
|
363
|
+
fallback: !fdPath,
|
|
285
364
|
withheldPaths: pathFilter.withheldPaths,
|
|
286
365
|
ordered,
|
|
287
366
|
collected: collectedCount,
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-caps of the gateway-plane observation envelopes. Kept in a module with
|
|
3
|
+
* no imports so the bootstrap policy assertion and the catalog can read them
|
|
4
|
+
* without loading the tools themselves.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Bytes of one `data` result body before the JSON stub rule offloads it. */
|
|
8
|
+
export const DATA_OBSERVATION_SELF_CAP_BYTES = 32 * 1024;
|
|
9
|
+
|
|
10
|
+
/** Bytes of one `gateway` find listing before the JSON stub rule offloads it. */
|
|
11
|
+
export const GATEWAY_FIND_SELF_CAP_BYTES = 32 * 1024;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import { ToolNames } from "../../core/tool-names.js";
|
|
3
|
+
import { StringEnum } from "../../engine/ai.js";
|
|
4
|
+
import type { ToolSurface } from "../lazy-tool.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Immutable surfaces of the two Clio-internal reads that left the permanent
|
|
8
|
+
* `context` schema: `clio_docs` (bundled documentation) and `clio_library`
|
|
9
|
+
* (the recipe catalog). The implementations load on first call.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export const clioDocsToolSurface = {
|
|
13
|
+
name: ToolNames.ClioDocs,
|
|
14
|
+
description:
|
|
15
|
+
"Search Clio's bundled documentation for a question or terms and return cited sections as JSON; omit query to list the corpus (files and counts). Read-only; charges the per-turn observation pool.",
|
|
16
|
+
parameters: Type.Object({
|
|
17
|
+
query: Type.Optional(Type.String({ description: "Question or terms; omit to list the corpus." })),
|
|
18
|
+
limit: Type.Optional(Type.Number({ description: "Max sections (default 5, max 12)." })),
|
|
19
|
+
}),
|
|
20
|
+
baseActionClass: "read",
|
|
21
|
+
executionMode: "parallel",
|
|
22
|
+
} satisfies ToolSurface;
|
|
23
|
+
|
|
24
|
+
export const clioLibraryToolSurface = {
|
|
25
|
+
name: ToolNames.ClioLibrary,
|
|
26
|
+
description:
|
|
27
|
+
"Read the recipe catalog: installed skills, agents, prompts, and fleets with their owner and invocation, plus installable packages. Body-free rows, bounded pages; activates and installs nothing. Unavailable inside a worker.",
|
|
28
|
+
parameters: Type.Object({
|
|
29
|
+
query: Type.Optional(Type.String({ description: "Name, owner, or description terms." })),
|
|
30
|
+
kind: Type.Optional(
|
|
31
|
+
StringEnum(["skill", "agent", "prompt", "fleet", "plugin"], {
|
|
32
|
+
description: "One recipe kind, or plugin for installable package rows.",
|
|
33
|
+
}),
|
|
34
|
+
),
|
|
35
|
+
ref: Type.Optional(Type.String({ description: "Exact kind:name or resource key for one record." })),
|
|
36
|
+
limit: Type.Optional(Type.Number({ description: "Max rows (default 20, max 50)." })),
|
|
37
|
+
offset: Type.Optional(Type.Number({ description: "Zero-based offset; follow nextOffset (default 0)." })),
|
|
38
|
+
}),
|
|
39
|
+
baseActionClass: "read",
|
|
40
|
+
executionMode: "parallel",
|
|
41
|
+
} satisfies ToolSurface;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ToolNames } from "../../core/tool-names.js";
|
|
2
|
+
import type { LoadSkillsInput } from "../../domains/resources/index.js";
|
|
3
|
+
import { runDocsScope } from "../context/index.js";
|
|
4
|
+
import { OBSERVE_SELF_CAPS, observationBudgetExhausted, reserveObservation } from "../observation.js";
|
|
5
|
+
import type { ToolResult, ToolSpec } from "../registry.js";
|
|
6
|
+
import { clioDocsToolSurface, clioLibraryToolSurface } from "./clio-context-surface.js";
|
|
7
|
+
|
|
8
|
+
export { clioDocsToolSurface, clioLibraryToolSurface } from "./clio-context-surface.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The two Clio-internal reads that left the permanent `context` schema:
|
|
12
|
+
* `clio_docs` (bundled documentation) and `clio_library` (the recipe catalog).
|
|
13
|
+
* Each is the former context scope under its own name, reusing the scope
|
|
14
|
+
* function unchanged, so what the gateway returns is exactly what
|
|
15
|
+
* context(scope="docs"|"library") returned.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export function createClioDocsTool(): ToolSpec {
|
|
19
|
+
return {
|
|
20
|
+
...clioDocsToolSurface,
|
|
21
|
+
async run(args, options): Promise<ToolResult> {
|
|
22
|
+
const reservation = reserveObservation(OBSERVE_SELF_CAPS.contextDocs, options);
|
|
23
|
+
if (reservation.exhausted) {
|
|
24
|
+
return observationBudgetExhausted({
|
|
25
|
+
tool: ToolNames.ClioDocs,
|
|
26
|
+
unit: "sections",
|
|
27
|
+
reservation,
|
|
28
|
+
subject: typeof args.query === "string" && args.query.length > 0 ? `query=${args.query}` : "corpus",
|
|
29
|
+
hint: "Continue in a follow-up turn.",
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return runDocsScope(args, reservation, options, ToolNames.ClioDocs);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface ClioLibraryToolDeps {
|
|
38
|
+
getCwd?: () => string;
|
|
39
|
+
/** False on every worker registry: the read refuses there, as the context scope did. */
|
|
40
|
+
skillMarketplace?: boolean;
|
|
41
|
+
getSkillLoaderOptions?: () => Pick<
|
|
42
|
+
LoadSkillsInput,
|
|
43
|
+
"trustProjectCompatRoots" | "disableDiscovery" | "explicitSkillPaths"
|
|
44
|
+
>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function createClioLibraryTool(deps: ClioLibraryToolDeps = {}): ToolSpec {
|
|
48
|
+
return {
|
|
49
|
+
...clioLibraryToolSurface,
|
|
50
|
+
async run(args, options): Promise<ToolResult> {
|
|
51
|
+
// Reserved before the inventory is walked, so an exhausted pool answers
|
|
52
|
+
// with the notice and no catalog read happens for nothing.
|
|
53
|
+
const reservation = reserveObservation(OBSERVE_SELF_CAPS.contextLibrary, options);
|
|
54
|
+
if (reservation.exhausted) {
|
|
55
|
+
return observationBudgetExhausted({
|
|
56
|
+
tool: ToolNames.ClioLibrary,
|
|
57
|
+
unit: "entries",
|
|
58
|
+
reservation,
|
|
59
|
+
subject: "catalog",
|
|
60
|
+
hint: "Continue in a follow-up turn.",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const { runLibraryScope } = await import("../context/library.js");
|
|
64
|
+
return runLibraryScope(
|
|
65
|
+
{
|
|
66
|
+
getCwd: () => deps.getCwd?.() ?? process.cwd(),
|
|
67
|
+
...(deps.skillMarketplace !== undefined ? { skillMarketplace: deps.skillMarketplace } : {}),
|
|
68
|
+
...(deps.getSkillLoaderOptions ? { skillLoaderOptions: deps.getSkillLoaderOptions() } : {}),
|
|
69
|
+
},
|
|
70
|
+
args,
|
|
71
|
+
reservation,
|
|
72
|
+
options,
|
|
73
|
+
ToolNames.ClioLibrary,
|
|
74
|
+
);
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|