@inkeep/open-knowledge 0.2.0 → 0.4.0-beta.6

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 (503) hide show
  1. package/dist/THIRD_PARTY_NOTICES.md +6097 -0
  2. package/dist/alias-JE7RI5QX-Bia4gLMF.mjs +1 -0
  3. package/dist/assets/skills/open-knowledge/SKILL.md +347 -0
  4. package/dist/awk2-POPGKRAI-DDrFV-7v.mjs +1 -0
  5. package/dist/banner-DdbR6AZr.mjs +3 -0
  6. package/dist/base64-4YMZCVJ5-DDKKOjMm.mjs +1 -0
  7. package/dist/basename-AA2KJYZQ-BK5zVs3W.mjs +1 -0
  8. package/dist/bash-IJWYRKFO-B9r1a0X9.mjs +1 -0
  9. package/dist/build-B6buVrsB.mjs +2 -0
  10. package/dist/cat-RDUMLXKC-CeNrSElK.mjs +1 -0
  11. package/dist/chmod-SYMGL4JA-DFJ4ylQU.mjs +1 -0
  12. package/dist/chokidar-CxU7f6JW.mjs +4 -0
  13. package/dist/chunk-24IMIIXA-B6yIPkk2.mjs +2 -0
  14. package/dist/chunk-3THT3N7L-DztAF386.mjs +2 -0
  15. package/dist/chunk-3ZUFRYJ4-qsYuZX7b.mjs +2 -0
  16. package/dist/chunk-44UOCSGV-CaFxJDHm.mjs +2 -0
  17. package/dist/chunk-4GTNDTRF-PuLVuVJW.mjs +8 -0
  18. package/dist/chunk-4HHKTUW3-CQ53AiA_.mjs +3 -0
  19. package/dist/chunk-4Q4SM6WR-BlQvqCag.mjs +5 -0
  20. package/dist/chunk-55VFSPNA-DLwfww5b.mjs +3 -0
  21. package/dist/chunk-5QMZ5MUS-CAp625aG.mjs +5 -0
  22. package/dist/chunk-5QVNJEHU-dbrKfPGl.mjs +9 -0
  23. package/dist/chunk-5V6VZH6T-DMPvCPbn.mjs +2 -0
  24. package/dist/chunk-62RKD26F-B9la0pfD.mjs +21 -0
  25. package/dist/chunk-64BAICW3-D92CLSK-.mjs +2 -0
  26. package/dist/chunk-74CEPOFO-BcZUJMO1.mjs +23 -0
  27. package/dist/chunk-7L36YK2X-D7Z_Qw_C.mjs +3 -0
  28. package/dist/chunk-7TSDKFEO-DUQhJkDy.mjs +2 -0
  29. package/dist/chunk-A4HU7SVR-DKLaJeys.mjs +3 -0
  30. package/dist/chunk-A4JSPFCI-CEm2r8SB.mjs +7 -0
  31. package/dist/chunk-A5O5YHGN-DvJz5Cpw.mjs +2 -0
  32. package/dist/chunk-A65PWWJC-DV6RO_es.mjs +3 -0
  33. package/dist/chunk-A7A2DBEE-dTNL-45u.mjs +7 -0
  34. package/dist/chunk-A7ICOL4V-BvXPAaHu.mjs +14 -0
  35. package/dist/chunk-ALLTKNUZ-Cu6JFoC4.mjs +6 -0
  36. package/dist/chunk-APT7OOP2-DmUrFuRy.mjs +2 -0
  37. package/dist/chunk-BBXLRYSX-K758HlCs.mjs +6 -0
  38. package/dist/chunk-BRGMQKJV-BXc-9Cgj.mjs +63 -0
  39. package/dist/chunk-CR5AFCPT-DxNsgM0M.mjs +24 -0
  40. package/dist/chunk-CWQS3NFK-Co4ALolT.mjs +2 -0
  41. package/dist/chunk-D4J545R4-DkHLjHX6.mjs +12 -0
  42. package/dist/chunk-D6CWQ5DW-7lvT8dGP.mjs +6 -0
  43. package/dist/chunk-D7MEQ3VN-D8jJZr4A.mjs +5 -0
  44. package/dist/chunk-DCAAORBQ-C3s1D8OY.mjs +2 -0
  45. package/dist/chunk-DXB73IDG-DIKSLkPq.mjs +2 -0
  46. package/dist/chunk-EEXR5ZDP-CETL3_Uw.mjs +3 -0
  47. package/dist/chunk-EIZGF4BS-DOoQW9jQ.mjs +9 -0
  48. package/dist/chunk-F23WWYKW-BK2tpXPf.mjs +17 -0
  49. package/dist/chunk-F55TLFGB-Vy5RU2P3.mjs +10 -0
  50. package/dist/chunk-FEIOJCZD-C25Und0M.mjs +75 -0
  51. package/dist/chunk-FK9Q3tQk.mjs +1 -0
  52. package/dist/chunk-GCTKCWKD-Di-RB9Qt.mjs +4 -0
  53. package/dist/chunk-GFQRA5P5-DnjwTqP3.mjs +8 -0
  54. package/dist/chunk-GOV5EKKI-CKV9jOGv.mjs +10 -0
  55. package/dist/chunk-GXVXFKBA-CUKDClxt.mjs +6 -0
  56. package/dist/chunk-HDQ56CKY-MTQ75a8z.mjs +16 -0
  57. package/dist/chunk-HJQJAYMS-D-8Vc6Zb.mjs +3 -0
  58. package/dist/chunk-HJWBQKYG-XrOcsn2f.mjs +6 -0
  59. package/dist/chunk-HWBSOZZR-BZF8XsyZ.mjs +37 -0
  60. package/dist/chunk-HWKDQ44K-wgmyck2O.mjs +4 -0
  61. package/dist/chunk-I57KEIP3-DipCOPKf.mjs +11 -0
  62. package/dist/chunk-IPJHKYVM-C3IodQq7.mjs +2 -0
  63. package/dist/chunk-J642UCRS-YiNealfn.mjs +2 -0
  64. package/dist/chunk-JVPRLUMK-VMFWXimu.mjs +8 -0
  65. package/dist/chunk-KMEYNNUA-pRogdye4.mjs +16 -0
  66. package/dist/chunk-LL3S3NLB-ByBS5IDP.mjs +2 -0
  67. package/dist/chunk-LPQPILI2-FRQB9gt5.mjs +12 -0
  68. package/dist/chunk-LTZRCH7N-46S7WKw8.mjs +32 -0
  69. package/dist/chunk-LWEGUNWT-DdGmM3wr.mjs +8 -0
  70. package/dist/chunk-MDDMCKUK-CuRdI1Uv.mjs +7 -0
  71. package/dist/chunk-MDLLFABN-Wd1iVjXi.mjs +73 -0
  72. package/dist/chunk-MHTUABJP-BWrqic3t.mjs +9 -0
  73. package/dist/chunk-MIZPJHVH-DWdPvcYR.mjs +8 -0
  74. package/dist/chunk-MLXIYONF-CiCzoeGt.mjs +16 -0
  75. package/dist/chunk-MYE6AGBJ-DJo74dVC.mjs +17 -0
  76. package/dist/chunk-NAERJDUW-CIHrNgJB.mjs +9 -0
  77. package/dist/chunk-NCNPKYJZ-BVljycUZ.mjs +3 -0
  78. package/dist/chunk-NUYSJFDK-BTseBdxv.mjs +8 -0
  79. package/dist/chunk-NYQYO467-BgXuDHUQ.mjs +33 -0
  80. package/dist/chunk-OARHFVLG-Cr0x3Si_.mjs +21 -0
  81. package/dist/chunk-OCLXQMOG-BW6rwyzS.mjs +7 -0
  82. package/dist/chunk-OCS6LSEM-D7VAOziZ.mjs +14 -0
  83. package/dist/chunk-OJDRYQWQ-ikvLWpfV.mjs +2 -0
  84. package/dist/chunk-OL3S66CO-CQnF8cPH.mjs +100 -0
  85. package/dist/chunk-PBXLG62G-CgbPJTiw.mjs +9 -0
  86. package/dist/chunk-PP6PSHAB-CO4MYU__.mjs +5 -0
  87. package/dist/chunk-PYSFUGCK-DsRn64Ef.mjs +11 -0
  88. package/dist/chunk-QCDB2VPH-BUMOhlW7.mjs +7 -0
  89. package/dist/chunk-QJ7O6ZN3-F0_rcDPM.mjs +6 -0
  90. package/dist/chunk-R6QSAL5T-CeW6f7-x.mjs +2 -0
  91. package/dist/chunk-R6VWJ2ZL-FwG_Za20.mjs +2 -0
  92. package/dist/chunk-RPNGRAAP-BmkapBPD.mjs +8 -0
  93. package/dist/chunk-SDNKECQQ-DkebEzkd.mjs +6 -0
  94. package/dist/chunk-SYMJJMQ4-DOZMaECk.mjs +22 -0
  95. package/dist/chunk-T56QNPHK-DPXaSSfC.mjs +15 -0
  96. package/dist/chunk-TLSUDHID-BovZg0r1.mjs +7 -0
  97. package/dist/chunk-TOMNU26N-AAglMy4J.mjs +5 -0
  98. package/dist/chunk-TXBZCHCQ-WeVWfqYv.mjs +6 -0
  99. package/dist/chunk-UNYNJIFU-CqGlXAg7.mjs +140 -0
  100. package/dist/chunk-V7TAPXDL-DQgGPvBY.mjs +28 -0
  101. package/dist/chunk-VJFXDYWH-DIo0Ia0_.mjs +11 -0
  102. package/dist/chunk-VLGZJRPG-DymOu90-.mjs +17 -0
  103. package/dist/chunk-VOBGTVA6-Bfa1NTzt.mjs +7 -0
  104. package/dist/chunk-VYOJP4TV-PBsHe2md.mjs +14 -0
  105. package/dist/chunk-WKFATFPP-KO2zkfs2.mjs +5 -0
  106. package/dist/chunk-X2AJGDEF-D5w6wtaX.mjs +2 -0
  107. package/dist/chunk-XHM67O4N-akBjDPaR.mjs +2 -0
  108. package/dist/chunk-XKQRETAK-RHzVmuiF.mjs +2 -0
  109. package/dist/chunk-XORM457F-wr_DBBnV.mjs +288 -0
  110. package/dist/chunk-XVDPCNWR-DxaG1FfA.mjs +12 -0
  111. package/dist/chunk-YCFVLTST-Dzwevuc3.mjs +13 -0
  112. package/dist/chunk-YFG2CMIF-BoZQym0L.mjs +5 -0
  113. package/dist/chunk-YNYSPYQ5-DesxOVHh.mjs +34 -0
  114. package/dist/chunk-YS3AZT3J-CBc9LHIy.mjs +9 -0
  115. package/dist/chunk-YTNYSM6T-WMIf3AF8.mjs +12 -0
  116. package/dist/chunk-Z6LRHWXI-DGTVoTuf.mjs +14 -0
  117. package/dist/chunk-Z7JVV2SM-Cb4YKOCM.mjs +12 -0
  118. package/dist/clear-5CZ5X4YR-CadVxKrq.mjs +1 -0
  119. package/dist/cli.mjs +61 -593
  120. package/dist/colors-BNufdynn.mjs +2 -0
  121. package/dist/colors-T3xmlXQT.mjs +1 -0
  122. package/dist/column-WLPMMSTS-6o4DDsDk.mjs +1 -0
  123. package/dist/comm-5SLSESQG-C2GatHU6.mjs +1 -0
  124. package/dist/config-schema.json +87 -0
  125. package/dist/config.project-local.schema.json +30 -0
  126. package/dist/config.project.schema.json +59 -0
  127. package/dist/config.user.schema.json +58 -0
  128. package/dist/constants-Dc6GZ6j9.mjs +2 -0
  129. package/dist/cp-XOYR4ABJ-DmS6dER-.mjs +1 -0
  130. package/dist/curl-47BFPSFW-C2kRcGkX.mjs +26 -0
  131. package/dist/cut-OPC3VAGB-s4tQWhL5.mjs +1 -0
  132. package/dist/date-DD7FVA2V-Dubgjr6a.mjs +1 -0
  133. package/dist/diff-HJF2MPDN-DjGBLQph.mjs +1 -0
  134. package/dist/dirname-LEMTZZFS-B477CImE.mjs +1 -0
  135. package/dist/dist-B6pNPboH.mjs +1609 -0
  136. package/dist/dist-DVM7wH81.mjs +359 -0
  137. package/dist/dist-DXLSMgBY.mjs +1 -0
  138. package/dist/dist-bundle-BSdjl7Rj.mjs +2 -0
  139. package/dist/dist-bundle-BmF5_Mcp.mjs +1 -0
  140. package/dist/du-WO2ENHXQ-C4c5wweW.mjs +1 -0
  141. package/dist/echo-O45JWWI2-TudodhHR.mjs +1 -0
  142. package/dist/env-5EPCWSXR-CTcNEMpy.mjs +1 -0
  143. package/dist/esm-BbkJd7ro.mjs +2 -0
  144. package/dist/esm-CEs3LWY3.mjs +20 -0
  145. package/dist/execAsync-CulVJBMN.mjs +2 -0
  146. package/dist/execAsync-CzW9fUYQ.mjs +2 -0
  147. package/dist/execAsync-DuQoqWaW.mjs +2 -0
  148. package/dist/expand-DTNXU4LQ-BT6M2Tdc.mjs +1 -0
  149. package/dist/expansion-ENLSRCXJ-Cy7j--Iy.mjs +1 -0
  150. package/dist/expr-5T3UU5KE-D2Kr5nuJ.mjs +1 -0
  151. package/dist/file-ZIGAJ4YS-BH3jYcuM.mjs +1 -0
  152. package/dist/find-TPUOAIUQ-RFxkUcGN.mjs +1 -0
  153. package/dist/flag-coverage-QT4N2Z44--nNG-HLV.mjs +2 -0
  154. package/dist/fold-LDSORVYE-CfKQmrJ1.mjs +1 -0
  155. package/dist/getMachineId-bsd-DAmB-Ym0.mjs +2 -0
  156. package/dist/getMachineId-bsd-FYDP9w5Q.mjs +2 -0
  157. package/dist/getMachineId-bsd-mPrX3ckm.mjs +2 -0
  158. package/dist/getMachineId-darwin-B0Qw-MTj.mjs +3 -0
  159. package/dist/getMachineId-darwin-C79HtyON.mjs +3 -0
  160. package/dist/getMachineId-darwin-Co8Jnu5v.mjs +3 -0
  161. package/dist/getMachineId-linux-BBORs2cS.mjs +2 -0
  162. package/dist/getMachineId-linux-BizmCjYq.mjs +2 -0
  163. package/dist/getMachineId-linux-BvLCCmKQ.mjs +2 -0
  164. package/dist/getMachineId-unsupported-Bgp-Es9j.mjs +2 -0
  165. package/dist/getMachineId-unsupported-CbR45h2D.mjs +2 -0
  166. package/dist/getMachineId-unsupported-DbGFOAw1.mjs +2 -0
  167. package/dist/getMachineId-win-CT_Y5i_4.mjs +2 -0
  168. package/dist/getMachineId-win-Cy0XHq4X.mjs +2 -0
  169. package/dist/getMachineId-win-D5gDnBHa.mjs +2 -0
  170. package/dist/git-handle-DwfYp_z--CfyPz4Dz.mjs +10 -0
  171. package/dist/git-handle-DwfYp_z--DreW3fNC.mjs +1 -0
  172. package/dist/grep-3AIAIJVR-DgQJLmW0.mjs +1 -0
  173. package/dist/gzip-AQXSGOVS-yXjpnIVd.mjs +1 -0
  174. package/dist/head-HT2B6D2J-BR4RHRTk.mjs +1 -0
  175. package/dist/help-VVWX7SA5-M6C6klSC.mjs +1 -0
  176. package/dist/history-J4QRNGRO-C1r7-kvT.mjs +1 -0
  177. package/dist/hostname-BK6HG2DE-BBBcRrtV.mjs +1 -0
  178. package/dist/html-to-markdown-TFCECAGV-B9oYuMVf.mjs +1 -0
  179. package/dist/index.d.mts +52 -76
  180. package/dist/index.mjs +1 -1
  181. package/dist/init-B7qJnXKB.mjs +397 -0
  182. package/dist/init-DiH9oQ6_.mjs +1 -0
  183. package/dist/{is-object-WgQ3abDo.mjs → is-object-DF0ZeuvD.mjs} +1 -1
  184. package/dist/join-GG2LDHE5-xeTE0Mi4.mjs +1 -0
  185. package/dist/jq-ODXZBPLY-C5v6qNu_.mjs +1 -0
  186. package/dist/js-exec-M6UR76J5-IyD-lpzv.mjs +97 -0
  187. package/dist/lib-BOCdCkg7.mjs +2 -0
  188. package/dist/libesm-YL3Bqolr.mjs +14 -0
  189. package/dist/ln-4TRFBYAT-4XMTO1OQ.mjs +1 -0
  190. package/dist/loader-BQf8AJXb.mjs +4 -0
  191. package/dist/loader-C8lkPKn8.mjs +1 -0
  192. package/dist/ls-KSXFZCWH-Bw_Cf-VY.mjs +1 -0
  193. package/dist/lzma-vr8hBkhz.mjs +2 -0
  194. package/dist/md5sum-INMIK4DX-CAIH4ZVI.mjs +1 -0
  195. package/dist/mkdir-TDEMSB6C-D1oUG8Jf.mjs +1 -0
  196. package/dist/mrmime-C2W7cgq2.mjs +2 -0
  197. package/dist/mv-Z6MORUFL-CN471qcL.mjs +1 -0
  198. package/dist/nl-U5YJDM32-CFzXKze3.mjs +1 -0
  199. package/dist/od-VJEF2UR5-C2R4Accu.mjs +1 -0
  200. package/dist/{open-browser-rbaiEzUy.mjs → open-browser-BZZK_gJj.mjs} +1 -1
  201. package/dist/paste-7N6AFSDS-bUl2Dwz3.mjs +1 -0
  202. package/dist/preview-CN1rHXBb.mjs +1 -0
  203. package/dist/preview-DUTos2Es.mjs +3 -0
  204. package/dist/printf-CX64KX2P-Ce--gWAq.mjs +1 -0
  205. package/dist/public/assets/ActivityModeContent-1ymqlcHI.js +2 -0
  206. package/dist/public/assets/ActivityPanelDiffView-DoHWP1ak.js +13 -0
  207. package/dist/public/assets/ActivityPanelDiffView-legcy4jI.css +1 -0
  208. package/dist/public/assets/DocumentContext-bvfr7pL2.js +37 -0
  209. package/dist/public/assets/GraphPanel-DdVygxYk.js +46 -0
  210. package/dist/public/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  211. package/dist/public/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  212. package/dist/public/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  213. package/dist/public/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  214. package/dist/public/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  215. package/dist/public/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  216. package/dist/public/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  217. package/dist/public/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  218. package/dist/public/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  219. package/dist/public/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  220. package/dist/public/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  221. package/dist/public/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  222. package/dist/public/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  223. package/dist/public/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  224. package/dist/public/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  225. package/dist/public/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  226. package/dist/public/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  227. package/dist/public/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  228. package/dist/public/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  229. package/dist/public/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  230. package/dist/public/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  231. package/dist/public/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  232. package/dist/public/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  233. package/dist/public/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  234. package/dist/public/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  235. package/dist/public/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  236. package/dist/public/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  237. package/dist/public/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  238. package/dist/public/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  239. package/dist/public/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  240. package/dist/public/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  241. package/dist/public/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  242. package/dist/public/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  243. package/dist/public/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  244. package/dist/public/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  245. package/dist/public/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  246. package/dist/public/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  247. package/dist/public/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  248. package/dist/public/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  249. package/dist/public/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  250. package/dist/public/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  251. package/dist/public/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  252. package/dist/public/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  253. package/dist/public/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  254. package/dist/public/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  255. package/dist/public/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  256. package/dist/public/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  257. package/dist/public/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  258. package/dist/public/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  259. package/dist/public/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  260. package/dist/public/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  261. package/dist/public/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  262. package/dist/public/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  263. package/dist/public/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  264. package/dist/public/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  265. package/dist/public/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  266. package/dist/public/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  267. package/dist/public/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  268. package/dist/public/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  269. package/dist/public/assets/McpConsentDialogBody-CJwPf_uv.js +1 -0
  270. package/dist/public/assets/OutlinePanel-dumodx-h.js +2 -0
  271. package/dist/public/assets/SettingsPane-CtgbQZxP.js +6 -0
  272. package/dist/public/assets/SourceEditor-CR_7DOAH.js +2 -0
  273. package/dist/public/assets/__vite-browser-external-FEGw1XPd.js +1 -0
  274. package/dist/public/assets/_baseFor-CX8dsZbW.js +1 -0
  275. package/dist/public/assets/agent-presence-Ds2n3U5P.js +1 -0
  276. package/dist/public/assets/arc-BL_OKZmE.js +1 -0
  277. package/dist/public/assets/architecture-YZFGNWBL-DVxNz-zn.js +1 -0
  278. package/dist/public/assets/architectureDiagram-Q4EWVU46-BKKtWWhU.js +36 -0
  279. package/dist/public/assets/array-X0JlPOfd.js +1 -0
  280. package/dist/public/assets/blockDiagram-DXYQGD6D-fzO4vZye.js +132 -0
  281. package/dist/public/assets/button-BsFpqlpT.js +1 -0
  282. package/dist/public/assets/c4Diagram-AHTNJAMY-BkXqEjiP.js +10 -0
  283. package/dist/public/assets/channel-CR-xJel6.js +1 -0
  284. package/dist/public/assets/chunk-2KRD3SAO-DQj0pw3H.js +1 -0
  285. package/dist/public/assets/chunk-336JU56O-CBajDulv.js +2 -0
  286. package/dist/public/assets/chunk-426QAEUC-BoBKbVmN.js +1 -0
  287. package/dist/public/assets/chunk-4BX2VUAB-D8pbSOlJ.js +1 -0
  288. package/dist/public/assets/chunk-4TB4RGXK-mA6CujZO.js +206 -0
  289. package/dist/public/assets/chunk-55IACEB6-CqVyNzhX.js +1 -0
  290. package/dist/public/assets/chunk-5FUZZQ4R-BVDLgFg2.js +62 -0
  291. package/dist/public/assets/chunk-5PVQY5BW-Cxi5d3lT.js +2 -0
  292. package/dist/public/assets/chunk-67CJDMHE-CdrAY8qZ.js +1 -0
  293. package/dist/public/assets/chunk-7N4EOEYR-CJ3HBg3c.js +1 -0
  294. package/dist/public/assets/chunk-AA7GKIK3-D0ckJAXt.js +1 -0
  295. package/dist/public/assets/chunk-BSJP7CBP-D4bNhKd7.js +1 -0
  296. package/dist/public/assets/chunk-CFjPhJqf.js +1 -0
  297. package/dist/public/assets/chunk-CIAEETIT-D1Fpp2md.js +1 -0
  298. package/dist/public/assets/chunk-EDXVE4YY-ChhT3Iyo.js +1 -0
  299. package/dist/public/assets/chunk-ENJZ2VHE-Bby39so4.js +10 -0
  300. package/dist/public/assets/chunk-FMBD7UC4-pRkDIOZn.js +15 -0
  301. package/dist/public/assets/chunk-FOC6F5B3-BsB4oTj4.js +1 -0
  302. package/dist/public/assets/chunk-ICPOFSXX-CrnuSfeJ.js +122 -0
  303. package/dist/public/assets/chunk-K5T4RW27-CtREah_n.js +94 -0
  304. package/dist/public/assets/chunk-KGLVRYIC-DtDxSfKu.js +1 -0
  305. package/dist/public/assets/chunk-LIHQZDEY-D63TRk6j.js +1 -0
  306. package/dist/public/assets/chunk-ORNJ4GCN-Dv2PvYVu.js +1 -0
  307. package/dist/public/assets/chunk-OYMX7WX6-BhfqKepC.js +231 -0
  308. package/dist/public/assets/chunk-QZHKN3VN-DBRWHtgj.js +1 -0
  309. package/dist/public/assets/chunk-U2HBQHQK-6BAKH95D.js +70 -0
  310. package/dist/public/assets/chunk-X2U36JSP-Cqpkx90-.js +1 -0
  311. package/dist/public/assets/chunk-XPW4576I-DSytTnq4.js +32 -0
  312. package/dist/public/assets/chunk-YZCP3GAM-Dt9awjVh.js +1 -0
  313. package/dist/public/assets/chunk-ZZ45TVLE-JGFITgiO.js +1 -0
  314. package/dist/public/assets/classDiagram-6PBFFD2Q-oopM_Z0m.js +1 -0
  315. package/dist/public/assets/classDiagram-v2-HSJHXN6E-ZAL74u9S.js +1 -0
  316. package/dist/public/assets/clone-C5y6xhRJ.js +1 -0
  317. package/dist/public/assets/colors-XIJoz9Bd.js +1 -0
  318. package/dist/public/assets/compiler-runtime-CVnuRdak.js +1 -0
  319. package/dist/public/assets/config-validation-events-BvuBj41U.js +1 -0
  320. package/dist/public/assets/cose-bilkent-S5V4N54A-B9nG-SHi.js +1 -0
  321. package/dist/public/assets/cytoscape.esm-BkjNfcSF.js +321 -0
  322. package/dist/public/assets/dagre-BEdPLXba.js +1 -0
  323. package/dist/public/assets/dagre-KV5264BT-DKn5nGCC.js +4 -0
  324. package/dist/public/assets/defaultLocale-ZxyFnXCb.js +1 -0
  325. package/dist/public/assets/diagram-5BDNPKRD-BQuwYEd0.js +10 -0
  326. package/dist/public/assets/diagram-G4DWMVQ6-BmzIMyV5.js +24 -0
  327. package/dist/public/assets/diagram-MMDJMWI5-CI5eJfgr.js +43 -0
  328. package/dist/public/assets/diagram-TYMM5635-Cc8TJ7v3.js +24 -0
  329. package/dist/public/assets/dialog-Cv1qneWl.js +45 -0
  330. package/dist/public/assets/dist-B4kUko7n.js +9 -0
  331. package/dist/public/assets/dist-BH1b1nWB.js +1 -0
  332. package/dist/public/assets/dist-BOapDt7N.js +1 -0
  333. package/dist/public/assets/dist-CIRuNcH5.js +1 -0
  334. package/dist/public/assets/dist-D08h1pJc.js +1 -0
  335. package/dist/public/assets/dist-S8LJmtzL.js +1 -0
  336. package/dist/public/assets/dist-VyzSEzD4.js +1 -0
  337. package/dist/public/assets/dist-nPpvoMNC.js +13 -0
  338. package/dist/public/assets/doc-hash-Q6dTjwu5.js +421 -0
  339. package/dist/public/assets/erDiagram-SMLLAGMA-BkrhGWMT.js +85 -0
  340. package/dist/public/assets/flatten-UmyAv3V9.js +1 -0
  341. package/dist/public/assets/flowDiagram-DWJPFMVM-qh62fanI.js +162 -0
  342. package/dist/public/assets/ganttDiagram-T4ZO3ILL-DXuCeCk6.js +292 -0
  343. package/dist/public/assets/gitGraph-7Q5UKJZL-CYhZlmk3.js +1 -0
  344. package/dist/public/assets/gitGraphDiagram-UUTBAWPF-BbcuenPj.js +106 -0
  345. package/dist/public/assets/graphlib-CasrTmMJ.js +1 -0
  346. package/dist/public/assets/image-preview-BJSGEOo4.png +0 -0
  347. package/dist/public/assets/index-B1y9QLHF.js +1858 -0
  348. package/dist/public/assets/index-DoXig4bf.css +1 -0
  349. package/dist/public/assets/info-OMHHGYJF-BslcKZhH.js +1 -0
  350. package/dist/public/assets/infoDiagram-42DDH7IO-WFAMbO2S.js +2 -0
  351. package/dist/public/assets/init-CBj3ecIW.js +1 -0
  352. package/dist/public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  353. package/dist/public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  354. package/dist/public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  355. package/dist/public/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  356. package/dist/public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  357. package/dist/public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  358. package/dist/public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  359. package/dist/public/assets/isEmpty-DWJlzxR1.js +1 -0
  360. package/dist/public/assets/isObjectLike-AdQZ65l0.js +1 -0
  361. package/dist/public/assets/isSymbol-BP7IOIqG.js +1 -0
  362. package/dist/public/assets/ishikawaDiagram-UXIWVN3A-BJBiReWg.js +70 -0
  363. package/dist/public/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  364. package/dist/public/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  365. package/dist/public/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  366. package/dist/public/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  367. package/dist/public/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  368. package/dist/public/assets/journeyDiagram-VCZTEJTY-Boq77pl6.js +139 -0
  369. package/dist/public/assets/kanban-definition-6JOO6SKY-DYMSr18F.js +89 -0
  370. package/dist/public/assets/katex-qwlL5fSd.js +257 -0
  371. package/dist/public/assets/line-_p5Px7MV.js +1 -0
  372. package/dist/public/assets/linear-DwuDS4qT.js +1 -0
  373. package/dist/public/assets/mcp-consent-store-BBTXqzE6.js +1 -0
  374. package/dist/public/assets/mermaid-parser.core-BcBb_Ows.js +4 -0
  375. package/dist/public/assets/mermaid.core-ZLTnLqVQ.js +11 -0
  376. package/dist/public/assets/min-HKuGSUqa.js +1 -0
  377. package/dist/public/assets/mindmap-definition-QFDTVHPH-BSxM4djR.js +96 -0
  378. package/dist/public/assets/now-BBH4UqDm.js +1 -0
  379. package/dist/public/assets/ordinal-CeOFUmRv.js +1 -0
  380. package/dist/public/assets/packet-4T2RLAQJ-QVnYA304.js +1 -0
  381. package/dist/public/assets/panel-BgMqDESF.js +1 -0
  382. package/dist/public/assets/path-rUlDLHdA.js +1 -0
  383. package/dist/public/assets/pdf-a35ddrIO.js +54 -0
  384. package/dist/public/assets/pdf.worker-B1D2UnXD.mjs +63133 -0
  385. package/dist/public/assets/pdf.worker-CM-zAFN-.js +1 -0
  386. package/dist/public/assets/pie-ZZUOXDRM-C61c5byc.js +1 -0
  387. package/dist/public/assets/pieDiagram-DEJITSTG-CHRE_Jie.js +30 -0
  388. package/dist/public/assets/preload-helper-2ej06EnG.js +1 -0
  389. package/dist/public/assets/propagation-api-qAYD7s-v.js +1 -0
  390. package/dist/public/assets/quadrantDiagram-34T5L4WZ-CQkE5TwH.js +7 -0
  391. package/dist/public/assets/radar-PYXPWWZC-CMxjRtd8.js +1 -0
  392. package/dist/public/assets/reduce-DotyoGA7.js +1 -0
  393. package/dist/public/assets/requirementDiagram-MS252O5E-DHK98tKS.js +84 -0
  394. package/dist/public/assets/rough.esm-BFJ-MgcB.js +1 -0
  395. package/dist/public/assets/sankeyDiagram-XADWPNL6-BIXaStZh.js +10 -0
  396. package/dist/public/assets/sequenceDiagram-FGHM5R23-BCNH3kJo.js +157 -0
  397. package/dist/public/assets/src-C9jsS3p4.js +1 -0
  398. package/dist/public/assets/src-zyMpT2LE.js +1 -0
  399. package/dist/public/assets/stateDiagram-FHFEXIEX-BC5mjB6x.js +1 -0
  400. package/dist/public/assets/stateDiagram-v2-QKLJ7IA2-B8L3BBt1.js +1 -0
  401. package/dist/public/assets/stex-BKMR5xQj.js +1 -0
  402. package/dist/public/assets/target-navigation-intent-BfGOumP6.js +1 -0
  403. package/dist/public/assets/telemetry-impl-CMeDUVKn.js +2 -0
  404. package/dist/public/assets/timeline-definition-GMOUNBTQ-VNxUGgXp.js +120 -0
  405. package/dist/public/assets/tooltip-CBGDOTMI.js +1 -0
  406. package/dist/public/assets/trace-api-DPMyR1_m.js +1 -0
  407. package/dist/public/assets/treeView-SZITEDCU-DfSa_Oiv.js +1 -0
  408. package/dist/public/assets/treemap-W4RFUUIX-Cp0s5wEq.js +1 -0
  409. package/dist/public/assets/vennDiagram-DHZGUBPP-DV2Y2j0r.js +34 -0
  410. package/dist/public/assets/video-preview-vLovc_Vy.png +0 -0
  411. package/dist/public/assets/w3c-keyname-Dfj2imOv.js +1 -0
  412. package/dist/public/assets/wardley-RL74JXVD-CXcBKCuj.js +1 -0
  413. package/dist/public/assets/wardleyDiagram-NUSXRM2D-C1mMZ3kx.js +20 -0
  414. package/dist/public/assets/xychartDiagram-5P7HB3ND-CxFcwN2X.js +7 -0
  415. package/dist/public/favicon.svg +19 -4
  416. package/dist/public/index.html +57 -4
  417. package/dist/pwd-D4OZ7N27-C18XewhV.mjs +1 -0
  418. package/dist/python3-AUFTPCU6-BaJugIdp.mjs +12 -0
  419. package/dist/readlink-MI4GCHJF-CHvs7DDT.mjs +1 -0
  420. package/dist/rev-XOSYPP45-2mnFFZWW.mjs +1 -0
  421. package/dist/rg-FOQSCCX3-BJahNfSe.mjs +1 -0
  422. package/dist/rm-RTZG23RL-D9-0WGRY.mjs +1 -0
  423. package/dist/rmdir-XTQXT7RK-Br7eH9kL.mjs +1 -0
  424. package/dist/rolldown-runtime-twds-ZHy-Dxr-RWJs.mjs +2 -0
  425. package/dist/schemas/v0/config.project-local.schema.json +30 -0
  426. package/dist/schemas/v0/config.project.schema.json +59 -0
  427. package/dist/schemas/v0/config.user.schema.json +58 -0
  428. package/dist/sed-VFTTATXJ-mYhAmixc.mjs +1 -0
  429. package/dist/seq-RN5ZUASB-CKf5MNNO.mjs +1 -0
  430. package/dist/server-lock-D7DXNVql-B5nINglj.mjs +1 -0
  431. package/dist/server-lock-D7DXNVql-BRVVzA6T.mjs +2 -0
  432. package/dist/sha1sum-VJPNLNU6-DuOHap1X.mjs +1 -0
  433. package/dist/sha256sum-PI32XWXY-D9fEipQ7.mjs +1 -0
  434. package/dist/sleep-VZFPZFWA-B1fSoYuO.mjs +1 -0
  435. package/dist/sort-DCNRDA7U-DDCY4JZu.mjs +1 -0
  436. package/dist/split-SITCSYCZ-b9hfEJw7.mjs +1 -0
  437. package/dist/sqlite3-56UMWEY3-BQEx5i3P.mjs +1 -0
  438. package/dist/src-Cak39c0B.mjs +1 -0
  439. package/dist/start-BXk7J0Kh.mjs +1 -0
  440. package/dist/start-D6Ip3u6P.mjs +3 -0
  441. package/dist/stat-BT5A227F-Dzp4sgau.mjs +1 -0
  442. package/dist/strings-7PLOGTPD-DT41jX9d.mjs +1 -0
  443. package/dist/tac-SJGXQ4T2-BpdVoP8b.mjs +1 -0
  444. package/dist/tail-S5ULNTJU-0-sYrYik.mjs +1 -0
  445. package/dist/tar-ANUBEFJY-Wh3na_NU.mjs +1 -0
  446. package/dist/tee-O7VXZDCO-CwnGG0go.mjs +1 -0
  447. package/dist/time-DEUO3QV2-DzkqaQ1k.mjs +1 -0
  448. package/dist/timeout-VRKMCG72-BtPBpIRq.mjs +1 -0
  449. package/dist/touch-DX2IJOQ4-KW0Ui-lB.mjs +1 -0
  450. package/dist/tr-2HXZRDSW-C6Kf0M8T.mjs +1 -0
  451. package/dist/tree-LYXBS7DC-BN1FBqvM.mjs +1 -0
  452. package/dist/true-WHJNXCHG-DxCMVdqj.mjs +1 -0
  453. package/dist/unexpand-RGTMIGZM-DZ4Kf6Xq.mjs +1 -0
  454. package/dist/uniq-SUNANL47-Ceg51JdA.mjs +1 -0
  455. package/dist/wc-TQB3VNOX-BzWNq0MY.mjs +1 -0
  456. package/dist/which-XZHEH76L-DH_U2-Cj.mjs +1 -0
  457. package/dist/whoami-DGKU3D2X-BholYNPM.mjs +1 -0
  458. package/dist/xan-BXDXYEIB-b1eAtgch.mjs +1 -0
  459. package/dist/xan-view-ECQUO7AJ-DWDC57b_.mjs +1 -0
  460. package/dist/xargs-I6EZUCYF-Cov-i7kW.mjs +1 -0
  461. package/dist/yq-MJMAR36V-1r29nH4p.mjs +1 -0
  462. package/package.json +25 -19
  463. package/scripts/build-config-schema.mjs +69 -0
  464. package/scripts/postinstall.mjs +33 -0
  465. package/scripts/probe-exec.ts +98 -0
  466. package/scripts/probe-read-document.ts +100 -0
  467. package/dist/banner-De2a4ivv.mjs +0 -3
  468. package/dist/colors-C2vrt_OY.mjs +0 -1
  469. package/dist/colors-CshxhXdR.mjs +0 -2
  470. package/dist/constants-yNFhYMHH.mjs +0 -2
  471. package/dist/git-handle-B5vQdmjQ.mjs +0 -2
  472. package/dist/git-handle-DGTzeK-H.mjs +0 -1
  473. package/dist/init-BFZ4vnnX.mjs +0 -1
  474. package/dist/init-BH38QtfV.mjs +0 -6
  475. package/dist/init-BzEVODBI.mjs +0 -230
  476. package/dist/init-DCZhpKSO.mjs +0 -1
  477. package/dist/keepalive-Bp0nJiwT.mjs +0 -2
  478. package/dist/loader-CoGCjTcI.mjs +0 -3
  479. package/dist/loader-D8pf7fi6.mjs +0 -1
  480. package/dist/paths-C7TuvND0.mjs +0 -2
  481. package/dist/paths-CWTmBbr0.mjs +0 -1
  482. package/dist/preview-C-NvAf2r.mjs +0 -1
  483. package/dist/preview-Cmt2vdUG.mjs +0 -3
  484. package/dist/public/assets/dist-BDfJLgAe.js +0 -1
  485. package/dist/public/assets/dist-BSbGs59J.js +0 -1
  486. package/dist/public/assets/dist-BXK-5ZOh.js +0 -1
  487. package/dist/public/assets/dist-BipKfxqO.js +0 -15
  488. package/dist/public/assets/dist-C9Jm0v8G.js +0 -1
  489. package/dist/public/assets/dist-CDCPrjhY.js +0 -1
  490. package/dist/public/assets/dist-CHAniM6T.js +0 -9
  491. package/dist/public/assets/dist-CYsaeLzc.js +0 -1
  492. package/dist/public/assets/dist-Cq9Fm8Xi.js +0 -1
  493. package/dist/public/assets/dist-Ct0eqVZy.js +0 -1
  494. package/dist/public/assets/dist-PgXBewk9.js +0 -23
  495. package/dist/public/assets/index-BbLzex1v.css +0 -2
  496. package/dist/public/assets/index-gSm49umN.js +0 -409
  497. package/dist/src-B7snRveE.mjs +0 -1
  498. package/dist/src-CEP6NuWY.mjs +0 -1
  499. package/dist/src-EGbU552u.mjs +0 -278
  500. package/dist/start-BYXBgVJW.mjs +0 -1
  501. package/dist/start-DqcFf-BT.mjs +0 -2
  502. /package/dist/public/assets/{go-IODVg4Ok.js → go-a33xvodr.js} +0 -0
  503. /package/dist/public/assets/{shell-COsTRxlr.js → shell-40VLet8r.js} +0 -0
package/dist/cli.mjs CHANGED
@@ -1,595 +1,63 @@
1
1
  #!/usr/bin/env node
2
- import{Ct as e,H as t,U as n,V as r,W as i,Y as a,at as o,et as s,l as c,lt as l,wt as u}from"./src-EGbU552u.mjs";import{a as d,i as f,o as p}from"./constants-yNFhYMHH.mjs";import{n as m,t as h}from"./paths-C7TuvND0.mjs";import{o as g}from"./init-BzEVODBI.mjs";import{n as _}from"./colors-CshxhXdR.mjs";import{t as v}from"./is-object-WgQ3abDo.mjs";import{r as y}from"./init-BH38QtfV.mjs";import{o as b,s as x}from"./start-DqcFf-BT.mjs";import{t as S}from"./loader-CoGCjTcI.mjs";import"./src-B7snRveE.mjs";import{Command as C}from"commander";import{closeSync as w,existsSync as T,mkdirSync as E,openSync as D,readFileSync as O,readdirSync as ee,statSync as k,unlinkSync as A,writeFileSync as te}from"node:fs";import{homedir as ne,hostname as re}from"node:os";import{basename as ie,dirname as ae,isAbsolute as oe,join as se,relative as ce,resolve as j}from"node:path";import{parse as le,stringify as ue}from"yaml";import{createOAuthDeviceAuth as de}from"@octokit/auth-oauth-device";import fe from"@inquirer/password";import{Octokit as pe}from"@octokit/rest";import{fileURLToPath as me}from"node:url";import{randomUUID as he}from"node:crypto";import{execFileSync as ge,spawn as _e}from"node:child_process";import M from"simple-git";import{readFile as ve,readdir as ye,stat as be}from"node:fs/promises";import xe from"picomatch";import{createServer as Se,request as Ce}from"node:http";import{McpServer as we}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Te}from"@modelcontextprotocol/sdk/server/stdio.js";import{RootsListChangedNotificationSchema as Ee}from"@modelcontextprotocol/sdk/types.js";import{z as N}from"zod";import{Bash as De,ReadWriteFs as Oe}from"just-bash";import ke from"shell-quote";const Ae=`open-knowledge`;var je=class{backend=`keyring`;async get(e){let{Entry:t}=await import(`@napi-rs/keyring`);try{let n=new t(Ae,e).getPassword();return n==null?null:JSON.parse(n)}catch{return null}}async set(e,t,n,r){let{Entry:i}=await import(`@napi-rs/keyring`),a=new i(Ae,e),o={login:t,token:n,...r};a.setPassword(JSON.stringify(o))}async clear(e){let{Entry:t}=await import(`@napi-rs/keyring`);try{new t(Ae,e).deletePassword()}catch{}}},Me=class{backend=`file`;authFile;constructor(e){this.authFile=e??se(ne(),`.open-knowledge`,`auth.yml`)}read(){if(!T(this.authFile))return{};try{return le(O(this.authFile,`utf-8`))??{}}catch(e){let t=e instanceof Error?e.message:`unknown error`;return process.stderr.write(`[auth] Failed to parse ${this.authFile}: ${t}. Starting with empty credentials.\n`),{}}}write(e){let t=ae(this.authFile);T(t)||E(t,{recursive:!0,mode:448}),te(this.authFile,ue(e),{mode:384})}async get(e){return this.read()[e]??null}async set(e,t,n,r){let i=this.read();i[e]={login:t,token:n,...r},this.write(i)}async clear(e){let t=this.read();delete t[e],this.write(t)}};async function Ne(e){try{let{Entry:e}=await import(`@napi-rs/keyring`);return new e(Ae,`__probe__`),process.stderr.write(`[auth] token storage: OS keychain
3
- `),new je}catch{return process.stderr.write(`[auth] token storage: file (~/.open-knowledge/auth.yml)
4
- `),new Me(e)}}async function Pe(e,t,n){let r=Fe(await Ie(e)).host??``;if(!r)return 1;let i=await n.get(r);if(i==null)return 1;let a=e=>e.replace(/[\r\n]/g,``);return t.write(`username=${a(i.login)}\npassword=${a(i.token)}\n`),0}function Fe(e){let t={};for(let n of e.split(`
5
- `)){let e=n.trim();if(e===``)continue;let r=e.indexOf(`=`);r!==-1&&(t[e.slice(0,r)]=e.slice(r+1))}return t}function Ie(e){return new Promise((t,n)=>{let r=[];e.on(`data`,e=>r.push(e)),e.on(`end`,()=>t(Buffer.concat(r).toString(`utf-8`))),e.on(`error`,n)})}function Le(e){let t=new C(`git-credential`);return t.description(`Git credential helper (git credential-helper protocol)`),t.command(`get`).description(`Lookup credentials from TokenStore (called by git)`).action(async()=>{let t=await e(),n=await Pe(process.stdin,process.stdout,t);process.exit(n)}),t}async function Re(e){let{clientId:t,scopes:n=[`repo`,`read:user`,`user:email`],onVerification:r,host:i}=e,a=i&&i!==`github.com`?`https://${i}/api/v3`:`https://api.github.com`,o=de({clientType:`oauth-app`,clientId:t,scopes:n,onVerification:async e=>{await r({verificationUri:e.verification_uri,userCode:e.user_code,expiresIn:e.expires_in,interval:e.interval})},request:a===`https://api.github.com`?void 0:(await import(`@octokit/request`)).request.defaults({baseUrl:a})}),s;try{s=await o({type:`oauth`})}catch(e){if(e instanceof Error){let t=e.message.toLowerCase();throw t.includes(`access_denied`)?Error(`Device-flow authorization was denied.`):t.includes(`expired_token`)||t.includes(`timeout`)||t.includes(`timed out`)?Error(`Device-flow code expired before authorization — please try again.`):Error(`GitHub sign-in failed: ${e.message}`)}throw e}return{token:s.token,tokenType:s.tokenType,scopes:s.scopes??[]}}function ze(e){return process.env.OPEN_KNOWLEDGE_GITHUB_CLIENT_ID??e?.github?.oauthAppClientId??`Ov23liqlSd0V1MwR6rhI`}const Be=new Set([`gitlab.com`,`bitbucket.org`,`codeberg.org`,`gitea.com`,`sr.ht`,`sourcehut.org`]);function Ve(e){let t=e.toLowerCase().replace(/:\d+$/,``);Be.has(t)&&(process.stderr.write(`Error: ${e} is not a GitHub host. Only GitHub and GitHub Enterprise Server are supported.\n`),process.exit(1))}function He(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Ue(e,t,n,r=Re){let i=ze(n),{host:a,json:o}=e;Ve(a),o||process.stderr.write(`Logging in to ${a}…\n`);let s=await r({clientId:i,host:a===`github.com`?void 0:a,onVerification:e=>{e.userCode,e.verificationUri,o?He(!0,{type:`verification`,user_code:e.userCode,verification_uri:e.verificationUri,expires_in:e.expiresIn}):process.stderr.write(`Open: ${e.verificationUri}\nEnter code: ${e.userCode}\n`)}}),c=`unknown`,l,u;try{let e=a===`github.com`?`https://api.github.com`:`https://${a}/api/v3`,t=await fetch(`${e}/user`,{headers:{Authorization:`Bearer ${s.token}`,"User-Agent":`open-knowledge-cli`,Accept:`application/vnd.github+json`}});if(t.ok){let e=await t.json();c=e.login??c,l=e.name??void 0,u=e.email??void 0}}catch{}await t.set(a,c,s.token,{gitProtocol:`https`,name:l,email:u}),o?He(!0,{type:`complete`,host:a,login:c}):process.stderr.write(`✓ Logged in as ${c} on ${a}\n`)}function We(e,t){return new C(`login`).description(`Authenticate with GitHub via Device Flow`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSONL progress events`,!1).action(async n=>{await Ue(n,await t(),e())})}async function Ge(e,t,n){let{host:r,json:i}=e;Ve(r);let a=await(n??(()=>fe({message:`Enter PAT:`})))();a||(process.stderr.write(`No token provided
6
- `),process.exit(1));let o=r===`github.com`?void 0:`https://${r}/api/v3`,s=new pe({auth:a,...o?{baseUrl:o}:{}}),c=`unknown`,l,u;try{let{data:e}=await s.users.getAuthenticated();c=e.login,l=e.name??void 0,u=e.email??void 0}catch{process.stderr.write(`Token validation failed
7
- `),process.exit(1)}await t.set(r,c,a,{gitProtocol:`https`,name:l,email:u}),i?process.stdout.write(`${JSON.stringify({type:`complete`,host:r,login:c})}\n`):process.stderr.write(`✓ PAT stored for ${c} on ${r}\n`)}function Ke(e){return new C(`pat`).description(`Store a Personal Access Token`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await Ge(t,await e())})}async function qe(e,t){let{host:n,json:r}=e;Ve(n);let i=await t.get(n);i??(process.stderr.write(`Not logged in to ${n}\n`),process.exit(1));let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=new pe({auth:i.token,...a?{baseUrl:a}:{}}),s=[];for await(let e of o.paginate.iterator(o.repos.listForAuthenticatedUser,{per_page:100,sort:`updated`}))for(let t of e.data)s.push({full_name:t.full_name,clone_url:t.clone_url,private:t.private});if(r)process.stdout.write(`${JSON.stringify({type:`repos`,host:n,repos:s})}\n`);else for(let e of s)process.stdout.write(`${e.full_name} ${e.clone_url}\n`)}function Je(e){return new C(`repos`).description(`List accessible repositories`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await qe(t,await e())})}async function Ye(e,t){let{host:n}=e;await t.clear(n),process.stderr.write(`✓ Signed out from ${n}\n`)}function Xe(e){return new C(`signout`).description(`Remove stored credentials`).option(`--host <host>`,`GitHub hostname`,`github.com`).action(async t=>{await Ye(t,await e())})}async function Ze(e,t){let{host:n,json:r}=e;Ve(n);let i=await t.get(n);i??(r?process.stdout.write(`${JSON.stringify({type:`status`,host:n,authenticated:!1})}\n`):process.stderr.write(`Not logged in to ${n}\n`),process.exit(1));let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=new pe({auth:i.token,...a?{baseUrl:a}:{}});try{let{data:e}=await o.users.getAuthenticated();r?process.stdout.write(`${JSON.stringify({type:`status`,host:n,authenticated:!0,login:e.login,name:e.name,email:e.email})}\n`):process.stderr.write(`✓ Logged in as ${e.login} on ${n}\n`)}catch{r?process.stdout.write(JSON.stringify({type:`status`,host:n,authenticated:!1,error:`token invalid`})+`
8
- `):process.stderr.write(`✗ Token invalid for ${n}\n`),process.exit(1)}}function Qe(e){return new C(`status`).description(`Show authentication status`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await Ze(t,await e())})}function $e(e){let t=new C(`auth`);t.description(`GitHub authentication management`);let n=()=>Ne(),r=e??(()=>({}));return t.addCommand(We(r,n)),t.addCommand(Qe(n)),t.addCommand(Je(n)),t.addCommand(Xe(n)),t.addCommand(Ke(n)),t.addCommand(Le(n)),t}function et(e,t,n={}){let r=o(e,t);if(!T(r))return{status:`missing`,lockPath:r};let i;try{i=JSON.parse(O(r,`utf-8`))}catch{return{status:`corrupt`,lockPath:r}}if(!i||typeof i!=`object`||typeof i.pid!=`number`)return{status:`corrupt`,lockPath:r};let a=i,s=n.host??re();return a.hostname===s?(n.isAlive??l)(a.pid)?{status:`alive`,lockPath:r,lock:a}:{status:`dead-pid`,lockPath:r,lock:a}:{status:`foreign-host`,lockPath:r,lock:a}}function tt(e,t){let n=[];for(let[r,i]of[[`server`,e],[`ui`,t]])(i.status===`dead-pid`||i.status===`corrupt`)&&n.push({name:r,lockPath:i.lockPath,reason:i.status});return{prune:n}}function nt(e){let t=e.inspect??(t=>et(e.lockDir,t)),n=e.unlink??(e=>A(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=tt(t(`server`),t(`ui`));if(a.prune.length===0)return r(`No stale locks.`),{pruned:[],failed:[]};let o=[],s=[];for(let e of a.prune)try{n(e.lockPath),o.push(e)}catch(t){s.push({target:e,error:t instanceof Error?t.message:String(t)})}if(o.length>0){let e=o.map(e=>`${e.name} (${e.reason})`).join(`, `);r(`Pruned ${o.length} stale lock${o.length===1?``:`s`}: ${e}`)}return s.length>0&&i(`Failed to prune: ${s.map(({target:e,error:t})=>`${e.name} (${e.lockPath}): ${t}`).join(`; `)}`),{pruned:o,failed:s}}function rt(e){return new C(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{nt({lockDir:m(h(e(),process.cwd()))}).failed.length>0&&(process.exitCode=1)})}function it(){try{let e=ge(`gh`,[`auth`,`token`],{encoding:`utf-8`,stdio:[`ignore`,`pipe`,`pipe`],timeout:5e3}).trim();return e.length===0?{available:!1}:{available:!0,token:e}}catch{return{available:!1}}}async function at(e,t,n={},r=it){if(!n.skipGhDetect&&r().available)return{tier:`A`,credentialArgs:[`-c`,`credential.helper=!gh auth git-credential`]};let i=await t.get(e);return i==null?{tier:`none`,credentialArgs:[]}:{tier:i.gitProtocol===`ssh`?`C`:`B`,credentialArgs:[`-c`,`credential.helper=!open-knowledge auth git-credential`]}}function ot(e){return e.replace(/:\d+$/,``)}function st(e){let t=e.trim();if(!t)return null;{let e=/^https?:\/\/([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`https`,hostname:ot(e[1]),owner:e[2],name:e[3]}}{let e=/^ssh:\/\/(?:[\w.-]+@)?([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`ssh`,hostname:ot(e[1]),owner:e[2],name:e[3]}}{let e=/^git:\/\/([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`git`,hostname:ot(e[1]),owner:e[2],name:e[3]}}{let e=/^(?:[\w.-]+@)?([\w.-]+):([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?$/.exec(t);if(e?.[1].includes(`.`)||e&&t.startsWith(`git@`))return{protocol:`ssh`,hostname:e[1],owner:e[2],name:e[3]}}{let e=/^git:([\w.-]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`git`,hostname:e[1],owner:e[2],name:e[3]}}if(!t.includes(`://`)&&!t.includes(`@`)&&!t.startsWith(`/`)){let e=/^([\w.-]+)\/([\w.\-~%]+?)(?:\.git)?$/.exec(t);if(e)return{protocol:`https`,hostname:`github.com`,owner:e[1],name:e[2]}}return null}const ct=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function lt(e){let t=/^([\w ]+):\s+(\d+)%/.exec(e.trim());if(!t)return null;let n=t[1].toLowerCase(),r=Number(t[2]);for(let[e,i,a]of ct)if(n.includes(e))return{stage:t[1],pct:Math.round(i+r/100*(a-i))};return null}function ut(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function dt(e,t,n,r=process.cwd()){let i=st(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=t.dir?j(r,t.dir):j(r,i.name);if(T(a)&&ee(a).length>0)throw Error(`Target directory is not empty: ${a}`);let o=await Ne(),s=await at(i.hostname,o,{}),c=M({baseDir:r,config:s.credentialArgs.length>=2?[s.credentialArgs[1]]:[]}).env({GIT_TERMINAL_PROMPT:`0`}),l=-1;if(c.outputHandler((e,n,r)=>{r.on(`data`,e=>{let n=e.toString(`utf-8`);for(let e of n.split(`
9
- `)){let n=lt(e);n&&n.pct!==l&&(l=n.pct,ut(t.json,{type:`progress`,pct:n.pct,stage:n.stage}),t.json||process.stderr.write(`\r Cloning… ${n.pct}%`))}})}),await c.clone(e,a,[`--progress`]),t.json||process.stderr.write(`
10
- `),!T(j(a,`.open-knowledge`)))try{let[{runInit:e},{ensureOkGitignoredAtRoot:t}]=await Promise.all([import(`./init-BFZ4vnnX.mjs`),import(`./init-DCZhpKSO.mjs`)]);e({cwd:a,mcp:!1});try{t(a)}catch{}}catch{}return a}function ft(e){return new C(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).action(async(t,n,r)=>{let i=e();try{let a=await dt(t,{json:r.json,dir:n},i);if(r.json)ut(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-BYXBgVJW.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){let t=e instanceof Error?e.message:String(e);r.json?ut(!0,{type:`error`,message:t}):process.stderr.write(`✗ ${t}\n`),process.exitCode=1}})}function P(e,t){return{content:[{type:`text`,text:e}],...t?{isError:!0}:{}}}function F(e,t,n){return{content:[{type:`text`,text:e}],structuredContent:t,...n?{isError:!0}:{}}}const I="Error: Hocuspocus server is not running. Start it with `open-knowledge start`, then retry.\nFor disk-only writes without real-time sync, use your native Edit tool directly.";async function L(e){return typeof e==`function`?await e():e}function R(e){let t=e.toLowerCase();return t.endsWith(`.md`)?{ok:!0,docName:e.slice(0,-3)}:t.endsWith(`.mdx`)?{ok:!0,docName:e.slice(0,-4)}:t.endsWith(`.markdown`)?{ok:!1,error:`Error: docName "${e}" ends in ".markdown", which is not a supported extension. Use ".md" or ".mdx", or strip the extension to let the server auto-detect.`}:{ok:!0,docName:e}}async function z(e,t){let n;try{n=await fetch(`${e}${t}`,{signal:AbortSignal.timeout(3e4)})}catch(e){return{ok:!1,error:`Server unreachable: ${e instanceof Error?e.message:e}`}}try{return await n.json()}catch{return{ok:!1,error:`Server returned HTTP ${n.status} with non-JSON body`}}}async function B(e,t,n){let r;try{r=await fetch(`${e}${t}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:n?JSON.stringify(n):void 0,signal:AbortSignal.timeout(3e4)})}catch(e){return{ok:!1,error:`Server unreachable: ${e instanceof Error?e.message:e}`}}try{return await r.json()}catch{return{ok:!1,error:`Server returned HTTP ${r.status} with non-JSON body`}}}function pt(e,t){return`Promote existing research on this topic into a canonical article inside the project content directory. **Canonical, not provisional** — the output is the source of truth for future agents.
11
-
12
- Topic: ${e}
13
-
14
- The content directory for this project is **\`${t}\`** (from \`${d}/config.yml\`).
15
-
16
- ## When to use this workflow
17
-
18
- - A team has made a decision after research and wants the outcome committed as canonical knowledge
19
- - You want to compact several provisional research notes into one authoritative article
20
- - A developer asks to "consolidate" or "finalize" the knowledge on a topic
21
-
22
- Do NOT consolidate when:
23
- - The team has not actually decided (the output would be misleading keep it as research)
24
- - You have not read the underlying sources (the output would lack evidence)
25
-
26
- ## Principle: canonical, not provisional
27
-
28
- A consolidated article is the **source of truth**. Agents reading it should not need to dig further for context — it should stand on its own. That means:
29
-
30
- - Clear, direct statements (no "tentative", no "initial findings")
31
- - Decisions stated as decisions, not options
32
- - Rationale explained so future readers understand the why
33
- - Trade-offs acknowledged but framed against the chosen path, not as a menu
34
- - Evidence linked but not the whole story — this article is the destination, not a trail
35
-
36
- ## Steps
37
-
38
- ### 1. Load the research + sources
39
-
40
- Locate research articles on this topic:
41
-
42
- - Use \`exec("grep -rn <topic-keyword> ${t}")\` to find prior research, or \`exec("ls <research-folder>")\` if the project groups research in a known location
43
- - Read each research article fully via \`exec("cat <path>")\` (rich enrichment gives frontmatter + shadow-repo activity + project git history + backlinks)
44
- - Follow its \`sources:\` frontmatter list — read every referenced source file
45
- - Also read any existing canonical article on the topic — if one already exists, you may be **updating** it rather than creating a new one
46
-
47
- If there is no research to consolidate, stop. Consolidation is promotion, not creation. Run \`research\` first.
48
-
49
- ### 2. Confirm the decision
50
-
51
- Before writing, confirm with the developer:
52
-
53
- - **What is the actual decision?** (e.g., "We chose Yjs for CRDT" not "Yjs is one option")
54
- - **What alternatives were considered and rejected?** (these get mentioned in trade-offs, not as equal options)
55
- - **What's the rationale the team actually used?** (not your reconstruction from sources — ask if unclear)
56
-
57
- If the decision is not yet made, **do not consolidate**. Return and tell the developer to either (a) make the decision first, or (b) keep the research as provisional.
58
-
59
- ### 3. Write the canonical article
60
-
61
- Save inside the content directory (\`${t}\`). Path convention depends on the project:
62
-
63
- - If the project uses the three-tier lifecycle (external-sources → research → articles), save under an \`articles/\` folder relative to the content dir, grouped by topic subfolder when the area is broad (e.g., \`articles/editor/crdt-architecture.md\`)
64
- - If the project has an existing canonical-docs layout (\`docs/\`, \`guides/\`, etc.), save there in a location that matches the project's conventions
65
- - Ask the user when the canonical location is ambiguous
66
-
67
- Frontmatter:
68
-
69
- \`\`\`yaml
70
- ---
71
- title: Descriptive title
72
- description: One-line summary of what this article covers
73
- status: canonical
74
- date: YYYY-MM-DD
75
- tags:
76
- - topic-tag
77
- supersedes:
78
- - <path-to-research-article>.md
79
- ---
80
- \`\`\`
81
-
82
- Structure:
83
-
84
- \`\`\`markdown
85
- ## Summary
86
-
87
- [One paragraph: what the decision is and why. A reader who reads only this paragraph should know the outcome.]
88
-
89
- ## Context
90
-
91
- [What problem does this solve? What constraints shaped the decision?]
92
-
93
- ## Decision
94
-
95
- [The chosen approach, stated directly. Not "we recommend" — "we chose".]
96
-
97
- ## Rationale
98
-
99
- [Why this path over alternatives. Grounded in the constraints from Context.]
100
-
101
- ## Trade-offs
102
-
103
- [What we gave up by choosing this path. Frame against the chosen decision, not as a menu.]
104
-
105
- ## Alternatives considered
106
-
107
- [Briefly: what else was on the table, why it was rejected. Link to the research article for deeper analysis.]
108
-
109
- ## Implementation notes
110
-
111
- [How this gets realized in the codebase — key files, patterns, gotchas.]
112
-
113
- ## Further reading
114
-
115
- [Links to research articles and external sources for readers who want the trail.]
116
- \`\`\`
117
-
118
- ### 4. Link aggressively
119
-
120
- Canonical articles are destinations — they should be **linked heavily from everywhere they're relevant** and link **out to every related page** themselves. Underlinked canonical articles lose most of their value.
121
-
122
- - **Inside this article:** every noun-phrase that names another document (other canonical articles, related research, external-source pages, sibling topics) should be a \`[[Page Name]]\` link, not plain prose. Prefer \`[[Page]]\` over Markdown \`[text](./page.md)\` — only wiki-links participate in the backlinks index.
123
- - **Redlinks are fine.** If you mention a concept that *should* have a page but doesn't yet, \`[[link it anyway]]\`. The redlink signals future work.
124
- - **Update neighbors.** After writing, find 2–3 closely-related existing pages (via \`exec("grep -rn <topic> ${t}")\`) and add a \`[[<new article>]]\` link from each — usually under a "See also" section or inline where the new article is relevant. This makes the article discoverable via backlinks, not just by remembering the path.
125
- - **Link to the sources and superseded research** from "Further reading" — readers who want the trail can follow.
126
-
127
- ### 5. Supersede the research
128
-
129
- Add a \`supersedes:\` list in the new article's frontmatter pointing at the research article(s) it consolidates. This creates an audit trail.
130
-
131
- Do NOT delete the research articles — they remain as historical context for how the decision was reached. Edit their frontmatter to add:
132
-
133
- \`\`\`yaml
134
- superseded_by: <path-to-new-canonical-article>.md
135
- \`\`\`
136
-
137
- ### 6. Verify
138
-
139
- - File exists at the chosen path under the content directory
140
- - Has \`status: canonical\` frontmatter
141
- - Lists the research articles it supersedes
142
- - Research articles updated with \`superseded_by\` pointer
143
- - \`exec("ls <target-dir>")\` shows the new file
144
-
145
- ## Non-goals
146
-
147
- - **Don't consolidate research that hasn't reached a decision** — the article would misrepresent the team's actual state of understanding
148
- - **Don't delete research articles** — they are the trail; keep them with a \`superseded_by\` marker
149
- - **Don't rewrite research prose verbatim** — canonical articles have a different voice (direct, decided) than research (exploratory, provisional)
150
- - **Don't skip the supersedes / superseded_by links** — the audit trail matters for future readers
151
-
152
- Full convention: read \`${d}/AGENTS.md\`.`}const mt=[`Promote research into a canonical article inside the project content directory. Canonical, not provisional — the output is the source of truth for future agents.`,``,`**Use when:**`,`- A team has made a decision after research and wants the outcome committed as canonical knowledge`,`- Compacting several provisional research notes into one authoritative article`,`- A developer asks to "consolidate" or "finalize" knowledge on a topic`,``,`**Triggers on:**`,`- "consolidate", "finalize", "promote to canonical", "make this official"`,`- User says the team has decided and wants the outcome written as canonical`,`- Research has stabilized and a destination article is needed`].join(`
153
- `);function ht(e,t){e.tool(`consolidate`,mt,{topic:N.string().describe(`The topic to consolidate into a canonical article`)},e=>F(pt(e.topic,t.content.dir),{previewUrl:null}))}function gt(e){return e.split(`/`).map(encodeURIComponent).join(`/`)}function _t(e){return e.endsWith(`/`)?e.slice(0,-1):e}function vt(e){try{return new URL(e),!0}catch{return!1}}async function V(e,t){let n=await t.resolveCwd(),r=m(h(t.config,n));return U(e,{config:t.config,lockDir:r})}function yt(e){try{let t=a(e.lockDir);if(t&&t.port>0)return{baseUrl:`http://localhost:${t.port}`,port:t.port}}catch(t){process.stderr.write(`[preview-url] readUiLock failed at ${e.lockDir} while building ui block: ${t instanceof Error?t.message:String(t)}\n`)}return{baseUrl:null,port:null}}async function H(e){let t=await e.resolveCwd(),n=m(h(e.config,t)),r={config:e.config,lockDir:n};return{resolve:e=>U(e,r),ui:yt(r)}}function bt(e){let t=e.toLowerCase();return t.endsWith(`.md`)?e.slice(0,-3):t.endsWith(`.mdx`)?e.slice(0,-4):e}function U(e,t){let n=`/#/${gt(e)}`,r=process.env.OPEN_KNOWLEDGE_PREVIEW_BASE_URL;if(r&&vt(r))return{url:`${_t(r)}${n}`,source:`env`};try{let e=a(t.lockDir);if(e&&e.port>0)return{url:`http://localhost:${e.port}${n}`,source:`lock`}}catch(e){process.stderr.write(`[preview-url] readUiLock failed at ${t.lockDir}, falling through to config: ${e instanceof Error?e.message:String(e)}\n`)}let i=t.config.preview?.baseUrl;return i&&vt(i)?{url:`${_t(i)}${n}`,source:`config`}:null}const xt=["**IMPORTANT: Before calling this tool, you MUST first call `get_preview_url` and navigate to the returned URL in your preview browser. If `get_preview_url` returns null, start the server first (`open-knowledge start` or `preview_start`), then call `get_preview_url` again. Do NOT call this tool without the preview open. NEVER manually construct the URL.**",``,`[Requires: Hocuspocus server] Find-and-replace on a live document via the CRDT layer.`,`The patch is applied through Hocuspocus and propagated to all connected editors in real-time.`,"Use `offset` when you need to patch an exact occurrence; omit it to preserve first-match behavior.",``,"**When rewriting prose, add `[[wiki-links]]` aggressively.** If the replacement mentions other documents or entities that should have their own page, link them as `[[Page Name]]`. Over-linking is the goal; underlinked documents lose their value in backlink-driven navigation.",``,`**Parameters:**`,"- `docName` — Document name, typically without extension. A trailing `.md` or `.mdx` is stripped automatically.","- `find` — Text to find (exact match)","- `replace` — Replacement text","- `offset` (optional) — Exact occurrence to patch, as a JavaScript string offset in the current markdown. If the document changed and the text no longer matches there, the server returns a stale-target error; re-run `suggest_links` to get fresh offsets."].join(`
154
- `);function St(e,t){e.tool(`edit_document`,xt,{docName:N.string().describe(`Document name to edit`),find:N.string().describe(`Text to find (exact match)`),replace:N.string().describe(`Replacement text`),offset:N.number().int().min(0).optional().describe(`Exact occurrence to patch, as a JavaScript string offset in the current markdown`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=R(e.docName);if(!r.ok)return P(r.error,!0);let i=t.identityRef?.current,a=await B(n,`/api/agent-patch`,{docName:r.docName,find:e.find,replace:e.replace,offset:e.offset,...i?{agentId:i.connectionId,agentName:i.displayName,clientName:i.clientInfo?.name,colorSeed:i.colorSeed}:{}});if(!a.ok)return P(`Error: ${a.error}`,!0);let o=await t.resolveCwd(),s=m(h(t.config,o)),c=U(r.docName,{config:t.config,lockDir:s}),l=(typeof a.subscriberCount==`number`?a.subscriberCount:void 0)===0,u=[`Edit applied successfully.`];c&&u.push(`Preview: ${c.url}`),l&&u.push(c?`Warning: no preview is currently attached to "${r.docName}". Open ${c.url} to watch future edits live.`:`Warning: no preview is currently attached to "${r.docName}".`);let d=u.join(`
155
- `);if(!c&&!l)return P(d);let f={};return c&&(f.previewUrl=c.url,f.previewUrlSource=c.source),l&&(f.warning={message:`No preview attached to ${r.docName}.`,previewUrl:c?.url??null}),F(d,f)})}const Ct=new Set([`cat`,`ls`,`grep`,`find`]),wt=/\b[\w./-]+\.(md|mdx)\b/g;function W(e){return/\.(md|mdx)$/.test(e)}function G(e){let t=e.trim();return t?(t=t.replace(/\/+/g,`/`),t.startsWith(`./`)&&(t=t.slice(2)),t.endsWith(`/`)&&(t=t.slice(0,-1)),t):``}function K(e){return e.args.slice(1)}function q(e){return e.filter(e=>!e.startsWith(`-`))}function Tt(e){return q(K(e)).filter(W)}function Et(e,t){let n=q(K(t)),r=n.length>0?n[n.length-1]:``,i=r&&r!==`.`?G(r):``,a=[];i&&a.push(i);for(let t of e.split(`
156
- `)){let e=t.trim();if(!e||/\.[a-z0-9]+$/i.test(e)&&!W(e))continue;let n=i?`${i}/${e}`:e;a.push(n)}return a}function Dt(e){let t=[];for(let n of e.split(`
157
- `)){if(!n)continue;let e=n.indexOf(`:`);if(e<0)continue;let r=G(n.slice(0,e));W(r)&&t.push(r)}return t}function Ot(e){let t=[];for(let n of e.split(`
158
- `)){let e=G(n);e&&W(e)&&t.push(e)}return t}function kt(e){return q(K(e)).filter(W)}function At(e){return q(K(e)).length>0}function jt(e){let t=[],n=e.matchAll(wt);for(let e of n)t.push(G(e[0]));return t}function Mt(e,t){let n=null;for(let e=t.length-1;e>=0;e--){let r=t[e];if(Ct.has(r.command)){n=r;break}if((r.command===`head`||r.command===`tail`)&&At(r)){n=r;break}}let r;if(!n)r=jt(e);else{switch(n.command){case`cat`:r=Tt(n);break;case`ls`:r=Et(e,n);break;case`grep`:r=Dt(e);break;case`find`:r=Ot(e);break;case`head`:case`tail`:r=kt(n);break;default:r=jt(e)}r.length===0&&(r=jt(e))}let i=new Set,a=[];for(let e of r){let t=G(e);!t||i.has(t)||(i.add(t),a.push(t))}return a}function J(e){return e===``?`''`:/^[\w.\-/]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}const Nt=16*1024*1024;var Pt=class extends Error{limitBytes;actualBytes;partial;constructor(e,t,n){super(`Output exceeded ${e} byte buffer (got ${t}); narrow the command`),this.name=`StdoutOverflowError`,this.limitBytes=e,this.actualBytes=t,this.partial=n}};function Ft(e){if(!oe(e))throw Error(`createBashInstance: cwd must be absolute (got: ${e})`);return new De({cwd:`/`,fs:new Oe({root:j(e),allowSymlinks:!1})})}async function It(e,t){let n=await e.exec(t);if(n.stdout.length>Nt)throw new Pt(Nt,n.stdout.length,{stdout:n.stdout.slice(0,Nt),stderr:n.stderr,exitCode:n.exitCode});return{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode}}function Lt(e){return e.startsWith(`**/`)?e.slice(3):e}async function Rt(e,t,n={}){let r=Ft(t),i=[`-rn`,`-F`];(n.caseInsensitive??!0)&&i.push(`-i`);for(let e of n.include??[])i.push(`--include=${J(Lt(e))}`);for(let e of n.exclude??[])i.push(`--exclude=${J(Lt(e))}`),i.push(`--exclude-dir=${J(Lt(e))}`);let a=n.paths?.length?n.paths.map(J):[`.`],o=`grep ${i.join(` `)} ${J(e)} ${a.join(` `)}`,s;try{s=await It(r,o)}catch(e){if(e instanceof Pt)s=e.partial;else throw e}if(s.exitCode===1&&!s.stdout)return[];if(s.exitCode!==0&&s.exitCode!==1&&!s.stdout)throw Error(`grep exited ${s.exitCode}: ${s.stderr}`);let c=[],l=n.maxResults??1/0;for(let e of s.stdout.split(`
159
- `)){if(!e)continue;if(c.length>=l)break;let t=e.indexOf(`:`);if(t===-1)continue;let n=e.indexOf(`:`,t+1);if(n===-1)continue;let r=e.slice(0,t),i=e.slice(t+1,n),a=e.slice(n+1),o=Number.parseInt(i,10);Number.isFinite(o)&&c.push({path:r,line:o,text:a})}return c}const zt=new Set([`.git`,d,`.openknowledge`,`node_modules`,`.changeset`,`.claude`,`.agents`,`dist`,`build`]);async function Bt(e){let t=j(e),n=new Map,r=0,i=!1;async function a(e){if(i)return;let o;try{o=await ye(e,{withFileTypes:!0})}catch{return}for(let s of o){if(i)return;if(s.isDirectory()&&zt.has(s.name))continue;let o=j(e,s.name);if(s.isDirectory()){await a(o);continue}if(s.isFile()){if(r>=1e3){i=!0;return}try{let e=await be(o);n.set(ce(t,o),e.mtimeMs),r++}catch{}}}}return await a(t),{snapshot:n,truncated:i}}function Vt(e,t){let n=[];for(let[r,i]of t){let t=e.get(r);(t===void 0||t!==i)&&n.push(r)}for(let[r]of e)t.has(r)||n.push(r);return{changed:n}}const Ht=[`node_modules`,`.git`,`dist`,`build`,`.next`,`.turbo`,`.nuxt`,`coverage`,`.cache`,`.parcel-cache`,`.vercel`,d,`.claude`];function Ut(e){return e===`--recursive`||e===`--dereference-recursive`?!0:e.startsWith(`--`)||!e.startsWith(`-`)?!1:/[rR]/.test(e.slice(1))}const Wt=[{command:`grep`,applies:e=>e.slice(1).some(Ut),hasUserExcludes:e=>e.some(e=>e===`--exclude-dir`||e.startsWith(`--exclude-dir=`)),buildExcludeArgs:e=>e.map(e=>`--exclude-dir=${e}`),insertionIndex:()=>1},{command:`find`,applies:()=>!0,hasUserExcludes:e=>e.slice(1).some(e=>e===`-not`||e===`!`||e===`-prune`),buildExcludeArgs:e=>{let t=[];for(let n of e)t.push(`-not`,`-path`,`*/${n}/*`);return t},insertionIndex:e=>{for(let t=1;t<e.length;t++)if(e[t].startsWith(`-`))return t;return e.length}}];function Gt(e){return e.map(e=>{let t=Wt.find(t=>t.command===e.command);if(!t||!t.applies(e.args)||t.hasUserExcludes(e.args))return e;let n=t.buildExcludeArgs(Ht),r=t.insertionIndex(e.args);return{command:e.command,args:[...e.args.slice(0,r),...n,...e.args.slice(r)]}})}function Kt(e){return e.map(e=>e.args.map(J).join(` `)).join(` | `)}const qt=new Set([`cat`,`ls`,`grep`,`find`,`head`,`tail`,`wc`,`sort`,`uniq`,`cut`]),Jt=new Set([`>`,`>>`,`<`,`>&`,`<&`,`|&`]),Yt=new Set([`&`,`;`,`;;`,`&&`,`||`,`(`,`)`,`<(`,`>(`,`<<`,`<<-`]),Xt=new Set([`-o`,`--output-file`,`--output`]),Zt=[`-o=`,`--output-file=`,`--output=`],Qt=new Set([`-exec`,`-execdir`,`-delete`,`-fprint`,`-fprintf`,`-fprint0`,`-ok`,`-okdir`]),$t=/[`]|\$\(|\$\{|\$'/;function en(e){return typeof e==`object`&&!!e&&`op`in e}function tn(e){let t=typeof e.op==`string`?e.op:`(unknown)`;return Jt.has(t)?{category:`write_blocked`,message:`Write operation blocked: '${t}'. exec is read-only. For document changes, use write_document or edit_document.`}:Yt.has(t)?{category:`shell_construct_blocked`,message:`Shell construct '${t}' is not supported. Only pipes (|) are allowed between allowlisted stages.`}:{category:`shell_construct_blocked`,message:`Operator '${t}' is not supported.`}}function nn(e){let t=[];for(let n of e){if(typeof n==`string`){if($t.test(n))return{error:{category:`shell_construct_blocked`,message:`Argument '${n}' contains a shell-injection pattern (backtick, $(), or \${}); not supported.`}};t.push(n);continue}if(!en(n))return{error:{category:`shell_construct_blocked`,message:`Unrecognized token shape.`}};if(n.op===`glob`&&typeof n.pattern==`string`){t.push(n.pattern);continue}return typeof n.comment==`string`?{error:{category:`shell_construct_blocked`,message:`Comments are not allowed in exec commands.`}}:{error:tn(n)}}return{args:t}}function rn(e){if(!qt.has(e.command))return{category:`unknown_command`,message:`Command '${e.command}' is not in the allowlist. For pattern matching try 'grep'; for file listing try 'ls' or 'find'. Allowlist: cat, ls, grep, find, head, tail, wc, sort, uniq, cut.`};for(let t of e.args.slice(1)){if(Xt.has(t)||Zt.some(e=>t.startsWith(e)))return{category:`write_blocked`,message:`Write operation blocked: '${t}'. exec is read-only. For document changes, use write_document or edit_document.`};if(e.command===`find`&&Qt.has(t))return{category:`write_blocked`,message:`find flag '${t}' is blocked (executes commands or deletes files). Use exec for read-only discovery; chain with another allowlisted tool via '|' if you need to transform output.`}}return null}function an(e){let t=e.trim();if(!t)return{error:{category:`unknown_command`,message:`Empty command.`}};let n;try{n=ke.parse(t)}catch{return{error:{category:`shell_construct_blocked`,message:`Failed to parse command — likely malformed quoting or an unsupported construct.`}}}let r=[],i=[];for(let e of n){if(en(e)&&e.op===`|`){r.push(i),i=[];continue}i.push(e)}r.push(i);let a=[];for(let e of r){let t=nn(e);if(`error`in t)return t;if(t.args.length===0)return{error:{category:`shell_construct_blocked`,message:`Empty pipeline stage (trailing pipe or leading pipe).`}};let n={command:t.args[0],args:t.args},r=rn(n);if(r)return{error:r};a.push(n)}return{stages:a}}const on=/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/;function sn(e,t){let n=e.match(on);if(!n)return null;try{let e=le(n[1]);if(v(e)){if(t){let n=t.safeParse(e);return n.success?n.data:null}return e}}catch{}return null}const cn=new WeakMap;function ln(e){let t=cn.get(e);if(t)return t;let n=e.map(e=>xe(e.match,{dot:!0}));return cn.set(e,n),n}function un(e,t){if(e.length===0)return{};let n=ln(e),r={},i=[],a=!1;for(let o=0;o<e.length;o++){if(!n[o](t))continue;a=!0;let s=e[o].frontmatter;if(s.title!==void 0&&(r.title=s.title),s.description!==void 0&&(r.description=s.description),s.tags!==void 0)for(let e of s.tags)i.includes(e)||i.push(e)}return a?(i.length>0&&(r.tags=i),r):{}}function dn(e){try{return k(j(e,`.git`)).isDirectory()}catch{return!1}}function fn(e){return M({baseDir:j(e),timeout:{block:5e3}})}async function pn(e,t,n=5){if(!dn(e))return{commits:[],source:`git-absent`};let r=fn(e),i=``;try{i=await r.raw(`log`,`-${Math.max(1,n)}`,`--format=%H|%aI|%an|%s`,`--follow`,`--`,t)}catch{return{commits:[],source:`git`}}let a=[];for(let e of i.split(`
160
- `)){if(!e)continue;let t=e.indexOf(`|`);if(t<0)continue;let n=e.indexOf(`|`,t+1);if(n<0)continue;let r=e.indexOf(`|`,n+1);r<0||a.push({hash:e.slice(0,t),date:e.slice(t+1,n),authorName:e.slice(n+1,r),subject:e.slice(r+1)})}return{commits:a,source:`git`}}const mn=5e3;async function hn(e){try{let t=(await M({baseDir:e,timeout:{block:mn}}).revparse([`--abbrev-ref`,`HEAD`])).trim();return t&&t!==`HEAD`?t:null}catch{return null}}function gn(e,t){return M({baseDir:t,timeout:{block:mn}}).env({GIT_DIR:e,GIT_WORK_TREE:t})}function _n(e,n){let r=t(n);return e.startsWith(r)?e.slice(r.length):e}async function vn(e,t,r,a,o){let s=``;try{s=await e.raw(`log`,t,`-${Math.max(1,o*2)}`,`--format=%H%x00%aI%x00%an%x00%s%x00%B%x1e`,`--`,r)}catch{return[]}let c=_n(t,a),l=i(c),u=[];for(let e of s.split(``)){let t=e.trimStart();if(!t)continue;let[r=``,i=``,o=``,s=``,d=``]=t.split(`\0`),f=r.trim();f.length===40&&u.push({hash:f,date:i,writerName:o,message:s,contributors:n(d),writerId:c,isAgent:l.isAgent,writerClassification:l.classification,branch:a})}return u}async function yn(e,n,i=5){let a=r(e);if(!a)return{commits:[],source:`shadow-repo-absent`};let o=await hn(e);if(!o)return{commits:[],source:`shadow-repo`};let s=gn(a,j(e)),c=``;try{c=await s.raw(`for-each-ref`,t(o),`--format=%(refname)`)}catch{return{commits:[],source:`shadow-repo`}}let l=c.split(`
161
- `).map(e=>e.trim()).filter(Boolean);return l.length===0?{commits:[],source:`shadow-repo`}:{commits:(await Promise.all(l.map(e=>vn(s,e,n,o,i)))).flat().sort((e,t)=>t.date.localeCompare(e.date)).slice(0,i),source:`shadow-repo`}}const bn=1e3,xn=new Set([`.git`,d,`.openknowledge`,`node_modules`,`.changeset`,`.claude`,`.agents`,`dist`,`build`]),Sn=/\.(md|mdx)$/i,Cn=N.object({title:N.string().optional(),description:N.string().optional(),tags:N.array(N.string()).default([])});function wn(e){return e.replace(/\.md$/,``).replace(/\.mdx$/,``)}async function Tn(e){try{let t=sn(await ve(e,`utf-8`),Cn);return t?{title:t.title,description:t.description,tags:t.tags??[]}:{tags:[]}}catch{return null}}async function En(e,t){if(!e)return null;let n=await z(e,`/api/backlinks?docName=${encodeURIComponent(t)}`);if(!n.ok)return null;let r=n.backlinks??n.results??n.links;if(!Array.isArray(r))return[];let i=[];for(let e of r){if(typeof e!=`object`||!e)continue;let t=e,n=typeof t.docName==`string`?t.docName:typeof t.source==`string`?t.source:typeof t.page==`string`?t.page:void 0;n&&i.push({source:n,title:typeof t.title==`string`?t.title:void 0,snippet:typeof t.snippet==`string`?t.snippet:null})}return i}async function Dn(e,t){if(!e||t.length===0)return null;let n=[...new Set(t)],r=[];for(let e=0;e<n.length;e+=100)r.push(n.slice(e,e+100));let i=await Promise.all(r.map(async t=>{let n=await z(e,`/api/backlink-counts?docNames=${encodeURIComponent(t.join(`,`))}`);return n.ok?n.counts??{}:null})),a=new Map,o=!1;for(let e of i)if(e){o=!0;for(let[t,n]of Object.entries(e))typeof n==`number`&&Number.isFinite(n)&&a.set(t,n)}return o?a:null}async function On(e,t){if(!e)return null;let n=await z(e,`/api/forward-links?docName=${encodeURIComponent(t)}`);if(!n.ok)return null;let r=n.forwardLinks??n.links??n.results;if(!Array.isArray(r))return[];let i=[];for(let e of r){if(typeof e!=`object`||!e)continue;let t=e;if(t.kind===`external`&&typeof t.url==`string`){i.push({kind:`external`,url:t.url,title:typeof t.title==`string`?t.title:void 0,snippet:typeof t.snippet==`string`?t.snippet:null});continue}let n=typeof t.docName==`string`?t.docName:void 0;n&&i.push({kind:`doc`,docName:n,title:typeof t.title==`string`?t.title:void 0,snippet:typeof t.snippet==`string`?t.snippet:null})}return i}function kn(e,t,n){let r=t??[],i=r.length===0?{}:un(r,n),a=e?.title??i.title,o=e?.description??i.description,s=e?.tags??[],c=i.tags??[],l;if(c.length===0)l=s;else{let e=new Set;l=[];for(let t of c)e.has(t)||(e.add(t),l.push(t));for(let t of s)e.has(t)||(e.add(t),l.push(t))}return{title:a,description:o,tags:l}}async function An(e,t,n={}){let r=e.replace(/^\.\//,``).replace(/^\/+/,``),i=j(t.projectDir,r),a=t.historyDepth??5,o=n.includeRichFields===!0,s=Tn(i);if(!o){let e=kn(await s,t.folderRules,r);return{path:r,title:e.title,description:e.description,tags:e.tags,backlinkCount:null,backlinks:null,forwardLinkCount:null,forwardLinks:null,history:null,historySource:null,projectHistory:null,projectHistorySource:null}}let[c,l,u,d,f]=await Promise.all([s,En(t.serverUrl,wn(r)).catch(()=>null),On(t.serverUrl,wn(r)).catch(()=>null),yn(t.projectDir,r,a).catch(()=>({commits:[],source:`shadow-repo`})),pn(t.projectDir,r,a).catch(()=>({commits:[],source:`git`}))]),p=kn(c,t.folderRules,r);return{path:r,title:p.title,description:p.description,tags:p.tags,backlinkCount:l?.length??null,backlinks:l,forwardLinkCount:u?.length??null,forwardLinks:u,history:d.commits,historySource:d.source,projectHistory:f.commits,projectHistorySource:f.source}}async function jn(e,t){let n={directMdCount:0,recursiveMdCount:0,childDirCount:0,mostRecent:null,truncated:!1},r=0,i=[{path:e,depth:0}];for(;i.length>0;){let e=i.shift();if(!e)break;if(r>=bn){n.truncated=!0;break}let a;try{a=await ye(e.path,{withFileTypes:!0})}catch{continue}for(let o of a){if(r>=bn){n.truncated=!0;break}r++;let a=o.name;if(o.isDirectory()){if(xn.has(a)||a.startsWith(`.`))continue;e.depth===0&&n.childDirCount++,i.push({path:`${e.path}/${a}`,depth:e.depth+1})}else if(o.isFile()&&Sn.test(a)){n.recursiveMdCount++,e.depth===0&&n.directMdCount++;let r=`${e.path}/${a}`;try{let e=await be(r);(!n.mostRecent||e.mtimeMs>n.mostRecent.mtimeMs)&&(n.mostRecent={absPath:r,relPath:ce(t,r).split(/[\\/]/).filter(Boolean).join(`/`),mtimeMs:e.mtimeMs})}catch{}}}}return n}async function Mn(e,t){let n=e.replace(/^\.\//,``).replace(/^\/+/,``).replace(/\/+$/,``),r=await jn(j(t.projectDir,n),t.projectDir),i;if(r.mostRecent){let e=await Tn(r.mostRecent.absPath);i={path:r.mostRecent.relPath,title:e?.title??ie(r.mostRecent.relPath),updatedAt:new Date(r.mostRecent.mtimeMs).toISOString()}}let a={path:n,type:`directory`,directMdCount:r.directMdCount,recursiveMdCount:r.recursiveMdCount,childDirCount:r.childDirCount,mostRecentMd:i,truncated:r.truncated},o=t.folderRules??[];if(o.length>0){let e=un(o,n);e.title!==void 0&&(a.title=e.title),e.description!==void 0&&(a.description=e.description),e.tags!==void 0&&e.tags.length>0&&(a.tags=e.tags)}return a}const Nn=50*1024,Pn=/\.(png|jpe?g|gif|webp|svg|pdf|zip|tar|gz|tgz|mp4|mov|mp3|wav|ico|bmp)$/i,Fn=[`Run a read-only bash-like command against the project content directory. Returns raw stdout plus enriched metadata for every wiki file referenced (frontmatter, backlink/forward-link counts, shadow-repo activity with agent/human attribution).`,``,`Allowlist: cat, ls, grep, find, head, tail, wc, sort, uniq, cut. Pipes (|) work between stages. Redirections, subshells, and writes are rejected.`,``,"cwd: the command runs in the MCP client's first advertised root (the project the user is working in). Pass an explicit absolute `cwd` to run against a different directory. Paths inside the command resolve relative to that cwd; traversal above it is rejected.",``,"Stdout provenance headers (GNU-style): `ls <dir>/` prepends `<dir>/:`, single-file `cat`/`head`/`tail` prepends `==> <path> <==`, so the subject of the command is visible in raw output. Multi-file `cat a b` emits no header — the `enrichedPaths` array still lists every file. `head`/`tail` used as pipe trimmers (no file arg) defer to the upstream producer.",``,`Examples:`,'- `exec({ command: "cat articles/auth.md" })` — file contents + full enrichment','- `exec({ command: "ls articles/" })` — listing + per-file enrichment (slim)','- `exec({ command: "grep -rn oauth articles/ | head -5" })` — pipe with enrichment on matched files','- `exec({ command: "ls", cwd: "/abs/path/to/other-repo" })` — run in a different project'].join(`
162
- `);function In(e){let t=e.split(`
163
- `),n=t[t.length-1]===``?t.length-1:t.length;if(n<=500&&e.length<=Nn)return{text:e,truncated:!1,omittedLines:0};let r=Math.min(n,500),i=0,a=0;for(let e=0;e<r;e++){let n=t[e];if(i+=n.length+1,i>Nn)break;a++}let o=t.slice(0,a).join(`
164
- `),s=n-a;return{text:`${o}\n<truncated: ${s} more lines — re-run with a more-specific query>`,truncated:!0,omittedLines:s}}function Ln(e){let t=[];for(let n of e)if(n.command===`cat`)for(let e of n.args.slice(1))e.startsWith(`-`)||Pn.test(e)&&t.push(e);return t}function Rn(e){for(let t=1;t<e.length;t++){let n=e[t],r=n.match(/^--lines=(\d+)$/);if(r)return Number(r[1]);if(n===`--lines`&&t+1<e.length){let n=Number(e[t+1]);if(Number.isFinite(n))return n}if(n===`-n`&&t+1<e.length){let n=Number(e[t+1]);if(Number.isFinite(n))return n}let i=n.match(/^-n(\d+)$/);if(i)return Number(i[1]);let a=n.match(/^-(\d+)$/);if(a)return Number(a[1])}return 10}function zn(e,t){if(e.length<2)return null;let n=e[e.length-1];if(n.command!==`head`&&n.command!==`tail`)return null;let r=Rn(n.args),i=t.split(`
165
- `),a=i[i.length-1]===``?i.length-1:i.length;if(a<r)return null;let o=i.slice(0,a),s=new Set(o.map(e=>{let t=e.indexOf(`:`);return t>0?e.slice(0,t):e})).size,c=e.slice(0,-1).map(e=>e.command).join(` | `);return{banner:`Output hit \`${n.command} -${r}\` cap (${a} lines, ${s} unique file${s===1?``:`s`}). The \`${c}\` stage may have had more matches that never reached stdout. For existence checks across many files, prefer \`grep -rl PATTERN <dir>\` (list files only, no head). For enumeration, drop the \`| ${n.command}\` or widen the cap.`}}function Bn(e){return e.type===`directory`}function Vn(e){let t=[e.title?`**${e.title}** (${e.path}/)`:`**${e.path}/** (directory)`];e.description&&t.push(e.description),e.tags&&e.tags.length>0&&t.push(`tags: ${e.tags.join(`, `)}`);let n=[];return n.push(`${e.recursiveMdCount} md file${e.recursiveMdCount===1?``:`s`}`),e.childDirCount>0&&n.push(`${e.childDirCount} subdir${e.childDirCount===1?``:`s`}`),t.push(n.join(`, `)),e.mostRecentMd&&t.push(`most recent: ${e.mostRecentMd.title??e.mostRecentMd.path} (${e.mostRecentMd.path})`),e.truncated&&t.push(`scan truncated`),`- ${t.join(` — `)}`}function Hn(e){let t=[`**${e.title??e.path}** (${e.path})`];if(e.description&&t.push(e.description),e.tags.length>0&&t.push(`tags: ${e.tags.join(`, `)}`),e.backlinkCount!==null&&t.push(`backlinks: ${e.backlinkCount}`),e.forwardLinkCount!==null&&t.push(`forward links: ${e.forwardLinkCount}`),e.history&&e.history.length>0){let n=e.history.map(e=>{let t=e.writerClassification===`agent`?`agent: ${e.writerName}`:e.writerClassification===`human`?`human: ${e.writerName}`:`${e.writerClassification}: ${e.writerName}`;return`${e.hash.slice(0,7)} [${t}] ${e.message}`});t.push(`OK edits: ${n.join(` · `)}`)}if(e.projectHistory&&e.projectHistory.length>0){let n=e.projectHistory.map(e=>`${e.hash.slice(0,7)} ${e.authorName}: ${e.subject}`);t.push(`commits: ${n.join(` · `)}`)}return`- ${t.join(` — `)}`}function Un(e,t,n){let r=null;for(let t=e.length-1;t>=0;t--){let n=e[t],i=n.command;if(i===`ls`||i===`cat`){r=n;break}if((i===`head`||i===`tail`)&&q(K(n)).length>0){r=n;break}}if(!r)return``;let i=q(K(r));if(r.command===`ls`){let e=i[i.length-1];if(!e||e===`.`)return``;let n=e.replace(/\/+/g,`/`);return n.startsWith(`./`)&&(n=n.slice(2)),n.endsWith(`/`)&&(n=n.slice(0,-1)),!n||!t.has(n)?``:`${n}/:\n`}let a=i.filter(e=>/\.(md|mdx)$/.test(e)&&n.has(e));return a.length===1?`==> ${a[0]} <==\n`:``}function Wn(e){if(e.length===0)return``;let t=[``,`### Referenced files`,``];for(let n of e)t.push(Bn(n)?Vn(n):Hn(n));return t.join(`
166
- `)}async function Gn(e,t){let n=[],r=[];return await Promise.all(t.map(async t=>{try{let i=await be(j(e,t));i.isDirectory()?r.push(t):i.isFile()&&n.push(t)}catch{/\.(md|mdx)$/i.test(t)&&n.push(t)}})),{files:n,dirs:r}}function Y(e,t){return F(t,{enrichedPaths:[],error:{category:e,message:t}},!0)}function Kn(e,t){return e.map(e=>{let n=t(bt(e.path));return{...e,previewUrl:n?.url??null,...n?{previewUrlSource:n.source}:{}}})}async function qn(e,t){let n=await t.resolveCwd(e.cwd),r=await L(t.serverUrl),i=an(e.command);if(`error`in i)return Y(i.error.category,i.error.message);let a=Gt(i.stages),o=Kt(a),s=await Bt(n),c=Ft(n),l=``,u=``;try{let e=await It(c,o);l=e.stdout,u=e.stderr}catch(e){return e instanceof Pt?Y(`output_overflow`,`Output exceeded 16 MB buffer. Narrow the command (e.g., add a more specific grep pattern, use head, restrict the path).`):Y(`shell_construct_blocked`,`exec failed: ${e instanceof Error?e.message:String(e)}`)}let d=await Bt(n),f=Vt(s.snapshot,d.snapshot);if(f.changed.length>0)return Y(`security_invariant_violation`,`Security invariant violated: file(s) in the content directory were modified during a read-only exec call: ${f.changed.join(`, `)}. This indicates a parser bug; the command has been logged.`);let p=In(l),m=Mt(l,a),{files:h,dirs:g}=await Gn(n,m),_=a.length===1&&a[0].command===`cat`&&h.length===1,v=t.config.folders,y=await Promise.all(h.map(e=>An(e,{projectDir:n,serverUrl:r,folderRules:v},{includeRichFields:_}).catch(()=>({path:e,tags:[],backlinkCount:null,backlinks:null,forwardLinkCount:null,forwardLinks:null,history:null,historySource:null,projectHistory:null,projectHistorySource:null})))),b=await Promise.all(g.map(e=>Mn(e,{projectDir:n,folderRules:v}).catch(()=>({path:e,type:`directory`,directMdCount:0,recursiveMdCount:0,childDirCount:0,truncated:!1}))));if(!_&&r&&y.length>0){let e=await Dn(r,y.map(e=>wn(e.path))).catch(()=>null);if(e)for(let t of y){let n=e.get(wn(t.path));typeof n==`number`&&(t.backlinkCount=n)}}let x=new Map(y.map(e=>[e.path,e])),S=new Map(b.map(e=>[e.path,e])),C=[];for(let e of m){let t=x.get(e);if(t){C.push(t);continue}let n=S.get(e);n&&C.push(n)}let w=Ln(a),T=[];w.length>0&&T.push(`File${w.length>1?`s`:``} ${w.join(`, `)} appear${w.length===1?`s`:``} to be binary (image/PDF/etc.) — exec returns text only (NG8). For binary retrieval, use native Read.`);let E=zn(a,l);E&&T.push(E.banner),u&&T.push(`stderr: ${u.trim()}`);let D=T.length>0?`${T.join(`
167
- `)}\n\n`:``,O=Un(a,S,x)+p.text,ee=`${D}${O}${Wn(C)}`,k,A;if(t.config){let{resolve:e,ui:r}=await H({config:t.config,resolveCwd:async()=>n});k=Kn(C,e),A=r}else k=C.map(e=>({...e,previewUrl:null}));return F(ee,{enrichedPaths:k,stdout:O,stdoutTruncated:p.truncated,...A?{ui:A}:{},...T.length>0?{warnings:T}:{}})}function Jn(e,t){e.tool(`exec`,Fn,{command:N.string().describe(`Read-only bash command (allowlist: cat, ls, grep, find, head, tail, wc, sort, uniq, cut; pipes OK)`),cwd:N.string().optional().describe(`Absolute host path to run the command from. Defaults to the MCP client's first advertised root, then the server startup cwd.`)},async e=>{try{return await qn(e,t)}catch(e){return Y(`shell_construct_blocked`,`exec handler error: ${e instanceof Error?e.message:String(e)}`)}})}const Yn=[`[Requires: Hocuspocus server] Find all pages that link to a given page.`,`Returns source page names, resolved titles, and context snippets as JSON.`,``,`**Parameters:**`,'- `docName` — Target page docName, typically without extension (for example, "articles/project-alpha"). A trailing `.md` or `.mdx` is stripped automatically.'].join(`
168
- `);function Xn(e,t){e.tool(`get_backlinks`,Yn,{docName:N.string().describe(`Target page docName`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=R(e.docName);if(!r.ok)return P(r.error,!0);let i=await z(n,`/api/backlinks?docName=${encodeURIComponent(r.docName)}`);if(!i.ok)return P(`Error: ${i.error}`,!0);let{ok:a,...o}=i,s=o,{resolve:c,ui:l}=await H(t),u=(s.backlinks??[]).map(e=>{let t=typeof e.source==`string`?e.source:null,n=t?c(t):null;return{...e,previewUrl:n?.url??null,...n?{previewUrlSource:n.source}:{}}}),d={...s,backlinks:u,ui:l};return F(JSON.stringify(d,null,2),d)})}const Zn=[`[Requires: Hocuspocus server] Find missing internal page targets across the corpus.`,`Returns grouped dead links keyed by missing target with source-doc rows as JSON.`,``,`**Parameters:**`,"- `sourceDocNames` (optional) — Referring source docs to narrow the audit with OR semantics"].join(`
169
- `);function Qn(e,t){e.tool(`get_dead_links`,Zn,{sourceDocNames:N.array(N.string()).optional().describe(`Referring source docs to narrow the audit with OR semantics`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=new URLSearchParams;for(let t of e.sourceDocNames??[]){let e=R(t);if(!e.ok)return P(e.error,!0);r.append(`sourceDocName`,e.docName)}let i=r.toString(),a=await z(n,`/api/dead-links${i?`?${i}`:``}`);if(!a.ok)return P(`Error: ${a.error}`,!0);let{ok:o,...s}=a,c=s,{resolve:l,ui:u}=await H(t),d=(c.deadLinks??[]).map(e=>{let t=typeof e.target==`string`?e.target:null,n=t?l(t):null,r=(e.sources??[]).map(e=>{let t=typeof e.source==`string`?e.source:null,n=t?l(t):null;return{...e,previewUrl:n?.url??null,...n?{previewUrlSource:n.source}:{}}});return{...e,sources:r,previewUrl:n?.url??null,...n?{previewUrlSource:n.source}:{}}}),f={...c,deadLinks:d,ui:u};return F(JSON.stringify(f,null,2),f)})}const $n=[`[Requires: Hocuspocus server] Find all pages that a given page links to.`,`Returns forward links as JSON.`,``,`**Parameters:**`,"- `docName` — Source page docName, typically without extension. A trailing `.md` or `.mdx` is stripped automatically."].join(`
170
- `);function er(e,t){e.tool(`get_forward_links`,$n,{docName:N.string().describe(`Source page docName`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=R(e.docName);if(!r.ok)return P(r.error,!0);let i=await z(n,`/api/forward-links?docName=${encodeURIComponent(r.docName)}`);if(!i.ok)return P(`Error: ${i.error}`,!0);let{ok:a,...o}=i,s=o,{resolve:c,ui:l}=await H(t),u=(s.forwardLinks??[]).map(e=>{let t=e.kind===`doc`&&typeof e.docName==`string`?e.docName:null,n=t?c(t):null;return{...e,previewUrl:n?.url??null,...n?{previewUrlSource:n.source}:{}}}),d={...s,forwardLinks:u,ui:l};return F(JSON.stringify(d,null,2),d)})}const tr=[`[Requires: Hocuspocus server] List version history for a document.`,`Returns timeline entries from the shadow repo, sorted by timestamp descending.`,"Each entry includes a commit SHA that can be passed to `rollback_to_version`.",``,`**Parameters:**`,"- `docName` — Document name to query history for, typically without extension. A trailing `.md` or `.mdx` is stripped automatically.","- `branch` (optional) — Branch name (default: current branch)","- `limit` (optional) — Maximum entries to return (default 50, max 200)","- `offset` (optional) — Number of entries to skip for pagination (default 0)",'- `type` (optional) — Filter by entry type: "checkpoint", "upstream", or "wip"',"- `author` (optional) — Filter to entries by this author name or email","- `excludeAuthor` (optional) — Exclude entries by this author name or email"].join(`
171
- `);function nr(e,t){e.tool(`get_history`,tr,{docName:N.string().describe(`Document name to query history for`),branch:N.string().optional().describe(`Branch name (default: current branch)`),limit:N.number().int().min(1).max(200).optional().describe(`Maximum entries to return (default 50, max 200)`),offset:N.number().int().min(0).optional().describe(`Number of entries to skip for pagination (default 0)`),type:N.enum([`checkpoint`,`upstream`,`wip`]).optional().describe(`Filter by entry type`),author:N.string().optional().describe(`Filter to entries by this author name or email`),excludeAuthor:N.string().optional().describe(`Exclude entries by this author name or email`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=R(e.docName);if(!r.ok)return P(r.error,!0);let i=new URLSearchParams;i.set(`docName`,r.docName),e.branch&&i.set(`branch`,e.branch),e.limit!=null&&i.set(`limit`,String(e.limit)),e.offset!=null&&i.set(`offset`,String(e.offset)),e.type&&i.set(`type`,e.type),e.author&&i.set(`author`,e.author),e.excludeAuthor&&i.set(`excludeAuthor`,e.excludeAuthor);let a=await z(n,`/api/history?${i.toString()}`);if(!a.ok)return P(`Error: ${a.error}`,!0);let{ok:o,...s}=a,c=await V(r.docName,{config:t.config,resolveCwd:t.resolveCwd});return F(JSON.stringify(s,null,2),{...s,previewUrl:c?.url??null,...c?{previewUrlSource:c.source}:{}})})}const rr=[`[Requires: Hocuspocus server] Find the most-linked pages in the knowledge graph.`,`Returns hub pages ordered by inbound link count as JSON.`,``,`**Parameters:**`,"- `limit` (optional) — Maximum number of hubs to return (default 20)"].join(`
172
- `);function ir(e,t){e.tool(`get_hubs`,rr,{limit:N.number().int().positive().optional().describe(`Maximum number of hubs to return`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=await z(n,`/api/hubs${e.limit?`?limit=${encodeURIComponent(String(e.limit))}`:``}`);if(!r.ok)return P(`Error: ${r.error}`,!0);let{ok:i,...a}=r,o=a,{resolve:s,ui:c}=await H(t),l=(o.hubs??[]).map(e=>{let t=typeof e.docName==`string`?e.docName:null,n=t?s(t):null;return{...e,previewUrl:n?.url??null,...n?{previewUrlSource:n.source}:{}}}),u={...o,hubs:l,ui:c};return F(JSON.stringify(u,null,2),u)})}const ar=[`[Requires: Hocuspocus server] Find disconnected pages in the knowledge graph.`,`Returns orphaned pages as JSON.`,``,`**Parameters:**`,"- `mode` (optional) — Orphan lens: `incoming`, `outgoing`, or `both` (default `both`)"].join(`
173
- `);function or(e,t){e.tool(`get_orphans`,ar,{mode:N.enum(u).optional().describe(`Filter which type of graph disconnection to surface`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=await z(n,`/api/orphans${e.mode?`?mode=${encodeURIComponent(e.mode)}`:``}`);if(!r.ok)return P(`Error: ${r.error}`,!0);let{ok:i,...a}=r,o=a,{resolve:s,ui:c}=await H(t),l=(o.orphans??[]).map(e=>{let t=typeof e.docName==`string`?e.docName:null,n=t?s(t):null;return{...e,previewUrl:n?.url??null,...n?{previewUrlSource:n.source}:{}}}),u={...o,orphans:l,ui:c};return F(JSON.stringify(u,null,2),u)})}const sr=["Return a browser URL for the given wiki docName. Agents should call this IMMEDIATELY BEFORE `write_document` / `edit_document` so they can navigate the preview browser to the doc first and watch the CRDT edit land live.",``,`**Parameters:**`,"- `docName` — Wiki doc name, typically without extension.",``,"Returns `{ previewUrl, previewUrlSource }` (source: `env` / `lock` / `config`). When no source is configured, returns `{ previewUrl: null }` and the agent may proceed without navigation."].join(`
174
- `);async function cr(e,t){let n=R(e.docName);if(!n.ok)return{ok:!1,error:n.error};let r=n.docName,i=await t.resolveCwd(),a=h(t.config,i),o;try{o=c({projectDir:i,contentDir:a,includePatterns:t.config.content.include,excludePatterns:t.config.content.exclude})}catch(e){return{ok:!1,error:`Cannot evaluate content filter: ${e instanceof Error?e.message:String(e)}`}}if(![`${r}.md`,`${r}.mdx`].some(e=>!o.isExcluded(e)))return{ok:!1,error:`Error: docName "${r}" is not inside content.include globs (${t.config.content.include.join(`, `)}). This tool only returns URLs for docs that match those globs.`};let s=m(a),l=U(r,{config:t.config,lockDir:s});return l?{ok:!0,result:{previewUrl:l.url,previewUrlSource:l.source},text:`Preview URL for "${r}" (source: ${l.source}):\n${l.url}`}:{ok:!0,result:{previewUrl:null},text:`No preview URL resolvable for "${r}". The server is likely not running yet. Start it with \`open-knowledge start\` (or \`preview_start\`), then **call \`get_preview_url\` again** — the server writes a lock file that this tool reads to resolve the URL. NEVER guess or manually construct the preview URL. Alternatively, set \`OPEN_KNOWLEDGE_PREVIEW_BASE_URL\` or add \`preview.baseUrl\` to .open-knowledge/config.yml.`}}function lr(e,t){e.tool(`get_preview_url`,sr,{docName:N.string().min(1)},async e=>{let n=await cr(e,t);return n.ok?F(n.text,n.result):P(n.error,!0)})}function ur(e,t){return`Capture this external source into the project knowledge base as raw reference material. **Raw preservation only** — no summary, no analysis, no interpretation. Summarizing is the job of the \`research\` tool later.
175
-
176
- Source: ${e}
177
-
178
- The content directory for this project is **\`${t}\`** (from \`${d}/config.yml\`).
179
-
180
- ## Step 1: Fetch the content
181
-
182
- - **URL** → use your available web fetch tool.
183
- - **Local file or attachment** → use your native file read tool.
184
-
185
- If the fetch fails (login wall, 401/402/403/429, anti-scraping block), **stop and ask the user to paste the content directly**. Do not save a stub, an error page, or a login wall as "raw content" — that poisons the knowledge base.
186
-
187
- If the fetcher returns an obvious *summary* of the page instead of the raw content (some LLM-backed fetch tools do this), note it and try a raw alternative (e.g., \`curl -sL <url>\` for text-heavy sources, or ask the user to paste). The goal is verbatim bytes.
188
-
189
- ## Step 2: Save as raw reference material
190
-
191
- Write the content as a markdown file inside the content directory (\`${t}\`). The convention if this project adopts the three-tier lifecycle is to group raw sources together — e.g., an \`external-sources/\` subfolder under the content dir — but it's just a convention. Use whatever the project's existing docs layout calls for. If unsure, ask the user or default to a sensible top-level subfolder name.
192
-
193
- Name the file with a kebab-case slug from the source's own title (e.g., \`karpathy-llm-wiki.md\`, \`anthropic-prompt-caching.md\`). Don't put dates in the filename — dates go in frontmatter.
194
-
195
- Prepend this frontmatter:
196
-
197
- \`\`\`yaml
198
- ---
199
- title: Original title of the source
200
- description: One-line summary from the source (their words, not yours)
201
- source_url: https://example.com/article # for URLs
202
- source_path: ./relative/path/to/file.pdf # for local files
203
- date_fetched: YYYY-MM-DD
204
- author: Original author if known
205
- tags:
206
- - relevant-topic
207
- ---
208
- \`\`\`
209
-
210
- ## Step 3: Preserve the content faithfully
211
-
212
- - **Keep** headings, lists, quotes, code blocks, images, citations, references
213
- - **Strip** obvious boilerplate: nav menus, cookie banners, ads, footer links, "related articles" widgets
214
- - **Do NOT** summarize, critique, paraphrase, or interpret. That's \`research\`'s job.
215
- - **For very long sources**, consider splitting by major section with cross-references in frontmatter
216
-
217
- ## Step 4: Verify
218
-
219
- - File exists at the chosen location under the content directory
220
- - Valid frontmatter (at minimum \`title\`, \`description\`, and either \`source_url\` or \`source_path\`)
221
- - \`exec("ls <dir>")\` should list the file with enrichment
222
-
223
- ## Non-goals
224
-
225
- - **No analysis** — don't interpret, compare, or critique the source
226
- - **No promotion to a canonical article** — that's the \`consolidate\` tool's job, later
227
- - **No deduplication** — if the same source is ingested twice, let it happen; cleanup is a separate concern
228
-
229
- Full convention: read \`${d}/AGENTS.md\`.`}const dr=[`Fetch an external source (URL or local file) and save raw content as reference material in the project content directory.`,`Raw preservation only — no analysis or interpretation.`,``,`**Use when:**`,`- Capturing reference material for the project knowledge base`,`- Saving a URL or document for later research`,`- Archiving an external source alongside the codebase`,`- The user shares a URL or document they want preserved`,``,`**Triggers on:**`,`- "ingest", "save this source", "capture this URL", "add to external sources"`,`- User shares a URL, article, or document to preserve in the knowledge base`,`- Research workflow needs raw sources before analysis`].join(`
230
- `);function fr(e,t){e.tool(`ingest`,dr,{source:N.string().describe(`URL, file path, or identifier of the source to ingest`)},e=>F(ur(e.source,t.content.dir),{previewUrl:null}))}function pr(e){return`Initialize a project knowledge base at \`${e}\` for this repository.
231
-
232
- The content directory for this project is **\`${e}\`** (from \`${d}/config.yml\`).
233
-
234
- ## When to use
235
-
236
- - First time setting up a knowledge base in a repo where \`${d}/\` does not exist, or where the content directory has no articles yet
237
- - When onboarding to a new codebase and you want to capture initial understanding for future agent sessions
238
-
239
- ## Steps
240
-
241
- ### 1. Verify the structure exists
242
-
243
- If \`${d}/\` does not already exist, scaffold it from a terminal (not from within this MCP session — scaffolding is a CLI operation, not a tool call):
244
-
245
- \`\`\`bash
246
- open-knowledge init
247
- # or: npx @inkeep/open-knowledge init
248
- \`\`\`
249
-
250
- That creates \`${d}/\` with \`config.yml\`, \`AGENTS.md\`, \`.gitignore\`, and wires this MCP server into \`.mcp.json\`. It does **not** scaffold content subdirectories — knowledge lives wherever \`content.dir\` points (currently \`${e}\`). After scaffolding, reconnect the MCP client so the server picks up the new config.
251
-
252
- If you have \`Bash\` tool access, you can shell out: \`bash\` → \`npx @inkeep/open-knowledge init\`, then prompt the user to reconnect.
253
-
254
- ### 2. Read the codebase systematically
255
-
256
- Explore the project to build understanding before writing anything:
257
-
258
- 1. **Start broad** — Read \`README.md\`, \`CLAUDE.md\` or \`AGENTS.md\`, \`package.json\` (or equivalent manifest), and any existing prose documentation
259
- 2. **Map the structure** — Use \`exec("ls <dir>")\` for directories under \`content.dir\` that match \`content.include\` (returns folder metadata — file counts, subdirs, most-recent md) and native \`Glob\`/\`ls\` for source code
260
- 3. **Read key files** — Entry points, config files, core modules, type definitions, schema files
261
- 4. **Check existing docs** — \`specs/\`, \`docs/\`, \`ARCHITECTURE.md\`, or any prose dirs: use \`exec\` for every \`.md\` / \`.mdx\` that matches \`content.include\` (under shipped defaults, that is essentially **all** markdown in the repo). Use native \`Read\`/\`Glob\` only for source code / non-markdown, or when MCP is unavailable
262
- 5. **Review recent history** — \`git log --oneline -30\` for recent decisions and direction
263
-
264
- Don't rush this phase. The quality of articles depends on the quality of understanding.
265
-
266
- ### 3. Synthesize knowledge articles
267
-
268
- Write articles inside the content directory (\`${e}\`). Organization is up to the project — no enforced structure:
269
-
270
- - If the project already has a docs layout (\`docs/\`, \`guides/\`, topic-grouped subfolders), follow it
271
- - If starting fresh, group by topic (e.g., \`architecture/\`, \`auth/\`, \`data-model/\`) — create subfolders as needed; no scaffolded directories exist by default
272
- - **One topic per article** — keep articles focused (e.g., "Auth Architecture", not "Everything About The Backend")
273
- - **Add proper frontmatter**:
274
-
275
- \`\`\`yaml
276
- ---
277
- title: Article Title
278
- description: One-line summary
279
- tags:
280
- - relevant
281
- - tags
282
- ---
283
- \`\`\`
284
-
285
- - **Write for future agents** — Explain the *why* and *how things connect*, not just *what exists*. Source code already says what exists.
286
- - **Keep articles concise** — 100-300 lines is a good target. Split larger topics into multiple articles.
287
- - **Link to source code** by file path when helpful, but don't duplicate code into articles.
288
-
289
- ### 4. Link aggressively
290
-
291
- This is the single highest-leverage step for a new knowledge base. Articles that don't link each other are isolated documents; articles that cross-link form a navigable graph.
292
-
293
- - **Every noun-phrase that names another article is a \`[[Page Name]]\` link.** Write links inline as you draft — don't save linking for a second pass. Prefer \`[[Page]]\` over Markdown \`[text](./page.md)\` since only wiki-links participate in the backlinks index.
294
- - **Redlinks are fine — write them eagerly.** If you're drafting "Auth Architecture" and mention "session tokens", write \`[[Session Tokens]]\` even if that page doesn't exist yet. The redlink is a to-do list for the next pass.
295
- - **Build hub articles.** Pick 2–3 broad topics (e.g., "Architecture Overview", "Data Model") and have them link out to the specific articles below them. Hubs are what agents discover first — their outbound links are how everything else becomes findable.
296
- - **Cross-link siblings.** In each subfolder, 2–3 closely-related articles should link each other under a "See also" section or inline.
297
- - **After writing a batch of articles, verify link density:** \`exec("cat <article>.md")\` on a sample and confirm the rendered output shows a healthy backlinks list. An article with zero backlinks is an island — link back to it from somewhere.
298
-
299
- ### 5. Suggested starting topics
300
-
301
- Depending on the project, consider articles covering:
302
-
303
- - **Architecture overview** — High-level system design, key components, how they connect
304
- - **Data model** — Core entities, relationships, database schema
305
- - **API surface** — Endpoints, protocols, authentication model
306
- - **Deploy & infrastructure** — How to deploy, CI/CD, environments
307
- - **Development workflow** — How to run locally, test conventions, contribution flow
308
- - **Key decisions** — Architecture decisions and their rationale (the "why")
309
- - **Domain concepts** — Business domain terms and their meaning in code
310
-
311
- ### 6. Verify
312
-
313
- - \`exec("ls ${e}")\` shows the articles you wrote, each with title/description/tags enrichment
314
- - \`exec("grep -rn <common-codebase-term> ${e}")\` finds the expected articles
315
- - \`exec("cat <article>.md")\` on a sample shows the article plus its backlinks section — if the backlinks list is empty, go back to step 4 and link from somewhere
316
- - Every article has frontmatter with at minimum \`title\` and \`description\`
317
-
318
- ## Non-goals
319
-
320
- - **Don't produce a file-by-file code index** — the agent reads source code directly when needed
321
- - **Don't copy source code into articles** — link by path
322
- - **Don't write articles for things that change often** (dependency versions, file counts); focus on stable understanding
323
- - **Don't create scaffolded subfolders you won't fill** — empty \`articles/\`/\`research/\`/\`external-sources/\` folders are clutter; organize as you actually need
324
-
325
- Full convention: read \`${d}/AGENTS.md\`.`}const mr=[`Bootstrap the project knowledge base by reading the codebase and writing initial knowledge articles grouped by topic.`,``,`**Use when:**`,`- Setting up a knowledge base for the first time in a repo`,`- Onboarding to a new codebase and capturing initial understanding`,`- The content directory is empty or sparse`,``,`**Triggers on:**`,`- "init content", "bootstrap knowledge base", "populate articles", "set up project knowledge"`,`- User asks to document or catalog the codebase`].join(`
326
- `);function hr(e,t){e.tool(`init-content`,mr,async()=>{let e=pr(t.config.content.dir),n=await t.resolveCwd(),r=m(h(t.config,n));return F(e,{ui:yt({config:t.config,lockDir:r})})})}const gr=[`[Requires: Hocuspocus server] List available documents from the Hocuspocus server.`,`Returns document names, optionally filtered by directory.`,``,`**Parameters:**`,"- `dir` (optional) — Filter to documents in this directory"].join(`
327
- `);function _r(e,t){e.tool(`list_documents`,gr,{dir:N.string().optional().describe(`Optional directory to filter documents`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=await z(n,`/api/documents${e.dir?`?dir=${encodeURIComponent(e.dir)}`:``}`);if(!r.ok)return P(`Error: ${r.error}`,!0);let{ok:i,...a}=r,o=a,{resolve:s,ui:c}=await H(t),l=(o.documents??[]).map(e=>{let t=typeof e.docName==`string`?e.docName:null,n=t?s(t):null;return{...e,previewUrl:n?.url??null,...n?{previewUrlSource:n.source}:{}}}),u={...o,documents:l,ui:c};return F(JSON.stringify(u,null,2),u)})}const vr=[`Read a wiki file with enriched context: contents + frontmatter metadata + recent shadow-repo activity (agent vs human attribution) + backlink/forward-link context.`,``,`**Use when:**`,`- Loading an article for context`,`- Understanding who changed a file recently and whether it was an agent or human`,`- Seeing how this page links out and what links back to it`,``,"Prefer this over your native `Read` for wiki files — one call returns what otherwise takes 3-4.",``,`**Parameters:**`,"- `path` — Project-root-relative path to the file, including extension (e.g. `articles/auth/sso.md`). To pass this document to `edit_document` / `write_document` / `get_backlinks`, strip the extension (they take extension-less `docName`).","- `since` (reserved) — Reserved for shadow-log since-filter; currently unused."].join(`
328
- `);function yr(e){if(!e||e.length===0)return``;let t=[``,`### Recent activity (OK edits)`,``];for(let n of e){let e=n.writerClassification===`agent`?`agent: ${n.writerName}`:n.writerClassification===`human`?`human: ${n.writerName}`:`${n.writerClassification}: ${n.writerName}`,r=n.hash.slice(0,7);t.push(`- ${r} ${n.date} [${e}] ${n.message}`)}return t.join(`
329
- `)}function br(e){if(!e||e.length===0)return``;let t=[``,`### Commit history (project git)`,``];for(let n of e){let e=n.hash.slice(0,7);t.push(`- ${e} ${n.date} ${n.authorName} — ${n.subject}`)}return t.join(`
330
- `)}function xr(e){if(!e||e.length===0)return``;let t=[``,`### Backlinks (${e.length})`,``];for(let n of e){let e=n.title?` — "${n.title}"`:``,r=n.snippet?` — "${n.snippet}"`:``;t.push(`- ${n.source}${e}${r}`)}return t.join(`
331
- `)}function Sr(e){if(!e||e.length===0)return``;let t=[``,`### Forward links (${e.length})`,``];for(let n of e){if(n.kind===`external`){let e=n.title?` — "${n.title}"`:``,r=n.snippet?` — "${n.snippet}"`:``;t.push(`- ${n.url}${e}${r}`);continue}let e=n.title?` — "${n.title}"`:``,r=n.snippet?` — "${n.snippet}"`:``;t.push(`- ${n.docName}${e}${r}`)}return t.join(`
332
- `)}function Cr(e){return e.replace(/^\.\//,``).replace(/^\/+/,``)}function wr(e){return e.replace(/\.(md|mdx)$/i,``)}async function Tr(e,t){let n=await t.resolveCwd(e.cwd),r=Cr(e.path),i=j(n,r),a=t.config.mcp.tools.read_document.historyDepth,o=await L(t.serverUrl),[s,c]=await Promise.all([ve(i,`utf-8`),An(r,{projectDir:n,serverUrl:o,historyDepth:a,folderRules:t.config.folders},{includeRichFields:!0})]),l=r.split(`/`).pop()?.replace(/\.md$/,``).replace(/\.mdx$/,``)??r,u=c.title??l,d=c.description??``,f=c.tags,p=[];p.push(`## ${u}`),d&&p.push(`**Description:** ${d}`),f.length>0&&p.push(`**Tags:** ${f.join(`, `)}`),p.push(`**Path:** ${r}`);let m=yr(c.history);m&&p.push(m);let h=br(c.projectHistory);h&&p.push(h);let g=xr(c.backlinks);g&&p.push(g);let _=Sr(c.forwardLinks);return _&&p.push(_),p.push(``,`### Content`,``,s),p.join(`
333
- `)}function Er(e,t){e.tool(`read_document`,vr,{path:N.string().describe(`Project-root-relative path to the file`),since:N.string().optional().describe(`Reserved; currently unused (§15 Future Work)`),cwd:N.string().optional().describe("Absolute host path to resolve `path` against. Defaults to the MCP client's first advertised root.")},async e=>{try{let n=await Tr(e,t),r=await V(wr(Cr(e.path)),{config:t.config,resolveCwd:t.resolveCwd});return r?F(n,{previewUrl:r.url,previewUrlSource:r.source}):F(n,{previewUrl:null})}catch(e){return P(`Error: ${e instanceof Error?e.message:String(e)}`,!0)}})}const Dr=["[Requires: Hocuspocus server] Rename a document through the managed rename flow at `POST /api/rename`.",`Renames the target document and rewrites inbound wiki-links plus supported internal inline Markdown links in affected docs.`,``,`**Parameters:**`,"- `docName` — Current document name, typically without extension. A trailing `.md` or `.mdx` is stripped automatically.","- `newDocName` — New document name, typically without extension. A trailing `.md` or `.mdx` is stripped automatically."].join(`
334
- `);function Or(e){return Array.isArray(e)?e.flatMap(e=>{if(!e||typeof e!=`object`)return[];let{fromDocName:t,toDocName:n}=e;return typeof t==`string`&&typeof n==`string`?[{fromDocName:t,toDocName:n}]:[]}):[]}function kr(e){return Array.isArray(e)?e.flatMap(e=>{if(!e||typeof e!=`object`)return[];let{docName:t,rewrites:n}=e;return typeof t==`string`&&typeof n==`number`?[{docName:t,rewrites:n}]:[]}):[]}function Ar(e,t,n=`${t}s`){return e===1?t:n}function jr(e,t){e.tool(`rename_document`,Dr,{docName:N.string().describe(`Current document name`),newDocName:N.string().describe(`New document name`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=R(e.docName);if(!r.ok)return P(r.error,!0);let i=R(e.newDocName);if(!i.ok)return P(i.error,!0);let a=await B(n,`/api/rename`,{docName:r.docName,newDocName:i.docName});if(!a.ok){let e=typeof a.error==`string`?a.error:`Rename failed`,t={ok:!1,error:e};return F(`Error: ${e}`,t,!0)}let o=Or(a.renamed),s=kr(a.rewrittenDocs),c=o.map(({fromDocName:e,toDocName:t})=>`${e} -> ${t}`).join(`, `)||`${r.docName} -> ${i.docName}`,l=s.length===0?`No inbound links required updates.`:`Rewrote ${s.length} ${Ar(s.length,`document`)}.`,u={config:t.config,resolveCwd:t.resolveCwd},d=await V(i.docName,u),f=await V(r.docName,u),p={ok:!0,renamed:o,rewrittenDocs:s,previewUrl:d?.url??null,...d?{previewUrlSource:d.source}:{},...f?{previousPreviewUrl:f.url}:{}};return F(`Renamed ${c}. ${l}`,p)})}function Mr(e,t){return`Research this topic and write provisional findings inside the project content directory. Research is **provisional, not canonical** — it captures findings, trade-offs, and open questions at a point in time. Promoting to canonical articles is a deliberate later step (via the \`consolidate\` tool).
335
-
336
- Topic: ${e}
337
-
338
- The content directory for this project is **\`${t}\`** (from \`${d}/config.yml\`).
339
-
340
- ## When to use this workflow
341
-
342
- - A developer asks you to research a topic (e.g., "research CRDT alternatives for our editor")
343
- - You're exploring a decision space before committing to an approach
344
- - Spec conversations and exploratory work that isn't ready to be canonical yet
345
- - You need to synthesize multiple sources into a structured analysis
346
-
347
- ## Principle: provisional, not canonical
348
-
349
- Research articles are **provisional**. They capture what you found at a point in time. They are not the source of truth. When decisions solidify, research gets promoted to canonical articles via the \`consolidate\` tool (or manually). Until then, research is a place where uncertainty lives.
350
-
351
- ## Steps
352
-
353
- ### 1. Scope the research
354
-
355
- Understand what the developer is actually asking:
356
-
357
- - **What specific question needs answering?** If the prompt was vague, narrow it before gathering sources.
358
- - **What's the decision this research will inform?** Research without a decision context tends to meander.
359
- - **What's already known?** Use \`exec("grep -rn <topic-keyword> <content-dir>")\` to find prior work — grep results come with per-file enrichment (title, description, tags) so you can judge relevance without opening each. If prior work exists, use \`exec("cat <path>")\` to load it with full rich context (frontmatter + shadow-repo activity + project git history + backlinks) — you may be iterating on an existing research doc rather than creating a new one.
360
-
361
- If the topic is itself a URL, treat that URL as the anchor source and widen from there. If it's a question, figure out 3–8 sources that could plausibly inform it.
362
-
363
- ### 2. Gather sources via \`ingest\`
364
-
365
- Invoke the \`ingest\` tool for each relevant URL, paper, or document. **Typical research pulls 3–8 sources.** Too few and the synthesis is thin; too many and you'll be reading for the rest of the session.
366
-
367
- **Don't skip \`ingest\`.** Raw sources must be preserved before analysis — it separates capture from interpretation and makes the research reproducible. A research article without preserved sources is just opinion; a research article with preserved sources is a trail someone else can follow.
368
-
369
- If a fetch fails for a source you specifically need, stop and ask the user to paste it — don't silently drop it.
370
-
371
- ### 3. Read and analyze
372
-
373
- Read each ingested source carefully. Also read:
374
-
375
- - **Existing canonical articles** on the topic — use \`exec("cat <path>")\` (rich enrichment: frontmatter + shadow-repo activity + project git history + backlinks in one call)
376
- - **Prior research** on adjacent topics — same: \`exec("cat <path>")\` for Open Knowledge markdown
377
- - **Relevant source code** for projects where research is grounded in the codebase (read entry points, core modules, and any specs that touch the topic) — native \`Read\` is fine for \`.ts\` / \`.js\` / etc.; use \`exec\` for \`.md\` / \`.mdx\` under \`content.include\`
378
- - **Project context** — project-root docs, \`specs/\`, \`reports/\`, or wherever the project organizes design material
379
-
380
- Take notes on:
381
-
382
- - **Key claims** and their evidence
383
- - **Trade-offs** between options
384
- - **Contradictions** between sources
385
- - **Unknowns** and open questions
386
- - **Relevance** to the specific decision at hand
387
-
388
- ### 4. Write the research article
389
-
390
- Save the file as a markdown document inside the content directory. The path convention depends on the project:
391
-
392
- - If the project has adopted the three-tier lifecycle (external-sources → research → articles), save under a \`research/\` folder relative to the content dir (\`<content-dir>/research/<slug>.md\`)
393
- - If the project has an existing docs/reports/specs layout, save alongside that layout in a location that matches the project's conventions
394
- - When a research topic is large enough to warrant a subfolder, create one (\`research/<topic>/<subtopic>.md\`)
395
-
396
- Use descriptive kebab-case filenames: \`crdt-alternatives-for-editor.md\`, \`llm-maintained-wikis-pattern.md\`.
397
-
398
- Frontmatter:
399
-
400
- \`\`\`yaml
401
- ---
402
- title: Descriptive title
403
- description: One-line summary of the research question
404
- status: provisional
405
- date: YYYY-MM-DD
406
- tags:
407
- - research
408
- - topic-tag
409
- sources:
410
- - <path-to-ingested-source-1>.md
411
- - <path-to-ingested-source-2>.md
412
- ---
413
- \`\`\`
414
-
415
- Structure:
416
-
417
- \`\`\`markdown
418
- ## Question
419
-
420
- [What specific question is this research answering? Be precise.]
421
-
422
- ## Context
423
-
424
- [Why does this matter? What decision does it inform? Who is the reader?]
425
-
426
- ## Findings
427
-
428
- [Main findings organized by theme, option, or criterion. Cite sources by path.]
429
-
430
- ### Option A / Theme 1
431
-
432
- - Pros
433
- - Cons
434
- - Evidence (with source links)
435
-
436
- ### Option B / Theme 2
437
-
438
- ...
439
-
440
- ## Trade-offs
441
-
442
- [What you gain vs. lose with each option. A comparison table often helps.]
443
-
444
- ## Open questions
445
-
446
- [What you still don't know — candidates for further research, prototyping, or decisions that need human judgment.]
447
-
448
- ## Tentative recommendation
449
-
450
- [Your best guess, clearly marked as tentative. Explain the reasoning so a future reader can re-evaluate when new information arrives.]
451
- \`\`\`
452
-
453
- ### 5. Link aggressively
454
-
455
- Research articles are discovery surfaces — they should link out to **every** related document (sources, sibling research, prior canonical articles, adjacent topics). Under-linked research becomes an island that nobody finds.
456
-
457
- - Every noun-phrase that names another document should be a \`[[Page Name]]\` link, not plain prose. Prefer \`[[Page]]\` over Markdown \`[text](./page.md)\` — only wiki-links participate in the backlinks index.
458
- - Link sources inline where you cite them, not just in the \`sources:\` frontmatter list. "According to \`[[llm-agents-dust-tt]]\`..." is stronger than a bare path.
459
- - Cross-link sibling research: if an adjacent topic has its own research doc, link it in "Open questions" or inline. Readers following one thread should find the others.
460
- - **Redlinks are fine.** If the research surfaces a concept that needs its own page later, \`[[name it now]]\` — the redlink is a breadcrumb for future work.
461
- - Update 1–2 closely-related existing pages to link back to this research (usually under "Further reading" or "See also").
462
-
463
- ### 6. Mark it provisional
464
-
465
- - Set \`status: provisional\` in frontmatter
466
- - Use language like "tentative", "initial findings", "based on current understanding"
467
- - Do NOT write research articles as if they were canonical — that's misleading to future readers
468
- - If you're uncertain, say so explicitly. Research is the layer where uncertainty is allowed to live.
469
-
470
- ### 7. Verify
471
-
472
- - File exists at the chosen path under the content directory
473
- - Has frontmatter with \`title\`, \`description\`, \`status: provisional\`, \`date\`, and a \`sources\` list
474
- - \`exec("ls <dir>")\` should list the file with enrichment
475
- - Linked source files from step 2 exist — broken source links mean something went wrong in \`ingest\`
476
-
477
- ## Non-goals
478
-
479
- - **Don't promote to a canonical article** — that's the \`consolidate\` tool's job after the team actually decides
480
- - **Don't hide uncertainty** — research is where uncertainty lives; be explicit about what you don't know
481
- - **Don't skip \`ingest\`** — always capture raw sources first, then analyze
482
- - **Don't overwrite existing research** — if the topic was researched before, either iterate on the existing file or create a clearly-named successor (e.g., \`crdt-alternatives-2.md\`) and mark the old one as superseded
483
-
484
- Full convention: read \`${d}/AGENTS.md\`.`}const Nr=[`Analyze a topic by gathering sources via ingest and writing provisional findings into the project content directory.`,`Provisional, not canonical — findings live here until decisions solidify.`,``,`**Use when:**`,`- Researching a topic before committing to an approach`,`- Exploring a decision space or comparing alternatives`,`- Synthesizing multiple sources into structured analysis`,`- Spec conversations and exploratory work that is not yet canonical`,``,`**Triggers on:**`,`- "research", "investigate", "compare options for", "analyze alternatives"`,`- User asks to explore trade-offs, gather evidence, or evaluate approaches`,`- A decision needs structured analysis grounded in external sources`].join(`
485
- `);function Pr(e,t){e.tool(`research`,Nr,{topic:N.string().describe(`The topic, question, or anchor URL to research`)},e=>F(Mr(e.topic,t.content.dir),{previewUrl:null}))}const Fr=[`[Requires: Hocuspocus server] Restore a document to a historical version via the CRDT layer.`,`The restore is append-only — it creates a new version with the old content,`,`preserving all history. All connected editors see the change in real-time.`,``,`**Parameters:**`,"- `docName` — Document name to restore, typically without extension. A trailing `.md` or `.mdx` is stripped automatically.","- `commitSha` — The 40-character SHA of the shadow repo commit to restore to."," Use `get_history` to find available versions."].join(`
486
- `);function Ir(e,t){e.tool(`rollback_to_version`,Fr,{docName:N.string().describe(`Document name to restore`),commitSha:N.string().length(40).regex(/^[0-9a-f]+$/i).describe(`40-character commit SHA from the shadow repo timeline`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=R(e.docName);if(!r.ok)return P(r.error,!0);let i=r.docName,a=await z(n,`/api/history/${e.commitSha}?docName=${encodeURIComponent(i)}`);if(!a.ok)return P(`Error: ${a.error??`Version not found`}`,!0);let o=await B(n,`/api/rollback`,{docName:i,commitSha:e.commitSha});if(!o.ok)return P(`Error: ${o.error}`,!0);let s=`Restored "${i}" to version ${e.commitSha.slice(0,8)} (${a.author}, ${a.timestamp}). The change has been applied to all connected editors.`,c=await V(i,{config:t.config,resolveCwd:t.resolveCwd});return F(s,{previewUrl:c?.url??null,...c?{previewUrlSource:c.source}:{}})})}const Lr=[`[Requires: Hocuspocus server] Save a version checkpoint of all documents.`,`Creates a checkpoint commit in the shadow repo and project repo,`,`preserving the current state of all documents. The checkpoint can later`,"be found via `get_history` and restored via `rollback_to_version`."].join(`
487
- `);function Rr(e,t,n){e.tool(`save_version`,Lr,{},async()=>{let e=await L(t);if(!e)return P(I,!0);let r=n?.current,i=await B(e,`/api/save-version`,{...r?{writers:[{id:`agent-${r.connectionId}`,name:r.displayName,email:`agent-${r.connectionId}@openknowledge.local`}]}:{}});return i.ok?F(`Checkpoint saved. Checkpoint ref: ${i.checkpointRef}`,{checkpointRef:i.checkpointRef,previewUrl:null}):P(`Error: ${i.error}`,!0)})}const zr=[`Search wiki content with metadata-enriched results. Matches are grouped by file; each file is annotated with its title, description, and tags so you can judge relevance without opening it first.`,``,`**Use when:**`,`- Finding all articles mentioning a topic`,`- Locating a specific term across the wiki before deciding which file to read`,``,"Prefer this over your native `Grep` for wiki search — results include article metadata so you can skip irrelevant matches without extra reads.",``,`**Parameters:**`,"- `query` — Literal text to search for (fixed-string match, no regex)","- `case_sensitive` (optional, default false) — case-sensitive match"].join(`
488
- `);function Br(e){let t=new Map;for(let n of e){let e=t.get(n.path);e?e.push(n):t.set(n.path,[n])}return[...t.entries()].map(([e,t])=>({path:e,matches:t}))}async function Vr(e,t){let n=await t.resolveCwd(e.cwd),r=t.config.mcp.tools.search.maxResults,i=t.config.content.include,a=t.config.content.exclude,o=await Rt(e.query,n,{caseInsensitive:!(e.case_sensitive??!1),include:i,exclude:[...a,`node_modules`,`.git`,`.claude`,`.changeset`,d],maxResults:r+1}),s=o.length>r,c=s?o.slice(0,r):o,{resolve:l,ui:u}=await H({config:t.config,resolveCwd:async()=>n});if(c.length===0)return{text:`No matches for "${e.query}".`,structured:{query:e.query,matchCount:0,fileCount:0,truncated:!1,results:[],ui:u}};let f=Br(c),p=new Map,m=await L(t.serverUrl),h=t.config.folders;await Promise.all(f.map(async e=>{try{let t=await An(e.path,{projectDir:n,serverUrl:m,folderRules:h});p.set(e.path,t)}catch{}}));let g=[];g.push(`## Search results for "${e.query}" (${c.length} match${c.length===1?``:`es`} in ${f.length} file${f.length===1?``:`s`})`,``);let _=[];for(let e of f){let t=p.get(e.path),n=t?.title??e.path;g.push(`### ${n} (${e.path})`),t?.tags?.length&&g.push(`Tags: ${t.tags.join(`, `)}`),t?.description&&g.push(`${t.description}`);for(let t of e.matches)g.push(`- Line ${t.line}: ${t.text}`);g.push(``);let r=bt(e.path),i=l(r);_.push({path:e.path,docName:r,title:t?.title??null,description:t?.description??null,tags:t?.tags??[],matches:e.matches.map(e=>({line:e.line,text:e.text})),previewUrl:i?.url??null,...i?{previewUrlSource:i.source}:{}})}return s&&g.push(`_${c.length} of ${o.length}+ matches shown. Raise \`mcp.tools.search.maxResults\` in config.yml to see more._`),{text:g.join(`
489
- `),structured:{query:e.query,matchCount:c.length,fileCount:f.length,truncated:s,results:_,ui:u}}}function Hr(e,t){e.tool(`search`,zr,{query:N.string().describe(`Literal text to search for`),case_sensitive:N.boolean().optional().describe(`Case-sensitive search (default false)`),cwd:N.string().optional().describe(`Absolute host path to search in. Defaults to the MCP client's first advertised root.`)},async e=>{try{let{text:n,structured:r}=await Vr(e,t);return r?F(n,r):P(n)}catch(e){return P(`Error: ${e instanceof Error?e.message:String(e)}`,!0)}})}const Ur=[`[Requires: Hocuspocus server] Find missing link candidates for a target page.`,"Returns JSON with structure: `{ target: { docName, title, aliases }, mentions: [{ source, excerpt, offset }], truncated }`.","Each mention includes an `offset` you can pass to `edit_document` for precision patching.","When `truncated` is true, the scan hit its time budget before reading every admitted document.",``,`**Parameters:**`,'- `docName` — Target page docName, typically without extension (for example, "articles/project-alpha"). A trailing `.md` or `.mdx` is stripped automatically.'].join(`
490
- `);function Wr(e,t){e.tool(`suggest_links`,Ur,{docName:N.string().describe(`Target page docName`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=R(e.docName);if(!r.ok)return P(r.error,!0);let i=await z(n,`/api/suggest-links?docName=${encodeURIComponent(r.docName)}`);if(!i.ok)return P(`Error: ${i.error}`,!0);let{ok:a,...o}=i,s=await V(r.docName,{config:t.config,resolveCwd:t.resolveCwd});return F(JSON.stringify(o,null,2),{...o,previewUrl:s?.url??null,...s?{previewUrlSource:s.source}:{}})})}const Gr=["**IMPORTANT: Before calling this tool, you MUST first call `get_preview_url` and navigate to the returned URL in your preview browser. If `get_preview_url` returns null, start the server first (`open-knowledge start` or `preview_start`), then call `get_preview_url` again. Do NOT call this tool without the preview open. NEVER manually construct the URL.**",``,`[Requires: Hocuspocus server] Write markdown content to a document via the CRDT layer.`,`Content is applied through Hocuspocus and propagated to all connected editors in real-time.`,``,'**Link liberally.** Every noun-phrase that names another document in this knowledge base should be a `[[wiki-link]]`, not plain prose. Backlinks are the primary navigation surface — underlinked documents become islands. Redlinks (links to pages that don\'t exist yet) are fine; they signal "this should exist." Prefer `[[Page Name]]` over Markdown `[text](./page.md)` — only wiki-links participate in the backlinks index.',``,`**Parameters:**`,'- `docName` — Document name, typically without extension (e.g., "my-doc" or "notes/meeting"). A trailing `.md` or `.mdx` is stripped automatically. New documents are created as `.md` by default; to create a `.mdx` file, first place it on disk, then use this tool for edits.',"- `markdown` — Markdown content to write",'- `position` — Where to insert: "append", "prepend", or "replace"'].join(`
491
- `);function Kr(e,t){e.tool(`write_document`,Gr,{docName:N.string().describe(`Document name to write to`),markdown:N.string().describe(`Markdown content to write`),position:N.enum([`append`,`prepend`,`replace`]).describe(`Where to insert the content`)},async e=>{let n=await L(t.serverUrl);if(!n)return P(I,!0);let r=R(e.docName);if(!r.ok)return P(r.error,!0);let i=t.identityRef?.current,a=await B(n,`/api/agent-write-md`,{docName:r.docName,markdown:e.markdown,position:e.position,...i?{agentId:i.connectionId,agentName:i.displayName,clientName:i.clientInfo?.name,colorSeed:i.colorSeed}:{}});if(!a.ok)return P(`Error: ${a.error}`,!0);let o=await t.resolveCwd(),s=m(h(t.config,o)),c=U(r.docName,{config:t.config,lockDir:s}),l=(typeof a.subscriberCount==`number`?a.subscriberCount:void 0)===0,u=Array.isArray(a.hints)?a.hints:void 0,d=[`Written successfully (${e.position}).`];if(c&&d.push(`Preview: ${c.url}`),l&&d.push(c?`Warning: no preview is currently attached to "${r.docName}". Open ${c.url} to watch future edits live.`:`Warning: no preview is currently attached to "${r.docName}".`),u)for(let e of u)e.message&&d.push(e.message);let f=d.join(`
492
- `);if(!c&&!l&&!u)return P(f);let p={};return c&&(p.previewUrl=c.url,p.previewUrlSource=c.source),l&&(p.warning={message:`No preview attached to ${r.docName}.`,previewUrl:c?.url??null}),u&&(p.hints=u),F(f,p)})}const qr={exec:Fn,"init-content":mr,ingest:dr,research:Nr,consolidate:mt,read_document:vr,rename_document:Dr,search:zr,suggest_links:Ur,write_document:Gr,edit_document:xt,get_history:tr,save_version:Lr,rollback_to_version:Fr,list_documents:gr,get_backlinks:Yn,get_forward_links:$n,get_orphans:ar,get_hubs:rr,get_dead_links:Zn,get_preview_url:sr};function Jr(e,t){Jn(e,{resolveCwd:t.resolveCwd,serverUrl:t.serverUrl,config:t.config}),hr(e,{config:t.config,resolveCwd:t.resolveCwd}),fr(e,t.config),Pr(e,t.config),ht(e,t.config),Er(e,{resolveCwd:t.resolveCwd,config:t.config,serverUrl:t.serverUrl}),Hr(e,{resolveCwd:t.resolveCwd,config:t.config,serverUrl:t.serverUrl}),Wr(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd}),Kr(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd,identityRef:t.identityRef}),St(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd,identityRef:t.identityRef}),jr(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd}),nr(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd}),Rr(e,t.serverUrl,t.identityRef),Ir(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd}),_r(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd}),Xn(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd}),er(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd}),or(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd}),ir(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd}),Qn(e,{serverUrl:t.serverUrl,config:t.config,resolveCwd:t.resolveCwd}),lr(e,{resolveCwd:t.resolveCwd,config:t.config})}function X(e){process.stderr.write(`${_(`[mcp]`)} ${e}\n`)}function Yr(e){let{dir:t,include:n,exclude:r}=e.content,i=r.length>0?r.map(e=>`\`${e}\``).join(`, `):`(none)`;return`# MCP Instructions v2 — exec-primary (2026-04-13)
493
-
494
- ## This project's content layout (live config)
495
-
496
- - **Content directory:** \`${t}\`
497
- - **Include globs:** ${n.map(e=>`\`${e}\``).join(`, `)}
498
- - **Exclude globs:** ${i}
499
-
500
- **Path contract (\`config.yml\`):** \`.open-knowledge/config.yml\` (plus optional \`~/.open-knowledge/config.yml\`, with CLI/env overrides) owns the \`content\` keys. The table above is **this MCP session's resolved view** of that contract — same rules, no guessing from folder names. A file is an Open Knowledge document iff it lives under **Content directory**, matches at least one **Include glob**, and is not removed by **Exclude globs** or \`.gitignore\`.
501
-
502
- Paths in \`exec\` commands are resolved relative to the content directory. The sandbox prevents paths escaping it.
503
-
504
- **Default rule:** with the usual \`**/*.md\` + \`**/*.mdx\` globs from repo root, **every** such file under the content directory is an Open Knowledge document unless \`.gitignore\` or \`content.exclude\` drops it. Folder names (\`specs/\`, \`reports/\`, …) do not matter. If \`content.include\` was narrowed, only matching paths use \`exec\`.
505
-
506
- ## Navigation — \`exec\` is **mandatory** for Open Knowledge \`.md\` / \`.mdx\` (this server is registered)
507
-
508
- **STOP:** Do not use the host IDE's \`Read\`, \`Grep\`, or \`Glob\` on in-scope \`.md\` / \`.mdx\` — use \`exec\` (or typed \`read_document\` / \`search\` when you need fixed \`structuredContent\`). Native file tools skip frontmatter, backlinks, shadow-repo activity, and project git history; reserve them for **source code and non-markdown** paths.
509
-
510
- **MCP clients differ:** Your agent host may expose these tools directly or only through its MCP integration (server name from \`tools/list\`, user-chosen label). **That still counts as this server being available.** Invoke \`exec\` / \`search\` / \`read_document\` the way **your product's docs** describe — not native \`Grep\` on in-scope markdown. Missing a top-level symbol named \`exec\` is not an excuse.
511
-
512
- \`exec\` provides the same enrichment as the typed tools plus bash composability (pipes, \`head\`, \`find\`). One tool covers reading, listing, grepping, and combining them. **Escape hatch:** only if this MCP server is **not** registered for the workspace, or after an MCP **call** failed — say \`Open Knowledge MCP unavailable:\`. Never use the hatch to skip trying MCP first.
513
-
514
- For paths **outside** the include globs above, use native tools.
515
-
516
- Examples:
517
-
518
- - Read a file: \`exec("cat <path>.md")\` — returns file contents + rich enrichment
519
- - List a directory: \`exec("ls <dir>")\` — each result comes with per-file enrichment in \`structuredContent.enrichedPaths\`
520
- - Search: \`exec("grep -rn <term> <dir>")\` — matches + enrichment per matched file
521
- - Combine: \`exec("grep -rn <term> <dir> | head -5")\` — top 5 matches with full enrichment
522
-
523
- Allowlist (read-only): \`cat\`, \`ls\`, \`grep\`, \`find\`, \`head\`, \`tail\`, \`wc\`, \`sort\`, \`uniq\`, \`cut\`. Pipes (\`|\`) work between stages. Redirections, subshells, and writes are rejected with a category-specific error telling you the next step.
524
-
525
- ### Scope searches — \`grep\` and \`find\` can be slow if unscoped
526
-
527
- Recursive \`grep -r\` / \`find\` walk every file under the path, which on a real repo includes source code, build output, and dependencies. For reads inside the content tree, scope deliberately:
528
-
529
- - **Filter to markdown:** \`grep -rn TERM --include="*.md" <dir>\` — skips every non-md file.
530
- - **Scope to a known knowledge dir:** \`grep -rn TERM reports/ specs/\` (or whatever folders the project uses) beats \`grep -rn TERM .\`.
531
- - **Bail early:** pipe through \`| head -20\` for bounded output. The server waits for the pipeline to finish before returning, so unscoped commands block on the slowest stage.
532
- - **Existence vs. enumeration:** "does X exist in any tracked doc?" is \`grep -rl PATTERN <dir>\` (list matching files, unbounded) — NOT \`grep -rn PATTERN <dir> | head -N\`. When \`head\` truncates, alphabetically-earlier files dominate the output and later files silently go missing. The server surfaces a banner when \`head\` / \`tail\` hits its cap, but the fix is to pick the right command up front.
533
- - **Auto-prune (built in):** the server transparently adds \`--exclude-dir=\` for \`node_modules\`, \`.git\`, \`dist\`, \`build\`, \`.next\`, \`.turbo\`, \`coverage\`, \`.claude\`, etc. on recursive \`grep\`, and \`-not -path\` equivalents on \`find\`. This saves you from remembering them — but explicit scoping via \`--include\` or a narrower path is still dramatically faster on monorepos.
534
-
535
- ### Why \`exec\` over typed tools
536
-
537
- \`exec\` is the default because it subsumes \`read_document\` and \`search\` enrichment paths (same shared helper under the hood) and adds bash composition. The typed tools remain registered as **Typed call sites (advanced)** — present for callers that consume \`structuredContent\` with fixed shapes — but they're not recommended for common agent reads.
538
-
539
- ## Writing
540
-
541
- Agent writes to in-scope \`.md\` / \`.mdx\` (paths under \`content.include\`) **must** go through the \`write_document\` / \`edit_document\` MCP tools — never \`exec\` (which is read-only) and never native \`Edit\` / \`sed\`. Routing writes through the server is what captures agent-vs-human attribution in the shadow repo. Writes via other paths land as anonymous \`upstream\` imports and lose attribution.
542
-
543
- ${g}
544
-
545
- ## Linking — lean on \`[[wiki-links]]\` aggressively
546
-
547
- **When writing or editing any document, link liberally to every other document it relates to.** Open Knowledge's value compounds with link density: backlinks surface cross-document context in every \`exec("cat X.md")\` read, \`get_hubs\` / \`get_orphans\` reveal structure, and agents (you, next session) navigate the knowledge base by following links the way you'd navigate a wiki. A document with no outbound links is an island; an island in a knowledge base is worse than no document at all.
548
-
549
- **Defaults when writing:**
550
-
551
- - **Every noun-phrase that names another document is a link.** If you mention a concept, project, decision, or entity that has (or should have) its own page, write it as \`[[Page Title]]\` instead of plain prose. Don't stop to check whether the target exists first — a redlink signals "this should exist" to future work. Over-linking is the goal, not the failure mode.
552
- - **Cross-link siblings.** When you create a document in a folder, skim the siblings (\`exec("ls <folder>")\`) and link to the 2–3 most related ones. A "See also" section at the bottom is fine; inline links woven through the prose are better.
553
- - **Link back to sources.** If a document is derived from research, spec decisions, external sources, or prior reports, link to them — don't re-summarize. The reader can follow.
554
- - **Prefer \`[[Page]]\` over Markdown \`[text](./page.md)\`.** Wiki-links resolve by docName (file path minus \`.md\`) and participate in the backlinks index. Markdown links to other wiki files don't.
555
- - **Update both sides when possible.** If you add an important link from A → B, consider whether B should link back to A or to a landing page that lists documents like A.
556
-
557
- **Rule of thumb:** if a human reader would want to click a term to learn more, make it a link. Err on the side of too many links.
558
-
559
- ## Cadence — maintain hubs as you create children
560
-
561
- When you create or meaningfully edit a doc inside a folder that has a hub doc (\`INDEX.md\`, \`README.md\`, \`REPORT.md\`, \`SPEC.md\`, or a file whose name matches the folder name — e.g. \`reports/r1/r1.md\`), update the hub to reflect the change before moving to the next child. Write one child → update hub → write next child. Don't batch five children and then the hub.
562
-
563
- **Why:** the browser follows your focus in real time via push-nav on every write. Hub-as-you-go makes your work legible to the human watching — each pulse is a complete thought (child → hub → child → hub), and the hub doc itself functions as the live progress bar. Batched writes make the nav flicker, flatten the narrative, and hide the structure you're building.
564
-
565
- When \`write_document\` creates a doc with zero incoming backlinks and a hub candidate exists in the folder tree, the response includes a \`hints: [{type: 'orphan', parentCandidates: [...], message: ...}]\` entry — that's the soft nudge to interleave the hub update next. Pair with the link-as-you-write discipline above.
566
-
567
- ## Frontmatter conventions
568
-
569
- Open Knowledge has two metadata surfaces that merge at read time:
570
-
571
- 1. **Per-file frontmatter** — YAML at the top of each \`.md\` / \`.mdx\`: \`title\` (required), \`description\` (required), \`tags\` (recommended). This is where a file's own identity lives.
572
- 2. **Folder-level defaults via \`.open-knowledge/config.yml\` \`folders:\`** — declare \`title\` / \`description\` / \`tags\` defaults keyed by glob \`match:\`. Rules apply in declaration order; later matches override earlier scalars. Tags concatenate across ALL matching rules (in declaration order), with file tags appended last, and first-occurrence preserved on dedup. The file's own frontmatter wins per-scalar; folder defaults fill in blanks.
573
-
574
- Folder metadata lives in \`config.yml\`, **not** in content files — this is intentionally different from the rejected \`INDEX.md\`-inside-content pattern. The merge happens on every \`exec\` / \`read_document\` / \`search\` call and is never written back to disk.
575
-
576
- ## Tools
577
-
578
- **Primary:**
579
- - \`exec\` — read-only bash with enriched output (see above).
580
-
581
- **Workflow (instructional tools):**
582
- - \`init-content\`, \`ingest\`, \`research\`, \`consolidate\` — each returns structured instructions you follow. Output text includes the live \`content.dir\` value (${t}) so you don't need to re-read the config.
583
-
584
- **Writes:**
585
- - \`write_document\`, \`edit_document\`, \`rename_document\`, \`undo_agent_edit\`, \`redo_agent_edit\` — mutate the CRDT through the server; attribution captured.
586
-
587
- **Typed call sites (advanced) — prefer \`exec\` for common reads:**
588
- - \`read_document\`, \`search\`, \`list_documents\`, \`get_backlinks\`, \`get_forward_links\`, \`get_orphans\`, \`get_hubs\`.
589
-
590
- ${Object.entries(qr).map(([e,t])=>`### \`${e}\`\n${t}`).join(`
591
-
592
- `)}
593
- `}async function Xr(e){try{let t=e.replace(`ws://`,`http://`).replace(`wss://`,`https://`);return(await fetch(`${t}/api/agent-undo-status`,{signal:AbortSignal.timeout(2e3)})).ok}catch(e){return X(`Hocuspocus check failed: ${e instanceof Error?e.message:String(e)}`),!1}}async function Zr(e){let{projectDir:t,serverUrl:n,config:r}=e;X(n?await Xr(n)?`Hocuspocus detected at ${n}`:`Hocuspocus not available at ${n} — using disk-only mode`:`No explicit server URL — will discover lazily from server.lock per call`);let i=new we({name:f,version:p},{instructions:Yr(r)}),a=[],o=!1;async function c(){try{a=(await i.server.listRoots()).roots.map(e=>e.uri).filter(e=>e.startsWith(`file://`)).map(e=>me(e)),X(a.length>0?`roots: ${a.join(`, `)}`:`client advertised no roots — falling back to startup cwd`)}catch(e){X(`listRoots unsupported by client (using startup cwd): ${e instanceof Error?e.message:String(e)}`)}finally{o=!0}}let l=!1;async function u(e){return e||(o||await c(),a.length===0?(l||=(X(`no client roots — falling back to startup cwd: ${t}`),!0),t):(l&&=(X(`client roots now available — using ${a[0]}`),!1),a[0]))}i.server.setNotificationHandler(Ee,async()=>{o=!1,await c()});let d=n?n.replace(`ws://`,`http://`).replace(`wss://`,`https://`):void 0,g=new Map,_=async()=>{if(d)return d;let e=await u(),t=Date.now(),n=g.get(e);if(n&&n.expiresAt>t)return n.url;let i=s(m(h(r,e))),a=i&&i.port>0?`http://localhost:${i.port}`:void 0;return g.set(e,{url:a,expiresAt:t+1e3}),a},v=he(),y=process.env.AGENT_LABEL||void 0,b={current:{connectionId:v,label:y,displayName:y??`Agent`,colorSeed:y??v}};i.server.oninitialized=()=>{let e=i.server.getClientVersion();b.current={connectionId:v,clientInfo:e?{name:e.name,version:e.version}:void 0,label:y,displayName:y??e?.name??`Agent`,colorSeed:y??e?.name??v},X(`Agent identity: ${b.current.displayName} (${v.slice(0,8)})`)},Jr(i,{serverUrl:_,resolveCwd:u,startupCwd:t,config:r,identityRef:b});let x=new Te;await i.connect(x),X(`MCP server running (stdio)`),c().catch(()=>{});let{startKeepalive:S}=await import(`./keepalive-Bp0nJiwT.mjs`),C=S({resolveWsUrl:async()=>{let e=await _();if(e)return e.replace(/^http:/,`ws:`).replace(/^https:/,`wss:`)},log:X}),w=()=>{try{C.close()}catch{}process.exit(0)};process.on(`SIGINT`,w),process.on(`SIGTERM`,w)}function Qr(e){if(e===void 0||e===``)return;let t=Number.parseInt(e,10);if(!(Number.isNaN(t)||t<=0))return t}function $r(e){if(e.portOverride!==void 0){let t=Number.parseInt(e.portOverride,10);if(Number.isNaN(t))return{action:`disk-only`,message:`invalid --port value '${e.portOverride}' — disk-only mode`};if(t>0){let n=`ws://${e.host}:${t}`;return{action:`connect`,url:n,message:`using --port override, connecting to ${n}`}}return{action:`disk-only`,message:`--port=0 — disk-only mode`}}let t=e.readLock();if(t&&t.port>0&&e.isAlive(t.pid)){let e=`ws://localhost:${t.port}`;return{action:`connect`,url:e,message:`connected to running instance at ${e} (pid ${t.pid})`}}return e.envAutoStart===`0`?{action:`disk-only`,message:`auto-spawn disabled via OK_MCP_AUTOSTART=0 — disk-only mode`}:e.configAutoStart?t?{action:`spawn`,message:`existing lock is not usable (port=${t.port}, pid=${t.pid}) — spawning ok start`}:{action:`spawn`,message:`no running instance — spawning ok start`}:{action:`disk-only`,message:`auto-spawn disabled via config.mcp.autoStart=false — disk-only mode`}}async function ei(e){let t=e.readLock??(()=>s(e.lockDir)),n=e.isAlive??l,r=e.sleep??(e=>new Promise(t=>setTimeout(t,e))),i=e.spawn??_e,a=e.readErrorLog??(e=>T(e)?O(e,`utf-8`).trim():``),o=e.openErrorLog??(e=>D(e,`w`)),c=e.closeFd??(e=>w(e)),u=e.timeoutMs??5e3,d=e.pollIntervalMs??100,f=$r({host:e.host,portOverride:e.portOverride,envAutoStart:e.envAutoStart,configAutoStart:e.configAutoStart,readLock:t,isAlive:n});if(f.action===`connect`)return{serverUrl:f.url,message:f.message};if(f.action===`disk-only`)return{serverUrl:void 0,message:f.message};T(e.lockDir)||E(e.lockDir,{recursive:!0});let p=se(e.lockDir,`last-spawn-error.log`),m=o(p),h,g,_=x();try{try{h=i(_.command,[..._.prefixArgs,`start`],{detached:!0,stdio:[`ignore`,`ignore`,m],cwd:e.contentDir}),h.on(`error`,e=>{g=e instanceof Error?e.message:String(e)}),h.unref()}catch(e){g=e instanceof Error?e.message:String(e)}}finally{try{c(m)}catch{}}let v=Date.now()+u;for(;Date.now()<v;){if(g){let e=a(p);throw Error(`OK: spawn failed: ${g}${e?` stderr:\n${e}`:``}`)}await r(d);let e=t();if(e&&e.port>0&&n(e.pid)){let t=`ws://localhost:${e.port}`;return{serverUrl:t,message:`spawned ok start; connected at ${t} (pid ${e.pid})`}}}if(g){let e=a(p);throw Error(`OK: spawn failed: ${g}${e?` stderr:\n${e}`:``}`)}let y=a(p),b=(u/1e3).toFixed(u%1e3==0?0:2),S=h?.pid,C=``;throw typeof S==`number`&&(C=n(S)?` child pid=${S} is still running — raise OK_MCP_SPAWN_TIMEOUT_MS if this is a slow boot.`:` child pid=${S} exited — check last-spawn-error.log.`),Error(`OK: server did not start within ${b}s.${C}${y?` stderr:\n${y}`:``}`)}function ti(e){return new C(`mcp`).description(`Start MCP stdio server for project knowledge base`).option(`-p, --port <port>`,`Override port discovery and connect to this port (0 = disk-only)`,void 0).action(async t=>{try{let n=e(),r=process.cwd(),i=h(n,r),{serverUrl:a,message:o}=await ei({lockDir:m(i),contentDir:i,host:n.server.host,portOverride:t.port,envAutoStart:process.env.OK_MCP_AUTOSTART,configAutoStart:n.mcp.autoStart,timeoutMs:Qr(process.env.OK_MCP_SPAWN_TIMEOUT_MS)});process.stderr.write(`[mcp] ${o}\n`),await Zr({projectDir:r,serverUrl:a,config:n})}catch(e){process.stderr.write(`MCP server failed to start: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}})}function ni(e){return new C(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-C-NvAf2r.mjs`),r=e(),i=process.cwd(),a=h(r,i),o;try{o=t({projectDir:i,contentDir:a,include:r.content.include,exclude:r.content.exclude})}catch(e){console.error(`Content preview failed: ${e instanceof Error?e.message:String(e)}`),process.exitCode=1;return}process.stdout.write(`${n(o,i)}\n`),o.totalCount===0&&o.warnings.length>0&&(process.exitCode=1)})}function Z(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function ri(e,t,n=process.cwd()){let r=e.op??`sync`,i=s(m(h(t,n)));if(i&&i.port>0){let t=`http://127.0.0.1:${i.port}/api/sync/trigger`;e.json||process.stderr.write(`Triggering ${r} via running server (port ${i.port})…\n`);try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({op:r})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`Server responded with ${n.status}`)}Z(e.json,{type:`triggered`,op:r,port:i.port}),e.json||process.stderr.write(`✓ ${r} triggered\n`);return}catch(t){let n=t instanceof Error?t.message:String(t);e.json||process.stderr.write(`Server trigger failed (${n}), running directly…\n`)}}e.json||process.stderr.write(`Running ${r} directly (no live server)…\n`);let a=M({baseDir:n});if(r===`sync`||r===`pull`){Z(e.json,{type:`step`,step:`pull`});let t=await a.pull();Z(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(Z(e.json,{type:`step`,step:`push`}),await a.push(),Z(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
594
- `)),Z(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function ii(e){return new C(`sync`).description(`Commit, pull, and push to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await ri({json:t.json,op:`sync`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ sync failed: ${n}\n`),process.exit(1)}})}function ai(e){return new C(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await ri({json:t.json,op:`pull`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ pull failed: ${n}\n`),process.exit(1)}})}function oi(e){return new C(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await ri({json:t.json,op:`push`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ push failed: ${n}\n`),process.exit(1)}})}function si(e,t){return{server:ci(`server`,e),ui:ci(`ui`,t)}}function ci(e,t){switch(t.status){case`missing`:return{name:e,state:`missing`,alive:!1};case`corrupt`:return{name:e,state:`corrupt`,alive:!1};case`foreign-host`:return{name:e,state:`foreign-host`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:`unknown`};case`dead-pid`:return{name:e,state:`dead-pid`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:!1};case`alive`:return{name:e,state:`alive`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:!0}}}function li(e){return`${ui(e.server)}\n${ui(e.ui)}`}function ui(e){let t=e.name===`server`?`server`:`ui `;return e.state===`missing`?`${t} not running`:e.state===`corrupt`?`${t} lock file corrupt — run \`ok clean\``:e.state===`foreign-host`?`${t} foreign host (${e.host}) pid=${e.pid} port=${e.port}`:e.state===`dead-pid`?`${t} stale (dead pid=${e.pid}) — run \`ok clean\``:`${t} alive pid=${e.pid} port=${e.port} started=${e.startedAt}`}function di(e){let t=e.inspect??(t=>et(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=si(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(li(r)),r}function fi(e){return new C(`status`).description(`Show live state of the server + ui lockfiles for this project`).option(`--json`,`Emit structured JSON instead of formatted text`).action(t=>{di({lockDir:m(h(e(),process.cwd())),json:t.json===!0})})}function pi(e,t){let n=[];return e.status===`alive`&&n.push({name:`server`,pid:e.lock.pid,port:e.lock.port}),t.status===`alive`&&n.push({name:`ui`,pid:t.lock.pid,port:t.lock.port}),{targets:n}}function mi(e){let t=e.inspect??(t=>et(e.lockDir,t)),n=e.kill??((e,t)=>process.kill(e,t)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=pi(t(`server`),t(`ui`));if(a.targets.length===0)return r(`No running open-knowledge processes.`),{stopped:[],failed:[],hadTargets:!1};let o=[],s=[];for(let e of a.targets)try{n(e.pid,`SIGTERM`),o.push(e)}catch(t){s.push({target:e,error:t instanceof Error?t.message:String(t)})}return o.length>0&&r(`Stopped: ${o.map(e=>`${e.name} (pid=${e.pid}, port=${e.port})`).join(`, `)}`),s.length>0&&i(`Failed to stop: ${s.map(({target:e,error:t})=>`${e.name} (pid=${e.pid}): ${t}`).join(`; `)}`),{stopped:o,failed:s,hadTargets:!0}}function hi(e){return new C(`stop`).description(`Stop the running open-knowledge server and UI (live only)`).action(()=>{mi({lockDir:m(h(e(),process.cwd()))}).failed.length>0&&(process.exitCode=1)})}const gi=[`connection`,`keep-alive`,`proxy-authenticate`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`,`cookie`,`set-cookie`];async function _i(e){let t=e.upstreamTimeoutMs??1e4,n=Se((n,r)=>{yi(n,r,e.upstreamHost,e.upstreamPort,t)});await new Promise((t,r)=>{let i=e=>r(e);n.once(`error`,i),n.listen(e.listenPort,e.host,()=>{n.off(`error`,i),t()})});let r=n.address();return{httpServer:n,port:typeof r==`object`&&r?r.port:e.listenPort,close:()=>new Promise(e=>{n.close(()=>e())})}}function vi(e,t,n){yi(e,t,n.upstreamHost,n.upstreamPort,n.upstreamTimeoutMs??1e4)}function yi(e,t,n,r,i){let a={...e.headers};delete a.host;for(let e of gi)delete a[e];e.setTimeout(3e4,()=>{if(t.headersSent)try{t.end()}catch{}else try{t.writeHead(408,{"Content-Type":`text/plain`}),t.end(`Request Timeout`)}catch{}try{e.socket?.destroy()}catch{}});let o=Ce({host:n,port:r,method:e.method,path:e.url,headers:{...a,host:`${n}:${r}`}},e=>{let n={...e.headers};for(let e of gi)delete n[e];t.writeHead(e.statusCode??502,n),e.pipe(t),e.once(`error`,()=>{try{t.end()}catch{}})});i>0&&o.setTimeout(i,()=>{if(!t.headersSent)t.writeHead(504,{"Content-Type":`text/plain`}),t.end(`Gateway Timeout`);else try{t.end()}catch{}o.destroy()}),o.on(`error`,()=>{if(!t.headersSent)t.writeHead(502,{"Content-Type":`text/plain`}),t.end(`Bad Gateway`);else try{t.end()}catch{}}),e.on(`error`,()=>{o.destroy()}),e.pipe(o)}async function bi(e){await Promise.all(e.map(e=>new Promise(t=>{e.close(()=>t())})))}async function xi(t){let{existsSync:n}=await import(`node:fs`),{createServer:r}=await import(`node:http`),{resolve:i}=await import(`node:path`),{acquireUiLock:a,readServerLock:o,releaseUiLock:s,updateUiLockPort:c}=await import(`./src-CEP6NuWY.mjs`),{default:l}=await import(`sirv`),{resolveContentDir:u,resolveLockDir:d}=await import(`./paths-CWTmBbr0.mjs`),f=u(t.config,t.cwd),p=d(f);a(p,{port:0,worktreeRoot:t.cwd});let m=import.meta.dirname??new URL(`.`,import.meta.url).pathname,h=[i(m,`public`),i(m,`../../app/dist`),i(m,`../../../app/dist`)].find(e=>n(e)),g=h?l(h,{single:!0,gzip:!0,immutable:!0}):null,_=n(f)?l(f,{dotfiles:!1}):null,v=t.port,y=null,b=(e,t)=>{let n=e.url?.split(`?`)[0];if(n===`/api/config`&&(e.method===`GET`||e.method===`HEAD`)){y?.();let n=o(p),r=n&&n.port>0?`ws://localhost:${n.port}/collab`:null,i=JSON.stringify({collabUrl:r,previewUrl:null,port:v});t.setHeader(`Content-Type`,`application/json`),t.setHeader(`Cache-Control`,`no-store`),t.setHeader(`X-Content-Type-Options`,`nosniff`),t.statusCode=200,e.method===`HEAD`?t.end():t.end(i);return}if(n?.startsWith(`/api/`)){y?.();let r=o(p);if(!r||r.port<=0){t.writeHead(503,{"Content-Type":`application/json`,"Cache-Control":`no-store`}),t.end(JSON.stringify({error:"Collab server not running. Start `ok start` or run `ok status`.",path:n}));return}vi(e,t,{upstreamHost:`localhost`,upstreamPort:r.port});return}if(decodeURIComponent(n?.replace(/^\//,``)??``)&&_){t.setHeader(`X-Content-Type-Options`,`nosniff`),_(e,t,()=>{g?g(e,t):Si(t)});return}if(g){g(e,t);return}Si(t)},x=t.host===void 0?[`::1`,`127.0.0.1`]:[t.host],S=[],C=t.port;try{for(let e of x){let t=r(b);S.push(t),await new Promise((n,r)=>{let i=e=>r(e);t.once(`error`,i),t.listen(C,e,()=>{t.off(`error`,i);let e=t.address();typeof e==`object`&&e&&(C=e.port),n()})})}}catch(e){await Promise.all(S.map(e=>new Promise(t=>{try{e.close(()=>t())}catch{t()}})));try{s(p)}catch{}throw e}let w=C;v=w,c(p,w);let T=t.scheduler??e,E=t.safetyNetMs??432e5,D=null,O=!1,ee=!1,k=()=>{O||(O=!0,D!==null&&(T.clearTimeout(D),D=null))},A=()=>{if(k(),!ee){ee=!0;try{s(p)}catch{}}},te=()=>{O||E<=0||(D!==null&&(T.clearTimeout(D),D=null),D=T.setTimeout(()=>{D=null,console.warn(`[ui] safety-net (${E}ms) reached — shutting down (D-025 backstop)`);try{t.onSafetyNet?.()}catch{}for(let e of S)try{e.close()}catch{}A()},E))},ne=()=>{O||E<=0||te()};return y=ne,te(),{httpServers:S,port:w,release:A,detachSafetyNet:k,nudgeSafetyNet:ne}}function Si(e){e.writeHead(404),e.end(`Not found`)}function Ci(e,t){if(e!==void 0){let t=Number.parseInt(e,10);if(Number.isNaN(t)||t<0||t>65535)throw Error(`Invalid --port value '${e}'`);return t}if(t!==void 0&&t!==``){let e=Number.parseInt(t,10);if(Number.isNaN(e)||e<0||e>65535)throw Error(`Invalid PORT env value '${t}'`);return e}return 0}async function wi(e){let t=e.readLock??(async()=>{let{readUiLock:t}=await import(`./src-CEP6NuWY.mjs`);return t(e.lockDir)}),n=await t();if(!n)throw Error(`UI lock collision reported but the lock disappeared before handling — retry acquiring.`);if(n.port===e.requestedPort&&n.port>0)return{mode:`already-running`,port:n.port};let r=n.port;if(r===0){let n=Date.now()+(e.pollDeadlineMs??2e3),i=e.pollIntervalMs??100;for(;Date.now()<n;){await new Promise(e=>{setTimeout(e,i)});let e=await t();if(e&&e.port>0){r=e.port;break}}if(r===0)throw Error("UI did not bind within 2s; run `ok clean`");if(r===e.requestedPort)return{mode:`already-running`,port:r}}return{mode:`proxy`,handle:await _i({listenPort:e.requestedPort,host:e.host,upstreamHost:`localhost`,upstreamPort:r}),upstreamPort:r}}function Ti(e){return new C(`ui`).description(`Serve the Open Knowledge React editor UI`).option(`-p, --port <port>`,`UI port (default: $PORT env or 0 / kernel-allocated)`).option(`-H, --host <host>`,"UI host. Default: two-socket loopback bind (`[::1]` + `127.0.0.1`) so cross-family collisions fail loud (D-033). Pass an explicit host (e.g. `127.0.0.1`, `0.0.0.0`) to bind a single socket on that host.").action(async t=>{let{dim:n}=await import(`./colors-C2vrt_OY.mjs`),{UiLockCollisionError:r}=await import(`./src-CEP6NuWY.mjs`),{resolveContentDir:i,resolveLockDir:a}=await import(`./paths-CWTmBbr0.mjs`),o=e(),s=t.host,c;try{c=Ci(t.port,process.env.PORT)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=1;return}try{let e=await xi({config:o,cwd:process.cwd(),port:c,host:s}),t=s===void 0||s===`::`||s===`0.0.0.0`?`localhost`:s;console.log(`${n(`[ui]`)} listening on http://${t}:${e.port}`);let r=!1,i=t=>{if(r)return;r=!0,console.log(n(`\n[ui] Shutting down (${t})...`)),e.detachSafetyNet();let i=()=>{try{e.release()}finally{process.exit(process.exitCode??0)}};bi(e.httpServers).then(i,i),setTimeout(i,2e3).unref()};process.once(`SIGINT`,()=>i(`SIGINT`)),process.once(`SIGTERM`,()=>i(`SIGTERM`));return}catch(e){if(!(e instanceof r))throw e;let t=a(i(o,process.cwd())),l=s??`localhost`,u;try{u=await wi({requestedPort:c,host:l,lockDir:t})}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}u.mode===`already-running`&&(console.log(`UI already running at http://${l}:${u.port}`),process.exit(0)),console.log(`UI running at http://${l}:${u.upstreamPort}; acting as HTTP proxy on port ${u.handle.port}`);let d=!1,f=e=>{d||(d=!0,console.log(n(`\n[ui-proxy] Shutting down (${e})...`)),u.handle.close().finally(()=>process.exit(process.exitCode??0)),setTimeout(()=>process.exit(process.exitCode??0),2e3).unref())};process.once(`SIGINT`,()=>f(`SIGINT`)),process.once(`SIGTERM`,()=>f(`SIGTERM`))}})}process.argv.includes(`--no-color`)?(process.env.NO_COLOR=`1`,delete process.env.FORCE_COLOR):process.argv.includes(`--color`)&&(process.env.FORCE_COLOR=`1`,delete process.env.NO_COLOR);const Q=new C;let $;Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).version(p).option(`--cwd <path>`,`Working directory`).option(`--log-level <level>`,`Log level`,`info`).option(`--no-color`,`Disable color output`).option(`--color`,`Force color output`).hook(`preAction`,e=>{let t=e.opts(),n=t.cwd;n!==void 0&&process.chdir(n);let{config:r}=S(n),i=e.args.length===0?t:e.commands[0]?.opts()??{};i.port!==void 0&&(r.server.port=Number(i.port)),i.host!==void 0&&(r.server.host=i.host),process.env.PORT&&(r.server.port=Number(process.env.PORT)),process.env.HOST&&(r.server.host=process.env.HOST),$=r});const Ei=b(()=>$);Q.addCommand(Ei,{isDefault:!0});const Di=ti(()=>$);Q.addCommand(Di),Q.addCommand(y());const Oi=ni(()=>$);Q.addCommand(Oi);const ki=Ti(()=>$);Q.addCommand(ki),Q.addCommand(hi(()=>$)),Q.addCommand(rt(()=>$)),Q.addCommand(fi(()=>$)),Q.addCommand($e(()=>$)),Q.addCommand(ft(()=>$)),Q.addCommand(ii(()=>$)),Q.addCommand(oi(()=>$)),Q.addCommand(ai(()=>$)),await Q.parseAsync();export{};
2
+ import{o as e}from"./chunk-FK9Q3tQk.mjs";import{t}from"./esm-CEs3LWY3.mjs";import{At as n,C as r,Ft as i,Gt as a,Ht as o,It as s,Jt as c,Lt as l,Rt as u,S as d,Tt as f,V as p,Y as m,cn as h,jt as g,kt as _,n as ee,sn as v}from"./dist-DVM7wH81.mjs";import{n as te,r as y,t as b}from"./dist-bundle-BSdjl7Rj.mjs";import{S as ne,_ as x,b as S,f as re,g as C,h as w,m as ie,p as ae,r as oe,v as T,x as E,y as se}from"./init-B7qJnXKB.mjs";import{c as ce,f as le,l as ue,s as de}from"./server-lock-D7DXNVql-BRVVzA6T.mjs";import{i as fe}from"./git-handle-DwfYp_z--CfyPz4Dz.mjs";import{$n as pe,Bt as me,G as he,L as ge,Ot as _e,Qn as ve,Vt as ye,Wt as be,X as xe,Zn as Se,bn as D,er as Ce,ir as we,nn as Te,rr as Ee,tr as De,yn as O}from"./dist-B6pNPboH.mjs";import{n as Oe}from"./constants-Dc6GZ6j9.mjs";import{t as ke}from"./loader-BQf8AJXb.mjs";import{d as Ae,f as je,l as Me,m as Ne,p as Pe,s as Fe}from"./start-D6Ip3u6P.mjs";import{c as Ie,i as Le,n as k,o as A,r as Re,s as ze,t as j}from"./colors-BNufdynn.mjs";import"./src-Cak39c0B.mjs";import{execFileSync as Be,spawn as Ve,spawnSync as M}from"node:child_process";import He,{basename as Ue,dirname as We,join as N,relative as Ge,resolve as P}from"node:path";import{closeSync as Ke,existsSync as F,mkdirSync as qe,mkdtempSync as Je,openSync as Ye,readFileSync as I,readdirSync as Xe,rmSync as Ze,unlinkSync as Qe,writeFileSync as $e}from"node:fs";import et from"node:process";import{homedir as tt,hostname as nt,tmpdir as rt}from"node:os";import{AsyncLocalStorage as it,AsyncResource as at}from"node:async_hooks";import{stripVTControlCharacters as ot,styleText as L}from"node:util";import*as st from"node:readline";import{randomUUID as ct}from"node:crypto";import{realpath as lt}from"node:fs/promises";import{setTimeout as ut}from"node:timers/promises";import{createServer as dt,request as ft}from"node:http";import{createInterface as pt}from"node:readline/promises";var mt=h();const ht=`open-knowledge`;var gt=class{backend=`keyring`;async get(e){let{Entry:t}=await import(`@napi-rs/keyring`);try{let n=new t(ht,e).getPassword();return n==null?null:JSON.parse(n)}catch{return null}}async set(e,t,n,r){let{Entry:i}=await import(`@napi-rs/keyring`),a=new i(ht,e),o={login:t,token:n,...r};a.setPassword(JSON.stringify(o))}async clear(e){let{Entry:t}=await import(`@napi-rs/keyring`);try{new t(ht,e).deletePassword()}catch{}}},_t=class{backend=`file`;authFile;constructor(e){this.authFile=e??N(tt(),`.ok`,`auth.yml`)}read(){if(!F(this.authFile))return{};try{return(0,mt.parse)(I(this.authFile,`utf-8`))??{}}catch(e){let t=e instanceof Error?e.message:`unknown error`;return process.stderr.write(`[auth] Failed to parse ${this.authFile}: ${t}. Starting with empty credentials.\n`),{}}}write(e){let t=We(this.authFile);F(t)||qe(t,{recursive:!0,mode:448}),$e(this.authFile,(0,mt.stringify)(e),{mode:384})}async get(e){return this.read()[e]??null}async set(e,t,n,r){let i=this.read();i[e]={login:t,token:n,...r},this.write(i)}async clear(e){let t=this.read();delete t[e],this.write(t)}};async function vt(e){try{let{Entry:e}=await import(`@napi-rs/keyring`);return new e(ht,`__probe__`),process.stderr.write(`[auth] token storage: OS keychain
3
+ `),new gt}catch{return process.stderr.write(`[auth] token storage: file (~/.ok/auth.yml)
4
+ `),new _t(e)}}async function yt(e,t,n){let r=bt(await xt(e)).host??``;if(!r)return 1;let i=await n.get(r);if(i==null)return 1;let a=e=>e.replace(/[\r\n]/g,``);return t.write(`username=${a(i.login)}\npassword=${a(i.token)}\n`),0}function bt(e){let t={};for(let n of e.split(`
5
+ `)){let e=n.trim();if(e===``)continue;let r=e.indexOf(`=`);r!==-1&&(t[e.slice(0,r)]=e.slice(r+1))}return t}function xt(e){return new Promise((t,n)=>{let r=[];e.on(`data`,e=>r.push(e)),e.on(`end`,()=>t(Buffer.concat(r).toString(`utf-8`))),e.on(`error`,n)})}function St(e){let n=new t(`git-credential`);return n.description(`Git credential helper (git credential-helper protocol)`),n.command(`get`).description(`Lookup credentials from TokenStore (called by git)`).action(async()=>{let t=await e(),n=await yt(process.stdin,process.stdout,t);process.exit(n)}),n}function Ct(e){let t=e.endpoint.DEFAULTS;return/^https:\/\/(api\.)?github\.com$/.test(t.baseUrl)?`https://github.com`:t.baseUrl.replace(`/api/v3`,``)}async function wt(e,t,n){let r={baseUrl:Ct(e),headers:{accept:`application/json`},...n},i=await e(t,r);if(`error`in i.data){let n=new te(`${i.data.error_description} (${i.data.error}, ${i.data.error_uri})`,400,{request:e.endpoint.merge(t,r)});throw n.response=i,n}return i}async function Tt(e){let t=e.request||b,n={client_id:e.clientId};return`scopes`in e&&Array.isArray(e.scopes)&&(n.scope=e.scopes.join(` `)),wt(t,`POST /login/device/code`,n)}async function Et(e){let t=await wt(e.request||b,`POST /login/oauth/access_token`,{client_id:e.clientId,device_code:e.code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`}),n={clientType:e.clientType,clientId:e.clientId,token:t.data.access_token,scopes:t.data.scope.split(/\s+/).filter(Boolean)};if(`clientSecret`in e&&(n.clientSecret=e.clientSecret),e.clientType===`github-app`){if(`refresh_token`in t.data){let e=new Date(t.headers.date).getTime();n.refreshToken=t.data.refresh_token,n.expiresAt=Dt(e,t.data.expires_in),n.refreshTokenExpiresAt=Dt(e,t.data.refresh_token_expires_in)}delete n.scopes}return{...t,authentication:n}}function Dt(e,t){return new Date(e+t*1e3).toISOString()}async function Ot(e,t){let n=kt(e,t.auth);if(n)return n;let{data:r}=await Tt({clientType:e.clientType,clientId:e.clientId,request:t.request||e.request,scopes:t.auth.scopes||e.scopes});await e.onVerification(r);let i=await jt(t.request||e.request,e.clientId,e.clientType,r);return e.authentication=i,i}function kt(e,t){if(t.refresh===!0||!e.authentication)return!1;if(e.clientType===`github-app`)return e.authentication;let n=e.authentication;return(`scopes`in t&&t.scopes||e.scopes).join(` `)===n.scopes.join(` `)?n:!1}async function At(e){await new Promise(t=>setTimeout(t,e*1e3))}async function jt(e,t,n,r){try{let i={clientId:t,request:e,code:r.device_code},{authentication:a}=n===`oauth-app`?await Et({...i,clientType:`oauth-app`}):await Et({...i,clientType:`github-app`});return{type:`token`,tokenType:`oauth`,...a}}catch(i){if(!i.response)throw i;let a=i.response.data.error;if(a===`authorization_pending`)return await At(r.interval),jt(e,t,n,r);if(a===`slow_down`)return await At(r.interval+7),jt(e,t,n,r);throw i}}async function Mt(e,t){return Ot(e,{auth:t})}async function Nt(e,t,n,r){let i=t.endpoint.merge(n,r);if(/\/login\/(oauth\/access_token|device\/code)$/.test(i.url))return t(i);let{token:a}=await Ot(e,{request:t,auth:{type:`oauth`}});return i.headers.authorization=`token ${a}`,t(i)}var Pt=`0.0.0-development`;function Ft(e){let t=e.request||b.defaults({headers:{"user-agent":`octokit-auth-oauth-device.js/${Pt} ${y()}`}}),{request:n=t,...r}=e,i=e.clientType===`github-app`?{...r,clientType:`github-app`,request:n}:{...r,clientType:`oauth-app`,request:n,scopes:e.scopes||[]};if(!e.clientId)throw Error(`[@octokit/auth-oauth-device] "clientId" option must be set (https://github.com/octokit/auth-oauth-device.js#usage)`);if(!e.onVerification)throw Error(`[@octokit/auth-oauth-device] "onVerification" option must be a function (https://github.com/octokit/auth-oauth-device.js#usage)`);return Object.assign(Mt.bind(null,i),{hook:Nt.bind(null,i)})}async function It(e){let{clientId:t,scopes:n=[`repo`,`read:user`,`user:email`],onVerification:r,host:i}=e,a=i&&i!==`github.com`?`https://${i}/api/v3`:`https://api.github.com`,o=Ft({clientType:`oauth-app`,clientId:t,scopes:n,onVerification:async e=>{await r({verificationUri:e.verification_uri,userCode:e.user_code,expiresIn:e.expires_in,interval:e.interval})},request:a===`https://api.github.com`?void 0:(await import(`./dist-bundle-BmF5_Mcp.mjs`)).request.defaults({baseUrl:a})}),s;try{s=await o({type:`oauth`})}catch(e){if(e instanceof Error){let t=e.message.toLowerCase();throw t.includes(`access_denied`)?Error(`Device-flow authorization was denied.`):t.includes(`expired_token`)||t.includes(`timeout`)||t.includes(`timed out`)?Error(`Device-flow code expired before authorization — please try again.`):Error(`GitHub sign-in failed: ${e.message}`)}throw e}return{token:s.token,tokenType:s.tokenType,scopes:s.scopes??[]}}const Lt={invalid_type:`invalid_type`,too_big:`too_big`,too_small:`too_small`,invalid_format:`invalid_format`,not_multiple_of:`not_multiple_of`,unrecognized_keys:`unrecognized_keys`,invalid_union:`invalid_union`,invalid_key:`invalid_key`,invalid_element:`invalid_element`,invalid_value:`invalid_value`,custom:`custom`};var Rt;(function(e){})(Rt||={});function zt(e){return c(f,e)}function Bt(){return process.env.OPEN_KNOWLEDGE_GITHUB_CLIENT_ID??`Ov23liqlSd0V1MwR6rhI`}const Vt=new Set([`gitlab.com`,`bitbucket.org`,`codeberg.org`,`gitea.com`,`sr.ht`,`sourcehut.org`]);function Ht(e){let t=e.toLowerCase().replace(/:\d+$/,``);Vt.has(t)&&(process.stderr.write(`Error: ${e} is not a GitHub host. Only GitHub and GitHub Enterprise Server are supported.\n`),process.exit(1))}function Ut(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Wt(e,t,n=It){let r=Bt(),{host:i,json:a}=e;Ht(i),a||process.stderr.write(`Logging in to ${i}…\n`);let o=await n({clientId:r,host:i===`github.com`?void 0:i,onVerification:e=>{e.userCode,e.verificationUri,a?Ut(!0,{type:`verification`,user_code:e.userCode,verification_uri:e.verificationUri,expires_in:e.expiresIn}):process.stderr.write(`Open: ${e.verificationUri}\nEnter code: ${e.userCode}\n`)}}),s=`unknown`,c,l;try{let e=i===`github.com`?`https://api.github.com`:`https://${i}/api/v3`,t=await fetch(`${e}/user`,{headers:{Authorization:`Bearer ${o.token}`,"User-Agent":`open-knowledge-cli`,Accept:`application/vnd.github+json`}});if(t.ok){let e=await t.json();s=e.login??s,c=e.name??void 0,l=e.email??void 0}}catch{}await t.set(i,s,o.token,{gitProtocol:`https`,name:c,email:l}),a?Ut(!0,{type:`complete`,host:i,login:s}):process.stderr.write(`✓ Logged in as ${s} on ${i}\n`)}function Gt(e){return new t(`login`).description(`Authenticate with GitHub via Device Flow`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{await Wt(t,await e())})}const Kt=e=>e.name===`enter`||e.name===`return`;var qt=class extends Error{name=`AbortPromptError`;message=`Prompt was aborted`;constructor(e){super(),this.cause=e?.cause}},Jt=class extends Error{name=`CancelPromptError`;message=`Prompt was canceled`},Yt=class extends Error{name=`ExitPromptError`},Xt=class extends Error{name=`HookError`},Zt=class extends Error{name=`ValidationError`};const Qt=new it;function $t(e){return{rl:e,hooks:[],hooksCleanup:[],hooksEffect:[],index:0,handleChange(){}}}function en(e,t){let n=$t(e);return Qt.run(n,()=>{function e(e){n.handleChange=()=>{n.index=0,e()},n.handleChange()}return t(e)})}function R(){let e=Qt.getStore();if(!e)throw new Xt(`[Inquirer] Hook functions can only be called from within a prompt`);return e}function tn(){return R().rl}function nn(e){return at.bind((...t)=>{let n=R(),r=!1,i=n.handleChange;n.handleChange=()=>{r=!0};let a=e(...t);return r&&i(),n.handleChange=i,a})}function rn(e){let t=R(),{index:n}=t,r=e({get(){return t.hooks[n]},set(e){t.hooks[n]=e},initialized:n in t.hooks});return t.index++,r}function an(){R().handleChange()}const z={queue(e){let t=R(),{index:n}=t;t.hooksEffect.push(()=>{t.hooksCleanup[n]?.();let r=e(tn());if(r!=null&&typeof r!=`function`)throw new Zt(`useEffect return value must be a cleanup function or nothing.`);t.hooksCleanup[n]=r})},run(){let e=R();nn(()=>{e.hooksEffect.forEach(e=>{e()}),e.hooksEffect.length=0})()},clearAll(){let e=R();e.hooksCleanup.forEach(e=>{e?.()}),e.hooksEffect.length=0,e.hooksCleanup.length=0}};function on(e){return typeof e==`function`}function B(e){return rn(t=>{let n=at.bind(function(e){t.get()!==e&&(t.set(e),an())});if(t.initialized)return[t.get(),n];let r=on(e)?e():e;return t.set(r),[r,n]})}function sn(e,t){rn(n=>{let r=n.get();(!Array.isArray(r)||t.some((e,t)=>!Object.is(e,r[t])))&&z.queue(e),n.set(t)})}const cn={prefix:{idle:L(`blue`,`?`),done:L(`green`,ne.tick)},spinner:{interval:80,frames:[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`].map(e=>L(`yellow`,e))},style:{answer:e=>L(`cyan`,e),message:e=>L(`bold`,e),error:e=>L(`red`,`> ${e}`),defaultAnswer:e=>L(`dim`,`(${e})`),help:e=>L(`dim`,e),highlight:e=>L(`cyan`,e),key:e=>L(`cyan`,L(`bold`,`<${e}>`))}};function ln(e){if(typeof e!=`object`||!e)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function un(...e){let t={};for(let n of e)for(let[e,r]of Object.entries(n)){let n=t[e];t[e]=ln(n)&&ln(r)?un(n,r):r}return t}function dn(...e){return un(cn,...e.filter(e=>e!=null))}function fn({status:e=`idle`,theme:t}){let[n,r]=B(!1),[i,a]=B(0),{prefix:o,spinner:s}=dn(t);return sn(()=>{if(e===`loading`){let e,t=-1,n=setTimeout(()=>{r(!0),e=setInterval(()=>{t+=1,a(t%s.frames.length)},s.interval)},300);return()=>{clearTimeout(n),clearInterval(e)}}else r(!1)},[e]),n?s.frames[i]:typeof o==`string`?o:o[e===`loading`?`idle`:e]??o.idle}function pn(e){return B({current:e})[0]}function mn(e){let t=pn(e);t.current=e,sn(e=>{let n=!1,r=nn((r,i)=>{n||t.current(i,e)});return e.input.on(`keypress`,r),()=>{n=!0,e.input.removeListener(`keypress`,r)}},[])}var hn=e(E(),1);function gn(e,t){return e.split(`
6
+ `).flatMap(e=>S(e,t,{trim:!1,hard:!0}).split(`
7
+ `).map(e=>e.trimEnd())).join(`
8
+ `)}function _n(){return(0,hn.default)({defaultWidth:80,output:tn().output})}const vn=e=>e.split(`
9
+ `).length,yn=e=>e.split(`
10
+ `).pop()??``;var bn=class{height=0;extraLinesUnderPrompt=0;cursorPos;rl;constructor(e){this.rl=e,this.cursorPos=e.getCursorPos()}write(e){this.rl.output.unmute(),this.rl.output.write(e),this.rl.output.mute()}render(e,t=``){let n=ot(yn(e)),r=n;this.rl.line.length>0&&(r=r.slice(0,-this.rl.line.length)),this.rl.setPrompt(r),this.cursorPos=this.rl.getCursorPos();let i=_n();e=gn(e,i),t=gn(t,i),n.length%i===0&&(e+=`
11
+ `);let a=e+(t?`
12
+ `+t:``),o=Math.floor(n.length/i)-this.cursorPos.rows+(t?vn(t):0);o>0&&(a+=C(o)),a+=w(this.cursorPos.cols),this.write(re(this.extraLinesUnderPrompt)+x(this.height)+a),this.extraLinesUnderPrompt=o,this.height=vn(a)}checkCursorPos(){let e=this.rl.getCursorPos();e.cols!==this.cursorPos.cols&&(this.write(w(e.cols)),this.cursorPos=e)}done({clearContent:e}){this.rl.setPrompt(``);let t=re(this.extraLinesUnderPrompt);t+=e?x(this.height):`
13
+ `,t+=ie,this.write(t),this.rl.close()}},xn=class extends Promise{static withResolver(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}},Sn=e(se(),1);const Cn=globalThis.setImmediate;function wn(){let e=Error.prepareStackTrace,t=[];try{Error.prepareStackTrace=(e,n)=>{let r=n.slice(1);return t=r,r},Error().stack}catch{return t}return Error.prepareStackTrace=e,t}function Tn(e){let t=wn();return(n,r={})=>{let{input:i=process.stdin,signal:a}=r,o=new Set,s=new Sn.default;s.pipe(r.output??process.stdout),s.mute();let c=st.createInterface({terminal:!0,input:i,output:s}),l=new bn(c),{promise:u,resolve:d,reject:f}=xn.withResolver(),p=()=>f(new Jt);if(a){let e=()=>f(new qt({cause:a.reason}));if(a.aborted)return e(),Object.assign(u,{cancel:p});a.addEventListener(`abort`,e),o.add(()=>a.removeEventListener(`abort`,e))}o.add(T((e,t)=>{f(new Yt(`User force closed the prompt with ${e} ${t}`))}));let m=()=>f(new Yt(`User force closed the prompt with SIGINT`));return c.on(`SIGINT`,m),o.add(()=>c.removeListener(`SIGINT`,m)),en(c,a=>{let m=at.bind(()=>z.clearAll());c.on(`close`,m),o.add(()=>c.removeListener(`close`,m));let h=()=>{let r=()=>l.checkCursorPos();c.input.on(`keypress`,r),o.add(()=>c.input.removeListener(`keypress`,r));let i=null;a(()=>{let r=!1;try{let a=e(n,e=>{r?d(e):i={value:e}});if(a===void 0){let e=t[1]?.getFileName();throw e&&!e.startsWith(`file://`)&&(e=He.resolve(e)),Error(`Prompt functions must return a string.\n at ${e}`)}let[o,s]=typeof a==`string`?[a]:a;l.render(o,s),z.run()}catch(e){f(e)}if(r=!0,i!==null){let{value:e}=i;i=null,d(e)}})};return`readableFlowing`in i?Cn(h):h(),Object.assign(u.then(e=>(z.clearAll(),e),e=>{throw z.clearAll(),e}).finally(()=>{o.forEach(e=>e()),l.done({clearContent:!!r.clearPromptOnDone}),s.end()}).then(()=>u),{cancel:p})})}}const En={style:{maskedText:`[input is masked]`}};var Dn=Tn((e,t)=>{let{validate:n=()=>!0}=e,r=dn(En,e.theme),[i,a]=B(`idle`),[o,s]=B(),[c,l]=B(``),u=fn({status:i,theme:r});mn(async(e,r)=>{if(i===`idle`)if(Kt(e)){let e=c;a(`loading`);let i=await n(e);i===!0?(l(e),a(`done`),t(e)):(r.write(c),s(i||`You must provide a valid value`),a(`idle`))}else l(r.line),s(void 0)});let d=r.style.message(e.message,i),f=``,p;e.mask?f=(typeof e.mask==`string`?e.mask:`*`).repeat(c.length):i!==`done`&&(p=`${r.style.help(r.style.maskedText)}${ae}`),i===`done`&&(f=r.style.answer(f));let m=``;return o&&(m=r.style.error(o)),[[u,d,e.mask?f:p].join(` `),m]});function On(e,t,n,r){if(typeof n!=`function`)throw Error(`method for before hook must be a function`);return r||={},Array.isArray(t)?t.reverse().reduce((t,n)=>On.bind(null,e,n,t,r),n)():Promise.resolve().then(()=>e.registry[t]?e.registry[t].reduce((e,t)=>t.hook.bind(null,e,r),n)():n(r))}function kn(e,t,n,r){let i=r;e.registry[n]||(e.registry[n]=[]),t===`before`&&(r=(e,t)=>Promise.resolve().then(i.bind(null,t)).then(e.bind(null,t))),t===`after`&&(r=(e,t)=>{let n;return Promise.resolve().then(e.bind(null,t)).then(e=>(n=e,i(n,t))).then(()=>n)}),t===`error`&&(r=(e,t)=>Promise.resolve().then(e.bind(null,t)).catch(e=>i(e,t))),e.registry[n].push({hook:r,orig:i})}function An(e,t,n){if(!e.registry[t])return;let r=e.registry[t].map(e=>e.orig).indexOf(n);r!==-1&&e.registry[t].splice(r,1)}const jn=Function.bind,Mn=jn.bind(jn);function Nn(e,t,n){let r=Mn(An,null).apply(null,n?[t,n]:[t]);e.api={remove:r},e.remove=r,[`before`,`error`,`after`,`wrap`].forEach(r=>{let i=n?[t,r,n]:[t,r];e[r]=e.api[r]=Mn(kn,null).apply(null,i)})}function Pn(){let e=Symbol(`Singular`),t={registry:{}},n=On.bind(null,t,e);return Nn(n,t,e),n}function Fn(){let e={registry:{}},t=On.bind(null,e);return Nn(t,e),t}var In={Singular:Pn,Collection:Fn},Ln=`0.0.0-development`;function Rn(e){return`Request failed due to following response errors:
14
+ `+e.errors.map(e=>` - ${e.message}`).join(`
15
+ `)}var zn=class extends Error{constructor(e,t,n){super(Rn(n)),this.request=e,this.headers=t,this.response=n,this.errors=n.errors,this.data=n.data,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}name=`GraphqlResponseError`;errors;data},Bn=[`method`,`baseUrl`,`url`,`headers`,`request`,`query`,`mediaType`,`operationName`],Vn=[`query`,`method`,`url`],Hn=/\/api\/v3\/?$/;function Un(e,t,n){if(n){if(typeof t==`string`&&`query`in n)return Promise.reject(Error(`[@octokit/graphql] "query" cannot be used as variable name`));for(let e in n)if(Vn.includes(e))return Promise.reject(Error(`[@octokit/graphql] "${e}" cannot be used as variable name`))}let r=typeof t==`string`?Object.assign({query:t},n):t,i=Object.keys(r).reduce((e,t)=>Bn.includes(t)?(e[t]=r[t],e):(e.variables||={},e.variables[t]=r[t],e),{}),a=r.baseUrl||e.endpoint.DEFAULTS.baseUrl;return Hn.test(a)&&(i.url=a.replace(Hn,`/api/graphql`)),e(i).then(e=>{if(e.data.errors){let t={};for(let n of Object.keys(e.headers))t[n]=e.headers[n];throw new zn(i,t,e.data)}return e.data.data})}function Wn(e,t){let n=e.defaults(t);return Object.assign((e,t)=>Un(n,e,t),{defaults:Wn.bind(null,n),endpoint:n.endpoint})}Wn(b,{headers:{"user-agent":`octokit-graphql.js/${Ln} ${y()}`},method:`POST`,url:`/graphql`});function Gn(e){return Wn(e,{method:`POST`,url:`/graphql`})}var Kn=`(?:[a-zA-Z0-9_-]+)`,qn=`\\.`,Jn=RegExp(`^${Kn}${qn}${Kn}${qn}${Kn}$`),Yn=Jn.test.bind(Jn);async function Xn(e){let t=Yn(e),n=e.startsWith(`v1.`)||e.startsWith(`ghs_`),r=e.startsWith(`ghu_`);return{type:`token`,token:e,tokenType:t?`app`:n?`installation`:r?`user-to-server`:`oauth`}}function Zn(e){return e.split(/\./).length===3?`bearer ${e}`:`token ${e}`}async function Qn(e,t,n,r){let i=t.endpoint.merge(n,r);return i.headers.authorization=Zn(e),t(i)}var $n=function(e){if(!e)throw Error(`[@octokit/auth-token] No token passed to createTokenAuth`);if(typeof e!=`string`)throw Error(`[@octokit/auth-token] Token passed to createTokenAuth is not a string`);return e=e.replace(/^(token|bearer) +/i,``),Object.assign(Xn.bind(null,e),{hook:Qn.bind(null,e)})};const er=`7.0.6`,tr=()=>{},nr=console.warn.bind(console),rr=console.error.bind(console);function ir(e={}){return typeof e.debug!=`function`&&(e.debug=tr),typeof e.info!=`function`&&(e.info=tr),typeof e.warn!=`function`&&(e.warn=nr),typeof e.error!=`function`&&(e.error=rr),e}const ar=`octokit-core.js/${er} ${y()}`;var or=class{static VERSION=er;static defaults(e){return class extends this{constructor(...t){let n=t[0]||{};if(typeof e==`function`){super(e(n));return}super(Object.assign({},e,n,n.userAgent&&e.userAgent?{userAgent:`${n.userAgent} ${e.userAgent}`}:null))}}}static plugins=[];static plugin(...e){let t=this.plugins;return class extends this{static plugins=t.concat(e.filter(e=>!t.includes(e)))}}constructor(e={}){let t=new In.Collection,n={baseUrl:b.endpoint.DEFAULTS.baseUrl,headers:{},request:Object.assign({},e.request,{hook:t.bind(null,`request`)}),mediaType:{previews:[],format:``}};if(n.headers[`user-agent`]=e.userAgent?`${e.userAgent} ${ar}`:ar,e.baseUrl&&(n.baseUrl=e.baseUrl),e.previews&&(n.mediaType.previews=e.previews),e.timeZone&&(n.headers[`time-zone`]=e.timeZone),this.request=b.defaults(n),this.graphql=Gn(this.request).defaults(n),this.log=ir(e.log),this.hook=t,e.authStrategy){let{authStrategy:n,...r}=e,i=n(Object.assign({request:this.request,log:this.log,octokit:this,octokitOptions:r},e.auth));t.wrap(`request`,i.hook),this.auth=i}else if(!e.auth)this.auth=async()=>({type:`unauthenticated`});else{let n=$n(e.auth);t.wrap(`request`,n.hook),this.auth=n}let r=this.constructor;for(let t=0;t<r.plugins.length;++t)Object.assign(this,r.plugins[t](this,e))}request;graphql;log;hook;auth};function sr(e){e.hook.wrap(`request`,(t,n)=>{e.log.debug(`request`,n);let r=Date.now(),i=e.request.endpoint.parse(n),a=i.url.replace(n.baseUrl,``);return t(n).then(t=>{let n=t.headers[`x-github-request-id`];return e.log.info(`${i.method} ${a} - ${t.status} with id ${n} in ${Date.now()-r}ms`),t}).catch(t=>{let n=t.response?.headers[`x-github-request-id`]||`UNKNOWN`;throw e.log.error(`${i.method} ${a} - ${t.status} with id ${n} in ${Date.now()-r}ms`),t})})}sr.VERSION=`6.0.0`;var cr=`0.0.0-development`;function lr(e){if(!e.data)return{...e,data:[]};if(!((`total_count`in e.data||`total_commits`in e.data)&&!(`url`in e.data)))return e;let t=e.data.incomplete_results,n=e.data.repository_selection,r=e.data.total_count,i=e.data.total_commits;delete e.data.incomplete_results,delete e.data.repository_selection,delete e.data.total_count,delete e.data.total_commits;let a=Object.keys(e.data)[0];return e.data=e.data[a],t!==void 0&&(e.data.incomplete_results=t),n!==void 0&&(e.data.repository_selection=n),e.data.total_count=r,e.data.total_commits=i,e}function ur(e,t,n){let r=typeof t==`function`?t.endpoint(n):e.request.endpoint(t,n),i=typeof t==`function`?t:e.request,a=r.method,o=r.headers,s=r.url;return{[Symbol.asyncIterator]:()=>({async next(){if(!s)return{done:!0};try{let e=lr(await i({method:a,url:s,headers:o}));if(s=((e.headers.link||``).match(/<([^<>]+)>;\s*rel="next"/)||[])[1],!s&&`total_commits`in e.data){let t=new URL(e.url),n=t.searchParams,r=parseInt(n.get(`page`)||`1`,10);r*parseInt(n.get(`per_page`)||`250`,10)<e.data.total_commits&&(n.set(`page`,String(r+1)),s=t.toString())}return{value:e}}catch(e){if(e.status!==409)throw e;return s=``,{value:{status:200,headers:{},data:[]}}}}})}}function dr(e,t,n,r){return typeof n==`function`&&(r=n,n=void 0),fr(e,[],ur(e,t,n)[Symbol.asyncIterator](),r)}function fr(e,t,n,r){return n.next().then(i=>{if(i.done)return t;let a=!1;function o(){a=!0}return t=t.concat(r?r(i.value,o):i.value.data),a?t:fr(e,t,n,r)})}Object.assign(dr,{iterator:ur});function pr(e){return{paginate:Object.assign(dr.bind(null,e),{iterator:ur.bind(null,e)})}}pr.VERSION=cr;const mr=`17.0.0`;var hr={actions:{addCustomLabelsToSelfHostedRunnerForOrg:[`POST /orgs/{org}/actions/runners/{runner_id}/labels`],addCustomLabelsToSelfHostedRunnerForRepo:[`POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels`],addRepoAccessToSelfHostedRunnerGroupInOrg:[`PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}`],addSelectedRepoToOrgSecret:[`PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}`],addSelectedRepoToOrgVariable:[`PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}`],approveWorkflowRun:[`POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve`],cancelWorkflowRun:[`POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel`],createEnvironmentVariable:[`POST /repos/{owner}/{repo}/environments/{environment_name}/variables`],createHostedRunnerForOrg:[`POST /orgs/{org}/actions/hosted-runners`],createOrUpdateEnvironmentSecret:[`PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}`],createOrUpdateOrgSecret:[`PUT /orgs/{org}/actions/secrets/{secret_name}`],createOrUpdateRepoSecret:[`PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}`],createOrgVariable:[`POST /orgs/{org}/actions/variables`],createRegistrationTokenForOrg:[`POST /orgs/{org}/actions/runners/registration-token`],createRegistrationTokenForRepo:[`POST /repos/{owner}/{repo}/actions/runners/registration-token`],createRemoveTokenForOrg:[`POST /orgs/{org}/actions/runners/remove-token`],createRemoveTokenForRepo:[`POST /repos/{owner}/{repo}/actions/runners/remove-token`],createRepoVariable:[`POST /repos/{owner}/{repo}/actions/variables`],createWorkflowDispatch:[`POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches`],deleteActionsCacheById:[`DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}`],deleteActionsCacheByKey:[`DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}`],deleteArtifact:[`DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}`],deleteCustomImageFromOrg:[`DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}`],deleteCustomImageVersionFromOrg:[`DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}`],deleteEnvironmentSecret:[`DELETE /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}`],deleteEnvironmentVariable:[`DELETE /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}`],deleteHostedRunnerForOrg:[`DELETE /orgs/{org}/actions/hosted-runners/{hosted_runner_id}`],deleteOrgSecret:[`DELETE /orgs/{org}/actions/secrets/{secret_name}`],deleteOrgVariable:[`DELETE /orgs/{org}/actions/variables/{name}`],deleteRepoSecret:[`DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}`],deleteRepoVariable:[`DELETE /repos/{owner}/{repo}/actions/variables/{name}`],deleteSelfHostedRunnerFromOrg:[`DELETE /orgs/{org}/actions/runners/{runner_id}`],deleteSelfHostedRunnerFromRepo:[`DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}`],deleteWorkflowRun:[`DELETE /repos/{owner}/{repo}/actions/runs/{run_id}`],deleteWorkflowRunLogs:[`DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs`],disableSelectedRepositoryGithubActionsOrganization:[`DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}`],disableWorkflow:[`PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable`],downloadArtifact:[`GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}`],downloadJobLogsForWorkflowRun:[`GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs`],downloadWorkflowRunAttemptLogs:[`GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs`],downloadWorkflowRunLogs:[`GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs`],enableSelectedRepositoryGithubActionsOrganization:[`PUT /orgs/{org}/actions/permissions/repositories/{repository_id}`],enableWorkflow:[`PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable`],forceCancelWorkflowRun:[`POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel`],generateRunnerJitconfigForOrg:[`POST /orgs/{org}/actions/runners/generate-jitconfig`],generateRunnerJitconfigForRepo:[`POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig`],getActionsCacheList:[`GET /repos/{owner}/{repo}/actions/caches`],getActionsCacheUsage:[`GET /repos/{owner}/{repo}/actions/cache/usage`],getActionsCacheUsageByRepoForOrg:[`GET /orgs/{org}/actions/cache/usage-by-repository`],getActionsCacheUsageForOrg:[`GET /orgs/{org}/actions/cache/usage`],getAllowedActionsOrganization:[`GET /orgs/{org}/actions/permissions/selected-actions`],getAllowedActionsRepository:[`GET /repos/{owner}/{repo}/actions/permissions/selected-actions`],getArtifact:[`GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}`],getCustomImageForOrg:[`GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}`],getCustomImageVersionForOrg:[`GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}`],getCustomOidcSubClaimForRepo:[`GET /repos/{owner}/{repo}/actions/oidc/customization/sub`],getEnvironmentPublicKey:[`GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/public-key`],getEnvironmentSecret:[`GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}`],getEnvironmentVariable:[`GET /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}`],getGithubActionsDefaultWorkflowPermissionsOrganization:[`GET /orgs/{org}/actions/permissions/workflow`],getGithubActionsDefaultWorkflowPermissionsRepository:[`GET /repos/{owner}/{repo}/actions/permissions/workflow`],getGithubActionsPermissionsOrganization:[`GET /orgs/{org}/actions/permissions`],getGithubActionsPermissionsRepository:[`GET /repos/{owner}/{repo}/actions/permissions`],getHostedRunnerForOrg:[`GET /orgs/{org}/actions/hosted-runners/{hosted_runner_id}`],getHostedRunnersGithubOwnedImagesForOrg:[`GET /orgs/{org}/actions/hosted-runners/images/github-owned`],getHostedRunnersLimitsForOrg:[`GET /orgs/{org}/actions/hosted-runners/limits`],getHostedRunnersMachineSpecsForOrg:[`GET /orgs/{org}/actions/hosted-runners/machine-sizes`],getHostedRunnersPartnerImagesForOrg:[`GET /orgs/{org}/actions/hosted-runners/images/partner`],getHostedRunnersPlatformsForOrg:[`GET /orgs/{org}/actions/hosted-runners/platforms`],getJobForWorkflowRun:[`GET /repos/{owner}/{repo}/actions/jobs/{job_id}`],getOrgPublicKey:[`GET /orgs/{org}/actions/secrets/public-key`],getOrgSecret:[`GET /orgs/{org}/actions/secrets/{secret_name}`],getOrgVariable:[`GET /orgs/{org}/actions/variables/{name}`],getPendingDeploymentsForRun:[`GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments`],getRepoPermissions:[`GET /repos/{owner}/{repo}/actions/permissions`,{},{renamed:[`actions`,`getGithubActionsPermissionsRepository`]}],getRepoPublicKey:[`GET /repos/{owner}/{repo}/actions/secrets/public-key`],getRepoSecret:[`GET /repos/{owner}/{repo}/actions/secrets/{secret_name}`],getRepoVariable:[`GET /repos/{owner}/{repo}/actions/variables/{name}`],getReviewsForRun:[`GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals`],getSelfHostedRunnerForOrg:[`GET /orgs/{org}/actions/runners/{runner_id}`],getSelfHostedRunnerForRepo:[`GET /repos/{owner}/{repo}/actions/runners/{runner_id}`],getWorkflow:[`GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}`],getWorkflowAccessToRepository:[`GET /repos/{owner}/{repo}/actions/permissions/access`],getWorkflowRun:[`GET /repos/{owner}/{repo}/actions/runs/{run_id}`],getWorkflowRunAttempt:[`GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}`],getWorkflowRunUsage:[`GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing`],getWorkflowUsage:[`GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing`],listArtifactsForRepo:[`GET /repos/{owner}/{repo}/actions/artifacts`],listCustomImageVersionsForOrg:[`GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions`],listCustomImagesForOrg:[`GET /orgs/{org}/actions/hosted-runners/images/custom`],listEnvironmentSecrets:[`GET /repos/{owner}/{repo}/environments/{environment_name}/secrets`],listEnvironmentVariables:[`GET /repos/{owner}/{repo}/environments/{environment_name}/variables`],listGithubHostedRunnersInGroupForOrg:[`GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners`],listHostedRunnersForOrg:[`GET /orgs/{org}/actions/hosted-runners`],listJobsForWorkflowRun:[`GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs`],listJobsForWorkflowRunAttempt:[`GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs`],listLabelsForSelfHostedRunnerForOrg:[`GET /orgs/{org}/actions/runners/{runner_id}/labels`],listLabelsForSelfHostedRunnerForRepo:[`GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels`],listOrgSecrets:[`GET /orgs/{org}/actions/secrets`],listOrgVariables:[`GET /orgs/{org}/actions/variables`],listRepoOrganizationSecrets:[`GET /repos/{owner}/{repo}/actions/organization-secrets`],listRepoOrganizationVariables:[`GET /repos/{owner}/{repo}/actions/organization-variables`],listRepoSecrets:[`GET /repos/{owner}/{repo}/actions/secrets`],listRepoVariables:[`GET /repos/{owner}/{repo}/actions/variables`],listRepoWorkflows:[`GET /repos/{owner}/{repo}/actions/workflows`],listRunnerApplicationsForOrg:[`GET /orgs/{org}/actions/runners/downloads`],listRunnerApplicationsForRepo:[`GET /repos/{owner}/{repo}/actions/runners/downloads`],listSelectedReposForOrgSecret:[`GET /orgs/{org}/actions/secrets/{secret_name}/repositories`],listSelectedReposForOrgVariable:[`GET /orgs/{org}/actions/variables/{name}/repositories`],listSelectedRepositoriesEnabledGithubActionsOrganization:[`GET /orgs/{org}/actions/permissions/repositories`],listSelfHostedRunnersForOrg:[`GET /orgs/{org}/actions/runners`],listSelfHostedRunnersForRepo:[`GET /repos/{owner}/{repo}/actions/runners`],listWorkflowRunArtifacts:[`GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts`],listWorkflowRuns:[`GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs`],listWorkflowRunsForRepo:[`GET /repos/{owner}/{repo}/actions/runs`],reRunJobForWorkflowRun:[`POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun`],reRunWorkflow:[`POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun`],reRunWorkflowFailedJobs:[`POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs`],removeAllCustomLabelsFromSelfHostedRunnerForOrg:[`DELETE /orgs/{org}/actions/runners/{runner_id}/labels`],removeAllCustomLabelsFromSelfHostedRunnerForRepo:[`DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels`],removeCustomLabelFromSelfHostedRunnerForOrg:[`DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}`],removeCustomLabelFromSelfHostedRunnerForRepo:[`DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}`],removeSelectedRepoFromOrgSecret:[`DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}`],removeSelectedRepoFromOrgVariable:[`DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}`],reviewCustomGatesForRun:[`POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule`],reviewPendingDeploymentsForRun:[`POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments`],setAllowedActionsOrganization:[`PUT /orgs/{org}/actions/permissions/selected-actions`],setAllowedActionsRepository:[`PUT /repos/{owner}/{repo}/actions/permissions/selected-actions`],setCustomLabelsForSelfHostedRunnerForOrg:[`PUT /orgs/{org}/actions/runners/{runner_id}/labels`],setCustomLabelsForSelfHostedRunnerForRepo:[`PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels`],setCustomOidcSubClaimForRepo:[`PUT /repos/{owner}/{repo}/actions/oidc/customization/sub`],setGithubActionsDefaultWorkflowPermissionsOrganization:[`PUT /orgs/{org}/actions/permissions/workflow`],setGithubActionsDefaultWorkflowPermissionsRepository:[`PUT /repos/{owner}/{repo}/actions/permissions/workflow`],setGithubActionsPermissionsOrganization:[`PUT /orgs/{org}/actions/permissions`],setGithubActionsPermissionsRepository:[`PUT /repos/{owner}/{repo}/actions/permissions`],setSelectedReposForOrgSecret:[`PUT /orgs/{org}/actions/secrets/{secret_name}/repositories`],setSelectedReposForOrgVariable:[`PUT /orgs/{org}/actions/variables/{name}/repositories`],setSelectedRepositoriesEnabledGithubActionsOrganization:[`PUT /orgs/{org}/actions/permissions/repositories`],setWorkflowAccessToRepository:[`PUT /repos/{owner}/{repo}/actions/permissions/access`],updateEnvironmentVariable:[`PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}`],updateHostedRunnerForOrg:[`PATCH /orgs/{org}/actions/hosted-runners/{hosted_runner_id}`],updateOrgVariable:[`PATCH /orgs/{org}/actions/variables/{name}`],updateRepoVariable:[`PATCH /repos/{owner}/{repo}/actions/variables/{name}`]},activity:{checkRepoIsStarredByAuthenticatedUser:[`GET /user/starred/{owner}/{repo}`],deleteRepoSubscription:[`DELETE /repos/{owner}/{repo}/subscription`],deleteThreadSubscription:[`DELETE /notifications/threads/{thread_id}/subscription`],getFeeds:[`GET /feeds`],getRepoSubscription:[`GET /repos/{owner}/{repo}/subscription`],getThread:[`GET /notifications/threads/{thread_id}`],getThreadSubscriptionForAuthenticatedUser:[`GET /notifications/threads/{thread_id}/subscription`],listEventsForAuthenticatedUser:[`GET /users/{username}/events`],listNotificationsForAuthenticatedUser:[`GET /notifications`],listOrgEventsForAuthenticatedUser:[`GET /users/{username}/events/orgs/{org}`],listPublicEvents:[`GET /events`],listPublicEventsForRepoNetwork:[`GET /networks/{owner}/{repo}/events`],listPublicEventsForUser:[`GET /users/{username}/events/public`],listPublicOrgEvents:[`GET /orgs/{org}/events`],listReceivedEventsForUser:[`GET /users/{username}/received_events`],listReceivedPublicEventsForUser:[`GET /users/{username}/received_events/public`],listRepoEvents:[`GET /repos/{owner}/{repo}/events`],listRepoNotificationsForAuthenticatedUser:[`GET /repos/{owner}/{repo}/notifications`],listReposStarredByAuthenticatedUser:[`GET /user/starred`],listReposStarredByUser:[`GET /users/{username}/starred`],listReposWatchedByUser:[`GET /users/{username}/subscriptions`],listStargazersForRepo:[`GET /repos/{owner}/{repo}/stargazers`],listWatchedReposForAuthenticatedUser:[`GET /user/subscriptions`],listWatchersForRepo:[`GET /repos/{owner}/{repo}/subscribers`],markNotificationsAsRead:[`PUT /notifications`],markRepoNotificationsAsRead:[`PUT /repos/{owner}/{repo}/notifications`],markThreadAsDone:[`DELETE /notifications/threads/{thread_id}`],markThreadAsRead:[`PATCH /notifications/threads/{thread_id}`],setRepoSubscription:[`PUT /repos/{owner}/{repo}/subscription`],setThreadSubscription:[`PUT /notifications/threads/{thread_id}/subscription`],starRepoForAuthenticatedUser:[`PUT /user/starred/{owner}/{repo}`],unstarRepoForAuthenticatedUser:[`DELETE /user/starred/{owner}/{repo}`]},apps:{addRepoToInstallation:[`PUT /user/installations/{installation_id}/repositories/{repository_id}`,{},{renamed:[`apps`,`addRepoToInstallationForAuthenticatedUser`]}],addRepoToInstallationForAuthenticatedUser:[`PUT /user/installations/{installation_id}/repositories/{repository_id}`],checkToken:[`POST /applications/{client_id}/token`],createFromManifest:[`POST /app-manifests/{code}/conversions`],createInstallationAccessToken:[`POST /app/installations/{installation_id}/access_tokens`],deleteAuthorization:[`DELETE /applications/{client_id}/grant`],deleteInstallation:[`DELETE /app/installations/{installation_id}`],deleteToken:[`DELETE /applications/{client_id}/token`],getAuthenticated:[`GET /app`],getBySlug:[`GET /apps/{app_slug}`],getInstallation:[`GET /app/installations/{installation_id}`],getOrgInstallation:[`GET /orgs/{org}/installation`],getRepoInstallation:[`GET /repos/{owner}/{repo}/installation`],getSubscriptionPlanForAccount:[`GET /marketplace_listing/accounts/{account_id}`],getSubscriptionPlanForAccountStubbed:[`GET /marketplace_listing/stubbed/accounts/{account_id}`],getUserInstallation:[`GET /users/{username}/installation`],getWebhookConfigForApp:[`GET /app/hook/config`],getWebhookDelivery:[`GET /app/hook/deliveries/{delivery_id}`],listAccountsForPlan:[`GET /marketplace_listing/plans/{plan_id}/accounts`],listAccountsForPlanStubbed:[`GET /marketplace_listing/stubbed/plans/{plan_id}/accounts`],listInstallationReposForAuthenticatedUser:[`GET /user/installations/{installation_id}/repositories`],listInstallationRequestsForAuthenticatedApp:[`GET /app/installation-requests`],listInstallations:[`GET /app/installations`],listInstallationsForAuthenticatedUser:[`GET /user/installations`],listPlans:[`GET /marketplace_listing/plans`],listPlansStubbed:[`GET /marketplace_listing/stubbed/plans`],listReposAccessibleToInstallation:[`GET /installation/repositories`],listSubscriptionsForAuthenticatedUser:[`GET /user/marketplace_purchases`],listSubscriptionsForAuthenticatedUserStubbed:[`GET /user/marketplace_purchases/stubbed`],listWebhookDeliveries:[`GET /app/hook/deliveries`],redeliverWebhookDelivery:[`POST /app/hook/deliveries/{delivery_id}/attempts`],removeRepoFromInstallation:[`DELETE /user/installations/{installation_id}/repositories/{repository_id}`,{},{renamed:[`apps`,`removeRepoFromInstallationForAuthenticatedUser`]}],removeRepoFromInstallationForAuthenticatedUser:[`DELETE /user/installations/{installation_id}/repositories/{repository_id}`],resetToken:[`PATCH /applications/{client_id}/token`],revokeInstallationAccessToken:[`DELETE /installation/token`],scopeToken:[`POST /applications/{client_id}/token/scoped`],suspendInstallation:[`PUT /app/installations/{installation_id}/suspended`],unsuspendInstallation:[`DELETE /app/installations/{installation_id}/suspended`],updateWebhookConfigForApp:[`PATCH /app/hook/config`]},billing:{getGithubActionsBillingOrg:[`GET /orgs/{org}/settings/billing/actions`],getGithubActionsBillingUser:[`GET /users/{username}/settings/billing/actions`],getGithubBillingPremiumRequestUsageReportOrg:[`GET /organizations/{org}/settings/billing/premium_request/usage`],getGithubBillingPremiumRequestUsageReportUser:[`GET /users/{username}/settings/billing/premium_request/usage`],getGithubBillingUsageReportOrg:[`GET /organizations/{org}/settings/billing/usage`],getGithubBillingUsageReportUser:[`GET /users/{username}/settings/billing/usage`],getGithubPackagesBillingOrg:[`GET /orgs/{org}/settings/billing/packages`],getGithubPackagesBillingUser:[`GET /users/{username}/settings/billing/packages`],getSharedStorageBillingOrg:[`GET /orgs/{org}/settings/billing/shared-storage`],getSharedStorageBillingUser:[`GET /users/{username}/settings/billing/shared-storage`]},campaigns:{createCampaign:[`POST /orgs/{org}/campaigns`],deleteCampaign:[`DELETE /orgs/{org}/campaigns/{campaign_number}`],getCampaignSummary:[`GET /orgs/{org}/campaigns/{campaign_number}`],listOrgCampaigns:[`GET /orgs/{org}/campaigns`],updateCampaign:[`PATCH /orgs/{org}/campaigns/{campaign_number}`]},checks:{create:[`POST /repos/{owner}/{repo}/check-runs`],createSuite:[`POST /repos/{owner}/{repo}/check-suites`],get:[`GET /repos/{owner}/{repo}/check-runs/{check_run_id}`],getSuite:[`GET /repos/{owner}/{repo}/check-suites/{check_suite_id}`],listAnnotations:[`GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations`],listForRef:[`GET /repos/{owner}/{repo}/commits/{ref}/check-runs`],listForSuite:[`GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs`],listSuitesForRef:[`GET /repos/{owner}/{repo}/commits/{ref}/check-suites`],rerequestRun:[`POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest`],rerequestSuite:[`POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest`],setSuitesPreferences:[`PATCH /repos/{owner}/{repo}/check-suites/preferences`],update:[`PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}`]},codeScanning:{commitAutofix:[`POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits`],createAutofix:[`POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix`],createVariantAnalysis:[`POST /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses`],deleteAnalysis:[`DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}`],deleteCodeqlDatabase:[`DELETE /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}`],getAlert:[`GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}`,{},{renamedParameters:{alert_id:`alert_number`}}],getAnalysis:[`GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}`],getAutofix:[`GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix`],getCodeqlDatabase:[`GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}`],getDefaultSetup:[`GET /repos/{owner}/{repo}/code-scanning/default-setup`],getSarif:[`GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}`],getVariantAnalysis:[`GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}`],getVariantAnalysisRepoTask:[`GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}`],listAlertInstances:[`GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances`],listAlertsForOrg:[`GET /orgs/{org}/code-scanning/alerts`],listAlertsForRepo:[`GET /repos/{owner}/{repo}/code-scanning/alerts`],listAlertsInstances:[`GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances`,{},{renamed:[`codeScanning`,`listAlertInstances`]}],listCodeqlDatabases:[`GET /repos/{owner}/{repo}/code-scanning/codeql/databases`],listRecentAnalyses:[`GET /repos/{owner}/{repo}/code-scanning/analyses`],updateAlert:[`PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}`],updateDefaultSetup:[`PATCH /repos/{owner}/{repo}/code-scanning/default-setup`],uploadSarif:[`POST /repos/{owner}/{repo}/code-scanning/sarifs`]},codeSecurity:{attachConfiguration:[`POST /orgs/{org}/code-security/configurations/{configuration_id}/attach`],attachEnterpriseConfiguration:[`POST /enterprises/{enterprise}/code-security/configurations/{configuration_id}/attach`],createConfiguration:[`POST /orgs/{org}/code-security/configurations`],createConfigurationForEnterprise:[`POST /enterprises/{enterprise}/code-security/configurations`],deleteConfiguration:[`DELETE /orgs/{org}/code-security/configurations/{configuration_id}`],deleteConfigurationForEnterprise:[`DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}`],detachConfiguration:[`DELETE /orgs/{org}/code-security/configurations/detach`],getConfiguration:[`GET /orgs/{org}/code-security/configurations/{configuration_id}`],getConfigurationForRepository:[`GET /repos/{owner}/{repo}/code-security-configuration`],getConfigurationsForEnterprise:[`GET /enterprises/{enterprise}/code-security/configurations`],getConfigurationsForOrg:[`GET /orgs/{org}/code-security/configurations`],getDefaultConfigurations:[`GET /orgs/{org}/code-security/configurations/defaults`],getDefaultConfigurationsForEnterprise:[`GET /enterprises/{enterprise}/code-security/configurations/defaults`],getRepositoriesForConfiguration:[`GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories`],getRepositoriesForEnterpriseConfiguration:[`GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories`],getSingleConfigurationForEnterprise:[`GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}`],setConfigurationAsDefault:[`PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults`],setConfigurationAsDefaultForEnterprise:[`PUT /enterprises/{enterprise}/code-security/configurations/{configuration_id}/defaults`],updateConfiguration:[`PATCH /orgs/{org}/code-security/configurations/{configuration_id}`],updateEnterpriseConfiguration:[`PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}`]},codesOfConduct:{getAllCodesOfConduct:[`GET /codes_of_conduct`],getConductCode:[`GET /codes_of_conduct/{key}`]},codespaces:{addRepositoryForSecretForAuthenticatedUser:[`PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}`],addSelectedRepoToOrgSecret:[`PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}`],checkPermissionsForDevcontainer:[`GET /repos/{owner}/{repo}/codespaces/permissions_check`],codespaceMachinesForAuthenticatedUser:[`GET /user/codespaces/{codespace_name}/machines`],createForAuthenticatedUser:[`POST /user/codespaces`],createOrUpdateOrgSecret:[`PUT /orgs/{org}/codespaces/secrets/{secret_name}`],createOrUpdateRepoSecret:[`PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}`],createOrUpdateSecretForAuthenticatedUser:[`PUT /user/codespaces/secrets/{secret_name}`],createWithPrForAuthenticatedUser:[`POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces`],createWithRepoForAuthenticatedUser:[`POST /repos/{owner}/{repo}/codespaces`],deleteForAuthenticatedUser:[`DELETE /user/codespaces/{codespace_name}`],deleteFromOrganization:[`DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}`],deleteOrgSecret:[`DELETE /orgs/{org}/codespaces/secrets/{secret_name}`],deleteRepoSecret:[`DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}`],deleteSecretForAuthenticatedUser:[`DELETE /user/codespaces/secrets/{secret_name}`],exportForAuthenticatedUser:[`POST /user/codespaces/{codespace_name}/exports`],getCodespacesForUserInOrg:[`GET /orgs/{org}/members/{username}/codespaces`],getExportDetailsForAuthenticatedUser:[`GET /user/codespaces/{codespace_name}/exports/{export_id}`],getForAuthenticatedUser:[`GET /user/codespaces/{codespace_name}`],getOrgPublicKey:[`GET /orgs/{org}/codespaces/secrets/public-key`],getOrgSecret:[`GET /orgs/{org}/codespaces/secrets/{secret_name}`],getPublicKeyForAuthenticatedUser:[`GET /user/codespaces/secrets/public-key`],getRepoPublicKey:[`GET /repos/{owner}/{repo}/codespaces/secrets/public-key`],getRepoSecret:[`GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}`],getSecretForAuthenticatedUser:[`GET /user/codespaces/secrets/{secret_name}`],listDevcontainersInRepositoryForAuthenticatedUser:[`GET /repos/{owner}/{repo}/codespaces/devcontainers`],listForAuthenticatedUser:[`GET /user/codespaces`],listInOrganization:[`GET /orgs/{org}/codespaces`,{},{renamedParameters:{org_id:`org`}}],listInRepositoryForAuthenticatedUser:[`GET /repos/{owner}/{repo}/codespaces`],listOrgSecrets:[`GET /orgs/{org}/codespaces/secrets`],listRepoSecrets:[`GET /repos/{owner}/{repo}/codespaces/secrets`],listRepositoriesForSecretForAuthenticatedUser:[`GET /user/codespaces/secrets/{secret_name}/repositories`],listSecretsForAuthenticatedUser:[`GET /user/codespaces/secrets`],listSelectedReposForOrgSecret:[`GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories`],preFlightWithRepoForAuthenticatedUser:[`GET /repos/{owner}/{repo}/codespaces/new`],publishForAuthenticatedUser:[`POST /user/codespaces/{codespace_name}/publish`],removeRepositoryForSecretForAuthenticatedUser:[`DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}`],removeSelectedRepoFromOrgSecret:[`DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}`],repoMachinesForAuthenticatedUser:[`GET /repos/{owner}/{repo}/codespaces/machines`],setRepositoriesForSecretForAuthenticatedUser:[`PUT /user/codespaces/secrets/{secret_name}/repositories`],setSelectedReposForOrgSecret:[`PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories`],startForAuthenticatedUser:[`POST /user/codespaces/{codespace_name}/start`],stopForAuthenticatedUser:[`POST /user/codespaces/{codespace_name}/stop`],stopInOrganization:[`POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop`],updateForAuthenticatedUser:[`PATCH /user/codespaces/{codespace_name}`]},copilot:{addCopilotSeatsForTeams:[`POST /orgs/{org}/copilot/billing/selected_teams`],addCopilotSeatsForUsers:[`POST /orgs/{org}/copilot/billing/selected_users`],cancelCopilotSeatAssignmentForTeams:[`DELETE /orgs/{org}/copilot/billing/selected_teams`],cancelCopilotSeatAssignmentForUsers:[`DELETE /orgs/{org}/copilot/billing/selected_users`],copilotMetricsForOrganization:[`GET /orgs/{org}/copilot/metrics`],copilotMetricsForTeam:[`GET /orgs/{org}/team/{team_slug}/copilot/metrics`],getCopilotOrganizationDetails:[`GET /orgs/{org}/copilot/billing`],getCopilotSeatDetailsForUser:[`GET /orgs/{org}/members/{username}/copilot`],listCopilotSeats:[`GET /orgs/{org}/copilot/billing/seats`]},credentials:{revoke:[`POST /credentials/revoke`]},dependabot:{addSelectedRepoToOrgSecret:[`PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}`],createOrUpdateOrgSecret:[`PUT /orgs/{org}/dependabot/secrets/{secret_name}`],createOrUpdateRepoSecret:[`PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}`],deleteOrgSecret:[`DELETE /orgs/{org}/dependabot/secrets/{secret_name}`],deleteRepoSecret:[`DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}`],getAlert:[`GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}`],getOrgPublicKey:[`GET /orgs/{org}/dependabot/secrets/public-key`],getOrgSecret:[`GET /orgs/{org}/dependabot/secrets/{secret_name}`],getRepoPublicKey:[`GET /repos/{owner}/{repo}/dependabot/secrets/public-key`],getRepoSecret:[`GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}`],listAlertsForEnterprise:[`GET /enterprises/{enterprise}/dependabot/alerts`],listAlertsForOrg:[`GET /orgs/{org}/dependabot/alerts`],listAlertsForRepo:[`GET /repos/{owner}/{repo}/dependabot/alerts`],listOrgSecrets:[`GET /orgs/{org}/dependabot/secrets`],listRepoSecrets:[`GET /repos/{owner}/{repo}/dependabot/secrets`],listSelectedReposForOrgSecret:[`GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories`],removeSelectedRepoFromOrgSecret:[`DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}`],repositoryAccessForOrg:[`GET /organizations/{org}/dependabot/repository-access`],setRepositoryAccessDefaultLevel:[`PUT /organizations/{org}/dependabot/repository-access/default-level`],setSelectedReposForOrgSecret:[`PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories`],updateAlert:[`PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}`],updateRepositoryAccessForOrg:[`PATCH /organizations/{org}/dependabot/repository-access`]},dependencyGraph:{createRepositorySnapshot:[`POST /repos/{owner}/{repo}/dependency-graph/snapshots`],diffRange:[`GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}`],exportSbom:[`GET /repos/{owner}/{repo}/dependency-graph/sbom`]},emojis:{get:[`GET /emojis`]},enterpriseTeamMemberships:{add:[`PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}`],bulkAdd:[`POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add`],bulkRemove:[`POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/remove`],get:[`GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}`],list:[`GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships`],remove:[`DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}`]},enterpriseTeamOrganizations:{add:[`PUT /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}`],bulkAdd:[`POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/add`],bulkRemove:[`POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/remove`],delete:[`DELETE /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}`],getAssignment:[`GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}`],getAssignments:[`GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations`]},enterpriseTeams:{create:[`POST /enterprises/{enterprise}/teams`],delete:[`DELETE /enterprises/{enterprise}/teams/{team_slug}`],get:[`GET /enterprises/{enterprise}/teams/{team_slug}`],list:[`GET /enterprises/{enterprise}/teams`],update:[`PATCH /enterprises/{enterprise}/teams/{team_slug}`]},gists:{checkIsStarred:[`GET /gists/{gist_id}/star`],create:[`POST /gists`],createComment:[`POST /gists/{gist_id}/comments`],delete:[`DELETE /gists/{gist_id}`],deleteComment:[`DELETE /gists/{gist_id}/comments/{comment_id}`],fork:[`POST /gists/{gist_id}/forks`],get:[`GET /gists/{gist_id}`],getComment:[`GET /gists/{gist_id}/comments/{comment_id}`],getRevision:[`GET /gists/{gist_id}/{sha}`],list:[`GET /gists`],listComments:[`GET /gists/{gist_id}/comments`],listCommits:[`GET /gists/{gist_id}/commits`],listForUser:[`GET /users/{username}/gists`],listForks:[`GET /gists/{gist_id}/forks`],listPublic:[`GET /gists/public`],listStarred:[`GET /gists/starred`],star:[`PUT /gists/{gist_id}/star`],unstar:[`DELETE /gists/{gist_id}/star`],update:[`PATCH /gists/{gist_id}`],updateComment:[`PATCH /gists/{gist_id}/comments/{comment_id}`]},git:{createBlob:[`POST /repos/{owner}/{repo}/git/blobs`],createCommit:[`POST /repos/{owner}/{repo}/git/commits`],createRef:[`POST /repos/{owner}/{repo}/git/refs`],createTag:[`POST /repos/{owner}/{repo}/git/tags`],createTree:[`POST /repos/{owner}/{repo}/git/trees`],deleteRef:[`DELETE /repos/{owner}/{repo}/git/refs/{ref}`],getBlob:[`GET /repos/{owner}/{repo}/git/blobs/{file_sha}`],getCommit:[`GET /repos/{owner}/{repo}/git/commits/{commit_sha}`],getRef:[`GET /repos/{owner}/{repo}/git/ref/{ref}`],getTag:[`GET /repos/{owner}/{repo}/git/tags/{tag_sha}`],getTree:[`GET /repos/{owner}/{repo}/git/trees/{tree_sha}`],listMatchingRefs:[`GET /repos/{owner}/{repo}/git/matching-refs/{ref}`],updateRef:[`PATCH /repos/{owner}/{repo}/git/refs/{ref}`]},gitignore:{getAllTemplates:[`GET /gitignore/templates`],getTemplate:[`GET /gitignore/templates/{name}`]},hostedCompute:{createNetworkConfigurationForOrg:[`POST /orgs/{org}/settings/network-configurations`],deleteNetworkConfigurationFromOrg:[`DELETE /orgs/{org}/settings/network-configurations/{network_configuration_id}`],getNetworkConfigurationForOrg:[`GET /orgs/{org}/settings/network-configurations/{network_configuration_id}`],getNetworkSettingsForOrg:[`GET /orgs/{org}/settings/network-settings/{network_settings_id}`],listNetworkConfigurationsForOrg:[`GET /orgs/{org}/settings/network-configurations`],updateNetworkConfigurationForOrg:[`PATCH /orgs/{org}/settings/network-configurations/{network_configuration_id}`]},interactions:{getRestrictionsForAuthenticatedUser:[`GET /user/interaction-limits`],getRestrictionsForOrg:[`GET /orgs/{org}/interaction-limits`],getRestrictionsForRepo:[`GET /repos/{owner}/{repo}/interaction-limits`],getRestrictionsForYourPublicRepos:[`GET /user/interaction-limits`,{},{renamed:[`interactions`,`getRestrictionsForAuthenticatedUser`]}],removeRestrictionsForAuthenticatedUser:[`DELETE /user/interaction-limits`],removeRestrictionsForOrg:[`DELETE /orgs/{org}/interaction-limits`],removeRestrictionsForRepo:[`DELETE /repos/{owner}/{repo}/interaction-limits`],removeRestrictionsForYourPublicRepos:[`DELETE /user/interaction-limits`,{},{renamed:[`interactions`,`removeRestrictionsForAuthenticatedUser`]}],setRestrictionsForAuthenticatedUser:[`PUT /user/interaction-limits`],setRestrictionsForOrg:[`PUT /orgs/{org}/interaction-limits`],setRestrictionsForRepo:[`PUT /repos/{owner}/{repo}/interaction-limits`],setRestrictionsForYourPublicRepos:[`PUT /user/interaction-limits`,{},{renamed:[`interactions`,`setRestrictionsForAuthenticatedUser`]}]},issues:{addAssignees:[`POST /repos/{owner}/{repo}/issues/{issue_number}/assignees`],addBlockedByDependency:[`POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by`],addLabels:[`POST /repos/{owner}/{repo}/issues/{issue_number}/labels`],addSubIssue:[`POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues`],checkUserCanBeAssigned:[`GET /repos/{owner}/{repo}/assignees/{assignee}`],checkUserCanBeAssignedToIssue:[`GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}`],create:[`POST /repos/{owner}/{repo}/issues`],createComment:[`POST /repos/{owner}/{repo}/issues/{issue_number}/comments`],createLabel:[`POST /repos/{owner}/{repo}/labels`],createMilestone:[`POST /repos/{owner}/{repo}/milestones`],deleteComment:[`DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}`],deleteLabel:[`DELETE /repos/{owner}/{repo}/labels/{name}`],deleteMilestone:[`DELETE /repos/{owner}/{repo}/milestones/{milestone_number}`],get:[`GET /repos/{owner}/{repo}/issues/{issue_number}`],getComment:[`GET /repos/{owner}/{repo}/issues/comments/{comment_id}`],getEvent:[`GET /repos/{owner}/{repo}/issues/events/{event_id}`],getLabel:[`GET /repos/{owner}/{repo}/labels/{name}`],getMilestone:[`GET /repos/{owner}/{repo}/milestones/{milestone_number}`],getParent:[`GET /repos/{owner}/{repo}/issues/{issue_number}/parent`],list:[`GET /issues`],listAssignees:[`GET /repos/{owner}/{repo}/assignees`],listComments:[`GET /repos/{owner}/{repo}/issues/{issue_number}/comments`],listCommentsForRepo:[`GET /repos/{owner}/{repo}/issues/comments`],listDependenciesBlockedBy:[`GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by`],listDependenciesBlocking:[`GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking`],listEvents:[`GET /repos/{owner}/{repo}/issues/{issue_number}/events`],listEventsForRepo:[`GET /repos/{owner}/{repo}/issues/events`],listEventsForTimeline:[`GET /repos/{owner}/{repo}/issues/{issue_number}/timeline`],listForAuthenticatedUser:[`GET /user/issues`],listForOrg:[`GET /orgs/{org}/issues`],listForRepo:[`GET /repos/{owner}/{repo}/issues`],listLabelsForMilestone:[`GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels`],listLabelsForRepo:[`GET /repos/{owner}/{repo}/labels`],listLabelsOnIssue:[`GET /repos/{owner}/{repo}/issues/{issue_number}/labels`],listMilestones:[`GET /repos/{owner}/{repo}/milestones`],listSubIssues:[`GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues`],lock:[`PUT /repos/{owner}/{repo}/issues/{issue_number}/lock`],removeAllLabels:[`DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels`],removeAssignees:[`DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees`],removeDependencyBlockedBy:[`DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}`],removeLabel:[`DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}`],removeSubIssue:[`DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue`],reprioritizeSubIssue:[`PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority`],setLabels:[`PUT /repos/{owner}/{repo}/issues/{issue_number}/labels`],unlock:[`DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock`],update:[`PATCH /repos/{owner}/{repo}/issues/{issue_number}`],updateComment:[`PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}`],updateLabel:[`PATCH /repos/{owner}/{repo}/labels/{name}`],updateMilestone:[`PATCH /repos/{owner}/{repo}/milestones/{milestone_number}`]},licenses:{get:[`GET /licenses/{license}`],getAllCommonlyUsed:[`GET /licenses`],getForRepo:[`GET /repos/{owner}/{repo}/license`]},markdown:{render:[`POST /markdown`],renderRaw:[`POST /markdown/raw`,{headers:{"content-type":`text/plain; charset=utf-8`}}]},meta:{get:[`GET /meta`],getAllVersions:[`GET /versions`],getOctocat:[`GET /octocat`],getZen:[`GET /zen`],root:[`GET /`]},migrations:{deleteArchiveForAuthenticatedUser:[`DELETE /user/migrations/{migration_id}/archive`],deleteArchiveForOrg:[`DELETE /orgs/{org}/migrations/{migration_id}/archive`],downloadArchiveForOrg:[`GET /orgs/{org}/migrations/{migration_id}/archive`],getArchiveForAuthenticatedUser:[`GET /user/migrations/{migration_id}/archive`],getStatusForAuthenticatedUser:[`GET /user/migrations/{migration_id}`],getStatusForOrg:[`GET /orgs/{org}/migrations/{migration_id}`],listForAuthenticatedUser:[`GET /user/migrations`],listForOrg:[`GET /orgs/{org}/migrations`],listReposForAuthenticatedUser:[`GET /user/migrations/{migration_id}/repositories`],listReposForOrg:[`GET /orgs/{org}/migrations/{migration_id}/repositories`],listReposForUser:[`GET /user/migrations/{migration_id}/repositories`,{},{renamed:[`migrations`,`listReposForAuthenticatedUser`]}],startForAuthenticatedUser:[`POST /user/migrations`],startForOrg:[`POST /orgs/{org}/migrations`],unlockRepoForAuthenticatedUser:[`DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock`],unlockRepoForOrg:[`DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock`]},oidc:{getOidcCustomSubTemplateForOrg:[`GET /orgs/{org}/actions/oidc/customization/sub`],updateOidcCustomSubTemplateForOrg:[`PUT /orgs/{org}/actions/oidc/customization/sub`]},orgs:{addSecurityManagerTeam:[`PUT /orgs/{org}/security-managers/teams/{team_slug}`,{},{deprecated:`octokit.rest.orgs.addSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team`}],assignTeamToOrgRole:[`PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}`],assignUserToOrgRole:[`PUT /orgs/{org}/organization-roles/users/{username}/{role_id}`],blockUser:[`PUT /orgs/{org}/blocks/{username}`],cancelInvitation:[`DELETE /orgs/{org}/invitations/{invitation_id}`],checkBlockedUser:[`GET /orgs/{org}/blocks/{username}`],checkMembershipForUser:[`GET /orgs/{org}/members/{username}`],checkPublicMembershipForUser:[`GET /orgs/{org}/public_members/{username}`],convertMemberToOutsideCollaborator:[`PUT /orgs/{org}/outside_collaborators/{username}`],createArtifactStorageRecord:[`POST /orgs/{org}/artifacts/metadata/storage-record`],createInvitation:[`POST /orgs/{org}/invitations`],createIssueType:[`POST /orgs/{org}/issue-types`],createWebhook:[`POST /orgs/{org}/hooks`],customPropertiesForOrgsCreateOrUpdateOrganizationValues:[`PATCH /organizations/{org}/org-properties/values`],customPropertiesForOrgsGetOrganizationValues:[`GET /organizations/{org}/org-properties/values`],customPropertiesForReposCreateOrUpdateOrganizationDefinition:[`PUT /orgs/{org}/properties/schema/{custom_property_name}`],customPropertiesForReposCreateOrUpdateOrganizationDefinitions:[`PATCH /orgs/{org}/properties/schema`],customPropertiesForReposCreateOrUpdateOrganizationValues:[`PATCH /orgs/{org}/properties/values`],customPropertiesForReposDeleteOrganizationDefinition:[`DELETE /orgs/{org}/properties/schema/{custom_property_name}`],customPropertiesForReposGetOrganizationDefinition:[`GET /orgs/{org}/properties/schema/{custom_property_name}`],customPropertiesForReposGetOrganizationDefinitions:[`GET /orgs/{org}/properties/schema`],customPropertiesForReposGetOrganizationValues:[`GET /orgs/{org}/properties/values`],delete:[`DELETE /orgs/{org}`],deleteAttestationsBulk:[`POST /orgs/{org}/attestations/delete-request`],deleteAttestationsById:[`DELETE /orgs/{org}/attestations/{attestation_id}`],deleteAttestationsBySubjectDigest:[`DELETE /orgs/{org}/attestations/digest/{subject_digest}`],deleteIssueType:[`DELETE /orgs/{org}/issue-types/{issue_type_id}`],deleteWebhook:[`DELETE /orgs/{org}/hooks/{hook_id}`],disableSelectedRepositoryImmutableReleasesOrganization:[`DELETE /orgs/{org}/settings/immutable-releases/repositories/{repository_id}`],enableSelectedRepositoryImmutableReleasesOrganization:[`PUT /orgs/{org}/settings/immutable-releases/repositories/{repository_id}`],get:[`GET /orgs/{org}`],getImmutableReleasesSettings:[`GET /orgs/{org}/settings/immutable-releases`],getImmutableReleasesSettingsRepositories:[`GET /orgs/{org}/settings/immutable-releases/repositories`],getMembershipForAuthenticatedUser:[`GET /user/memberships/orgs/{org}`],getMembershipForUser:[`GET /orgs/{org}/memberships/{username}`],getOrgRole:[`GET /orgs/{org}/organization-roles/{role_id}`],getOrgRulesetHistory:[`GET /orgs/{org}/rulesets/{ruleset_id}/history`],getOrgRulesetVersion:[`GET /orgs/{org}/rulesets/{ruleset_id}/history/{version_id}`],getWebhook:[`GET /orgs/{org}/hooks/{hook_id}`],getWebhookConfigForOrg:[`GET /orgs/{org}/hooks/{hook_id}/config`],getWebhookDelivery:[`GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}`],list:[`GET /organizations`],listAppInstallations:[`GET /orgs/{org}/installations`],listArtifactStorageRecords:[`GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records`],listAttestationRepositories:[`GET /orgs/{org}/attestations/repositories`],listAttestations:[`GET /orgs/{org}/attestations/{subject_digest}`],listAttestationsBulk:[`POST /orgs/{org}/attestations/bulk-list{?per_page,before,after}`],listBlockedUsers:[`GET /orgs/{org}/blocks`],listFailedInvitations:[`GET /orgs/{org}/failed_invitations`],listForAuthenticatedUser:[`GET /user/orgs`],listForUser:[`GET /users/{username}/orgs`],listInvitationTeams:[`GET /orgs/{org}/invitations/{invitation_id}/teams`],listIssueTypes:[`GET /orgs/{org}/issue-types`],listMembers:[`GET /orgs/{org}/members`],listMembershipsForAuthenticatedUser:[`GET /user/memberships/orgs`],listOrgRoleTeams:[`GET /orgs/{org}/organization-roles/{role_id}/teams`],listOrgRoleUsers:[`GET /orgs/{org}/organization-roles/{role_id}/users`],listOrgRoles:[`GET /orgs/{org}/organization-roles`],listOrganizationFineGrainedPermissions:[`GET /orgs/{org}/organization-fine-grained-permissions`],listOutsideCollaborators:[`GET /orgs/{org}/outside_collaborators`],listPatGrantRepositories:[`GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories`],listPatGrantRequestRepositories:[`GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories`],listPatGrantRequests:[`GET /orgs/{org}/personal-access-token-requests`],listPatGrants:[`GET /orgs/{org}/personal-access-tokens`],listPendingInvitations:[`GET /orgs/{org}/invitations`],listPublicMembers:[`GET /orgs/{org}/public_members`],listSecurityManagerTeams:[`GET /orgs/{org}/security-managers`,{},{deprecated:`octokit.rest.orgs.listSecurityManagerTeams() is deprecated, see https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams`}],listWebhookDeliveries:[`GET /orgs/{org}/hooks/{hook_id}/deliveries`],listWebhooks:[`GET /orgs/{org}/hooks`],pingWebhook:[`POST /orgs/{org}/hooks/{hook_id}/pings`],redeliverWebhookDelivery:[`POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts`],removeMember:[`DELETE /orgs/{org}/members/{username}`],removeMembershipForUser:[`DELETE /orgs/{org}/memberships/{username}`],removeOutsideCollaborator:[`DELETE /orgs/{org}/outside_collaborators/{username}`],removePublicMembershipForAuthenticatedUser:[`DELETE /orgs/{org}/public_members/{username}`],removeSecurityManagerTeam:[`DELETE /orgs/{org}/security-managers/teams/{team_slug}`,{},{deprecated:`octokit.rest.orgs.removeSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team`}],reviewPatGrantRequest:[`POST /orgs/{org}/personal-access-token-requests/{pat_request_id}`],reviewPatGrantRequestsInBulk:[`POST /orgs/{org}/personal-access-token-requests`],revokeAllOrgRolesTeam:[`DELETE /orgs/{org}/organization-roles/teams/{team_slug}`],revokeAllOrgRolesUser:[`DELETE /orgs/{org}/organization-roles/users/{username}`],revokeOrgRoleTeam:[`DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}`],revokeOrgRoleUser:[`DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}`],setImmutableReleasesSettings:[`PUT /orgs/{org}/settings/immutable-releases`],setImmutableReleasesSettingsRepositories:[`PUT /orgs/{org}/settings/immutable-releases/repositories`],setMembershipForUser:[`PUT /orgs/{org}/memberships/{username}`],setPublicMembershipForAuthenticatedUser:[`PUT /orgs/{org}/public_members/{username}`],unblockUser:[`DELETE /orgs/{org}/blocks/{username}`],update:[`PATCH /orgs/{org}`],updateIssueType:[`PUT /orgs/{org}/issue-types/{issue_type_id}`],updateMembershipForAuthenticatedUser:[`PATCH /user/memberships/orgs/{org}`],updatePatAccess:[`POST /orgs/{org}/personal-access-tokens/{pat_id}`],updatePatAccesses:[`POST /orgs/{org}/personal-access-tokens`],updateWebhook:[`PATCH /orgs/{org}/hooks/{hook_id}`],updateWebhookConfigForOrg:[`PATCH /orgs/{org}/hooks/{hook_id}/config`]},packages:{deletePackageForAuthenticatedUser:[`DELETE /user/packages/{package_type}/{package_name}`],deletePackageForOrg:[`DELETE /orgs/{org}/packages/{package_type}/{package_name}`],deletePackageForUser:[`DELETE /users/{username}/packages/{package_type}/{package_name}`],deletePackageVersionForAuthenticatedUser:[`DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}`],deletePackageVersionForOrg:[`DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}`],deletePackageVersionForUser:[`DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}`],getAllPackageVersionsForAPackageOwnedByAnOrg:[`GET /orgs/{org}/packages/{package_type}/{package_name}/versions`,{},{renamed:[`packages`,`getAllPackageVersionsForPackageOwnedByOrg`]}],getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser:[`GET /user/packages/{package_type}/{package_name}/versions`,{},{renamed:[`packages`,`getAllPackageVersionsForPackageOwnedByAuthenticatedUser`]}],getAllPackageVersionsForPackageOwnedByAuthenticatedUser:[`GET /user/packages/{package_type}/{package_name}/versions`],getAllPackageVersionsForPackageOwnedByOrg:[`GET /orgs/{org}/packages/{package_type}/{package_name}/versions`],getAllPackageVersionsForPackageOwnedByUser:[`GET /users/{username}/packages/{package_type}/{package_name}/versions`],getPackageForAuthenticatedUser:[`GET /user/packages/{package_type}/{package_name}`],getPackageForOrganization:[`GET /orgs/{org}/packages/{package_type}/{package_name}`],getPackageForUser:[`GET /users/{username}/packages/{package_type}/{package_name}`],getPackageVersionForAuthenticatedUser:[`GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}`],getPackageVersionForOrganization:[`GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}`],getPackageVersionForUser:[`GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}`],listDockerMigrationConflictingPackagesForAuthenticatedUser:[`GET /user/docker/conflicts`],listDockerMigrationConflictingPackagesForOrganization:[`GET /orgs/{org}/docker/conflicts`],listDockerMigrationConflictingPackagesForUser:[`GET /users/{username}/docker/conflicts`],listPackagesForAuthenticatedUser:[`GET /user/packages`],listPackagesForOrganization:[`GET /orgs/{org}/packages`],listPackagesForUser:[`GET /users/{username}/packages`],restorePackageForAuthenticatedUser:[`POST /user/packages/{package_type}/{package_name}/restore{?token}`],restorePackageForOrg:[`POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}`],restorePackageForUser:[`POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}`],restorePackageVersionForAuthenticatedUser:[`POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore`],restorePackageVersionForOrg:[`POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore`],restorePackageVersionForUser:[`POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore`]},privateRegistries:{createOrgPrivateRegistry:[`POST /orgs/{org}/private-registries`],deleteOrgPrivateRegistry:[`DELETE /orgs/{org}/private-registries/{secret_name}`],getOrgPrivateRegistry:[`GET /orgs/{org}/private-registries/{secret_name}`],getOrgPublicKey:[`GET /orgs/{org}/private-registries/public-key`],listOrgPrivateRegistries:[`GET /orgs/{org}/private-registries`],updateOrgPrivateRegistry:[`PATCH /orgs/{org}/private-registries/{secret_name}`]},projects:{addItemForOrg:[`POST /orgs/{org}/projectsV2/{project_number}/items`],addItemForUser:[`POST /users/{username}/projectsV2/{project_number}/items`],deleteItemForOrg:[`DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}`],deleteItemForUser:[`DELETE /users/{username}/projectsV2/{project_number}/items/{item_id}`],getFieldForOrg:[`GET /orgs/{org}/projectsV2/{project_number}/fields/{field_id}`],getFieldForUser:[`GET /users/{username}/projectsV2/{project_number}/fields/{field_id}`],getForOrg:[`GET /orgs/{org}/projectsV2/{project_number}`],getForUser:[`GET /users/{username}/projectsV2/{project_number}`],getOrgItem:[`GET /orgs/{org}/projectsV2/{project_number}/items/{item_id}`],getUserItem:[`GET /users/{username}/projectsV2/{project_number}/items/{item_id}`],listFieldsForOrg:[`GET /orgs/{org}/projectsV2/{project_number}/fields`],listFieldsForUser:[`GET /users/{username}/projectsV2/{project_number}/fields`],listForOrg:[`GET /orgs/{org}/projectsV2`],listForUser:[`GET /users/{username}/projectsV2`],listItemsForOrg:[`GET /orgs/{org}/projectsV2/{project_number}/items`],listItemsForUser:[`GET /users/{username}/projectsV2/{project_number}/items`],updateItemForOrg:[`PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}`],updateItemForUser:[`PATCH /users/{username}/projectsV2/{project_number}/items/{item_id}`]},pulls:{checkIfMerged:[`GET /repos/{owner}/{repo}/pulls/{pull_number}/merge`],create:[`POST /repos/{owner}/{repo}/pulls`],createReplyForReviewComment:[`POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies`],createReview:[`POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews`],createReviewComment:[`POST /repos/{owner}/{repo}/pulls/{pull_number}/comments`],deletePendingReview:[`DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}`],deleteReviewComment:[`DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}`],dismissReview:[`PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals`],get:[`GET /repos/{owner}/{repo}/pulls/{pull_number}`],getReview:[`GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}`],getReviewComment:[`GET /repos/{owner}/{repo}/pulls/comments/{comment_id}`],list:[`GET /repos/{owner}/{repo}/pulls`],listCommentsForReview:[`GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments`],listCommits:[`GET /repos/{owner}/{repo}/pulls/{pull_number}/commits`],listFiles:[`GET /repos/{owner}/{repo}/pulls/{pull_number}/files`],listRequestedReviewers:[`GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers`],listReviewComments:[`GET /repos/{owner}/{repo}/pulls/{pull_number}/comments`],listReviewCommentsForRepo:[`GET /repos/{owner}/{repo}/pulls/comments`],listReviews:[`GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews`],merge:[`PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge`],removeRequestedReviewers:[`DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers`],requestReviewers:[`POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers`],submitReview:[`POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events`],update:[`PATCH /repos/{owner}/{repo}/pulls/{pull_number}`],updateBranch:[`PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch`],updateReview:[`PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}`],updateReviewComment:[`PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}`]},rateLimit:{get:[`GET /rate_limit`]},reactions:{createForCommitComment:[`POST /repos/{owner}/{repo}/comments/{comment_id}/reactions`],createForIssue:[`POST /repos/{owner}/{repo}/issues/{issue_number}/reactions`],createForIssueComment:[`POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions`],createForPullRequestReviewComment:[`POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions`],createForRelease:[`POST /repos/{owner}/{repo}/releases/{release_id}/reactions`],createForTeamDiscussionCommentInOrg:[`POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions`],createForTeamDiscussionInOrg:[`POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions`],deleteForCommitComment:[`DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}`],deleteForIssue:[`DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}`],deleteForIssueComment:[`DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}`],deleteForPullRequestComment:[`DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}`],deleteForRelease:[`DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}`],deleteForTeamDiscussion:[`DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}`],deleteForTeamDiscussionComment:[`DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}`],listForCommitComment:[`GET /repos/{owner}/{repo}/comments/{comment_id}/reactions`],listForIssue:[`GET /repos/{owner}/{repo}/issues/{issue_number}/reactions`],listForIssueComment:[`GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions`],listForPullRequestReviewComment:[`GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions`],listForRelease:[`GET /repos/{owner}/{repo}/releases/{release_id}/reactions`],listForTeamDiscussionCommentInOrg:[`GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions`],listForTeamDiscussionInOrg:[`GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions`]},repos:{acceptInvitation:[`PATCH /user/repository_invitations/{invitation_id}`,{},{renamed:[`repos`,`acceptInvitationForAuthenticatedUser`]}],acceptInvitationForAuthenticatedUser:[`PATCH /user/repository_invitations/{invitation_id}`],addAppAccessRestrictions:[`POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps`,{},{mapToData:`apps`}],addCollaborator:[`PUT /repos/{owner}/{repo}/collaborators/{username}`],addStatusCheckContexts:[`POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts`,{},{mapToData:`contexts`}],addTeamAccessRestrictions:[`POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams`,{},{mapToData:`teams`}],addUserAccessRestrictions:[`POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users`,{},{mapToData:`users`}],cancelPagesDeployment:[`POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel`],checkAutomatedSecurityFixes:[`GET /repos/{owner}/{repo}/automated-security-fixes`],checkCollaborator:[`GET /repos/{owner}/{repo}/collaborators/{username}`],checkImmutableReleases:[`GET /repos/{owner}/{repo}/immutable-releases`],checkPrivateVulnerabilityReporting:[`GET /repos/{owner}/{repo}/private-vulnerability-reporting`],checkVulnerabilityAlerts:[`GET /repos/{owner}/{repo}/vulnerability-alerts`],codeownersErrors:[`GET /repos/{owner}/{repo}/codeowners/errors`],compareCommits:[`GET /repos/{owner}/{repo}/compare/{base}...{head}`],compareCommitsWithBasehead:[`GET /repos/{owner}/{repo}/compare/{basehead}`],createAttestation:[`POST /repos/{owner}/{repo}/attestations`],createAutolink:[`POST /repos/{owner}/{repo}/autolinks`],createCommitComment:[`POST /repos/{owner}/{repo}/commits/{commit_sha}/comments`],createCommitSignatureProtection:[`POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures`],createCommitStatus:[`POST /repos/{owner}/{repo}/statuses/{sha}`],createDeployKey:[`POST /repos/{owner}/{repo}/keys`],createDeployment:[`POST /repos/{owner}/{repo}/deployments`],createDeploymentBranchPolicy:[`POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies`],createDeploymentProtectionRule:[`POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules`],createDeploymentStatus:[`POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses`],createDispatchEvent:[`POST /repos/{owner}/{repo}/dispatches`],createForAuthenticatedUser:[`POST /user/repos`],createFork:[`POST /repos/{owner}/{repo}/forks`],createInOrg:[`POST /orgs/{org}/repos`],createOrUpdateEnvironment:[`PUT /repos/{owner}/{repo}/environments/{environment_name}`],createOrUpdateFileContents:[`PUT /repos/{owner}/{repo}/contents/{path}`],createOrgRuleset:[`POST /orgs/{org}/rulesets`],createPagesDeployment:[`POST /repos/{owner}/{repo}/pages/deployments`],createPagesSite:[`POST /repos/{owner}/{repo}/pages`],createRelease:[`POST /repos/{owner}/{repo}/releases`],createRepoRuleset:[`POST /repos/{owner}/{repo}/rulesets`],createUsingTemplate:[`POST /repos/{template_owner}/{template_repo}/generate`],createWebhook:[`POST /repos/{owner}/{repo}/hooks`],customPropertiesForReposCreateOrUpdateRepositoryValues:[`PATCH /repos/{owner}/{repo}/properties/values`],customPropertiesForReposGetRepositoryValues:[`GET /repos/{owner}/{repo}/properties/values`],declineInvitation:[`DELETE /user/repository_invitations/{invitation_id}`,{},{renamed:[`repos`,`declineInvitationForAuthenticatedUser`]}],declineInvitationForAuthenticatedUser:[`DELETE /user/repository_invitations/{invitation_id}`],delete:[`DELETE /repos/{owner}/{repo}`],deleteAccessRestrictions:[`DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions`],deleteAdminBranchProtection:[`DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins`],deleteAnEnvironment:[`DELETE /repos/{owner}/{repo}/environments/{environment_name}`],deleteAutolink:[`DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}`],deleteBranchProtection:[`DELETE /repos/{owner}/{repo}/branches/{branch}/protection`],deleteCommitComment:[`DELETE /repos/{owner}/{repo}/comments/{comment_id}`],deleteCommitSignatureProtection:[`DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures`],deleteDeployKey:[`DELETE /repos/{owner}/{repo}/keys/{key_id}`],deleteDeployment:[`DELETE /repos/{owner}/{repo}/deployments/{deployment_id}`],deleteDeploymentBranchPolicy:[`DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}`],deleteFile:[`DELETE /repos/{owner}/{repo}/contents/{path}`],deleteInvitation:[`DELETE /repos/{owner}/{repo}/invitations/{invitation_id}`],deleteOrgRuleset:[`DELETE /orgs/{org}/rulesets/{ruleset_id}`],deletePagesSite:[`DELETE /repos/{owner}/{repo}/pages`],deletePullRequestReviewProtection:[`DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews`],deleteRelease:[`DELETE /repos/{owner}/{repo}/releases/{release_id}`],deleteReleaseAsset:[`DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}`],deleteRepoRuleset:[`DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}`],deleteWebhook:[`DELETE /repos/{owner}/{repo}/hooks/{hook_id}`],disableAutomatedSecurityFixes:[`DELETE /repos/{owner}/{repo}/automated-security-fixes`],disableDeploymentProtectionRule:[`DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}`],disableImmutableReleases:[`DELETE /repos/{owner}/{repo}/immutable-releases`],disablePrivateVulnerabilityReporting:[`DELETE /repos/{owner}/{repo}/private-vulnerability-reporting`],disableVulnerabilityAlerts:[`DELETE /repos/{owner}/{repo}/vulnerability-alerts`],downloadArchive:[`GET /repos/{owner}/{repo}/zipball/{ref}`,{},{renamed:[`repos`,`downloadZipballArchive`]}],downloadTarballArchive:[`GET /repos/{owner}/{repo}/tarball/{ref}`],downloadZipballArchive:[`GET /repos/{owner}/{repo}/zipball/{ref}`],enableAutomatedSecurityFixes:[`PUT /repos/{owner}/{repo}/automated-security-fixes`],enableImmutableReleases:[`PUT /repos/{owner}/{repo}/immutable-releases`],enablePrivateVulnerabilityReporting:[`PUT /repos/{owner}/{repo}/private-vulnerability-reporting`],enableVulnerabilityAlerts:[`PUT /repos/{owner}/{repo}/vulnerability-alerts`],generateReleaseNotes:[`POST /repos/{owner}/{repo}/releases/generate-notes`],get:[`GET /repos/{owner}/{repo}`],getAccessRestrictions:[`GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions`],getAdminBranchProtection:[`GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins`],getAllDeploymentProtectionRules:[`GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules`],getAllEnvironments:[`GET /repos/{owner}/{repo}/environments`],getAllStatusCheckContexts:[`GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts`],getAllTopics:[`GET /repos/{owner}/{repo}/topics`],getAppsWithAccessToProtectedBranch:[`GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps`],getAutolink:[`GET /repos/{owner}/{repo}/autolinks/{autolink_id}`],getBranch:[`GET /repos/{owner}/{repo}/branches/{branch}`],getBranchProtection:[`GET /repos/{owner}/{repo}/branches/{branch}/protection`],getBranchRules:[`GET /repos/{owner}/{repo}/rules/branches/{branch}`],getClones:[`GET /repos/{owner}/{repo}/traffic/clones`],getCodeFrequencyStats:[`GET /repos/{owner}/{repo}/stats/code_frequency`],getCollaboratorPermissionLevel:[`GET /repos/{owner}/{repo}/collaborators/{username}/permission`],getCombinedStatusForRef:[`GET /repos/{owner}/{repo}/commits/{ref}/status`],getCommit:[`GET /repos/{owner}/{repo}/commits/{ref}`],getCommitActivityStats:[`GET /repos/{owner}/{repo}/stats/commit_activity`],getCommitComment:[`GET /repos/{owner}/{repo}/comments/{comment_id}`],getCommitSignatureProtection:[`GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures`],getCommunityProfileMetrics:[`GET /repos/{owner}/{repo}/community/profile`],getContent:[`GET /repos/{owner}/{repo}/contents/{path}`],getContributorsStats:[`GET /repos/{owner}/{repo}/stats/contributors`],getCustomDeploymentProtectionRule:[`GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}`],getDeployKey:[`GET /repos/{owner}/{repo}/keys/{key_id}`],getDeployment:[`GET /repos/{owner}/{repo}/deployments/{deployment_id}`],getDeploymentBranchPolicy:[`GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}`],getDeploymentStatus:[`GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}`],getEnvironment:[`GET /repos/{owner}/{repo}/environments/{environment_name}`],getLatestPagesBuild:[`GET /repos/{owner}/{repo}/pages/builds/latest`],getLatestRelease:[`GET /repos/{owner}/{repo}/releases/latest`],getOrgRuleSuite:[`GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}`],getOrgRuleSuites:[`GET /orgs/{org}/rulesets/rule-suites`],getOrgRuleset:[`GET /orgs/{org}/rulesets/{ruleset_id}`],getOrgRulesets:[`GET /orgs/{org}/rulesets`],getPages:[`GET /repos/{owner}/{repo}/pages`],getPagesBuild:[`GET /repos/{owner}/{repo}/pages/builds/{build_id}`],getPagesDeployment:[`GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}`],getPagesHealthCheck:[`GET /repos/{owner}/{repo}/pages/health`],getParticipationStats:[`GET /repos/{owner}/{repo}/stats/participation`],getPullRequestReviewProtection:[`GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews`],getPunchCardStats:[`GET /repos/{owner}/{repo}/stats/punch_card`],getReadme:[`GET /repos/{owner}/{repo}/readme`],getReadmeInDirectory:[`GET /repos/{owner}/{repo}/readme/{dir}`],getRelease:[`GET /repos/{owner}/{repo}/releases/{release_id}`],getReleaseAsset:[`GET /repos/{owner}/{repo}/releases/assets/{asset_id}`],getReleaseByTag:[`GET /repos/{owner}/{repo}/releases/tags/{tag}`],getRepoRuleSuite:[`GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}`],getRepoRuleSuites:[`GET /repos/{owner}/{repo}/rulesets/rule-suites`],getRepoRuleset:[`GET /repos/{owner}/{repo}/rulesets/{ruleset_id}`],getRepoRulesetHistory:[`GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history`],getRepoRulesetVersion:[`GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history/{version_id}`],getRepoRulesets:[`GET /repos/{owner}/{repo}/rulesets`],getStatusChecksProtection:[`GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks`],getTeamsWithAccessToProtectedBranch:[`GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams`],getTopPaths:[`GET /repos/{owner}/{repo}/traffic/popular/paths`],getTopReferrers:[`GET /repos/{owner}/{repo}/traffic/popular/referrers`],getUsersWithAccessToProtectedBranch:[`GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users`],getViews:[`GET /repos/{owner}/{repo}/traffic/views`],getWebhook:[`GET /repos/{owner}/{repo}/hooks/{hook_id}`],getWebhookConfigForRepo:[`GET /repos/{owner}/{repo}/hooks/{hook_id}/config`],getWebhookDelivery:[`GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}`],listActivities:[`GET /repos/{owner}/{repo}/activity`],listAttestations:[`GET /repos/{owner}/{repo}/attestations/{subject_digest}`],listAutolinks:[`GET /repos/{owner}/{repo}/autolinks`],listBranches:[`GET /repos/{owner}/{repo}/branches`],listBranchesForHeadCommit:[`GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head`],listCollaborators:[`GET /repos/{owner}/{repo}/collaborators`],listCommentsForCommit:[`GET /repos/{owner}/{repo}/commits/{commit_sha}/comments`],listCommitCommentsForRepo:[`GET /repos/{owner}/{repo}/comments`],listCommitStatusesForRef:[`GET /repos/{owner}/{repo}/commits/{ref}/statuses`],listCommits:[`GET /repos/{owner}/{repo}/commits`],listContributors:[`GET /repos/{owner}/{repo}/contributors`],listCustomDeploymentRuleIntegrations:[`GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps`],listDeployKeys:[`GET /repos/{owner}/{repo}/keys`],listDeploymentBranchPolicies:[`GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies`],listDeploymentStatuses:[`GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses`],listDeployments:[`GET /repos/{owner}/{repo}/deployments`],listForAuthenticatedUser:[`GET /user/repos`],listForOrg:[`GET /orgs/{org}/repos`],listForUser:[`GET /users/{username}/repos`],listForks:[`GET /repos/{owner}/{repo}/forks`],listInvitations:[`GET /repos/{owner}/{repo}/invitations`],listInvitationsForAuthenticatedUser:[`GET /user/repository_invitations`],listLanguages:[`GET /repos/{owner}/{repo}/languages`],listPagesBuilds:[`GET /repos/{owner}/{repo}/pages/builds`],listPublic:[`GET /repositories`],listPullRequestsAssociatedWithCommit:[`GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls`],listReleaseAssets:[`GET /repos/{owner}/{repo}/releases/{release_id}/assets`],listReleases:[`GET /repos/{owner}/{repo}/releases`],listTags:[`GET /repos/{owner}/{repo}/tags`],listTeams:[`GET /repos/{owner}/{repo}/teams`],listWebhookDeliveries:[`GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries`],listWebhooks:[`GET /repos/{owner}/{repo}/hooks`],merge:[`POST /repos/{owner}/{repo}/merges`],mergeUpstream:[`POST /repos/{owner}/{repo}/merge-upstream`],pingWebhook:[`POST /repos/{owner}/{repo}/hooks/{hook_id}/pings`],redeliverWebhookDelivery:[`POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts`],removeAppAccessRestrictions:[`DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps`,{},{mapToData:`apps`}],removeCollaborator:[`DELETE /repos/{owner}/{repo}/collaborators/{username}`],removeStatusCheckContexts:[`DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts`,{},{mapToData:`contexts`}],removeStatusCheckProtection:[`DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks`],removeTeamAccessRestrictions:[`DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams`,{},{mapToData:`teams`}],removeUserAccessRestrictions:[`DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users`,{},{mapToData:`users`}],renameBranch:[`POST /repos/{owner}/{repo}/branches/{branch}/rename`],replaceAllTopics:[`PUT /repos/{owner}/{repo}/topics`],requestPagesBuild:[`POST /repos/{owner}/{repo}/pages/builds`],setAdminBranchProtection:[`POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins`],setAppAccessRestrictions:[`PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps`,{},{mapToData:`apps`}],setStatusCheckContexts:[`PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts`,{},{mapToData:`contexts`}],setTeamAccessRestrictions:[`PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams`,{},{mapToData:`teams`}],setUserAccessRestrictions:[`PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users`,{},{mapToData:`users`}],testPushWebhook:[`POST /repos/{owner}/{repo}/hooks/{hook_id}/tests`],transfer:[`POST /repos/{owner}/{repo}/transfer`],update:[`PATCH /repos/{owner}/{repo}`],updateBranchProtection:[`PUT /repos/{owner}/{repo}/branches/{branch}/protection`],updateCommitComment:[`PATCH /repos/{owner}/{repo}/comments/{comment_id}`],updateDeploymentBranchPolicy:[`PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}`],updateInformationAboutPagesSite:[`PUT /repos/{owner}/{repo}/pages`],updateInvitation:[`PATCH /repos/{owner}/{repo}/invitations/{invitation_id}`],updateOrgRuleset:[`PUT /orgs/{org}/rulesets/{ruleset_id}`],updatePullRequestReviewProtection:[`PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews`],updateRelease:[`PATCH /repos/{owner}/{repo}/releases/{release_id}`],updateReleaseAsset:[`PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}`],updateRepoRuleset:[`PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}`],updateStatusCheckPotection:[`PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks`,{},{renamed:[`repos`,`updateStatusCheckProtection`]}],updateStatusCheckProtection:[`PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks`],updateWebhook:[`PATCH /repos/{owner}/{repo}/hooks/{hook_id}`],updateWebhookConfigForRepo:[`PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config`],uploadReleaseAsset:[`POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}`,{baseUrl:`https://uploads.github.com`}]},search:{code:[`GET /search/code`],commits:[`GET /search/commits`],issuesAndPullRequests:[`GET /search/issues`],labels:[`GET /search/labels`],repos:[`GET /search/repositories`],topics:[`GET /search/topics`],users:[`GET /search/users`]},secretScanning:{createPushProtectionBypass:[`POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses`],getAlert:[`GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}`],getScanHistory:[`GET /repos/{owner}/{repo}/secret-scanning/scan-history`],listAlertsForOrg:[`GET /orgs/{org}/secret-scanning/alerts`],listAlertsForRepo:[`GET /repos/{owner}/{repo}/secret-scanning/alerts`],listLocationsForAlert:[`GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations`],listOrgPatternConfigs:[`GET /orgs/{org}/secret-scanning/pattern-configurations`],updateAlert:[`PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}`],updateOrgPatternConfigs:[`PATCH /orgs/{org}/secret-scanning/pattern-configurations`]},securityAdvisories:{createFork:[`POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks`],createPrivateVulnerabilityReport:[`POST /repos/{owner}/{repo}/security-advisories/reports`],createRepositoryAdvisory:[`POST /repos/{owner}/{repo}/security-advisories`],createRepositoryAdvisoryCveRequest:[`POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve`],getGlobalAdvisory:[`GET /advisories/{ghsa_id}`],getRepositoryAdvisory:[`GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}`],listGlobalAdvisories:[`GET /advisories`],listOrgRepositoryAdvisories:[`GET /orgs/{org}/security-advisories`],listRepositoryAdvisories:[`GET /repos/{owner}/{repo}/security-advisories`],updateRepositoryAdvisory:[`PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}`]},teams:{addOrUpdateMembershipForUserInOrg:[`PUT /orgs/{org}/teams/{team_slug}/memberships/{username}`],addOrUpdateRepoPermissionsInOrg:[`PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}`],checkPermissionsForRepoInOrg:[`GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}`],create:[`POST /orgs/{org}/teams`],createDiscussionCommentInOrg:[`POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments`],createDiscussionInOrg:[`POST /orgs/{org}/teams/{team_slug}/discussions`],deleteDiscussionCommentInOrg:[`DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}`],deleteDiscussionInOrg:[`DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}`],deleteInOrg:[`DELETE /orgs/{org}/teams/{team_slug}`],getByName:[`GET /orgs/{org}/teams/{team_slug}`],getDiscussionCommentInOrg:[`GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}`],getDiscussionInOrg:[`GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}`],getMembershipForUserInOrg:[`GET /orgs/{org}/teams/{team_slug}/memberships/{username}`],list:[`GET /orgs/{org}/teams`],listChildInOrg:[`GET /orgs/{org}/teams/{team_slug}/teams`],listDiscussionCommentsInOrg:[`GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments`],listDiscussionsInOrg:[`GET /orgs/{org}/teams/{team_slug}/discussions`],listForAuthenticatedUser:[`GET /user/teams`],listMembersInOrg:[`GET /orgs/{org}/teams/{team_slug}/members`],listPendingInvitationsInOrg:[`GET /orgs/{org}/teams/{team_slug}/invitations`],listReposInOrg:[`GET /orgs/{org}/teams/{team_slug}/repos`],removeMembershipForUserInOrg:[`DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}`],removeRepoInOrg:[`DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}`],updateDiscussionCommentInOrg:[`PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}`],updateDiscussionInOrg:[`PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}`],updateInOrg:[`PATCH /orgs/{org}/teams/{team_slug}`]},users:{addEmailForAuthenticated:[`POST /user/emails`,{},{renamed:[`users`,`addEmailForAuthenticatedUser`]}],addEmailForAuthenticatedUser:[`POST /user/emails`],addSocialAccountForAuthenticatedUser:[`POST /user/social_accounts`],block:[`PUT /user/blocks/{username}`],checkBlocked:[`GET /user/blocks/{username}`],checkFollowingForUser:[`GET /users/{username}/following/{target_user}`],checkPersonIsFollowedByAuthenticated:[`GET /user/following/{username}`],createGpgKeyForAuthenticated:[`POST /user/gpg_keys`,{},{renamed:[`users`,`createGpgKeyForAuthenticatedUser`]}],createGpgKeyForAuthenticatedUser:[`POST /user/gpg_keys`],createPublicSshKeyForAuthenticated:[`POST /user/keys`,{},{renamed:[`users`,`createPublicSshKeyForAuthenticatedUser`]}],createPublicSshKeyForAuthenticatedUser:[`POST /user/keys`],createSshSigningKeyForAuthenticatedUser:[`POST /user/ssh_signing_keys`],deleteAttestationsBulk:[`POST /users/{username}/attestations/delete-request`],deleteAttestationsById:[`DELETE /users/{username}/attestations/{attestation_id}`],deleteAttestationsBySubjectDigest:[`DELETE /users/{username}/attestations/digest/{subject_digest}`],deleteEmailForAuthenticated:[`DELETE /user/emails`,{},{renamed:[`users`,`deleteEmailForAuthenticatedUser`]}],deleteEmailForAuthenticatedUser:[`DELETE /user/emails`],deleteGpgKeyForAuthenticated:[`DELETE /user/gpg_keys/{gpg_key_id}`,{},{renamed:[`users`,`deleteGpgKeyForAuthenticatedUser`]}],deleteGpgKeyForAuthenticatedUser:[`DELETE /user/gpg_keys/{gpg_key_id}`],deletePublicSshKeyForAuthenticated:[`DELETE /user/keys/{key_id}`,{},{renamed:[`users`,`deletePublicSshKeyForAuthenticatedUser`]}],deletePublicSshKeyForAuthenticatedUser:[`DELETE /user/keys/{key_id}`],deleteSocialAccountForAuthenticatedUser:[`DELETE /user/social_accounts`],deleteSshSigningKeyForAuthenticatedUser:[`DELETE /user/ssh_signing_keys/{ssh_signing_key_id}`],follow:[`PUT /user/following/{username}`],getAuthenticated:[`GET /user`],getById:[`GET /user/{account_id}`],getByUsername:[`GET /users/{username}`],getContextForUser:[`GET /users/{username}/hovercard`],getGpgKeyForAuthenticated:[`GET /user/gpg_keys/{gpg_key_id}`,{},{renamed:[`users`,`getGpgKeyForAuthenticatedUser`]}],getGpgKeyForAuthenticatedUser:[`GET /user/gpg_keys/{gpg_key_id}`],getPublicSshKeyForAuthenticated:[`GET /user/keys/{key_id}`,{},{renamed:[`users`,`getPublicSshKeyForAuthenticatedUser`]}],getPublicSshKeyForAuthenticatedUser:[`GET /user/keys/{key_id}`],getSshSigningKeyForAuthenticatedUser:[`GET /user/ssh_signing_keys/{ssh_signing_key_id}`],list:[`GET /users`],listAttestations:[`GET /users/{username}/attestations/{subject_digest}`],listAttestationsBulk:[`POST /users/{username}/attestations/bulk-list{?per_page,before,after}`],listBlockedByAuthenticated:[`GET /user/blocks`,{},{renamed:[`users`,`listBlockedByAuthenticatedUser`]}],listBlockedByAuthenticatedUser:[`GET /user/blocks`],listEmailsForAuthenticated:[`GET /user/emails`,{},{renamed:[`users`,`listEmailsForAuthenticatedUser`]}],listEmailsForAuthenticatedUser:[`GET /user/emails`],listFollowedByAuthenticated:[`GET /user/following`,{},{renamed:[`users`,`listFollowedByAuthenticatedUser`]}],listFollowedByAuthenticatedUser:[`GET /user/following`],listFollowersForAuthenticatedUser:[`GET /user/followers`],listFollowersForUser:[`GET /users/{username}/followers`],listFollowingForUser:[`GET /users/{username}/following`],listGpgKeysForAuthenticated:[`GET /user/gpg_keys`,{},{renamed:[`users`,`listGpgKeysForAuthenticatedUser`]}],listGpgKeysForAuthenticatedUser:[`GET /user/gpg_keys`],listGpgKeysForUser:[`GET /users/{username}/gpg_keys`],listPublicEmailsForAuthenticated:[`GET /user/public_emails`,{},{renamed:[`users`,`listPublicEmailsForAuthenticatedUser`]}],listPublicEmailsForAuthenticatedUser:[`GET /user/public_emails`],listPublicKeysForUser:[`GET /users/{username}/keys`],listPublicSshKeysForAuthenticated:[`GET /user/keys`,{},{renamed:[`users`,`listPublicSshKeysForAuthenticatedUser`]}],listPublicSshKeysForAuthenticatedUser:[`GET /user/keys`],listSocialAccountsForAuthenticatedUser:[`GET /user/social_accounts`],listSocialAccountsForUser:[`GET /users/{username}/social_accounts`],listSshSigningKeysForAuthenticatedUser:[`GET /user/ssh_signing_keys`],listSshSigningKeysForUser:[`GET /users/{username}/ssh_signing_keys`],setPrimaryEmailVisibilityForAuthenticated:[`PATCH /user/email/visibility`,{},{renamed:[`users`,`setPrimaryEmailVisibilityForAuthenticatedUser`]}],setPrimaryEmailVisibilityForAuthenticatedUser:[`PATCH /user/email/visibility`],unblock:[`DELETE /user/blocks/{username}`],unfollow:[`DELETE /user/following/{username}`],updateAuthenticated:[`PATCH /user`]}};const V=new Map;for(let[e,t]of Object.entries(hr))for(let[n,r]of Object.entries(t)){let[t,i,a]=r,[o,s]=t.split(/ /),c=Object.assign({method:o,url:s},i);V.has(e)||V.set(e,new Map),V.get(e).set(n,{scope:e,methodName:n,endpointDefaults:c,decorations:a})}const gr={has({scope:e},t){return V.get(e).has(t)},getOwnPropertyDescriptor(e,t){return{value:this.get(e,t),configurable:!0,writable:!0,enumerable:!0}},defineProperty(e,t,n){return Object.defineProperty(e.cache,t,n),!0},deleteProperty(e,t){return delete e.cache[t],!0},ownKeys({scope:e}){return[...V.get(e).keys()]},set(e,t,n){return e.cache[t]=n},get({octokit:e,scope:t,cache:n},r){if(n[r])return n[r];let i=V.get(t).get(r);if(!i)return;let{endpointDefaults:a,decorations:o}=i;return o?n[r]=vr(e,t,r,a,o):n[r]=e.request.defaults(a),n[r]}};function _r(e){let t={};for(let n of V.keys())t[n]=new Proxy({octokit:e,scope:n,cache:{}},gr);return t}function vr(e,t,n,r,i){let a=e.request.defaults(r);function o(...r){let o=a.endpoint.merge(...r);if(i.mapToData)return o=Object.assign({},o,{data:o[i.mapToData],[i.mapToData]:void 0}),a(o);if(i.renamed){let[r,a]=i.renamed;e.log.warn(`octokit.${t}.${n}() has been renamed to octokit.${r}.${a}()`)}if(i.deprecated&&e.log.warn(i.deprecated),i.renamedParameters){let o=a.endpoint.merge(...r);for(let[r,a]of Object.entries(i.renamedParameters))r in o&&(e.log.warn(`"${r}" parameter is deprecated for "octokit.${t}.${n}()". Use "${a}" instead`),a in o||(o[a]=o[r]),delete o[r]);return a(o)}return a(...r)}return Object.assign(o,a)}function yr(e){return{rest:_r(e)}}yr.VERSION=mr;function br(e){let t=_r(e);return{...t,rest:t}}br.VERSION=mr;const xr=or.plugin(sr,br,pr).defaults({userAgent:`octokit-rest.js/22.0.1`});async function Sr(e,t,n){let{host:r,json:i}=e;Ht(r);let a=await(n??(()=>Dn({message:`Enter PAT:`})))();a||(process.stderr.write(`No token provided
16
+ `),process.exit(1));let o=r===`github.com`?void 0:`https://${r}/api/v3`,s=new xr({auth:a,...o?{baseUrl:o}:{}}),c=`unknown`,l,u;try{let{data:e}=await s.users.getAuthenticated();c=e.login,l=e.name??void 0,u=e.email??void 0}catch{process.stderr.write(`Token validation failed
17
+ `),process.exit(1)}await t.set(r,c,a,{gitProtocol:`https`,name:l,email:u}),i?process.stdout.write(`${JSON.stringify({type:`complete`,host:r,login:c})}\n`):process.stderr.write(`✓ PAT stored for ${c} on ${r}\n`)}function Cr(e){return new t(`pat`).description(`Store a Personal Access Token`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await Sr(t,await e())})}async function wr(e,t){let{host:n,json:r}=e;Ht(n);let i=await t.get(n);i??(process.stderr.write(`Not logged in to ${n}\n`),process.exit(1));let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=new xr({auth:i.token,...a?{baseUrl:a}:{}}),s=[];for await(let e of o.paginate.iterator(o.repos.listForAuthenticatedUser,{per_page:100,sort:`updated`}))for(let t of e.data)s.push({full_name:t.full_name,clone_url:t.clone_url,private:t.private});if(r)process.stdout.write(`${JSON.stringify({type:`repos`,host:n,repos:s})}\n`);else for(let e of s)process.stdout.write(`${e.full_name} ${e.clone_url}\n`)}function Tr(e){return new t(`repos`).description(`List accessible repositories`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await wr(t,await e())})}async function Er(e,t){let{host:n}=e;await t.clear(n),process.stderr.write(`✓ Signed out from ${n}\n`)}function Dr(e){return new t(`signout`).description(`Remove stored credentials`).option(`--host <host>`,`GitHub hostname`,`github.com`).action(async t=>{await Er(t,await e())})}async function Or(e,t){let{host:n,json:r}=e;Ht(n);let i=await t.get(n);i??(r?process.stdout.write(`${JSON.stringify({type:`status`,host:n,authenticated:!1})}\n`):process.stderr.write(`Not logged in to ${n}\n`),process.exit(1));let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=new xr({auth:i.token,...a?{baseUrl:a}:{}});try{let{data:e}=await o.users.getAuthenticated();r?process.stdout.write(`${JSON.stringify({type:`status`,host:n,authenticated:!0,login:e.login,name:e.name,email:e.email})}\n`):process.stderr.write(`✓ Logged in as ${e.login} on ${n}\n`)}catch{r?process.stdout.write(JSON.stringify({type:`status`,host:n,authenticated:!1,error:`token invalid`})+`
18
+ `):process.stderr.write(`✗ Token invalid for ${n}\n`),process.exit(1)}}function kr(e){return new t(`status`).description(`Show authentication status`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await Or(t,await e())})}function Ar(){let e=new t(`auth`);e.description(`GitHub authentication management`);let n=()=>vt();return e.addCommand(Gt(n)),e.addCommand(kr(n)),e.addCommand(Tr(n)),e.addCommand(Dr(n)),e.addCommand(Cr(n)),e.addCommand(St(n)),e}function H(e,t,n={}){let r=ue(e,t);if(!F(r))return{status:`missing`,lockPath:r};let i;try{i=JSON.parse(I(r,`utf-8`))}catch{return{status:`corrupt`,lockPath:r}}if(!i||typeof i!=`object`||!ce(i.pid))return{status:`corrupt`,lockPath:r};let a=i,o=n.host??nt();return a.hostname===o?(n.isAlive??de)(a.pid)?{status:`alive`,lockPath:r,lock:a}:{status:`dead-pid`,lockPath:r,lock:a}:{status:`foreign-host`,lockPath:r,lock:a}}function jr(e,t){let n=[];for(let[r,i]of[[`server`,e],[`ui`,t]])(i.status===`dead-pid`||i.status===`corrupt`)&&n.push({name:r,lockPath:i.lockPath,reason:i.status});return{prune:n}}function Mr(e){let t=e.inspect??(t=>H(e.lockDir,t)),n=e.unlink??(e=>Qe(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=jr(t(`server`),t(`ui`));if(a.prune.length===0)return r(`No stale locks.`),{pruned:[],failed:[]};let o=[],s=[];for(let e of a.prune)try{n(e.lockPath),o.push(e)}catch(t){s.push({target:e,error:t instanceof Error?t.message:String(t)})}if(o.length>0){let e=o.map(e=>`${e.name} (${e.reason})`).join(`, `);r(`Pruned ${o.length} stale lock${o.length===1?``:`s`}: ${e}`)}return s.length>0&&i(`Failed to prune: ${s.map(({target:e,error:t})=>`${e.name} (${e.lockPath}): ${t}`).join(`; `)}`),{pruned:o,failed:s}}function Nr(e){return new t(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{Mr({lockDir:D(O(e(),process.cwd()))}).failed.length>0&&(process.exitCode=1)})}function Pr(){try{let e=Be(`gh`,[`auth`,`token`],{encoding:`utf-8`,stdio:[`ignore`,`pipe`,`pipe`],timeout:5e3}).trim();return e.length===0?{available:!1}:{available:!0,token:e}}catch{return{available:!1}}}async function Fr(e,t,n={},r=Pr){if(!n.skipGhDetect&&r().available)return{tier:`A`,credentialArgs:[`-c`,`credential.helper=!gh auth git-credential`]};let i=await t.get(e);return i==null?{tier:`none`,credentialArgs:[]}:{tier:i.gitProtocol===`ssh`?`C`:`B`,credentialArgs:[`-c`,`credential.helper=!open-knowledge auth git-credential`]}}function Ir(e){return e.replace(/:\d+$/,``)}function Lr(e){let t=e.trim();if(!t)return null;{let e=/^https?:\/\/([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`https`,hostname:Ir(e[1]),owner:e[2],name:e[3]}}{let e=/^ssh:\/\/(?:[\w.-]+@)?([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`ssh`,hostname:Ir(e[1]),owner:e[2],name:e[3]}}{let e=/^git:\/\/([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`git`,hostname:Ir(e[1]),owner:e[2],name:e[3]}}{let e=/^(?:[\w.-]+@)?([\w.-]+):([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?$/.exec(t);if(e?.[1].includes(`.`)||e&&t.startsWith(`git@`))return{protocol:`ssh`,hostname:e[1],owner:e[2],name:e[3]}}{let e=/^git:([\w.-]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`git`,hostname:e[1],owner:e[2],name:e[3]}}if(!t.includes(`://`)&&!t.includes(`@`)&&!t.startsWith(`/`)){let e=/^([\w.-]+)\/([\w.\-~%]+?)(?:\.git)?$/.exec(t);if(e)return{protocol:`https`,hostname:`github.com`,owner:e[1],name:e[2]}}return null}const Rr=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function zr(e){let t=/^([\w ]+):\s+(\d+)%/.exec(e.trim());if(!t)return null;let n=t[1].toLowerCase(),r=Number(t[2]);for(let[e,i,a]of Rr)if(n.includes(e))return{stage:t[1],pct:Math.round(i+r/100*(a-i))};return null}function U(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Br(e,t,n,r=process.cwd()){let i=Lr(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=t.dir?P(r,t.dir):P(r,i.name);if(F(a)&&Xe(a).length>0)throw Error(`Target directory is not empty: ${a}`);let o=await vt(),s=await Fr(i.hostname,o,{}),c=fe({baseDir:r,config:s.credentialArgs.length>=2?[s.credentialArgs[1]]:[],unsafe:{allowUnsafeCredentialHelper:!0}}).env({GIT_TERMINAL_PROMPT:`0`}),l=-1;c.outputHandler((e,n,r)=>{r.on(`data`,e=>{let n=e.toString(`utf-8`);for(let e of n.split(`
19
+ `)){let n=zr(e);n&&n.pct!==l&&(l=n.pct,U(t.json,{type:`progress`,pct:n.pct,stage:n.stage}),t.json||process.stderr.write(`\r Cloning… ${n.pct}%`))}})}),await c.clone(e,a,[`--progress`]),t.json||process.stderr.write(`
20
+ `);try{let{runInit:e}=await import(`./init-DiH9oQ6_.mjs`),n=await e({cwd:a,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?U(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?U(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{Vr(a)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?U(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return a}function Vr(e){let t=N(e,`.git`,`info`,`exclude`);if(!F(t))return`no-exclude`;let n=I(t,`utf-8`),r=new Set([`.ok`,`.ok/`,`/.ok`,`/.ok/`]);return n.split(`
21
+ `).map(e=>e.trim()).some(e=>r.has(e))?`already-present`:($e(t,`${n}${n.length===0||n.endsWith(`
22
+ `)?``:`
23
+ `}.ok/\n`,`utf-8`),`appended`)}function Hr(e){return new t(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).action(async(t,n,r)=>{let i=e();try{let a=await Br(t,{json:r.json,dir:n},i);if(r.json)U(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-BXk7J0Kh.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){let t=e instanceof Error?e.message:String(e);r.json?U(!0,{type:`error`,message:t}):process.stderr.write(`✗ ${t}\n`),process.exitCode=1}})}const Ur=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],[`content`,`include`],[`content`,`exclude`]];function Wr(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??ke;try{let{sources:n}=r(e.cwd);return t(`✓ Configuration valid (sources: ${n.length===0?`defaults only`:n.join(`, `)})`),{ok:!0}}catch(e){return n(e instanceof Error?e.message:String(e)),{ok:!1}}}function Gr(e){let t=(0,mt.parseDocument)(I(e,`utf-8`));if(t.errors.length>0)throw Error(`Could not parse ${e}: ${t.errors.map(e=>e.message).join(`; `)}`);let n=[];for(let e of Ur)t.hasIn(e)&&n.push(e.join(`.`));return n}function Kr(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function qr(e){let t={};for(let n of e){let e=t;for(let t=0;t<n.length-1;t++){let r=n[t],i=e[r],a=Kr(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function Jr(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`both`,i=e.dryRun??!1,a=e.cwd??process.cwd(),o=e.writeConfigPatchFn??we,s=[];(r===`project`||r===`both`)&&s.push({scope:`project`,absPath:Ee(`project`,a,e.homedirOverride)}),(r===`user`||r===`both`)&&s.push({scope:`user`,absPath:Ee(`user`,a,e.homedirOverride)});let c=[],l=!0;for(let{scope:t,absPath:n}of s){if(!F(n)){c.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=Gr(n)}catch(e){let r=e instanceof Error?e.message:String(e);c.push({path:n,scope:t,found:[],removed:[],error:r}),l=!1;continue}if(r.length===0||i){c.push({path:n,scope:t,found:r,removed:[]});continue}let s=await o({cwd:a,scope:t,patch:qr(Ur.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){c.push({path:n,scope:t,found:r,removed:[],error:m(s.error)}),l=!1;continue}c.push({path:n,scope:t,found:r,removed:r})}for(let e of c)e.error&&n(`✗ ${e.path}: ${e.error}`);let u=c.some(e=>e.error!==void 0),d=c.reduce((e,t)=>e+t.found.length,0);if(d===0&&!u)t(`No deprecated fields found.`);else if(d>0)for(let e of c)e.error||(e.found.length===0?t(` ${e.path}: no deprecated fields`):t(i?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:c,ok:l}}function Yr(){let e=new t(`config`).description(`Inspect and maintain Open Knowledge configuration files`);return e.command(`validate`).description(`Validate the merged config (defaults → user → project)`).action(()=>{Wr({}).ok||(process.exitCode=1)}),e.command(`migrate`).description(`Remove deprecated config fields (sync.*, persistence.{debounceMs,maxDebounceMs}, server.port, content.{include,exclude}) idempotently`).option(`--scope <scope>`,`Which scope to migrate: project | user | both`,`both`).option(`--dry-run`,`Preview without writing`,!1).action(async e=>{let t=e.scope;if(t!==`project`&&t!==`user`&&t!==`both`){console.error(`Invalid --scope: ${t}. Expected: project | user | both`),process.exitCode=2;return}(await Jr({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var W=e(Ie(),1);const G=2e3,Xr=[/cli\.mjs/,/(^|[\s/])(open-knowledge|ok)\s+(start|mcp|ui)(\s|$)/,/(^|[\s/])bun([\s/]).*?(run dev|packages\/app|vite|hocuspocus)/,/(^|[\s/])node([\s/]).*?(packages\/(cli|app)|vite|hocuspocus)/];function Zr(e){return Xr.some(t=>t.test(e))}async function Qr(){let e=M(`pgrep`,[`-a`,`-f`,`cli\\.mjs|open-knowledge|(^|[ /])ok[ ]+(start|mcp|ui)([ ]|$)|packages/(cli|app)|hocuspocus|vite`],{encoding:`utf-8`,timeout:G});if(!(e.error!=null&&e.error.code===`ENOENT`)){let t=e.stdout??``,n=$r(t);if(n.length>0||t.trim()===``)return n}let t=M(`ps`,[`-axo`,`pid,command`],{encoding:`utf-8`,timeout:G});return t.error!=null||!t.stdout?[]:ei(t.stdout)}function $r(e){let t=[];for(let n of e.split(`
24
+ `)){let e=n.trim();if(!e)continue;let r=e.indexOf(` `);if(r===-1)continue;let i=e.slice(0,r),a=e.slice(r+1),o=Number.parseInt(i,10);!Number.isNaN(o)&&Zr(a)&&t.push(o)}return t}function ei(e){let t=[],n=e.split(`
25
+ `);for(let e=1;e<n.length;e++){let r=n[e]?.trim();if(!r)continue;let i=r.indexOf(` `);if(i===-1)continue;let a=r.slice(0,i),o=r.slice(i+1).trim(),s=Number.parseInt(a,10);!Number.isNaN(s)&&Zr(o)&&t.push(s)}return t}function ti(e){let t=e.trim().split(/\s+/).filter(Boolean);for(let e of t){if(e.startsWith(`@`))continue;let t=Ue(e);if(t===`open-knowledge`||t===`ok`||e.endsWith(`/packages/cli/src/cli.ts`)||e.endsWith(`/packages/cli/dist/cli.mjs`)||t===`cli.mjs`||t===`cli.ts`)return e}return null}function ni(e){let t=M(`ps`,[`-p`,String(e),`-o`,`command=`],{encoding:`utf-8`,timeout:G});return t.error!=null||!t.stdout?null:t.stdout.trim()||null}function ri(e){let t=M(`ps`,[`-p`,String(e),`-o`,`%cpu=,%mem=`],{encoding:`utf-8`,timeout:G});if(t.error!=null||!t.stdout)return null;let[n,r]=t.stdout.trim().split(/\s+/),i=Number.parseFloat(n??``),a=Number.parseFloat(r??``);return Number.isNaN(i)||Number.isNaN(a)?null:{cpuPercent:i,memPercent:a}}async function ii(e){let t=M(`lsof`,[`-p`,String(e),`-a`,`-d`,`cwd`,`-Fn`],{encoding:`utf-8`,timeout:G});if(t.error!=null)return null;let n=t.stdout??``;for(let e of n.split(`
26
+ `))if(e.startsWith(`n`)&&e.length>1)return e.slice(1);return null}function ai(e){let t=[],n=e.split(`
27
+ `);for(let e=1;e<n.length;e++){let r=n[e]?.trim();if(!r)continue;let i=r.split(/\s+/);if(i.length<2)continue;let a=Number.parseInt(i[1]??``,10);Number.isNaN(a)||t.push(a)}return[...new Set(t)]}async function oi(){let e=new Set,t=t=>{for(let n of[N(t,`.ok`,`local`),N(t,`.ok`),N(t,`.open-knowledge`),N(t,`.openknowledge`)])F(n)&&(F(N(n,`server.lock`))||F(N(n,`ui.lock`)))&&e.add(n)},n=await Qr(),r=n.map(e=>ii(e)),i=await Promise.all(r);for(let e of i)e!=null&&t(e);let a=M(`lsof`,[`-iTCP`,`-sTCP:LISTEN`,`-nP`],{encoding:`utf-8`,timeout:G});if(a.error==null&&a.stdout){let e=ai(a.stdout),r=new Set(n),i=e.filter(e=>!r.has(e)).map(e=>ii(e)),o=await Promise.all(i);for(let e of o)e!=null&&t(e)}let o=new Map;for(let t of e)try{let e=await lt(t);o.set(e,e)}catch{o.set(t,t)}return[...o.values()]}function si(e){let t=M(`ps`,[`-p`,String(e),`-o`,`%cpu=,%mem=,rss=,vsz=`],{encoding:`utf-8`,timeout:2e3});if(t.error||!t.stdout?.trim())return null;let[n,r,i,a]=t.stdout.trim().split(/\s+/),o=Number.parseFloat(n??``),s=Number.parseFloat(r??``),c=Number.parseInt(i??``,10),l=Number.parseInt(a??``,10);return Number.isNaN(o)||Number.isNaN(s)||Number.isNaN(c)||Number.isNaN(l)?null:{ts:new Date().toISOString(),pid:e,cpuPercent:o,memPercent:s,rssKb:c,vszKb:l}}function ci(e){let t=M(`lsof`,[`-p`,String(e)],{encoding:`utf-8`,timeout:5e3});return t.error||!t.stdout?null:t.stdout}function li(e){let t=[];for(let n of e.split(`
28
+ `)){let e=n.match(/127\.0\.0\.1:(\d+)\s*\(LISTEN\)/);if(e){let n=Number.parseInt(e[1]??``,10);Number.isNaN(n)||t.push(n)}}return t}function ui(e){let t=M(`curl`,[`-s`,`--max-time`,`2`,`http://127.0.0.1:${e}/json/list`],{encoding:`utf-8`,timeout:3e3});if(t.error||!t.stdout?.trim())return null;try{let e=JSON.parse(t.stdout);return Array.isArray(e)?e:null}catch{return null}}function di(e,t,n){let r=N(Je(N(rt(),`ok-cdp-`)),`profiler.mjs`);return $e(r,`import { writeFileSync } from 'node:fs';
29
+ const ws = new WebSocket(${JSON.stringify(e)});
30
+ let id = 0;
31
+ const send = (m) => ws.send(JSON.stringify({ id: ++id, method: m }));
32
+ ws.addEventListener('open', () => {
33
+ send('Profiler.enable');
34
+ send('Profiler.start');
35
+ setTimeout(() => send('Profiler.stop'), ${t});
36
+ });
37
+ ws.addEventListener('message', ({ data }) => {
38
+ const msg = JSON.parse(data);
39
+ if (msg.result?.profile) {
40
+ writeFileSync(${JSON.stringify(n)}, JSON.stringify(msg.result.profile));
41
+ ws.close();
42
+ }
43
+ });
44
+ ws.addEventListener('close', () => process.exit(0));
45
+ ws.addEventListener('error', () => process.exit(1));
46
+ setTimeout(() => process.exit(2), ${t+1e4});
47
+ `),r}async function fi(e,t,n,r,i){let a=di(e,t,N(r,`cpu.cpuprofile`)),o=!1,s=Ve(process.execPath,[a],{stdio:`ignore`}),c=setInterval(()=>{let e=si(n);e&&i(e)},1e3);await new Promise(e=>{s.once(`close`,t=>{o=t===0,e()}),setTimeout(()=>{s.kill(),e()},t+12e3)}),clearInterval(c);try{Ze(N(a,`..`),{recursive:!0,force:!0})}catch{}return o}function pi(e){let t;try{t=JSON.parse(e)}catch{return`(could not parse profile)`}let n=new Map(t.nodes.map(e=>[e.id,e])),r=new Map;for(let e of t.nodes)for(let t of e.children??[])r.set(t,e.id);let i=new Map;for(let e of t.samples??[])i.set(e,(i.get(e)??0)+1);let a=t.samples?.length??0,o=t.endTime!=null&&t.startTime!=null?((t.endTime-t.startTime)/1e3).toFixed(2):`?`,s=[...i.entries()].sort((e,t)=>t[1]-e[1]).slice(0,10),c=[`samples ${a} duration_ms ${o}`,``,`Top leaf nodes`];for(let[e,t]of s){let r=n.get(e);if(!r)continue;let i=a>0?(t/a*100).toFixed(1):`0.0`,{functionName:o,url:s,lineNumber:l,columnNumber:u}=r.callFrame;c.push(` ${t} ${i}% id=${e} ${o||`(anonymous)`} ${s}:${l}:${u} hit=${r.hitCount??0}`)}c.push(``,`Top stacks`);let l=e=>{let t=[],i=e;for(;i!=null;){let e=n.get(i);if(!e)break;let{functionName:a,url:o,lineNumber:s,columnNumber:c}=e.callFrame;t.unshift(` ${a||`(anonymous)`} ${o} ${s} ${c}`),i=r.get(i)}return t};for(let[e,t]of s.slice(0,5)){let n=a>0?(t/a*100).toFixed(1):`0.0`;c.push(``,`--- ${t} ${n}%`,...l(e))}return c.join(`
48
+ `)}async function mi(e,t={}){let{pid:n,cpuProfileSecs:r=15,noInspector:i=!1}=e,a=t.log??(e=>console.log(e)),o=t.discover??oi,s=t.inspect??H,c=t.resolveCommand??ni,l=t.resolveUsage??ri,u=t.collectLsofFn??ci,d=t.getEndpoints??ui,f=t.profiler??fi,p=t.isAlive??(e=>{try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}),m=t.sendSignal??((e,t)=>{process.kill(e,t)}),h=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),g=r*1e3;if(!p(n)){a(W.default.red(`No process with pid ${n} found.`));return}let _=await o(),ee=null,v=null;for(let e of _){let t=s(e,`server`);if(t.status!==`missing`&&t.status!==`corrupt`&&t.lock.pid===n){ee=t.lock.worktreeRoot,v={lockDir:e,state:t.status,lockPath:t.lockPath,lock:t.lock};break}}let te=new Date().toISOString().replace(/[:.]/g,`-`),y=e.output?e.output:ee?N(ee,`.ok`,`local`,`diagnostics`,`process-${n}-${te}`):N(process.cwd(),`ok-diagnose-${n}-${te}`);try{qe(y,{recursive:!0})}catch(e){a(W.default.red(`Cannot create output directory ${y}: ${e.message}`));return}a(W.default.bold(`Diagnosing pid ${n}`)),a(`Output: ${y}`),a(``);let b=(e,t)=>{$e(N(y,e),t),a(` wrote ${e}`)},ne=c(n),x=l(n);b(`metadata.json`,JSON.stringify({capturedAt:new Date().toISOString(),pid:n,command:ne,usage:x,lockInfo:v},null,2)),a(` sampling lsof...`);let S=u(n);if(S&&b(`lsof.txt`,S),!i){let e=S?li(S).find(e=>e>=9229&&e<=9299)??9229:9229,t=d(e);if(!t||t.length===0){a(` no inspector on :${e}, sending SIGUSR1 to pid ${n}...`);try{m(n,`SIGUSR1`),await h(2e3),t=d(e)}catch(e){a(W.default.yellow(` SIGUSR1 delivery failed: ${e.message}`))}}if(t&&t.length>0){b(`inspector-endpoints.json`,JSON.stringify(t,null,2));let e=t[0].webSocketDebuggerUrl;if(e){a(` capturing ${r}s CPU profile...`);let t=[];await f(e,g,n,y,e=>t.push(e))?a(` wrote cpu.cpuprofile`):a(W.default.yellow(` CPU profile capture failed`)),t.length>0&&b(`process-stats.jsonl`,`${t.map(e=>JSON.stringify(e)).join(`
49
+ `)}\n`);try{b(`stacks.txt`,pi(I(N(y,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(W.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(W.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(W.default.yellow(`⚠ Before sharing, review what each file contains:`)),a(` metadata.json — content directory paths, lock file locations, CPU/MEM at capture time`),a(` lsof.txt — all open files, network connections, and private paths for this process`),a(` inspector-endpoints.json — Node debugger metadata (titles, URLs)`),a(` cpu.cpuprofile — function names and source file paths from your Node process`),a(` stacks.txt — call stacks derived from cpu.cpuprofile; includes source paths`),a(` process-stats.jsonl — CPU/MEM/RSS numbers only; safe to share`),a(``),a(`Bundle: ${W.default.bold(y)}`)}function hi(){let e=new t(`diagnose`).description(`Diagnostic utilities for open-knowledge processes`);return e.command(`process`).description(`Capture a diagnostic bundle (metadata, lsof, CPU profile) for a running process`).argument(`<pid>`,`Process ID to diagnose`).option(`--cpu-profile <seconds>`,`CPU profile duration (default: 15)`,`15`).option(`--output <dir>`,`Output directory`).option(`--no-inspector`,`Collect metadata only; skip Node inspector and CPU profile`).action(async(e,t)=>{let n=Number.parseInt(e,10);(Number.isNaN(n)||n<=0)&&(console.error(W.default.red(`Invalid pid: ${e}`)),process.exit(1));let r=Number.parseInt(t.cpuProfile,10);(Number.isNaN(r)||r<=0)&&(console.error(W.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await mi({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e}const gi=[` 1. ${j(`Customize`)} (sidebar) → ${j(`Skills`)}`,` 2. Click the ${j(`+`)} button`,` 3. Click ${j(`Create skill`)}`,` 4. Click ${j(`Upload skill`)}`,` 5. Pick ${j(`openknowledge.skill`)} from Downloads`],_i=Le(` Open the Claude Desktop App, then: ${j(`Customize → Skills → + → Create skill → Upload skill`)} → pick the file.`);function vi(e){let t=[A(`Built ${e.outputPath}`),k(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…`)];return e.handoffError&&t.push(ze(` Handoff failed: ${e.handoffError.message}`)),t.push(_i),t.join(`
50
+ `)}function yi(e){let t=e.skillVersion??`unknown`,n=e.recordedAt??`unknown`;return[Le(`Open Knowledge skill ${j(`v${t}`)} already delivered to Claude Desktop.`),k(` Recorded at ${n} in ~/.ok/skill-state.yml`),k(` Use ${j(`--force`)} to rebuild and re-open the install dialog.`)].join(`
51
+ `)}function bi(e){let t=e.skillVersion?` • Skill v${e.skillVersion}`:``;return[A(`Built ${e.outputPath}`),k(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…${t}`),Le(` Claude Desktop App opened. Now upload the file manually:`),...gi,k(` If Claude Desktop didn't open, open it and start at step 1. The file is at ${e.outputPath}`)].join(`
52
+ `)}function xi(e){return`${Re(`Error:`)} ${e.buildError??`unknown build failure`}`}async function Si(e={}){let t=await xe(e);return t.status===`failed`?{...t,message:xi(t),exitCode:1}:t.status===`skip-current`?{...t,message:yi(t),exitCode:0}:t.status===`installed`?{...t,message:bi(t),exitCode:0}:{...t,message:vi(t),exitCode:0}}function Ci(){return new t(`install-skill`).description("Build openknowledge.skill and open the Claude Desktop App so you can upload it for Claude Chat & Cowork. Not needed for Claude Code — `ok init` covers that separately.").option(`--out <path>`,`Custom output path (default: ~/Downloads/openknowledge.skill)`).option(`--no-open`,`Build the file but skip the OS file-association handoff`).option(`--force`,`Bypass the install-state gate and rebuild unconditionally`).action(async e=>{let t=await Si({out:e.out,noOpen:!e.open,force:e.force??!1});process.stdout.write(`${t.message}\n`),t.exitCode!==0&&process.exit(t.exitCode)})}function wi(e){return e?e instanceof Headers?Object.fromEntries(e.entries()):Array.isArray(e)?Object.fromEntries(e):{...e}:{}}function Ti(e=fetch,t){return t?async(n,r)=>e(n,{...t,...r,headers:r?.headers?{...wi(t.headers),...wi(r.headers)}:t.headers}):e}let Ei;Ei=globalThis.crypto?.webcrypto??globalThis.crypto??import(`node:crypto`).then(e=>e.webcrypto);async function Di(e){return(await Ei).getRandomValues(new Uint8Array(e))}async function Oi(e){let t=``;for(;t.length<e;){let n=await Di(e-t.length);for(let e of n)e<198&&(t+=`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~`[e%66])}return t}async function ki(e){return await Oi(e)}async function Ai(e){let t=await(await Ei).subtle.digest(`SHA-256`,new TextEncoder().encode(e));return btoa(String.fromCharCode(...new Uint8Array(t))).replace(/\//g,`_`).replace(/\+/g,`-`).replace(/=/g,``)}async function ji(e){if(e||=43,e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await ki(e);return{code_verifier:t,code_challenge:await Ai(t)}}const K=a().superRefine((e,t)=>{if(!URL.canParse(e))return t.addIssue({code:Lt.custom,message:`URL must be parseable`,fatal:!0}),v}).refine(e=>{let t=new URL(e);return t.protocol!==`javascript:`&&t.protocol!==`data:`&&t.protocol!==`vbscript:`},{message:`URL cannot use javascript:, data:, or vbscript: scheme`}),Mi=s({resource:o().url(),authorization_servers:n(K).optional(),jwks_uri:o().url().optional(),scopes_supported:n(o()).optional(),bearer_methods_supported:n(o()).optional(),resource_signing_alg_values_supported:n(o()).optional(),resource_name:o().optional(),resource_documentation:o().optional(),resource_policy_uri:o().url().optional(),resource_tos_uri:o().url().optional(),tls_client_certificate_bound_access_tokens:g().optional(),authorization_details_types_supported:n(o()).optional(),dpop_signing_alg_values_supported:n(o()).optional(),dpop_bound_access_tokens_required:g().optional()}),Ni=s({issuer:o(),authorization_endpoint:K,token_endpoint:K,registration_endpoint:K.optional(),scopes_supported:n(o()).optional(),response_types_supported:n(o()),response_modes_supported:n(o()).optional(),grant_types_supported:n(o()).optional(),token_endpoint_auth_methods_supported:n(o()).optional(),token_endpoint_auth_signing_alg_values_supported:n(o()).optional(),service_documentation:K.optional(),revocation_endpoint:K.optional(),revocation_endpoint_auth_methods_supported:n(o()).optional(),revocation_endpoint_auth_signing_alg_values_supported:n(o()).optional(),introspection_endpoint:o().optional(),introspection_endpoint_auth_methods_supported:n(o()).optional(),introspection_endpoint_auth_signing_alg_values_supported:n(o()).optional(),code_challenge_methods_supported:n(o()).optional(),client_id_metadata_document_supported:g().optional()}),Pi=u({...s({issuer:o(),authorization_endpoint:K,token_endpoint:K,userinfo_endpoint:K.optional(),jwks_uri:K,registration_endpoint:K.optional(),scopes_supported:n(o()).optional(),response_types_supported:n(o()),response_modes_supported:n(o()).optional(),grant_types_supported:n(o()).optional(),acr_values_supported:n(o()).optional(),subject_types_supported:n(o()),id_token_signing_alg_values_supported:n(o()),id_token_encryption_alg_values_supported:n(o()).optional(),id_token_encryption_enc_values_supported:n(o()).optional(),userinfo_signing_alg_values_supported:n(o()).optional(),userinfo_encryption_alg_values_supported:n(o()).optional(),userinfo_encryption_enc_values_supported:n(o()).optional(),request_object_signing_alg_values_supported:n(o()).optional(),request_object_encryption_alg_values_supported:n(o()).optional(),request_object_encryption_enc_values_supported:n(o()).optional(),token_endpoint_auth_methods_supported:n(o()).optional(),token_endpoint_auth_signing_alg_values_supported:n(o()).optional(),display_values_supported:n(o()).optional(),claim_types_supported:n(o()).optional(),claims_supported:n(o()).optional(),service_documentation:o().optional(),claims_locales_supported:n(o()).optional(),ui_locales_supported:n(o()).optional(),claims_parameter_supported:g().optional(),request_parameter_supported:g().optional(),request_uri_parameter_supported:g().optional(),require_request_uri_registration:g().optional(),op_policy_uri:K.optional(),op_tos_uri:K.optional(),client_id_metadata_document_supported:g().optional()}).shape,...Ni.pick({code_challenge_methods_supported:!0}).shape}),Fi=u({access_token:o(),id_token:o().optional(),token_type:o(),expires_in:zt().optional(),scope:o().optional(),refresh_token:o().optional()}).strip(),Ii=u({error:o(),error_description:o().optional(),error_uri:o().optional()}),Li=K.optional().or(i(``).transform(()=>void 0)),Ri=u({redirect_uris:n(K),token_endpoint_auth_method:o().optional(),grant_types:n(o()).optional(),response_types:n(o()).optional(),client_name:o().optional(),client_uri:K.optional(),logo_uri:Li,scope:o().optional(),contacts:n(o()).optional(),tos_uri:Li,policy_uri:o().optional(),jwks_uri:K.optional(),jwks:_().optional(),software_id:o().optional(),software_version:o().optional(),software_statement:o().optional()}).strip(),zi=u({client_id:o(),client_secret:o().optional(),client_id_issued_at:l().optional(),client_secret_expires_at:l().optional()}).strip(),Bi=Ri.merge(zi);u({error:o(),error_description:o().optional()}).strip(),u({token:o(),token_type_hint:o().optional()}).strip();function Vi(e){let t=typeof e==`string`?new URL(e):new URL(e.href);return t.hash=``,t}function Hi({requestedResource:e,configuredResource:t}){let n=typeof e==`string`?new URL(e):new URL(e.href),r=typeof t==`string`?new URL(t):new URL(t.href);if(n.origin!==r.origin||n.pathname.length<r.pathname.length)return!1;let i=n.pathname.endsWith(`/`)?n.pathname:n.pathname+`/`,a=r.pathname.endsWith(`/`)?r.pathname:r.pathname+`/`;return i.startsWith(a)}var q=class extends Error{constructor(e,t){super(e),this.errorUri=t,this.name=this.constructor.name}toResponseObject(){let e={error:this.errorCode,error_description:this.message};return this.errorUri&&(e.error_uri=this.errorUri),e}get errorCode(){return this.constructor.errorCode}},Ui=class extends q{};Ui.errorCode=`invalid_request`;var Wi=class extends q{};Wi.errorCode=`invalid_client`;var Gi=class extends q{};Gi.errorCode=`invalid_grant`;var Ki=class extends q{};Ki.errorCode=`unauthorized_client`;var qi=class extends q{};qi.errorCode=`unsupported_grant_type`;var Ji=class extends q{};Ji.errorCode=`invalid_scope`;var Yi=class extends q{};Yi.errorCode=`access_denied`;var J=class extends q{};J.errorCode=`server_error`;var Xi=class extends q{};Xi.errorCode=`temporarily_unavailable`;var Zi=class extends q{};Zi.errorCode=`unsupported_response_type`;var Qi=class extends q{};Qi.errorCode=`unsupported_token_type`;var $i=class extends q{};$i.errorCode=`invalid_token`;var ea=class extends q{};ea.errorCode=`method_not_allowed`;var ta=class extends q{};ta.errorCode=`too_many_requests`;var na=class extends q{};na.errorCode=`invalid_client_metadata`;var ra=class extends q{};ra.errorCode=`insufficient_scope`;var ia=class extends q{};ia.errorCode=`invalid_target`;const aa={[Ui.errorCode]:Ui,[Wi.errorCode]:Wi,[Gi.errorCode]:Gi,[Ki.errorCode]:Ki,[qi.errorCode]:qi,[Ji.errorCode]:Ji,[Yi.errorCode]:Yi,[J.errorCode]:J,[Xi.errorCode]:Xi,[Zi.errorCode]:Zi,[Qi.errorCode]:Qi,[$i.errorCode]:$i,[ea.errorCode]:ea,[ta.errorCode]:ta,[na.errorCode]:na,[ra.errorCode]:ra,[ia.errorCode]:ia};var Y=class extends Error{constructor(e){super(e??`Unauthorized`)}};function oa(e){return[`client_secret_basic`,`client_secret_post`,`none`].includes(e)}const sa=`code`,ca=`S256`;function la(e,t){let n=e.client_secret!==void 0;return`token_endpoint_auth_method`in e&&e.token_endpoint_auth_method&&oa(e.token_endpoint_auth_method)&&(t.length===0||t.includes(e.token_endpoint_auth_method))?e.token_endpoint_auth_method:t.length===0?n?`client_secret_basic`:`none`:n&&t.includes(`client_secret_basic`)?`client_secret_basic`:n&&t.includes(`client_secret_post`)?`client_secret_post`:t.includes(`none`)?`none`:n?`client_secret_post`:`none`}function ua(e,t,n,r){let{client_id:i,client_secret:a}=t;switch(e){case`client_secret_basic`:da(i,a,n);return;case`client_secret_post`:fa(i,a,r);return;case`none`:pa(i,r);return;default:throw Error(`Unsupported client authentication method: ${e}`)}}function da(e,t,n){if(!t)throw Error(`client_secret_basic authentication requires a client_secret`);let r=btoa(`${e}:${t}`);n.set(`Authorization`,`Basic ${r}`)}function fa(e,t,n){n.set(`client_id`,e),t&&n.set(`client_secret`,t)}function pa(e,t){t.set(`client_id`,e)}async function ma(e){let t=e instanceof Response?e.status:void 0,n=e instanceof Response?await e.text():e;try{let{error:e,error_description:t,error_uri:r}=Ii.parse(JSON.parse(n));return new(aa[e]||J)(t||``,r)}catch(e){return new J(`${t?`HTTP ${t}: `:``}Invalid OAuth error response: ${e}. Raw body: ${n}`)}}async function ha(e,t){try{return await ga(e,t)}catch(n){if(n instanceof Wi||n instanceof Ki)return await e.invalidateCredentials?.(`all`),await ga(e,t);if(n instanceof Gi)return await e.invalidateCredentials?.(`tokens`),await ga(e,t);throw n}}async function ga(e,{serverUrl:t,authorizationCode:n,scope:r,resourceMetadataUrl:i,fetchFn:a}){let o=await e.discoveryState?.(),s,c,l,u=i;if(!u&&o?.resourceMetadataUrl&&(u=new URL(o.resourceMetadataUrl)),o?.authorizationServerUrl){if(c=o.authorizationServerUrl,s=o.resourceMetadata,l=o.authorizationServerMetadata??await Oa(c,{fetchFn:a}),!s)try{s=await xa(t,{resourceMetadataUrl:u},a)}catch{}(l!==o.authorizationServerMetadata||s!==o.resourceMetadata)&&await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}else{let n=await ka(t,{resourceMetadataUrl:u,fetchFn:a});c=n.authorizationServerUrl,l=n.authorizationServerMetadata,s=n.resourceMetadata,await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}let d=await va(t,e,s),f=r||s?.scopes_supported?.join(` `)||e.clientMetadata.scope,p=await Promise.resolve(e.clientInformation());if(!p){if(n!==void 0)throw Error(`Existing OAuth client information is required when exchanging an authorization code`);let t=l?.client_id_metadata_document_supported===!0,r=e.clientMetadataUrl;if(r&&!_a(r))throw new na(`clientMetadataUrl must be a valid HTTPS URL with a non-root pathname, got: ${r}`);if(t&&r)p={client_id:r},await e.saveClientInformation?.(p);else{if(!e.saveClientInformation)throw Error(`OAuth client information must be saveable for dynamic registration`);let t=await Fa(c,{metadata:l,clientMetadata:e.clientMetadata,scope:f,fetchFn:a});await e.saveClientInformation(t),p=t}}let m=!e.redirectUrl;if(n!==void 0||m){let t=await Pa(e,c,{metadata:l,resource:d,authorizationCode:n,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}let h=await e.tokens();if(h?.refresh_token)try{let t=await Na(c,{metadata:l,clientInformation:p,refreshToken:h.refresh_token,resource:d,addClientAuthentication:e.addClientAuthentication,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}catch(e){if(!(!(e instanceof q)||e instanceof J))throw e}let g=e.state?await e.state():void 0,{authorizationUrl:_,codeVerifier:ee}=await Aa(c,{metadata:l,clientInformation:p,state:g,redirectUrl:e.redirectUrl,scope:f,resource:d});return await e.saveCodeVerifier(ee),await e.redirectToAuthorization(_),`REDIRECT`}function _a(e){if(!e)return!1;try{let t=new URL(e);return t.protocol===`https:`&&t.pathname!==`/`}catch{return!1}}async function va(e,t,n){let r=Vi(e);if(t.validateResourceURL)return await t.validateResourceURL(r,n?.resource);if(n){if(!Hi({requestedResource:r,configuredResource:n.resource}))throw Error(`Protected resource ${n.resource} does not match expected ${r} (or origin)`);return new URL(n.resource)}}function ya(e){let t=e.headers.get(`WWW-Authenticate`);if(!t)return{};let[n,r]=t.split(` `);if(n.toLowerCase()!==`bearer`||!r)return{};let i=ba(e,`resource_metadata`)||void 0,a;if(i)try{a=new URL(i)}catch{}let o=ba(e,`scope`)||void 0,s=ba(e,`error`)||void 0;return{resourceMetadataUrl:a,scope:o,error:s}}function ba(e,t){let n=e.headers.get(`WWW-Authenticate`);if(!n)return null;let r=RegExp(`${t}=(?:"([^"]+)"|([^\\s,]+))`),i=n.match(r);return i?i[1]||i[2]:null}async function xa(e,t,n=fetch){let r=await Ea(e,`oauth-protected-resource`,n,{protocolVersion:t?.protocolVersion,metadataUrl:t?.resourceMetadataUrl});if(!r||r.status===404)throw await r?.body?.cancel(),Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`);if(!r.ok)throw await r.body?.cancel(),Error(`HTTP ${r.status} trying to load well-known OAuth protected resource metadata.`);return Mi.parse(await r.json())}async function Sa(e,t,n=fetch){try{return await n(e,{headers:t})}catch(r){if(r instanceof TypeError)return t?Sa(e,void 0,n):void 0;throw r}}function Ca(e,t=``,n={}){return t.endsWith(`/`)&&(t=t.slice(0,-1)),n.prependPathname?`${t}/.well-known/${e}`:`/.well-known/${e}${t}`}async function wa(e,t,n=fetch){return await Sa(e,{"MCP-Protocol-Version":t},n)}function Ta(e,t){return!e||e.status>=400&&e.status<500&&t!==`/`}async function Ea(e,t,n,r){let i=new URL(e),a=r?.protocolVersion??`2025-11-25`,o;if(r?.metadataUrl)o=new URL(r.metadataUrl);else{let e=Ca(t,i.pathname);o=new URL(e,r?.metadataServerUrl??i),o.search=i.search}let s=await wa(o,a,n);return!r?.metadataUrl&&Ta(s,i.pathname)&&(s=await wa(new URL(`/.well-known/${t}`,i),a,n)),s}function Da(e){let t=typeof e==`string`?new URL(e):e,n=t.pathname!==`/`,r=[];if(!n)return r.push({url:new URL(`/.well-known/oauth-authorization-server`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration`,t.origin),type:`oidc`}),r;let i=t.pathname;return i.endsWith(`/`)&&(i=i.slice(0,-1)),r.push({url:new URL(`/.well-known/oauth-authorization-server${i}`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration${i}`,t.origin),type:`oidc`}),r.push({url:new URL(`${i}/.well-known/openid-configuration`,t.origin),type:`oidc`}),r}async function Oa(e,{fetchFn:t=fetch,protocolVersion:n=ve}={}){let r={"MCP-Protocol-Version":n,Accept:`application/json`},i=Da(e);for(let{url:e,type:n}of i){let i=await Sa(e,r,t);if(i){if(!i.ok){if(await i.body?.cancel(),i.status>=400&&i.status<500)continue;throw Error(`HTTP ${i.status} trying to load ${n===`oauth`?`OAuth`:`OpenID provider`} metadata from ${e}`)}return n===`oauth`?Ni.parse(await i.json()):Pi.parse(await i.json())}}}async function ka(e,t){let n,r;try{n=await xa(e,{resourceMetadataUrl:t?.resourceMetadataUrl},t?.fetchFn),n.authorization_servers&&n.authorization_servers.length>0&&(r=n.authorization_servers[0])}catch{}r||=String(new URL(`/`,e));let i=await Oa(r,{fetchFn:t?.fetchFn});return{authorizationServerUrl:r,authorizationServerMetadata:i,resourceMetadata:n}}async function Aa(e,{metadata:t,clientInformation:n,redirectUrl:r,scope:i,state:a,resource:o}){let s;if(t){if(s=new URL(t.authorization_endpoint),!t.response_types_supported.includes(sa))throw Error(`Incompatible auth server: does not support response type ${sa}`);if(t.code_challenge_methods_supported&&!t.code_challenge_methods_supported.includes(ca))throw Error(`Incompatible auth server: does not support code challenge method ${ca}`)}else s=new URL(`/authorize`,e);let c=await ji(),l=c.code_verifier,u=c.code_challenge;return s.searchParams.set(`response_type`,sa),s.searchParams.set(`client_id`,n.client_id),s.searchParams.set(`code_challenge`,u),s.searchParams.set(`code_challenge_method`,ca),s.searchParams.set(`redirect_uri`,String(r)),a&&s.searchParams.set(`state`,a),i&&s.searchParams.set(`scope`,i),i?.includes(`offline_access`)&&s.searchParams.append(`prompt`,`consent`),o&&s.searchParams.set(`resource`,o.href),{authorizationUrl:s,codeVerifier:l}}function ja(e,t,n){return new URLSearchParams({grant_type:`authorization_code`,code:e,code_verifier:t,redirect_uri:String(n)})}async function Ma(e,{metadata:t,tokenRequestParams:n,clientInformation:r,addClientAuthentication:i,resource:a,fetchFn:o}){let s=t?.token_endpoint?new URL(t.token_endpoint):new URL(`/token`,e),c=new Headers({"Content-Type":`application/x-www-form-urlencoded`,Accept:`application/json`});a&&n.set(`resource`,a.href),i?await i(c,n,s,t):r&&ua(la(r,t?.token_endpoint_auth_methods_supported??[]),r,c,n);let l=await(o??fetch)(s,{method:`POST`,headers:c,body:n});if(!l.ok)throw await ma(l);return Fi.parse(await l.json())}async function Na(e,{metadata:t,clientInformation:n,refreshToken:r,resource:i,addClientAuthentication:a,fetchFn:o}){return{refresh_token:r,...await Ma(e,{metadata:t,tokenRequestParams:new URLSearchParams({grant_type:`refresh_token`,refresh_token:r}),clientInformation:n,addClientAuthentication:a,resource:i,fetchFn:o})}}async function Pa(e,t,{metadata:n,resource:r,authorizationCode:i,fetchFn:a}={}){let o=e.clientMetadata.scope,s;if(e.prepareTokenRequest&&(s=await e.prepareTokenRequest(o)),!s){if(!i)throw Error(`Either provider.prepareTokenRequest() or authorizationCode is required`);if(!e.redirectUrl)throw Error(`redirectUrl is required for authorization_code flow`);s=ja(i,await e.codeVerifier(),e.redirectUrl)}let c=await e.clientInformation();return Ma(t,{metadata:n,tokenRequestParams:s,clientInformation:c??void 0,addClientAuthentication:e.addClientAuthentication,resource:r,fetchFn:a})}async function Fa(e,{metadata:t,clientMetadata:n,scope:r,fetchFn:i}){let a;if(t){if(!t.registration_endpoint)throw Error(`Incompatible auth server: does not support dynamic client registration`);a=new URL(t.registration_endpoint)}else a=new URL(`/register`,e);let o=await(i??fetch)(a,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...n,...r===void 0?{}:{scope:r}})});if(!o.ok)throw await ma(o);return Bi.parse(await o.json())}var Ia=class extends Error{constructor(e,t){super(e),this.name=`ParseError`,this.type=t.type,this.field=t.field,this.value=t.value,this.line=t.line}};function La(e){}function Ra(e){if(typeof e==`function`)throw TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:t=La,onError:n=La,onRetry:r=La,onComment:i}=e,a=``,o=!0,s,c=``,l=``;function u(e){let t=o?e.replace(/^\xEF\xBB\xBF/,``):e,[n,r]=za(`${a}${t}`);for(let e of n)d(e);a=r,o=!1}function d(e){if(e===``){p();return}if(e.startsWith(`:`)){i&&i(e.slice(e.startsWith(`: `)?2:1));return}let t=e.indexOf(`:`);if(t!==-1){let n=e.slice(0,t),r=e[t+1]===` `?2:1;f(n,e.slice(t+r),e);return}f(e,``,e)}function f(e,t,i){switch(e){case`event`:l=t;break;case`data`:c=`${c}${t}
53
+ `;break;case`id`:s=t.includes(`\0`)?void 0:t;break;case`retry`:/^\d+$/.test(t)?r(parseInt(t,10)):n(new Ia(`Invalid \`retry\` value: "${t}"`,{type:`invalid-retry`,value:t,line:i}));break;default:n(new Ia(`Unknown field "${e.length>20?`${e.slice(0,20)}\u2026`:e}"`,{type:`unknown-field`,field:e,value:t,line:i}));break}}function p(){c.length>0&&t({id:s,event:l||void 0,data:c.endsWith(`
54
+ `)?c.slice(0,-1):c}),s=void 0,c=``,l=``}function m(e={}){a&&e.consume&&d(a),o=!0,s=void 0,c=``,l=``,a=``}return{feed:u,reset:m}}function za(e){let t=[],n=``,r=0;for(;r<e.length;){let i=e.indexOf(`\r`,r),a=e.indexOf(`
55
+ `,r),o=-1;if(i!==-1&&a!==-1?o=Math.min(i,a):i===-1?a!==-1&&(o=a):o=i===e.length-1?-1:i,o===-1){n=e.slice(r);break}else{let n=e.slice(r,o);t.push(n),r=o+1,e[r-1]===`\r`&&e[r]===`
56
+ `&&r++}}return[t,n]}var Ba=class extends TransformStream{constructor({onError:e,onRetry:t,onComment:n}={}){let r;super({start(i){r=Ra({onEvent:e=>{i.enqueue(e)},onError(t){e===`terminate`?i.error(t):typeof e==`function`&&e(t)},onRetry:t,onComment:n})},transform(e){r.feed(e)}})}};const Va={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2};var X=class extends Error{constructor(e,t){super(`Streamable HTTP error: ${t}`),this.code=e}},Ha=class{constructor(e,t){this._hasCompletedAuthFlow=!1,this._url=e,this._resourceMetadataUrl=void 0,this._scope=void 0,this._requestInit=t?.requestInit,this._authProvider=t?.authProvider,this._fetch=t?.fetch,this._fetchWithInit=Ti(t?.fetch,t?.requestInit),this._sessionId=t?.sessionId,this._reconnectionOptions=t?.reconnectionOptions??Va}async _authThenStart(){if(!this._authProvider)throw new Y(`No auth provider`);let e;try{e=await ha(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch(e){throw this.onerror?.(e),e}if(e!==`AUTHORIZED`)throw new Y;return await this._startOrAuthSse({resumptionToken:void 0})}async _commonHeaders(){let e={};if(this._authProvider){let t=await this._authProvider.tokens();t&&(e.Authorization=`Bearer ${t.access_token}`)}this._sessionId&&(e[`mcp-session-id`]=this._sessionId),this._protocolVersion&&(e[`mcp-protocol-version`]=this._protocolVersion);let t=wi(this._requestInit?.headers);return new Headers({...e,...t})}async _startOrAuthSse(e){let{resumptionToken:t}=e;try{let n=await this._commonHeaders();n.set(`Accept`,`text/event-stream`),t&&n.set(`last-event-id`,t);let r=await(this._fetch??fetch)(this._url,{method:`GET`,headers:n,signal:this._abortController?.signal});if(!r.ok){if(await r.body?.cancel(),r.status===401&&this._authProvider)return await this._authThenStart();if(r.status===405)return;throw new X(r.status,`Failed to open SSE stream: ${r.statusText}`)}this._handleSseStream(r.body,e,!0)}catch(e){throw this.onerror?.(e),e}}_getNextReconnectionDelay(e){if(this._serverRetryMs!==void 0)return this._serverRetryMs;let t=this._reconnectionOptions.initialReconnectionDelay,n=this._reconnectionOptions.reconnectionDelayGrowFactor,r=this._reconnectionOptions.maxReconnectionDelay;return Math.min(t*n**+e,r)}_scheduleReconnection(e,t=0){let n=this._reconnectionOptions.maxRetries;if(t>=n){this.onerror?.(Error(`Maximum reconnection attempts (${n}) exceeded.`));return}let r=this._getNextReconnectionDelay(t);this._reconnectionTimeout=setTimeout(()=>{this._startOrAuthSse(e).catch(n=>{this.onerror?.(Error(`Failed to reconnect SSE stream: ${n instanceof Error?n.message:String(n)}`)),this._scheduleReconnection(e,t+1)})},r)}_handleSseStream(e,t,n){if(!e)return;let{onresumptiontoken:r,replayMessageId:i}=t,a,o=!1,s=!1;(async()=>{try{let t=e.pipeThrough(new TextDecoderStream).pipeThrough(new Ba({onRetry:e=>{this._serverRetryMs=e}})).getReader();for(;;){let{value:e,done:n}=await t.read();if(n)break;if(e.id&&(a=e.id,o=!0,r?.(e.id)),e.data&&(!e.event||e.event===`message`))try{let t=Se.parse(JSON.parse(e.data));De(t)&&(s=!0,i!==void 0&&(t.id=i)),this.onmessage?.(t)}catch(e){this.onerror?.(e)}}(n||o)&&!s&&this._abortController&&!this._abortController.signal.aborted&&this._scheduleReconnection({resumptionToken:a,onresumptiontoken:r,replayMessageId:i},0)}catch(e){if(this.onerror?.(Error(`SSE stream disconnected: ${e}`)),(n||o)&&!s&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:a,onresumptiontoken:r,replayMessageId:i},0)}catch(e){this.onerror?.(Error(`Failed to reconnect: ${e instanceof Error?e.message:String(e)}`))}}})()}async start(){if(this._abortController)throw Error(`StreamableHTTPClientTransport already started! If using Client class, note that connect() calls start() automatically.`);this._abortController=new AbortController}async finishAuth(e){if(!this._authProvider)throw new Y(`No auth provider`);if(await ha(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new Y(`Failed to authorize`)}async close(){this._reconnectionTimeout&&=(clearTimeout(this._reconnectionTimeout),void 0),this._abortController?.abort(),this.onclose?.()}async send(e,t){try{let{resumptionToken:n,onresumptiontoken:r}=t||{};if(n){this._startOrAuthSse({resumptionToken:n,replayMessageId:Ce(e)?e.id:void 0}).catch(e=>this.onerror?.(e));return}let i=await this._commonHeaders();i.set(`content-type`,`application/json`),i.set(`accept`,`application/json, text/event-stream`);let a={...this._requestInit,method:`POST`,headers:i,body:JSON.stringify(e),signal:this._abortController?.signal},o=await(this._fetch??fetch)(this._url,a),s=o.headers.get(`mcp-session-id`);if(s&&(this._sessionId=s),!o.ok){let t=await o.text().catch(()=>null);if(o.status===401&&this._authProvider){if(this._hasCompletedAuthFlow)throw new X(401,`Server returned 401 after successful authentication`);let{resourceMetadataUrl:t,scope:n}=ya(o);if(this._resourceMetadataUrl=t,this._scope=n,await ha(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new Y;return this._hasCompletedAuthFlow=!0,this.send(e)}if(o.status===403&&this._authProvider){let{resourceMetadataUrl:t,scope:n,error:r}=ya(o);if(r===`insufficient_scope`){let r=o.headers.get(`WWW-Authenticate`);if(this._lastUpscopingHeader===r)throw new X(403,`Server returned 403 after trying upscoping`);if(n&&(this._scope=n),t&&(this._resourceMetadataUrl=t),this._lastUpscopingHeader=r??void 0,await ha(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch})!==`AUTHORIZED`)throw new Y;return this.send(e)}}throw new X(o.status,`Error POSTing to endpoint: ${t}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,o.status===202){await o.body?.cancel(),pe(e)&&this._startOrAuthSse({resumptionToken:void 0}).catch(e=>this.onerror?.(e));return}let c=(Array.isArray(e)?e:[e]).filter(e=>`method`in e&&`id`in e&&e.id!==void 0).length>0,l=o.headers.get(`content-type`);if(c)if(l?.includes(`text/event-stream`))this._handleSseStream(o.body,{onresumptiontoken:r},!1);else if(l?.includes(`application/json`)){let e=await o.json(),t=Array.isArray(e)?e.map(e=>Se.parse(e)):[Se.parse(e)];for(let e of t)this.onmessage?.(e)}else throw await o.body?.cancel(),new X(-1,`Unexpected content type: ${l}`);else await o.body?.cancel()}catch(e){throw this.onerror?.(e),e}}get sessionId(){return this._sessionId}async terminateSession(){if(this._sessionId)try{let e=await this._commonHeaders(),t={...this._requestInit,method:`DELETE`,headers:e,signal:this._abortController?.signal},n=await(this._fetch??fetch)(this._url,t);if(await n.body?.cancel(),!n.ok&&n.status!==405)throw new X(n.status,`Failed to terminate session: ${n.statusText}`);this._sessionId=void 0}catch(e){throw this.onerror?.(e),e}}setProtocolVersion(e){this._protocolVersion=e}get protocolVersion(){return this._protocolVersion}async resumeStream(e,t){await this._startOrAuthSse({resumptionToken:e,onresumptiontoken:t?.onresumptiontoken})}},Ua=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
57
+ `);if(e===-1)return null;let t=this._buffer.toString(`utf8`,0,e).replace(/\r$/,``);return this._buffer=this._buffer.subarray(e+1),Wa(t)}clear(){this._buffer=void 0}};function Wa(e){return Se.parse(JSON.parse(e))}function Ga(e){return JSON.stringify(e)+`
58
+ `}var Ka=class{constructor(e=et.stdin,t=et.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new Ua,this._started=!1,this._ondata=e=>{this._readBuffer.append(e),this.processReadBuffer()},this._onerror=e=>{this.onerror?.(e)}}async start(){if(this._started)throw Error(`StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.`);this._started=!0,this._stdin.on(`data`,this._ondata),this._stdin.on(`error`,this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off(`data`,this._ondata),this._stdin.off(`error`,this._onerror),this._stdin.listenerCount(`data`)===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(t=>{let n=Ga(e);this._stdout.write(n)?t():this._stdout.once(`drain`,t)})}};function qa(e){let t=e.scheduler??{setTimeout:(e,t)=>globalThis.setTimeout(e,t),clearTimeout:e=>globalThis.clearTimeout(e)},n=e.initialBackoffMs??1e3,r=e.maxBackoffMs??3e4,i=e.createWebSocket??(e=>new WebSocket(e)),a=e.logger??null,o=e.log,s=null,c=null,l=!1,u=n;function d(e,t,n){try{a?a[e](t,n):o?.(t)}catch{}}function f(){if(l)return;c!==null&&t.clearTimeout(c);let e=u;u=Math.min(u*2,r),d(`debug`,`scheduling reconnect`,{backoffMs:e}),c=t.setTimeout(()=>{c=null,p().catch(e=>d(`warn`,`reconnect failed`,{error:String(e)}))},e)}async function p(){if(l)return;let t;try{t=await e.resolveWsUrl()}catch(e){d(`warn`,`resolveWsUrl threw`,{error:String(e)}),f();return}if(!t){f();return}let r=e.connectionId?`&connectionId=${encodeURIComponent(e.connectionId)}`:``,a=`${t}/collab/keepalive?pid=${process.pid}${r}`;try{s=i(a)}catch(e){d(`warn`,`WebSocket constructor failed`,{url:a,error:String(e)}),s=null,f();return}s.addEventListener(`open`,()=>{d(`info`,`connected`,{url:t}),u=n}),s.addEventListener(`close`,()=>{l||(d(`info`,`disconnected`,{url:t}),s=null,f())}),s.addEventListener(`error`,()=>{d(`debug`,`websocket error observed`,{url:t,readyState:s?.readyState,reason:`error-event`})})}return queueMicrotask(()=>{p().catch(e=>d(`warn`,`initial connect failed`,{error:String(e)}))}),{close:()=>{if(!l&&(l=!0,c!==null&&(t.clearTimeout(c),c=null),s)){try{s.close()}catch{}s=null}},isConnected:()=>s!==null&&s.readyState===1}}function Ja(e){return(t,n)=>{if((n?.method??`GET`).toUpperCase()===`GET`)return globalThis.fetch(t,n);let r=new AbortController,i=setTimeout(()=>r.abort(Error(`MCP request timed out after ${e}ms`)),e),a=n?.signal instanceof AbortSignal?AbortSignal.any([n.signal,r.signal]):r.signal;return globalThis.fetch(t,{...n,signal:a}).finally(()=>clearTimeout(i))}}function Ya(e){if(e===void 0||e===``)return;let t=Number.parseInt(e,10);if(!(Number.isNaN(t)||t<=0))return t}function Xa(e){return e===`0.0.0.0`||e===`::`?`localhost`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function Za(e,t){return`http://${Xa(e)}:${t}/mcp`}function Qa(e,t){return`ws://${Xa(e)}:${t}`}function $a(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=``,t.search=``,t.hash=``,t.toString().replace(/\/$/,``)}function eo(e,t){if(!(!e||e.port<=0)&&t(e.pid))return e.port}function to(e){return F(e)?I(e,`utf-8`).trim():``}function no(e,t){return`server did not start within ${e}ms${t?` stderr:\n${t}`:``}`}function ro(e){if(e&&typeof e==`object`&&`method`in e&&`id`in e)return e.id}function io(e){if(!e||typeof e!=`object`||!(`result`in e))return;let t=e.result;if(!t||typeof t!=`object`||!(`protocolVersion`in t))return;let n=t.protocolVersion;return typeof n==`string`?n:void 0}function ao(e,t){return{jsonrpc:`2.0`,id:e,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}}async function oo(e){let t=e.readLock??(()=>le(e.lockDir)),n=e.isAlive??de,r=e.sleep??(e=>ut(e)),i=e.spawn??Ve,a=e.readErrorLog??to,o=e.openErrorLog??(e=>Ye(e,`w`)),s=e.closeFd??Ke,c=e.timeoutMs??5e3,l=e.pollIntervalMs??100;if(e.portOverride!==void 0){let t=Number.parseInt(e.portOverride,10);if(Number.isNaN(t)||t<=0)throw Error(`invalid --port value '${e.portOverride}' — HTTP MCP shim requires a positive port`);return Za(`localhost`,t)}let u=eo(t(),n);if(u!==void 0)return Za(`localhost`,u);if(e.envAutoStart===`0`)throw Error(`Open Knowledge server is not running and OK_MCP_AUTOSTART=0 disables auto-start.`);F(e.lockDir)||qe(e.lockDir,{recursive:!0});let d=N(e.lockDir,`last-spawn-error.log`),f=o(d),p,m,h=Ae();try{try{p=i(h.command,[...h.prefixArgs,`start`],{detached:!0,stdio:[`ignore`,`ignore`,f],cwd:e.contentDir,env:{...process.env,OK_LOCK_KIND:`mcp-spawned`}}),p.on(`error`,e=>{m=e instanceof Error?e.message:String(e)}),p.unref()}catch(e){m=e instanceof Error?e.message:String(e)}}finally{try{s(f)}catch{}}let g=Date.now()+c;for(;Date.now()<g;){if(m){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${m}${t}`)}await r(l);let e=eo(t(),n);if(e!==void 0)return Za(`localhost`,e)}if(m){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${m}${t}`)}throw Error(no(c,a(d)))}function so(e,t){if(e.portOverride!==void 0)return $a(t);let n=e.readLock??(()=>le(e.lockDir)),r=e.isAlive??de,i=eo(n(),r);if(i!==void 0)return Qa(`localhost`,i)}async function co(e,t={}){let n=t.stderr??process.stderr,r=t.requestTimeoutMs??12e4,i=t.createStdioTransport?t.createStdioTransport(t.stdin,t.stdout):new Ka(t.stdin,t.stdout),a=t.createHttpTransport?t.createHttpTransport(new URL(e)):new Ha(new URL(e),{fetch:Ja(r)}),o=!1,s=async()=>{o||(o=!0,t.onclose?.(),await Promise.allSettled([i.close(),a.close()]))};i.onerror=e=>{n.write(`[mcp-shim] stdio error: ${e.message}\n`)},a.onerror=e=>{n.write(`[mcp-shim] HTTP transport error: ${e.message}\n`)},i.onclose=()=>{s()},a.onclose=()=>{s()};let c=Promise.resolve();i.onmessage=e=>{c=c.then(async()=>{try{await a.send(e)}catch(t){let r=ro(e);if(r===void 0){n.write(`[mcp-shim] failed to forward stdio notification: ${t instanceof Error?t.message:String(t)}\n`);return}await i.send(ao(r,t)).catch(e=>{n.write(`[mcp-shim] failed to write stdio error response: ${e instanceof Error?e.message:String(e)}\n`)})}}).catch(e=>{n.write(`[mcp-shim] unexpected stdio forwarding failure: ${e instanceof Error?e.message:String(e)}\n`)})},a.onmessage=e=>{let t=io(e);t&&a.setProtocolVersion?.(t),i.send(e).catch(e=>{n.write(`[mcp-shim] failed to write stdio response: ${e instanceof Error?e.message:String(e)}\n`)})};try{await a.start(),await i.start()}catch(e){throw await s(),e}return{close:s}}async function lo(e){let t=e.stderr??process.stderr,n=e.bridgeFn??co,r=await oo(e),i=e.createConnectionId?.()??ct(),a=!1,o=(e.startKeepalive??qa)({connectionId:i,resolveWsUrl:async()=>so(e,r),log:e=>t.write(`[mcp-shim] keepalive: ${e}\n`)});t.write(`[mcp-shim] proxying stdio to ${r}\n`);let s;try{s=await n(r,{stderr:t,onclose:()=>{a||(o.close(),process.exit(0))}})}catch(e){throw o.close(),e}let c=()=>{a=!0,o.close(),s.close().finally(()=>{process.exit(0)})};process.once(`SIGINT`,c),process.once(`SIGTERM`,c)}function uo(e,t){return t===void 0?!F(P(e,`.ok`)):!1}function fo(e){return new t(`mcp`).description(`Start MCP stdio server for project knowledge base`).option(`-p, --port <port>`,`Override port discovery and proxy to this HTTP MCP port`,void 0).action(async t=>{try{let n=e(),r=process.cwd();if(uo(r,t.port)){process.stderr.write(`[mcp] ${r} is not an Open Knowledge project (no .ok/); exiting. Run \`ok init\` to scaffold one.\n`),process.exitCode=1;return}let i=O(n,r),a=Ya(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await lo({lockDir:_e(i),contentDir:i,portOverride:t.port,envAutoStart:process.env.OK_MCP_AUTOSTART,timeoutMs:a})}catch(e){process.stderr.write(`MCP server failed to start: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}})}function po(e){return new t(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-CN1rHXBb.mjs`),r=e(),i=process.cwd(),a=O(r,i),o;try{o=t({projectDir:i,contentDir:a})}catch(e){console.error(`Content preview failed: ${e instanceof Error?e.message:String(e)}`),process.exitCode=1;return}process.stdout.write(`${n(o,i)}\n`),o.totalCount===0&&o.warnings.length>0&&(process.exitCode=1)})}function mo(e,t=Date.now()){let n=new Date(e).getTime();if(Number.isNaN(n))return`—`;let r=t-n,i=Math.floor(r/1e3);if(i<60)return`${i}s`;let a=Math.floor(i/60);if(a<60)return`${a}m ago`;let o=Math.floor(a/60);return o<24?`${o}h ago`:`${Math.floor(o/24)}d ago`}function ho(e,t,n,r,i,a){if(t.status===`missing`||t.status===`corrupt`)return null;let o=t.lock,s=null;if(n.status!==`missing`&&n.status!==`corrupt`){let e=n.lock;s={port:e.port,status:n.status,pid:e.pid,startedAt:e.startedAt,usage:a}}return{directory:o.worktreeRoot,server:{port:o.port,status:t.status,pid:o.pid,startedAt:o.startedAt,usage:i},ui:s,hostname:o.hostname,lockPath:t.lockPath,binary:r==null?null:ti(r),command:r}}function go(e){switch(e){case`alive`:return`running`;case`dead-pid`:return`stale`;case`foreign-host`:return`foreign`;default:return e}}function _o(e,t){switch(e){case`alive`:return W.default.green(t);case`dead-pid`:return W.default.yellow(t);case`foreign-host`:return W.default.cyan(t);default:return t}}function vo(e){return e==null?`—`:`${e.cpuPercent.toFixed(1)}% / ${e.memPercent.toFixed(1)}%`}function yo(e){return`${vo(e.server.usage)} | ${vo(e.ui?.usage??null)}`}function bo(e){return`${e.server.port===0?`(starting)`:String(e.server.port)} / ${e.ui==null||e.ui.status===`dead-pid`||e.ui.status===`foreign-host`?`—`:String(e.ui.port)}`}function xo(e){if(e.length===0)return`No open-knowledge servers found.`;let t=[`DIRECTORY`,`PORTS (API/UI)`,`CPU/MEM (API | UI)`,`STATUS`,`PID`,`STARTED`,`BINARY`],n=e.map(e=>[e.directory,bo(e),yo(e),go(e.server.status),String(e.server.pid),mo(e.server.startedAt),e.binary??`—`]),r=t.length,i=t.map(e=>e.length);for(let e of n)for(let t=0;t<r;t++)i[t]=Math.max(i[t]??0,(e[t]??``).length);let a=t.map((e,t)=>e.padEnd(i[t]??0)).join(` `).trimEnd(),o=e.map((e,t)=>{let a=n[t]??[],o=[];for(let t=0;t<r;t++){let n=(a[t]??``).padEnd(i[t]??0);if(t===3){let r=a[t]??``;n=_o(e.server.status,r)+` `.repeat(Math.max(0,(i[t]??0)-r.length))}o.push(n)}return o.join(` `).trimEnd()}),s=W.default.dim(`To stop a server: ok stop <port|pid|directory|all>`);return[a,...o,``,s].join(`
59
+ `)}async function So(e={}){let t=e.discover??oi,n=e.inspect??H,r=e.log??(e=>console.log(e)),i=e.resolveCommand??ni,a=e.resolveUsage??ri,o=await t(),s=[];for(let e of o){let t=n(e,`server`),r=n(e,`ui`),o=ho(e,t,r,t.status===`missing`||t.status===`corrupt`?null:i(t.lock.pid),t.status===`missing`||t.status===`corrupt`?null:a(t.lock.pid),r.status===`missing`||r.status===`corrupt`?null:a(r.lock.pid));o!=null&&s.push(o)}if(e.json){r(JSON.stringify(s,null,2));return}r(xo(e.all?s.filter(e=>e.server.status===`alive`||e.server.status===`dead-pid`||e.server.status===`foreign-host`):s.filter(e=>e.server.status===`alive`)))}function Co(){return new t(`ps`).description(`List all running open-knowledge servers`).argument(`[modifier]`,`"all" to include stale/foreign entries`).option(`--all`,`Include stale (dead-pid) and foreign-host entries`).option(`--json`,`Emit structured JSON (always includes all statuses)`).action(async(e,t)=>{await So({all:t.all===!0||e===`all`,json:t.json===!0})})}function Z(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function wo(e,t,n=process.cwd()){let r=e.op??`sync`,i=le(D(O(t,n)));if(i&&i.port>0){let t=`http://127.0.0.1:${i.port}/api/sync/trigger`;e.json||process.stderr.write(`Triggering ${r} via running server (port ${i.port})…\n`);try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({op:r})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`Server responded with ${n.status}`)}Z(e.json,{type:`triggered`,op:r,port:i.port}),e.json||process.stderr.write(`✓ ${r} triggered\n`);return}catch(t){let n=t instanceof Error?t.message:String(t);e.json||process.stderr.write(`Server trigger failed (${n}), running directly…\n`)}}e.json||process.stderr.write(`Running ${r} directly (no live server)…\n`);let a=fe({baseDir:n});if(r===`sync`||r===`pull`){Z(e.json,{type:`step`,step:`pull`});let t=await a.pull();Z(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(Z(e.json,{type:`step`,step:`push`}),await a.push(),Z(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
60
+ `)),Z(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function To(e){return new t(`sync`).description(`Commit, pull, and push to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await wo({json:t.json,op:`sync`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ sync failed: ${n}\n`),process.exit(1)}})}function Eo(e){return new t(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await wo({json:t.json,op:`pull`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ pull failed: ${n}\n`),process.exit(1)}})}function Do(e){return new t(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await wo({json:t.json,op:`push`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ push failed: ${n}\n`),process.exit(1)}})}async function Oo(e={}){let t=P(e.cwd??process.cwd()),n;try{n=await Te({projectDir:t,rootDir:e.root})}catch(e){return e instanceof ge?{status:`prerequisite-missing`,message:`${Re(`Error:`)} ${e.message}`,exitCode:1}:{status:`failed`,message:`${Re(`Error:`)} ${e instanceof Error?e.message:String(e)}`,exitCode:1}}if(n.created.length===0)return{status:`no-op`,message:`${A(`Your knowledge base is already seeded.`)}\n${k(`Nothing to do.`)}`,plan:n,exitCode:0};if(e.dryRun)return{status:`dry-run`,message:`${j(`Plan (dry-run — no changes made):`)}\n\n${ko(n,t)}`,plan:n,exitCode:0};if(!e.yes&&!await Ao(`${j(`Plan:`)}\n\n${ko(n,t)}\n\n${j(`Apply?`)} ${k(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:k(`Cancelled.`),plan:n,exitCode:0};let r=await he(n,{projectDir:t});if(r.errors.length>0){let e=r.errors.map(e=>` ${Re(`✗`)} ${e.path}: ${e.error}`);return{status:`failed`,message:[`${ze(`Applied`)} ${r.applied} entries, ${ze(String(r.errors.length))} error(s):`,...e].join(`
61
+ `),plan:n,exitCode:1}}return{status:`applied`,message:`${A(`✓ Seeded knowledge base`)} ${k(`(${r.applied} entries, ${r.durationMs}ms)`)}`,plan:n,exitCode:0}}function ko(e,t){let n=[],r=e.created.filter(e=>e.kind===`folder`),i=e.created.filter(e=>e.kind===`file`);if(r.length>0){n.push(j(`Folders to create:`));for(let e of r)n.push(` ${A(`+`)} ${Le(Ge(t,P(t,e.path))||e.path)}${k(`/`)}`)}if(i.length>0){n.length>0&&n.push(``),n.push(j(`Files to create:`));for(let e of i)n.push(` ${A(`+`)} ${Le(Ge(t,P(t,e.path))||e.path)}`)}if(e.skipped.length>0){n.length>0&&n.push(``),n.push(k(`Already present (skipped):`));for(let t of e.skipped)n.push(` ${k(`· ${t.path} (${t.reason})`)}`)}if(e.warnings.length>0){n.length>0&&n.push(``),n.push(ze(`Warnings:`));for(let t of e.warnings)n.push(` ${ze(`!`)} ${t}`)}return n.join(`
62
+ `)}async function Ao(e,t){let n=pt({input:t??process.stdin,output:process.stdout});try{let t=(await n.question(e)).trim().toLowerCase();return t===``||t===`y`||t===`yes`}finally{n.close()}}function jo(){return new t(`seed`).description(`Scaffold the Karpathy three-layer knowledge-base structure (external-sources/, research/, articles/) + log.md + per-folder .ok/frontmatter.yml defaults. Use --root to place them inside a subfolder instead of the project root.`).argument(`[path]`,`Project directory (defaults to cwd)`).option(`-r, --root <path>`,`Subfolder (relative to the project dir) to scaffold into — created if missing. Defaults to the project root when omitted in non-interactive runs; prompts on a TTY.`).option(`-y, --yes`,`Skip confirmation prompt`).option(`--dry-run`,`Print the plan and exit without writing`).action(async(e,t)=>{let n=await Oo({cwd:e??process.cwd(),root:t.root,yes:t.yes,dryRun:t.dryRun});process.stdout.write(`${n.message}\n`),n.exitCode!==0&&(process.exitCode=n.exitCode)})}function Mo(e,t){return{server:No(`server`,e),ui:No(`ui`,t)}}function No(e,t){switch(t.status){case`missing`:return{name:e,state:`missing`,alive:!1};case`corrupt`:return{name:e,state:`corrupt`,alive:!1};case`foreign-host`:return{name:e,state:`foreign-host`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:`unknown`};case`dead-pid`:return{name:e,state:`dead-pid`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:!1};case`alive`:return{name:e,state:`alive`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:!0}}}function Po(e){return`${Fo(e.server)}\n${Fo(e.ui)}`}function Fo(e){let t=e.name===`server`?`server`:`ui `;return e.state===`missing`?`${t} not running`:e.state===`corrupt`?`${t} lock file corrupt — run \`ok clean\``:e.state===`foreign-host`?`${t} foreign host (${e.host}) pid=${e.pid} port=${e.port}`:e.state===`dead-pid`?`${t} stale (dead pid=${e.pid}) — run \`ok clean\``:`${t} alive pid=${e.pid} port=${e.port} started=${e.startedAt}`}function Io(e){let t=e.inspect??(t=>H(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=Mo(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(Po(r)),r}function Lo(e){return new t(`status`).description(`Show live state of the server + ui lockfiles for this project`).option(`--json`,`Emit structured JSON instead of formatted text`).action(t=>{Io({lockDir:D(O(e(),process.cwd())),json:t.json===!0})})}function Ro(e,t){let n=[];return e.status===`alive`&&n.push({name:`server`,pid:e.lock.pid,port:e.lock.port}),t.status===`alive`&&n.push({name:`ui`,pid:t.lock.pid,port:t.lock.port}),{targets:n}}function zo(e){let t=e.inspect??(t=>H(e.lockDir,t)),n=e.kill??((e,t)=>process.kill(e,t)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=Ro(t(`server`),t(`ui`));if(a.targets.length===0)return r(`No running open-knowledge processes.`),{stopped:[],failed:[],hadTargets:!1};let o=[],s=[];for(let e of a.targets)try{n(e.pid,`SIGTERM`),o.push(e)}catch(t){s.push({target:e,error:t instanceof Error?t.message:String(t)})}return o.length>0&&r(`Stopped: ${o.map(e=>`${e.name} (pid=${e.pid}, port=${e.port})`).join(`, `)}`),s.length>0&&i(`Failed to stop: ${s.map(({target:e,error:t})=>`${e.name} (pid=${e.pid}): ${t}`).join(`; `)}`),{stopped:o,failed:s,hadTargets:!0}}async function Bo(e){let t=await oi(),n=null;for(let r of t){let t=H(r,`server`),i=H(r,`ui`);if(t.status===`alive`&&t.lock.port===e||i.status===`alive`&&i.lock.port===e)return r;n===null&&(t.status===`alive`&&t.lock.pid===e||i.status===`alive`&&i.lock.pid===e)&&(n=r)}return n}function Vo(e){let t=zo({lockDir:e});return t.failed.length>0&&(process.exitCode=1),t}function Ho(e){return new t(`stop`).description(`Stop open-knowledge server(s). With no argument: stops the server for the current directory. Pass a port number, a directory path, or "all" to target globally.`).argument(`[target...]`,`port number, directory path (spaces OK), or "all"`).action(async t=>{let n=t.length===0?void 0:t.join(` `);if(n===void 0){let t=zo({lockDir:D(O(e(),process.cwd())),log:()=>{}});if(t.hadTargets){if(t.stopped.length>0){let e=t.stopped.map(e=>`${e.name} (pid=${e.pid}, port=${e.port})`).join(`, `);console.log(`Stopped: ${e}`)}t.failed.length>0&&(process.exitCode=1)}else await So({});return}if(n===`all`){let e=await oi();if(e.length===0){console.log(`No running open-knowledge servers found.`);return}let t=0;for(let n of e){let e=H(n,`server`),r=H(n,`ui`);e.status!==`alive`&&r.status!==`alive`||(Vo(n),t++)}t===0&&console.log(`No running open-knowledge servers found.`);return}if(/^\d+$/.test(n)){let e=Number.parseInt(n,10),t=await Bo(e);if(t===null){console.log(`No running open-knowledge server found with port or PID ${e}.`);return}Vo(t);return}Vo(D(n))})}const Uo=1e4;function Wo(e,t){let n=e.socket?.remoteAddress;if(n!==void 0&&!be(n))return Go(t,`loopback-required`),!0;if(!ye(e.headers.host))return Go(t,`host-header-not-allowed`),!0;let r=e.headers.origin;return r!==void 0&&!me(r)?(Go(t,`origin-not-allowed`),!0):!1}function Go(e,t){e.writeHead(403,{"Content-Type":`application/json`,"Cache-Control":`no-store`,"X-Content-Type-Options":`nosniff`}),e.end(JSON.stringify({ok:!1,error:t}))}const Ko=[`connection`,`keep-alive`,`proxy-authenticate`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`,`cookie`,`set-cookie`];async function qo(e){let t=e.upstreamTimeoutMs??Uo,n=dt((n,r)=>{Wo(n,r)||Yo(n,r,e.upstreamHost,e.upstreamPort,t)});await new Promise((t,r)=>{let i=e=>r(e);n.once(`error`,i),n.listen(e.listenPort,e.host,()=>{n.off(`error`,i),t()})});let r=n.address();return{httpServer:n,port:typeof r==`object`&&r?r.port:e.listenPort,close:()=>new Promise(e=>{n.close(()=>e())})}}function Jo(e,t,n){Yo(e,t,n.upstreamHost,n.upstreamPort,n.upstreamTimeoutMs??Uo)}function Yo(e,t,n,r,i){let a={...e.headers};delete a.host;for(let e of Ko)delete a[e];e.setTimeout(3e4,()=>{if(t.headersSent)try{t.end()}catch{}else try{t.writeHead(408,{"Content-Type":`text/plain`}),t.end(`Request Timeout`)}catch{}try{e.socket?.destroy()}catch{}});let o=ft({host:n,port:r,method:e.method,path:e.url,headers:{...a,host:`${n}:${r}`}},e=>{let n={...e.headers};for(let e of Ko)delete n[e];t.writeHead(e.statusCode??502,n),e.pipe(t),e.once(`error`,()=>{try{t.end()}catch{}})});i>0&&o.setTimeout(i,()=>{if(!t.headersSent)t.writeHead(504,{"Content-Type":`text/plain`}),t.end(`Gateway Timeout`);else try{t.end()}catch{}o.destroy()}),o.on(`error`,()=>{if(!t.headersSent)t.writeHead(502,{"Content-Type":`text/plain`}),t.end(`Bad Gateway`);else try{t.end()}catch{}}),e.on(`error`,()=>{o.destroy()}),e.pipe(o)}async function Xo(e){await Promise.all(e.map(e=>new Promise(t=>{e.close(()=>t())})))}async function Zo(e){let{existsSync:t}=await import(`node:fs`),{createServer:n}=await import(`node:http`),{resolve:i}=await import(`node:path`),{acquireUiLock:a,createAssetServeMiddleware:o,createContentFilter:s,readServerLock:c,releaseUiLock:l,updateUiLockPort:u}=await import(`./dist-DXLSMgBY.mjs`),{default:f}=await import(`./build-B6buVrsB.mjs`),{resolveContentDir:m,resolveLockDir:h}=await import(`./dist-DXLSMgBY.mjs`),g=m(e.config,e.cwd),_=h(g);a(_,{port:0,worktreeRoot:e.cwd});let v=import.meta.dirname??new URL(`.`,import.meta.url).pathname,te=[i(v,`public`),i(v,`../../app/dist`),i(v,`../../../app/dist`)].find(e=>t(e)),y=te?f(te,{single:!0,gzip:!0,immutable:!0,extensions:[]}):null,b=t(g)?o({contentFilter:s({projectDir:e.cwd,contentDir:g}),contentSirv:f(g,{dotfiles:!1,dev:!0,extensions:[]}),inlineExtensions:r,assetExtensions:ee,blocklistExtensions:d}):null,ne=e.port,x=null,S=(e,t)=>{let n=e.url?.split(`?`)[0];if((n===`/`||n===``)&&(e.url=`/index.html`),!(n?.startsWith(`/api/`)&&Wo(e,t))){if(n===`/api/config`&&(e.method===`GET`||e.method===`HEAD`)){x?.();let n=c(_),r=n&&n.port>0?`ws://localhost:${n.port}/collab`:null,i=JSON.stringify({collabUrl:r,previewUrl:null,port:ne});t.setHeader(`Content-Type`,`application/json`),t.setHeader(`Cache-Control`,`no-store`),t.setHeader(`X-Content-Type-Options`,`nosniff`),t.statusCode=200,e.method===`HEAD`?t.end():t.end(i);return}if(n?.startsWith(`/api/`)){x?.();let r=c(_);if(!r||r.port<=0){t.writeHead(503,{"Content-Type":`application/json`,"Cache-Control":`no-store`}),t.end(JSON.stringify({error:"Collab server not running. Start `ok start` or run `ok status`.",path:n}));return}Jo(e,t,{upstreamHost:`localhost`,upstreamPort:r.port});return}if(b){b(e,t,()=>{y?y(e,t):Qo(t)});return}if(y){y(e,t);return}Qo(t)}},re=e.host===void 0?[`::1`,`127.0.0.1`]:[e.host],C=[],w=e.port;try{for(let e of re){let t=n(S);C.push(t),await new Promise((n,r)=>{let i=e=>r(e);t.once(`error`,i),t.listen(w,e,()=>{t.off(`error`,i);let e=t.address();typeof e==`object`&&e&&(w=e.port),n()})})}}catch(e){await Promise.all(C.map(e=>new Promise(t=>{try{e.close(()=>t())}catch{t()}})));try{l(_)}catch{}throw e}let ie=w;ne=ie,u(_,ie);let ae=e.scheduler??p,oe=e.safetyNetMs??432e5,T=null,E=!1,se=!1,ce=()=>{E||(E=!0,T!==null&&(ae.clearTimeout(T),T=null))},le=()=>{if(ce(),!se){se=!0;try{l(_)}catch{}}},ue=()=>{E||oe<=0||(T!==null&&(ae.clearTimeout(T),T=null),T=ae.setTimeout(()=>{T=null,console.warn(`[ui] safety-net (${oe}ms) reached — shutting down (D-025 backstop)`);try{e.onSafetyNet?.()}catch{}for(let e of C)try{e.close()}catch{}le()},oe))},de=()=>{E||oe<=0||ue()};return x=de,ue(),{httpServers:C,port:ie,release:le,detachSafetyNet:ce,nudgeSafetyNet:de}}function Qo(e){e.writeHead(404),e.end(`Not found`)}function $o(e,t){if(e!==void 0){let t=Number.parseInt(e,10);if(Number.isNaN(t)||t<0||t>65535)throw Error(`Invalid --port value '${e}'`);return t}if(t!==void 0&&t!==``){let e=Number.parseInt(t,10);if(Number.isNaN(e)||e<0||e>65535)throw Error(`Invalid PORT env value '${t}'`);return e}return 0}async function es(e){let t=e.readLock??(async()=>{let{readUiLock:t}=await import(`./dist-DXLSMgBY.mjs`);return t(e.lockDir)}),n=await t();if(!n)throw Error(`UI lock collision reported but the lock disappeared before handling — retry acquiring.`);if(n.port===e.requestedPort&&n.port>0)return{mode:`already-running`,port:n.port};let r=n.port;if(r===0){let n=Date.now()+(e.pollDeadlineMs??2e3),i=e.pollIntervalMs??100;for(;Date.now()<n;){await new Promise(e=>{setTimeout(e,i)});let e=await t();if(e&&e.port>0){r=e.port;break}}if(r===0)throw Error("UI did not bind within 2s; run `ok clean`");if(r===e.requestedPort)return{mode:`already-running`,port:r}}return{mode:`proxy`,handle:await qo({listenPort:e.requestedPort,host:e.host,upstreamHost:`localhost`,upstreamPort:r}),upstreamPort:r}}function ts(e){return new t(`ui`).description(`Serve the Open Knowledge React editor UI`).option(`-p, --port <port>`,`UI port (default: $PORT env or 0 / kernel-allocated)`).option(`-H, --host <host>`,"UI host. Default: two-socket loopback bind (`[::1]` + `127.0.0.1`) so cross-family collisions fail loud (D-033). Pass an explicit host (e.g. `127.0.0.1`, `0.0.0.0`) to bind a single socket on that host.").action(async t=>{let{dim:n}=await import(`./colors-T3xmlXQT.mjs`),{UiLockCollisionError:r}=await import(`./dist-DXLSMgBY.mjs`),{resolveContentDir:i,resolveLockDir:a}=await import(`./dist-DXLSMgBY.mjs`),o=e(),s=t.host,c;try{c=$o(t.port,process.env.PORT)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=1;return}try{let e=await Zo({config:o,cwd:process.cwd(),port:c,host:s}),t=s===void 0||s===`::`||s===`0.0.0.0`?`localhost`:s;console.log(`${n(`[ui]`)} listening on http://${t}:${e.port}`);let r=!1,i=t=>{if(r)return;r=!0,console.log(n(`\n[ui] Shutting down (${t})...`)),e.detachSafetyNet();let i=()=>{try{e.release()}finally{process.exit(process.exitCode??0)}};Xo(e.httpServers).then(i,i),setTimeout(i,2e3).unref()};process.once(`SIGINT`,()=>i(`SIGINT`)),process.once(`SIGTERM`,()=>i(`SIGTERM`));return}catch(e){if(!(e instanceof r))throw e;let t=a(i(o,process.cwd())),l=s??`localhost`,u;try{u=await es({requestedPort:c,host:l,lockDir:t})}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}u.mode===`already-running`&&(console.log(`UI already running at http://${l}:${u.port}`),process.exit(0)),console.log(`UI running at http://${l}:${u.upstreamPort}; acting as HTTP proxy on port ${u.handle.port}`);let d=!1,f=e=>{d||(d=!0,console.log(n(`\n[ui-proxy] Shutting down (${e})...`)),u.handle.close().finally(()=>process.exit(process.exitCode??0)),setTimeout(()=>process.exit(process.exitCode??0),2e3).unref())};process.once(`SIGINT`,()=>f(`SIGINT`)),process.once(`SIGTERM`,()=>f(`SIGTERM`))}})}process.argv.includes(`--no-color`)?(process.env.NO_COLOR=`1`,delete process.env.FORCE_COLOR):process.argv.includes(`--color`)&&(process.env.FORCE_COLOR=`1`,delete process.env.NO_COLOR);const Q=new t;let $;Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).version(Oe).option(`--cwd <path>`,`Working directory`).option(`--log-level <level>`,`Log level`,`info`).option(`--no-color`,`Disable color output`).option(`--color`,`Force color output`).hook(`preAction`,e=>{let t=e.opts().cwd;t!==void 0&&process.chdir(t);let{config:n}=ke(t);$=n}),Q.action(async()=>{if(Pe(je()).available){Ne({spawn:Ve});return}await Fe($,{})});const ns=Me(()=>$);Q.addCommand(ns);const rs=fo(()=>$);Q.addCommand(rs),Q.addCommand(oe()),Q.addCommand(jo()),Q.addCommand(Ci());const is=po(()=>$);Q.addCommand(is);const as=ts(()=>$);Q.addCommand(as),Q.addCommand(Ho(()=>$)),Q.addCommand(Nr(()=>$)),Q.addCommand(Lo(()=>$)),Q.addCommand(Co()),Q.addCommand(hi()),Q.addCommand(Yr()),Q.addCommand(Ar()),Q.addCommand(Hr(()=>$)),Q.addCommand(To(()=>$)),Q.addCommand(Do(()=>$)),Q.addCommand(Eo(()=>$)),await Q.parseAsync();export{};
595
63
  //# sourceMappingURL=cli.mjs.map