@octocodeai/octocode-core 2.0.0 → 4.0.0

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.
@@ -1 +1 @@
1
- import{brotliDecompressSync as P}from"node:zlib";export default JSON.parse(P(Buffer.from("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","base64")).toString());
1
+ import{brotliDecompressSync as e}from"node:zlib";export default JSON.parse(e(Buffer.from("G26GADwM8GQW/gpGWFhG55Qwi7mqGu6spsqL8ks/jJBkdmltqa6+34sIrsM1ATjkgPXUPC6BKPhnedP6ejdRLoptOyVmn2I9/1NV9ywj0r57kZu6C0m1VKR8AiSFHIWHK3Sakn3wNNp6036drgXZILkJ0SLmTckEfU+N3YuHnlXLb1G7gMRwTRAuNOunflbtnkPm6HWOqXIdEYvkgFa8mfkJevdbqj/XIQc+GJ5MFrTvzaw86lkqbSphacMSyqJJm5bXLzPfi62uqr5DA40gGsCEPIWlGpwS//2qajSwqjHcYGBOKItKSdeg681QmzRc6qlXG2FitrKNWv2XO+c6z7Fq1W6gOXKRBND/f9LvBRjWX3V6QLwspKpaNaelsIsNoIN1d7SjVdMixWOb9gmwxLxi3Gzx61mFag+c6BrwXGVi3ZykTB5yY9uxUj0GzmwSR7sOxUYuWf14FhgGd0YDEoSOxHlW/YSkIUNOn9hX5d3n7LmpMe/GRbIAXxb2oFYj9hmsB81GGNVG0AQ1DK4uLRu7eyV99OBR1sK8LGd0svWT71pAhKZUca0iGFr3od7n2cidwAfQsAk8dPwsy8LsZsJFthVIWzVWJnl1T3hH8lUlnyWoWoIvPkLBF190Cnvc8vveUKJ1utVFoKu/DoBqCzo8wybqNWxXYT5kFqsiW1mqxX23fOvZvL6fNGPb8/7DRV0kfvlK2JzXN3q1c5xvTpWhCYFogXXSeMp3uYc7bLCDOpnaIFu0ZrzcRmeaWQkWuEPxKEwlAjVALOOXeA+az9nTv8+YKFIUEnKFkSBJkC0qDYBS2LSWKBYEmh1OOnBA30aShvCkHKRcEqRBmMVvUX90kFFCvE/HlvMdQcxtfSXFSI8orsZtbN+hGo4AKDnEirqgYDl1GWQBSwSV0esff7yNP/y5zr4jKuXd1u2EydETZE+QfjaUqwZZn0+pbDJBzGFTDYrDoBrY4Cqvgbcnpbc3AGpL2P41i8veHphYo7g0WrHDjAdaPNi7mXHmcp74DrPx3x+6Ltf5fMCKovR6j1li0Td8wBBL7zNt4XBiN6vWzvctwatzsaP3IC3y1iV15rdumFhcLzGPMZOweXdU0sgNQDcAjAz3lqohJ6q6ic+to8sBWoJjJfi62w1TJr5RgIHPnD74Yb8xY4jNivXSnDVjoC7MJlZxFp/R7Owsok8M24BG++tnQpGDl4lpB9998Ux36x7KpX4GFmfusCDQIJuMWJuMnV+XYzuGROpjTMwrLRa0bG9FdqCFP1oTAoHigVkXwMDnbtY7GjZS12eC6jTUJRSHlHGOOuNuCOJTCMz4DxtTje1yrfSGb3Uoh6nxh0Gb3o/cGRBFEFos4nPWbW0hCHjlYHoPd90ygsAGSQjkVC/o2UBk1PwzoYSy7zKJSF2L7RSO2SwyBXp9h9RWS5DZPjFyVbMVDeatmS3YH2AeMRz83E8t7QUYaFjzhGQR5sdBX5whyeFTTyYZ0p/MMa+cWApO2tM6UrTzXHKYPtCRth5LFAzSVPbOgeptNM0V56AK6aEy57ohaGcywhpfAAK83xr0ysFSz+YqKoztpdqhQjpsAAmSQSchgdpEVAcxDAhzOSyDkQTNqHGjbkGQwSvDAyOwLw7FSFCzm8zBWQS6tt/iREa+QkC4DzQIHysIyUBnIctYflqg+VyMLAxuBBymcfJpTTRzn6nPn1y7k0EHgvZCXTc8S58VILwJBOxZwBcj4a+Ps8WURQ9sodhJkCl6QIDaLoXkSdJWWzKIJLzOO6Ch5Ubl51c3sOBKZoX+TjxYisF7pqxB6hjz4lyF2W+sB4E7CTExBdRix5DnLPHLft8YfrtXZc+cAI3up59lIWqy33l71/YLo3dqghTjxoDB5k8Ae8nVYbdeqyafwoW2U4vm+R7aivR6CAqDj1dVQc7WsxFX43m7z0wd4Bfms+aEyA5AmFFU/cCNzamzioYaDtInJqjk0DOIHAvtRnTo6ZE2vB5ItISQHs5xnIUEolOtvdL1fu8xF+d/e8MjJskUEtmQ6w5L7bey/iWv8RxpHEtk9aJKHdSJEv6R7dqCgBAkdgbaROtnnpEvhf5uJZoWKCnrpneXAXL3lhN0zj4Q3XM6y94jARMeJFuBWW4QnJ/ojtgzUUWt7aHkcxmj1CUs6H+JM/DnKIEtzo6NPwiCRpz9/KDL0eRy5NgDsz5eTshaMjgGpaMGQY6m2LsgGNsx+44ytoK/LKXMi4XGJxWOBCC8jaYi1kSueThLYRVz1DkRPi3rmekwZqSLWlOKX0H5woXigrme22HnKhqHBkHIIkPF+cDH95xBHaqgRouGqyUIaCyl6xMjMeQ8akH7gHlBLUP+ga8h6CejgWS863WjRXwWvS90A5bCPLJh9OoTy1NH/wGgNxLyWsdfTILLeFC1hirSbASSykpjJtFEhTG9LqIH2U75q/aeiRykHVqm+WoXEE5XRxMTzM/HtVfUGwyBokgKv/8dTeyJQu+RmK9tRxP8gNraT1nVAAtJAKzROpAB6VD3TgfBliXPRIn2a5KuvwvsD7tFL8JetxsXzzL43zkgKtWyzS/Ri3S+EEN5Pz0T87ZwhuKTZL1JyUbsYcud6HGJFNVdzRbSzSeHg5jVb73Z6JS6jXYpPfc/M+iP1HayhT/gc4ELgChOJsq0U7BC/qPnSl3x205qYYyzFs9Z+75RTz+K4AGB7ce3x0Ik3oDjYTM3e0cLShmX/uSSiT2Gz9rLljgxx7VYxLcJ0+znMrdmtkSOxB52rmfGb3Q/aWI/7TZwSRXY6Rfw40tldpbpHakpVouhk10LEXI62WIu3oiDYdrO7250NgvPu6/ScP3sdnpJr8sm56Vr/uKjSkVZKGYSWp56okXuqQqMDw1JsGESdTa7JLnv0niVD9tMTBPJZN0HcUBBWXHrfJEQveEU3X3HALA6KHzdKWLbtGc+6wsSce7Hs/q78hdJou7Wud8f7l0fZA6L55D52hauWmc9jW+MaegdaNpNUIMw1yn89FpXgq02kk59nouOiPQdpMDmnb+lu0lxqQONeIlij1Ym8cEogJL95l0t3Neg13g6+YFg7Y5HxTCUM7NsWgoPsbPZGnybkX84OXc1l7SWwZz+DqrVLi51/Y3fEB4dR4rvONebmgYLJlBG7xDSGXVt3dP7UdYFbPkLFZuq0s0momZIPZIzGGcBL3qjALMe1WcYgKfKZdhrPKCv1wz0gpAMpeCUCNKPv/+8gpIQJp+/zkqzB4Szk+CBv02vm8ovgWxRH04tTbLh7DpnomI0AEw6Cuq3wfRu7BuMSgO3sd52zRrk7gZOj96duPYIurF54mrLHYAc9FJ+kHj0mkI8AnedWQyCKys0SSny7ZocO2JHJpJeLqYzZGCJSDsLARNjauvpgreKWFADaxRfOgt1UivW68Ny/z5Sgu/HAPbYZtJfqN8cegbqDRstUrnqTVOeS4whWSePM0hCyQS3IebIvEimFotKeDmAed6P7CegWg5bNq2b9Fu7QnyiQbnO92CHIehPENPujCCtbeQtWL524XAu7yUxrzIZhNCJZD5vqzb86A4yE9i0PYBl0volpGJ7j/jgjNRPHvfidxfr2mV9mvK0zXDY/LQeWBWkXxc6k1+wsc689S0N71ukrlvkzN07jOuQpJ7Vg/1ZeffkRUC5SagV5CSi79TcJ1g6wYeTOm6pd3Mvdo8vH5q4F5vhsrjsCTUCO0CBy8WyOQ6Ewv8e69rdZ8ReyTNDBgWUa4VRu1Q+ABPMt7MVBRsP4cmjXYzDn/ME0TCwk0TG1j0/d6u6uTc40woy8uoMp2kD15STUwOmnKoGdipV9xNQoAQThn4WLkro5Muq2Iw+anGLmrdGTLul6We0BYQbMhqBEuQxixNZx3alju5RidWQOXCZYT+8T4FQ/x/7RK2/h4OB1/TokcC63lq2CzAPOwb6AdTLXnsYVo5K18Ov+TMrz0mCBUn5uMG4xl/eCHIZzQn1Y4g0fmHdYRv96M0Dx50bTIqx621YvF3tmPgqPCJuMj3wGcnxilhp3zJ2BD2i09oQBOzDp1DlQPr4IgLt3VHY4Tp0Vr9YPUYOf/StB2WWd4QmxfIbWiAAgM1vvS04fFp7kriIeqfSWqPhypFbQkL5K1lHzTvUqQ4seknK6EtfzwMzOYZ6yduNplx40QWy+Ck0izpZe9Eo2K/s2dA0zTQxr2w77iK62UIpSJAU12PdB0xiWgaGQFBTSRhY4uxGZUMkjmLVcLYeuJCvfwmbGhOPCDeSStAzEZgEVrXeDwi1PlZiFsH+vb9swVD7OkO8XmgvU9VHkZYt+4wE00RZ/dxmzMdt2JeSBHbq7XFiLWKsTBKCQkUvzeizTzsFSWqmhMdxqJEjkzwD+FOoEW1+7L+ai1bj+C0B4Dm6ThLKGAvQzWrSTrIyC6UZHi+QQX/hTk58heD/szk2ybYegv83i0HFLJVFIaABj6aSzoGwqSJFNWxi3hw+VJtyLWQekc5jHZQRIiJc3PSEcGvPttYoF7SxvAUdfjeky4OWUVCEF/E8E6z18CFGaSzx08zchWFwCJA65pBDOQ4UhN/htup/tVag6MGPL3B/Z9QOYzIaWULWspaWvF2lXuyUo8wlV7Q5kYT1E5udXY/4bz00V5cgDcfb0ct2FSERo5Ru9oDuRgDKspAsxVyChw128FdvkqtGLVPQQf1K7DWChAw9Ybv3XUChFq3Vue9BZyp9NhKYuifYvdnL+1wyyHs4WeSV2VK4PKOOdZGaucwasuNCPA3RGd1nIHD+n1mHJTL12DKUTmxR3n1afW1Kjye9WoXN96J74jCWj9/t91/yRLdCumzJ6TOEhyAFitVs30iO+DxCwMOq83aka3CK3OFOeyUcGgiZPy7GosMTq+wPXN2yViKfu3K5wy1SPkesFNu6xOVgCd2ipQLJu/RnvhdUcF3c4LKTGh5/AOUj4b/O8ETcmqWtU3Bs3n5DuNb27PExHukih4mbK2O7H7RhPAMpSfjYE9Zfed3ozn2zF3r0s42WgDHJTjaeRK50QrFRaLAi9qmoF7ahbn/v+u2QBqD2OqmAeMp1RUH1HPPPlwaPYhdiPNay9ngkvSdhOFm0qsdtG944knzBVZj4LbpL+CL11MUyfCxWZ8kyT59Tu21agXPMp2dHqmzzDYygtb1RsJcWODYsDaZCCWYKkoXYFPD0rmdLcENUFDM1T6ZxIcf3t9Ain7G7aaDuDAewZZ3aC+ZXDvADBHjv2eepIf4zvosZ1gii3peuyBo3XI4CNeO/Lk1o6YwiR/wj8fC+KyrRBTguuooOQLPNgUMjdRUnxhlwG00AxYJkzE86vOUoJ38L9btd2Hq3vrqcBhNMFpSgTD7aGhHHLpJ51W2/QbAW0zZhw92U9ATdVcQBX3IfDAB6qoXvj6KEZAdrg7BYlcGeW8+2VZH9VsBMvx/LFo979cdft/C3eaCeSQdzMxh7s3xXfLgszagI9fh6Ni542uXDr7n/8Xqce3iIn2rlwCz7Y7iDMf9dWZgXcfXUajXrQOtpYH2TrnwOXlWLpdi376AWYgOzOEZKqlGNXUDwNjy1zD2778GsNG2i9jsyJUWszRqezZQ+9mtpBn2e5d2TgRKoCRBJrtRD3w59Mbq9xFUJpU2Z9C4KFPfptUp36MCGdzujx7ztMbgd7AJsCzgIYDs7BskH+8FoYB4RDCkU3vxY3VaMClA5qNvWUsjrBHb7St8KJhcPqgW3jPuqV2kW879GhaN7qxsr5z1Qvyuf13OWzKNhJ596KqjRAwpT7qSOBG2TQ/myPJMcGflb0euN17E3h6GgZE0B0PceLE6kXhM6x3U6UwHVs7j3Gm+LD4xH1kTRKMurHOwAA2lK3R0bmOXEqa2xVlxjNUk9Jc8J/YFMYEnbFaKQLk0/bBHq+i3HRFdPyRqdDRXI15xIeZGTwYNBu8Yt7Y+G7PZu5cSMtmSGgJe/hZ8DZYYcRdZVnowtM1Lohs4CKJxjQMdlnNj4FY4iBkeudoYtEwq0uQkr30EqEt41EsRMtxs9aKFn8/1eKC3WpDnZ8IVWZ7aWZCusCcXdymlSYu4miGgHuWg58uojkZZDTaZa4/8iE4PIWKyZtruFVA4b1mGo/naDo4kMlRqgIm75dvWqz+XTJ0R5mPDyhliNriAGv4pxBY1j8RXXo3+TeMENP7bXjmKWejHY1Wodl07ykMfLxHmAyHk/MVwKTygOq5ABR4b6rgYxc7RE3CqorO3+gqOTTCFF26e9VZtzs3dTMyM7FZ2YCktrdDNViKTPx84seX8mS5gT2/hTjd9wMIxg2p5c7nBzbGEO3CrS9tPmK/+9pfnugmzmlg/NG3gejQu3U9ddudT3ZOS3EBp+OPLL+u46gzleTvMXJRW67zeBBU/x2Z65no2j2o+tYgeTNCexmckRpCrlz8eO80NknGwrdhjpF4bMH5WNWcnr2gqlboUIEbasCr1D1in85vIaqYvJSubUVpLkRhNolO2PW3R70Ff7w/9XaDpX/z4WTDwtCqCxJSTq1npoym5aakSwRUXA99Gy47/hruUUA+B3nyLM231f9J1EL2ZFvd2KY6p4IatijT/l7Td12vZ7TlU/qBqeLQ1b6PFvxGL1g/MKX2aSpZkTQpRWujr/MVxmMbQlIFE76UdKUXSyYIHdqBS4hnU+zPaX87D9X2dTF8LuOsCckisJgHj2MBOR1ZvkKOobzDZywfQrEHeJVixPygfPjDFVfahMCU85kVmpJfYhsXcDFRqU1QQaNXEicyysrnsuGUkqiWo6DrVNkdi+2GLT8np3cQZZvXheWiyVlVDi4YLsAyWwWtJ3YO5TuMwg4MdUKxtA5ckpUb3Fg+bb5S0osO/jWK6km+bBOh1UyWFZHLXYM0+CKn6cuJrQf0/N6vdKF/gqEOIWg6ntwSO9aqZkfHe7uqTY7zcmysy4aQ9OgulNmr/rYnF7L4e032Z/fS9pipolA1JYqmfGFUlnNu5bXzReQ29h8Uumt5J5IwQeGETjngDzU9Xxg9KwXuOByTip32Ngpu/sV1KWk6KaM5meRjyOMW5/qkcwUeaPkndliNapyBUhXzPgngX/mIt7/s2IK4OW7onUUWloNPlns9lTUwtXw2HSznqlwHKCTLYdIhkbB//e3Q1QCvBxbmFYV5VmRG0frlB1VGcWQ8ET3qXWQ29eMrQxaUlstUJaiPH9/yJnBHEY8A+AklLP8hFd3Pdg0VAhaJaHbfLNtEfnXi1eOMX03VI2LZOWmLqDwZQZv1gbkEzzkPED3LbYIBOguwCUkrnOKB4NL8Vj+TOr5CTAgfxwLkEL7jNYaA8PEOG+Y9FP2MQ7OwftqDsMQdtlu7ImukoJEDpMmKP+GllkRTiGPN9QT0rubJ3YqfL0k87jyZm6XvjIc33z0We5Jkl/it7pKZc8rDgVFFL27wB6ADW8q1cmcwUgYRKVm6FUquNj2JRBy9G+gfmf06N97a1l94eQlftyWwFUfqT2QBsdgwP1IV87LOblpdHGmWGLGdewysxWmAY7PGJzRzpkMngAOH7ICpKRxdnVYsMpiu6xvQQaHxGHTRshdaLUlBC8Z1R9oilwBEQF4gtTjQROBIf+NCk/Fs78VoDw8NOTKun0LmxMPdVq4CxYK89Jp8KaA/7l/Z2/rkQB/xAwXYQ3iFQ9C89PtJSqoDCECECzAuoCs/Hhg9s82YX2dmf3wFZyXykMStWfLqXx3i4gDsEGI7jnaAY6RROu4C/5Szr6EcDbSp7wcQomhkUR7hcfm7jB8PrKoZtrHseQ+J4SEA30eSQlTUtE0Z3l/GK0hM0B3R3bamHjwXC2tBkEvnmj0SAXMuzbSVY7zgRmb9r3AF/lhToxSqjpwVe53CGZ3md+NHicgLili5RN9DUjSTtG2D8Fw3Rh8iOhjBb6rLAT++z6dTnZ6L1KHgjwFZ68Q7E9u2ZxHBRdvX7MBe9VAm688CODLlIKNtyelQYX3vucTnpmthMEVKmEhpJKp8IsIvho+XwSy1Nh2nvVWcJ4qBr17VIW0mcDhZpXajF8qH9HKK0f+Fz3ipEDpCHrzZSants75U0ab5nMS0i8QTmqBTCpm79qVPBab9TyeLDfTZIn3Ok+OC2FhSDNvIaBGOY4WxlNkVR53WxcZZf7swKoc3dlNp6qCnO4oUZd32zsBZch0tM944CwIT+XBUGkmIyoKuvxIczYRHyxkpM3nqqjnmMse/VmSZbDXw9ESCsOT6JF8qa2e02tiq9LCsKgyoQlrEbRydQiyX+ydQwEBjQHtT1nLPBNNMpQYfHWkmnIqoxII1OW3vTknyib69YLouKH6nEgIE/pGURZBZf1OkjSmr9IMGHZG3eEQn8dMs1CpR2k9fNk3ZVTBu2KN0xc3Qc1tEf+fwvMnUXJK1jZxcE60PzK2Wj9bnp0XWkf/ihQhdnvrHDE4iPjH/Vng5ri2Ghu77IZb+n3V386rcLuetCNF3nu5zDoQGgfmeaqauvK5ZO14BF2Pg8DMNTRidZ02HSD55oVHSxzt63GU5Fjb3NriebpVhZPuNkcRolADbLFYw45pQtfdGDgdIfgpCPEoEOCsJC/HI5GrfZ6YKwfvQuYDyFXTDM6DP6TGhz7dtwL1eW/BkBBLEUmJY9AhAEAknKmEayoPOxkBTmWig5U72I9AoVe1/Y3MPgMgEEa0ovDMDgabR7Wkzb2Zu2iXsDEHEougFxtumg+NozaVW4s9ef1Hhptpa8NC+xLhjSbs5N6giyi0J31hNtBjbGBelKMnEgjPf0/nqCL/nkBbRumigFqk1RB7XqBpk3jDRhDpPjjENgybtaMMceSLRpH455w3zCMdvJW0zhhLNDXwfXot/Dtgg1Khk59o27xbJMEsln3FN53CVHD4fKV3ve3C4gkVWwbYo5XUaHcFrtNbZ98lpyJ1Puyk29BtxCK8Bhv5LoksuuaQ8C8qRAhtuLNbS5eipMAE6KdxyldHJAIZ421FL2rYROdwtoOPj4Duw44ed0HuIRgTJR7crpFe/Ve1bMZWeElvvlwltfnWvibQEE+eFPQXqNw0XqRz4PjO1PsCwM51j2kYpXtv5dGZ7YSqWGR+g65GfBJKLsMSxu3PPoyuv7rVwH+EURD/TmfehPslW1AiCjq+9j7gsnADJkeS8eccljOPU17MXaTh29SGmxQ9Jn2aJJ36D3KAO7w3WP7jzACwiKMKaPtOhf9dhxwf3JyoWKGDcq+gVi7X9VtrGb/CedYrIUDS+5xL/7+F247hrV11iXIVukdW6IPacXlofpQaAe/4HbPs3l/RlkcFQIewl8LaR3L1gG5KHYGD7M1XS2CXHcHzkljWiC8dQBtqGl9o/v6pr92Xzr8+0gm13ozGBY9t388b5Un2/d73NDBeUpDd32vtJv8z9VUR66mj0n9+RNv1HGKdSu3tbQ+UAk59zQ/bx7K/a/Qv7+bc2Vt+xJqow/9nqq5p+01qooTAPYse1ofeeP3mf//+1exK4vEfWzLWfZD7p0lRnytlEvMGt1ETGWhFg8YfnGZO5jsOY320a2+tZc+9hH+U+yeXft+GPMvYM8dztcVSa/yyHV3/b+87/f3s6jwZ9JJJnWrt7ECCYmyDRXUUNfwfXP+0shvWaLvzc+qUcy6fg5swYj/xBQL21i1I3po7bn1MPuwYyC+hG+CfDUjsY5aOwhfkb8kt+9R5oTAa9mOUNQjMZNy5JQpJrU/1JHWHf5ClSjvk8JzhuZ9Eq7vormemdzpY0oiit6IWW5MK7ISQKUH2R6/IH1LGzTAjsGUDHz+ESkztuvHSpJoMrn8LV2+rFZcdltKsaeumm4L7oX/mPbxBHTEG6dSN9lKokhutSKcBUN9AqqBhfrlYEztEod2yzAXEqgejGKRCNFdZ2oNtiEeRK33n9FU8nhPAfzZ3HlX6aMzqOS39hlz4fj2Xoxw+wyIYJNJA/p8VOCy2h0H9GHZm/Y/9IgDgNHVGBTuSJBMMQQLxXDVm+mwt0VwRDpjdqshBtbVn0UfZ5kZ4jwht+0Qg+RLOoAj3ZuuAFY9/CHoLcZko1Ro0EVAdnq8w6Sf6beG8paXUlfdOHR3Hpl66GsiLIQetshb0nwRZhpmIdlVJncLaAs9vGpOpK6dPhTdNpeaNIq2dmrcBm+dSIkfmBvjBStn7tUAjFPn9jFZrbEFZXbpXtj4KAE+z6WIDDX7POuqjVWr/HTv0X5+ln8P6mKrRe6I2ne/ZhUwAnO9Qjq0fV99QB6zbbl8ug1qsi4v+a2GxbEoSRJnsUpbHs7a7VQC6mPDxADNK/bHKlxcfFEVoGBU2YpXpbwXZI42rRRQmnaHsaaqHcNUcTsGKeCgjbrqPjRAd/r35z/a5+7t5mbfCyPcnA2/bIuj3tQ+E1YCHwAKZEXXmM+9yySrI+0xRMbQn8JQCGuyBoNdx1I/kwgf0/Cph7S29slOtuxaMAKJxrP7efPfeS+OG5StHpaqng+QINaPgN/sbQA1Te27zHPdS3fSNTPOaFSQDg1E1v4hccC0ZwqC52aSdrnycXwYXA+SfSYIxXzX3Ol670iCezQ33VJdziFgb/Kqp1OoSdWD4SMaAaoWVE1A+p6T34cDVbQ2/ywkHZBKSkRYUBzdVAuEwwcxdpuObZvYb1flCDgSEI6Wh1VCV3iikWebVvgaQzteRa7e398eHZGrcPIlJwOFN5rE3nzkder6PybUciWTo2IfkjVRgnw/PrQ22+CZKNkwpSS0XB/Kz3ptmeljycfs7XbcNW85/mrX5BXe9xstaj2IKlL2mDruB85Wjwm1orpTCCAU/X9fHWGN3q3o5C+GTJtKTM6HHeuh+CmKfIq6Z4pxWMuz1GvEYfgYn2H7crwIh6ObotPJXlwcI9YFNUpJ1B1euZh1PNmHd2HbfEk7aHze6KN6PldOYmnmlV+efct/6Y1nvNHKeGXIYTIvM+I2kP34b2FL35535a0w5N72z2ITzMFpEd8t8BdCJrBg+eyfy5h7wgIk76jxDO1DUxuysKaoQ2oy6ZOAYWgwbv7HQxj+wQYX8pMp/sOEq5rBPMC3t4BZYDSw81utAuBy8pPRNZeDjgZHGkcVSDzKK6FFZ23QRC+iI5UmhRUpGAyxMADCD4+5zeW3Rf0gdemU6fHHv38PaudeMe5MkP+XdrYudZXbbaKTjc+JQjPVuE0gcOyRLhsW7jz1Ypzx8izAiSy/GkaqdW/wg+f6hqPPxfp8gCclqFjonR2vmiRgUI3XsShfb5w5LzbchTFagZX3Y/q0ZjEhWS4t8hTAbMIfM/LE7AJTnZn6o1lqkWT1PmK+DjtVzZIFj5UTAg/JTjRWk8YRraj3HnvSQQJJ8bjfGty1kPMkGmdTcWA4e83cnanX6r+QuTzekHIXnPq5535pIXm/ZZagDIzT6mKqrGzDTs0YCyubUtwPtdE+KpDyelEXE+4PRp2Y9vEGqlTT9c/nczfxxmeNtDurmz8ZW/ehbuNFguD9EgS+o9VcgeE33Ti96pnulxD8mKj4xR6hopAC1exU/hZ6mkS0Ezkmgjt7Iitq4k6gFOpJsYKYM3B72svSGpgw3dX13JFz9nxZ2X/cCmGhUPGMWrH+DbhU8AP6rO1iSPSVWSYFEMUW7y3Kkol0sdP7Gmzzo5OVdazepkYqv/z0oLQKvw+/MCoGvDQJyks6ayTWITg3uLCLoph+HgbHgwNtDJ/yhlNVSKwa7DWc61nHxTcIjLNolvNI8Wdsq5BKt5PyRJ69sg/sLPjsUDnAdJwXYZn4AeomjwIQ2obSvecrU1IDwqlGpcFtARvzYGR/NFvemTX67HqYa1ZV2l6sJaycTHO2mnfhaeiJWBbteu/+t1TnTrRKN0+NhWp6kbM/yQJyc7QMo3lNz1pcGg2fg1LY7TUh/7zcJt1xoaD2Pg/Nw4X/xwDeCsg6WQLWpE4EoTI9deBU4uFymoZZehqJLEOxLvALgcm3fN7bq2dm7hwgTbzavZOZuvHGw0U6NvgL3eXU1rvgecFSh+GEVk9+CVRKRfkw+28MqM5HA6coxQVeGolQzm3EHS6bQgXNAIQg5P0/lBat6xtlFSWZ08sZ8DI6NxCYKUp16gGCtj6ABf9WWbopMWmjFMtIhJWHeRpzztuNPmNCx74sEEC7DK0mIi242UaPocPEKuKCz1ksu9jj64Vn4IhuBJnshMTdMUkVZjuRgU8xbYOIq46yRBxnxuGyqt4LX4S9MkPLQ7ciJmbjIWJZJDHwKg5Jw7nHUDb6P2HUY4XP8r7U0FyxN1uXwRfpQtEXmq27If/kbZ+uD+HZKrNlWQ2Svcd5xNv8w4zKUzBIA9siJy4cnWleD9M/qpVIKraO2DaIy+KpbcpTRCbifhmdb3ha0RqObSpqi1prsfn/zpfuS48xJQnrvCYt03qv9k+6HzTbg7fadLlTmZBbOzwtH2zOfGgu6/2g5N+eqynH0M9/lxfYCWnaRaBVS7BNWy5/2CMJr/btLZ+E05AkDEc/e09BuTF6webOTzBbhtr0r2hD5iZYnQQfZClB/3f5kGuzf9ln0wE=","base64")).toString());
@@ -1,5 +1,5 @@
1
1
  {
2
- "instructions": "## Octocode Code Research Agent\n\nYou answer code questions with evidence, not guesses. The MCP tool descriptions and schemas are the source of truth for parameters, modes, cost levers, and recovery hints read them before calling. This prompt covers the ideas; the tool prompts cover the mechanics.\n\n<identity>\nThis MCP shapes the call before bytes are fetched and threads hypotheses through every query. Research quality comes from picking the right instrument at the right rung — discovery before content, anchored slices before whole reads, structure before history — not from running more calls.\n</identity>\n\n<surfaces>\nTwo surfaces, one decision: external or local.\n- External: target lives outside the workspace public repos (code, structure, files, PR history) and registry packages.\n- Local: target is on disk your workspace or a clone. Local code can additionally be probed with the LSP helpers (definition, references, call hierarchy) when semantic resolution beats text matching.\n\nRouting:\n- Workspace question → local first.\n- Known dependency name → resolve via the package layer, then GitHub.\n- Public repo or library GitHub first; clone only when bulk reads or repeated lookups justify the cost.\n- After cloning → switch to local on the returned local path.\n</surfaces>\n\n<principles>\n- Evidence over inference. A single match is a lead; cross-check via an independent angle (definition vs usage, source vs docs, declared vs observed, current vs history) before concluding.\n- Hypothesis-driven. Every call records its mainResearchGoal, researchGoal, and reasoning — what it should prove and how it fits the investigation. Never query for vibes.\n- Cheapest useful call first. Shape and counts before content; content before history; surgical reads before clones.\n- Non-canonical paths (examples, fixtures, docs, tests, samples, benchmarks, e2e) are low-confidence for \"implementation found\" — re-anchor inside canonical source before concluding.\n- Carry state forward. Identifiers returned by one call (owner, repo, branch, path, local path, uri, line hint, PR number) feed the next call verbatim — never re-derive what the previous result already established.\n</principles>\n\n<cost_ladder>\nEvery research question climbs one ladder. Stop at the lowest rung that answers it.\n1. Shape — directory layouts, counts, existence checks, files-only listings, metadata-only PR triage.\n2. Anchored slice — distinctive-string anchors, line ranges, file-and-range PR diffs.\n3. Wide content full file reads, comment/commit expansions, full cloning.\n\nEach climb must be justified by a gap in the previous rung's result. Verbosity follows the same shape: start concise for presence questions, drop to compact for chaining, land on basic only for the final read.\n</cost_ladder>\n\n<workflows>\nQuality research patterns — paths through the tool graph, expressed as intent. Pick the tools by reading their descriptions; pick the rungs by the ladder above.\n\n- Find a remote repo or package → search by keywords, language, stars, or topic → inspect candidates by structure before reading any content.\n- Understand a dependency resolve the package → inspect repo shape at the root → read the entry point with an anchored slice. Clone only when repeated reads justify it.\n- PR archaeology search PRs by title with metadata-only payloads → re-fetch the chosen PR by number with anchored file/range diffs. Expand discussion only on the load-bearing PR.\n- Reconstruct intent (\"why was this built this way?\") → locate current source → search merged PRs scoped to the file → expand discussion only on the load-bearing PR.\n- Locate code in your workspace structure scan to identify candidate directories → text search to anchor file:line → read with anchored slice.\n- Assess a workspace symbol's impact or call flow → text search to anchor → LSP helpers for references or call hierarchy when text matches need semantic confirmation (workspace-scoped only).\n- Cross-source corroboration after a remote hit, mirror it locally (or in a clone) and verify through a second angle text matches across surfaces should agree on identity, not just spelling.\n</workflows>\n\n<anti_patterns>\n- Treating one empty result as proof of absence. Pivot terms, switch the angle (text → structure → history), or change the surface before concluding.\n- Climbing the ladder before the cheaper rung was actually tried. Counts and shape are almost always informative first.\n- Reading wide content when an anchor or range would land in the same region with a fraction of the bytes.\n- Searching globally when scoping identifiers are already known from prior results.\n- Cloning to satisfy curiosity. Clone is an investment — it earns out only with bulk reads or repeated lookups.\n- Treating non-canonical hits (fixtures, examples, docs, tests) as evidence of canonical implementation.\n- Calling LSP helpers with a guessed line the hint must come from a real prior search result on local code.\n- Re-deriving identifiers the previous result already returned.\n</anti_patterns>\n\n<lsp_note>\nLSP helpers operate only on local code (workspace or clone) and return lspMode = \"semantic\" or \"fallback\".\n- semantic: language server resolved the symbol graph — trust identity, references, and call edges.\n- fallback: language server unavailable; results came from pattern matching. Treat each hit as a candidate, expect imports to appear in place of definitions, and never quote a reference count or call edge from fallback mode as if it were semantic.\n\nIf fallback fires and the answer matters, sharpen the anchor and retry, or fall back to text + structure evidence (definition site + corroborating usages from independent files) and label conclusions as pattern-matched.\n</lsp_note>\n\n<output_rules>\n- Cite every factual claim. Local: file:line. Remote: canonical URL with branch or SHA when possible, or package registry metadata.\n- For multi-source conclusions, chain the evidence: claim → source → corroborating source.\n- Distinguish observed facts from inference. If partial, name the gap and propose the next probe.\n- Quote exact strings for versions, hashes, configuration flags, constants, commands, and API contracts.\n- Keep the answer focused on the question. Extra context only when it changes the conclusion.\n</output_rules>\n\n<tool_contract>\nTool descriptions explain when to use a tool, how it connects to other tools, and tool-specific gotchas. Tool schemas explain what each parameter means and how to set it. Do not duplicate these roles: common behavior lives here, tool-specific behavior lives in the tool description, parameter-level choices live in schema text.\n\nEvery query carries the shared research fields:\n- mainResearchGoal: the overall investigation or user question.\n- researchGoal: the specific fact this query should establish.\n- reasoning: why this query is the next cheapest useful probe.\n- verbosity: response-shaping cost tier — basic (default) | compact | concise. These two are general and identical on every tool: basic returns the full payload (all fields, full page, verbatim) — use it for final evidence reads; compact returns the same data with advisory hints trimmed — use it while chaining. concise is the lossy probe tier and is the only one whose shape is tool-specific: it drops the heavy payload to counts + top refs/names, or minifies content, and caps result counts — each tool's description states exactly what its concise returns. concise is never a dead-end: it always hands back something to act on (a path, a name, a minified body), never an empty payload. The verbosity feature emits no hints of its own — tiers shape data silently.\n\nPagination is always explicit: page-like fields walk result rows; charOffset/charLength walk rendered text; limit/max* fields cap the result pool before pagination unless the tool schema says otherwise. Advance until hasMore=false; do not confuse page size with total coverage.\n</tool_contract>\n\n<bulking>\nMost tools accept query arrays bundle independent probes in one call, sequence only on real dependencies. Bulk verbosity has two conventions; each tool description names only the exception when it is not per-query:\n- per-query: each query's verbosity is shaped independently; mixed bulks are supported.\n- bulk-gate: concise activates only when every query in the bulk requests concise; mixed bulks pass through at the higher tier.\n</bulking>\n\n<response_handling>\nAfter each call:\n- With results: reuse returned identifiers verbatim. Ask whether the result actually answers the question; if partial, name the gap and pick the smallest next probe on the ladder. Stop at three independent confirmations. Skip stale timestamps when freshness matters.\n- Empty: broaden terms or drop one filter at a time; split compound queries; pivot the angle. Stop after two refinements that still return nothing — ask the user rather than loop.\n- Error: authentication failure = scope/token issue; rate limit = wait or back off; not-found = verify owner/repo/path/branch spelling and case; transient failures = brief retry.\n- Bulk responses: each entry carries its own status handle independently; one empty or errored entry must not block the others.\n- Contradictions across sources: surface both sides with citations; pick on recency and authority; if the conflict is load-bearing, ask the user which signal to trust.\n</response_handling>\n",
2
+ "instructions": "## Octocode Code Research Agent\n\nYou answer code-research questions with evidence, not guesses. The agent receives this system prompt plus each tool's description and schema. Use this prompt for global research behavior; use each tool description for purpose/positioning; use each schema for exact parameters, modes, pagination, limits, and validation.\n\n<mission>\nFind the smallest reliable evidence set that answers the user’s question. Prefer a clear chain of discovery anchor verification over broad collection.\n</mission>\n\n<surfaces>\nChoose the surface before choosing the tool:\n- Local workspace or cloned repo: local structure, metadata, content search, content read, and LSP tools.\n- External public source: GitHub repository/search/read/history tools.\n- Registry dependency: package lookup first, then follow the repository to source.\n\nDefault routing:\n- Workspace question → local first.\n- Known package name → package lookup before guessing GitHub owner/repo.\n- Unknown public projectrepository discovery, then structure, then source.\n- External repo needing repeated reads, bulk grep, or LSPclone, then switch to local tools.\n</surfaces>\n\n<research_ladder>\nClimb only as high as needed:\n1. Shape: repo/tree layout, filenames, counts, metadata, concise existence checks.\n2. Anchor: distinctive text matches, exact paths, symbols, line hints, PR metadata.\n3. Evidence slice: targeted file ranges, matched sections, semantic definitions/references/calls, targeted PR patches.\n4. Wide context: full files, comments/commits, broad pagination, cloning.\n\nStop once the evidence answers the question. Escalate only when the current rung cannot disambiguate.\n</research_ladder>\n\n<tool_selection>\n- Structure tools answer “where could it be?”\n- Metadata tools answer “which files match name/time/size/type?”\n- Search tools answer “where does this text/symbol spelling occur?”\n- Read tools answer “what does this known file/section say?”\n- LSP tools answer semantic identity, references, and call flow for local code.\n- PR tools answer history, rationale, and change chronology.\n- Package tools answer registry identity and source location.\n</tool_selection>\n\n<quality_rules>\n- Preserve identifiers returned by tools exactly: paths, owner/repo, branch, line numbers, symbols, PR numbers, local paths.\n- One result is a lead, not proof. Verify important claims from another angle: nearby source, definition, references, tests, docs, or history.\n- Distinguish canonical implementation from tests, fixtures, examples, generated files, vendored code, and documentation.\n- Prefer semantic LSP evidence over text matches when symbol identity matters.\n- If LSP reports fallback mode, treat it as pattern evidence only; do not present it as a semantic reference count or call graph.\n- Empty results are not proof of absence until you have varied terms, loosened one filter at a time, or checked structure.\n- If output is truncated, narrow scope before paginating unless the missing page is clearly required.\n</quality_rules>\n\n<query_discipline>\nEvery query should have a purpose:\n- mainResearchGoal: stable objective across related calls.\n- researchGoal: what this specific query should reveal.\n- reasoning: why this query is the right next move.\n\nBatch independent queries when useful. Do not batch queries that depend on previous results.\n</query_discipline>\n\n<cost_control>\n- Start with concise or discovery-style probes when you only need existence, location, counts, or top candidates.\n- Use exact paths, directory scope, language/type filters, include/exclude patterns, and distinctive anchors to reduce noise.\n- Read ranges or matched sections before full files.\n- Clone only when local analysis will repay the fetch cost.\n- Fetch PR comments, commits, or full diffs only after metadata identifies a candidate worth inspecting.\n</cost_control>\n\n<failure_recovery>\n- No hits: check spelling/case, pivot synonyms, remove the narrowest filter, or inspect structure.\n- Too many hits: add repo/path/language/type scope or switch from broad terms to distinctive strings.\n- Not found: verify branch, exact path case, owner/repo, and whether the file lives in a package subdirectory.\n- Too large/truncated: use a narrower anchor, smaller range, lower verbosity, or clone for local grep when many reads are needed.\n- Auth/rate issues: report the limitation and continue with cheaper or already available evidence when possible.\n</failure_recovery>\n\n<answering>\nAnswer with cited evidence: file paths, line numbers, repo names, PR numbers, and tool-derived facts. Separate what is proven from what is inferred. If evidence is partial, state the gap and the smallest next check.\n</answering>\n",
3
3
  "toolNames": {
4
4
  "GITHUB_FETCH_CONTENT": "githubGetFileContent",
5
5
  "GITHUB_SEARCH_CODE": "githubSearchCode",
@@ -33,7 +33,7 @@
33
33
  "tools": {
34
34
  "githubGetFileContent": {
35
35
  "name": "githubGetFileContent",
36
- "description": "## Read GitHub file content [EXTERNAL: GitHub API]\n <when>\n - Read a known remote file\n - Extract a section from a large source file\n - Inspect remote config, docs, or source after discovery\n </when>\n <fromTool>\n - githubSearchCode: pass matched path + distinctive text as matchString\n - githubViewRepoStructure: read a file from a discovered directory\n - packageSearch: inspect package source after repo resolution\n </fromTool>\n <toTool>\n - githubSearchCode: search imports/exports/symbols from content\n - githubSearchPullRequests: history for this file\n - packageSearch: resolve dependency imports\n </toTool>\n <vs_localGetFileContent>\n - githubGetFileContent: remote file without cloning\n - localGetFileContent: file on disk (workspace or cloned)\n </vs_localGetFileContent>\n <gotchas>\n - matchString and line-range modes are server-side slices — unrequested bytes never leave the API. Prefer them over fullContent whenever the answer lives in a known region.\n - Pick exactly ONE extraction mode: startLine+endLine (line range), matchString (text anchor), or fullContent (whole file). Combining modes is rejected at the schema layer with a clear error.\n - matchString = default for large source files — anchor on unlikely collisions (full signature, error message, version literal). Short anchors = ambiguous hits.\n - Pin SHA/tag only when reproducibility matters (audits, RFCs). Default branch for \"what's true now.\"\n - On FILE_TOO_LARGE or content-truncated, narrow the read (matchString / smaller range) — don't retry the same mode.\n </gotchas>\n <verbosity>\n - concise: content MINIFIED (comments/whitespace stripped, substance kept), not blanked; raw→minified token summary; lastModified/By dropped; fullContent=true is minified (not ignored). A cheap full read — never larger than basic.\n </verbosity>\n <response_shape>\n - Bulk-gate exception: concise only activates when EVERY query sets `verbosity:\"concise\"`; mixed bulks return basic payloads.\n - Large slices use `charOffset`/`charLength`; prefer matchString or line ranges before paginating wide content.\n </response_shape>\n <examples>\n - matchString=\"export function\", matchStringContextLines=20\n - startLine=1, endLine=50\n - fullContent=true (small configs only)\n </examples>",
36
+ "description": "## Read GitHub file content [EXTERNAL: GitHub API]\n Use when you already know the remote file path and need source, docs, config, or a focused section from that file.\n\n Best research posture:\n - Arrive here from search or structure results; reuse the returned owner, repo, branch, path, and anchor text exactly.\n - Read only the region that can answer the question unless the file is small and inherently useful as a whole.\n - If the file is too large or truncated, narrow the read instead of retrying the same broad request.\n\n Prefer cloning only when many files or semantic local analysis are needed.",
37
37
  "schema": {
38
38
  "owner": "Repo owner. Required — file reads target a specific repo.",
39
39
  "repo": "Repo name.",
@@ -53,7 +53,7 @@
53
53
  },
54
54
  "githubSearchCode": {
55
55
  "name": "githubSearchCode",
56
- "description": "## Search GitHub code [EXTERNAL: GitHub API]\n <when>\n - Search remote content (match=\"file\") or paths/names (match=\"path\")\n </when>\n <fromTool>\n - githubSearchRepositories: after picking a candidate repo\n - githubViewRepoStructure: after choosing a directory scope\n - packageSearch: after resolving package → owner/repo\n </fromTool>\n <toTool>\n - githubGetFileContent: read a match; pass distinctive text as matchString\n - githubViewRepoStructure: inspect a match's parent dir\n - githubSearchPullRequests: when/why a match changed\n </toTool>\n <vs_githubViewRepoStructure>\n - githubSearchCode match=\"path\": files matching a keyword anywhere (filename-only)\n - githubViewRepoStructure: everything under a path (tree shape, even non-matching files)\n </vs_githubViewRepoStructure>\n <gotchas>\n - Without owner+repo, search is global — needs a distinctive term, otherwise GitHub's ~1000 cap shadows real hits.\n - Start with 1–2 filters; tighten only if noisy. Precedence when several set: path > filename > extension.\n - Zero hits = pivot terms/synonyms, or fall back to githubViewRepoStructure to confirm directory layout.\n - \"… [truncated]\" = re-query with tighter scope or larger responseCharLength; don't blind-paginate.\n </gotchas>\n <verbosity>\n - concise: counts + top paths only, no text_matches; `limit` capped at 3. A presence/where probe.\n </verbosity>\n <response_shape>\n - Bulk-gate exception: concise only activates when EVERY query sets `verbosity:\"concise\"`; mixed bulks return basic payloads.\n - GitHub search caps total results at ~1000; use `page` for coverage and `limit` as page size.\n </response_shape>\n <examples>\n - owner=\"facebook\", repo=\"react\", match=\"path\", keywordsToSearch=[\"utils\"]\n - keywordsToSearch=[\"useState\"], match=\"file\"\n - path=\"src/api\", extension=\"ts\", keywordsToSearch=[\"export\"]\n </examples>",
56
+ "description": "## Search GitHub code [EXTERNAL: GitHub API]\n Use to locate remote code, symbols, imports, strings, configuration, or matching file paths across GitHub or inside a known repo.\n\n Best research posture:\n - Scope to owner/repo or a directory as soon as you have a credible target.\n - Search with distinctive implementation terms; if results are noisy, tighten scope before increasing volume.\n - Treat matches as leads, then read the matched file or inspect nearby structure before concluding.\n\n Use repository structure when you need the tree, not keyword hits.",
57
57
  "schema": {
58
58
  "keywordsToSearch": "Search terms (AND). Quote multi-word phrases for exact match — cheapest precision lever; cuts call-site/comment noise.",
59
59
  "owner": "Repo owner (omit for cross-repo). Scope to a known repo when broad search returns noise; required when keyword is high-volume (e.g. \"auth\").",
@@ -68,7 +68,7 @@
68
68
  },
69
69
  "githubSearchPullRequests": {
70
70
  "name": "githubSearchPullRequests",
71
- "description": "## Search GitHub Pull Requests [EXTERNAL: GitHub API]\n <when>\n - Investigate why or when remote code changed\n - Find PRs that introduced/removed/discussed a file/symbol/feature/bug\n - Review diff metadata or targeted file patches\n </when>\n <fromTool>\n - githubSearchCode: history for matched symbols/paths\n - githubGetFileContent: history for a known file\n </fromTool>\n <toTool>\n - githubGetFileContent: compare against current state\n - githubSearchCode: search identifiers from PR patches\n </toTool>\n <gotchas>\n - Cheapest path when prNumber is known: prNumber + type=\"metadata\" bypasses search entirely (direct lookup).\n - partialContentMetadata fetches only the named files and line ranges from the PR — never the whole patch. Default to it the moment you know which files matter; fullContent is for tiny PRs or post-triage deep reads.\n - PR archaeology (\"which PR introduced X?\"): title-only beats body/comment noise. query=\"probable title keyword\" + matchScope=[\"title\"] + sort=\"best-match\".\n - `type` is the main cost lever. Default to metadata for triage. Promote to partialContent after you know which files/lines you need; fullContent only for tiny PRs or with prNumber.\n - withComments / withCommits aren't free — use only when investigating *why* (disagreement, evolution), not for triage.\n - \"When did this ship?\" → `merged-at` (more precise than `closed`, which includes rejected).\n </gotchas>\n <verbosity>\n - concise: ≤3 PRs, metadata only; `limit` capped at 3; `type` coerced to \"metadata\" unless prNumber+type is explicit; partialContentMetadata dropped. A triage probe.\n </verbosity>\n <response_shape>\n - `limit` is GitHub per_page; `page` walks search pages; `prNumber` bypasses pagination.\n </response_shape>\n <examples>\n - prNumber=123, type=\"metadata\"\n - query=\"experimental_use promise\", matchScope=[\"title\"], sort=\"best-match\"\n - owner=\"org\", repo=\"repo\", state=\"closed\", merged=true\n - prNumber=123, type=\"partialContent\", partialContentMetadata=[{\"file\": \"src/app.ts\"}]\n </examples>",
71
+ "description": "## Search GitHub Pull Requests [EXTERNAL: GitHub API]\n Use for code archaeology: when a change happened, why it happened, who reviewed it, or which PR introduced, removed, or discussed code.\n\n Best research posture:\n - First identify the relevant repo, file, symbol, or likely title terms from current code.\n - Triage with PR metadata before reading diffs or discussions.\n - Read targeted patches and comments only after the candidate PR is known.\n\n Prefer current code search/read tools for \"what does it do now\"; use PRs for history and rationale.",
72
72
  "schema": {
73
73
  "query": "Free-text across title/body/comments (max 256 chars). For archaeology, pair with matchScope=[\"title\"] + sort=\"best-match\" — title-only beats body/comment noise.",
74
74
  "prNumber": "Direct PR number (ignores other filters). Cheapest path when known — bypasses search (GET /pulls/:n).",
@@ -111,7 +111,7 @@
111
111
  },
112
112
  "githubSearchRepositories": {
113
113
  "name": "githubSearchRepositories",
114
- "description": "## Search GitHub repositories [EXTERNAL: GitHub API]\n <when>\n - Discover repos by keyword, owner, topic, stars, size, date\n - Find a repo when only project name, domain terms, or org are known\n - Compare candidates before source inspection\n </when>\n <fromTool>\n - packageSearch: broaden from a package to related repos\n - githubSearchCode: identify origin for cross-repo hits\n </fromTool>\n <toTool>\n - githubViewRepoStructure: inspect layout\n - githubSearchCode: search the chosen repo\n - githubGetFileContent: read README/configs\n - githubSearchPullRequests: history\n </toTool>\n <gotchas>\n - Use `language` before `topicsToSearch` topics are self-reported and often missing; `language` is auto-detected. #1 cause of missed repos.\n - If a registry name is known, packageSearch is cheaper and more direct.\n - Star filters trade noise for coverage: \">500\" hides niche/new work — don't stack stars + recency aggressively.\n - On weak results, vary terms before adding filters: auth ↔ authentication, plugin ↔ extension, k8s ↔ kubernetes.\n </gotchas>\n <verbosity>\n - concise: ≤3 compact records ({full_name, stars, language?}); `limit` capped at 3. A \"does it exist / top candidate\" probe.\n </verbosity>\n <response_shape>\n - `limit` is GitHub per_page; `page` walks result pages.\n </response_shape>\n <examples>\n - language=\"TypeScript\", topicsToSearch=[\"cli\"], stars=\">1000\"\n - owner=\"example-org\", keywordsToSearch=[\"auth-service\"], updated=\">=2025-01-01\"\n - language=\"Go\", keywordsToSearch=[\"kubernetes operator\"]\n </examples>",
114
+ "description": "## Search GitHub repositories [EXTERNAL: GitHub API]\n Use when the repository is not yet known: discover projects by name, domain terms, owner, topic, popularity, recency, or language.\n\n Best research posture:\n - Start broad enough to avoid hiding niche or newly created projects.\n - Prefer registry lookup when an exact package name is known.\n - Evaluate candidates by activity, ownership, language, README signal, and then inspect source layout before reading implementation.\n\n This is a discovery tool, not a source-inspection tool.",
115
115
  "schema": {
116
116
  "keywordsToSearch": "Keywords (AND) across name/description/README. Broadest reach; combine with stars/language to cut noise.",
117
117
  "topicsToSearch": "GitHub topic tags (self-reported, often sparse — #1 source of missed repos; prefer `language`). Only fires when maintainers tagged.",
@@ -129,7 +129,7 @@
129
129
  },
130
130
  "githubViewRepoStructure": {
131
131
  "name": "githubViewRepoStructure",
132
- "description": "## Display GitHub repo structure [EXTERNAL: GitHub API]\n <when>\n - Understand a remote repo or directory layout\n - Discover exact paths before code search or file reads\n - Inspect siblings around a candidate match\n </when>\n <fromTool>\n - githubSearchRepositories: after picking a repo\n - packageSearch: after resolving package repo\n </fromTool>\n <toTool>\n - githubSearchCode: search inside a directory\n - githubGetFileContent: read selected files\n - githubSearchPullRequests: history of discovered paths\n </toTool>\n <vs_githubSearchCode>\n - githubViewRepoStructure: enumerate everything under a path (tree shape)\n - githubSearchCode match=\"path\": filename-only keyword match anywhere in the repo\n </vs_githubSearchCode>\n <gotchas>\n - Cheapest probe in the external suite: path=\"\" + depth=1 + verbosity=\"concise\" — confirms repo shape before any content fetch.\n - Reconnaissance: root layout first (path=\"\", depth=1), then drill into the suspect dir. Don't crank depth at root — large monorepos truncate.\n - Monorepo signal: top-level packages/, apps/, libs/, services/ real code is one level deeper.\n - When inspecting a match, glance at siblings — config/index/feature files reveal canonical vs fixture/example.\n - \"truncated at depth=N\" = narrow scope, not deeper recursion.\n </gotchas>\n <verbosity>\n - concise: entries[] dropped folder/file counts + top entry names (folders first) to drill into.\n </verbosity>\n <response_shape>\n - Directory rows page with `entryPageNumber`/`entriesPerPage`; heed truncated=true or hasMore=true.\n </response_shape>\n <examples>\n - path=\"\", depth=1 (root)\n - path=\"src\", depth=2\n - path=\"packages/core\", depth=1\n </examples>",
132
+ "description": "## Display GitHub repo structure [EXTERNAL: GitHub API]\n Use to understand a remote repository or directory layout before searching or reading files.\n\n Best research posture:\n - Start at the root for orientation, then drill into likely source packages or feature directories.\n - Use sibling context to distinguish canonical implementation from examples, fixtures, generated code, and tests.\n - When output is truncated or broad, narrow the directory rather than asking for a deeper tree.\n\n Use code search when you need content matches rather than tree shape.",
133
133
  "schema": {
134
134
  "owner": "Repo owner. Required scoping.",
135
135
  "repo": "Repo name.",
@@ -142,7 +142,7 @@
142
142
  },
143
143
  "packageSearch": {
144
144
  "name": "packageSearch",
145
- "description": "## Find NPM packages [EXTERNAL: npm]\n <when>\n - Resolve a known package name before source research\n - Get repo URL, versions, license, metadata\n - Compare package alternatives\n </when>\n <fromTool>\n - localSearchCode: resolve an imported dependency\n - localGetFileContent: resolve deps from manifests\n </fromTool>\n <toTool>\n - githubViewRepoStructure: explore returned repo URL\n - githubSearchCode: search package implementation\n - githubGetFileContent: read package source\n </toTool>\n <vs_github>\n - packageSearch: known registry names + metadata (cheapest when name is known)\n - githubSearchRepositories: broad repo discovery by keyword\n </vs_github>\n <gotchas>\n - Cheapest bridge from \"name in code/manifest\" → \"where is the source?\" — always run before guessing GitHub owner/repo.\n - Exact-name lookup (name=\"<pkg>\", searchLimit=1, npmFetchMetadata=false) is the cheapest path. Promote searchLimit/metadata only when comparing alternatives or needing repo URL/versions.\n - One name one canonical record; broader \"packages doing X\" exploration is githubSearchRepositories' job.\n </gotchas>\n <verbosity>\n - concise: 1 record ({name, version, repository, deprecated}); searchLimit capped at 1, npmFetchMetadata forced off. A \"does it exist / canonical name\" probe.\n </verbosity>\n <response_shape>\n - No row pagination; `searchLimit` is the only result cap. Large renders still auto-paginate via response-level `charOffset`/`charLength`.\n </response_shape>\n <examples>\n - name=\"express\"\n - name=\"@modelcontextprotocol/sdk\"\n - name=\"lodash\", searchLimit=5\n </examples>",
145
+ "description": "## Find NPM packages [EXTERNAL: npm]\n Use to resolve package names to registry metadata and source repositories before researching dependency code.\n\n Best research posture:\n - Use it for exact dependency names found in imports, manifests, stack traces, or documentation.\n - Follow the returned repository to GitHub tools for source inspection.\n - Use broader repository discovery when the task is to find projects in a domain rather than resolve a known package.\n\n This is the cheapest bridge from package name to source location.",
146
146
  "schema": {
147
147
  "name": "Package name or search term",
148
148
  "searchLimit": "Max NPM results in the single response. Use 1 for exact lookup; raise to surface alternatives or spelling variants.",
@@ -151,7 +151,7 @@
151
151
  },
152
152
  "githubCloneRepo": {
153
153
  "name": "githubCloneRepo",
154
- "description": "## Clone GitHub repository to local filesystem\n <when>\n - Need full local access (large-scale analysis, offline work)\n - Run LSP against an external repo\n - Repo too large to explore via GitHub API\n </when>\n <fromTool>\n - githubSearchRepositories: found target\n - githubViewRepoStructure: confirmed layout\n </fromTool>\n <toTool>\n - localSearchCode / localViewStructure / localGetFileContent / localFindFiles: use returned localPath\n - lspGotoDefinition / lspFindReferences / lspCallHierarchy: semantic analysis\n </toTool>\n <vs_githubViewRepoStructure>\n - githubCloneRepo: full copy — enables LSP + bulk grep; costs disk + fetch\n - githubViewRepoStructure + githubGetFileContent: surgical reads — best for small inspection\n </vs_githubViewRepoStructure>\n <gotchas>\n - Only clone if you need LSP, bulk grep, or repeated reads. For a few lookups, viewRepoStructure + getFileContent is cheaper.\n - Monorepos: `sparse_path` turns 500MB 20MB use it when only one package is in scope.\n - After clone, switch to local* + LSP on localPath; further GitHub calls waste rate limit.\n </gotchas>\n <verbosity>\n - concise: {localPath, cached, branch} only; size/duration/sparsePath dropped. (Clone is a side-effecting one-shot; localPath is the only field the next call needs.)\n </verbosity>\n <response_shape>\n - Clone is one-shot; cache-hit directory listings page with `charOffset`/`charLength`.\n </response_shape>\n <examples>\n - owner=\"facebook\", repo=\"react\"\n - owner=\"vercel\", repo=\"next.js\", sparse_path=\"packages/next\"\n - owner=\"org\", repo=\"repo\", forceRefresh=true\n </examples>",
154
+ "description": "## Clone GitHub repository to local filesystem\n Use when remote API inspection is no longer enough: bulk grep, repeated reads, offline analysis, or LSP over an external repository.\n\n Best research posture:\n - Confirm the target repo and rough layout before cloning.\n - Prefer a focused sparse checkout for monorepos when the relevant package or directory is known.\n - After a successful clone, continue with local filesystem and LSP tools on the returned local path.\n\n Avoid cloning for one-off file reads or small source inspections; remote structure/search/read tools are cheaper.",
155
155
  "schema": {
156
156
  "owner": "Repo owner (user or org).",
157
157
  "repo": "Repo name.",
@@ -164,7 +164,7 @@
164
164
  },
165
165
  "localGetFileContent": {
166
166
  "name": "localGetFileContent",
167
- "description": "## Read file content [LOCAL: filesystem]\n <when>\n - Read a known local path after discovery or LSP navigation\n - Extract a section via matchString or line range\n - Read small config/docs/manifest/JSON/Markdown/YAML directly\n </when>\n <fromTool>\n - localSearchCode: read matched sections\n - localFindFiles: read found non-code files\n - localViewStructure: read selected files\n - LSP tools: read context after semantic lookup\n </fromTool>\n <toTool>\n - localSearchCode: search symbols/imports from content\n - lspFindReferences: semantic usages\n - lspCallHierarchy: trace calls\n </toTool>\n <vs_githubGetFileContent>\n - localGetFileContent: file on disk (workspace or cloned)\n - githubGetFileContent: remote file without cloning\n </vs_githubGetFileContent>\n <gotchas>\n - For source code, prefer search or LSP first — reading without an anchor or range is too coarse.\n - Pick mode: exact lines → startLine/endLine; distinctive text → matchString; tiny config/docs → fullContent. fullContent + matchString is rejected; fullContent on a large file without charLength will fail.\n - matchString = default for big source files anchor unlikely to collide (full signature, error string). Short anchors miss.\n </gotchas>\n <verbosity>\n - concise: content MINIFIED (comments/whitespace stripped, substance kept), not blanked; raw→minified token summary; lastModified/By dropped. A cheap full read — never larger than basic.\n </verbosity>\n <response_shape>\n - Large reads page with `charOffset`/`charLength`; prefer `matchString` or line ranges when possible.\n </response_shape>\n <examples>\n - matchString=\"class UserService\", matchStringContextLines=10\n - startLine=50, endLine=100\n - fullContent=true (small configs only)\n </examples>",
167
+ "description": "## Read file content [LOCAL: filesystem]\n Use when a local path is known and you need source, docs, config, or a focused section from that file.\n\n Best research posture:\n - Reach this tool from structure, metadata search, text search, or LSP results.\n - For source files, anchor the read to a match or line range whenever possible.\n - Read whole files mainly for small manifests, configs, docs, or schemas where full context matters.\n\n Prefer local search or LSP first when you do not yet know where the relevant code lives.",
168
168
  "schema": {
169
169
  "path": "File path (required).",
170
170
  "fullContent": "Return entire file. Small configs/manifests only; without charLength fails on large files. Mutually exclusive with matchString.",
@@ -180,7 +180,7 @@
180
180
  },
181
181
  "localFindFiles": {
182
182
  "name": "localFindFiles",
183
- "description": "## Find files by metadata [LOCAL: filesystem]\n <when>\n - Find files/dirs by name, path, time, size, type, permissions\n - Narrow scope before content search\n - Locate recently changed files with modifiedWithin\n </when>\n <fromTool>\n - localViewStructure: filter a discovered tree\n - localSearchCode: find siblings after content matches\n </fromTool>\n <toTool>\n - localSearchCode: search content in found files\n - localGetFileContent: read found configs/manifests\n - localViewStructure: inspect found directories\n </toTool>\n <vs_localViewStructure>\n - localFindFiles: targeted discovery by name/size/time/permissions across a tree\n - localViewStructure: tree view of a directory with metadata\n </vs_localViewStructure>\n <gotchas>\n - Cheapest probe: path + name/iname + excludeDir + verbosity=\"concise\" — confirms existence with a single count.\n - Start with `path` + (`name`/`iname`/`names`) + `excludeDir` + `modifiedWithin` — covers most needs.\n - Metadata-only for \"files containing X\" use localSearchCode. Mixing is the most common wasted call.\n - On large trees, pure name globs are slow. Add time/size constraint (modifiedWithin, sizeGreater) for pruning.\n - Always pass excludeDir on real repos — node_modules/dist/.git/coverage/build/.next dwarf the signal.\n - Killer use case: \"what changed recently?\" (modifiedWithin + sortBy=modified). Use before crawling git log.\n </gotchas>\n <verbosity>\n - concise: files[] dropped → count + newest path only. An existence/recency probe.\n </verbosity>\n <response_shape>\n - File rows page with `filePageNumber`/`filesPerPage`; rendered payload pages with `charOffset`/`charLength`; `limit` is a hard pre-pagination cap.\n </response_shape>\n <examples>\n - name=\"*.ts\", modifiedWithin=\"7d\"\n - iname=\"readme\", type=\"f\"\n - sizeGreater=\"10M\", excludeDir=[\"node_modules\"]\n </examples>",
183
+ "description": "## Find files by metadata [LOCAL: filesystem]\n Use for local file discovery by name, path, type, size, permissions, or timestamps before reading or searching content.\n\n Best research posture:\n - Use it to narrow a workspace, clone, or recent-change investigation without scanning file bodies.\n - Exclude noisy generated/vendor/build directories on real repositories.\n - After finding candidate files or directories, switch to structure, content search, or targeted reads.\n\n Do not use this for \"files containing X\"; that is content search.",
184
184
  "schema": {
185
185
  "path": "Starting directory (required).",
186
186
  "maxDepth": "Max recursion depth.",
@@ -215,7 +215,7 @@
215
215
  },
216
216
  "localSearchCode": {
217
217
  "name": "localSearchCode",
218
- "description": "## Search code patterns [LOCAL: ripgrep]\n <when>\n - Find local code by text, regex, symbol, import, constant\n - Get file paths and lineHint values for LSP tools\n - Discover matching files fast with filesOnly=true\n </when>\n <fromTool>\n - localViewStructure: after identifying candidate dirs\n - localFindFiles: after narrowing by filename/metadata\n </fromTool>\n <toTool>\n - lspGotoDefinition / lspFindReferences / lspCallHierarchy: use returned lineHint\n - localGetFileContent: read matches when LSP isn't needed\n </toTool>\n <vs_localFindFiles>\n - localSearchCode: content search (text/regex in file bodies)\n - localFindFiles: metadata search (name/size/time/permissions)\n </vs_localFindFiles>\n <gotchas>\n - Start with `pattern` + `path` + (`type` or `include`). Handles 90%.\n - Pick `mode` first: discovery for \"is X anywhere?\"; paginated (default) for normal reading; detailed only when context lines around every hit are needed. mode=\"discovery\" + verbosity=\"concise\" = cheapest broad probe.\n - For literal text, fixedString=true is faster and safer than regex.\n - \"Hot files?\" → `count` (matching-line count). \"Match density?\" → `countMatches`. Picking wrong wastes a call.\n - Large-payload auto-warning is real — narrow scope rather than paginate around it.\n </gotchas>\n <verbosity>\n - concise: files[] dropped → file/match counts + top path only; pagination knobs ignored. A presence/where probe.\n </verbosity>\n <response_shape>\n - Row pagination has two levels: files via `filePageNumber`/`filesPerPage`, then per-file matches via `matchesPerPage`; `maxFiles` and `maxMatchesPerFile` are hard pre-pagination caps.\n </response_shape>\n <examples>\n - pattern=\"function handleAuth\", type=\"ts\"\n - pattern=\"export.*UserService\", perlRegex=true\n - pattern=\"TODO\", filesOnly=true\n </examples>",
218
+ "description": "## Search code patterns [LOCAL: ripgrep]\n Use to find local code by text, regex, symbol spelling, import, constant, TODO, or error message, and to anchor LSP navigation.\n\n Best research posture:\n - Start here for local code questions when the symbol location is unknown.\n - Narrow by directory, language, include/exclude patterns, or literal matching before expanding result volume.\n - Treat text matches as candidates; use LSP for semantic identity, references, and call flow when available.\n\n Use metadata search for filenames/timestamps and content reads only after you have a path or anchor.",
219
219
  "schema": {
220
220
  "pattern": "Pattern/regex (required).",
221
221
  "path": "Root directory (required).",
@@ -245,7 +245,7 @@
245
245
  },
246
246
  "localViewStructure": {
247
247
  "name": "localViewStructure",
248
- "description": "## View directory structure [LOCAL: filesystem]\n <when>\n - Understand local directory layout\n - Discover candidate source/test/config/docs paths\n - Inspect siblings around a known path\n </when>\n <fromTool>\n - localFindFiles: inspect parent dirs of metadata matches\n - localSearchCode: browse around content matches\n </fromTool>\n <toTool>\n - localSearchCode: search inside discovered dirs\n - localFindFiles: filter by metadata/name\n - localGetFileContent: read selected files\n </toTool>\n <vs_localFindFiles>\n - localViewStructure: tree view of a directory with metadata\n - localFindFiles: targeted discovery by name/size/time/permissions across a tree\n </vs_localFindFiles>\n <gotchas>\n - Auto-excludes node_modules/.git/dist/coverage and offers two pagination tiers (entries + chars), so root scans return signal-shaped trees with no manual filtering. Lean on it as workspace reconnaissance — root first, then drill in.\n - Monorepo signal: top-level packages/, apps/, libs/, services/ → drill in.\n - For \"shape of project\" use this; for name/size/time use localFindFiles; for content use localSearchCode.\n </gotchas>\n <verbosity>\n - concise: entries[] dropped → summary counts + top entry names (folders first) to drill into.\n </verbosity>\n <response_shape>\n - Entry rows page with `entryPageNumber`/`entriesPerPage`; rendered payload pages with `charOffset`/`charLength`; `limit` is a hard pre-pagination cap.\n </response_shape>\n <examples>\n - path=\"<workspace>\", depth=1\n - path=\"<workspace>/src\", depth=2\n - pattern=\"*.ts\", filesOnly=true\n </examples>",
248
+ "description": "## View directory structure [LOCAL: filesystem]\n Use to orient yourself in a local workspace or cloned repository and discover source, test, config, docs, or package boundaries.\n\n Best research posture:\n - Inspect the root first, then drill into likely source or package directories.\n - Use tree shape and siblings to avoid mistaking examples, fixtures, generated output, or tests for canonical implementation.\n - Switch to metadata search for filename/time filters and content search for symbols or strings.\n\n This is the local reconnaissance tool.",
249
249
  "schema": {
250
250
  "path": "Directory path (required).",
251
251
  "details": "Show perms/size/dates.",
@@ -268,7 +268,7 @@
268
268
  },
269
269
  "lspGotoDefinition": {
270
270
  "name": "lspGotoDefinition",
271
- "description": "## Navigate to symbol definition [LOCAL: LSP]\n <when>\n Semantic resolution uses the language server's symbol graph, not text matching. A single accurate answer where pattern search returns candidates.\n - Jump from a usage to its definition/declaration\n - Resolve imports, exports, classes, methods, variables, types\n - Confirm canonical implementation before reading source\n </when>\n <fromTool>\n - localSearchCode: provides uri + 1-indexed lineHint\n - lspFindReferences / lspCallHierarchy: jump from a ref/call site to definition\n </fromTool>\n <toTool>\n - lspFindReferences: all usages of the resolved symbol\n - lspCallHierarchy: callers/callees for resolved functions/methods\n - localGetFileContent: read resolved implementation\n </toTool>\n <vs_lspFindReferences>\n - lspGotoDefinition: jump to definition (1 hop)\n - lspFindReferences: list every usage (many)\n </vs_lspFindReferences>\n <vs_lspCallHierarchy>\n - lspGotoDefinition: resolve symbol identity\n - lspCallHierarchy: traverse call relationships from a resolved function/method\n </vs_lspCallHierarchy>\n <gotchas>\n - Multiple results ⇒ overloads, re-exports, barrel files. Inspect each before assuming one is canonical.\n - If first hop lands on an import, hop again — real definition is one resolution away.\n - For only \"where is it?\" (path:line), drop to verbosity=concise. Reading the body unnecessarily is the most common over-spend.\n </gotchas>\n <verbosity>\n - concise: snippet stripped → path:line:col only. The common \"where is it?\" answer.\n </verbosity>\n <response_shape>\n - Rendered output pages with `charOffset`/`charLength` for many definitions (overloads, re-exports).\n </response_shape>\n <examples>\n - uri=\"src/services/auth.ts\", symbolName=\"handleLogin\", lineHint=42\n - uri=\"src/utils/index.ts\", symbolName=\"formatDate\", lineHint=15\n </examples>",
271
+ "description": "## Navigate to symbol definition [LOCAL: LSP]\n Use to resolve a local symbol from a usage, import, export, type, variable, class, method, or property to its definition or declaration.\n\n Best research posture:\n - Get the file and line anchor from local search or a previous semantic result; do not guess.\n - Follow re-exports or import aliases until the canonical implementation is reached.\n - After resolving identity, use references, call hierarchy, or a targeted content read depending on the question.\n\n Prefer this over text search when same-named symbols may collide.",
272
272
  "schema": {
273
273
  "uri": "File path. Example: \"src/utils.ts\".",
274
274
  "symbolName": "EXACT symbol text, no parens, no partials.",
@@ -281,7 +281,7 @@
281
281
  },
282
282
  "lspFindReferences": {
283
283
  "name": "lspFindReferences",
284
- "description": "## Find all usages of a symbol [LOCAL: LSP]\n <when>\n Semantic resolution uses the language server's symbol graph, not text matching. Real usages, not same-spelling collisions.\n - Find semantic refs to a function, class, variable, type, property, interface\n - Assess impact before changing a symbol\n - Separate real refs from same-text matches\n </when>\n <fromTool>\n - localSearchCode: provides uri + 1-indexed lineHint\n - lspGotoDefinition: after resolving the canonical symbol\n </fromTool>\n <toTool>\n - lspCallHierarchy: call relationships when symbol is function/method\n - lspGotoDefinition: jump from a reference to its definition\n - localGetFileContent: read reference context\n </toTool>\n <vs_lspCallHierarchy>\n - lspFindReferences: all semantic usages (calls, assignments, imports, type refs)\n - lspCallHierarchy: function/method call relationships only\n </vs_lspCallHierarchy>\n <gotchas>\n - Cheapest probe: groupByFile=true + verbosity=\"concise\" — blast-radius answer with no snippets. Promote to flat refs only after the rollup names the files that matter.\n - Pick shape first: \"how widely used?\" → groupByFile=true (counts only, cheap). \"What does each usage look like?\" → flat refs + snippets. Wrong shape can 10x the response.\n - In a monorepo, scope with includePattern/excludePattern before paging through hundreds of refs.\n - Auto-rollup at ≥500 refs is a safety net, not a bug. If you hit it, treat the symbol as widely used and re-scope.\n </gotchas>\n <verbosity>\n - concise: snippets dropped → flat refs under 500, per-file rollup at 500+. With `groupByFile`: a per-file count map (file→count) at any tier. A blast-radius probe.\n </verbosity>\n <response_shape>\n - Flat references page with `page`/`referencesPerPage`; use `groupByFile` for blast-radius probes instead of paging snippets. Large renders auto-paginate via `charOffset`/`charLength`.\n </response_shape>\n <examples>\n - uri=\"src/types.ts\", symbolName=\"UserConfig\", lineHint=15\n - uri=\"src/utils.ts\", symbolName=\"formatDate\", lineHint=42, includeDeclaration=false\n - uri=\"src/api.ts\", symbolName=\"API_KEY\", lineHint=3, groupByFile=true\n </examples>",
284
+ "description": "## Find all usages of a symbol [LOCAL: LSP]\n Use for semantic impact analysis on local code: real references to a function, type, class, variable, property, interface, or import.\n\n Best research posture:\n - Anchor the exact symbol with local search or definition lookup first.\n - Start with a blast-radius view when the symbol may be widely used, then inspect specific files or refs.\n - Scope monorepos before paging through large reference sets.\n\n Use call hierarchy when the question is specifically about caller/callee relationships.",
285
285
  "schema": {
286
286
  "uri": "File path. Example: \"src/api/client.ts\".",
287
287
  "symbolName": "EXACT symbol text, no parens, no partials.",
@@ -289,18 +289,16 @@
289
289
  "orderHint": "0-indexed occurrence if multiple same-name symbols on same line (default: 0).",
290
290
  "includeDeclaration": "Include definition (default: true).",
291
291
  "contextLines": "Context lines around each ref.",
292
- "referencesPerPage": "References per response page from a pre-sorted list. Default 10. Walk via \\`page\\` until pagination.hasMore=false.",
292
+ "referencesPerPage": "References per response page. Walk via \\`page\\` until pagination.hasMore=false.",
293
293
  "page": "1-indexed references page. Advance until pagination.hasMore=false. For blast-radius, prefer \\`groupByFile\\`.",
294
294
  "groupByFile": "Roll up refs into per-file counts (cheaper — \"is this used widely?\").",
295
295
  "includePattern": "Glob array — restrict to these paths (e.g. one package of a monorepo).",
296
- "excludePattern": "Glob array — exclude these paths.",
297
- "charOffset": "Rendered-output cursor. Advance until outputPagination.hasMore=false (large ref sets auto-paginate).",
298
- "charLength": "Rendered-output page size. Pair with \\`charOffset\\`."
296
+ "excludePattern": "Glob array — exclude these paths."
299
297
  }
300
298
  },
301
299
  "lspCallHierarchy": {
302
300
  "name": "lspCallHierarchy",
303
- "description": "## Trace function call relationships [LOCAL: LSP]\n <when>\n Semantic call graph uses the language server's resolved call relationships, not pattern matching. Traces real flow, not text co-occurrence.\n - \"Who calls this?\" direction=\"incoming\"\n - \"What does this call?\" → direction=\"outgoing\"\n - Trace execution flow or impact\n </when>\n <fromTool>\n - localSearchCode: provides uri + 1-indexed lineHint\n - lspGotoDefinition: after resolving the target\n </fromTool>\n <toTool>\n - lspGotoDefinition: jump from call sites to definitions\n - localGetFileContent: read caller/callee context\n </toTool>\n <vs_lspFindReferences>\n - lspCallHierarchy: function/method call graphs only\n - lspFindReferences: types, variables, classes, assignments, imports\n </vs_lspFindReferences>\n <gotchas>\n - depth=1 and chain manually on what matters. depth>1 explodes on hot functions and risks timeouts.\n - Pick direction by question: \"who's affected?\" → incoming; \"what side effects?\" → outgoing. Asking both at once is rarely right.\n - For non-call usages (types, assignments, imports), use lspFindReferences.\n </gotchas>\n <verbosity>\n - concise: node bodies stripped → edge count + compact \"A → B\" list only. The right default for this tool.\n </verbosity>\n <response_shape>\n - Call sites page with `page`/`callsPerPage`; recursion is controlled separately by `depth`. Large renders auto-paginate via `charOffset`/`charLength`.\n </response_shape>\n <examples>\n - direction=\"incoming\", uri=\"src/api.ts\", symbolName=\"handleRequest\", lineHint=50\n - direction=\"outgoing\", uri=\"src/service.ts\", symbolName=\"processData\", lineHint=25\n </examples>",
301
+ "description": "## Trace function call relationships [LOCAL: LSP]\n Use for semantic call-flow questions on local code: who calls a function/method, what it calls, and what execution paths may be affected.\n\n Best research posture:\n - Anchor the symbol with local text search or a prior LSP result before asking for the call graph.\n - Trace one direction at a time and follow only the meaningful edges.\n - Use references instead when you need non-call usages such as types, imports, assignments, or property reads.\n\n Treat fallback mode as candidate text evidence, not a semantic graph.",
304
302
  "schema": {
305
303
  "uri": "File path. Example: \"src/api/handler.ts\".",
306
304
  "symbolName": "EXACT function/method name, no parens.",
@@ -13,7 +13,7 @@
13
13
  * so they must remain `z.ZodObject<...>` shapes (no transforms / unions
14
14
  * at the top level unless documented).
15
15
  */
16
- import { z } from "zod/v4";
16
+ import { z } from "zod";
17
17
  export declare const RipgrepQuerySchema: z.ZodObject<{
18
18
  pattern: z.ZodString;
19
19
  path: z.ZodString;
@@ -1 +1 @@
1
- import{z as o}from"zod/v4";import{VERBOSITY_VALUES as n}from"../types/index.js";const t=o.enum([...n]).optional(),e=o.array(o.string()).optional(),i={id:o.string().optional(),mainResearchGoal:o.string().optional(),researchGoal:o.string().optional(),reasoning:o.string().optional()};export const RipgrepQuerySchema=o.object({...i,pattern:o.string(),path:o.string(),mode:o.string().optional(),fixedString:o.boolean().optional(),perlRegex:o.boolean().optional(),smartCase:o.boolean().optional(),caseInsensitive:o.boolean().optional(),caseSensitive:o.boolean().optional(),wholeWord:o.boolean().optional(),invertMatch:o.boolean().optional(),type:o.string().optional(),include:e,exclude:e,excludeDir:e,noIgnore:o.boolean().optional(),hidden:o.boolean().optional(),followSymlinks:o.boolean().optional(),filesOnly:o.boolean().optional(),filesWithoutMatch:o.boolean().optional(),count:o.boolean().optional(),countMatches:o.boolean().optional(),contextLines:o.number().int().optional(),beforeContext:o.number().int().optional(),afterContext:o.number().int().optional(),matchContentLength:o.number().int().optional(),maxMatchesPerFile:o.number().int().optional(),maxFiles:o.number().int().optional(),filesPerPage:o.number().int().optional(),filePageNumber:o.number().int().optional(),matchesPerPage:o.number().int().optional(),multiline:o.boolean().optional(),multilineDotall:o.boolean().optional(),binaryFiles:o.string().optional(),includeStats:o.boolean().optional(),encoding:o.string().optional(),sort:o.string().optional(),sortReverse:o.boolean().optional(),noMessages:o.boolean().optional(),lineRegexp:o.boolean().optional(),passthru:o.boolean().optional(),debug:o.boolean().optional(),showFileLastModified:o.boolean().optional(),noUnicode:o.boolean().optional(),threads:o.number().int().optional(),mmap:o.boolean().optional(),verbosity:t});export const FindFilesQuerySchema=o.object({...i,path:o.string(),maxDepth:o.number().int().optional(),minDepth:o.number().int().optional(),name:o.string().optional(),iname:o.string().optional(),names:e,pathPattern:o.string().optional(),regex:o.string().optional(),regexType:o.string().optional(),type:o.string().optional(),empty:o.boolean().optional(),modifiedWithin:o.string().optional(),modifiedBefore:o.string().optional(),accessedWithin:o.string().optional(),sizeGreater:o.string().optional(),sizeLess:o.string().optional(),permissions:o.string().optional(),executable:o.boolean().optional(),readable:o.boolean().optional(),writable:o.boolean().optional(),excludeDir:e,limit:o.number().int().optional(),details:o.boolean().optional(),filesPerPage:o.number().int().optional(),filePageNumber:o.number().int().optional(),showFileLastModified:o.boolean().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),sortBy:o.string().optional(),verbosity:t});export const ViewStructureQuerySchema=o.object({...i,path:o.string(),details:o.boolean().optional(),hidden:o.boolean().optional(),humanReadable:o.boolean().optional(),sortBy:o.string().optional(),reverse:o.boolean().optional(),entriesPerPage:o.number().int().optional(),entryPageNumber:o.number().int().optional(),pattern:o.string().optional(),directoriesOnly:o.boolean().optional(),filesOnly:o.boolean().optional(),extension:o.string().optional(),extensions:e,depth:o.number().int().optional(),recursive:o.boolean().optional(),limit:o.number().int().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),showFileLastModified:o.boolean().optional(),verbosity:t});export const FetchContentQuerySchema=o.object({...i,path:o.string(),fullContent:o.boolean().optional(),matchString:o.string().optional(),matchStringContextLines:o.number().int().optional(),matchStringIsRegex:o.boolean().optional(),matchStringCaseSensitive:o.boolean().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),startLine:o.number().int().optional(),endLine:o.number().int().optional(),verbosity:t});export const FileContentQuerySchema=o.object({...i,owner:o.string(),repo:o.string(),branch:o.string().optional(),path:o.string(),startLine:o.number().int().optional(),endLine:o.number().int().optional(),fullContent:o.boolean().optional(),matchString:o.string().optional(),matchStringContextLines:o.number().int().optional(),matchStringIsRegex:o.boolean().optional(),matchStringCaseSensitive:o.boolean().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),forceRefresh:o.boolean().optional(),type:o.string().optional(),verbosity:t});export const GitHubCodeSearchQuerySchema=o.object({...i,keywordsToSearch:e,owner:o.string().optional(),repo:o.string().optional(),extension:o.string().optional(),filename:o.string().optional(),path:o.string().optional(),match:o.enum(["file","path"]).optional(),limit:o.number().int().optional(),page:o.number().int().optional(),verbosity:t});export const GitHubReposSearchSingleQuerySchema=o.object({...i,keywordsToSearch:e,topicsToSearch:e,language:o.string().optional(),owner:o.string().optional(),stars:o.string().optional(),size:o.string().optional(),created:o.string().optional(),updated:o.string().optional(),match:o.array(o.enum(["name","description","readme"])).optional(),sort:o.string().optional(),limit:o.number().int().optional(),page:o.number().int().optional(),verbosity:t});export const GitHubPullRequestSearchQuerySchema=o.object({...i,query:o.string().optional(),prNumber:o.number().int().optional(),owner:o.string().optional(),repo:o.string().optional(),state:o.string().optional(),assignee:o.string().optional(),author:o.string().optional(),commenter:o.string().optional(),involves:o.string().optional(),mentions:o.string().optional(),"review-requested":o.string().optional(),"reviewed-by":o.string().optional(),label:o.union([o.string(),o.array(o.string())]).optional(),"no-label":o.boolean().optional(),"no-milestone":o.boolean().optional(),"no-project":o.boolean().optional(),"no-assignee":o.boolean().optional(),head:o.string().optional(),base:o.string().optional(),created:o.string().optional(),updated:o.string().optional(),closed:o.string().optional(),"merged-at":o.string().optional(),comments:o.string().optional(),reactions:o.string().optional(),interactions:o.string().optional(),draft:o.boolean().optional(),merged:o.boolean().optional(),matchScope:e,sort:o.string().optional(),order:o.string().optional(),limit:o.number().int().optional(),page:o.number().int().optional(),withComments:o.boolean().optional(),withCommits:o.boolean().optional(),type:o.string().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),partialContentMetadata:o.array(o.object({file:o.string(),additions:o.array(o.number().int()).optional(),deletions:o.array(o.number().int()).optional()})).optional(),verbosity:t});export const GitHubViewRepoStructureQuerySchema=o.object({...i,owner:o.string(),repo:o.string(),branch:o.string().optional(),path:o.string().optional(),depth:o.number().int().optional(),entriesPerPage:o.number().int().optional(),entryPageNumber:o.number().int().optional(),verbosity:t});export const NpmPackageQuerySchema=o.object({...i,ecosystem:o.literal("npm").optional(),name:o.string(),searchLimit:o.number().int().optional(),npmFetchMetadata:o.boolean().optional(),verbosity:t});export const CloneRepoQuerySchema=o.object({...i,owner:o.string(),repo:o.string(),branch:o.string().optional(),sparse_path:o.string().optional(),forceRefresh:o.boolean().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),verbosity:t});export const BulkCloneRepoSchema=o.object({queries:o.array(CloneRepoQuerySchema).min(1)});const a={...i,uri:o.string(),symbolName:o.string(),lineHint:o.number().int(),orderHint:o.number().int().optional()};export const LSPGotoDefinitionQuerySchema=o.object({...a,contextLines:o.number().int().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),verbosity:t});export const LSPFindReferencesQuerySchema=o.object({...a,includeDeclaration:o.boolean().optional(),contextLines:o.number().int().optional(),referencesPerPage:o.number().int().optional(),page:o.number().int().optional(),groupByFile:o.boolean().optional(),includePattern:e,excludePattern:e,charOffset:o.number().int().optional(),charLength:o.number().int().optional(),verbosity:t});export const LSPCallHierarchyQuerySchema=o.object({...a,direction:o.enum(["incoming","outgoing"]),depth:o.number().int().optional(),contextLines:o.number().int().optional(),callsPerPage:o.number().int().optional(),page:o.number().int().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),verbosity:t});
1
+ import{z as o}from"zod";import{VERBOSITY_VALUES as n}from"../types/index.js";const t=o.enum([...n]).optional(),e=o.array(o.string()).optional(),i={id:o.string().optional(),mainResearchGoal:o.string().optional(),researchGoal:o.string().optional(),reasoning:o.string().optional()};export const RipgrepQuerySchema=o.object({...i,pattern:o.string(),path:o.string(),mode:o.string().optional(),fixedString:o.boolean().optional(),perlRegex:o.boolean().optional(),smartCase:o.boolean().optional(),caseInsensitive:o.boolean().optional(),caseSensitive:o.boolean().optional(),wholeWord:o.boolean().optional(),invertMatch:o.boolean().optional(),type:o.string().optional(),include:e,exclude:e,excludeDir:e,noIgnore:o.boolean().optional(),hidden:o.boolean().optional(),followSymlinks:o.boolean().optional(),filesOnly:o.boolean().optional(),filesWithoutMatch:o.boolean().optional(),count:o.boolean().optional(),countMatches:o.boolean().optional(),contextLines:o.number().int().optional(),beforeContext:o.number().int().optional(),afterContext:o.number().int().optional(),matchContentLength:o.number().int().optional(),maxMatchesPerFile:o.number().int().optional(),maxFiles:o.number().int().optional(),filesPerPage:o.number().int().optional(),filePageNumber:o.number().int().optional(),matchesPerPage:o.number().int().optional(),multiline:o.boolean().optional(),multilineDotall:o.boolean().optional(),binaryFiles:o.string().optional(),includeStats:o.boolean().optional(),encoding:o.string().optional(),sort:o.string().optional(),sortReverse:o.boolean().optional(),noMessages:o.boolean().optional(),lineRegexp:o.boolean().optional(),passthru:o.boolean().optional(),debug:o.boolean().optional(),showFileLastModified:o.boolean().optional(),noUnicode:o.boolean().optional(),threads:o.number().int().optional(),mmap:o.boolean().optional(),verbosity:t});export const FindFilesQuerySchema=o.object({...i,path:o.string(),maxDepth:o.number().int().optional(),minDepth:o.number().int().optional(),name:o.string().optional(),iname:o.string().optional(),names:e,pathPattern:o.string().optional(),regex:o.string().optional(),regexType:o.string().optional(),type:o.string().optional(),empty:o.boolean().optional(),modifiedWithin:o.string().optional(),modifiedBefore:o.string().optional(),accessedWithin:o.string().optional(),sizeGreater:o.string().optional(),sizeLess:o.string().optional(),permissions:o.string().optional(),executable:o.boolean().optional(),readable:o.boolean().optional(),writable:o.boolean().optional(),excludeDir:e,limit:o.number().int().optional(),details:o.boolean().optional(),filesPerPage:o.number().int().optional(),filePageNumber:o.number().int().optional(),showFileLastModified:o.boolean().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),sortBy:o.string().optional(),verbosity:t});export const ViewStructureQuerySchema=o.object({...i,path:o.string(),details:o.boolean().optional(),hidden:o.boolean().optional(),humanReadable:o.boolean().optional(),sortBy:o.string().optional(),reverse:o.boolean().optional(),entriesPerPage:o.number().int().optional(),entryPageNumber:o.number().int().optional(),pattern:o.string().optional(),directoriesOnly:o.boolean().optional(),filesOnly:o.boolean().optional(),extension:o.string().optional(),extensions:e,depth:o.number().int().optional(),recursive:o.boolean().optional(),limit:o.number().int().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),showFileLastModified:o.boolean().optional(),verbosity:t});export const FetchContentQuerySchema=o.object({...i,path:o.string(),fullContent:o.boolean().optional(),matchString:o.string().optional(),matchStringContextLines:o.number().int().optional(),matchStringIsRegex:o.boolean().optional(),matchStringCaseSensitive:o.boolean().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),startLine:o.number().int().optional(),endLine:o.number().int().optional(),verbosity:t});export const FileContentQuerySchema=o.object({...i,owner:o.string(),repo:o.string(),branch:o.string().optional(),path:o.string(),startLine:o.number().int().optional(),endLine:o.number().int().optional(),fullContent:o.boolean().optional(),matchString:o.string().optional(),matchStringContextLines:o.number().int().optional(),matchStringIsRegex:o.boolean().optional(),matchStringCaseSensitive:o.boolean().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),forceRefresh:o.boolean().optional(),type:o.string().optional(),verbosity:t});export const GitHubCodeSearchQuerySchema=o.object({...i,keywordsToSearch:e,owner:o.string().optional(),repo:o.string().optional(),extension:o.string().optional(),filename:o.string().optional(),path:o.string().optional(),match:o.enum(["file","path"]).optional(),limit:o.number().int().optional(),page:o.number().int().optional(),verbosity:t});export const GitHubReposSearchSingleQuerySchema=o.object({...i,keywordsToSearch:e,topicsToSearch:e,language:o.string().optional(),owner:o.string().optional(),stars:o.string().optional(),size:o.string().optional(),created:o.string().optional(),updated:o.string().optional(),match:o.array(o.enum(["name","description","readme"])).optional(),sort:o.string().optional(),limit:o.number().int().optional(),page:o.number().int().optional(),verbosity:t});export const GitHubPullRequestSearchQuerySchema=o.object({...i,query:o.string().optional(),prNumber:o.number().int().optional(),owner:o.string().optional(),repo:o.string().optional(),state:o.string().optional(),assignee:o.string().optional(),author:o.string().optional(),commenter:o.string().optional(),involves:o.string().optional(),mentions:o.string().optional(),"review-requested":o.string().optional(),"reviewed-by":o.string().optional(),label:o.union([o.string(),o.array(o.string())]).optional(),"no-label":o.boolean().optional(),"no-milestone":o.boolean().optional(),"no-project":o.boolean().optional(),"no-assignee":o.boolean().optional(),head:o.string().optional(),base:o.string().optional(),created:o.string().optional(),updated:o.string().optional(),closed:o.string().optional(),"merged-at":o.string().optional(),comments:o.string().optional(),reactions:o.string().optional(),interactions:o.string().optional(),draft:o.boolean().optional(),merged:o.boolean().optional(),matchScope:e,sort:o.string().optional(),order:o.string().optional(),limit:o.number().int().optional(),page:o.number().int().optional(),withComments:o.boolean().optional(),withCommits:o.boolean().optional(),type:o.string().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),partialContentMetadata:o.array(o.object({file:o.string(),additions:o.array(o.number().int()).optional(),deletions:o.array(o.number().int()).optional()})).optional(),verbosity:t});export const GitHubViewRepoStructureQuerySchema=o.object({...i,owner:o.string(),repo:o.string(),branch:o.string().optional(),path:o.string().optional(),depth:o.number().int().optional(),entriesPerPage:o.number().int().optional(),entryPageNumber:o.number().int().optional(),verbosity:t});export const NpmPackageQuerySchema=o.object({...i,ecosystem:o.literal("npm").optional(),name:o.string(),searchLimit:o.number().int().optional(),npmFetchMetadata:o.boolean().optional(),verbosity:t});export const CloneRepoQuerySchema=o.object({...i,owner:o.string(),repo:o.string(),branch:o.string().optional(),sparse_path:o.string().optional(),forceRefresh:o.boolean().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),verbosity:t});export const BulkCloneRepoSchema=o.object({queries:o.array(CloneRepoQuerySchema).min(1)});const a={...i,uri:o.string(),symbolName:o.string(),lineHint:o.number().int(),orderHint:o.number().int().optional()};export const LSPGotoDefinitionQuerySchema=o.object({...a,contextLines:o.number().int().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),verbosity:t});export const LSPFindReferencesQuerySchema=o.object({...a,includeDeclaration:o.boolean().optional(),contextLines:o.number().int().optional(),referencesPerPage:o.number().int().optional(),page:o.number().int().optional(),groupByFile:o.boolean().optional(),includePattern:e,excludePattern:e,charOffset:o.number().int().optional(),charLength:o.number().int().optional(),verbosity:t});export const LSPCallHierarchyQuerySchema=o.object({...a,direction:o.enum(["incoming","outgoing"]),depth:o.number().int().optional(),contextLines:o.number().int().optional(),callsPerPage:o.number().int().optional(),page:o.number().int().optional(),charOffset:o.number().int().optional(),charLength:o.number().int().optional(),verbosity:t});
@@ -10,7 +10,7 @@
10
10
  * `ToolResultEnvelope<T>` is the source of truth; these schemas exist
11
11
  * primarily to let consumers feed them to MCP `outputSchema` slots.
12
12
  */
13
- import { z } from "zod/v4";
13
+ import { z } from "zod";
14
14
  export declare const ErrorDataSchema: z.ZodObject<{
15
15
  id: z.ZodOptional<z.ZodString>;
16
16
  error: z.ZodString;
@@ -1 +1 @@
1
- import{z as t}from"zod/v4";import{STATUS_VALUES as o}from"../types/index.js";export const ErrorDataSchema=t.object({id:t.string().optional(),error:t.string(),hints:t.array(t.string()).optional()});const n=t.object({currentPage:t.number(),totalPages:t.number(),hasMore:t.boolean(),perPage:t.number().optional(),totalMatches:t.number().optional(),totalFiles:t.number().optional(),totalEntries:t.number().optional(),totalResults:t.number().optional(),entriesPerPage:t.number().optional(),filesPerPage:t.number().optional(),matchesPerPage:t.number().optional()}),a=t.object({currentPage:t.number(),totalPages:t.number(),hasMore:t.boolean(),charOffset:t.number(),charLength:t.number(),totalChars:t.number()}),i=t.array(t.string()).optional(),r=t.array(t.union([t.string(),t.object({kind:t.string()}).passthrough()])).optional(),e=t.enum([...o]),s=t.object({line:t.number(),value:t.string().optional(),column:t.number().optional()}),p=t.object({path:t.string(),matchCount:t.number(),matches:t.array(s).optional(),modified:t.string().optional()});export const LocalSearchCodeOutputSchema=t.object({status:e.optional(),data:t.object({files:t.array(p),pagination:n.optional(),searchEngine:t.string().optional()}).optional(),files:t.array(p).optional(),pagination:n.optional(),searchEngine:t.string().optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const l=t.object({path:t.string(),type:t.string().optional(),size:t.number().optional(),modified:t.string().optional(),permissions:t.string().optional()});export const LocalFindFilesOutputSchema=t.object({status:e.optional(),data:t.object({files:t.array(l),pagination:n.optional()}).optional(),files:t.array(l).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const g=t.object({path:t.string(),name:t.string(),type:t.string(),size:t.number().optional(),modified:t.string().optional()});export const LocalViewStructureOutputSchema=t.object({status:e.optional(),data:t.object({entries:t.array(g),summary:t.string().optional(),pagination:n.optional()}).optional(),entries:t.array(g).optional(),summary:t.string().optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const LocalGetFileContentOutputSchema=t.object({status:e.optional(),data:t.object({path:t.string(),content:t.string(),totalLines:t.number().optional(),startLine:t.number().optional(),endLine:t.number().optional(),isPartial:t.boolean().optional(),matchRanges:t.array(t.array(t.number())).optional(),pagination:a.optional(),lastModified:t.string().optional(),lastModifiedBy:t.string().optional()}).optional(),path:t.string().optional(),content:t.string().optional(),pagination:a.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const c=t.object({start:t.object({line:t.number(),character:t.number()}),end:t.object({line:t.number(),character:t.number()})}),u=t.object({uri:t.string(),range:c,content:t.string().optional()});export const LspGotoDefinitionOutputSchema=t.object({status:e.optional(),data:t.object({locations:t.array(u),lspMode:t.string().optional()}).optional(),locations:t.array(u).optional(),lspMode:t.string().optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const LspFindReferencesOutputSchema=t.object({status:e.optional(),data:t.object({locations:t.array(u),pagination:n.optional(),lspMode:t.string().optional()}).optional(),locations:t.array(u).optional(),pagination:n.optional(),lspMode:t.string().optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const LspCallHierarchyOutputSchema=t.object({status:e.optional(),data:t.object({item:t.object({name:t.string(),uri:t.string(),range:c,content:t.string().optional()}).optional(),incomingCalls:t.array(t.object({from:t.object({name:t.string(),uri:t.string(),range:c,content:t.string().optional()}).optional(),to:t.object({name:t.string(),uri:t.string(),range:c,content:t.string().optional()}).optional(),fromRanges:t.array(c).optional()}).passthrough()).optional(),outgoingCalls:t.array(t.object({from:t.object({name:t.string(),uri:t.string(),range:c,content:t.string().optional()}).optional(),to:t.object({name:t.string(),uri:t.string(),range:c,content:t.string().optional()}).optional(),fromRanges:t.array(c).optional()}).passthrough()).optional(),direction:t.string().optional(),depth:t.number().optional(),pagination:n.optional(),lspMode:t.string().optional()}).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const h=t.object({owner:t.string().optional(),repo:t.string().optional(),full_name:t.string().optional(),url:t.string().optional(),stars:t.number().optional(),language:t.string().optional(),pushed_at:t.string().optional(),description:t.string().optional(),topics:t.array(t.string()).optional(),license:t.string().optional()}).passthrough();export const GitHubSearchRepositoriesOutputSchema=t.object({status:e.optional(),data:t.object({repositories:t.array(h),pagination:n.optional()}).optional(),repositories:t.array(h).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const b=t.object({number:t.number(),title:t.string(),url:t.string().optional(),state:t.string().optional(),draft:t.boolean().optional(),merged:t.boolean().optional(),created_at:t.string().optional(),updated_at:t.string().optional(),closed_at:t.string().optional(),merged_at:t.string().optional(),author:t.string().optional(),head_ref:t.string().optional(),base_ref:t.string().optional()}).passthrough(),m=t.object({path:t.string(),value:t.string().optional()}).passthrough(),d=t.object({id:t.string(),owner:t.string(),repo:t.string(),matches:t.array(m)}).passthrough();export const GitHubSearchCodeOutputSchema=t.object({status:e.optional(),data:t.object({results:t.array(d),pagination:n.optional()}).optional(),results:t.array(d).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const GitHubSearchPullRequestsOutputSchema=t.object({status:e.optional(),data:t.object({pull_requests:t.array(b),total_count:t.number().optional(),pagination:n.optional()}).optional(),pull_requests:t.array(b).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const j=t.object({path:t.string(),name:t.string().optional(),type:t.string().optional(),size:t.number().optional()}).passthrough();export const GitHubFileContentOutputSchema=t.object({status:e.optional(),data:t.object({path:t.string(),content:t.string(),totalLines:t.number().optional(),startLine:t.number().optional(),endLine:t.number().optional(),isPartial:t.boolean().optional(),resolvedBranch:t.string().optional(),pagination:a.optional(),lastModified:t.string().optional(),lastModifiedBy:t.string().optional()}).optional(),path:t.string().optional(),content:t.string().optional(),pagination:a.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const GitHubViewRepoStructureOutputSchema=t.object({status:e.optional(),data:t.object({entries:t.array(j),pagination:n.optional()}).optional(),entries:t.array(j).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const GitHubCloneRepoOutputSchema=t.object({status:e.optional(),data:t.object({localPath:t.string(),branch:t.string(),cached:t.boolean(),sparsePath:t.string().optional(),cloneTimeMs:t.number().optional(),totalSize:t.number().optional(),fileCount:t.number().optional()}).optional(),localPath:t.string().optional(),branch:t.string().optional(),cached:t.boolean().optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const y=t.object({name:t.string(),version:t.string().optional(),repository:t.string().optional(),license:t.string().optional(),description:t.string().optional(),deprecated:t.union([t.boolean(),t.string()]).optional(),downloads:t.number().optional(),recentVersions:t.array(t.string()).optional()}).passthrough();export const PackageSearchOutputSchema=t.object({status:e.optional(),data:t.object({packages:t.array(y)}).optional(),packages:t.array(y).optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();
1
+ import{z as t}from"zod";import{STATUS_VALUES as o}from"../types/index.js";export const ErrorDataSchema=t.object({id:t.string().optional(),error:t.string(),hints:t.array(t.string()).optional()});const n=t.object({currentPage:t.number(),totalPages:t.number(),hasMore:t.boolean(),perPage:t.number().optional(),totalMatches:t.number().optional(),totalFiles:t.number().optional(),totalEntries:t.number().optional(),totalResults:t.number().optional(),entriesPerPage:t.number().optional(),filesPerPage:t.number().optional(),matchesPerPage:t.number().optional()}),a=t.object({currentPage:t.number(),totalPages:t.number(),hasMore:t.boolean(),charOffset:t.number(),charLength:t.number(),totalChars:t.number()}),i=t.array(t.string()).optional(),r=t.array(t.union([t.string(),t.object({kind:t.string()}).passthrough()])).optional(),e=t.enum([...o]),s=t.object({line:t.number(),value:t.string().optional(),column:t.number().optional()}),p=t.object({path:t.string(),matchCount:t.number(),matches:t.array(s).optional(),modified:t.string().optional()});export const LocalSearchCodeOutputSchema=t.object({status:e.optional(),data:t.object({files:t.array(p),pagination:n.optional(),searchEngine:t.string().optional()}).optional(),files:t.array(p).optional(),pagination:n.optional(),searchEngine:t.string().optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const l=t.object({path:t.string(),type:t.string().optional(),size:t.number().optional(),modified:t.string().optional(),permissions:t.string().optional()});export const LocalFindFilesOutputSchema=t.object({status:e.optional(),data:t.object({files:t.array(l),pagination:n.optional()}).optional(),files:t.array(l).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const g=t.object({path:t.string(),name:t.string(),type:t.string(),size:t.number().optional(),modified:t.string().optional()});export const LocalViewStructureOutputSchema=t.object({status:e.optional(),data:t.object({entries:t.array(g),summary:t.string().optional(),pagination:n.optional()}).optional(),entries:t.array(g).optional(),summary:t.string().optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const LocalGetFileContentOutputSchema=t.object({status:e.optional(),data:t.object({path:t.string(),content:t.string(),totalLines:t.number().optional(),startLine:t.number().optional(),endLine:t.number().optional(),isPartial:t.boolean().optional(),matchRanges:t.array(t.array(t.number())).optional(),pagination:a.optional(),lastModified:t.string().optional(),lastModifiedBy:t.string().optional()}).optional(),path:t.string().optional(),content:t.string().optional(),pagination:a.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const c=t.object({start:t.object({line:t.number(),character:t.number()}),end:t.object({line:t.number(),character:t.number()})}),u=t.object({uri:t.string(),range:c,content:t.string().optional()});export const LspGotoDefinitionOutputSchema=t.object({status:e.optional(),data:t.object({locations:t.array(u),lspMode:t.string().optional()}).optional(),locations:t.array(u).optional(),lspMode:t.string().optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const LspFindReferencesOutputSchema=t.object({status:e.optional(),data:t.object({locations:t.array(u),pagination:n.optional(),lspMode:t.string().optional()}).optional(),locations:t.array(u).optional(),pagination:n.optional(),lspMode:t.string().optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const LspCallHierarchyOutputSchema=t.object({status:e.optional(),data:t.object({item:t.object({name:t.string(),uri:t.string(),range:c,content:t.string().optional()}).optional(),incomingCalls:t.array(t.object({from:t.object({name:t.string(),uri:t.string(),range:c,content:t.string().optional()}).optional(),to:t.object({name:t.string(),uri:t.string(),range:c,content:t.string().optional()}).optional(),fromRanges:t.array(c).optional()}).passthrough()).optional(),outgoingCalls:t.array(t.object({from:t.object({name:t.string(),uri:t.string(),range:c,content:t.string().optional()}).optional(),to:t.object({name:t.string(),uri:t.string(),range:c,content:t.string().optional()}).optional(),fromRanges:t.array(c).optional()}).passthrough()).optional(),direction:t.string().optional(),depth:t.number().optional(),pagination:n.optional(),lspMode:t.string().optional()}).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const h=t.object({owner:t.string().optional(),repo:t.string().optional(),full_name:t.string().optional(),url:t.string().optional(),stars:t.number().optional(),language:t.string().optional(),pushed_at:t.string().optional(),description:t.string().optional(),topics:t.array(t.string()).optional(),license:t.string().optional()}).passthrough();export const GitHubSearchRepositoriesOutputSchema=t.object({status:e.optional(),data:t.object({repositories:t.array(h),pagination:n.optional()}).optional(),repositories:t.array(h).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const b=t.object({number:t.number(),title:t.string(),url:t.string().optional(),state:t.string().optional(),draft:t.boolean().optional(),merged:t.boolean().optional(),created_at:t.string().optional(),updated_at:t.string().optional(),closed_at:t.string().optional(),merged_at:t.string().optional(),author:t.string().optional(),head_ref:t.string().optional(),base_ref:t.string().optional()}).passthrough(),m=t.object({path:t.string(),value:t.string().optional()}).passthrough(),d=t.object({id:t.string(),owner:t.string(),repo:t.string(),matches:t.array(m)}).passthrough();export const GitHubSearchCodeOutputSchema=t.object({status:e.optional(),data:t.object({results:t.array(d),pagination:n.optional()}).optional(),results:t.array(d).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const GitHubSearchPullRequestsOutputSchema=t.object({status:e.optional(),data:t.object({pull_requests:t.array(b),total_count:t.number().optional(),pagination:n.optional()}).optional(),pull_requests:t.array(b).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const j=t.object({path:t.string(),name:t.string().optional(),type:t.string().optional(),size:t.number().optional()}).passthrough();export const GitHubFileContentOutputSchema=t.object({status:e.optional(),data:t.object({path:t.string(),content:t.string(),totalLines:t.number().optional(),startLine:t.number().optional(),endLine:t.number().optional(),isPartial:t.boolean().optional(),resolvedBranch:t.string().optional(),pagination:a.optional(),lastModified:t.string().optional(),lastModifiedBy:t.string().optional()}).optional(),path:t.string().optional(),content:t.string().optional(),pagination:a.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const GitHubViewRepoStructureOutputSchema=t.object({status:e.optional(),data:t.object({entries:t.array(j),pagination:n.optional()}).optional(),entries:t.array(j).optional(),pagination:n.optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();export const GitHubCloneRepoOutputSchema=t.object({status:e.optional(),data:t.object({localPath:t.string(),branch:t.string(),cached:t.boolean(),sparsePath:t.string().optional(),cloneTimeMs:t.number().optional(),totalSize:t.number().optional(),fileCount:t.number().optional()}).optional(),localPath:t.string().optional(),branch:t.string().optional(),cached:t.boolean().optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();const y=t.object({name:t.string(),version:t.string().optional(),repository:t.string().optional(),license:t.string().optional(),description:t.string().optional(),deprecated:t.union([t.boolean(),t.string()]).optional(),downloads:t.number().optional(),recentVersions:t.array(t.string()).optional()}).passthrough();export const PackageSearchOutputSchema=t.object({status:e.optional(),data:t.object({packages:t.array(y)}).optional(),packages:t.array(y).optional(),hints:i,warnings:r,error:t.string().optional()}).passthrough();
@@ -4,7 +4,7 @@
4
4
  * pre-flight); this surface exists so consumers can call the canonical
5
5
  * function name without forking their own copy.
6
6
  */
7
- import type { z } from "zod/v4";
7
+ import type { z } from "zod";
8
8
  import { RipgrepQuerySchema } from "./index.js";
9
9
  type RuntimeRipgrepQuery = z.infer<typeof RipgrepQuerySchema>;
10
10
  export interface RipgrepValidationResult {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@octocodeai/octocode-core",
3
- "version": "2.0.0",
3
+ "version": "4.0.0",
4
4
  "description": "Core config, prompts, tools, and schemas for Octocode MCP",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -65,7 +65,7 @@
65
65
  "node": ">=18.12.0"
66
66
  },
67
67
  "peerDependencies": {
68
- "zod": ">=3.25.0"
68
+ "zod": ">=4.0.0"
69
69
  },
70
70
  "devDependencies": {
71
71
  "@typescript-eslint/eslint-plugin": "8.48.1",
@@ -78,6 +78,6 @@
78
78
  "tsx": "^4.19.2",
79
79
  "typescript": "^5.8.3",
80
80
  "vitest": "^3.2.4",
81
- "zod": ">=3.25.0"
81
+ "zod": "^4.0.0"
82
82
  }
83
83
  }