@octocodeai/octocode-core 16.3.0 → 16.5.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.
Files changed (44) hide show
  1. package/README.md +22 -0
  2. package/dist/data/compressed.js +1 -1
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +1 -0
  5. package/dist/resources/global.d.ts +17 -0
  6. package/dist/resources/global.js +1 -0
  7. package/dist/resources/tools/_toolkit.d.ts +87 -0
  8. package/dist/resources/tools/_toolkit.js +1 -0
  9. package/dist/resources/tools/ghCloneRepo.d.ts +27 -0
  10. package/dist/resources/tools/ghCloneRepo.js +1 -0
  11. package/dist/resources/tools/ghGetFileContent.d.ts +32 -0
  12. package/dist/resources/tools/ghGetFileContent.js +1 -0
  13. package/dist/resources/tools/ghHistoryResearch.d.ts +133 -0
  14. package/dist/resources/tools/ghHistoryResearch.js +1 -0
  15. package/dist/resources/tools/ghSearchCode.d.ts +23 -0
  16. package/dist/resources/tools/ghSearchCode.js +1 -0
  17. package/dist/resources/tools/ghSearchRepos.d.ts +40 -0
  18. package/dist/resources/tools/ghSearchRepos.js +1 -0
  19. package/dist/resources/tools/ghViewRepoStructure.d.ts +17 -0
  20. package/dist/resources/tools/ghViewRepoStructure.js +1 -0
  21. package/dist/resources/tools/localBinaryInspect.d.ts +42 -0
  22. package/dist/resources/tools/localBinaryInspect.js +1 -0
  23. package/dist/resources/tools/localFindFiles.d.ts +41 -0
  24. package/dist/resources/tools/localFindFiles.js +1 -0
  25. package/dist/resources/tools/localGetFileContent.d.ts +24 -0
  26. package/dist/resources/tools/localGetFileContent.js +1 -0
  27. package/dist/resources/tools/localSearchCode.d.ts +73 -0
  28. package/dist/resources/tools/localSearchCode.js +1 -0
  29. package/dist/resources/tools/localViewStructure.d.ts +29 -0
  30. package/dist/resources/tools/localViewStructure.js +1 -0
  31. package/dist/resources/tools/lspGetSemantics.d.ts +79 -0
  32. package/dist/resources/tools/lspGetSemantics.js +1 -0
  33. package/dist/resources/tools/npmSearch.d.ts +11 -0
  34. package/dist/resources/tools/npmSearch.js +1 -0
  35. package/dist/schemas/extraTypes.d.ts +178 -0
  36. package/dist/schemas/extraTypes.js +1 -0
  37. package/dist/schemas/outputs.d.ts +843 -0
  38. package/dist/schemas/outputs.js +1 -0
  39. package/dist/schemas/runtime.d.ts +11 -0
  40. package/dist/schemas/runtime.js +1 -0
  41. package/dist/schemas.d.ts +514 -0
  42. package/dist/schemas.js +1 -0
  43. package/dist/types/index.d.ts +9 -0
  44. package/package.json +26 -2
package/README.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  Core config, prompts, tools, and schemas for [Octocode MCP](https://octocode.ai).
4
4
 
5
+ ## Entry points
6
+
7
+ - `@octocodeai/octocode-core/mcp` — MCP tool specs, names, system prompt, and metadata (prose).
8
+ - `@octocodeai/octocode-core/cli` — smart CLI command specs (prose).
9
+ - `@octocodeai/octocode-core/schemas` — ready-made [Zod](https://zod.dev) query
10
+ schemas for every tool, so consumers validate and parse tool inputs directly
11
+ instead of rebuilding Zod from the prose specs. Requires `zod >= 4` (peer dep).
12
+
13
+ ```ts
14
+ import {
15
+ toolSchemas, // { ghSearchCode, ghGetFileContent, ... } keyed by tool name
16
+ findToolSchema, // (name) => ZodTypeAny | undefined
17
+ GitHubCodeSearchQuerySchema,
18
+ baseSchema, // shared meta fields on every query
19
+ type GitHubCodeSearchQuery,
20
+ } from "@octocodeai/octocode-core/schemas";
21
+
22
+ // Bounds, defaults, enums, and cross-field refinements are baked in:
23
+ const query = toolSchemas.ghSearchCode.parse({ keywords: ["useState"] });
24
+ // => { match: "file", limit: 30, page: 1, keywords: ["useState"] }
25
+ ```
26
+
5
27
  ## License
6
28
 
7
29
  MIT
@@ -1 +1 @@
1
- import{brotliDecompressSync as S}from"node:zlib";export default JSON.parse(S(Buffer.from("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","base64")).toString());
1
+ import{brotliDecompressSync as m}from"node:zlib";export default JSON.parse(m(Buffer.from("W47xIYrSzsXlk3HMImmsmYSnAW7IxoFrFY5EQrnRHm2cqdn6GcISXfN+IdtfwrAIcGdHKU4+lH5vqnm6/m2hJgYwaScgUmrbelo6Di1+ScjSBp8G9BMT+Nemffe9nCz/YjJRHPNbJx2JADLJ/Oas1nRn4RlhM5WZw+0w0JID1qO2tEBePtPUsmsM3AD7MdAxyyHLYZROtFeisEvdRxdd8/R83TyhnTfpHeR9yeM86H9uqV4QZPD8Q2FlhylpMAWVf34/WaqHlY8GBVMwlN1kmCIu+aAyS41SZoIiP0Hq1H+QNaQGr8EV6zDDAX0HWzinsmfD1akC4lfTY7DWJGXXi7JvruHITOGtcr59lE4mUWLf5vCdzXzkgQHOLM3WdHMgFf73vllaxWhkbORM5INEQaRStEGuIFMQCfecc2+p///dxTZAEd0NiDA70mBAhx0a+8zvRgOYWTZmV1WYpRsZY0NnI+OCVEngfJizGClU5Vz6X3urTySz66GMRVwAOiSmEOGT95w8EVWvqiKmXUht1sz89fNlXd6bWZldNf37d/eMnDVMlCzCQqje/JVF0jI5KDeG6J6gcsQ8ftA6fKtX9zr73nV+kmbSBAgYMMbY4PR8lZqf6LVdoK2kfhhyT8ZxHPsldBGd0Q96i175AUnsLWvbCfVVNN9eM37ba3IAEg9Z2qTmo+SH//8DhH/9PV5W2eb6NMIzKbU9hrb3PokZw7yljuirEfpLHA3tqdLPMyrsd+gIDOOR5FrorBHh41xjRMlyn+e8hnQe+INIOUH2O7NkiEgj1eOI/99eg6Q1aTBEnumznR+iICY+kY4/TYaWohiah+mPHg4uBV3cOVaGRsR6lDC4W6RRdsbBglO1gLtu9H3sRnrwllif0NsvloT2F/nsYq/LpyJvIl6d8g9BlZOAe6yNhBxM8QpVDTIHQ5AtPqIN9DfllULPqlcfvO43jipSTaUB+JIOpEzNWcGC+JE9GHHvOoyWoUDx3MkOCxqopeRZRUBAwQMbrGEc6ltj/nWE+CshIqVaB6JSBLFxsDC4xyDD1zuE4Nv3rNOviUCDmlRFVFLkEO4NnT5C026eHEdVsYLFj5PTFdDCjx36rW5HJw2Go4H/8u5Hq4DDApex584MK38M52aB00ouWSad6Wb5Twco8+o5m6k0rKAyXV9FHsFfeT3Owmp35/Llal5QNl5QeeikOAvU/4tFKEEAInq8JsK4apatTA1zSz6IAp0VPhbtmp/k7x38ujVv+Y1WHZBzEqV2e+RLvr1E0YGd3Nk+kx2+FyOlLYUaH1e/0yZzY6EKMOmac688rPFvrTCf9e+RmZDBpBKOwBP4sDTOYjR4PjGLE0d78Zp+/EJqf2rGWY09zfOAfEst5YX3SowjD+Wck0PAo44RVycxrDzMCup5WQ5AOrYgIwJ1VOQGjxEcr2rnwrKUEJDiCVIzw7XekR1EMAx8WQc5dMTMtKwl57p3yDHH8xXDCWq41geKnfmhWmgtY+j70uwsOVi300XhH/O8o3wghRvIj4EysGYZmj2ZVK9BB0jrno1ZVh3le66zrQD7NALsSw2weOHO2WwX2hiAuLAdHwcPrOkRzZlMV8HTqLv8J9oRqEsIJqwmD+hBEAhPxVs+WYXuI+tPs2ioYBR7+Vw1tOhAPKuoYvG9M2yer9Zsj5rFZi9BRsKobxnSQZfMUSQxUa34BACrsg9gGvYUBMy/bqaUrBZK9G7igiBEkwcYCKMmkQ093hzCYPAMpuOdbRjE74IQ3vpjOvlkrW4zLvLDCFcbwmXGBrnqdp5v1uMdU2fnv/s/WTzUwnhKh9hcxt+F+LptaE7jPNAwM66tMFid498sVPj8DYZsbPosGkJnt8fgUTZV9SFNb51vQvSch9oPlZWp9WZ7L2C/86Lk+tkyaOooPHRz8F0tYsHwO6Zu/n3E/Tbx2R2YTzkmuSsjJuIkjrDvcpTwIJsUekOzV48DjE8c/Oz5zuVE4neP7+8Nkpa2+fWUrCvvdhYc+cae9Zt6421AzZM//7CFX3v9Rn44tFHw1nxb177HL9jMqT59mgfYM4SXMkqTt7HyA5ukcTt9virlh6HcxwRnYhpgJ1rDLFj2OVUJOgyhMvD31LVRBea2/djCCndwzOQ8HIshCoRju9xA7Lz55BgFIujr+mDd5GEUF4L8Yp7RA5Ys8SK80hD3B5b9tPClWRbjQBEwA8Ij7kJRqg9H/y31VG7AT6si6j0ZP63FhEL6cUqnZdwECiSlZWwzBkEqwhlEExOyYbCnOxqSEoHYAbdOgs/GAXP6wqqoZ07njuZHP6JBHpBpLBTB1/e+H2fAY1JU6cDBhGMmTKQIgG5Q2IKRhtg2Um00v3XX+mmZNZZahnM/G4c3Pu8xLOLklhknk7iB0589YDhsBbEhoTDRIoER5NccUggkkgDaWsvGJFLRekgWQhyn02uZTkTfSDi29r2Fi986guOseUDkVQQmigl0rrGybUYZttkH/hTUpLKw3nidw02xVJtNgsiceGRrtDFxhBrBcC5Wix4vpp+H/qwvdClWYhAjrcdKbB57v/gIULbg4N++xw4ozuVEdegcdooRHeqkzAXQkxgOEzKcNM70mDL+CGcEPnprnvyIscrQbEC4ASlCu0AqPvtKWgDQEMKWC5r7rl7O8fEc4FPJfLZY4zQ6L6OYBsazyWa6s2xc0A2xPkybUL9amWNpgq8q6QuiSm4ngymbJUtbedI3H1IKJXIwzpedBZNCDLgwslg/uB+GD08EAmFstV6b3CS/ZY6sSGhVifPJIdAx5s04QWYA3tEgcUc1DebUSFEaxBsT9pjNyIJSJssBQd1sQlstrchcEcXwDnEPlJ46bd4FrS7sDw6tdDiFJAIBK9uRJd2YAyjVVDwlcGCwkCCyRPUTZY7CMxqUTYoLRBvw8RdCdRyD77uxVjq2M38b0/cBdNvUilh5XZHiIqmdR2732HnI92CSMx1bLPfHVV/wA/UpsflEK5TTCWCDAQ8WVh5n9Fzz2GRuwkswfG5lKZCU7fdsECBw7R4Li0eEnev/5rE5i8zeNL74q6QKTpY8hyxyLGL4kXNoVc/7iF7e1lNBdCbMw0C2Ovu5aKzVXTSmyOcaXFRc6w+IzKG8pqpaWewGyQ6D4QIC1zoiPI48P4Jz+Kfc51v5sntYaQ0YphiZnc86ElrLvI5yirFHWk0mucjmqkLhSqu/ZPpiLr+k7F+zXmaV2z1OoRXrNHVshXZ7QQMHg3pIjCjB7VBHNkvC5BcBZyd3FHuOHJRAP/KkWBHCPUZb54HyGDdvV4ONUZdpzB67ARYQQXH4jgSMTZONY22KB5w7pcLhF3+8Si0mQQozGEq3tfkCv8JOWjEfkw+odO3UXOy25IgBNElPOkNYFXZ4IRpUNsB6b4L0P8ajy468TQmbHA481LYMra4Wo0em6X4k5Qukt7BVNrK0XbFKU/h6YFAqvRmrVyHNoEySv004Vn1cjNHvlxREbRaylWFOAf7LlZ+ym7jJaFndRg+DYW5kEOj0JxDXcObX0Rohx7gJMJSZYVWqvLzb+inzezxwzedMkB3BK4d4PcHM465UOe2MX9sgu7iFoGhvWu2TbjWTDGkdEW36Co5eCoy/Nu14rVXQ7GkHixZSbV4NRRCvs+0JdonJWSjP6kWwWw/6+bLGsACaNwnu3mKA1BSKKiXP2Xh3y0SpRvkB0Tm+BwyJYoZBftN3jdU4mGrqXhiL2XEftJIoAejvozPWM2c7C9j9V0krvdVAY4XCXoqh5A+OmQ/JMRCHHnSpJjE6jVTm04IQ5sRuFKY0XP3RzPyhBopw4ce9P+GQrQ+3IRHrEG4qdixN3Y+1wMhzaLdF6pRQmAeEHCkT4QeDY1zCLvnVMy/tYcHd+N2ErPxGh2kvsN2ZKvbqCNq3FPr5ZojcHm1ahj0pV7Y56dhHI6W/kdM2751qP5rq5+WCdA5n/mx97tsJC427QhGgo7QpGzt7UpH9CeigAXNSDC9bYn3M5pFsu6H9yI/k4GJffLPH51Zrq6f09kV82HkAEl1SSNTMsZRJgEjXeR9m0DWCgIkcJkWtwH/Q0tGnDPbkHkDonec18ESX/VeZ2uugXExL9sfgo16N+AtTCLndwsLr3H4i185RzeeErNS5LtI0IGdffP0e7jGQFLSBnkhBYZ5S3Pn5ioG8db09yd6du232THzsdMmpS3dlhcEwEXozlmlICxbhQZEb5sbpKvlTk7ZDc4V7odWkUb8WzH7XPxNPryDt4m6hpScQyNU/Cz9P8spLSIWmZ44kSk425t8mzZaegAy0vFp2nZ6Q8GpugUJKYWdlmDgI6N4Ok4J+ovQN05zZVuG/CAB91nvnVJBJ4iHpcfu/5PVdOKJngZbLHg0jbQBdsihjHOVhtVd1KAmWK5AB55myU8u0o6tNhzQjVxELiTjU30LRaZGz6kaBaKKOuGuAFdNSL0ALESzY0hufQjxq+ZH8eCqy+olBuABzoLE1+c3aZoCkN9zO+sKlW8PL3Dw50dwt9XyEh4GfVCNJqTJOYCxWB8N7B0e+D1WgLe4Zqmjjx4LqHRAU23hOzh878YjgK4/V3U4cI85CKJ09UIFBm2U5fo1exGKeMGEweU6Ib6N9AgOFyR1VA4R4uMKy9MatpyCv2+M+CjOjzBwrPnKKomVhOA9rkVCdUOHJXZVha+4FOAOFwp/08ipNliEaKvZnapfgpAx6uX8p4AY6NlGcQY0bCBSRNFRAeppBsXAJBObqm+XkcfrAN5g8IiZ8SlQHVV5FqN0mvYESVsn8LGqBpC6PkKDCPEsfG9GgxpV/WKg5CFX+T5ejylA2QWopf7KrjFz5s4jXX10/Kiw0uNsxXXc5JED3TEpqM9AASr49xv0tQrkeEzUHhdBGHIaKYZbVBHLq3jhV3S0T8kBlkwqOoaa7Lq7SJdF7r080IuwKzJ9KxdYe9T3X/6BPu1q3v9JJWe75485MnxJn5W6ryjdBsDZETWCWPEvI13uIkjp6+HCx1dWWir7mWb3iRFD5LkV7aXAvzv9U3i/SoddIsbSps22kVmrmEfSm0a7P+Kkk3HfsZCHQwd+WRp3cOCAP7seEC5xR+vMobQJ2TgdfUzGaiLPdMOfnoWlgojN9IXzEP+iybCwyzmyuLoswVPwsdk/6KFueOY4UwqRBEgIqJAUvZAV5R6lF7zoSZF6GkuT+qZAbIQaE0KkSw2GZKCJ65kXvAjYWtb07rENhSO4U0LB/rdCgfbMqnYMRs9zyclLtisSjh0Hg9Jqdqql24IhjQ9wcvA3bA+YW81aD7vo0IUukRPicXN+7JvJop08YsfWFDJKrEQZ7bi1C3FaUJ6961T9BUgg7U2SxZS7Z8Nw02R9Tnild7B5rbQ0qodZjLLlBqGZfMJU5fel4GbBcr4ZgM8XsJyO/YK1H0qYG+kq4lwcsIyB4H36DKXVGp4c98u+C9KikoECpsDMsa8N/UUCPdeFqawPMn2Y1gsA52pDLmeoIQ77P+lEFd3ddlTeHkhIW1e4Ty21pveGtA4fIFSlzAxGCuq0B/gSuQC8gVAJSJcr7qR8MJ62y+2oY1FGDZk5yULgg/a8xmLApkem3+W30gf1hlm+uBRRpNErCzlJwOmtZNi5WFudB0pn6VajYmMCbX9QHLl9gnnFkbCqO6VvWMhLH2jjo5/1ZbJmRoXiS2kxvveVijSA9Ixysj85SdDzVEF2nYwZmBAvyE5Q+M2HHYe36QMKg4UFOLSKKLVNJaRL4N2KZYqwNFZM/33Ffhysi33bGiEPeMkrfPht8G9z7phlzvyOCSmVWO2FyTbypNxouJKmu7Hjb7JxXMyLl5KQaTqj9L+E4+RqTu9BJyIu4DE1IKDbiWekLdQXFsWAWhKIjtRuV+zhAvAfzqcidKtRzqvqGbQNY45epINWrpmdyisUAQiCh613WJW0FqkK8/6KzhZHfPf+Z+q6AoS2bal1nr4BU1vX2lLXQwnsMUansjrqTuBwYPhVApPL7o+3Ykas45Kaspmk3XL8JqNgQ7lkafqujsAR0pxSo0l+++0tZ7jiD81KI6Gl5K7Bg+Z2+XACuRobBInJXZuhoTOC3ycyX0Wuj0Cu3bi+gWDJCtrNP5DDwNaZn8SbkzvxOOz5yacP7k1dsuD9v25Tum0cuW20Xpw380PXqfdnZZRmOqTYh+ephrMfQhkza8E2MmJGb330liTE3i6qHwiFmgyArkKeIwbd4VSNsOqXr10hGBfqwvONj8kF7IA7YfLndSyfPiMWPjSeIYZGyZ8/BDneNj5+xFlrJNqE+6NcSpCGt9F5nu/bA/3t5psO5d0FK4sN2e0n/qCb8r1vPo0bSPW3g+siv+631V7C3jeUov4f5Ap/eVMKazlKz+tPuCZMQn5Xv/9WeWpH5LjLBR+vSJAL+spI9BH8hVXksQJ7EM4G51JIL9nsOLRYX+3cG5wn8FjUMv032nDS03RDRu4iZikQUFQTR905NANO/A/YGLnnYcoNg/8GbJBqZaSc5/xCHK3ZZmj6awkekjRwcy9pfNU+vaPDfqWqf/GtqqhAgqscEKMwBkg08FJM3mIKTwWJ7cf9xvkTwnfwSA8huyEXgPIsVpCuHU2xVa9VfLSOp/RVZA2cljllSXWXyf04m0RJCOzfIYTMSpadGa5CpI//zBMBsR4IOE0viY11U7uXTFK+nMiIectq/bJBcpf/L+12eCSc1E2aD91zT5ecTAJIDK4SxN9k/P1wXvVDRZjSDkkLVWAheoiw5mUsybBPhli7pQ8CmcsOzIVTupODwQ826VVc4jUL+gVZdbXaP86wufQOO+9EDUDto+dlMmzwiYE58d56UCjOnLxc+uBxgw84hg0+3z1j16rdkmZTZDrMhnV86ZXJlD/Nb/jSCiz81HM5hpLmIa+nwr1Nh6mCkOUOTDY1jafRczzR2RLaSMmZoKOfUSvFgWsvkLPSYYh5OmzyX4tujZSowHFWQpgHUs5FDqAlmLraNMqcyM2dNUys0eYEGXLe4kJY/+7ssByQvGTRt4B0s10Vm30y6cH98JdC+t3RD2bNQ4IZUr8inxKem5nnBtQAsInHYmSaO5qIUBky1YzZfyenE2m4mBW8cAPplfWO5LKkxthq0QMvdbROPJtQ0vWOwxiY2ogI4jjIPE4dx868CA+Oj/BiUp+T3GIlxTtQY0WW3AYPfuc8H7nvshsSVRybEmWHpBFHVrKfhbLJwG8TQ2mnzaxRX3KbTi6ATjODPk9cz+s3Vb6J6RaeBI+2J0sow9R/brst76FUzYacdEX2XN21oH6E8Dyg69e7QIJSfJBWabZv6QLq81jO7yBsk7oFcEsJzTCWYqE4zEzDu7bZvs/miGrlAOUkkvk9E0XXbb+Dl5JhTAPJ0bhXQpDHs7iWssmia2b/OXuu2/ogJvVzjLpq0R/Tjz8T77ndPOSB6fOJWxHKPzb3dlmqjjcl61IJdPQP9ltuS59GzwuMtYvFD2B4mGf+lmw7nIxkgHhuoCd7GwCEuy7bZs/Kh61YAA0NFBn8LI1pwSxM4ef2LDaEGoJyP5u7l3dWk7Lfu+Xxi7hChNLQB82Ry/0JALZZekwwLBj4+M7hmWGpSaQ5551lpqr9dZRACoMpTDUNm0LczeY7uKjlhxlbPwa/lB6wct4Py5sDK80uFq2AvMq1k0Wu6zqOiZzhjlzf2OIK3MjfgutYsXrOOIP4uduj9BmyJCzXeiR471xoyGawWzr/ntsKRB/fucxyJ6oVmvJY5fOI1tNdjhkvgHjKkXpw5F8XoRzDNdbGE70itv1IuXJmUPL0O8+2H6xqzb9MVOFkqfYQdchVvohA2w6cnLPGRkJVTAtAHd5jnFNZMGYm4pTXojv7AjKxDE+AW4L0yr71Rj3gAqqaLm54VvPA/HKJN0Df2fharZoUBw+Cr09H/HOdRqmXKv33me1mNQ48g7+t455YDt/hW0xjpsipBb2mlR51kj95TiriFF8pakQDDoMam8Vle2mOMRM4v9TyQj4EDvWuhia+jaPgMaX8ZpPsSObTLIuZ4njRhvaZM5Yf6IiiQZJ8Q5SPP4f7qJgnf38YwDG1D5zwVS/vsQPeNilimsEaQ+mRFph259SR17YXXnWljKf7RTiP7E06AbYhld+/crWopY08eeQwgAhqbisXh+Zl7Gr2Q/KoF9RPpPj1KxjdVowcwR5+x30nAdiay6sL1Y7SK9k23s8qqS/mDtWjtwN2wi9Nne3z9gH/XRS0Y8f05+9TEMPYQoF6VuL7n4WtgsT5REdtIHhA8uKYOHn6w87AGDAXo1nqIXKzarmB79vShv7qLRvqJPMNih32suMW/2pmwspPctd4k1cJ43F+uep+8hnY39RmbHN6Zs4qB0clUcdeBWv1JDBdWlKYvl40IIK+9DXW4IZuvbmLJAb72ms787MPjZiZ4dyUo/RURx7eqAdhYcnQeqBXpke8xwRQGOwACOW0OjRpbWicumM8y11QGI6DXNGtxTCG3u6Wg4wRGtBMm14s/wenVHq2H/6UIFkDqMXEnKZnOV0vOdfHY6A99jx/NfsW7Utb7U3sVPwOw9k12QLv8Pq89NCW6YxalUeltco38Q+X28LaBX5eK5JTGvcJphDs3lnhvyeO3RVZ/qVCPPb79Uqg4evcabyFwjP173zv8Oz7hIXrDcDTKHY1NZMb4mT6+s5PKQiFby1V4w5P8kwH1D0ND9txLwVU8X28w4JggGRyWqcODgK5gZI+B/xdOGhy9Y26dJeV4fHDYp/++7k+JgieTRvWxtow/6sqZo4016SuZ/mRyrDDVJQVH67OTz3HSeo6qgxsWIv67GEMXi6y/JmuMmDSmNXMleicPConLZb9hY9vftlbqklGO8c+4V3HhlOcFXKzAgYQb3XMDpJ8y02nuwmdNNyqXsbxYTRqUDkReQ7Hop8w4TiuKNrA3vYd8fCvzZtZWyTEpuAzyMm9l093ovkefUOpSBQsU6pqddbay2S14iE4WedKCJeZnUmAHmTypMR9A7cM3r3xHErOwM4f7td/BW1AKh1fxfQ4K4X+7Bxz9+zA/6bxCsaTG9bbzgZdteot+s6Jsub8oHAMEGrBvz0V+eTtmjHUVhJSRCd94R2SVDCVcxQbXJZACxjUN7S4dpPDljz2izuKOF/WZqBTYJZQJCv0DXFUm8rnR3P/qdI6kZZdIbzvs8mW6jIcN5805OjvZXDFudameCouAvmlVZCB11KZH2qVBf8ZXb20GxGOP+GyfENlkaci0XfxRsq7L7sUcstivemOjWi+jsFVMKTNjrwQpiut7V7t/FkfaV2+2gOOzX6DX5luj5nnh5r4Bj/JtBXV0TOPoP8L+PVgy5JNnzOs8xGDH4NNlRW38wA+l0Bm/IUz78lqFRqu3gjLeIc5578DUHwxO3xGmZToKFMGVkMSnBqCfgZNHefAmGqfCptaRkhjlph2QlLAOxRU0M5OUmIAnZ0iUqi7cDYiHHUzfjHHBRouFfXlgRlhhf2ecvGCQpVgmDbA4cGyqpmEYBIYWGC581gqlb3Atrhan24TFuIGDEtIuaVOg/Lzs6vFZTgJtodQq0wWzBT1TIyWDIBWnbKhURv7dK80aMeiLlVKbf7yepqxNOT6FRtJFKQJPLaqKExQT7OCjHhmbK+Ix8oNSo6j23kfNwtl5MkqXuApgcSrKGjq+33ORFlqF9HEEvr+4TNcUJ+qoqR08tJJMLEQmbmqLP0EqBd6RrBsAAffP2PAo9uNQw4ubgsuYeIcLnjC5g2XhXYoQtH/NieghBQwYu+XLU0X8rSeHOXWUMPEezE1oTdXYbUdr28lMmvt0p01l9tUnBvfe+1OryTe8Iw8bhTIm9AaXBY2VnaPBb+kHH2zRAHzHvjCXfqNBlxxyrJhXFn9OPgiETTOztHIwkVmZFj1D9ylJ1fZWDtALiX3E/r3OIDPMOhlV+/exOCw579ACvteoecaSPWJwWSFIjjs0D7CQs69Gb6Q6RG6WuHlMcWMz68KN5T/ldiB3pla2k7auVvBdyTT7hkbGtBCHP0nBn88e+iZFx8n3x2URexZMcy7737HUzt803mY5Rffhck4L1EFlxNNx2ra0Oh07d91RBgFBp1VLzQrFGjr4M+o23FxLHDdqsINxSAKRIqZuzzzvcjHJCaW0rITlUV65h+YG9MYFX6WsaK8mQiG/SGAgTSolmlqPLeEzIVmThq0OSKdmG1qhkdKht69zOa3CiNcpH9a9T4iD3mOLLqLjZBjt3+K5MI1UyWGPz3uIB4Dw60YVCxAqfmSZyDpHdoArzsPcgDSfoVZfg3qLwZmvyiEeEgGJxCceevq1GHKBjv4hK4mDrBKkcDp7ze5YQwCDbCq9giKM9Io+VpHyeVh7KjopawvJFIRkjtH8EVZ3QD6ijEjPSQjv5KpFlr3OnngeGNepX+TWgzrEicoem5vDs6CsDFiX2O+liBF+xjwjecFcTF6y9XXxeN1fF4v/GMK4+jTkFpP5Cuk7dD9rVSSjGhw/uRZrRjMPjttykd1BLqY+NvDgy4BVhzleOnTd8Cszd/NiI7kZLZakZjZC+hhFv6LApvdHqdayMYFJg+LwXMmkXM1Pc+/nQYVBZa8NZiKPZaaFcJqNkOhmbv/PaC3FDx8BFDal2d1eDJJBZm2Nb7Dq2G+ojNlkKsfKpGmws6F9PdOCabLdsFXPotZQhD/T8BKD2UObDze8lAHsV/JnOVdoPKK+d51qO6uVKNA/hSfYVhHHVYitb+WsVGc7SvRylgrmXvAAGiTh+EArj8HX/6QfeqrlY5b2Zu1k3wBNQdbYuS60yF0Z4QkgphPWLV0rFf9QBhB3t7lkpbur7TxNmCjyyHOLLOWQysY6MhajwOHEzeKf9e4ZkwRPYfAOnjYl02d7SYUSvTIDyH13tM1p7bsf9yffVRPu7Eup7l4PY1SvZWRDbpez/JVvcQnD6eBCQcGTaamq9j+ZHStV8o6cITxq1+1LT2QQGLvYFcanlLeh54ajC7fQJqmU8f2wbA9O7+4rWBg/YgYPq4RDMaBXJg8kM80vy5iPqJVdZVCACsAM6QtfEIoDDS+HxNyn2gcRVQBTCkYJw0w+iXqk+qGxtxm9rPwptUGyxBAAX9wkbtO+NKVHhTf2O10ckUVb0tJGxCShYux4AKVqnIjEzGx4QELo+AzMVFNe6hBQbthgmeQNzcQhAMUct6ReehvVJ/VAB3WBwKxKUVRMyTbPRE2kyoYo1VW6lozVTm3zxlImX7up33wBI0cJmYi+fIrUNbiAUyouyeRBloEMaJMczbV/dy5rvV9rsfOmzt8EPbbAtEoFOFzLv6M8lzUVxiV+uDmDFDoInRQ40pL9Zb65X9m3vuWj3D85PjO5O+rijqKPsKyL9fhJUuW+LgiN6tac6MFd/a1Ac6veP4CcuvobXFPYus4MR+s+sbMd3k9Ggw2CFWfgej/qGKgjNmBhHcdq7Yk0wU173FknZSsh25FC+IOcB1tKkg1xq4K4kyJGhfMugsGvRiTIKXAJRiX+RdME+y8dbtXkG2njUl/ckVLwNGKeYmvrFraD2xK1+AjCrpVM1p/fwzSFDRbyAe2wMShidIhn+u6MJboKNhx+oz63+eKeP/81IQGASBBg6WfdfbIJx16rLv+Cr5aiRgcyGjIHBRso5lZAL4TFBxzRzkmZTlS3J48M6oN9NhfXr+/1XUIb4Qithq13GaR7F4y859pOth2UA8u7+zShbYQUzWwJWoe5i90ni0Y24JvHAoJBNXQnSwMBnm94vC2w0Iy3M3SOybqJnkKSWgkQMDckGMvPlhS6Elp/B7Rc9FXKLt7pjd+NL7KSKU32RrmpH6k1zQ+YMIXaaDXT0GXbd1WzWieflymms+hGTyNb3NA2F+1r1WrHfdOF7CQOrzYL0AKpslSZs7X3YZbFW5e6xdFBIV/sWw06T8M+EBUeA5ULEycRY9zjzBOcaYeaLMpAbOlAHemmY3AaIC9nOrwjO8wHJThVHk8GMORjF9KkGAKDkJ2gVsNPooWszoWIXFbrzaJn1imsyWe1aYyTT6rUXFyucdFl1RpsNqqigixOXpteE83nplinNMH5rhy/HxY6ehpiKdSVo1gdRv7Wa0940re+zKt3HkNMpbyS92yp/eRJL+/tVavd4QHYoX8MU31VrKhxpmh0/sfkcn9faFgh20PPv7yLhmkz9n/ToA0k2n/+5+dzjyfDxpIexOUHMlgfEbr5X+zxm3+sm37b+lvoM35z8+NgP2wWUFwRzgx2zW2DFRQJpgAwK+T8hwkof1/TU09Lk362bZXvd0HfvKoEwP67Q9FJsY6YqnD63KpVxnE9k0GIRYP0qB0u5+AVozjx/DSqHj28gyXiqZTe+t1zLaosk0qskrqNiMJbugRcPNuPJBKpya3nDj6cG40RmrVc0+XoBtMP70RtfuHbIyoQq7QJBNy00QaaCLscGdLZI+KYZ+k9MEL8+FrCdOIm0+K0YEevSgBYbDS5gZ55pojlP2mlCVoxqyx3gZkKdKxne7oeVWr+FXeA8ZVXsb1r1r5epSHOv36hTOTPmJWwol22OPf04Eptaaz8df3vL2v9UCDLLxi7ZmCwMzPruB2qgFmxFYe3Txl1WWreD5xTD41bNZoedGVCsl745FUk0P7lFtShS6eDaVgbbYZW/GlTRpNuzg73rjzy6ILa/rBay/sXF/Mts0s3moCPisBatuG7LFcZQSMkT6NDC+jpNTo44+qTqLCLvzkPaxS6cYJgTZR4BMspHHQYcersSm2XhOv2o41iQo2VKSw8+YN4bdjwxMcy0wtTQN2Ct8XCqL1jHOaTkWjXJXE/zfTX3D1um4rpDvnwh8iROJ0/CDea26TFKTIooyh0dBdNTLq0Z6kvl6r8q7xB5j9WcGLcEIm6MGVWdpHyhGmVt0Y1PZ0RcTO5scGpOROO/iFngvS3Zmc/oyTqvooJu0wJEI6Kw7XoTCKvD8vBw5QLiq4skqoGQCL5mODE7P4hqaCv7k5mBg4yjos8OyEwNsH7Bn8+tf9mgHejjVW0S5LTTaoFb1dDAhKcAEP+OpxGHwwnc3Xqz2i5/X4vToENjBlWGkjCwyopCK3BlLcTaVKFC/cSGcg2PRK/HB8zxYjvi56z64KvXo62aH9DwY0vmVLd8KsZd8gcONgHVL33vXzExuPvkL/uLFrYwEy4GH3+X/eADwtvPncjLs/D2XX9xBcaNetQEx3DJg+e4Kg9Hk1lG03CepcuBMMxa54QIYaV301FV9YqjqxO9zYEFLO8wZTQ2Ahl5+nFlCfAxQBmhPtCWqAfMbLIw1EaRBfKmrTXaQdWNHSMI/Mw1bwvFf3jQ7QgzPffbmJEXBBbTyAx1v0TLZemANzuvIZVhEiaRQCxpFYamIob3X8uMoHjXnooaAEN5BYcoGo8dkABbDmt8QPTkKUsQSYwB32dqaZKQKzhX3oW6dgWJJbEj+DZyoUm8YjiwVems+3WwQ/jXRO/7mLqscNO8cjWGQfLZrvkLaOYXdHEy1+VFZrxIkq9oh251E53CxMyw5a4//MHROShUpY1BGJgJzhvit1hVztsIo4kZgus80P4twHdMt8l+5w7HXaQM6eiHdJiYjpdfGLCgvqx2KcDJHiazyVVyrPuHc1KNaOyjCg3V2svpOBQB6AJN6DFSVj+Z3QLRKHGEsI2itAIqwrzGlF50IdFMxTC7CWcgnmonfdT/ZkYKuFiJjQykaKOz4FVk8EfQYfxWyp2Vhmru04NdyjlZlWfo4JjtbKgq0Iasa8k2q+npU2Y4ZCI/IP1cRBGeES+jzUxYGz1NkvvNQFb6QE6JhpPQdGinYHGD8qmPM28kOXlN7SJPGjn3P4HZQelieWGmrf2CMOhpCFfqORelTkbKeWEZ8il0BaIg3TWI5lpUrCpLEj57g5A0E41dOtRD3+0fdRYW43Zkm9SjwzAdGeHgyQaDW5ybO82Tapzg1HuHzglYv1q3BbOKvgKU0AgF52QYBCfm9d4jaGGpk3TUAEWOxsBNtuXAj8S6sP3rF0LD+qfDtLNVMfIwf0AfuIw6nTW9oyQXeOGTesk5yKKfK1x7/KYE6sg9nRTIUsILfsFyNsyonz9ALY41SFHFlGwTXMi4aE5WZjaqW9p0mY4pDQaXikp/5fehY9YjOA6B4SjOuOhJTBiivFS3NfTxO0RKMOs3uJDISFtKEiiJDeTtV7F9jYZDN6qmMOWtT8geI3p/eOK6uPhRgzdhqsWUFZSojDCVY9ErmKBtsxqPS2byfZPuR2QMKzYyYOH91e8ANJ7TVY8+ksSRNdmDGC69P7L15UbdVSWBTJyL+o/5Q3X/xNGoPm1JrPPIltqppCbaEjcqTtnGMZm3NgUOsDsxLrD8wnM8H6iFGViPWip56wuDguYb2KCdXTP3NQWrJi+agE1jUrd+DRHlpTySfRUSaOuvxyamXlRybOVUBKPoWqdvM90JEeDlN4NluOQH9STvyYj0vNe+pYbf16PfGd/i9DcqvpTlgAg9VN6CIBBPzebszTAML+t0DUfPd03rGwmpz3cGeLTEGCsacWL7bCb5kQBy2hWptFQvlugAjurF0TlvgyRpmqXowCr9fsyC++cjiesfPU9nFDjwag5frEKjmWOy+TbAxZgwoGz6cF7+8h7on/Il5q8WUQEK8Y78CtttrdEsXpcwQuojVkxm1Z0FjdzF74vhcgy7XVxjgiq62jMJefFrMgUYmTaGDwqpOrHDurVvW5eLtOq0MoeoE10HoFvxq7faGy1qdUTbVvlaM6spUCAyL7rh7okD1TkZKUDJL0X/q61xyDuKFXJq7kYftfcpRlwdUK2qxbKjWbX+wywVEDZ9h2DCDqByLxhxsrc5jimDjnTMG5ydO9E0ejbL+Gg2rfs0R444AT7QzdQkYEJzOn+HzRoJ5r+JV2G+7YvP52eu7u+RpZXWPObKclitBW7DfoZVm95Qk53xJnJE6m7b5qvAbiriqn1iRR2cYk810SqE3Hbn7JMUJQClroe8qKcQAEOCjWOLmTVbM9gFcFQm9vQdtZboxrAFE2Pbpc8FNWaIiyp5xVNipzEPNjn7QcRkxRPI9lmlfTdIrzlMRpJ3r3WQX7mj+sJof25wvUMMb9OFnIFWuvT+kZEVYWNCLfox0LEQetnH0wBarQH6RJjOcrTmbSxt7SU1KpcBunazYAY+TbQQ28B8TlyuEsWGIQ90itS94HR2gYi/8V7ypWMcQsGLvMoizL5X4jhz97UY2CJWNkNH8QdvVidF3vWVWWgNpZu4MHe44/pTva7x246u5Pk+DtiFZelwCktCCVgt5K/f8f6lE9bfdkBdiIQZSYPUi87lubvffu9oMeF2+kBOrh7i1YMldENvzqWvODXkX+qP11/aofDSeq9oKDzKQYsHss8pFz12DmbxLouuO+7+KsITQrjt2nq3o37NSOdoNeuj/9eGvX9MsPqxnMnC3GstCJ/WK28HOqKd1k718Ml/l2J9elHjpiIcnfJmuiQbktgW4AYAX+knMehu+XGQKLkxQCT4Fr4HpLgQeZ1sRes0FObkDb2Cs2wPCoFs3VP3Bz5JV+oy9uXGxR7Evd+reP4QOEE/d7dltpk4c9y6caqFYfdRQRJVAr7kvydJWRdqlDi2dbsXiA2LO+HWyeT4jN2I17rk6EbYFT5S3v5UBM6m9U762ozhtAK4vbYI20UMUzVkSJPIdd1Glt49TU2B4teCOyguEYQksCvhfIEckXRqG96MY9yGhIoWHKwW/tByxqqyaNLzIMqYg64K2JDopWuslH4MY58l+uwVzmlnWbtSWifc/KvE2n917RW7yG3oE7tdm5ZSvvRA0RW1RHbGAWadxeAj7kW9+5Lr5pzhcifw7kt52rq+QHwnynOeoWCs4i8z0enH9Q/fLF7/dxr1nYO0izqH3ty49OIWdcGAZ0XHqSpQy+UvuaIv2ISBVE/rwGYwRwKpsvGxF7kx1CdPQDK1yr1sUZIL8vRAeXHOvSTXyxN54rfKTB9ln3Z4Rc7xGXsf1tv27HKpyx9RlbcpJrmUiFPcjR+pBy5ZW2Y3Ib5Pz5mZvlZNmFqisJ3TC2N5bAU/0t2smBPk7wpHPe5UpZ4Vf/nrjX8/x1eVxYf/R5rrv5ayKb7MP0gFrrrjAeisFFFmz5vnzSM8hpY4chgJPcLyUlTEth+VQfCJhi91UW9zYc51rjIdcoyelG/fC48tJMJln+cPJRDhzaTnJ5VF9W3+rHvq2VVhirPReBxEWB89mDR8+tuLbMG2YIB8qUIGaJSQeWAMuLwq0Q+aaRTkWH6NZ10Sp7cl5snCGX10084j2n9ahJVoKLTdCYbRyPGo6yMpyG/Eu1bY0vU/GHyvf/+7duobvdsNrzcvDSeJ1gfHJumz5Z9jBUq/besojyR8Qzk/ysy4hQrWTlbAUKtH9k/Uwco4fDViBWuNdumB8jSOgo79SjTHWUp4tCiH+MSceks0MvVgaceKtrSJ+qf8+rP29yNHz+qMNi6ojC96O2WNzmsZE4GDIfHlG3gt2zGznBR9Le0DwACC/EWbyyIThefh6JhsE6jsEziQ4OrQ+11J3ll2eMo8L6ZHx6E39S37GZO1HZ5PiiILNNMFkfGscxI0J7gcmBIB9Tz07nxHoeh+gsUeM+QNBa751svwJ4bJy4KmpEdh0/QSTNC7fkpBZiwW2L0PFhongeIvfPgUXZe9xLaLKSISbaAmhI/Qos5Q0NLXlououxXKd7OVqSdDstI0g/NYJTcKw2Fp7jeHhT2/08zIqU9gxyZo8Ycx0f1Z4zNOh7Qli9M63pjvN9bvqgH6DMHazFcrbZ3nQcvTbelKElUb8IscnInpcdykXLbN9+eURqM0J6FD9VU1ga72UVixh1/8OShvKmLlnK3XapPeTAzieXoKCbaSsXXVqiv/ODC+gpZZ1Hzxsdx3O6PAi1DZhUQzPj7iSNavjZ+oQcyTdFD04v1O9oSl/svOV40sdLNbavyJlnsxne7JZEZ9lzTC8s43ArYRknB8NpMTk9BOlRG6gBYBsjXRwmq74RFmhhzf9aNDwML6YmttZXprvjLNdtzeSuD2RGdHXhvnutDwoNx4/Bnr9ds2aytQCbU3ZVyWAPyAm8cuH2HZHkp5ludi3ElpYhEBQVSawo2caLL6RR9DxrfFC57nYrWxaHd8v533uoBZmQog20LiGc28WvkvAavEyNlt28MJmR6CkfDe+8YlqptchWQtO8JKqP6v2Ua2Q57egtcq/Ey753mf2Scc+nCpEumIiuV0mEW6KF7RrRnRk4WDB9xwoKMdaDH3x7svNo+bGL8E9Sjzgoak8zZCgIyKllohvz/cYaORMFZmbzNkkUNjNF6kMB00TbfKGoXgOTBOlRh9xilIh6IgKrsnjaxaxijtRQmp420+jCB3bbVZQnS2ZXrX+2mzKdmo8YkgbXS36CHEYr1BMdQAiLJXd1FNqBUczXVJ+nGeDLFWTmv5s4QGX9CRmyD/b0Net/zKo6/6e4+n6MjzwBYB/S76MPieUuDnERWoO9SvMdulm4p0/6fqx1pQIrCrSy1eRdS727QpXBNtPCMShoWatTN2eJEQuk23STSSQ+t+AljzU5f/p25JB/bIt9+upmskhcSnzbjInjHWg6I4CwWQT5Rm/7lluBG8150IGZl2E10+sKeqS8vMWT7fiaI80RKo81Gwf0SxsszH0o5/fmhK8Vhu83rwiSmBmXWWNqEHatCEm5PR7SwYRHt3Jy1OEPyQjP6PNmZhubQjY0kdyhNy0sWSr77VISHgVdIK3LwsdRI/Tt6H0JuAHWutsQmAScWKeXZHvXi4BF5t95RzwkVAsCH13EvJOSCGSxZm6zOdEHr+EKmsTG9KbXBTkQxT0hmmTAgKQVNpGYST1mQLegrTWGKGooBaqK3D4kHjJKmGUKb9CZknZZYfNtkUfpm61gAagXFvkicroRJYmyqCkhfmDQ7mDR4itByQPf4D6ck8qatDEqgTCxOifcceMkulaCvbRz+Fq7TqbEEvQuOIREfdSzKh8tXe3zJ3HqsJFsr+lY2my55+6saKHYBzRX8/nPZktwwkgmSgFkTQVakFarJb24OBgllDEVLNntZrHTVG8IxwIX1RRPWTWRRE61gmKT/1GS+gtqwYYYZ24cYb9n5cPdEWkVicS1oLW1vhAWMClvTlJhEo6LcsFGMMv+N3cw2Hw6Lc/YmaGDyCq0FS73pJsgaWQim+7jhdDb3cubVsc6jh4aIj3mJl8kyjz6JuNDP/GTEbmb5mVXR98qv6oHrf+l0n1DvdIIdZ/Q1ckfZiV3OExs2rtUU5O7mPnHokvr1D0smQQD5jGHKio9ilavG/EbrQABgroA3mDjPT86183a28wadJMXKZNEk6JfHVvTAhAruwIljB+v0nMqkrO9rAZLkAkXeCempgWqN3YO+xDR3NUQk3jsrtBv8i9fDellSLU9Mi+tH1/E/k8w1QMnlfMojSYs9QDrYFUmXKSAMvk1p+tti43oqvTn1iQUYmkuOYoC86LN1lCnRtzj6viKN9wCucrMm1m1OZBiu2g7ItTr7Iqxs97ChzzCTN7xCbwtlskSoGEzAIRt8L0IbF2F9DQY03qB8MNQpTpdAGsQm8trUIIJHuNaAEvDheWqnM27/Eo1qUyhzFDEnNtlY9XawPbFJNrwtJdc6cMxs84gja8toCitDo3JDk3moKcOXo5n1m6pnSaRUrWU/+q2zHu0uxEwgVZHwOBxLRs615XEOeLf8Ety0VuhYXR3C7wClPPxiWBUaZqbP62CPQpAk1CMc9gBoAAfuhEOeeX8mqrpCDJQDm9UEYcziLrHRVgxNNreJqDxg06eUE2bYbD5JouDfAzVkmh9THpUCzkyLi5nma1J6Ld4p1a11EJu9nE4+msdrUNM09KKrPojRV5yJz81WUr9HwZgH3JOG8qtw0Z1Qp/JdSwPXEoLzVfm+BOjWQoypCes6X1RHpeAXS7TaXPTWUMBxbnBDE3tgtkydkzWBzZNYqkE8YimyJ3mCiXOshfbuL6YwRUYUZ39X0LtUpWeFUqsI1zl9f6c096g0/zjKybTYfkbVCqb7jmGhNrvZfrlGrRgZ0k5LPOatuG+fwkJgL33DqyixR10PLvk6tJ+zAl6hUmS1obTeEztR8yfJhITCvNAvZpGJoRaYp+dnVcF70ruuSpvzCzqon5cH42JdhsSISZeq5+uINqsLEB4VR7X80CcHEPgTt6J2ifomxLGeHnn5tWstRBUOoho88ZIgm9GrrnLX2H0XFJYttbg/8IKyBvW/msqbtCUWBTTckMrFDC7IqvyKA+VFL8emSkxNLpDBtgAdFuchgop6pJ8VYoK+HL71inCzgwQGjhOkBOeiHD+xLudFoU3xclL4zVmUiLRJWpbDbQxmaoahNw1yDIuBPqx0XmDYQ8Vm8JXzHQsLUS/okqv8OLXWbEl5FHi19Uaj+gsHTrO2LmLgZtkQMYmI8fU8tXHRmDt2gkwwBMl7DGdFtpTn+4rBNaBw15ED72T0tN4hfQxH259i0tuh6wpRfZbbmfpM0CMfldxGTc0y6Pdpn4Cs8+dHjWiu/8/KvMDIY6qO15+X5XkomFjs0N/iiupmLuIK0rSMYmMJsAipmObF6vXZjpINnMOeYZeE35DQGwWkfkhToNguxz/QudDKFtnK1lh3fxCr4xjOxnpYbrXjdmwiVjt3y4Xh205WGSUa7cnfeIL35WrTQ8nsK00FLii2uuRsdnUZ/+lUnbm29Mz1s3Zztua8G+67rmNrzi9aWkVTvpvzYOS4VIzkyvEoennW2VLOrbq7SgOJ6aTys2/uW7uvnqj7bjARlBQQcFlapmqx2mkFkNg1vzG5vRXlGOOZYlm8570v/I4gYkm/qA0IbEsUhzylbRviPlBJchS+3F3Iuff33DFbdaRjszCJZPRyA9fNGxeLZMVVLTAY44rZ2aUjHOR7RWgTaRIIchws1RowEHBAP1dG7T9TllfccvM6Ue4PlNLy/9ONSCqgLGu9z1+Xray3/62QlH/+THpakGlA6AnjGCF887pBFgs+Q++8lKznXsjCdeNyoJ+PIUdNTYrp3+17Lzv+zma9zusfjdz6+gh4s/WvWpVne3DSnws50rYZfnTszds9MdttOFK5KcBF7TmrczBrsmOBw3+MAuM2Imjv8HrCJpltCI3bqN+NEMe6zW+GcSY+01bfwHgtPPxsJNqLxfrmbpDimCOCjmU6yW1jMg1yREhbMdWFvb92fM9OS/otl/pPuaduVMLxpDWiRCtmLtPX1/F8pWkuJaIN5cDkpdgyW8H8IWXigrFBWydlcVjly1RWPH8DBLRYdX7SDiRYwMTnPhrpYhCXAZpitprQuQRQJYf95/dBxV444JkYvIpdPJQZO7Ye2uQfaXvIH+MDKNhLOxsqfWLuGbrp4U9b9eDNP3KYI4Wrz1DzRh5OAtCPi/Wp89cJRrRjPL8L7zwgZIoKWxUO6RCaEkgBU0Z7zRPPdRQWWYl8sIL5wLLBBX4gWh5YSiXm9p5TQvx/rrf8mQzziHGK259UbC2DUati5aS8xpW0sfo1c1/Gw84ywYLALth9CBiptNRRSg+aM5YA5xnI7MGr5HmNY7YuBlV+GZfR9CVvFGa2lgyvd3Z08KG/65fkFfUpZBPYyQ+76Fn2/gRZrwI3lFCTDlHwK/xz6hTCfGdEzmNQ0dPzLPGynSPcHfWLRJmttBkbTKLZZbayVSWmqZj6HQR4DA/9jtV1OGJd778qtW+zynZzCRIen3yRD0EEmKrgZM2E+yd2JI4HlAv+oUreV/Qu/NXK3uyKhRR19fwTB8ijykY/JL0SnQFGQ6k9fOm44P28Fi3HSrNaNwf+fXsFLXqc+EG2bLaIysnegS4H0aLzdhqavrpRfjqdAKqfMZ+c+q0FdrmEo1zK9C3ZpwOhMeGBQACAAimvIVkMnvQMGqrNZiDEiHLcH/Tm1s/HuDpu9xqqiOlpcOgPUVn/UTU/BJj9GlRFm107oQSdAvPTWGD8+8MeyLvHasYEh+RTz1Xr4QR1b6+sIvxpULBEuxR1vl8IBnmeaPLk2SaZ1DhgdVadQlKiiIOjghS8Tl8lNjo6AHCr080hvm/0aYEo6SixdsMlY19DxAGOne6unTLmmxUGnXs7ilUsqMnTKVy+gdkeQ1i/Kmss9KB2uiUEqd0Drr/wiFEnXbqd8SDHPlcb+NtG10iWD/KGjsQ0y9PF5X2IlMxP5p8NKubHksbxhpzYRCkyNiF0mK/KRjUWsBafpVAlYiL0YvJz1vb2EIN1NtBxq5DBuIO2RjRjSKAPvLRwNZrLSzR9d3SVZB6XhfyAx2XuSqWoU10yl91CBB5jayqoPyFNWLdcGIJxYXGXTd/httl4d67YTlTrYr/awG+LCATgbmIDVOTYF4bqeIpLnSBzYISRTU6EGonkY3/NzYzWOW+ikwA3dRD2I6Fj/7UsXiS9NtM2rpiIZKoJgwEyxeCJdCGAlJC2n11rhGyHCfznx8v/clkXGEQQjKqxzg7C77kGrJcLdXUQ/RkAwj0dQkBsZYYGX7NpKntu8sldiia5kIA7ibLMAl2WTTH21Ayd8qRRSvdOAGZZYpGiilpjvaMXULy2QwArV0qV65uheldXB2eb9zqqinrYYnWTF7Z4PZYUHc71BYSnSzVOhTx1BhQlRUZK943qIKqc8T0nk9x17v50QzqQzgsfyBQxqUenVpRGTBck9SVRaXItGdpOh7fTVpa9CvhY7rsGsN/AaEwWiBeuDysNYy3tUF3t1EogowteqdsCIPEg01HEqCjDgZZyys9ix8wvHLqCES+tZC2c1UNmLXFg1KpQZJ2fNN1+a494bS38n1kGSpWKlVFRhXXPyN2TiK5dVbNIrjUXH5tmYNmlIL1Iwn5k7Hl4F9fpA7MHPrMz4o93639qQB9MzP14iWvmpIw0aca5b+aX63pfhf+kTmScygziCQyzyVrgdCL5nWsmUhmLmj50qJdo+q7CYtr5aj8AD8bDX7Jp03OYPrRMMsTKmXc58dA2c8TToXSsimem6SjaEz/ocyNS1ohWWcW1yzBvcsltgjJrSmPyuIjoNkTMknnrGuqWAi6b4moM/p4rX2AIrA35OmhK7kNDgwyOagZERTbrFFaDvhHv8WjuqK6b0tjsUqvIf6xCQ2NRMiIoscpB/H2fibqdaZlVgnQK3KN3SMDqyvEQlD9Ctt305W8qKwfBuk0ltibRW4gEW0PvQKeAEfXYoimP3aRnEpLiR/hZVC+t31gwTikDvpMXPyV54i7pr339AZbW/kUNpfn+aKFmHRFzVgUNovecycoR26yZ4fBJcV5QwUxoj7G0/UMjuJwnnW8FIaIr7SWhTm2ficSxsgGG5Tyv4mmm9KYIfoLQjR61JbVWIpjXImpSdhinnBmzvg+0V2tgfZqEHBDzxVGMBgPqGhZv1/Nj1DNbBS9lC3tcuGDH8SoLJmnlFKIf/rk7fkwyPoClffCa0X/Y8O4OdovFbu8XmyAm/5Dcapt2IPR3JvbwSUhx1dYIx51YjTpxN60RvG6S+bYhJejtn1k633N5/K114ZjNexErxiA1rdqv5NzbfT+zc0xSOqFS3qRaRWQHczBJtpm2WH4JkVLaZjgj0un2VC5Q/me6NnsxydY6WPZSznqUcVAq/sfohYuIy8Ial1H0p544LkLTlmMF7WB1n8wfeVsro+vmXcHcuCwwOFxnccWf3oaPZi8NR7wvitOeiGks76xHz3/VCm8bhVGM2MSQOjIOb4++60RK09RAct2sA/8FuF9NAL1umrBz3S8D21VH/bHpEdaULLS7ANtDeu2ER1RAJ+vSVNyPizWKyfoTxEkiFZeRnpQwYozGfFsfiVQ1VwBpWnCt8juLuuAhA8g3xApz26otyAgr0XPc5nP2Cs5mVH9FVZLeM0mxXyShNnoTOFisQ/ZoXZKh1wkblqtZHjv/oG597IQKjMteKlNXgIYyx+tBp0rZAbyOy415VY92pSEKE0uZYnqWVVglxoTKddOpAUEI9ITBEh0rrPh+sCOEGARuoQcUwujgOyKpKA1WQP2wZC2rv3R8TWBuPBNRvDwLC05++Jv/dvoE41qv6kAN8Vsj7w2lAYhdnEyZsObdpeWT9kZem0Nj+ZRrW1X42ZEx2JGFJzIlZcyhgsToo41s+aP1pHWlyPmHrgFqzs/m7XzigOeRpuTI/q4A62ggrwP8oxRSG0lla4+MvTaFipAyekhCXBnvEJmZFHDVK7RlaIJLpP4c6eVDjyKAER5hxh0nf+BE6d+aDNlDPQ9KhoiPLUe/TyfBhvbz37vGeaJDwjqvzA7ssKMuF9eV/UAZ4/5FLDhqEWJqHw6iPW5V2gacaEQvTWDpS/WY54cDhjiEzqFPLOTvj1l15YUNWyqq6uKBm0slsHffjTY/md1JpwQM+HCPH29boyz8W1tA37t5x5k8YH6PqBk1O3qQK77TV0AOFwbhcA1S6FrzvsI72DY+xXuxKZP9j40tqlft2Q3UVBTDW+GkVfUt4vH3ivI4mQrMyMMrSHaGecslYt6CCJuDFOT1YGnEeBK9V6DV0ho0l6TdWlapecKfkHaGtdopEqQatxA0lcd+xZPOgInW5OXFmSKZGX3Y7sCO+f2R0OwUXFKjgzhS1jvrnisRD6ZqCI/sP1FxBeursv2PF+PrAGRvYAjHhO2J1+RBGDhsfYwIkjVNtuHcor1CMoV77YZBCZo3w850pXOARvhbtLvarzfwMLBqAcqE2XJINoR8pPYAxda5kArDfO/1cQgfBU9sS1HnGPPlCG+BDhM097ZSlDXYmHW/x/ddsOHA87Buiwsg2Rza1stGMJVwBZsccLcT0ruKq9L8HOc/LGz1ynWPyMSBqhxT358cqKG7pYODViyQKeNCYY53+PL44sa/eg7VtqetUcUJT9yPBQhIHJQG9f8ZEUcwylojB0BsYtZFKN3wVsHmNj73DzVgUsUhdt+IsDr+4BjaqB4dMBhLUs401eDqluePRF3qFgHTsfIY445ETHEFnrgRURX/dguKw7hEfK4oC/ycQ70+Tvl1yxD8HhsEB1wn27dycliWDx9O0Q73dEz4pktuYMw3V3TYAyfVMOBxyTZ4MA7BTfBPkcEB1RuVbnB13JdCpvRSfTMzIQ4ECvnHJx8Sf8nq4ODPTIBDU6WTPqFihTS1PA//ZfYi6YEgFqfJnhfMzpf5S9yNl0phT0DXayoTqZ+EYUiUMs4cTKVdqF0KxU95JRb/QACOIAaeznf8lf0o2FomTGC3HEF+M4mOz3Et6T8IG0Ay1URcl3cwKDyC+1EGzGkGfdGKo6uDctJxJ5Buit5SD+Tx9ZSAsNjXBtcIBp+FTEvw/j6YWfALdcedvIImid0muHCn9zyGlwv3yTS3XER6l8XY+8i0L7vlcSM61OMsKZSTpL1XTWQQHhLnkk6wLlId+MFs49t+xS+nbCHDVFxSz2ClqLSSlgHj/KzBMi561pgY2qKpt9+HBQ9zA0fsIeqnRFqXt+QCoFvVL10x4ec9K7LbeZhUyymWewzSJsoBTDP1SVQFc/w/7xq/EwzdyX3lus3kVB8zv1/LiDMgTBCHScmrn0aJhz5iGUmjp/21u/3UHOFNIQbbX/MiVcY2/i2splP4+YgKgxp58iFDVJ2pWkUtaP2OxtZofRrPbHMT32evS4OcAIq2PaA2cOeF5oLf2J6yz5JcExdoccGWrqBRbCAdEV7D0Tp2OMpTrbWo5+PSsB7/DavD+633HdfvJLjJ1RpSjvuDgtVtvqp1cg88C8boPQzz2UuRlDRxhigSMFTGvEGqqRu+UKOB6tKC/mMui13x1oaywQMQeKD3fXrJv7QMRsoQ/EZ97TJ3kCNZLFoaFaMo0cEYlFNdv0uUxjoq4ChQd/YHhDF6DLo9D1neMYVsVK82XgedLw6Vpca0vQAHWna3TRrFJZ5wvl+iHOcXojrmbEm0uV2Wl3y/ZmV43+2Po5SHnPeDf81gpEXcASeEgjqoonsVaArTBNNCIqbjKJU3/9RRDANnUn97z6RoM83RKWh2wB+qxADu9PE2aXbkuRwr2cnrXBSHep+d4uG4Sxjw68hy4DD3/VBtDBvA0Vgjg5FUy6e+yWC03ciLVdI9FQwZKTnSa3Mmq+qwz05BEN06MBhcU2U41487NT4EX+m6TEiPvrc26W3LUnvDhu/d6lvhLps8p29krCMHf6rh2fvlDsY+jQ+VHOx/Ig60g0govI48JaZnldYkduR3Uu1d9szbbcA3JfISzrQvgYmeAUwd5g3/TkrVvt/2tlOgiqbh0K/SsZ4Z56CwbbuTa3O3p3c7gvwQDO4ZNh5y/Vq4riychpzIZPjpTHnKvB9VeubIkZk+3ufZAtYYo8AheFsqbqtfrXlYJ9uRtURexZC38++hGX7MXeaEwGIODsRan0A/W6Fhayvnad7ahptUK+3ohNzZ/JiJ0KHn4vlrv5JyMOHwnK35CLuKSR9cShnXQqz1sCTnwGtx20dcqUMSm4OXi+LoYuGQ7YH0cxbycUFMD1s0Lvb00KXiXl75Gn9a+tuirg/7mw5UFs4dWw5KCA5Tiwlk3e42I1Y6q8uc5Nv2MCfnryY1Kltzkinxkhtg0cHR/pIQaw9oYXiQ/GRiZifNEncafXohpVcOShQLT2aCtvereXx48leAA2bn6POOEpSegQAtelte7UyU4UmFA5N6tfmuNM3G48AkXL2f/T0DfbalXrDyuCW4EZ08ShWNBHSzm3du/b4LhJydfKcdzXZ/p8vNgkGnEnQZP/RKl0YBgbmIgLklinCCTFr+1pm9zlay6xUjLfU1y7McGC6u08UTfxa79v2OM8oLtY0ZoujHEcTu2bEYnOUXk1THT8VyZuoyXHryJaVAFI9Y/dFXismHhX68m2I4qqkF0mjOF2FXtuyeLgE6yGug3ZGMAlLitVUNP7Hty9ACN9pQORk8WvL5ym7k8FyZJYW0on3YuaHOjUGzfsPu6ikGbPdmtozFVXouXSIs3Qu+Mx30JjwyZdBi/NdrgC8n10YF1ML+84VuyBbTjgULnM2YpvxyGdll/8KLUYGJO9rT2ajbU1K2QQaHHJwl3/Ks7+zbErsP30Ty0GR+PpGP6Z/fljLM2ikE1rR7sfX1r1q9x1MxnN58n4Ph4JtDJ0eYTDM/qVk1N4zw/L8n8stO+n+fRbX0tDsjJL3pno8HVjkUU6jpL1D/y9mVzDqQbA3v7TnwOLl0+eQ6kyWOYK/rXw9awSuLn9kVRATVR5+FJ4zmJ+rIy1rhrKuqwJhMpfrPvcbdnl6iGcdlavPAtOdpLZ5PyEDGEWZO9aX8xJrlEyJN0qKUZk8C8JM21PHHwjQk6yYUZdOMSWJHQs7kB5l9izXbahY0sV/o4hFkHl3wSrZ48U8QxevMssvF+Nsth1K/r/I9pYaE8EOsXF2vYqzBsK7pcLDwfbdI9/JXWk/ousMyHhd8UgC+yNVr6WcJSDZqy4qVAdu3dT17kXk8JEEHO3k3DYDF1kloE9sqPsnMWQG6L5LQUXxoEz/48ALX+8GceWc3HJ8Bz56y25lz31FoS+5zMmedhEFdD1LCpttcwrGFi1gGS7oDrWNUN+MEWGvPIrg1s/nIXB8FCN8FzIqxClazoPkqtK9NhALQbU5pfW8mbkqIWWBmCasutD6lh3qZgLvHCgjTV5kx9miWsDiEBKGTgtsGYqkn1oCRxeb6mhLfJ3MK1ESYucxldZDkdkbkZPkfnXQby6uzV8kqn04rojVURv1rjqWzYjUsA5unwBQXsCsy8Ybl+kqsyR5LmLO6FniW4hqmqCmgVFq8EypcACNk6ywMAoH3yCwYVEPVPzYriyzh+esWQs2z8nwcTEs2/boJkp1ZBlbbHk9XXKikAIkYI0H5QRNW/bp4CUAMxkpD2glpfLAruVGuji0jORYxTxfqfLQ/85n76nXkFDEYHe5eGSJoEJqF5Rt0Lj6ZMqmzFpnDBEMN6kEvAOnIQYYOhojj7Q/VscTtFBKr38ZEAa/tDi5K/TqGup8evTddspvgVB+fUU+PfpeFojp5byjB6Aec6uNzwjxGPwyBAbo8B36Oi0RHVZjpXOuInZ84b3ectz2uLhHO1CnAhliNey+u7MM3l9nDxI6dQmE43JY0bCOx2O5WDw7IhYzP0Z87tZGVYBQZcqiV5lXqFDZhraM/zbm2r7e9mwtl3NKL46I7+cwKdHsp/iSsAZPq5MuoTlcApflpuE1GrTv5z5zb4Ry1fz8fbivfby3fDRHZ9qtqozFvBn+gw7PSA0w9S7Lyyax0e57I2mA6W9WCKbWJo8xJ3ym1nmvaynEodXE54N3M9MK+5ejR6kywZOOysTPLG5gF7A9uCNRuqyHqSnQLtb+83koDFvPBgtT+GgEzu75fpOivLirv8pqQadeW4lIUh/vbparQJpEs08m19HslCJyNdsySjG3RUifZsZvrOjTR7k1msrr/lRVYisMZSYyzO4VGDBWS9Ju6zWC5PcalTIBVp8XBI2ua01OjIVmOfiE6C1et3BQxb1mkpveg+MTWz6mTcJw5AJ/CbINJcy5atVH8ZOqcD4vk9r/PyjbPwrBmPZ4LlQzLxqXmuURIu/Yl8fxqr2FiLtlQdypnUDZxKDOvFNtxwftCiksfDzfK04dh27Wuzhi+BE37nFWCB4mNAoKnk3ivZGhARR3np5Si5fTE0/O90po1eyiJ/CXmG5exyQH70F9URHkiTJ5hwopbfm1T+6fuuJj0ssivGZ1nVaTbdzCv/lmuTBr0/RV81fBtFFFEjL1pvspM9dPIxukpmEeDcM3S2mA5z/cifBhwjFLKtHf0fW6UB28LuTl1b4bmClvgNQuSS9ZeuPNXP8uhXkTPptmGTzXdPqXDvJTK2216qasym6zUVueEZi2be/1i5A5+Feq8zsONonIwj2opbknC4yfRwhXLetLsc3atv9fs8uk3frxid68tiDYQ9Ttkc3r+gYnZx8uuc5m0Mf8BlJDb1OkLTSPO1qQwHGnRF27hXrawPqdZaLTWY2l/sunHLH8tbzVq9lRxJVaw/OZVM7/LNmit7xknw2Uv5PbUkIqlKCmghxAzn1Tsr5W0F6dTGdDSYDB+jUBqFoYEcPGSnvStPZm4tJroPSmu0MnrIyzqWLV0dcGgOT8JYi9yIKvsIk6/iZpKWNk786p6+5BWJr+2UHDRZHrKM4Yi8RLG3tn2NB3gfQHNnNCNfG9VazgV+iJXilM3I/SENLm5D5oJsoKODIfauQMLnrdTS2N/rTzzvbS1bnhvXNIU2ZdMwrbMAYI1FR8Try3uArbx3lGWEVBpwYafLU/MVJfzhy7wVhmAUJaRTk9m38UM/NTTi8NhdIiXn1Z77744tkFMa77ai1LkbCSXB6KP75ELqdUHobdUfFZ29zZPgfdej/N+cfUIco6FGeAeBW9ySGElml/vf5WfCf9nrjVPUQKlkLgifRQCb24ehugc++qGzDEOR3zHKymfhdibVWSoFg9PHScc8+ZZq2myMryTr1Ycj7jBzrB9b3E9NUjsTuRY39CwRh4TBmf82FS4zKRPjtd7DgVnxxNnTTvmxgsZ3d33geRpb87evt5rJOj4Ug32ALxRRK7n0nV+EuGC/FvBrerd6J0CmVGwMQFlEx+92YG5+GRMhl6RVuDNYwJVXjYtoN2p4Ob3XIgOvuk636/xQ9JihBUYrjMkiWF+BzTqDgO4HUO8IlYLfn7FjMz6iXW3412dB/eIgZbs7qwipTMNyRrw4gRy7ObWVC7F4akB83orp0zt8O49SfSheP8xg7W1n2iNQayQ0xvMKS2h++HZWMFqGU4tX1eb2NJV6Sia6klNB4O0egeSF82r05agZnPKQNSO/c8Pa4C6Oe7xBNCMRj3twBJqTrLa2MF4+Xx2+3nDyutIXTh7tiTEopKbpB+7V1sDIdxoy5EPRIe297W8H/e7Sbr1JrXJiC39XTF6YThrCB7sXHKpGgBl1KeNJuWv2pNtHEpwtPIHr2rJzC17uY2kgtGIwT34QQS6k0tSSm1NHj+9rUprqLzAP78PNe8fenw8KuXis1jUn0fmzvzc+P55vLNVgOytgDyOavmw5n9fkpj5abVimw52U/Wqif2BXrXpJRzvgo96M0BQP52tu1GhBW7xfQmsTCFX9bjS9SDAOma0xTnmMsJjSDmNJSorpenldcbFxJ+phL10KbyyXpbScaYlPDJLkXGtNko/sg3eBf+A6DH0gEX9niHlR91lInORZOzXRIVwWzdol8MSy2RbxXfZxJqQsLdFP14BHwWENMDDe0T/cOBLqGxKM5O7OOXT5sJZikXDPW+PnUVnvZJCIlXkEnjunNS5N/q5o5+m9/hv1RzM2nt4MNZlIYkmdNjviYpxyhAWttIDKv8uZhnFsZHx2x5DeRU7edIrpu3HdLQNmHIPpBxhMcRMflsbkNMeYHS5ogSF71+HpWJmqF/hmh8WVE4XlnLA3zkK9c+v55t/ozrGeRrMJHwBkTrwQTxU1gzA3avw+WdACNZmsWZ4hk/MLQwvsl3OkoAlIMIB5mCMVFFKN71OA9h5KMAAqJSopdPejXjjQyu8uAcMLIDADgmwxEU/3Se5eBidRYCAm2jGYuxk+kakcXBIAjC4LvhXyGas4bhHAw6cpFgMtGQx0r6PzrBfBRDwB0a/3gGUdoUTOMHyRLCLdp+vAlfBdhxT2ipcK1otbPNYPC2CG7qrsSFqRtIa3Yml4XNq4whoO1rV1xuI5YokDPALXsolqVAnpulsl3lHCu0KWA4JqBW12QcYu3DhU5DQo9lGzfp4ocEqsGbo85cxQPPro7Y4ikrUAODbF963+TuO9PJ3fvet8u7oHaD6NJjrCbf+6qyIyj0xMVEoBYKRJ21h72hJHuOBDyKg1YT9qKZ8V3xAYQ4amBZIwr0rUG4rL6HeDuexhB6FrdmVBqv8q0i8bgSE4rvysT4Ihiq9I6a2QT3QwE8YX55Vxv2Oglp5QkkzXf4dtguldTEK7sOLUFGbxxyUTJk/hI79UV/PO7tq487SLtxYGrVz/uSY0WwKfwzjo74fru1XXAydrJ1Ad0uxGobKG8VgdGvuAyoHsLbnWCT03bIff5Cs7QsD+TJ6XYEOP6gaHZTw9B7Cj0QW7jggBb3VFpmBUexS8wudrqlIbYvXZnXkNpIazKO0YndDktyl/8mdqCR36Ir6VKF5kOZixOwOJ3s3GxLNNEY3kgSgWBvOzxCt3UlTiF9G6Mdjn8eAPDUE9AeUbe7lQEDYjARA6PQEndj8iCHLb//ZSRMlVdvfGQbBmBdmlSbWpGCASjZlRu2c2ij0FAYiwKcaO6w/Aq+SUThkDZN5xOWq+p5zedr8sxptRdva/puOkOZL8vfDjkk3DN+iZuMXXZVJWyudbV/6zdzsqmflzgHEq/kZuHuYykGkzk4gF77FL/LScGLr6w2MXChUoxMLaplthfghxm3QT+6Y7CG4vkFs7WORm36DNH4wWo4Npp8F3dhrGshrzbv8K3MxdQ64gCT/AlvxQ55aINe3orz3lY5iV/BTgUjfhkI/yAaZRszuoCk3aXvh5RMqxnyriZ0BPNIWQpGE/avEFJn9twJ7uhSuTKoXEc4qPT3h6I8nh9OJJYOfj9kt7uOycpuHffh9HlJyY0HcARiwcviF55yX/qzJ+4o3sOO55h9NGd4i92ifVkEV6FUn+27CpObtb2IdXqi57eav/w4x7VpjevC8M2hpycH63GZqtUAly4XkKDrSsXC+zJjIUidqvo3lT4CyneWJNCVTBjpscDLron1Ov4zQSh2ky2Zbshq3Wf7MH2tJLOsMabb7fvYk1rnta4l/y0k41GR+t89wYbisNMs4dXMvK40JC/PhhskOoLcdVCahGcphJq3FlVqJr2eGb/9rMLXmRSiKjiJKxZF3DK3DWCWYTtSrhm9zq+PhLcZWmtnOxiIC/uzQ/sQoZ7unmWNaWfzpvyysR9dn34WH+t7fH9l/1C8dtuz5XTha48j+mJLxsjy0gC2Kk0ogocT2GVf1lme2c6K5NQlnPLA2WcBeTSyfcjI+FeYcNDLHkQlnLdheQnd43T4JBDQVNAmFfhoPUZPRDmewi1d/2qjkYXwrQ026oZ9twzMD7aPGhocGdFpzcbj1+6uGuL/X9Oc2kg0Xt4lKxqHsJV21CEHjVxfybtaxR6/n0v8MTDH9UIRbdm6Q3r3IFaW0XifsAmNs37VBvbNwj2dapWVFPcBVE0BydFm9bKs+Zbs6/NRuR6USUaIUIO9ak6BjapLj8UdukriYyyZp3p4mwPCeVj/peSIebAXJcyEQTVlHj+6ChW5RS7ndNOkSeQkQsbSAG2Pw6Hv8UFmM9qtCdDpNRe6f3rfrZiHuLt1jfo7KSJ+zcf3nC6kRAryD6fJ095nmGkkIhSvJp3noXW0igFoKfGSmmmUSycUUdR3UnxJYdDjQbnej12JJ8wHxIt1AJLa7WqpK/kDA6SRsUbq9HcyHxOuSdtLzkuJSC/kW2Nu1kmx6ETcpXiEDB39+2xwEhQecjxrfFwNlz1i5S0InSw7iiA3UBD3reZlP2bSuXXjbM79c/FSGLhqTizp5jaLVSi7ba3qfFZz2buPmZhMMroVEqsX9vV5ku7bE0cEy0rsZKnKrtO9XbOmZXULR8OW1izuvBfxW7IODc+LBZc9l8TTFoE5XkCjTb/dpoVaXk+ZyzEhH5rxuxHHDsTMPVr2QOb/xWdgLaKC0J0WUkMsi2/gv9vA1dhcIFS89dNPjzjaLtBhJ4bO3WRBkGo3Rm8Abj7QuR6wECVJajJNitRrUfTLIKKE1AuiZzwubGmSyIioVd9oND/NA4R2Sq676SjQleTalyEZzvd+WPPvkvZO+g8A5CHmSl7+WxohjoT46e/UPFDT/8QRVpVDkzCyQZ+8uZdidoN4sylsTewSyLssNXTIOKZnla/6MXzs4vrrEL3Yv5eW7Betiv2zvDIK0/ek2V0eSlmqwf0qIa1mt+E0NZPmWCtZqAUYbUew6plvfHTYV7Xu5ajWEExLd3QTlCEoUIUjr7Q0zs0/9ift4eB11vJgTaDc34VFTGzY1sd3marbosrCgH20K7Puf46yGetVC2pXN1ebn/2csUsKtgrR2N/uw+RjCPFlo/m2csn/nD8VC/kp3qLJoNxKf1ukXerQLm36oO1vJ7jivDnbOdksr3I7L3kL7zvpn9mh2WdhaH9pQASbeSm3Ud8bFLPJ2PHEUcYXrbtlWdlv/d6BieexYX9s1kuKi3H7ZuGj3rrN/1mhPfGIc8UjR1PLgWzlNlOctYcWEf8S4X8pp7BebbxB7HPXMWghe6eeTpQJmwj8DY6g44wd6FM4hLBv1zTTqgSkoh8PZfmmWmMz1hRJl5zMwntsGU/qXN2x6376Voq19+YcIc7HMl4yGaBB/UzG4pYZNrleP3/i1VL1vVMOYV+8wo8QlxEgjO/2dV/XX+y0y1c4sR1jWd//HnWUzHE57qJ2ty+RnTq3eUXrYCGexgsavRWV2M39wtsjV+IAK7CRHOnEWQFvLywvX6hOn+dDAivvQWP0QM+N7Uybtbnc8lzSZ3m9Yld1RjQ7TXMCcOd6uV2yHUDXm2m5RuBlCFwiQgaIMqumkR9mzgGKLyPj8ihEY89I++8DX6XKRk9fpxWOmRertOb569tXbFLHIu5eL+Qxf3+l6RYQ2qsjJlEHWoELioaWhiLf6i7fDrkPbvnDXBbBYNx19SdTRjON0E8od4cfaA/8prWEth1odhg/WsF75sckv7JTwKvIU6LeAmD61sXr27VLYn8pbs0wFo3MUffIhzatq72eIcgTq5cJIm5mKGxzkN8T5eNiSVxmSllYstHja+5BjZr0TRJrdg0V2A2eY4W0btN0hYX2au3COEI8dY/CWkaLezt96/7oeFKB/BduoJqhQY4etmw4mFbUb1OBbWdQPzJ0z+k3bRT0c6HUKNxD1FHNyuRCydvfObzZrs2nbyXb32+9/lcFaHiYJlPddgZg/0gor3IxsTHa1GL52FNbTl45jBz5dHELrH3fUxYaVP0RDqbRlqptFhIsWkh0p3gUNjEo16W0HJZ017w5Ve0V3LmCM0YvZnS3VUsnUPjN9go0AdjDJJq/3I3unmJH30x2LuLC47LelyehP/Nb8hKNzlrw5IRcWKZMpnr/kVLKlttd1z+ZANcMvxUkL1RqUiHTnusZH8Uh2pKsKg9UhRle0rQgCpa2/K/vzOtfYJsf11bgcZ3dihN76RSsuPvm3Gf+6bR6RzJ+ARHTU9pVWl/7Evmb0bUEcCtWfIP/mEojtkjlIWjS7Yx89Qi2WxPoag6mGdXekATM1cPV6qIXlvPqf45O/N5gke/MPGnCzdsHh5CmwCPs6zYcQqdf0SNMWOZcnrhmWXSDjznZqmr23DiugrXfso7xVlnbae+UAq09N20JpQ2budHWzxHrqx1M1hR1a/nBcm3fSzVJ/x8xrNAc3OEknLsdW4B+6gJmVrBdGl4ndOlvDrJi/Utj9c8Su484KUKLii1EYasDOUQ4Udar2ZFjvS7dshLq2Uf1hFp5+KN4XHib2+tpIA7zSYygzxtaFKbE7zYwuXxy/LB4B","base64")).toString());
@@ -0,0 +1 @@
1
+ export { completeMetadata } from "./mcp.js";
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ export{completeMetadata}from"./mcp.js";
@@ -0,0 +1,17 @@
1
+ import { z } from "zod";
2
+ import type { ToolNames } from "../types/index.js";
3
+ export declare const toolNames: ToolNames;
4
+ export declare const baseSchema: z.ZodObject<{
5
+ id: z.ZodOptional<z.ZodString>;
6
+ mainResearchGoal: z.ZodOptional<z.ZodString>;
7
+ researchGoal: z.ZodOptional<z.ZodString>;
8
+ reasoning: z.ZodOptional<z.ZodString>;
9
+ }, z.core.$strip>;
10
+ export type BaseSchemaShape = typeof baseSchema.shape;
11
+ /**
12
+ * Flat `field -> description` map derived from the Zod `baseSchema`. Consumed by
13
+ * `generateDefaultJson` (serialized verbatim under the `baseSchema` JSON key)
14
+ * and by `buildObject`, which merges these onto each tool's meta fields. Keeps
15
+ * the shipped JSON a plain string map while the source of truth stays Zod.
16
+ */
17
+ export declare const baseSchemaDescriptions: Record<keyof BaseSchemaShape, string>;
@@ -0,0 +1 @@
1
+ import{z as e}from"zod";export const toolNames={GITHUB_SEARCH_CODE:"ghSearchCode",GITHUB_FETCH_CONTENT:"ghGetFileContent",GITHUB_VIEW_REPO_STRUCTURE:"ghViewRepoStructure",GITHUB_SEARCH_REPOSITORIES:"ghSearchRepos",GITHUB_SEARCH_PULL_REQUESTS:"ghHistoryResearch",PACKAGE_SEARCH:"npmSearch",GITHUB_CLONE_REPO:"ghCloneRepo",LOCAL_RIPGREP:"localSearchCode",LOCAL_VIEW_STRUCTURE:"localViewStructure",LOCAL_FIND_FILES:"localFindFiles",LOCAL_FETCH_CONTENT:"localGetFileContent",LSP_GET_SEMANTIC_CONTENT:"lspGetSemantics",LOCAL_BINARY_INSPECT:"localBinaryInspect"};export const baseSchema=e.object({id:e.string().optional().describe("Stable ID to correlate this query with its result in a batch."),mainResearchGoal:e.string().optional().describe("Goal shared by every query in this batch; set once per call."),researchGoal:e.string().optional().describe("Optional: the specific sub-question this query answers."),reasoning:e.string().optional().describe("Optional: why this query advances the goal.")});export const baseSchemaDescriptions=Object.fromEntries(Object.entries(baseSchema.shape).map(([e,t])=>[e,t.description??""]));
@@ -0,0 +1,87 @@
1
+ import { z } from "zod";
2
+ import type { ToolHints, ToolSchema, ToolSpec, ToolType } from "../../types/index.js";
3
+ export declare const MAX_CONTEXT_LINES = 100;
4
+ export declare const MAX_PAGE_NUMBER = 1000;
5
+ export declare const MAX_CHAR_OFFSET = 100000000;
6
+ export declare const MAX_CHAR_LENGTH = 50000;
7
+ export declare const MAX_LINE_NUMBER = 1000000000;
8
+ export declare const MAX_ORDER_HINT = 100000;
9
+ export declare const MAX_LOCAL_DEPTH = 20;
10
+ export declare const MAX_FIND_DEPTH = 100;
11
+ export declare const MAX_LOCAL_LIMIT = 10000;
12
+ export declare const MAX_LOCAL_ITEMS_PER_PAGE = 50;
13
+ export declare const MAX_GITHUB_SEARCH_LIMIT = 100;
14
+ export declare const DEFAULT_GITHUB_SEARCH_LIMIT = 30;
15
+ export declare const MAX_GITHUB_STRUCTURE_ITEMS_PER_PAGE = 200;
16
+ export declare const DEFAULT_GITHUB_STRUCTURE_ITEMS_PER_PAGE = 100;
17
+ export declare const MAX_PR_ITEMS_PER_PAGE = 100;
18
+ export declare const DEFAULT_PR_ITEMS_PER_PAGE = 20;
19
+ export declare const MAX_MATCH_CONTENT_LENGTH = 100000;
20
+ export declare const DEFAULT_MATCH_CONTENT_LENGTH = 500;
21
+ export declare const MAX_MATCH_COUNT = 100000;
22
+ export declare const MAX_SEARCH_ITEMS_PER_PAGE = 1000;
23
+ export declare const MAX_LSP_DEPTH = 20;
24
+ export declare const MAX_LSP_ITEMS_PER_PAGE = 100;
25
+ export declare const MAX_GITHUB_STRUCTURE_DEPTH = 20;
26
+ export declare const MAX_BINARY_ENTRIES = 10000;
27
+ export declare const DEFAULT_BINARY_ENTRIES = 1000;
28
+ export declare const MAX_BINARY_ENTRIES_PER_PAGE = 100;
29
+ export declare const MAX_BINARY_CONTEXT_LINES = 50;
30
+ export declare const DEFAULT_BINARY_CONTEXT_LINES = 3;
31
+ export declare const MAX_STRINGS_MIN_LENGTH = 128;
32
+ export declare const DEFAULT_STRINGS_MIN_LENGTH = 8;
33
+ /**
34
+ * Authoring shape for a tool: the three human-written fields plus its schema.
35
+ * `description` is NOT authored — `defineTool` composes it from the others.
36
+ */
37
+ export interface ToolDefinition {
38
+ readonly name: string;
39
+ readonly type: ToolType;
40
+ readonly shortDescription: string;
41
+ readonly instructions: string;
42
+ readonly schema: ToolSchema;
43
+ readonly hints?: ToolHints;
44
+ }
45
+ /**
46
+ * Build a {@link ToolSpec}, deriving the client-facing `description` as
47
+ * `"{type} | {shortDescription} | {instructions}"`. Clients that only read
48
+ * `description` (e.g. the MCP tool registry) still get the full text, while the
49
+ * three parts stay individually addressable and can't drift out of sync.
50
+ */
51
+ export declare function defineTool(def: ToolDefinition): ToolSpec;
52
+ export declare function intRange(min: number, max: number): z.ZodNumber;
53
+ export declare const StringArray: z.ZodOptional<z.ZodArray<z.ZodString>>;
54
+ export declare function pageNumber(): z.ZodDefault<z.ZodNumber>;
55
+ export declare function optionalPageNumber(): z.ZodOptional<z.ZodNumber>;
56
+ export declare function contextLines(): z.ZodOptional<z.ZodNumber>;
57
+ export declare function lineNumber(): z.ZodOptional<z.ZodNumber>;
58
+ export declare function charOffset(): z.ZodOptional<z.ZodNumber>;
59
+ export declare function charLength(): z.ZodOptional<z.ZodNumber>;
60
+ export declare const metaFields: {
61
+ id: z.ZodOptional<z.ZodString>;
62
+ mainResearchGoal: z.ZodOptional<z.ZodString>;
63
+ researchGoal: z.ZodOptional<z.ZodString>;
64
+ reasoning: z.ZodOptional<z.ZodString>;
65
+ };
66
+ /**
67
+ * Attach the per-field prose from a tool's `schema` map onto its Zod shape,
68
+ * producing the validated query object. This is the single merge point between
69
+ * a tool's content (the prose map) and its scheme (the Zod shape): both live in
70
+ * the same tool file, and this guarantees they stay in lock-step.
71
+ *
72
+ * - `prefix` builds dotted paths (e.g. "content.patches.mode") for nested
73
+ * objects, matching the flat keys default.json ships.
74
+ * - Meta fields are described from `baseSchema`; a field with no entry in the
75
+ * prose map is left undescribed (it simply won't appear in default.json).
76
+ */
77
+ export declare function buildObject<S extends z.ZodRawShape>(prose: ToolSchema, shape: S, prefix?: string): z.ZodObject<S>;
78
+ /** Shared refinement: fullContent / matchString / startLine+endLine are
79
+ * mutually exclusive extraction modes; startLine and endLine must be supplied
80
+ * together; and endLine must be >= startLine. Used by both the local and
81
+ * GitHub file-content readers. */
82
+ export declare function validateFileContentExtractionMode(data: {
83
+ fullContent?: boolean | undefined;
84
+ matchString?: string | undefined;
85
+ startLine?: number | undefined;
86
+ endLine?: number | undefined;
87
+ }, ctx: z.RefinementCtx): void;
@@ -0,0 +1 @@
1
+ import{z as t}from"zod";import{baseSchema as e,baseSchemaDescriptions as n}from"../global.js";export const MAX_CONTEXT_LINES=100;export const MAX_PAGE_NUMBER=1e3;export const MAX_CHAR_OFFSET=1e8;export const MAX_CHAR_LENGTH=5e4;export const MAX_LINE_NUMBER=1e9;export const MAX_ORDER_HINT=1e5;export const MAX_LOCAL_DEPTH=20;export const MAX_FIND_DEPTH=100;export const MAX_LOCAL_LIMIT=1e4;export const MAX_LOCAL_ITEMS_PER_PAGE=50;export const MAX_GITHUB_SEARCH_LIMIT=100;export const DEFAULT_GITHUB_SEARCH_LIMIT=30;export const MAX_GITHUB_STRUCTURE_ITEMS_PER_PAGE=200;export const DEFAULT_GITHUB_STRUCTURE_ITEMS_PER_PAGE=100;export const MAX_PR_ITEMS_PER_PAGE=100;export const DEFAULT_PR_ITEMS_PER_PAGE=20;export const MAX_MATCH_CONTENT_LENGTH=1e5;export const DEFAULT_MATCH_CONTENT_LENGTH=500;export const MAX_MATCH_COUNT=1e5;export const MAX_SEARCH_ITEMS_PER_PAGE=1e3;export const MAX_LSP_DEPTH=20;export const MAX_LSP_ITEMS_PER_PAGE=100;export const MAX_GITHUB_STRUCTURE_DEPTH=20;export const MAX_BINARY_ENTRIES=1e4;export const DEFAULT_BINARY_ENTRIES=1e3;export const MAX_BINARY_ENTRIES_PER_PAGE=100;export const MAX_BINARY_CONTEXT_LINES=50;export const DEFAULT_BINARY_CONTEXT_LINES=3;export const MAX_STRINGS_MIN_LENGTH=128;export const DEFAULT_STRINGS_MIN_LENGTH=8;export function defineTool(t){return{...t,description:`${t.type} | ${t.shortDescription} | ${t.instructions}`}}export function intRange(e,n){return t.number().int().min(e).max(n)}export const StringArray=t.array(t.string()).optional();export function pageNumber(){return intRange(1,1e3).default(1)}export function optionalPageNumber(){return intRange(1,1e3).optional()}export function contextLines(){return intRange(0,100).optional()}export function lineNumber(){return intRange(1,1e9).optional()}export function charOffset(){return intRange(0,1e8).optional()}export function charLength(){return intRange(1,5e4).optional()}export const metaFields=e.shape;const o=new Set(Object.keys(metaFields));export function buildObject(e,r,s=""){const i={};for(const t of Object.keys(r)){const _=r[t],a=s?`${s}.${t}`:t,c=""===s&&o.has(t)?n[a]:e[a];i[t]=c?_.describe(c):_}return t.object(i)}export function validateFileContentExtractionMode(t,e){const n=!0===t.fullContent,o=void 0!==t.matchString,r=void 0!==t.startLine||void 0!==t.endLine;n&&o&&e.addIssue({code:"custom",message:"Cannot use fullContent with matchString — these are mutually exclusive extraction methods.",path:["matchString"]}),n&&r&&e.addIssue({code:"custom",message:"Cannot use fullContent with startLine/endLine — these are mutually exclusive extraction methods.",path:["startLine"]}),o&&r&&e.addIssue({code:"custom",message:"Cannot use matchString with startLine/endLine — these are mutually exclusive extraction methods.",path:["startLine"]}),void 0===t.startLine!=(void 0===t.endLine)&&e.addIssue({code:"custom",message:"startLine and endLine must be provided together — a line range needs both bounds.",path:[void 0===t.startLine?"startLine":"endLine"]}),void 0!==t.startLine&&void 0!==t.endLine&&t.endLine<t.startLine&&e.addIssue({code:"custom",message:"Invalid line range: endLine must be greater than or equal to startLine.",path:["endLine"]})}
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ import type { ToolSpec } from "../../types/index.js";
3
+ export declare const ghCloneRepo: ToolSpec;
4
+ export declare const CloneRepoQuerySchema: z.ZodObject<{
5
+ owner: z.ZodString;
6
+ repo: z.ZodString;
7
+ branch: z.ZodOptional<z.ZodString>;
8
+ sparsePath: z.ZodOptional<z.ZodString>;
9
+ forceRefresh: z.ZodOptional<z.ZodBoolean>;
10
+ id: z.ZodOptional<z.ZodString>;
11
+ mainResearchGoal: z.ZodOptional<z.ZodString>;
12
+ researchGoal: z.ZodOptional<z.ZodString>;
13
+ reasoning: z.ZodOptional<z.ZodString>;
14
+ }, z.core.$strip>;
15
+ export declare const BulkCloneRepoSchema: z.ZodObject<{
16
+ queries: z.ZodArray<z.ZodObject<{
17
+ owner: z.ZodString;
18
+ repo: z.ZodString;
19
+ branch: z.ZodOptional<z.ZodString>;
20
+ sparsePath: z.ZodOptional<z.ZodString>;
21
+ forceRefresh: z.ZodOptional<z.ZodBoolean>;
22
+ id: z.ZodOptional<z.ZodString>;
23
+ mainResearchGoal: z.ZodOptional<z.ZodString>;
24
+ researchGoal: z.ZodOptional<z.ZodString>;
25
+ reasoning: z.ZodOptional<z.ZodString>;
26
+ }, z.core.$strip>>;
27
+ }, z.core.$strip>;
@@ -0,0 +1 @@
1
+ import{z as e}from"zod";import{buildObject as o,defineTool as t,metaFields as r}from"./_toolkit.js";export const ghCloneRepo=t({name:"ghCloneRepo",type:"Github",shortDescription:"Clone a GitHub repo or subtree locally for repeated reads, search, or LSP.",instructions:'Availability: needs ENABLE_LOCAL + ENABLE_CLONE; when off, use ghViewRepoStructure + ghGetFileContent(type:"file") instead.\nBest practice: prefer this over repeated ghGetFileContent when doing LSP analysis, searching many files, or when remote reads get expensive — clone once, then drive local tools against the returned localPath.\nsparsePath clones a single subdirectory (faster on large monorepos); it must exist — verify with ghViewRepoStructure first. Clones are shallow (no history); forceRefresh bypasses the cache.\nBatch repos in one queries:[...] call.\nNext: localViewStructure(path=localPath) to orient, then localSearchCode / localGetFileContent / lspGetSemantics on files inside localPath.',schema:{owner:"Repository owner or org.",repo:"Repository name, without the owner.",branch:"Branch, tag, or commit SHA to clone. Omit to use the repository's default branch.",forceRefresh:"Re-clones from GitHub, bypassing the 24h cache, instead of serving the cached clone.",sparsePath:'Repo-relative subdirectory to sparse-clone (e.g. "packages/foo") — faster on large monorepos. Must exist (verify with ghViewRepoStructure first). Omit for a full shallow clone.'}});export const CloneRepoQuerySchema=o(ghCloneRepo.schema,{...r,owner:e.string(),repo:e.string(),branch:e.string().optional(),sparsePath:e.string().optional(),forceRefresh:e.boolean().optional()});export const BulkCloneRepoSchema=e.object({queries:e.array(CloneRepoQuerySchema).min(1).describe("Batch of clone queries to run in one call (at least one).")});
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ import type { ToolSpec } from "../../types/index.js";
3
+ export declare const ghGetFileContent: ToolSpec;
4
+ export declare const FileContentQuerySchema: z.ZodObject<{
5
+ owner: z.ZodString;
6
+ repo: z.ZodString;
7
+ branch: z.ZodOptional<z.ZodString>;
8
+ path: z.ZodString;
9
+ startLine: z.ZodOptional<z.ZodNumber>;
10
+ endLine: z.ZodOptional<z.ZodNumber>;
11
+ fullContent: z.ZodOptional<z.ZodBoolean>;
12
+ matchString: z.ZodOptional<z.ZodString>;
13
+ matchStringIsRegex: z.ZodOptional<z.ZodBoolean>;
14
+ matchStringCaseSensitive: z.ZodOptional<z.ZodBoolean>;
15
+ forceRefresh: z.ZodOptional<z.ZodBoolean>;
16
+ type: z.ZodDefault<z.ZodEnum<{
17
+ file: "file";
18
+ directory: "directory";
19
+ }>>;
20
+ contextLines: z.ZodDefault<z.ZodNumber>;
21
+ charOffset: z.ZodOptional<z.ZodNumber>;
22
+ charLength: z.ZodOptional<z.ZodNumber>;
23
+ minify: z.ZodDefault<z.ZodEnum<{
24
+ none: "none";
25
+ standard: "standard";
26
+ symbols: "symbols";
27
+ }>>;
28
+ id: z.ZodOptional<z.ZodString>;
29
+ mainResearchGoal: z.ZodOptional<z.ZodString>;
30
+ researchGoal: z.ZodOptional<z.ZodString>;
31
+ reasoning: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strip>;
@@ -0,0 +1 @@
1
+ import{z as e}from"zod";import{buildObject as t,charLength as n,charOffset as i,defineTool as a,intRange as r,lineNumber as s,MAX_CONTEXT_LINES as o,metaFields as l,validateFileContentExtractionMode as h}from"./_toolkit.js";export const ghGetFileContent=a({name:"ghGetFileContent",type:"Github",shortDescription:"Read a file or a specific region from a GitHub repository.",instructions:'Choose one extraction mode (mutually exclusive): matchString, startLine+endLine, fullContent, or default (first window from line 1) — see those fields.\nBest practice: start minify:"symbols" to orient on an unknown file, then read with "standard", or "none" to quote/diff exactly.\ntype:"directory" materializes a subtree locally for LSP work (needs server clone enabled) — otherwise use ghViewRepoStructure.\nSignals: isPartial:true → next charOffset is in hints[] (\'charOffset=N\'); matchRanges[].start/end are 1-based lines → pass as lineHint to lspGetSemantics; warnings[] → content sanitized or symbols fell back to standard.\nNext: lspGetSemantics(uri, symbolName, lineHint=matchRanges[0].start) for semantics; re-read startLine/endLine for the full matched body; ghSearchCode for usages. Batch known paths in one queries:[...] call.',schema:{owner:"Repository owner or org.",repo:"Repository name, without the owner.",branch:"Branch, tag, or commit SHA to read from. Omit to use the repository's default branch.",path:"Repo-relative file path — exact case, no leading slash (e.g. src/utils/foo.ts).",startLine:"First line of the range. Required together with endLine — sending only one is an error. Mutually exclusive with fullContent and matchString.",endLine:"Last line of the range; must be >= startLine. Required together with startLine. Mutually exclusive with fullContent and matchString.",fullContent:"Returns the whole file. Reserve for files known to be small; for large files use matchString or startLine/endLine. Mutually exclusive with both.",matchString:'Anchor text (or regex) to locate; all occurrences come back as merged slices, with matchRanges[].start/end as 1-based line numbers you can pass as lineHint to lspGetSemantics. Case-insensitive unless matchStringCaseSensitive:true; treated as regex when matchStringIsRegex:true. Mutually exclusive with startLine/endLine and fullContent; ignored when minify:"symbols".',matchStringIsRegex:"Treats matchString as a regex — use for flexible anchors like function signatures or import patterns.",matchStringCaseSensitive:"Makes matchString matching case-sensitive (case-insensitive otherwise).",forceRefresh:"Bypasses the server cache and re-fetches from GitHub. Use when you need the latest commit, not a cached snapshot.",type:"What to read. 'file' reads one file. 'directory' materializes a subtree to a local path for LSP work — only when the server has clone enabled; otherwise use ghViewRepoStructure.",contextLines:"Extra source lines returned around each matchString hit. Raise to capture a full function body without a follow-up read. Applies only with matchString.",charOffset:"Continuation offset for the next page; take it from hints[] in the prior response ('charOffset=N') — do not compute it yourself.",charLength:"Page size in characters. Raise for large files; check isPartial:true for truncation.",minify:'"symbols": structural skeleton with line numbers in the gutter — much smaller. Use this first to orient on any unknown file before reading its body. Skips matchString and charLength. "standard": strips comments and blank lines. "none": exact raw text — use when quoting or matching whitespace precisely.'}});export const FileContentQuerySchema=t(ghGetFileContent.schema,{...l,owner:e.string(),repo:e.string(),branch:e.string().optional(),path:e.string(),startLine:s(),endLine:s(),fullContent:e.boolean().optional(),matchString:e.string().optional(),matchStringIsRegex:e.boolean().optional(),matchStringCaseSensitive:e.boolean().optional(),forceRefresh:e.boolean().optional(),type:e.enum(["file","directory"]).default("file"),contextLines:r(0,o).default(5),charOffset:i(),charLength:n(),minify:e.enum(["none","standard","symbols"]).default("standard")}).superRefine(h);
@@ -0,0 +1,133 @@
1
+ import { z } from "zod";
2
+ import type { ToolSpec } from "../../types/index.js";
3
+ export declare const ghHistoryResearch: ToolSpec;
4
+ export declare const GitHubPullRequestSearchQuerySchema: z.ZodObject<{
5
+ type: z.ZodDefault<z.ZodEnum<{
6
+ prs: "prs";
7
+ commits: "commits";
8
+ }>>;
9
+ since: z.ZodOptional<z.ZodString>;
10
+ until: z.ZodOptional<z.ZodString>;
11
+ path: z.ZodOptional<z.ZodString>;
12
+ branch: z.ZodOptional<z.ZodString>;
13
+ perPage: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
14
+ includeDiff: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
15
+ keywordsToSearch: z.ZodOptional<z.ZodArray<z.ZodString>>;
16
+ query: z.ZodOptional<z.ZodString>;
17
+ prNumber: z.ZodOptional<z.ZodNumber>;
18
+ owner: z.ZodOptional<z.ZodString>;
19
+ repo: z.ZodOptional<z.ZodString>;
20
+ concise: z.ZodOptional<z.ZodBoolean>;
21
+ state: z.ZodOptional<z.ZodEnum<{
22
+ open: "open";
23
+ closed: "closed";
24
+ merged: "merged";
25
+ }>>;
26
+ assignee: z.ZodOptional<z.ZodString>;
27
+ author: z.ZodOptional<z.ZodString>;
28
+ commenter: z.ZodOptional<z.ZodString>;
29
+ involves: z.ZodOptional<z.ZodString>;
30
+ mentions: z.ZodOptional<z.ZodString>;
31
+ "review-requested": z.ZodOptional<z.ZodString>;
32
+ "reviewed-by": z.ZodOptional<z.ZodString>;
33
+ label: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
34
+ milestone: z.ZodOptional<z.ZodString>;
35
+ language: z.ZodOptional<z.ZodString>;
36
+ checks: z.ZodOptional<z.ZodEnum<{
37
+ success: "success";
38
+ failure: "failure";
39
+ pending: "pending";
40
+ }>>;
41
+ review: z.ZodOptional<z.ZodEnum<{
42
+ none: "none";
43
+ approved: "approved";
44
+ changes_requested: "changes_requested";
45
+ required: "required";
46
+ }>>;
47
+ locked: z.ZodOptional<z.ZodBoolean>;
48
+ visibility: z.ZodOptional<z.ZodEnum<{
49
+ public: "public";
50
+ private: "private";
51
+ }>>;
52
+ "team-mentions": z.ZodOptional<z.ZodString>;
53
+ project: z.ZodOptional<z.ZodString>;
54
+ "no-label": z.ZodOptional<z.ZodBoolean>;
55
+ "no-milestone": z.ZodOptional<z.ZodBoolean>;
56
+ "no-project": z.ZodOptional<z.ZodBoolean>;
57
+ "no-assignee": z.ZodOptional<z.ZodBoolean>;
58
+ head: z.ZodOptional<z.ZodString>;
59
+ base: z.ZodOptional<z.ZodString>;
60
+ created: z.ZodOptional<z.ZodString>;
61
+ updated: z.ZodOptional<z.ZodString>;
62
+ closed: z.ZodOptional<z.ZodString>;
63
+ "merged-at": z.ZodOptional<z.ZodString>;
64
+ comments: z.ZodOptional<z.ZodString>;
65
+ reactions: z.ZodOptional<z.ZodString>;
66
+ interactions: z.ZodOptional<z.ZodString>;
67
+ draft: z.ZodOptional<z.ZodBoolean>;
68
+ match: z.ZodOptional<z.ZodArray<z.ZodEnum<{
69
+ comments: "comments";
70
+ title: "title";
71
+ body: "body";
72
+ }>>>;
73
+ sort: z.ZodOptional<z.ZodEnum<{
74
+ created: "created";
75
+ updated: "updated";
76
+ "best-match": "best-match";
77
+ comments: "comments";
78
+ reactions: "reactions";
79
+ }>>;
80
+ order: z.ZodOptional<z.ZodEnum<{
81
+ asc: "asc";
82
+ desc: "desc";
83
+ }>>;
84
+ limit: z.ZodDefault<z.ZodNumber>;
85
+ page: z.ZodDefault<z.ZodNumber>;
86
+ archived: z.ZodOptional<z.ZodBoolean>;
87
+ filePage: z.ZodOptional<z.ZodNumber>;
88
+ commentPage: z.ZodOptional<z.ZodNumber>;
89
+ commitPage: z.ZodOptional<z.ZodNumber>;
90
+ itemsPerPage: z.ZodDefault<z.ZodNumber>;
91
+ reviewMode: z.ZodOptional<z.ZodLiteral<"full">>;
92
+ content: z.ZodOptional<z.ZodObject<{
93
+ metadata: z.ZodOptional<z.ZodBoolean>;
94
+ body: z.ZodOptional<z.ZodBoolean>;
95
+ changedFiles: z.ZodOptional<z.ZodBoolean>;
96
+ patches: z.ZodOptional<z.ZodObject<{
97
+ mode: z.ZodDefault<z.ZodEnum<{
98
+ none: "none";
99
+ selected: "selected";
100
+ all: "all";
101
+ }>>;
102
+ files: z.ZodOptional<z.ZodArray<z.ZodString>>;
103
+ ranges: z.ZodOptional<z.ZodArray<z.ZodObject<{
104
+ file: z.ZodString;
105
+ additions: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
106
+ deletions: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
107
+ }, z.core.$strip>>>;
108
+ }, z.core.$strip>>;
109
+ comments: z.ZodOptional<z.ZodObject<{
110
+ discussion: z.ZodOptional<z.ZodBoolean>;
111
+ reviewInline: z.ZodOptional<z.ZodBoolean>;
112
+ includeBots: z.ZodDefault<z.ZodBoolean>;
113
+ file: z.ZodOptional<z.ZodString>;
114
+ }, z.core.$strip>>;
115
+ reviews: z.ZodOptional<z.ZodBoolean>;
116
+ commits: z.ZodOptional<z.ZodObject<{
117
+ list: z.ZodOptional<z.ZodBoolean>;
118
+ includeFiles: z.ZodOptional<z.ZodBoolean>;
119
+ }, z.core.$strip>>;
120
+ }, z.core.$strip>>;
121
+ matchString: z.ZodOptional<z.ZodString>;
122
+ commentBodyOffset: z.ZodOptional<z.ZodNumber>;
123
+ charOffset: z.ZodOptional<z.ZodNumber>;
124
+ charLength: z.ZodOptional<z.ZodNumber>;
125
+ minify: z.ZodDefault<z.ZodEnum<{
126
+ none: "none";
127
+ standard: "standard";
128
+ }>>;
129
+ id: z.ZodOptional<z.ZodString>;
130
+ mainResearchGoal: z.ZodOptional<z.ZodString>;
131
+ researchGoal: z.ZodOptional<z.ZodString>;
132
+ reasoning: z.ZodOptional<z.ZodString>;
133
+ }, z.core.$strip>;
@@ -0,0 +1 @@
1
+ import{z as e}from"zod";import{buildObject as t,charLength as o,charOffset as n,DEFAULT_GITHUB_SEARCH_LIMIT as a,DEFAULT_PR_ITEMS_PER_PAGE as i,defineTool as s,intRange as r,MAX_GITHUB_SEARCH_LIMIT as l,MAX_LINE_NUMBER as c,MAX_PR_ITEMS_PER_PAGE as m,metaFields as d,optionalPageNumber as p,pageNumber as h,StringArray as u}from"./_toolkit.js";export const ghHistoryResearch=s({name:"ghHistoryResearch",type:"Github",shortDescription:"Search and read GitHub pull requests and commit history.",instructions:'Two modes in one tool — set type.\ntype:"prs": LIST mode (no prNumber) searches PRs by keyword/author/label/date/review/CI and returns lean metadata; re-call with prNumber for DETAIL mode (body, changedFiles, patches, comments, reviews, commits). reviewMode:"full" fetches all surfaces at once (commit list yes, per-commit files no). content/reviewMode are ignored without prNumber.\ntype:"commits": owner+repo plus optional path (file), path ending "/" (subtree), or no path (whole repo) → commit log; since/until, author, includeDiff refine it. A commit messageHeadline often embeds "#N" — re-call with prNumber:N for the full PR.\nFilters other than since/until/path/branch/perPage/includeDiff apply to PR mode only.\nBest practice: triage with concise:true (lean lists), then deep-read one prNumber. For "which PR introduced X" use state:"merged" sort:"created" order:"asc". Keep responses small with content.patches.mode:"selected" + files/ranges, charLength, and itemsPerPage.\nPagination: body/patches use charOffset; comment bodies use commentBodyOffset; file/comment/commit lists are page-based — contentPagination reports each surface\'s hasMore and a ready nextQuery.\nSignals: bodyEmpty=requested but empty; an absent field=surface not requested (not missing data); bodyPreview/filePathsPreview=samples returned when the full surface wasn\'t requested.\nNext: ghGetFileContent(owner, repo, path, branch=commit/merge SHA) to read a changed file at its ref; ghSearchCode for usages of changed symbols; ghSearchRepos when owner/repo is unknown.',schema:{type:'Mode selector. "prs": search or deep-read pull requests. "commits": file or repo commit history — use owner+repo+path.',keywordsToSearch:"Keywords combined across title/body/comments (multi-word terms are auto phrase-quoted). Pair with match to restrict scope. Ignored in commits mode.",query:'Raw GitHub search string appended verbatim after keywords. Use for exact phrases ("Partial Prerendering"), qualifiers (label:bug), or anything not exposed as a first-class field. Ignored in commits mode.',match:'Fields to match keywords against: "title", "body", "comments". Default searches all three. Use ["title"] for the most precise and fastest match.',prNumber:"Direct PR lookup by number. Required to fetch body, files, patches, comments, reviews, or commits — content/reviewMode are silently ignored without it. Requires owner+repo.",owner:"Repository owner or org (required for commits mode; optional but recommended for PR search).",repo:"Repository name, without the owner (required for commits mode).",concise:'List mode: prefer true by default to triage — a flat list of "#number title" strings; then re-call with prNumber to deep-read the chosen PR. Omit only when you need structured PR objects to compare or filter. Ignored with prNumber (detail mode).',state:'"open" | "closed" | "merged" (maps to is:merged — merged only). Ignored in commits mode.',author:"PR author or commit author filter.",assignee:"Assigned user filter.",commenter:"User who commented on the PR.",involves:"Any user involvement — author, assignee, mention, or commenter.",mentions:"User mentioned via @mention in the PR.","review-requested":"User or team whose review was requested.","reviewed-by":"User who reviewed the PR.",label:'Label name or array. Example: "bug", ["enhancement","breaking"].',milestone:'Milestone title (exact match). Example: "v2.0".',language:'Repository language filter. Example: "typescript", "rust".',checks:'"success" (all CI passed) | "failure" (any failed) | "pending" (running).',review:'"approved" | "changes_requested" | "required" (pending) | "none" (no reviews yet).',locked:"true = only locked conversations; false = only unlocked.",visibility:'"public" or "private" — filter by repo visibility.',"team-mentions":'Filter PRs that mention a GitHub team. Format: "org/team-slug".',project:'Filter PRs linked to a project board. Format: "owner/project-number".',"no-label":"Filter to PRs without any labels.","no-milestone":"Filter to PRs without a milestone.","no-project":"Filter to PRs without a project.","no-assignee":"Filter to PRs without an assignee.",head:"Source branch filter. Example: feature/my-branch.",base:'Target branch filter. Example: "main".',created:'Creation date filter. Format: ">2024-01-01", "<2023-06-01", "2023-01-01..2024-01-01".',updated:"Last updated filter (tracks comments, pushes). Same date format as created.",closed:"Closed date filter. Same format as created.","merged-at":"Merged date filter. Same format as created.",since:'Commit start date (commits mode only). ISO 8601. Example: "2024-01-01T00:00:00Z".',until:"Commit end date (commits mode only). ISO 8601.",path:'File path or directory prefix (commits mode). Omit for whole-repo history. A trailing "/" scopes to a directory subtree.',branch:"Branch name or SHA to walk history from (commits mode). Defaults to the repo default branch.",perPage:"Commits per page (commits mode).",includeDiff:"Per-commit file diffs (additions, deletions, patch) in commits mode. Increases size — use sparingly.",comments:'SEARCH FILTER: comment-count range qualifier. Example: ">5", "0..10". Not for fetching PR comment content — use content.comments for that.',reactions:'SEARCH FILTER: reaction-count range qualifier. Example: ">10".',interactions:'SEARCH FILTER: combined comment+reaction count. Example: ">20".',draft:"true: drafts only; false: non-drafts only; omit: both.",archived:"Include PRs from archived repositories. Defaults to false.",sort:'"created" (newest), "updated" (recently active), "comments" (most discussed), "reactions" (most reacted), "best-match" (relevance).',order:'"desc" (newest/highest first), "asc" (oldest/lowest first). Pair asc+sort:created for archaeology.',limit:"PR results per page (list mode).",page:"Result page for list-mode PR search. Use only on hasMore:true.",filePage:"Page the changed-files list on contentPagination.changedFiles.hasMore.",commentPage:"Page PR comments on contentPagination.comments.hasMore.",commitPage:"Page PR-bound commits on contentPagination.commits.hasMore.",itemsPerPage:"Items per page for file, comment, and commit lists.",reviewMode:'"full": fetch all content surfaces in one call — body + changedFiles + patches (mode:"all") + comments + reviews + commit list. Per-commit file changes are NOT included; add content.commits.includeFiles:true for those. Only valid with prNumber.',content:"Content selector (detail mode only, needs prNumber). Select only what you need — each surface adds size.","content.metadata":"Ensure PR metadata fields (number, title, state, author, dates) are included.","content.body":"Full PR description text. Paginated via charOffset/charLength. Check contentPagination.body.hasMore for continuation.","content.changedFiles":"File list: path, status, additions, deletions. Paginated via filePage.","content.patches":"Diff/patch selector.","content.patches.mode":'"none" (no diffs), "selected" (targeted files/ranges — cheapest), "all" (every diff). Use selected + files/ranges to read specific files without fetching the entire diff.',"content.patches.files":'Non-empty list of file paths to fetch when mode:"selected". Example: ["src/foo.ts","src/bar.ts"].',"content.patches.ranges":'Per-file line ranges for mode:"selected". Each entry: { file, additions?: number[], deletions?: number[] }. Narrows that file\'s diff to the hunks covering the listed added/deleted line numbers.',"content.patches.ranges.file":"File path for this entry.","content.patches.ranges.additions":"Added-line numbers to include.","content.patches.ranges.deletions":"Deleted-line numbers to include.","content.comments":"PR comment selector.","content.comments.discussion":"Include PR-level discussion comments.","content.comments.reviewInline":"Include inline code review comments. in_reply_to_id marks replies in a thread.","content.comments.includeBots":"Set true to include CI/bot comments (Vercel preview, CodeRabbit, etc.).","content.comments.file":"Filter inline comments to a single file path.","content.reviews":"Review summaries: APPROVED / CHANGES_REQUESTED state per reviewer.","content.commits":'PR-bound commit selector. These are commits that belong to the PR — not the repo commit log (use type:"commits" for that).',"content.commits.list":"Commit list: sha, message, author, date.","content.commits.includeFiles":"Per-commit file change list (path, status, additions, deletions).",matchString:"Substring filter — narrows patch/body/comment text to sections containing this string.",charOffset:"Char window start for body or patch content. Advance to contentPagination.body.nextQuery.charOffset when hasMore:true.",commentBodyOffset:"Char window start for comment bodies. Advance to contentPagination.commentBody.nextQuery.commentBodyOffset when hasMore:true.",charLength:"Char window size for body, patches, and comment bodies.",minify:'"standard": strips blank lines and comment-only lines from patches — smaller responses. "none": raw exact diff text — use when quoting or matching whitespace. "symbols" is not available for PR content.'}});const f=ghHistoryResearch.schema;export const GitHubPullRequestSearchQuerySchema=t(f,{...d,type:e.enum(["prs","commits"]).default("prs"),since:e.string().optional(),until:e.string().optional(),path:e.string().optional(),branch:e.string().optional(),perPage:r(1,100).optional().default(30),includeDiff:e.boolean().optional().default(!1),keywordsToSearch:e.array(e.string()).optional(),query:e.string().optional(),prNumber:r(1,c).optional(),owner:e.string().optional(),repo:e.string().optional(),concise:e.boolean().optional(),state:e.enum(["open","closed","merged"]).optional(),assignee:e.string().optional(),author:e.string().optional(),commenter:e.string().optional(),involves:e.string().optional(),mentions:e.string().optional(),"review-requested":e.string().optional(),"reviewed-by":e.string().optional(),label:e.union([e.string(),e.array(e.string())]).optional(),milestone:e.string().optional(),language:e.string().optional(),checks:e.enum(["success","failure","pending"]).optional(),review:e.enum(["approved","changes_requested","required","none"]).optional(),locked:e.boolean().optional(),visibility:e.enum(["public","private"]).optional(),"team-mentions":e.string().optional(),project:e.string().optional(),"no-label":e.boolean().optional(),"no-milestone":e.boolean().optional(),"no-project":e.boolean().optional(),"no-assignee":e.boolean().optional(),head:e.string().optional(),base:e.string().optional(),created:e.string().optional(),updated:e.string().optional(),closed:e.string().optional(),"merged-at":e.string().optional(),comments:e.string().optional(),reactions:e.string().optional(),interactions:e.string().optional(),draft:e.boolean().optional(),match:e.array(e.enum(["title","body","comments"])).optional(),sort:e.enum(["created","updated","best-match","comments","reactions"]).optional(),order:e.enum(["asc","desc"]).optional(),limit:r(1,l).default(a),page:h(),archived:e.boolean().optional(),filePage:p(),commentPage:p(),commitPage:p(),itemsPerPage:r(1,m).default(i),reviewMode:e.literal("full").optional(),content:t(f,{metadata:e.boolean().optional(),body:e.boolean().optional(),changedFiles:e.boolean().optional(),patches:t(f,{mode:e.enum(["none","selected","all"]).default("none"),files:u,ranges:e.array(t(f,{file:e.string(),additions:e.array(r(1,c)).optional(),deletions:e.array(r(1,c)).optional()},"content.patches.ranges")).optional()},"content.patches").optional(),comments:t(f,{discussion:e.boolean().optional(),reviewInline:e.boolean().optional(),includeBots:e.boolean().default(!1),file:e.string().optional()},"content.comments").optional(),reviews:e.boolean().optional(),commits:t(f,{list:e.boolean().optional(),includeFiles:e.boolean().optional()},"content.commits").optional()},"content").optional(),matchString:e.string().optional(),commentBodyOffset:n(),charOffset:n(),charLength:o(),minify:e.enum(["none","standard"]).default("standard")}).superRefine((e,t)=>{const o=e.content?.patches;if(!o)return;const n=(o.files?.length??0)>0,a=(o.ranges?.length??0)>0,i=n||a;"selected"!==o.mode||i||t.addIssue({code:"custom",message:'content.patches.mode="selected" requires non-empty files or ranges.',path:["content","patches","files"]}),"selected"!==o.mode&&i&&t.addIssue({code:"custom",message:'content.patches.files and content.patches.ranges require mode="selected".',path:["content","patches","mode"]})});
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ import type { ToolSpec } from "../../types/index.js";
3
+ export declare const ghSearchCode: ToolSpec;
4
+ export declare const GitHubCodeSearchQuerySchema: z.ZodObject<{
5
+ keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
6
+ owner: z.ZodOptional<z.ZodString>;
7
+ repo: z.ZodOptional<z.ZodString>;
8
+ extension: z.ZodOptional<z.ZodString>;
9
+ filename: z.ZodOptional<z.ZodString>;
10
+ path: z.ZodOptional<z.ZodString>;
11
+ language: z.ZodOptional<z.ZodString>;
12
+ match: z.ZodDefault<z.ZodEnum<{
13
+ file: "file";
14
+ path: "path";
15
+ }>>;
16
+ limit: z.ZodDefault<z.ZodNumber>;
17
+ page: z.ZodDefault<z.ZodNumber>;
18
+ concise: z.ZodOptional<z.ZodBoolean>;
19
+ id: z.ZodOptional<z.ZodString>;
20
+ mainResearchGoal: z.ZodOptional<z.ZodString>;
21
+ researchGoal: z.ZodOptional<z.ZodString>;
22
+ reasoning: z.ZodOptional<z.ZodString>;
23
+ }, z.core.$strip>;
@@ -0,0 +1 @@
1
+ import{z as e}from"zod";import{buildObject as t,DEFAULT_GITHUB_SEARCH_LIMIT as n,defineTool as a,intRange as o,MAX_GITHUB_SEARCH_LIMIT as i,metaFields as r,pageNumber as s,StringArray as h}from"./_toolkit.js";export const ghSearchCode=a({name:"ghSearchCode",type:"Github",shortDescription:"Search code contents or file paths across GitHub repositories.",instructions:'Deprecation: GitHub is sunsetting this search API (~Sep 2026) — prefer ghGetFileContent/ghViewRepoStructure for known paths.\nBest practice: start with match:"path" to confirm a file exists (cheap, no snippets), then read it; use match:"file" only when you need content snippets.\nmatchIndices are offsets WITHIN the snippet, not file line numbers — never pass them as lineHint; get a real lineHint from ghGetFileContent(matchString=same-keyword).\nCaps: ~20 reachable matches per search, default-branch only. On "unreachable matches", narrow by owner/repo/path/extension/filename instead of paging; pass a non-default ref via ghGetFileContent/ghViewRepoStructure.\nEmpty with owner+repo usually means the repo isn\'t indexed (new/private) — fall back to ghGetFileContent with a known path.\nNext: ghGetFileContent(path, matchString=same-keyword) to read; ghViewRepoStructure for context; ghSearchRepos when owner/repo is unknown.',schema:{keywords:"Search terms, all ANDed — every term must appear in a match. One concept per array item; keep a multi-word phrase as one item. Send unrelated alternatives as separate query objects in one queries:[...] call (max 5 per call), not separate tool calls. To find a file by name, use match:'path'.",owner:"Scopes the search to a user/org. Alone it spans all their repos; with repo it targets one repository.",repo:"Repository name without the owner. Requires owner — sending it alone returns a scope error.",extension:'File extension to match, without the leading dot ("ts"). Combines with keywords.',language:'GitHub language qualifier (e.g. "TypeScript", "Python"). Uses GitHub\'s language detection, so it is broader than extension — it covers every extension mapped to that language.',filename:'Matches by file name (equals or contains). Prefer over keywords when you already know the name, e.g. "Button.tsx" or "jest.config".',path:"Matches repo paths beginning with this directory prefix (GitHub path: qualifier) — a prefix, not a full file path.",match:'"file" searches file contents and returns snippets with matchIndices. "path" searches only file paths/names — no snippets, far cheaper; use it to confirm a file exists before reading it.',limit:"Results to return per page.",page:"Result page to fetch. GitHub serves at most 1000 results (~10 pages).",concise:'Prefer true by default to orient: a flat list of "owner/repo:path" strings (no snippets), the cheapest way to locate files; then ghGetFileContent(path) to read. Omit only when you need the snippet objects with matchIndices to compare matches.'}});export const GitHubCodeSearchQuerySchema=t(ghSearchCode.schema,{...r,keywords:h,owner:e.string().optional(),repo:e.string().optional(),extension:e.string().optional(),filename:e.string().optional(),path:e.string().optional(),language:e.string().optional(),match:e.enum(["file","path"]).default("file"),limit:o(1,i).default(n),page:s(),concise:e.boolean().optional()});