@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
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
isAgentProduct,
|
|
31
31
|
isAgentProjectContextTier,
|
|
32
32
|
parseResultContract
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-I47EJPYL.js";
|
|
34
34
|
import {
|
|
35
35
|
extensionContentDigest,
|
|
36
36
|
isSemanticVersion
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
import {
|
|
39
39
|
readSettings,
|
|
40
40
|
updateSettings
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-FPS4R2RN.js";
|
|
42
42
|
import {
|
|
43
43
|
warnLegacyNaming
|
|
44
44
|
} from "./chunk-DVNAPPXU.js";
|
|
@@ -48,14 +48,14 @@ import {
|
|
|
48
48
|
} from "./chunk-5EQO5NWP.js";
|
|
49
49
|
import {
|
|
50
50
|
ToolNames
|
|
51
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-V4XJWDHR.js";
|
|
52
52
|
import {
|
|
53
53
|
require_dist
|
|
54
54
|
} from "./chunk-B5GGDIHT.js";
|
|
55
55
|
import {
|
|
56
56
|
buildSafeToolEnv,
|
|
57
57
|
runCommandVector
|
|
58
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-XTQ7MEJG.js";
|
|
59
59
|
import {
|
|
60
60
|
withStateFileLockSync
|
|
61
61
|
} from "./chunk-DVJL77SO.js";
|
|
@@ -73,234 +73,13 @@ import {
|
|
|
73
73
|
init_esm_shims
|
|
74
74
|
} from "./chunk-ECBHH7LU.js";
|
|
75
75
|
|
|
76
|
-
// src/domains/agents/recipe.ts
|
|
77
|
-
init_esm_shims();
|
|
78
|
-
import path from "node:path";
|
|
79
|
-
var AGENT_BUDGET_KEYS = ["toolCalls", "readReserve", "synthesis", "maximum"];
|
|
80
|
-
function parseAgentBudgetPhase(value, prefix, relationTarget) {
|
|
81
|
-
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
82
|
-
throw new Error(`${prefix} must be a non-null YAML object`);
|
|
83
|
-
}
|
|
84
|
-
const record = value;
|
|
85
|
-
for (const key of Object.keys(record)) {
|
|
86
|
-
if (key !== "toolCalls" && key !== "readReserve") throw new Error(`${prefix}.${key} is unknown`);
|
|
87
|
-
}
|
|
88
|
-
for (const key of ["toolCalls", "readReserve"]) {
|
|
89
|
-
if (!Object.hasOwn(record, key)) throw new Error(`${prefix}.${key} is required`);
|
|
90
|
-
}
|
|
91
|
-
const toolCalls = record.toolCalls;
|
|
92
|
-
if (typeof toolCalls !== "number" || !Number.isSafeInteger(toolCalls)) {
|
|
93
|
-
throw new Error(`${prefix}.toolCalls must be a finite safe integer`);
|
|
94
|
-
}
|
|
95
|
-
if (toolCalls <= 0) throw new Error(`${prefix}.toolCalls must be greater than 0`);
|
|
96
|
-
const readReserve = record.readReserve;
|
|
97
|
-
if (typeof readReserve !== "number" || !Number.isSafeInteger(readReserve)) {
|
|
98
|
-
throw new Error(`${prefix}.readReserve must be a finite safe integer`);
|
|
99
|
-
}
|
|
100
|
-
if (readReserve < 0) throw new Error(`${prefix}.readReserve must be greater than or equal to 0`);
|
|
101
|
-
if (readReserve >= toolCalls) throw new Error(`${prefix}.readReserve must be less than ${relationTarget}`);
|
|
102
|
-
return { toolCalls, readReserve };
|
|
103
|
-
}
|
|
104
|
-
function parseAgentBudget(value, sourcePath) {
|
|
105
|
-
if (value === void 0) return void 0;
|
|
106
|
-
const prefix = `agent budget: ${sourcePath}: budget`;
|
|
107
|
-
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
108
|
-
throw new Error(`${prefix} must be a non-null YAML object`);
|
|
109
|
-
}
|
|
110
|
-
const record = value;
|
|
111
|
-
for (const key of Object.keys(record)) {
|
|
112
|
-
if (!AGENT_BUDGET_KEYS.includes(key)) {
|
|
113
|
-
throw new Error(`${prefix}.${key} is unknown`);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
for (const key of ["toolCalls", "readReserve", "synthesis"]) {
|
|
117
|
-
if (!Object.hasOwn(record, key)) throw new Error(`${prefix}.${key} is required`);
|
|
118
|
-
}
|
|
119
|
-
const phase = parseAgentBudgetPhase(
|
|
120
|
-
{ toolCalls: record.toolCalls, readReserve: record.readReserve },
|
|
121
|
-
prefix,
|
|
122
|
-
"budget.toolCalls"
|
|
123
|
-
);
|
|
124
|
-
const synthesis = record.synthesis;
|
|
125
|
-
if (typeof synthesis !== "boolean") throw new Error(`${prefix}.synthesis must be a boolean`);
|
|
126
|
-
const maximum = record.maximum === void 0 ? void 0 : parseAgentBudgetPhase(record.maximum, `${prefix}.maximum`, "budget.maximum.toolCalls");
|
|
127
|
-
if (maximum !== void 0) {
|
|
128
|
-
if (maximum.toolCalls < phase.toolCalls) {
|
|
129
|
-
throw new Error(`${prefix}.maximum.toolCalls must be greater than or equal to budget.toolCalls`);
|
|
130
|
-
}
|
|
131
|
-
if (maximum.readReserve < phase.readReserve) {
|
|
132
|
-
throw new Error(`${prefix}.maximum.readReserve must be greater than or equal to budget.readReserve`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return { ...phase, synthesis, ...maximum === void 0 ? {} : { maximum } };
|
|
136
|
-
}
|
|
137
|
-
function recipeIdFromPath(absPath, rootDir) {
|
|
138
|
-
const resolvedRoot = path.resolve(rootDir);
|
|
139
|
-
const resolvedPath = path.resolve(absPath);
|
|
140
|
-
const relPath = path.relative(resolvedRoot, resolvedPath);
|
|
141
|
-
if (relPath === "" || relPath.startsWith("..") || path.isAbsolute(relPath)) {
|
|
142
|
-
throw new Error(`recipe: path must live under rootDir (${resolvedPath} not under ${resolvedRoot})`);
|
|
143
|
-
}
|
|
144
|
-
if (path.dirname(relPath) !== ".") {
|
|
145
|
-
throw new Error(`recipe: recipes must live directly under rootDir (${resolvedPath})`);
|
|
146
|
-
}
|
|
147
|
-
if (path.extname(relPath) !== ".md") {
|
|
148
|
-
throw new Error(`recipe: recipe files must end in .md (${resolvedPath})`);
|
|
149
|
-
}
|
|
150
|
-
const id = path.basename(relPath, ".md");
|
|
151
|
-
if (id === "") {
|
|
152
|
-
throw new Error(`recipe: recipe filename must not be empty (${resolvedPath})`);
|
|
153
|
-
}
|
|
154
|
-
return id;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// src/domains/agents/recipe-schema.ts
|
|
158
|
-
init_esm_shims();
|
|
159
|
-
var RECIPE_KEYS = [
|
|
160
|
-
"version",
|
|
161
|
-
"name",
|
|
162
|
-
"description",
|
|
163
|
-
"tools",
|
|
164
|
-
"skills",
|
|
165
|
-
"audience",
|
|
166
|
-
"category",
|
|
167
|
-
"capabilityClass",
|
|
168
|
-
"latencyClass",
|
|
169
|
-
"projectContextTier",
|
|
170
|
-
"budget",
|
|
171
|
-
"resultContract",
|
|
172
|
-
"tags"
|
|
173
|
-
];
|
|
174
|
-
var OPTIONAL_RECIPE_KEYS = ["product"];
|
|
175
|
-
var ALL_RECIPE_KEYS = [...RECIPE_KEYS, ...OPTIONAL_RECIPE_KEYS];
|
|
176
|
-
function requiredString(value, path6) {
|
|
177
|
-
if (typeof value !== "string" || value.trim().length === 0)
|
|
178
|
-
throw new Error(`agent recipe: ${path6} must be a non-empty string`);
|
|
179
|
-
return value;
|
|
180
|
-
}
|
|
181
|
-
function requiredStringArray(value, path6) {
|
|
182
|
-
if (!Array.isArray(value)) throw new Error(`agent recipe: ${path6} must be an array of strings`);
|
|
183
|
-
const entries = value.map((entry, index) => requiredString(entry, `${path6}[${index}]`));
|
|
184
|
-
if (new Set(entries).size !== entries.length) throw new Error(`agent recipe: ${path6} must not contain duplicates`);
|
|
185
|
-
return entries;
|
|
186
|
-
}
|
|
187
|
-
function enumValue(value, path6, predicate) {
|
|
188
|
-
if (!predicate(value)) throw new Error(`agent recipe: ${path6} has an unsupported value`);
|
|
189
|
-
return value;
|
|
190
|
-
}
|
|
191
|
-
function parseAudience(value, source, filepath) {
|
|
192
|
-
const audience = enumValue(value, `${filepath}: audience`, isAgentAudience);
|
|
193
|
-
if (source === "builtin") {
|
|
194
|
-
if (audience === "custom") {
|
|
195
|
-
throw new Error(`agent recipe: ${filepath}: a builtin recipe must not declare audience 'custom'`);
|
|
196
|
-
}
|
|
197
|
-
return audience;
|
|
198
|
-
}
|
|
199
|
-
if (audience !== "custom") {
|
|
200
|
-
throw new Error(
|
|
201
|
-
`agent recipe: ${filepath}: a ${source} recipe must declare audience 'custom', not '${audience}'; audience follows where the recipe was discovered and cannot be claimed in frontmatter`
|
|
202
|
-
);
|
|
203
|
-
}
|
|
204
|
-
return audience;
|
|
205
|
-
}
|
|
206
|
-
function parseTools(value, filepath) {
|
|
207
|
-
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
208
|
-
throw new Error(`agent recipe: ${filepath}: tools must be a { required, optional } object`);
|
|
209
|
-
}
|
|
210
|
-
const record = value;
|
|
211
|
-
if (Object.keys(record).some((key) => key !== "required" && key !== "optional")) {
|
|
212
|
-
throw new Error(`agent recipe: ${filepath}: tools has an unknown key`);
|
|
213
|
-
}
|
|
214
|
-
if (!("required" in record) || !("optional" in record)) {
|
|
215
|
-
throw new Error(`agent recipe: ${filepath}: tools.required and tools.optional are required`);
|
|
216
|
-
}
|
|
217
|
-
if (!Array.isArray(record.required) || !Array.isArray(record.optional)) {
|
|
218
|
-
throw new Error(`agent recipe: ${filepath}: tools.required and tools.optional must be arrays`);
|
|
219
|
-
}
|
|
220
|
-
const required = record.required.map((entry, index) => {
|
|
221
|
-
const entryPath = `${filepath}: tools.required[${index}]`;
|
|
222
|
-
if (typeof entry === "string") return requiredString(entry, entryPath);
|
|
223
|
-
if (entry === null || typeof entry !== "object" || Array.isArray(entry)) {
|
|
224
|
-
throw new Error(`agent recipe: ${entryPath} must be a tool name or { anyOf: [...] }`);
|
|
225
|
-
}
|
|
226
|
-
const group = entry;
|
|
227
|
-
if (Object.keys(group).length !== 1 || !("anyOf" in group)) {
|
|
228
|
-
throw new Error(`agent recipe: ${entryPath} must contain only anyOf`);
|
|
229
|
-
}
|
|
230
|
-
const anyOf = requiredStringArray(group.anyOf, `${entryPath}.anyOf`);
|
|
231
|
-
if (anyOf.length === 0) throw new Error(`agent recipe: ${entryPath}.anyOf must not be empty`);
|
|
232
|
-
return { anyOf };
|
|
233
|
-
});
|
|
234
|
-
const optional = requiredStringArray(record.optional, `${filepath}: tools.optional`);
|
|
235
|
-
const tools = [
|
|
236
|
-
...required.flatMap((requirement) => typeof requirement === "string" ? [requirement] : requirement.anyOf),
|
|
237
|
-
...optional
|
|
238
|
-
];
|
|
239
|
-
if (new Set(tools).size !== tools.length)
|
|
240
|
-
throw new Error(`agent recipe: ${filepath}: tools contains duplicate requirements`);
|
|
241
|
-
return { tools, toolRequirements: { required, optional } };
|
|
242
|
-
}
|
|
243
|
-
function parseAgentRecipeSchema(input) {
|
|
244
|
-
const { frontmatter, filepath } = input;
|
|
245
|
-
for (const key of Object.keys(frontmatter)) {
|
|
246
|
-
if (!ALL_RECIPE_KEYS.includes(key)) {
|
|
247
|
-
throw new Error(`agent recipe: ${filepath}: unknown key '${key}'`);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
for (const key of RECIPE_KEYS) {
|
|
251
|
-
if (!(key in frontmatter)) throw new Error(`agent recipe: ${filepath}: ${key} is required`);
|
|
252
|
-
}
|
|
253
|
-
if (frontmatter.version !== 1) throw new Error(`agent recipe: ${filepath}: version must be the supported integer 1`);
|
|
254
|
-
if (input.body.trim().length === 0) throw new Error(`agent recipe: ${filepath}: persona body must not be empty`);
|
|
255
|
-
const parsedTools = parseTools(frontmatter.tools, filepath);
|
|
256
|
-
const budget = parseAgentBudget(frontmatter.budget, filepath);
|
|
257
|
-
if (budget === void 0) throw new Error(`agent recipe: ${filepath}: budget is required`);
|
|
258
|
-
return {
|
|
259
|
-
version: 1,
|
|
260
|
-
id: input.id,
|
|
261
|
-
name: requiredString(frontmatter.name, `${filepath}: name`),
|
|
262
|
-
description: requiredString(frontmatter.description, `${filepath}: description`),
|
|
263
|
-
tools: parsedTools.tools,
|
|
264
|
-
toolRequirements: parsedTools.toolRequirements,
|
|
265
|
-
skills: requiredStringArray(frontmatter.skills, `${filepath}: skills`),
|
|
266
|
-
boundSkillPaths: [],
|
|
267
|
-
audience: parseAudience(frontmatter.audience, input.source, filepath),
|
|
268
|
-
category: enumValue(frontmatter.category, `${filepath}: category`, isAgentCategory),
|
|
269
|
-
capabilityClass: enumValue(
|
|
270
|
-
frontmatter.capabilityClass,
|
|
271
|
-
`${filepath}: capabilityClass`,
|
|
272
|
-
isAgentCapabilityClass
|
|
273
|
-
),
|
|
274
|
-
latencyClass: enumValue(
|
|
275
|
-
frontmatter.latencyClass,
|
|
276
|
-
`${filepath}: latencyClass`,
|
|
277
|
-
isAgentLatencyClass
|
|
278
|
-
),
|
|
279
|
-
projectContextTier: enumValue(
|
|
280
|
-
frontmatter.projectContextTier,
|
|
281
|
-
`${filepath}: projectContextTier`,
|
|
282
|
-
isAgentProjectContextTier
|
|
283
|
-
),
|
|
284
|
-
budget,
|
|
285
|
-
resultContract: parseResultContract(frontmatter.resultContract, filepath),
|
|
286
|
-
// Optional, but not lenient. A misspelled product silently costs the run
|
|
287
|
-
// the delivery tools its reserve window was supposed to keep, and the
|
|
288
|
-
// only symptom is a blocked tool call deep in a dispatch log.
|
|
289
|
-
...frontmatter.product === void 0 ? {} : { product: enumValue(frontmatter.product, `${filepath}: product`, isAgentProduct) },
|
|
290
|
-
tags: requiredStringArray(frontmatter.tags, `${filepath}: tags`),
|
|
291
|
-
source: input.source,
|
|
292
|
-
filepath,
|
|
293
|
-
body: input.body
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
|
|
297
76
|
// src/domains/plugins/catalog.ts
|
|
298
77
|
init_esm_shims();
|
|
299
78
|
var import_yaml = __toESM(require_dist(), 1);
|
|
300
79
|
import { execFileSync } from "node:child_process";
|
|
301
80
|
import { existsSync, mkdtempSync, readFileSync, realpathSync, rmSync, statSync } from "node:fs";
|
|
302
81
|
import { homedir, tmpdir } from "node:os";
|
|
303
|
-
import
|
|
82
|
+
import path from "node:path";
|
|
304
83
|
function parsePluginGithubSource(source) {
|
|
305
84
|
const match = /^https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/tree\/([A-Za-z0-9_.-]+)(?:\/(.*?))?\/?$/.exec(source);
|
|
306
85
|
if (!match?.[1] || !match[2] || !match[3]) return void 0;
|
|
@@ -310,7 +89,7 @@ function parsePluginGithubSource(source) {
|
|
|
310
89
|
return { url: `https://github.com/${match[1]}/${match[2]}.git`, ref: match[3], subdir };
|
|
311
90
|
}
|
|
312
91
|
function pluginLocalPath(source, cwd = process.cwd()) {
|
|
313
|
-
return
|
|
92
|
+
return path.resolve(cwd, source.startsWith("~/") ? path.join(homedir(), source.slice(2)) : source);
|
|
314
93
|
}
|
|
315
94
|
function fetchPluginSource(source, cwd = process.cwd()) {
|
|
316
95
|
const local = pluginLocalPath(source, cwd);
|
|
@@ -321,7 +100,7 @@ function fetchPluginSource(source, cwd = process.cwd()) {
|
|
|
321
100
|
throw new Error(
|
|
322
101
|
`unsupported plugin source: ${source}; use a local directory or https://github.com/owner/repo/tree/ref/path`
|
|
323
102
|
);
|
|
324
|
-
const temp = mkdtempSync(
|
|
103
|
+
const temp = mkdtempSync(path.join(tmpdir(), "clio-coder-plugin-"));
|
|
325
104
|
const cleanup = () => rmSync(temp, { recursive: true, force: true });
|
|
326
105
|
try {
|
|
327
106
|
execFileSync(
|
|
@@ -334,13 +113,13 @@ function fetchPluginSource(source, cwd = process.cwd()) {
|
|
|
334
113
|
env: buildSafeToolEnv({ GIT_TERMINAL_PROMPT: "0", GIT_CONFIG_NOSYSTEM: "1" })
|
|
335
114
|
}
|
|
336
115
|
);
|
|
337
|
-
const root =
|
|
116
|
+
const root = path.join(temp, remote.subdir);
|
|
338
117
|
if (!existsSync(root) || !statSync(root).isDirectory())
|
|
339
118
|
throw new Error(`plugin source has no directory ${remote.subdir || "."}: ${source}`);
|
|
340
|
-
const relative =
|
|
341
|
-
if (relative === ".." || relative.startsWith(`..${
|
|
119
|
+
const relative = path.relative(realpathSync(temp), realpathSync(root));
|
|
120
|
+
if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
|
|
342
121
|
throw new Error("plugin source escapes repository");
|
|
343
|
-
if (!remote.subdir) rmSync(
|
|
122
|
+
if (!remote.subdir) rmSync(path.join(temp, ".git"), { recursive: true, force: true });
|
|
344
123
|
return { root, cleanup };
|
|
345
124
|
} catch (error) {
|
|
346
125
|
cleanup();
|
|
@@ -406,7 +185,7 @@ function readPluginCatalog(file, diagnostics) {
|
|
|
406
185
|
kind: item.kind,
|
|
407
186
|
name: item.name,
|
|
408
187
|
description: item.description,
|
|
409
|
-
sourceUrl: remote ? item.sourceUrl :
|
|
188
|
+
sourceUrl: remote ? item.sourceUrl : path.resolve(path.dirname(file), item.sourceUrl),
|
|
410
189
|
version: item.version,
|
|
411
190
|
sha256: item.sha256,
|
|
412
191
|
origin: "catalog",
|
|
@@ -415,7 +194,7 @@ function readPluginCatalog(file, diagnostics) {
|
|
|
415
194
|
...Array.isArray(item.triggers) ? { triggers: item.triggers.filter((value) => typeof value === "string") } : {},
|
|
416
195
|
...Array.isArray(item.requires) ? { requires: item.requires } : {},
|
|
417
196
|
...provides ? { provides } : {},
|
|
418
|
-
index:
|
|
197
|
+
index: path.resolve(file)
|
|
419
198
|
}
|
|
420
199
|
];
|
|
421
200
|
});
|
|
@@ -425,7 +204,7 @@ function readPluginCatalog(file, diagnostics) {
|
|
|
425
204
|
}
|
|
426
205
|
}
|
|
427
206
|
function bundledLibraryIndexPath() {
|
|
428
|
-
return
|
|
207
|
+
return path.join(resolvePackageRoot(), "library", "registry.yaml");
|
|
429
208
|
}
|
|
430
209
|
function bundledPluginCatalog(diagnostics) {
|
|
431
210
|
try {
|
|
@@ -440,10 +219,10 @@ function bundledPluginCatalog(diagnostics) {
|
|
|
440
219
|
init_esm_shims();
|
|
441
220
|
var import_yaml2 = __toESM(require_dist(), 1);
|
|
442
221
|
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "node:fs";
|
|
443
|
-
import
|
|
222
|
+
import path2 from "node:path";
|
|
444
223
|
function catalogPath() {
|
|
445
224
|
const configured = readSettings().integrations.library.catalog;
|
|
446
|
-
return
|
|
225
|
+
return path2.resolve(configured ?? path2.join(clioConfigDir(), "library.yaml"));
|
|
447
226
|
}
|
|
448
227
|
function parseCatalog(filePath, diagnostics) {
|
|
449
228
|
return readPluginCatalog(filePath, diagnostics).map((entry) => ({ ...entry, origin: "index" }));
|
|
@@ -464,13 +243,13 @@ function discoverLibrary(options = {}) {
|
|
|
464
243
|
const diagnostics = [];
|
|
465
244
|
const bundledPlugins = bundledPluginCatalog(diagnostics);
|
|
466
245
|
const privatePath = catalogPath();
|
|
467
|
-
const primary = options.catalog ? parseCatalog(
|
|
246
|
+
const primary = options.catalog ? parseCatalog(path2.resolve(options.catalog), diagnostics) : [];
|
|
468
247
|
const privateEntries = parseCatalog(privatePath, diagnostics);
|
|
469
248
|
const byRef = /* @__PURE__ */ new Map();
|
|
470
249
|
for (const entry of [
|
|
471
250
|
...bundledPlugins,
|
|
472
251
|
...privateEntries,
|
|
473
|
-
...parseCatalog(
|
|
252
|
+
...parseCatalog(path2.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml"), diagnostics),
|
|
474
253
|
...primary
|
|
475
254
|
])
|
|
476
255
|
byRef.set(libraryEntryRef(entry), entry);
|
|
@@ -566,7 +345,7 @@ function registerLibraryPackage(source, options = {}) {
|
|
|
566
345
|
origin: "index",
|
|
567
346
|
...manifest.clio.requires ? { requires: manifest.clio.requires } : {}
|
|
568
347
|
};
|
|
569
|
-
const file = options.scope === "project" ?
|
|
348
|
+
const file = options.scope === "project" ? path2.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml") : catalogPath();
|
|
570
349
|
withStateFileLockSync(file, () => {
|
|
571
350
|
const diagnostics = [];
|
|
572
351
|
const before = existsSync2(file) ? readFileSync2(file, "utf8") : void 0;
|
|
@@ -608,7 +387,7 @@ function installedPlugin(entry, options = {}) {
|
|
|
608
387
|
}
|
|
609
388
|
function libraryInstallPath(entry, options = {}) {
|
|
610
389
|
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(entry.name)) throw new Error(`invalid library entry name: ${entry.name}`);
|
|
611
|
-
return installedPlugin(entry, options)?.rootPath ??
|
|
390
|
+
return installedPlugin(entry, options)?.rootPath ?? path2.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name);
|
|
612
391
|
}
|
|
613
392
|
function libraryEntryInstalled(entry, options = {}) {
|
|
614
393
|
return installedPlugin(entry, options) !== void 0;
|
|
@@ -659,7 +438,7 @@ function planLibraryInstall(entry, options = {}) {
|
|
|
659
438
|
if (entry.sha256 && sha2562 !== entry.sha256) throw new Error(`plugin_pin_mismatch: ${entry.name}`);
|
|
660
439
|
return {
|
|
661
440
|
entry: { ...entry, ...candidate.manifest.version ? { version: candidate.manifest.version } : {} },
|
|
662
|
-
path:
|
|
441
|
+
path: path2.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name),
|
|
663
442
|
sha256: sha2562,
|
|
664
443
|
sourceRoot: fetched.root,
|
|
665
444
|
cleanup: fetched.cleanup,
|
|
@@ -823,7 +602,7 @@ async function syncLibrary(direction, runner = runCommandVector) {
|
|
|
823
602
|
const settings = readSettings().integrations.library;
|
|
824
603
|
if (!settings.sync) throw new Error("library_sync_disabled");
|
|
825
604
|
const remote = confirmedRemote();
|
|
826
|
-
const cwd =
|
|
605
|
+
const cwd = path2.dirname(catalogPath());
|
|
827
606
|
const remoteResult = await runner("git", ["remote", "get-url", "library"], { cwd, workspaceRoot: cwd });
|
|
828
607
|
if (remoteResult.exitCode !== 0 || remoteResult.stdout.trim() !== remote)
|
|
829
608
|
throw new Error("library_remote_unconfirmed");
|
|
@@ -841,14 +620,14 @@ async function syncLibrary(direction, runner = runCommandVector) {
|
|
|
841
620
|
// src/domains/resources/skills/marketplace.ts
|
|
842
621
|
init_esm_shims();
|
|
843
622
|
import { existsSync as existsSync4, readdirSync as readdirSync2, readFileSync as readFileSync4 } from "node:fs";
|
|
844
|
-
import
|
|
623
|
+
import path4 from "node:path";
|
|
845
624
|
|
|
846
625
|
// src/domains/resources/skills/loader.ts
|
|
847
626
|
init_esm_shims();
|
|
848
627
|
import { createHash } from "node:crypto";
|
|
849
628
|
import { existsSync as existsSync3, readdirSync, readFileSync as readFileSync3, realpathSync as realpathSync2 } from "node:fs";
|
|
850
629
|
import { homedir as homedir2 } from "node:os";
|
|
851
|
-
import
|
|
630
|
+
import path3 from "node:path";
|
|
852
631
|
var MAX_NAME_LENGTH = 64;
|
|
853
632
|
var MAX_DESCRIPTION_LENGTH = 1024;
|
|
854
633
|
var MAX_SKILL_BYTES = 1024 * 1024;
|
|
@@ -908,7 +687,7 @@ function defaultSkillRoots(input = {}) {
|
|
|
908
687
|
for (const kind of INTEROP_AGENT_KINDS) {
|
|
909
688
|
if (kind.userSkillRoot === void 0 || kind.skillSource === void 0) continue;
|
|
910
689
|
roots.push({
|
|
911
|
-
path:
|
|
690
|
+
path: path3.join(home, kind.userSkillRoot),
|
|
912
691
|
scope: "user",
|
|
913
692
|
source: kind.skillSource,
|
|
914
693
|
origin: `${kind.skillSource}-user`,
|
|
@@ -919,7 +698,7 @@ function defaultSkillRoots(input = {}) {
|
|
|
919
698
|
}
|
|
920
699
|
if (configDir) {
|
|
921
700
|
roots.push({
|
|
922
|
-
path:
|
|
701
|
+
path: path3.join(configDir, "skills"),
|
|
923
702
|
scope: "user",
|
|
924
703
|
source: "clio-coder",
|
|
925
704
|
origin: "config",
|
|
@@ -931,7 +710,7 @@ function defaultSkillRoots(input = {}) {
|
|
|
931
710
|
for (const kind of INTEROP_AGENT_KINDS) {
|
|
932
711
|
if (kind.projectSkillRoot === void 0 || kind.skillSource === void 0) continue;
|
|
933
712
|
roots.push({
|
|
934
|
-
path:
|
|
713
|
+
path: path3.join(cwd, kind.projectSkillRoot),
|
|
935
714
|
scope: "project",
|
|
936
715
|
source: kind.skillSource,
|
|
937
716
|
origin: `${kind.skillSource}-project`,
|
|
@@ -941,7 +720,7 @@ function defaultSkillRoots(input = {}) {
|
|
|
941
720
|
});
|
|
942
721
|
}
|
|
943
722
|
roots.push({
|
|
944
|
-
path:
|
|
723
|
+
path: path3.join(cwd, ".clio-coder", "skills"),
|
|
945
724
|
scope: "project",
|
|
946
725
|
source: "clio-coder",
|
|
947
726
|
origin: "project",
|
|
@@ -1015,7 +794,7 @@ function declaredToolSurface(frontmatter, key, filePath, diagnostics) {
|
|
|
1015
794
|
return tools.length > 0 ? tools : void 0;
|
|
1016
795
|
}
|
|
1017
796
|
function validationSubject(filePath) {
|
|
1018
|
-
return
|
|
797
|
+
return path3.basename(filePath) === "SKILL.md" ? path3.basename(path3.dirname(filePath)) : path3.basename(filePath, ".md");
|
|
1019
798
|
}
|
|
1020
799
|
function validateNameFormat(name) {
|
|
1021
800
|
const errors = [];
|
|
@@ -1100,11 +879,11 @@ function canonicalizePath(filePath) {
|
|
|
1100
879
|
try {
|
|
1101
880
|
return realpathSync2.native(filePath);
|
|
1102
881
|
} catch {
|
|
1103
|
-
return
|
|
882
|
+
return path3.resolve(filePath);
|
|
1104
883
|
}
|
|
1105
884
|
}
|
|
1106
885
|
function pathIsInside(candidate, anchor) {
|
|
1107
|
-
return candidate === anchor || candidate.startsWith(anchor +
|
|
886
|
+
return candidate === anchor || candidate.startsWith(anchor + path3.sep);
|
|
1108
887
|
}
|
|
1109
888
|
function containmentAnchor(root) {
|
|
1110
889
|
if (root.containment === void 0) return null;
|
|
@@ -1190,7 +969,7 @@ function loadSkillFile(filePath, root) {
|
|
|
1190
969
|
}
|
|
1191
970
|
for (const message of validateNameFormat(name)) diagnostics.push({ type: "warning", message, path: filePath });
|
|
1192
971
|
if (!description) return { candidate: null, diagnostics };
|
|
1193
|
-
const baseDir =
|
|
972
|
+
const baseDir = path3.dirname(filePath);
|
|
1194
973
|
const scope = root.scope;
|
|
1195
974
|
const sourceInfo = {
|
|
1196
975
|
path: filePath,
|
|
@@ -1246,7 +1025,7 @@ function collectSkills(root, dir, diagnostics, includeRootFiles, anchor = contai
|
|
|
1246
1025
|
}
|
|
1247
1026
|
const skillEntry = entries.find((entry) => entry.name === "SKILL.md" && entry.isFile());
|
|
1248
1027
|
if (skillEntry) {
|
|
1249
|
-
const skillPath =
|
|
1028
|
+
const skillPath = path3.join(dir, skillEntry.name);
|
|
1250
1029
|
if (escapesContainment(skillPath, anchor, diagnostics)) return [];
|
|
1251
1030
|
const loaded = loadSkillFile(skillPath, root);
|
|
1252
1031
|
diagnostics.push(...loaded.diagnostics);
|
|
@@ -1255,8 +1034,8 @@ function collectSkills(root, dir, diagnostics, includeRootFiles, anchor = contai
|
|
|
1255
1034
|
const candidates = [];
|
|
1256
1035
|
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
1257
1036
|
if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
|
|
1258
|
-
const fullPath =
|
|
1259
|
-
if (entry.isDirectory() || entry.isSymbolicLink() && existsSync3(
|
|
1037
|
+
const fullPath = path3.join(dir, entry.name);
|
|
1038
|
+
if (entry.isDirectory() || entry.isSymbolicLink() && existsSync3(path3.join(fullPath, "SKILL.md"))) {
|
|
1260
1039
|
candidates.push(...collectSkills(root, fullPath, diagnostics, false, anchor));
|
|
1261
1040
|
continue;
|
|
1262
1041
|
}
|
|
@@ -1284,15 +1063,15 @@ function explicitSkillRoot(filePath) {
|
|
|
1284
1063
|
};
|
|
1285
1064
|
}
|
|
1286
1065
|
function loadExplicitSkillPath(inputPath, diagnostics, packageRoots, cwd) {
|
|
1287
|
-
const resolved =
|
|
1066
|
+
const resolved = path3.resolve(inputPath);
|
|
1288
1067
|
const identity = canonicalizePath(resolved);
|
|
1289
1068
|
const owner = packageRoots.find((candidate) => {
|
|
1290
|
-
const relative =
|
|
1291
|
-
return relative !== ".." && !relative.startsWith(`..${
|
|
1069
|
+
const relative = path3.relative(canonicalizePath(candidate.path), identity);
|
|
1070
|
+
return relative !== ".." && !relative.startsWith(`..${path3.sep}`) && !path3.isAbsolute(relative);
|
|
1292
1071
|
});
|
|
1293
1072
|
if (!owner && ["user", "project"].some((scope) => {
|
|
1294
|
-
const relative =
|
|
1295
|
-
return relative !== ".." && !relative.startsWith(`..${
|
|
1073
|
+
const relative = path3.relative(canonicalizePath(pluginBaseDir(scope, cwd)), identity);
|
|
1074
|
+
return relative !== ".." && !relative.startsWith(`..${path3.sep}`) && !path3.isAbsolute(relative);
|
|
1296
1075
|
})) {
|
|
1297
1076
|
diagnostics.push({
|
|
1298
1077
|
type: "warning",
|
|
@@ -1313,7 +1092,7 @@ function loadExplicitSkillPath(inputPath, diagnostics, packageRoots, cwd) {
|
|
|
1313
1092
|
diagnostics.push({ type: "warning", message: `explicit skill path does not exist: ${resolved}`, path: resolved });
|
|
1314
1093
|
return [];
|
|
1315
1094
|
}
|
|
1316
|
-
const skillFile =
|
|
1095
|
+
const skillFile = path3.basename(resolved) === "SKILL.md" || resolved.endsWith(".md") ? resolved : path3.join(resolved, "SKILL.md");
|
|
1317
1096
|
if (!existsSync3(skillFile)) {
|
|
1318
1097
|
const packages = collectSkills(root, resolved, diagnostics, false);
|
|
1319
1098
|
if (packages.length > 0) return packages;
|
|
@@ -1532,21 +1311,21 @@ function parsePendingSkillRequests(input, skills, options = {}) {
|
|
|
1532
1311
|
var MARKETPLACE_UNCONFIGURED = "no local skill marketplace catalog or index configured";
|
|
1533
1312
|
function packageCatalogDir() {
|
|
1534
1313
|
try {
|
|
1535
|
-
return
|
|
1314
|
+
return path4.join(resolvePackageRoot(), "library", "skills");
|
|
1536
1315
|
} catch {
|
|
1537
1316
|
return null;
|
|
1538
1317
|
}
|
|
1539
1318
|
}
|
|
1540
1319
|
function packageIndexPath() {
|
|
1541
1320
|
try {
|
|
1542
|
-
return
|
|
1321
|
+
return path4.join(resolvePackageRoot(), "library", "skills", "skill-marketplace.json");
|
|
1543
1322
|
} catch {
|
|
1544
1323
|
return null;
|
|
1545
1324
|
}
|
|
1546
1325
|
}
|
|
1547
1326
|
function defaultIndexPath() {
|
|
1548
1327
|
try {
|
|
1549
|
-
const configured =
|
|
1328
|
+
const configured = path4.join(clioConfigDir(), "skill-marketplace.json");
|
|
1550
1329
|
if (existsSync4(configured)) return configured;
|
|
1551
1330
|
} catch {
|
|
1552
1331
|
}
|
|
@@ -1590,7 +1369,7 @@ function parseMarketplaceIndex(indexPath, diagnostics = []) {
|
|
|
1590
1369
|
const kind = record.kind === "agent" || record.kind === "prompt" || record.kind === "fleet" ? record.kind : "skill";
|
|
1591
1370
|
const requires = Array.isArray(record.requires) ? record.requires.filter((entry) => typeof entry === "string") : void 0;
|
|
1592
1371
|
const overlay = optionalString(record.overlay);
|
|
1593
|
-
if (overlay && (
|
|
1372
|
+
if (overlay && (path4.isAbsolute(overlay) || overlay.split("/").includes(".."))) {
|
|
1594
1373
|
diagnostics.push(`skill marketplace index entry has an overlay outside the package: ${skill.name}`);
|
|
1595
1374
|
return [];
|
|
1596
1375
|
}
|
|
@@ -1622,11 +1401,11 @@ function looksLikeSkillCatalog(dir) {
|
|
|
1622
1401
|
try {
|
|
1623
1402
|
return readdirSync2(dir, { withFileTypes: true }).some((entry) => {
|
|
1624
1403
|
if (!entry.isDirectory()) return false;
|
|
1625
|
-
const child =
|
|
1626
|
-
if (existsSync4(
|
|
1404
|
+
const child = path4.join(dir, entry.name);
|
|
1405
|
+
if (existsSync4(path4.join(child, "SKILL.md"))) return true;
|
|
1627
1406
|
try {
|
|
1628
1407
|
return readdirSync2(child, { withFileTypes: true }).some(
|
|
1629
|
-
(inner) => inner.isDirectory() && existsSync4(
|
|
1408
|
+
(inner) => inner.isDirectory() && existsSync4(path4.join(child, inner.name, "SKILL.md"))
|
|
1630
1409
|
);
|
|
1631
1410
|
} catch {
|
|
1632
1411
|
return false;
|
|
@@ -1638,19 +1417,19 @@ function looksLikeSkillCatalog(dir) {
|
|
|
1638
1417
|
}
|
|
1639
1418
|
function resolveCatalogDir(options) {
|
|
1640
1419
|
if (options.catalogDir === null) return null;
|
|
1641
|
-
if (options.catalogDir) return
|
|
1420
|
+
if (options.catalogDir) return path4.resolve(options.catalogDir);
|
|
1642
1421
|
const fromEnv = process.env.CLIO_CODER_SKILL_CATALOG_DIR;
|
|
1643
|
-
if (fromEnv && fromEnv.trim().length > 0) return
|
|
1644
|
-
const repoLibraryCatalog =
|
|
1422
|
+
if (fromEnv && fromEnv.trim().length > 0) return path4.resolve(fromEnv.trim());
|
|
1423
|
+
const repoLibraryCatalog = path4.join(options.cwd ?? process.cwd(), "library", "skills");
|
|
1645
1424
|
if (looksLikeSkillCatalog(repoLibraryCatalog)) return repoLibraryCatalog;
|
|
1646
|
-
const repoCatalog =
|
|
1425
|
+
const repoCatalog = path4.join(options.cwd ?? process.cwd(), "skills");
|
|
1647
1426
|
if (looksLikeSkillCatalog(repoCatalog)) return repoCatalog;
|
|
1648
1427
|
const bundled = packageCatalogDir();
|
|
1649
1428
|
return bundled && looksLikeSkillCatalog(bundled) ? bundled : null;
|
|
1650
1429
|
}
|
|
1651
1430
|
function catalogCategory(catalogDir, baseDir) {
|
|
1652
|
-
const rel =
|
|
1653
|
-
const category =
|
|
1431
|
+
const rel = path4.relative(catalogDir, baseDir);
|
|
1432
|
+
const category = path4.dirname(rel);
|
|
1654
1433
|
if (rel.length === 0 || rel.startsWith("..") || category === "." || category.startsWith("..")) return void 0;
|
|
1655
1434
|
return category;
|
|
1656
1435
|
}
|
|
@@ -1713,7 +1492,7 @@ function getMarketplaceSkills(options = {}) {
|
|
|
1713
1492
|
}
|
|
1714
1493
|
function marketplaceInstallShaping(skill) {
|
|
1715
1494
|
const shaping = {};
|
|
1716
|
-
if (skill.overlay) shaping.overlay =
|
|
1495
|
+
if (skill.overlay) shaping.overlay = path4.join(resolvePackageRoot(), skill.overlay);
|
|
1717
1496
|
if (skill.exclude && skill.exclude.length > 0) shaping.exclude = [...skill.exclude];
|
|
1718
1497
|
return shaping;
|
|
1719
1498
|
}
|
|
@@ -1754,9 +1533,228 @@ function installSkill(input) {
|
|
|
1754
1533
|
};
|
|
1755
1534
|
}
|
|
1756
1535
|
|
|
1536
|
+
// src/domains/agents/recipe.ts
|
|
1537
|
+
init_esm_shims();
|
|
1538
|
+
import path5 from "node:path";
|
|
1539
|
+
var AGENT_BUDGET_KEYS = ["toolCalls", "readReserve", "synthesis", "maximum"];
|
|
1540
|
+
function parseAgentBudgetPhase(value, prefix, relationTarget) {
|
|
1541
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
1542
|
+
throw new Error(`${prefix} must be a non-null YAML object`);
|
|
1543
|
+
}
|
|
1544
|
+
const record = value;
|
|
1545
|
+
for (const key of Object.keys(record)) {
|
|
1546
|
+
if (key !== "toolCalls" && key !== "readReserve") throw new Error(`${prefix}.${key} is unknown`);
|
|
1547
|
+
}
|
|
1548
|
+
for (const key of ["toolCalls", "readReserve"]) {
|
|
1549
|
+
if (!Object.hasOwn(record, key)) throw new Error(`${prefix}.${key} is required`);
|
|
1550
|
+
}
|
|
1551
|
+
const toolCalls = record.toolCalls;
|
|
1552
|
+
if (typeof toolCalls !== "number" || !Number.isSafeInteger(toolCalls)) {
|
|
1553
|
+
throw new Error(`${prefix}.toolCalls must be a finite safe integer`);
|
|
1554
|
+
}
|
|
1555
|
+
if (toolCalls <= 0) throw new Error(`${prefix}.toolCalls must be greater than 0`);
|
|
1556
|
+
const readReserve = record.readReserve;
|
|
1557
|
+
if (typeof readReserve !== "number" || !Number.isSafeInteger(readReserve)) {
|
|
1558
|
+
throw new Error(`${prefix}.readReserve must be a finite safe integer`);
|
|
1559
|
+
}
|
|
1560
|
+
if (readReserve < 0) throw new Error(`${prefix}.readReserve must be greater than or equal to 0`);
|
|
1561
|
+
if (readReserve >= toolCalls) throw new Error(`${prefix}.readReserve must be less than ${relationTarget}`);
|
|
1562
|
+
return { toolCalls, readReserve };
|
|
1563
|
+
}
|
|
1564
|
+
function parseAgentBudget(value, sourcePath) {
|
|
1565
|
+
if (value === void 0) return void 0;
|
|
1566
|
+
const prefix = `agent budget: ${sourcePath}: budget`;
|
|
1567
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
1568
|
+
throw new Error(`${prefix} must be a non-null YAML object`);
|
|
1569
|
+
}
|
|
1570
|
+
const record = value;
|
|
1571
|
+
for (const key of Object.keys(record)) {
|
|
1572
|
+
if (!AGENT_BUDGET_KEYS.includes(key)) {
|
|
1573
|
+
throw new Error(`${prefix}.${key} is unknown`);
|
|
1574
|
+
}
|
|
1575
|
+
}
|
|
1576
|
+
for (const key of ["toolCalls", "readReserve", "synthesis"]) {
|
|
1577
|
+
if (!Object.hasOwn(record, key)) throw new Error(`${prefix}.${key} is required`);
|
|
1578
|
+
}
|
|
1579
|
+
const phase = parseAgentBudgetPhase(
|
|
1580
|
+
{ toolCalls: record.toolCalls, readReserve: record.readReserve },
|
|
1581
|
+
prefix,
|
|
1582
|
+
"budget.toolCalls"
|
|
1583
|
+
);
|
|
1584
|
+
const synthesis = record.synthesis;
|
|
1585
|
+
if (typeof synthesis !== "boolean") throw new Error(`${prefix}.synthesis must be a boolean`);
|
|
1586
|
+
const maximum = record.maximum === void 0 ? void 0 : parseAgentBudgetPhase(record.maximum, `${prefix}.maximum`, "budget.maximum.toolCalls");
|
|
1587
|
+
if (maximum !== void 0) {
|
|
1588
|
+
if (maximum.toolCalls < phase.toolCalls) {
|
|
1589
|
+
throw new Error(`${prefix}.maximum.toolCalls must be greater than or equal to budget.toolCalls`);
|
|
1590
|
+
}
|
|
1591
|
+
if (maximum.readReserve < phase.readReserve) {
|
|
1592
|
+
throw new Error(`${prefix}.maximum.readReserve must be greater than or equal to budget.readReserve`);
|
|
1593
|
+
}
|
|
1594
|
+
}
|
|
1595
|
+
return { ...phase, synthesis, ...maximum === void 0 ? {} : { maximum } };
|
|
1596
|
+
}
|
|
1597
|
+
function recipeIdFromPath(absPath, rootDir) {
|
|
1598
|
+
const resolvedRoot = path5.resolve(rootDir);
|
|
1599
|
+
const resolvedPath = path5.resolve(absPath);
|
|
1600
|
+
const relPath = path5.relative(resolvedRoot, resolvedPath);
|
|
1601
|
+
if (relPath === "" || relPath.startsWith("..") || path5.isAbsolute(relPath)) {
|
|
1602
|
+
throw new Error(`recipe: path must live under rootDir (${resolvedPath} not under ${resolvedRoot})`);
|
|
1603
|
+
}
|
|
1604
|
+
if (path5.dirname(relPath) !== ".") {
|
|
1605
|
+
throw new Error(`recipe: recipes must live directly under rootDir (${resolvedPath})`);
|
|
1606
|
+
}
|
|
1607
|
+
if (path5.extname(relPath) !== ".md") {
|
|
1608
|
+
throw new Error(`recipe: recipe files must end in .md (${resolvedPath})`);
|
|
1609
|
+
}
|
|
1610
|
+
const id = path5.basename(relPath, ".md");
|
|
1611
|
+
if (id === "") {
|
|
1612
|
+
throw new Error(`recipe: recipe filename must not be empty (${resolvedPath})`);
|
|
1613
|
+
}
|
|
1614
|
+
return id;
|
|
1615
|
+
}
|
|
1616
|
+
|
|
1617
|
+
// src/domains/agents/recipe-schema.ts
|
|
1618
|
+
init_esm_shims();
|
|
1619
|
+
var RECIPE_KEYS = [
|
|
1620
|
+
"version",
|
|
1621
|
+
"name",
|
|
1622
|
+
"description",
|
|
1623
|
+
"tools",
|
|
1624
|
+
"skills",
|
|
1625
|
+
"audience",
|
|
1626
|
+
"category",
|
|
1627
|
+
"capabilityClass",
|
|
1628
|
+
"latencyClass",
|
|
1629
|
+
"projectContextTier",
|
|
1630
|
+
"budget",
|
|
1631
|
+
"resultContract",
|
|
1632
|
+
"tags"
|
|
1633
|
+
];
|
|
1634
|
+
var OPTIONAL_RECIPE_KEYS = ["product"];
|
|
1635
|
+
var ALL_RECIPE_KEYS = [...RECIPE_KEYS, ...OPTIONAL_RECIPE_KEYS];
|
|
1636
|
+
function requiredString(value, path6) {
|
|
1637
|
+
if (typeof value !== "string" || value.trim().length === 0)
|
|
1638
|
+
throw new Error(`agent recipe: ${path6} must be a non-empty string`);
|
|
1639
|
+
return value;
|
|
1640
|
+
}
|
|
1641
|
+
function requiredStringArray(value, path6) {
|
|
1642
|
+
if (!Array.isArray(value)) throw new Error(`agent recipe: ${path6} must be an array of strings`);
|
|
1643
|
+
const entries = value.map((entry, index) => requiredString(entry, `${path6}[${index}]`));
|
|
1644
|
+
if (new Set(entries).size !== entries.length) throw new Error(`agent recipe: ${path6} must not contain duplicates`);
|
|
1645
|
+
return entries;
|
|
1646
|
+
}
|
|
1647
|
+
function enumValue(value, path6, predicate) {
|
|
1648
|
+
if (!predicate(value)) throw new Error(`agent recipe: ${path6} has an unsupported value`);
|
|
1649
|
+
return value;
|
|
1650
|
+
}
|
|
1651
|
+
function parseAudience(value, source, filepath) {
|
|
1652
|
+
const audience = enumValue(value, `${filepath}: audience`, isAgentAudience);
|
|
1653
|
+
if (source === "builtin") {
|
|
1654
|
+
if (audience === "custom") {
|
|
1655
|
+
throw new Error(`agent recipe: ${filepath}: a builtin recipe must not declare audience 'custom'`);
|
|
1656
|
+
}
|
|
1657
|
+
return audience;
|
|
1658
|
+
}
|
|
1659
|
+
if (audience !== "custom") {
|
|
1660
|
+
throw new Error(
|
|
1661
|
+
`agent recipe: ${filepath}: a ${source} recipe must declare audience 'custom', not '${audience}'; audience follows where the recipe was discovered and cannot be claimed in frontmatter`
|
|
1662
|
+
);
|
|
1663
|
+
}
|
|
1664
|
+
return audience;
|
|
1665
|
+
}
|
|
1666
|
+
function parseTools(value, filepath) {
|
|
1667
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
1668
|
+
throw new Error(`agent recipe: ${filepath}: tools must be a { required, optional } object`);
|
|
1669
|
+
}
|
|
1670
|
+
const record = value;
|
|
1671
|
+
if (Object.keys(record).some((key) => key !== "required" && key !== "optional")) {
|
|
1672
|
+
throw new Error(`agent recipe: ${filepath}: tools has an unknown key`);
|
|
1673
|
+
}
|
|
1674
|
+
if (!("required" in record) || !("optional" in record)) {
|
|
1675
|
+
throw new Error(`agent recipe: ${filepath}: tools.required and tools.optional are required`);
|
|
1676
|
+
}
|
|
1677
|
+
if (!Array.isArray(record.required) || !Array.isArray(record.optional)) {
|
|
1678
|
+
throw new Error(`agent recipe: ${filepath}: tools.required and tools.optional must be arrays`);
|
|
1679
|
+
}
|
|
1680
|
+
const required = record.required.map((entry, index) => {
|
|
1681
|
+
const entryPath = `${filepath}: tools.required[${index}]`;
|
|
1682
|
+
if (typeof entry === "string") return requiredString(entry, entryPath);
|
|
1683
|
+
if (entry === null || typeof entry !== "object" || Array.isArray(entry)) {
|
|
1684
|
+
throw new Error(`agent recipe: ${entryPath} must be a tool name or { anyOf: [...] }`);
|
|
1685
|
+
}
|
|
1686
|
+
const group = entry;
|
|
1687
|
+
if (Object.keys(group).length !== 1 || !("anyOf" in group)) {
|
|
1688
|
+
throw new Error(`agent recipe: ${entryPath} must contain only anyOf`);
|
|
1689
|
+
}
|
|
1690
|
+
const anyOf = requiredStringArray(group.anyOf, `${entryPath}.anyOf`);
|
|
1691
|
+
if (anyOf.length === 0) throw new Error(`agent recipe: ${entryPath}.anyOf must not be empty`);
|
|
1692
|
+
return { anyOf };
|
|
1693
|
+
});
|
|
1694
|
+
const optional = requiredStringArray(record.optional, `${filepath}: tools.optional`);
|
|
1695
|
+
const tools = [
|
|
1696
|
+
...required.flatMap((requirement) => typeof requirement === "string" ? [requirement] : requirement.anyOf),
|
|
1697
|
+
...optional
|
|
1698
|
+
];
|
|
1699
|
+
if (new Set(tools).size !== tools.length)
|
|
1700
|
+
throw new Error(`agent recipe: ${filepath}: tools contains duplicate requirements`);
|
|
1701
|
+
return { tools, toolRequirements: { required, optional } };
|
|
1702
|
+
}
|
|
1703
|
+
function parseAgentRecipeSchema(input) {
|
|
1704
|
+
const { frontmatter, filepath } = input;
|
|
1705
|
+
for (const key of Object.keys(frontmatter)) {
|
|
1706
|
+
if (!ALL_RECIPE_KEYS.includes(key)) {
|
|
1707
|
+
throw new Error(`agent recipe: ${filepath}: unknown key '${key}'`);
|
|
1708
|
+
}
|
|
1709
|
+
}
|
|
1710
|
+
for (const key of RECIPE_KEYS) {
|
|
1711
|
+
if (!(key in frontmatter)) throw new Error(`agent recipe: ${filepath}: ${key} is required`);
|
|
1712
|
+
}
|
|
1713
|
+
if (frontmatter.version !== 1) throw new Error(`agent recipe: ${filepath}: version must be the supported integer 1`);
|
|
1714
|
+
if (input.body.trim().length === 0) throw new Error(`agent recipe: ${filepath}: persona body must not be empty`);
|
|
1715
|
+
const parsedTools = parseTools(frontmatter.tools, filepath);
|
|
1716
|
+
const budget = parseAgentBudget(frontmatter.budget, filepath);
|
|
1717
|
+
if (budget === void 0) throw new Error(`agent recipe: ${filepath}: budget is required`);
|
|
1718
|
+
return {
|
|
1719
|
+
version: 1,
|
|
1720
|
+
id: input.id,
|
|
1721
|
+
name: requiredString(frontmatter.name, `${filepath}: name`),
|
|
1722
|
+
description: requiredString(frontmatter.description, `${filepath}: description`),
|
|
1723
|
+
tools: parsedTools.tools,
|
|
1724
|
+
toolRequirements: parsedTools.toolRequirements,
|
|
1725
|
+
skills: requiredStringArray(frontmatter.skills, `${filepath}: skills`),
|
|
1726
|
+
boundSkillPaths: [],
|
|
1727
|
+
audience: parseAudience(frontmatter.audience, input.source, filepath),
|
|
1728
|
+
category: enumValue(frontmatter.category, `${filepath}: category`, isAgentCategory),
|
|
1729
|
+
capabilityClass: enumValue(
|
|
1730
|
+
frontmatter.capabilityClass,
|
|
1731
|
+
`${filepath}: capabilityClass`,
|
|
1732
|
+
isAgentCapabilityClass
|
|
1733
|
+
),
|
|
1734
|
+
latencyClass: enumValue(
|
|
1735
|
+
frontmatter.latencyClass,
|
|
1736
|
+
`${filepath}: latencyClass`,
|
|
1737
|
+
isAgentLatencyClass
|
|
1738
|
+
),
|
|
1739
|
+
projectContextTier: enumValue(
|
|
1740
|
+
frontmatter.projectContextTier,
|
|
1741
|
+
`${filepath}: projectContextTier`,
|
|
1742
|
+
isAgentProjectContextTier
|
|
1743
|
+
),
|
|
1744
|
+
budget,
|
|
1745
|
+
resultContract: parseResultContract(frontmatter.resultContract, filepath),
|
|
1746
|
+
// Optional, but not lenient. A misspelled product silently costs the run
|
|
1747
|
+
// the delivery tools its reserve window was supposed to keep, and the
|
|
1748
|
+
// only symptom is a blocked tool call deep in a dispatch log.
|
|
1749
|
+
...frontmatter.product === void 0 ? {} : { product: enumValue(frontmatter.product, `${filepath}: product`, isAgentProduct) },
|
|
1750
|
+
tags: requiredStringArray(frontmatter.tags, `${filepath}: tags`),
|
|
1751
|
+
source: input.source,
|
|
1752
|
+
filepath,
|
|
1753
|
+
body: input.body
|
|
1754
|
+
};
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
1757
|
export {
|
|
1758
|
-
recipeIdFromPath,
|
|
1759
|
-
parseAgentRecipeSchema,
|
|
1760
1758
|
parsePluginGithubSource,
|
|
1761
1759
|
pluginLocalPath,
|
|
1762
1760
|
fetchPluginSource,
|
|
@@ -1796,6 +1794,8 @@ export {
|
|
|
1796
1794
|
SKILL_SURFACE_CLEAR_ARG,
|
|
1797
1795
|
parseSkillCommand,
|
|
1798
1796
|
expandSkillInvocationInput,
|
|
1799
|
-
parsePendingSkillRequests
|
|
1797
|
+
parsePendingSkillRequests,
|
|
1798
|
+
recipeIdFromPath,
|
|
1799
|
+
parseAgentRecipeSchema
|
|
1800
1800
|
};
|
|
1801
|
-
//# sourceMappingURL=chunk-
|
|
1801
|
+
//# sourceMappingURL=chunk-7FBCRWVT.js.map
|