@ken-jo/agent-connector 0.4.94 → 0.4.97

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 (385) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +6 -6
  3. package/README.md +605 -485
  4. package/dist/{action-VW5SACXY.js → action-IPFDPOZU.js} +16 -16
  5. package/dist/action-IPFDPOZU.js.map +1 -0
  6. package/dist/{amazon-q-ETMAGY3D.js → amazon-q-IT44LEWV.js} +6 -6
  7. package/dist/amazon-q-IT44LEWV.js.map +1 -0
  8. package/dist/{amp-BQZOL5GR.js → amp-CEWOSWQO.js} +4 -4
  9. package/dist/amp-CEWOSWQO.js.map +1 -0
  10. package/dist/{amp-67BZONGF.js → amp-P35FRU2Z.js} +7 -7
  11. package/dist/amp-P35FRU2Z.js.map +1 -0
  12. package/dist/{antigravity-EA4L225L.js → antigravity-LHFEFNMC.js} +5 -5
  13. package/dist/antigravity-LHFEFNMC.js.map +1 -0
  14. package/dist/antigravity-TWIWXTQH.js +18 -0
  15. package/dist/{antigravity-cli-B2HXZFYQ.js → antigravity-cli-MOKFSWOU.js} +5 -5
  16. package/dist/antigravity-cli-MOKFSWOU.js.map +1 -0
  17. package/dist/{antigravity-cli-OM6SC3PE.js → antigravity-cli-MPE27LPI.js} +9 -9
  18. package/dist/antigravity-cli-MPE27LPI.js.map +1 -0
  19. package/dist/audit-3E5JAOP2.js +311 -0
  20. package/dist/audit-3E5JAOP2.js.map +1 -0
  21. package/dist/{chunk-KSPMSRVU.js → chunk-3EP5V2F4.js} +3 -3
  22. package/dist/chunk-3EP5V2F4.js.map +1 -0
  23. package/dist/{chunk-MGTDQLJJ.js → chunk-3FINQ2ZF.js} +4 -4
  24. package/dist/chunk-3FINQ2ZF.js.map +1 -0
  25. package/dist/{chunk-KHO5WNTP.js → chunk-4GH2KA7V.js} +1 -1
  26. package/dist/chunk-4GH2KA7V.js.map +1 -0
  27. package/dist/{chunk-2Y2MZRLP.js → chunk-7C2IPIIB.js} +3 -3
  28. package/dist/chunk-7C2IPIIB.js.map +1 -0
  29. package/dist/{chunk-NLE2J5P4.js → chunk-7HHW23AC.js} +29 -29
  30. package/dist/chunk-7HHW23AC.js.map +1 -0
  31. package/dist/{chunk-XD7MY6HB.js → chunk-7PSNXUFK.js} +1 -1
  32. package/dist/chunk-7PSNXUFK.js.map +1 -0
  33. package/dist/{chunk-KJLFGQQM.js → chunk-7ZFK2WEO.js} +8 -6
  34. package/dist/chunk-7ZFK2WEO.js.map +1 -0
  35. package/dist/{chunk-XC5SJ35F.js → chunk-C63AAXK7.js} +5 -5
  36. package/dist/chunk-C63AAXK7.js.map +1 -0
  37. package/dist/{chunk-UM5S7DKK.js → chunk-C747DYNT.js} +1 -1
  38. package/dist/chunk-C747DYNT.js.map +1 -0
  39. package/dist/{chunk-EHP7WISI.js → chunk-FHYR5Q5T.js} +19 -14
  40. package/dist/chunk-FHYR5Q5T.js.map +1 -0
  41. package/dist/{chunk-I5TO42QC.js → chunk-GCPEPUD7.js} +8 -8
  42. package/dist/chunk-GCPEPUD7.js.map +1 -0
  43. package/dist/{chunk-ZMAJ2XFD.js → chunk-GZZCHJDP.js} +2 -2
  44. package/dist/chunk-GZZCHJDP.js.map +1 -0
  45. package/dist/{chunk-UMQ6NBQR.js → chunk-ILWHLGIC.js} +2 -2
  46. package/dist/chunk-ILWHLGIC.js.map +1 -0
  47. package/dist/{chunk-IVAWP6HH.js → chunk-IOJDZJ72.js} +2 -2
  48. package/dist/chunk-IOJDZJ72.js.map +1 -0
  49. package/dist/{chunk-NBYKLUF6.js → chunk-KFPSJRHR.js} +2 -2
  50. package/dist/chunk-KFPSJRHR.js.map +1 -0
  51. package/dist/{chunk-O7SDRBVB.js → chunk-KM2YXO6V.js} +1 -1
  52. package/dist/chunk-KM2YXO6V.js.map +1 -0
  53. package/dist/{chunk-P23RVIUY.js → chunk-L2C5UMKW.js} +4 -4
  54. package/dist/chunk-L2C5UMKW.js.map +1 -0
  55. package/dist/{chunk-OP4KBXUO.js → chunk-LFWYYWLV.js} +1 -1
  56. package/dist/chunk-LFWYYWLV.js.map +1 -0
  57. package/dist/{chunk-B5W3RHTI.js → chunk-LQ55E7QI.js} +7 -7
  58. package/dist/chunk-LQ55E7QI.js.map +1 -0
  59. package/dist/{chunk-TTKSYJRY.js → chunk-MLU7NDAZ.js} +12 -12
  60. package/dist/chunk-MLU7NDAZ.js.map +1 -0
  61. package/dist/{chunk-TQRLMA2C.js → chunk-N4ENLZEU.js} +22 -19
  62. package/dist/chunk-N4ENLZEU.js.map +1 -0
  63. package/dist/{chunk-SILKSP2Y.js → chunk-NDMNMAKP.js} +43 -43
  64. package/dist/chunk-NDMNMAKP.js.map +1 -0
  65. package/dist/{chunk-H53QZQJI.js → chunk-PSGTHJQU.js} +1 -1
  66. package/dist/chunk-PSGTHJQU.js.map +1 -0
  67. package/dist/{chunk-FBJQGRET.js → chunk-Q4ISQHUQ.js} +1 -1
  68. package/dist/chunk-Q4ISQHUQ.js.map +1 -0
  69. package/dist/{chunk-6TF7MHG5.js → chunk-Q7PR2WGT.js} +2 -2
  70. package/dist/chunk-Q7PR2WGT.js.map +1 -0
  71. package/dist/{chunk-GZGLCCEE.js → chunk-QYOUQCC6.js} +1 -1
  72. package/dist/chunk-QYOUQCC6.js.map +1 -0
  73. package/dist/{chunk-Z2MRSS2I.js → chunk-SLJI5BOM.js} +2 -2
  74. package/dist/chunk-SLJI5BOM.js.map +1 -0
  75. package/dist/{chunk-JKKU2WKG.js → chunk-TGZFDXNH.js} +4 -4
  76. package/dist/chunk-TGZFDXNH.js.map +1 -0
  77. package/dist/{chunk-FJCUKXGX.js → chunk-THI4PI4H.js} +2 -2
  78. package/dist/chunk-THI4PI4H.js.map +1 -0
  79. package/dist/{chunk-MQPNU2CY.js → chunk-UZZTWWGG.js} +1 -1
  80. package/dist/chunk-UZZTWWGG.js.map +1 -0
  81. package/dist/{chunk-2RIFORQS.js → chunk-WPTNMYYM.js} +2 -2
  82. package/dist/chunk-WPTNMYYM.js.map +1 -0
  83. package/dist/{chunk-OPXAP3AC.js → chunk-XN7S44U4.js} +1 -1
  84. package/dist/chunk-XN7S44U4.js.map +1 -0
  85. package/dist/{chunk-6WZODR3Z.js → chunk-XVEJAFKW.js} +5 -5
  86. package/dist/chunk-XVEJAFKW.js.map +1 -0
  87. package/dist/{chunk-BEFVJ2OE.js → chunk-XXLCMSD3.js} +1 -1
  88. package/dist/chunk-XXLCMSD3.js.map +1 -0
  89. package/dist/{chunk-YT43MUSJ.js → chunk-XZWMJLIT.js} +1 -1
  90. package/dist/chunk-XZWMJLIT.js.map +1 -0
  91. package/dist/{chunk-4NHXLXSD.js → chunk-Y3K6KJMS.js} +2 -2
  92. package/dist/chunk-Y3K6KJMS.js.map +1 -0
  93. package/dist/{chunk-RK6VBLXP.js → chunk-ZSOS2KOR.js} +1 -1
  94. package/dist/chunk-ZSOS2KOR.js.map +1 -0
  95. package/dist/{claude-code-NMRKTAP7.js → claude-code-FS42PXZO.js} +4 -4
  96. package/dist/claude-code-FS42PXZO.js.map +1 -0
  97. package/dist/{claude-code-DUZNOAS2.js → claude-code-QBWDT5RT.js} +11 -11
  98. package/dist/claude-code-QBWDT5RT.js.map +1 -0
  99. package/dist/cli/sdk.js +9 -8
  100. package/dist/cli/sdk.js.map +1 -1
  101. package/dist/cli.js +1 -1
  102. package/dist/cli.js.map +1 -1
  103. package/dist/{cline-25KW25IN.js → cline-JKEAYWVR.js} +6 -6
  104. package/dist/cline-JKEAYWVR.js.map +1 -0
  105. package/dist/{codebuddy-ZNYQACMF.js → codebuddy-EB6EYPC3.js} +7 -7
  106. package/dist/codebuddy-EB6EYPC3.js.map +1 -0
  107. package/dist/{codebuff-VR6JUDIY.js → codebuff-5RSXFU6G.js} +6 -6
  108. package/dist/codebuff-5RSXFU6G.js.map +1 -0
  109. package/dist/{codebuff-ETYT5UBL.js → codebuff-6KWBW6CT.js} +4 -4
  110. package/dist/codebuff-6KWBW6CT.js.map +1 -0
  111. package/dist/{codex-CPNKTXG3.js → codex-ART46CDD.js} +9 -9
  112. package/dist/codex-ART46CDD.js.map +1 -0
  113. package/dist/{codex-YAORPCOD.js → codex-DKBAAUCO.js} +4 -4
  114. package/dist/codex-DKBAAUCO.js.map +1 -0
  115. package/dist/{continue-WU2IB5KS.js → continue-JHZCMSPH.js} +8 -8
  116. package/dist/continue-JHZCMSPH.js.map +1 -0
  117. package/dist/{copilot-cli-MZTAWMPW.js → copilot-cli-CLBJACQ5.js} +4 -4
  118. package/dist/copilot-cli-CLBJACQ5.js.map +1 -0
  119. package/dist/{copilot-cli-PAP377OM.js → copilot-cli-QVAU5CFM.js} +7 -7
  120. package/dist/copilot-cli-QVAU5CFM.js.map +1 -0
  121. package/dist/{crush-3AVQA4YU.js → crush-7TORBYUL.js} +7 -7
  122. package/dist/crush-7TORBYUL.js.map +1 -0
  123. package/dist/{crush-QBXLNN7T.js → crush-A5C5USRL.js} +4 -4
  124. package/dist/crush-A5C5USRL.js.map +1 -0
  125. package/dist/{cursor-DIW43TRZ.js → cursor-D5SWDVSW.js} +3 -3
  126. package/dist/cursor-D5SWDVSW.js.map +1 -0
  127. package/dist/cursor-W7I4QUFO.js +22 -0
  128. package/dist/{define-connector-LQFJL_at.d.ts → define-connector-DTWb46UB.d.ts} +1 -1
  129. package/dist/{detect-P5OA5UYM.js → detect-JHSA3G3U.js} +4 -4
  130. package/dist/detect-JHSA3G3U.js.map +1 -0
  131. package/dist/{devin-QMEM3OFA.js → devin-SSR7S4WX.js} +7 -7
  132. package/dist/devin-SSR7S4WX.js.map +1 -0
  133. package/dist/{doctor-2O2Q6MIB.js → doctor-CQJ7TZPA.js} +26 -26
  134. package/dist/doctor-CQJ7TZPA.js.map +1 -0
  135. package/dist/{droid-MOKV53J4.js → droid-45PJ7JGF.js} +7 -7
  136. package/dist/droid-45PJ7JGF.js.map +1 -0
  137. package/dist/{droid-U3ZBLQFO.js → droid-PFQ2PZSF.js} +4 -4
  138. package/dist/droid-PFQ2PZSF.js.map +1 -0
  139. package/dist/{gemini-cli-47ZHCOZR.js → gemini-cli-24PFDK7D.js} +8 -8
  140. package/dist/gemini-cli-24PFDK7D.js.map +1 -0
  141. package/dist/{gemini-cli-NMVVBO3K.js → gemini-cli-Y6RJMU24.js} +4 -4
  142. package/dist/gemini-cli-Y6RJMU24.js.map +1 -0
  143. package/dist/{goose-64V46Y2W.js → goose-K2HKUTBK.js} +4 -4
  144. package/dist/goose-K2HKUTBK.js.map +1 -0
  145. package/dist/{goose-4EI5MYTI.js → goose-U5D3LCPC.js} +9 -9
  146. package/dist/goose-U5D3LCPC.js.map +1 -0
  147. package/dist/{grok-cli-QYQPDSVB.js → grok-cli-L2MHAPBY.js} +7 -7
  148. package/dist/grok-cli-L2MHAPBY.js.map +1 -0
  149. package/dist/{hermes-F75OSK3Y.js → hermes-2S5JUTTJ.js} +7 -7
  150. package/dist/hermes-2S5JUTTJ.js.map +1 -0
  151. package/dist/{hermes-F3EGTK6N.js → hermes-MF3NX4ZY.js} +4 -4
  152. package/dist/hermes-MF3NX4ZY.js.map +1 -0
  153. package/dist/{hook-4N3BMKIK.js → hook-VHICXHXL.js} +16 -16
  154. package/dist/hook-VHICXHXL.js.map +1 -0
  155. package/dist/index.d.ts +3 -3
  156. package/dist/index.js +5 -5
  157. package/dist/{install-NPN77N3S.js → install-WLENR4KF.js} +192 -28
  158. package/dist/install-WLENR4KF.js.map +1 -0
  159. package/dist/{introspect-D4fEGuhN.d.ts → introspect-dNekqPDY.d.ts} +1 -1
  160. package/dist/{jetbrains-copilot-ZGIWI6YV.js → jetbrains-copilot-Z4FC3RM3.js} +6 -6
  161. package/dist/jetbrains-copilot-Z4FC3RM3.js.map +1 -0
  162. package/dist/{junie-DIFN2P22.js → junie-ULGJJIHB.js} +6 -6
  163. package/dist/junie-ULGJJIHB.js.map +1 -0
  164. package/dist/{kilo-SW7BH6EG.js → kilo-SMHPOHJ5.js} +4 -4
  165. package/dist/kilo-SMHPOHJ5.js.map +1 -0
  166. package/dist/{kilo-EMZJBEBB.js → kilo-WWIJOVWD.js} +8 -8
  167. package/dist/kilo-WWIJOVWD.js.map +1 -0
  168. package/dist/{kilo-cli-S3GXBPAE.js → kilo-cli-QKE2EQLS.js} +8 -8
  169. package/dist/kilo-cli-QKE2EQLS.js.map +1 -0
  170. package/dist/{kilo-cli-ZF272ZHN.js → kilo-cli-T2SRRRJS.js} +5 -5
  171. package/dist/kilo-cli-T2SRRRJS.js.map +1 -0
  172. package/dist/{kimi-IQJOIY6B.js → kimi-JMUFTVSF.js} +7 -7
  173. package/dist/kimi-JMUFTVSF.js.map +1 -0
  174. package/dist/{kimi-5FHEXGZD.js → kimi-MSIDEMCI.js} +4 -4
  175. package/dist/kimi-MSIDEMCI.js.map +1 -0
  176. package/dist/{kiro-WGOI5CGT.js → kiro-NYRRBIKW.js} +4 -4
  177. package/dist/kiro-NYRRBIKW.js.map +1 -0
  178. package/dist/{kiro-BYX4HEAJ.js → kiro-UWUCRKR3.js} +7 -7
  179. package/dist/kiro-UWUCRKR3.js.map +1 -0
  180. package/dist/{leaderboard-QKB36OBR.js → leaderboard-NJWKGMXP.js} +7 -7
  181. package/dist/leaderboard-NJWKGMXP.js.map +1 -0
  182. package/dist/{mimo-code-7R53QDHB.js → mimo-code-BPNYYIVM.js} +7 -7
  183. package/dist/mimo-code-BPNYYIVM.js.map +1 -0
  184. package/dist/{mistral-vibe-LHJ55FSB.js → mistral-vibe-LT3DAJ3L.js} +6 -6
  185. package/dist/mistral-vibe-LT3DAJ3L.js.map +1 -0
  186. package/dist/{mux-XM6AP35L.js → mux-7PIJ7HUQ.js} +4 -4
  187. package/dist/mux-7PIJ7HUQ.js.map +1 -0
  188. package/dist/{mux-NYCNGL43.js → mux-AHNUAY5Z.js} +6 -6
  189. package/dist/mux-AHNUAY5Z.js.map +1 -0
  190. package/dist/{nemoclaw-WSIPSE7U.js → nemoclaw-RE5RZASZ.js} +7 -7
  191. package/dist/nemoclaw-RE5RZASZ.js.map +1 -0
  192. package/dist/{omp-562NK5BJ.js → omp-D2EXEPH7.js} +7 -7
  193. package/dist/omp-D2EXEPH7.js.map +1 -0
  194. package/dist/{open-interpreter-I2CNOEXY.js → open-interpreter-SSGBEUKX.js} +6 -6
  195. package/dist/open-interpreter-SSGBEUKX.js.map +1 -0
  196. package/dist/openclaw-IJ33K45M.js +17 -0
  197. package/dist/{openclaw-5EQFGOWL.js → openclaw-KAFTNLR2.js} +4 -4
  198. package/dist/openclaw-KAFTNLR2.js.map +1 -0
  199. package/dist/{opencode-YS4WX2E2.js → opencode-YKUKZY3J.js} +7 -7
  200. package/dist/opencode-YKUKZY3J.js.map +1 -0
  201. package/dist/{opencode-QGP4ALQY.js → opencode-Z65JYILL.js} +4 -4
  202. package/dist/opencode-Z65JYILL.js.map +1 -0
  203. package/dist/{openhands-QMYIKNOS.js → openhands-SEZMCUC3.js} +7 -7
  204. package/dist/openhands-SEZMCUC3.js.map +1 -0
  205. package/dist/{package-Q6DV5247.js → package-JECVQEFT.js} +15 -15
  206. package/dist/package-JECVQEFT.js.map +1 -0
  207. package/dist/{pi-GGDQREVG.js → pi-DLKCPOJE.js} +4 -4
  208. package/dist/pi-DLKCPOJE.js.map +1 -0
  209. package/dist/{pi-644FIN3A.js → pi-YPYV2ULH.js} +6 -6
  210. package/dist/pi-YPYV2ULH.js.map +1 -0
  211. package/dist/{qwen-code-GQILBJ5B.js → qwen-code-26CSFDX6.js} +4 -4
  212. package/dist/qwen-code-26CSFDX6.js.map +1 -0
  213. package/dist/{qwen-code-STDMX7EM.js → qwen-code-ZHCLCYMC.js} +9 -9
  214. package/dist/qwen-code-ZHCLCYMC.js.map +1 -0
  215. package/dist/{roo-code-DLPIHHQ6.js → roo-code-7F4HYB34.js} +6 -6
  216. package/dist/roo-code-7F4HYB34.js.map +1 -0
  217. package/dist/{roo-code-SUWI4BBN.js → roo-code-HSAE2CJU.js} +4 -4
  218. package/dist/roo-code-HSAE2CJU.js.map +1 -0
  219. package/dist/runtime/index.d.ts +1 -1
  220. package/dist/runtime/index.js +14 -14
  221. package/dist/sdk/index.d.ts +4 -4
  222. package/dist/sdk/index.js +6 -6
  223. package/dist/sdk/index.js.map +1 -1
  224. package/dist/sdk/test.d.ts +2 -2
  225. package/dist/sdk/test.js +11 -11
  226. package/dist/{serve-MJTTXDX4.js → serve-LYSBH43G.js} +16 -16
  227. package/dist/serve-LYSBH43G.js.map +1 -0
  228. package/dist/{status-Q3UY4NZU.js → status-PHKKGEW5.js} +11 -11
  229. package/dist/status-PHKKGEW5.js.map +1 -0
  230. package/dist/{statusline-QF4G724E.js → statusline-ZDD4OZ4F.js} +15 -15
  231. package/dist/statusline-ZDD4OZ4F.js.map +1 -0
  232. package/dist/{synthetic-6FRA7P5Q.js → synthetic-LUT6V6SD.js} +4 -4
  233. package/dist/synthetic-LUT6V6SD.js.map +1 -0
  234. package/dist/{telemetry-JHVRDDNK.js → telemetry-HDGMI2BK.js} +10 -10
  235. package/dist/telemetry-HDGMI2BK.js.map +1 -0
  236. package/dist/{trae-CPPYASR2.js → trae-SIQI3C66.js} +4 -4
  237. package/dist/trae-SIQI3C66.js.map +1 -0
  238. package/dist/{trae-UOYD6JZZ.js → trae-Y67HSDOW.js} +6 -6
  239. package/dist/trae-Y67HSDOW.js.map +1 -0
  240. package/dist/{types-BhcUEIJJ.d.ts → types-JyhpJHJa.d.ts} +4 -2
  241. package/dist/{uninstall-H2SOV3AP.js → uninstall-RWO2GM2I.js} +21 -21
  242. package/dist/uninstall-RWO2GM2I.js.map +1 -0
  243. package/dist/{upgrade-UCSG7L5U.js → upgrade-YJCXNUEE.js} +21 -21
  244. package/dist/upgrade-YJCXNUEE.js.map +1 -0
  245. package/dist/{usage-4EGIJ4TM.js → usage-IWO4RQN6.js} +4 -4
  246. package/dist/usage-IWO4RQN6.js.map +1 -0
  247. package/dist/{usage-event-GRQE7XWT.js → usage-event-AFFKCLHE.js} +15 -15
  248. package/dist/usage-event-AFFKCLHE.js.map +1 -0
  249. package/dist/{vscode-copilot-NIMH2DGU.js → vscode-copilot-5CI5B3X6.js} +7 -7
  250. package/dist/vscode-copilot-5CI5B3X6.js.map +1 -0
  251. package/dist/{warp-NRBBJQR2.js → warp-5YBSP7FP.js} +4 -4
  252. package/dist/warp-5YBSP7FP.js.map +1 -0
  253. package/dist/{warp-QYJGKURM.js → warp-INAKVGBV.js} +6 -6
  254. package/dist/warp-INAKVGBV.js.map +1 -0
  255. package/dist/{windsurf-75LLZ37C.js → windsurf-4HM57QAY.js} +6 -6
  256. package/dist/windsurf-4HM57QAY.js.map +1 -0
  257. package/dist/{zed-XJFOOKCO.js → zed-XXCNYOIN.js} +4 -4
  258. package/dist/zed-XXCNYOIN.js.map +1 -0
  259. package/dist/{zed-HKAZXEJW.js → zed-YN5X37PQ.js} +7 -7
  260. package/dist/zed-YN5X37PQ.js.map +1 -0
  261. package/package.json +92 -88
  262. package/dist/action-VW5SACXY.js.map +0 -1
  263. package/dist/amazon-q-ETMAGY3D.js.map +0 -1
  264. package/dist/amp-67BZONGF.js.map +0 -1
  265. package/dist/amp-BQZOL5GR.js.map +0 -1
  266. package/dist/antigravity-EA4L225L.js.map +0 -1
  267. package/dist/antigravity-VXLDLTO7.js +0 -18
  268. package/dist/antigravity-cli-B2HXZFYQ.js.map +0 -1
  269. package/dist/antigravity-cli-OM6SC3PE.js.map +0 -1
  270. package/dist/chunk-2RIFORQS.js.map +0 -1
  271. package/dist/chunk-2Y2MZRLP.js.map +0 -1
  272. package/dist/chunk-4NHXLXSD.js.map +0 -1
  273. package/dist/chunk-6TF7MHG5.js.map +0 -1
  274. package/dist/chunk-6WZODR3Z.js.map +0 -1
  275. package/dist/chunk-B5W3RHTI.js.map +0 -1
  276. package/dist/chunk-BEFVJ2OE.js.map +0 -1
  277. package/dist/chunk-EHP7WISI.js.map +0 -1
  278. package/dist/chunk-FBJQGRET.js.map +0 -1
  279. package/dist/chunk-FJCUKXGX.js.map +0 -1
  280. package/dist/chunk-GZGLCCEE.js.map +0 -1
  281. package/dist/chunk-H53QZQJI.js.map +0 -1
  282. package/dist/chunk-I5TO42QC.js.map +0 -1
  283. package/dist/chunk-IVAWP6HH.js.map +0 -1
  284. package/dist/chunk-JKKU2WKG.js.map +0 -1
  285. package/dist/chunk-KHO5WNTP.js.map +0 -1
  286. package/dist/chunk-KJLFGQQM.js.map +0 -1
  287. package/dist/chunk-KSPMSRVU.js.map +0 -1
  288. package/dist/chunk-MGTDQLJJ.js.map +0 -1
  289. package/dist/chunk-MQPNU2CY.js.map +0 -1
  290. package/dist/chunk-NBYKLUF6.js.map +0 -1
  291. package/dist/chunk-NLE2J5P4.js.map +0 -1
  292. package/dist/chunk-O7SDRBVB.js.map +0 -1
  293. package/dist/chunk-OP4KBXUO.js.map +0 -1
  294. package/dist/chunk-OPXAP3AC.js.map +0 -1
  295. package/dist/chunk-P23RVIUY.js.map +0 -1
  296. package/dist/chunk-RK6VBLXP.js.map +0 -1
  297. package/dist/chunk-SILKSP2Y.js.map +0 -1
  298. package/dist/chunk-TQRLMA2C.js.map +0 -1
  299. package/dist/chunk-TTKSYJRY.js.map +0 -1
  300. package/dist/chunk-UM5S7DKK.js.map +0 -1
  301. package/dist/chunk-UMQ6NBQR.js.map +0 -1
  302. package/dist/chunk-XC5SJ35F.js.map +0 -1
  303. package/dist/chunk-XD7MY6HB.js.map +0 -1
  304. package/dist/chunk-YT43MUSJ.js.map +0 -1
  305. package/dist/chunk-Z2MRSS2I.js.map +0 -1
  306. package/dist/chunk-ZMAJ2XFD.js.map +0 -1
  307. package/dist/claude-code-DUZNOAS2.js.map +0 -1
  308. package/dist/claude-code-NMRKTAP7.js.map +0 -1
  309. package/dist/cline-25KW25IN.js.map +0 -1
  310. package/dist/codebuddy-ZNYQACMF.js.map +0 -1
  311. package/dist/codebuff-ETYT5UBL.js.map +0 -1
  312. package/dist/codebuff-VR6JUDIY.js.map +0 -1
  313. package/dist/codex-CPNKTXG3.js.map +0 -1
  314. package/dist/codex-YAORPCOD.js.map +0 -1
  315. package/dist/continue-WU2IB5KS.js.map +0 -1
  316. package/dist/copilot-cli-MZTAWMPW.js.map +0 -1
  317. package/dist/copilot-cli-PAP377OM.js.map +0 -1
  318. package/dist/crush-3AVQA4YU.js.map +0 -1
  319. package/dist/crush-QBXLNN7T.js.map +0 -1
  320. package/dist/cursor-DIW43TRZ.js.map +0 -1
  321. package/dist/cursor-GSLUET3V.js +0 -22
  322. package/dist/detect-P5OA5UYM.js.map +0 -1
  323. package/dist/devin-QMEM3OFA.js.map +0 -1
  324. package/dist/doctor-2O2Q6MIB.js.map +0 -1
  325. package/dist/droid-MOKV53J4.js.map +0 -1
  326. package/dist/droid-U3ZBLQFO.js.map +0 -1
  327. package/dist/gemini-cli-47ZHCOZR.js.map +0 -1
  328. package/dist/gemini-cli-NMVVBO3K.js.map +0 -1
  329. package/dist/goose-4EI5MYTI.js.map +0 -1
  330. package/dist/goose-64V46Y2W.js.map +0 -1
  331. package/dist/grok-cli-QYQPDSVB.js.map +0 -1
  332. package/dist/hermes-F3EGTK6N.js.map +0 -1
  333. package/dist/hermes-F75OSK3Y.js.map +0 -1
  334. package/dist/hook-4N3BMKIK.js.map +0 -1
  335. package/dist/install-NPN77N3S.js.map +0 -1
  336. package/dist/jetbrains-copilot-ZGIWI6YV.js.map +0 -1
  337. package/dist/junie-DIFN2P22.js.map +0 -1
  338. package/dist/kilo-EMZJBEBB.js.map +0 -1
  339. package/dist/kilo-SW7BH6EG.js.map +0 -1
  340. package/dist/kilo-cli-S3GXBPAE.js.map +0 -1
  341. package/dist/kilo-cli-ZF272ZHN.js.map +0 -1
  342. package/dist/kimi-5FHEXGZD.js.map +0 -1
  343. package/dist/kimi-IQJOIY6B.js.map +0 -1
  344. package/dist/kiro-BYX4HEAJ.js.map +0 -1
  345. package/dist/kiro-WGOI5CGT.js.map +0 -1
  346. package/dist/leaderboard-QKB36OBR.js.map +0 -1
  347. package/dist/mimo-code-7R53QDHB.js.map +0 -1
  348. package/dist/mistral-vibe-LHJ55FSB.js.map +0 -1
  349. package/dist/mux-NYCNGL43.js.map +0 -1
  350. package/dist/mux-XM6AP35L.js.map +0 -1
  351. package/dist/nemoclaw-WSIPSE7U.js.map +0 -1
  352. package/dist/omp-562NK5BJ.js.map +0 -1
  353. package/dist/open-interpreter-I2CNOEXY.js.map +0 -1
  354. package/dist/openclaw-5EQFGOWL.js.map +0 -1
  355. package/dist/openclaw-7EYBQS4R.js +0 -17
  356. package/dist/opencode-QGP4ALQY.js.map +0 -1
  357. package/dist/opencode-YS4WX2E2.js.map +0 -1
  358. package/dist/openhands-QMYIKNOS.js.map +0 -1
  359. package/dist/package-Q6DV5247.js.map +0 -1
  360. package/dist/pi-644FIN3A.js.map +0 -1
  361. package/dist/pi-GGDQREVG.js.map +0 -1
  362. package/dist/qwen-code-GQILBJ5B.js.map +0 -1
  363. package/dist/qwen-code-STDMX7EM.js.map +0 -1
  364. package/dist/roo-code-DLPIHHQ6.js.map +0 -1
  365. package/dist/roo-code-SUWI4BBN.js.map +0 -1
  366. package/dist/serve-MJTTXDX4.js.map +0 -1
  367. package/dist/status-Q3UY4NZU.js.map +0 -1
  368. package/dist/statusline-QF4G724E.js.map +0 -1
  369. package/dist/synthetic-6FRA7P5Q.js.map +0 -1
  370. package/dist/telemetry-JHVRDDNK.js.map +0 -1
  371. package/dist/trae-CPPYASR2.js.map +0 -1
  372. package/dist/trae-UOYD6JZZ.js.map +0 -1
  373. package/dist/uninstall-H2SOV3AP.js.map +0 -1
  374. package/dist/upgrade-UCSG7L5U.js.map +0 -1
  375. package/dist/usage-4EGIJ4TM.js.map +0 -1
  376. package/dist/usage-event-GRQE7XWT.js.map +0 -1
  377. package/dist/vscode-copilot-NIMH2DGU.js.map +0 -1
  378. package/dist/warp-NRBBJQR2.js.map +0 -1
  379. package/dist/warp-QYJGKURM.js.map +0 -1
  380. package/dist/windsurf-75LLZ37C.js.map +0 -1
  381. package/dist/zed-HKAZXEJW.js.map +0 -1
  382. package/dist/zed-XJFOOKCO.js.map +0 -1
  383. /package/dist/{antigravity-VXLDLTO7.js.map → antigravity-TWIWXTQH.js.map} +0 -0
  384. /package/dist/{cursor-GSLUET3V.js.map → cursor-W7I4QUFO.js.map} +0 -0
  385. /package/dist/{openclaw-7EYBQS4R.js.map → openclaw-IJ33K45M.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/usage/readers/antigravity-cli.ts"],"sourcesContent":["/**\r\n * usage/readers/antigravity-cli — Antigravity CLI (`agy`) usage reader (SYNCED).\r\n *\r\n * CONFIRMED-BY-INSTALL (2026-06-03, docs/research/antigravity-paths-confirmed.md):\r\n * the `agy` CLI v1.0.0 has NO separate config/storage dir — it SHARES the IDE's\r\n * `~/.gemini/antigravity/` tree, whose native conversation store is\r\n * `conversations/<uuid>.pb` (PROTOBUF, no public schema) with `brain/<uuid>/`\r\n * holding only media + `*.metadata.json`. There are NO `transcript*.jsonl` files\r\n * and NO separate `~/.gemini/antigravity-cli/` dir. The earlier \"read native\r\n * brain transcript*.jsonl with usage_metadata\" approach targeted a non-existent\r\n * shape.\r\n *\r\n * So this reader does NOT attempt to parse `.pb` (no schema). Like the IDE reader\r\n * (and the other SYNCED platforms cursor/trae/warp), it reads only the tokscale\r\n * synced-cache if a separate tokscale run already produced one; otherwise it\r\n * returns [] and the scan layer reports \"requires sync (no local cache found)\"\r\n * — i.e. the native store is protobuf (.pb), not readable.\r\n *\r\n * The native `~/.gemini/antigravity/` dir (shared with the IDE) is used ONLY for\r\n * platform detection (in the adapter), NOT for usage parsing here. Cached rows\r\n * carry real host token counts → \"host-reported\".\r\n *\r\n * Fail-open: no cache → []; unreadable/malformed file or line → skipped; we NEVER\r\n * touch `.pb` protobuf.\r\n */\r\n\r\nimport { existsSync } from \"node:fs\";\r\nimport { join } from \"node:path\";\r\n\r\nimport type { UsageReader, UsageRecord } from \"../types.js\";\r\nimport { emptyTokens } from \"../aggregate.js\";\r\nimport { readJsonlLines } from \"../jsonl.js\";\r\nimport { inferProvider } from \"../normalize.js\";\r\nimport { firstExistingRoot, isDir, walkFiles } from \"../paths.js\";\r\nimport { nonEmptyStr, resolveAlias, toSafeInt } from \"./antigravity-shared.js\";\r\n\r\nconst PLATFORM_ID = \"antigravity-cli\" as const;\r\nconst DEFAULT_MODEL = \"unknown\";\r\nconst DEFAULT_PROVIDER = \"antigravity\";\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// TOKSCALE CACHE — same line schema as the IDE reader\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/** Fields we read off a tokscale-cache Antigravity JSONL line (all optional). */\r\ninterface AntigravityLine {\r\n type?: unknown;\r\n modelId?: unknown;\r\n providerId?: unknown;\r\n sessionId?: unknown;\r\n timestamp?: unknown;\r\n input?: unknown;\r\n output?: unknown;\r\n cacheRead?: unknown;\r\n cacheWrite?: unknown;\r\n reasoning?: unknown;\r\n responseId?: unknown;\r\n}\r\n\r\n/** Parse one tokscale-cache JSONL file into usage records (session_meta + usage rows). */\r\nfunction parseCacheFile(path: string): UsageRecord[] {\r\n const lines = readJsonlLines(path);\r\n if (lines.length === 0) return [];\r\n\r\n const out: UsageRecord[] = [];\r\n let sessionModel: string | undefined;\r\n\r\n for (const raw of lines) {\r\n if (typeof raw !== \"object\" || raw === null) continue;\r\n const line = raw as AntigravityLine;\r\n\r\n const rowType = typeof line.type === \"string\" ? line.type : \"\";\r\n if (rowType === \"session_meta\") {\r\n const meta = nonEmptyStr(line.modelId);\r\n if (meta !== undefined) sessionModel = meta;\r\n continue;\r\n }\r\n if (rowType !== \"usage\") continue;\r\n\r\n const record = parseCacheUsageRow(line, sessionModel);\r\n if (record !== undefined) out.push(record);\r\n }\r\n\r\n return out;\r\n}\r\n\r\n/** Build a UsageRecord from a \"usage\" line, or undefined when invalid/empty. */\r\nfunction parseCacheUsageRow(line: AntigravityLine, fallbackModel: string | undefined): UsageRecord | undefined {\r\n const sessionId = nonEmptyStr(line.sessionId);\r\n if (sessionId === undefined) return undefined;\r\n\r\n const timestamp = toSafeInt(line.timestamp);\r\n if (timestamp <= 0) return undefined;\r\n\r\n const rawModel = nonEmptyStr(line.modelId) ?? fallbackModel ?? DEFAULT_MODEL;\r\n const modelId = resolveAlias(rawModel) ?? rawModel;\r\n const providerId = nonEmptyStr(line.providerId) ?? inferProvider(modelId) ?? DEFAULT_PROVIDER;\r\n\r\n const input = toSafeInt(line.input);\r\n const output = toSafeInt(line.output);\r\n const cacheRead = toSafeInt(line.cacheRead);\r\n const cacheWrite = toSafeInt(line.cacheWrite);\r\n const reasoning = toSafeInt(line.reasoning);\r\n if (input === 0 && output === 0 && cacheRead === 0 && cacheWrite === 0 && reasoning === 0) {\r\n return undefined;\r\n }\r\n\r\n const tokens = emptyTokens();\r\n tokens.input = input;\r\n tokens.output = output;\r\n tokens.cacheRead = cacheRead;\r\n tokens.cacheWrite = cacheWrite;\r\n tokens.reasoning = reasoning;\r\n\r\n const record: UsageRecord = {\r\n platformId: PLATFORM_ID,\r\n modelId,\r\n providerId,\r\n sessionId,\r\n tokens,\r\n ts: timestamp,\r\n messageCount: 1,\r\n confidence: \"host-reported\",\r\n };\r\n const dedupKey = nonEmptyStr(line.responseId);\r\n if (dedupKey !== undefined) record.dedupKey = dedupKey;\r\n return record;\r\n}\r\n\r\n/** Collect tokscale-cache records (sessions/*.jsonl under the cache root). */\r\nfunction readTokscaleCache(): UsageRecord[] {\r\n const cacheRoot = firstExistingRoot(PLATFORM_ID);\r\n if (cacheRoot === undefined) return [];\r\n\r\n const files = new Set<string>();\r\n const sessionsDir = join(cacheRoot, \"sessions\");\r\n if (isDir(sessionsDir)) {\r\n for (const f of walkFiles(sessionsDir, (name) => name.endsWith(\".jsonl\"))) files.add(f);\r\n }\r\n // Also tolerate loose *.jsonl directly under the cache root.\r\n for (const f of walkFiles(cacheRoot, (name) => name.endsWith(\".jsonl\"))) files.add(f);\r\n\r\n if (files.size === 0) return [];\r\n\r\n const out: UsageRecord[] = [];\r\n for (const file of files) {\r\n if (!existsSync(file)) continue;\r\n for (const row of parseCacheFile(file)) out.push(row);\r\n }\r\n return out;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Reader\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * The Antigravity CLI usage reader singleton (SYNCED). `agy` shares the IDE's\r\n * protobuf (.pb) native store with no public schema → not parseable; we read only\r\n * the tokscale synced-cache if present, else [] (scan reports \"requires sync\").\r\n */\r\nconst antigravityCliReader: UsageReader = {\r\n platformId: PLATFORM_ID,\r\n kind: \"synced\",\r\n async read({ sinceMs }: { sinceMs?: number }): Promise<UsageRecord[]> {\r\n let cacheRows: UsageRecord[];\r\n try {\r\n cacheRows = readTokscaleCache();\r\n } catch {\r\n cacheRows = []; // fail-open\r\n }\r\n\r\n const records: UsageRecord[] = [];\r\n for (const row of cacheRows) {\r\n if (sinceMs !== undefined && row.ts < sinceMs) continue;\r\n records.push(row);\r\n }\r\n return records;\r\n },\r\n};\r\n\r\nexport default antigravityCliReader;\r\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  AntigravityAdapter,
4
4
  adapter
5
- } from "./chunk-XC5SJ35F.js";
5
+ } from "./chunk-C63AAXK7.js";
6
6
  import {
7
7
  addLedgerOwner,
8
8
  createLedgerEntry,
@@ -15,16 +15,16 @@ import {
15
15
  loadConfigPatchLedger,
16
16
  removeLedgerOwner,
17
17
  saveConfigPatchLedger
18
- } from "./chunk-NBYKLUF6.js";
19
- import "./chunk-H53QZQJI.js";
20
- import "./chunk-BEFVJ2OE.js";
21
- import "./chunk-MGTDQLJJ.js";
18
+ } from "./chunk-KFPSJRHR.js";
19
+ import "./chunk-PSGTHJQU.js";
20
+ import "./chunk-XXLCMSD3.js";
21
+ import "./chunk-3FINQ2ZF.js";
22
22
  import {
23
23
  buildHomeBinStatuslineCommand,
24
24
  isHomeBinStatuslineCommand
25
- } from "./chunk-4NHXLXSD.js";
26
- import "./chunk-UMQ6NBQR.js";
27
- import "./chunk-GZGLCCEE.js";
25
+ } from "./chunk-Y3K6KJMS.js";
26
+ import "./chunk-ILWHLGIC.js";
27
+ import "./chunk-QYOUQCC6.js";
28
28
 
29
29
  // src/adapters/antigravity-cli/index.ts
30
30
  import { existsSync } from "fs";
@@ -464,4 +464,4 @@ export {
464
464
  adapter2 as adapter,
465
465
  antigravity_cli_default as default
466
466
  };
467
- //# sourceMappingURL=antigravity-cli-OM6SC3PE.js.map
467
+ //# sourceMappingURL=antigravity-cli-MPE27LPI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/antigravity-cli/index.ts"],"sourcesContent":["/**\r\n * adapters/antigravity-cli — Google Antigravity CLI (`agy`) platform adapter.\r\n *\r\n * Antigravity ships in two distinct runtimes that share the Gemini-family\r\n * `~/.gemini` tree and ALL of the same native formats (the JSON `mcp_config.json`\r\n * shape, the `hooks.json` lifecycle-hook shape, markdown Workflows, and Agent\r\n * Skills `SKILL.md`): the IDE/desktop app (the parent `AntigravityAdapter`,\r\n * id \"antigravity\") and this standalone CLI binary `agy` (id \"antigravity-cli\").\r\n *\r\n * This adapter is a thin fork of the IDE adapter. It REUSES every render / hook /\r\n * parse / surface path from {@link AntigravityAdapter} unchanged — the only\r\n * differences are identity and detection:\r\n *\r\n * - id = \"antigravity-cli\", name = \"Antigravity CLI\". Identity flows into the\r\n * universal hook command (`<homeBin> hook antigravity-cli <event> …`) and the\r\n * `hostPlatform` stamp, so a CLI-installed hook dispatches back to THIS\r\n * adapter at runtime — the reason the parent's install/parse logic was made\r\n * to read `this.id` rather than a fixed host constant.\r\n * - Detection probes the `agy` binary at ~/.local/bin/agy and/or the SHARED\r\n * ~/.gemini/antigravity/ presence (distinct runtime markers from the IDE).\r\n *\r\n * CONFIRMED-BY-INSTALL (2026-06-03, docs/research/antigravity-paths-confirmed.md):\r\n * the `agy` CLI v1.0.0 has NO separate config dir — `~/.gemini/antigravity-cli/`,\r\n * `~/.config/antigravity*`, and `~/.agy` are ALL ABSENT. `agy` SHARES the IDE's\r\n * `~/.gemini/antigravity/` tree (mcp_config.json, hooks.json, workflows, skills).\r\n * So the user-scope config resolution here is IDENTICAL to the IDE adapter (the\r\n * inherited USER_CONFIG_CANDIDATES) — installing both the IDE and CLI connectors\r\n * therefore writes the SAME files and is idempotent (observed as skip), which is\r\n * expected and correct. `agy`'s own extension surface is the `agy plugin` system\r\n * (install/uninstall/list/enable/disable) — future work would deploy as an agy\r\n * plugin; for now the MCP/workflows/skills surfaces ride the shared IDE files.\r\n *\r\n * LIVE-TEST RESOLUTION (2026-06-04, real `agy` v1.0.5 login + spawn): the prior\r\n * \"shares the IDE's ~/.gemini/antigravity/ file\" claim was WRONG for the CLI. The\r\n * standalone `agy` reads user MCP from **~/.gemini/config/mcp_config.json**\r\n * (root key `mcpServers`; project scope <proj>/.agents/mcp_config.json) — PROVEN:\r\n * a live `agy -p` session spawned an MCP server placed in `config/` and completed\r\n * a real initialize+tools/list+tools/call handshake; a negative control in\r\n * `antigravity/` was ignored. The binary carries \"failed to read mcp_config.json\"\r\n * + a literal \"/.gemini/config\" path; there is NO `--mcp-config` flag and `agy\r\n * mcp` is TUI-only. So this adapter now OVERRIDES userConfigCandidates to prefer\r\n * `~/.gemini/config/mcp_config.json` (canonical) over the inherited IDE\r\n * `antigravity/` default (kept as a prefer-existing fallback). Telemetry-wrap is\r\n * compatible: agy spawns command+args verbatim, so the home-bin serve wrapper is\r\n * spawned as written — i.e. a real agy session now emits a per-MCP telemetry row.\r\n * (agy also keeps its own home ~/.gemini/antigravity-cli/ for auth/state, but MCP\r\n * config lives in the shared ~/.gemini/config/.)\r\n *\r\n * Project scope is IDENTICAL to the IDE adapter (`<proj>/.agents/…`), as is every\r\n * hook/command/skill render and the runtime parse/format — all inherited.\r\n *\r\n * The user-scope config paths shared with the IDE (hooks.json + the global skills\r\n * dir) remain MEDIUM-CONFIDENCE / PATH-PROBED in the parent (not present on the\r\n * observed install) and surfaced by the doctor; user-scope mcp_config + workflows\r\n * are CONFIRMED at ~/.gemini/antigravity/.\r\n *\r\n * STATUSLINE SURFACE (LIVE-VERIFIED 2026-06-21, agy v1.0.10): the `agy` CLI ships\r\n * a first-party custom status line — `/statusline <command>` configures a shell\r\n * command that agy execs on each refresh, piping a JSON status payload on stdin.\r\n * The config is persisted in the GLOBAL `~/.gemini/antigravity-cli/settings.json`\r\n * under the top-level `statusLine` key, value shape `{ enabled: true, command }`\r\n * — NOT claude-code's `{ type:\"command\", command }` and NOT qwen-code's nested\r\n * `ui.statusLine`. This was confirmed by a real headless `agy -p` turn with the\r\n * statusLine command pointed at a stdin-logging script: the captured payload is\r\n * { cwd, session_id, conversation_id, transcript_path,\r\n * model:{ id, display_name },\r\n * workspace:{ current_dir, project_dir },\r\n * version,\r\n * context_window:{ total_input_tokens, total_output_tokens,\r\n * context_window_size, used_percentage,\r\n * remaining_percentage,\r\n * current_usage:{ input_tokens, output_tokens, … } },\r\n * exceeds_200k_tokens, product, quota, agent_state, vcs, sandbox,\r\n * plan_tier, email, terminal_width }\r\n * Only the antigravity-cli FORK wires this (the IDE app's payload is not verified),\r\n * so the CLI adapter overrides `capabilities` to add `supportsStatusline: true`\r\n * and the statusline parse/format/install/uninstall here — every other path stays\r\n * inherited from {@link AntigravityAdapter}.\r\n */\r\n\r\nimport { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\n\r\nimport { AntigravityAdapter, adapter as antigravityIdeAdapter } from \"../antigravity/index.js\";\r\nimport type { Adapter, HookReply, InstallContext } from \"../spi.js\";\r\nimport type {\r\n ChangeRecord,\r\n DetectedPlatform,\r\n HealthCheck,\r\n HookEventName,\r\n JsonValue,\r\n PlatformCapabilities,\r\n PlatformId,\r\n StatuslineContext,\r\n} from \"../../core/types.js\";\r\nimport {\r\n buildHomeBinStatuslineCommand,\r\n isHomeBinStatuslineCommand,\r\n} from \"../../core/spawn.js\";\r\nimport {\r\n type ConfigPatchLedgerEntry,\r\n addLedgerOwner,\r\n createLedgerEntry,\r\n describeJsonValue,\r\n dropLedgerEntry,\r\n findLedgerEntry,\r\n hashJsonValue,\r\n jsonDeepEquals,\r\n ledgerEntriesOwnedBy,\r\n loadConfigPatchLedger,\r\n removeLedgerOwner,\r\n saveConfigPatchLedger,\r\n} from \"../../core/config-patch-ledger.js\";\r\n\r\nconst HOST: PlatformId = \"antigravity-cli\";\r\n\r\n/**\r\n * settings.json key the statusline surface owns on `agy`. The agy CLI stores its\r\n * custom status line under the TOP-LEVEL `statusLine` key (a single segment —\r\n * unlike qwen-code's nested `ui.statusLine`). LIVE-VERIFIED against agy v1.0.10\r\n * (binary StatusLineConfig JSON tags `statusLine`/`command`/`enabled`; a real turn\r\n * accepted and fired this shape). We own the `statusLine` leaf via the SAME\r\n * refcounted ownership ledger as configPatch — never clobbering a `statusLine` a\r\n * user (or another tool) already set.\r\n */\r\nconst STATUSLINE_KEY = \"statusLine\";\r\n\r\n/**\r\n * The `agy` statusLine custom-command stdin payload (the documented status-line\r\n * input agy pipes on stdin, read once). Every field optional — a refresh only\r\n * carries what the host knows. LIVE-CAPTURED (agy v1.0.10, 2026-06-21). Unmodeled\r\n * fields (version, agent_state, vcs, plan_tier, quota, product, email,\r\n * terminal_width) stay in StatuslineContext.raw.\r\n *\r\n * NOTE the divergence from qwen-code: agy's `context_window.current_usage` is an\r\n * OBJECT (`{ input_tokens, output_tokens, … }`), NOT a number — so used tokens are\r\n * derived from the top-level `total_input_tokens + total_output_tokens`, and the\r\n * percent from `used_percentage`.\r\n */\r\ninterface AgyStatuslineInput {\r\n cwd?: string;\r\n session_id?: string;\r\n conversation_id?: string;\r\n transcript_path?: string;\r\n version?: string;\r\n model?: { id?: string; display_name?: string };\r\n workspace?: { current_dir?: string; project_dir?: string };\r\n context_window?: {\r\n total_input_tokens?: number;\r\n total_output_tokens?: number;\r\n context_window_size?: number;\r\n used_percentage?: number;\r\n remaining_percentage?: number;\r\n current_usage?: {\r\n input_tokens?: number;\r\n output_tokens?: number;\r\n cache_creation_input_tokens?: number;\r\n cache_read_input_tokens?: number;\r\n };\r\n };\r\n}\r\n\r\nexport class AntigravityCliAdapter extends AntigravityAdapter implements Adapter {\r\n override readonly id: PlatformId = HOST;\r\n override readonly name = \"Antigravity CLI\";\r\n\r\n /**\r\n * Capabilities = the inherited IDE surface, with the two CLI-specific\r\n * divergences applied on top:\r\n *\r\n * - `supportsStatusline: true` — the `agy` custom status line, live-verified\r\n * above (the IDE app does NOT advertise statusline; its payload is unverified).\r\n * - `sessionStart: false` — the `agy` CLI does NOT recognize a SessionStart\r\n * hook. LIVE-VERIFIED (agy): the binary's recognized hook events are exactly\r\n * PreToolUse / PostToolUse / PreInvocation / PostInvocation / Stop — the\r\n * `/hooks` UI lists only those five and writing both SessionStart + PreToolUse\r\n * into hooks.json loads ONLY PreToolUse. Declaring SessionStart on the IDE\r\n * `antigravity` adapter is left UNCHANGED (this finding is agy-CLI-specific\r\n * and was NOT verified for the IDE app). This flag is the source of truth for\r\n * the docs hooks-matrix + the fleet-wide never-silent-drop contract; the\r\n * matching install-time warn-skip is driven by {@link supportedHookEvents}.\r\n *\r\n * Everything else is spread from the IDE adapter's own capabilities so the two\r\n * surfaces stay in lock-step (a parent field added later flows in automatically).\r\n * `super.capabilities` is unusable here: the parent's `capabilities` is an\r\n * instance FIELD (not on the prototype), so it resolves to undefined in a\r\n * subclass field initializer — spread the IDE singleton instead.\r\n */\r\n override readonly capabilities: PlatformCapabilities = {\r\n ...antigravityIdeAdapter.capabilities,\r\n supportsStatusline: true,\r\n sessionStart: false,\r\n };\r\n\r\n /**\r\n * The hook events the `agy` CLI actually recognizes. LIVE-VERIFIED: agy's hook\r\n * event tokens are exactly PreToolUse / PostToolUse / PreInvocation /\r\n * PostInvocation / Stop — confirmed by the `/hooks` UI listing only those five,\r\n * by the binary's hook-event tokens, and by agy loading ONLY PreToolUse when\r\n * both SessionStart + PreToolUse are written into hooks.json. SessionStart is\r\n * therefore DROPPED: a declared SessionStart hook warn-skips at install rather\r\n * than writing an inert hooks.json entry that never loads / never fires / never\r\n * shows in `/hooks`. NOTE: PreInvocation / PostInvocation are agy-only events\r\n * with no canonical AC analog — left unmapped here (a possible future\r\n * nativeHooks enhancement, NOT this fix). This narrows the IDE's\r\n * {@link AntigravityAdapter.supportedHookEvents} (which still includes\r\n * SessionStart for the IDE app, where this finding was not verified).\r\n */\r\n private static readonly CLI_SUPPORTED_EVENTS: ReadonlySet<HookEventName> =\r\n new Set<HookEventName>([\"PreToolUse\", \"PostToolUse\", \"Stop\"]);\r\n\r\n protected override supportedHookEvents(): ReadonlySet<HookEventName> {\r\n return AntigravityCliAdapter.CLI_SUPPORTED_EVENTS;\r\n }\r\n\r\n // ── Detection ────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Probe the CLI's runtime markers, DISTINCT from the IDE app even though the\r\n * two share `~/.gemini/antigravity/`: the `agy` binary at ~/.local/bin/agy\r\n * (the definitive CLI marker, CONFIRMED present) and the shared\r\n * ~/.gemini/antigravity/ tree (or a user-scope mcp_config candidate / the\r\n * project config). Reported before the IDE adapter in the registry so the\r\n * more-specific CLI marker (the `agy` binary) wins host detection. Note: a\r\n * machine with ONLY the IDE (no `agy` binary) will not match here, while one\r\n * with the CLI matches on the binary regardless of the shared config dir.\r\n */\r\n override detectInstalled(projectDir: string): DetectedPlatform {\r\n const home = homedir();\r\n const userConfig = this.resolveUserConfigPath();\r\n const agyBin = join(home, \".local\", \"bin\", \"agy\");\r\n const sharedDir = join(home, \".gemini\", \"antigravity\");\r\n const projectConfig = join(projectDir, \".agents\", \"mcp_config.json\");\r\n\r\n // The `agy` binary is the definitive CLI marker. The shared antigravity dir\r\n // and the user-scope mcp_config candidates are secondary signals (they also\r\n // match a pure-IDE install, so the binary is what truly distinguishes the CLI).\r\n const cliMarker = existsSync(agyBin);\r\n const userInstalled =\r\n cliMarker ||\r\n existsSync(sharedDir) ||\r\n this.userConfigCandidates().some((parts) => existsSync(join(home, ...parts)));\r\n const projInstalled = existsSync(projectConfig);\r\n const installed = userInstalled || projInstalled;\r\n\r\n // Report the scope/path that actually matched, so a project-only install\r\n // isn't misreported as a (non-existent) user install.\r\n const scope = projInstalled && !userInstalled ? \"project\" : \"user\";\r\n const configPath = scope === \"project\" ? projectConfig : userConfig;\r\n\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n installed,\r\n paradigm: this.paradigm,\r\n capabilities: this.capabilities,\r\n configPath,\r\n scope,\r\n reason: installed\r\n ? scope === \"project\"\r\n ? `found project Antigravity CLI config at ${projectConfig}`\r\n : `found Antigravity CLI (agy) at ${agyBin} / shared ${sharedDir}`\r\n : `no Antigravity CLI install at ${agyBin}, ${sharedDir}, or ${projectConfig}`,\r\n // The `agy` binary is a high-confidence CLI marker; matching only the shared\r\n // config dir is weaker (it could be a pure-IDE install).\r\n confidence: cliMarker ? \"high\" : installed ? \"medium\" : \"low\",\r\n };\r\n }\r\n\r\n /**\r\n * MCP user-config path — LIVE-PROVEN for `agy` v1.0.5 (2026-06-04). The\r\n * standalone CLI reads user MCP servers from `~/.gemini/config/mcp_config.json`\r\n * (root key `mcpServers`), NOT the IDE's `~/.gemini/antigravity/mcp_config.json`:\r\n * a real `agy -p` session spawned an MCP server ONLY when it was placed in\r\n * `config/` (negative control: a server in `antigravity/` was ignored), and the\r\n * binary carries the error string \"failed to read mcp_config.json\" + a literal\r\n * \"/.gemini/config\" path. `agy mcp` is TUI-only (no headless add) and there is\r\n * no `--mcp-config` flag. So the CLI must PREFER `config/` over the inherited\r\n * `antigravity/` default; the IDE path stays as a prefer-existing fallback.\r\n * (Skills/workflows/hooks dirs remain inherited; project scope\r\n * `<proj>/.agents/mcp_config.json` is already correct and live-proven.)\r\n */\r\n private static readonly CLI_USER_CONFIG_CANDIDATES = [\r\n [\".gemini\", \"config\", \"mcp_config.json\"], // CONFIRMED canonical for agy v1.0.5\r\n [\".gemini\", \"antigravity\", \"mcp_config.json\"], // legacy IDE layout (prefer-existing)\r\n ] as const;\r\n\r\n protected override userConfigCandidates(): ReadonlyArray<readonly string[]> {\r\n return AntigravityCliAdapter.CLI_USER_CONFIG_CANDIDATES;\r\n }\r\n\r\n // ── Statusline surface (the `agy` custom status line) ─────────────────────\r\n // Wires settings.json `statusLine` = { enabled:true, command:<home-bin\r\n // statusline cmd> } through the SAME refcounted ownership ledger as configPatch\r\n // (the ledger primitives are surface-agnostic). antigravity-cli does NOT\r\n // advertise supportsConfigPatch, so — like qwen-code — this adapter performs the\r\n // set-if-absent write directly with the exported ledger primitives. Semantics\r\n // are identical to claude-code/qwen-code: never clobber a `statusLine`\r\n // agent-connector does not own (skip-warn), record prior state + owner\r\n // (refcounted across connectors), reversible by uninstallStatusline\r\n // (last-owner-verified delete).\r\n //\r\n // The home-bin command makes agy exec\r\n // `<homeBin> statusline antigravity-cli --connector <id>` on every refresh,\r\n // which re-imports the connector module and renders the line (runtime/\r\n // statusline-entrypoint). The status line lives in the GLOBAL\r\n // ~/.gemini/antigravity-cli/settings.json (agy has no project-scope statusLine),\r\n // so this surface is user-scope regardless of the install scope. No telemetry\r\n // in v1.\r\n\r\n /**\r\n * The `agy` settings.json that holds the statusLine config. LIVE-VERIFIED at\r\n * ~/.gemini/antigravity-cli/settings.json (the CLI's own global home — distinct\r\n * from the shared ~/.gemini/config/mcp_config.json the MCP surface writes). agy\r\n * stores statusLine as a GLOBAL UI setting with no project-scope variant, so the\r\n * path is scope-independent.\r\n */\r\n private statuslineSettingsPath(): string {\r\n return join(homedir(), \".gemini\", \"antigravity-cli\", \"settings.json\");\r\n }\r\n\r\n /** The statusLine config value agent-connector writes at `statusLine`. */\r\n private statuslineValue(ctx: InstallContext): JsonValue {\r\n const command = buildHomeBinStatuslineCommand(ctx.homeBinPath, HOST, ctx.connector.id);\r\n return { enabled: true, command };\r\n }\r\n\r\n override installStatusline(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.statusline == null) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no statusline\" }];\r\n }\r\n if (connector.platforms[HOST]?.statusline === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: `statusline disabled for ${HOST}` }];\r\n }\r\n\r\n const filePath = this.statuslineSettingsPath();\r\n const symlink = this.symlinkPathWarning(filePath);\r\n if (symlink) return [symlink];\r\n\r\n // OVERWRITE GUARD (upsertServerInJson precedent): never round-trip a\r\n // present-but-unparseable settings file into `{}`.\r\n if (this.isPresentButUnparseable(filePath)) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n path: filePath,\r\n detail: `existing ${filePath} is not parseable; statusline left unapplied (back it up / fix it, then re-run)`,\r\n },\r\n ];\r\n }\r\n const settings = this.readJson<Record<string, unknown>>(filePath) ?? {};\r\n if (typeof settings !== \"object\" || Array.isArray(settings)) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n path: filePath,\r\n detail: `existing ${filePath} is not a JSON object; statusline left unapplied`,\r\n },\r\n ];\r\n }\r\n\r\n const ledger = loadConfigPatchLedger(ctx.dataRoot);\r\n const desired = this.statuslineValue(ctx);\r\n const leaf = settings[STATUSLINE_KEY];\r\n const entry = findLedgerEntry(ledger, HOST, filePath, STATUSLINE_KEY);\r\n const changes: ChangeRecord[] = [];\r\n\r\n if (leaf === undefined) {\r\n // SET-IF-ABSENT: the one write path.\r\n settings[STATUSLINE_KEY] = desired;\r\n this.writeJson(filePath, settings, ctx.dryRun);\r\n if (entry) {\r\n // Stale ledger row (key deleted out from under us): re-assert the value,\r\n // keep existing owners (they still rely on the key), record what we wrote.\r\n entry.writtenValue = desired;\r\n entry.writtenValueHash = hashJsonValue(desired);\r\n addLedgerOwner(entry, connector.id, connector.version);\r\n } else {\r\n createLedgerEntry(ledger, {\r\n platform: HOST,\r\n file: filePath,\r\n key: STATUSLINE_KEY,\r\n value: desired,\r\n connectorId: connector.id,\r\n connectorVersion: connector.version,\r\n });\r\n }\r\n if (!ctx.dryRun) saveConfigPatchLedger(ctx.dataRoot, ledger);\r\n changes.push({\r\n platform: this.id,\r\n action: \"create\",\r\n path: filePath,\r\n detail: `statusline ${STATUSLINE_KEY}: <absent> → ${describeJsonValue(desired)}`,\r\n });\r\n return changes;\r\n }\r\n\r\n // Key PRESENT — never overwrite; the only question is ownership/refcount.\r\n const leafValue = leaf as JsonValue;\r\n if (!entry) {\r\n // User- (or other-tool-) owned. No ownership is taken even when the values\r\n // happen to match — uninstall must never delete a key we did not create.\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n path: filePath,\r\n detail:\r\n `statusline ${STATUSLINE_KEY} skipped: already set to ${describeJsonValue(leafValue)} ` +\r\n `(not created by agent-connector) — left untouched`,\r\n },\r\n ];\r\n }\r\n\r\n if (!jsonDeepEquals(leafValue, entry.writtenValue)) {\r\n // DRIFT: the user edited the value after we wrote it. Never revert.\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n path: filePath,\r\n detail:\r\n `statusline ${STATUSLINE_KEY}: value changed since install ` +\r\n `(current ${describeJsonValue(leafValue)}, wrote ${describeJsonValue(entry.writtenValue)}); ` +\r\n `leaving in place`,\r\n },\r\n ];\r\n }\r\n\r\n if (jsonDeepEquals(desired, leafValue)) {\r\n // Same value we own: register as co-owner (refcount++) or idempotent skip.\r\n const owners = entry.owners.map((o) => o.connectorId);\r\n if (addLedgerOwner(entry, connector.id, connector.version)) {\r\n if (!ctx.dryRun) saveConfigPatchLedger(ctx.dataRoot, ledger);\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path: filePath,\r\n detail: `statusline ${STATUSLINE_KEY} already installed; registered as co-owner (co-owned with ${owners.join(\", \")})`,\r\n },\r\n ];\r\n }\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path: filePath,\r\n detail: `statusline ${STATUSLINE_KEY} already installed`,\r\n },\r\n ];\r\n }\r\n\r\n // FIRST-WRITER-WINS: another connector owns the key with a different value.\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n path: filePath,\r\n detail:\r\n `statusline ${STATUSLINE_KEY} skipped: already owned by ${entry.owners\r\n .map((o) => o.connectorId)\r\n .join(\", \")} with a different value — left untouched`,\r\n },\r\n ];\r\n }\r\n\r\n override uninstallStatusline(ctx: InstallContext): ChangeRecord[] {\r\n const ledger = loadConfigPatchLedger(ctx.dataRoot);\r\n // Release ONLY the statusLine ledger row this connector owns (keyed off the\r\n // ledger, not the declaration, so an id-only synthetic uninstall still reclaims\r\n // it). Last-owner-verified delete: remove the key ONLY when last-owner ∧\r\n // value-unchanged ∧ prior-absent (else skip-warn + leave the key).\r\n const owned = ledgerEntriesOwnedBy(ledger, HOST, ctx.connector.id).filter(\r\n (e) => e.key === STATUSLINE_KEY,\r\n );\r\n if (owned.length === 0) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n detail: \"statusline: no ownership recorded; left untouched\",\r\n },\r\n ];\r\n }\r\n\r\n const changes: ChangeRecord[] = [];\r\n let ledgerMutated = false;\r\n\r\n // Group by file (one global settings.json in practice, but stay robust to a\r\n // scope drift between install and uninstall).\r\n const byFile = new Map<string, ConfigPatchLedgerEntry[]>();\r\n for (const entry of owned) {\r\n const bucket = byFile.get(entry.file) ?? [];\r\n bucket.push(entry);\r\n byFile.set(entry.file, bucket);\r\n }\r\n\r\n for (const [filePath, entries] of byFile) {\r\n const symlink = this.symlinkPathWarning(filePath);\r\n if (symlink) {\r\n changes.push(symlink);\r\n continue;\r\n }\r\n\r\n const unparseable = this.isPresentButUnparseable(filePath);\r\n const settings = unparseable ? null : this.readJson<Record<string, unknown>>(filePath);\r\n let fileMutated = false;\r\n\r\n for (const entry of entries) {\r\n const { lastOwner } = removeLedgerOwner(entry, ctx.connector.id);\r\n ledgerMutated = true;\r\n\r\n if (!lastOwner) {\r\n // Shared-flag case: A uninstalls, B still relies on the key.\r\n changes.push({\r\n platform: this.id,\r\n action: \"skip\",\r\n path: filePath,\r\n detail: `statusline ${entry.key} retained: still owned by ${entry.owners\r\n .map((o) => o.connectorId)\r\n .join(\", \")}`,\r\n });\r\n continue;\r\n }\r\n\r\n // Last owner out → the ledger row is dropped on every branch below; the\r\n // KEY is removed only on the fully-verified branch.\r\n dropLedgerEntry(ledger, entry);\r\n\r\n if (unparseable) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n path: filePath,\r\n detail: `statusline ${entry.key}: ${filePath} is not parseable; key left in place (ownership released)`,\r\n });\r\n continue;\r\n }\r\n if (!settings || typeof settings !== \"object\" || Array.isArray(settings)) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"skip\",\r\n path: filePath,\r\n detail: `statusline ${entry.key} already absent (no settings file); ownership record dropped`,\r\n });\r\n continue;\r\n }\r\n const leaf = settings[entry.key];\r\n if (leaf === undefined) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"skip\",\r\n path: filePath,\r\n detail: `statusline ${entry.key} already absent; ownership record dropped`,\r\n });\r\n continue;\r\n }\r\n if (entry.prior?.present !== false || !jsonDeepEquals(leaf as JsonValue, entry.writtenValue)) {\r\n // User edited the value after install (or the row predates the\r\n // set-if-absent guarantee): deleting would clobber them. Leave it.\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n path: filePath,\r\n detail:\r\n `statusline ${entry.key}: value changed since install ` +\r\n `(current ${describeJsonValue(leaf as JsonValue)}, wrote ${describeJsonValue(entry.writtenValue)}); ` +\r\n `left in place`,\r\n });\r\n continue;\r\n }\r\n\r\n // VERIFIED: last owner + current === writtenValue + prior absent.\r\n delete settings[entry.key];\r\n fileMutated = true;\r\n changes.push({\r\n platform: this.id,\r\n action: \"remove\",\r\n path: filePath,\r\n detail: `statusline ${entry.key} removed (was ${describeJsonValue(entry.writtenValue)})`,\r\n });\r\n }\r\n\r\n if (fileMutated && settings) this.writeJson(filePath, settings, ctx.dryRun);\r\n }\r\n\r\n if (ledgerMutated && !ctx.dryRun) saveConfigPatchLedger(ctx.dataRoot, ledger);\r\n return changes;\r\n }\r\n\r\n /**\r\n * Parse the `agy` statusLine stdin JSON into the normalized\r\n * {@link StatuslineContext}. agy pipes a JSON object on stdin\r\n * (model/context_window/workspace/…); fields the payload omits stay undefined.\r\n * `raw` keeps the verbatim payload (incl. version/agent_state/vcs/plan_tier/\r\n * quota/email/terminal_width). agy has no cost analog, so `ctx.cost` is left\r\n * undefined. LIVE-CAPTURED against agy v1.0.10 (see header / AgyStatuslineInput).\r\n */\r\n parseStatusInput(raw: unknown): StatuslineContext {\r\n const input = (raw ?? {}) as AgyStatuslineInput;\r\n\r\n const ctx: StatuslineContext = {\r\n host: HOST,\r\n capabilities: this.capabilities,\r\n raw,\r\n };\r\n // Stable session id: prefer conversation_id (the active agent conversation),\r\n // fall back to session_id (the capture showed them equal).\r\n const sessionId =\r\n typeof input.conversation_id === \"string\" && input.conversation_id !== \"\"\r\n ? input.conversation_id\r\n : typeof input.session_id === \"string\" && input.session_id !== \"\"\r\n ? input.session_id\r\n : undefined;\r\n if (sessionId !== undefined) ctx.sessionId = sessionId;\r\n // cwd: prefer the top-level cwd, else the workspace.current_dir.\r\n const cwd =\r\n typeof input.cwd === \"string\"\r\n ? input.cwd\r\n : typeof input.workspace?.current_dir === \"string\"\r\n ? input.workspace.current_dir\r\n : undefined;\r\n if (cwd !== undefined) ctx.cwd = cwd;\r\n if (typeof input.transcript_path === \"string\") ctx.transcriptPath = input.transcript_path;\r\n\r\n const model: { id?: string; displayName?: string } = {};\r\n if (typeof input.model?.id === \"string\") model.id = input.model.id;\r\n if (typeof input.model?.display_name === \"string\") model.displayName = input.model.display_name;\r\n if (model.id !== undefined || model.displayName !== undefined) ctx.model = model;\r\n\r\n const cw = input.context_window;\r\n if (cw) {\r\n const context: { usedTokens?: number; maxTokens?: number; percent?: number } = {};\r\n if (typeof cw.context_window_size === \"number\") context.maxTokens = cw.context_window_size;\r\n // agy's current_usage is an OBJECT (not a number like qwen) — used tokens are\r\n // the documented top-level total_input_tokens + total_output_tokens sum.\r\n if (\r\n typeof cw.total_input_tokens === \"number\" ||\r\n typeof cw.total_output_tokens === \"number\"\r\n ) {\r\n context.usedTokens = (cw.total_input_tokens ?? 0) + (cw.total_output_tokens ?? 0);\r\n }\r\n if (typeof cw.used_percentage === \"number\") context.percent = cw.used_percentage;\r\n if (\r\n context.usedTokens !== undefined ||\r\n context.maxTokens !== undefined ||\r\n context.percent !== undefined\r\n ) {\r\n ctx.context = context;\r\n }\r\n }\r\n // ctx.cost stays undefined: agy's status payload has no cost analog.\r\n return ctx;\r\n }\r\n\r\n /** Format the rendered status line into agy's native reply: stdout = line, exit 0. */\r\n formatStatusOutput(rendered: string): HookReply {\r\n return { exitCode: 0, stdout: rendered };\r\n }\r\n\r\n // ── Diagnostics: add the statusline check on top of the inherited IDE checks ─\r\n\r\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\r\n const checks = [...super.getHealthChecks(ctx)];\r\n\r\n // Statusline check: assert it when the connector declares a statusline AND it\r\n // is not disabled for this host, OR when the ownership ledger holds a\r\n // statusLine row this connector owns (the REGISTERED-connector path:\r\n // connectorFromMeta can't re-expose the render fn, so statusline comes back\r\n // undefined — but the ledger row proves the surface was wired). Mirrors\r\n // claude-code/qwen-code's \"statusline wired\" check.\r\n const settingsPath = this.statuslineSettingsPath();\r\n const connectorId = ctx.connector.id;\r\n const homeBin = ctx.homeBinPath;\r\n const statuslineLedgerOwned = ledgerEntriesOwnedBy(\r\n loadConfigPatchLedger(ctx.dataRoot),\r\n HOST,\r\n connectorId,\r\n ).some((e) => e.key === STATUSLINE_KEY);\r\n if (\r\n (ctx.connector.statusline != null || statuslineLedgerOwned) &&\r\n ctx.connector.platforms[HOST]?.statusline !== false\r\n ) {\r\n checks.push({\r\n name: `${this.name}: statusline wired`,\r\n check: () => {\r\n const settings = this.readJson<{ statusLine?: { command?: unknown } }>(settingsPath);\r\n const command = settings?.statusLine?.command;\r\n if (command === undefined) {\r\n return { status: \"FAIL\", detail: `statusLine not set in ${settingsPath}` };\r\n }\r\n if (\r\n typeof command === \"string\" &&\r\n isHomeBinStatuslineCommand(command, homeBin, connectorId)\r\n ) {\r\n return { status: \"OK\", detail: \"statusLine command present\" };\r\n }\r\n // Present but not ours — a non-AC statusLine we must never clobber.\r\n return {\r\n status: \"FAIL\",\r\n detail: `statusLine in ${settingsPath} is not agent-connector's (left untouched)`,\r\n };\r\n },\r\n });\r\n }\r\n return checks;\r\n }\r\n}\r\n\r\nexport const adapter = new AntigravityCliAdapter();\r\nexport default adapter;\r\n"],"mappings":"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","names":["adapter"]}
@@ -0,0 +1,311 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ fail,
4
+ print
5
+ } from "./chunk-N4ENLZEU.js";
6
+ import {
7
+ findConnectorConfig,
8
+ loadConnectorFromPath
9
+ } from "./chunk-3EP5V2F4.js";
10
+ import {
11
+ deriveHostAliasFromMcpName,
12
+ deriveHostAliasFromPackageName,
13
+ findNearestPackageJson,
14
+ readConnectorPackageMetadataFromPackageJson
15
+ } from "./chunk-7ZFK2WEO.js";
16
+ import "./chunk-NDMNMAKP.js";
17
+ import "./chunk-KFPSJRHR.js";
18
+ import "./chunk-ILWHLGIC.js";
19
+ import "./chunk-QYOUQCC6.js";
20
+
21
+ // src/cli/commands/audit.ts
22
+ import { dirname as dirname2 } from "path";
23
+ import { parseArgs } from "util";
24
+
25
+ // src/core/package-audit.ts
26
+ import { existsSync, readFileSync } from "fs";
27
+ import { dirname, isAbsolute, relative, resolve } from "path";
28
+ function cleanString(value) {
29
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
30
+ }
31
+ function readRawPackageJson(path) {
32
+ return JSON.parse(readFileSync(path, "utf8"));
33
+ }
34
+ function dependencyVersion(pkg, name) {
35
+ for (const field of ["dependencies", "devDependencies", "peerDependencies"]) {
36
+ const deps = pkg[field];
37
+ if (!deps || typeof deps !== "object" || Array.isArray(deps)) continue;
38
+ const value = deps[name];
39
+ if (typeof value === "string" && value.trim()) return value.trim();
40
+ }
41
+ return void 0;
42
+ }
43
+ function dependencyField(pkg, name) {
44
+ for (const field of ["dependencies", "devDependencies", "peerDependencies"]) {
45
+ const deps = pkg[field];
46
+ if (!deps || typeof deps !== "object" || Array.isArray(deps)) continue;
47
+ if (typeof deps[name] === "string") return field;
48
+ }
49
+ return void 0;
50
+ }
51
+ function normalizePackagePath(path) {
52
+ return path.replace(/\\/g, "/").replace(/^\.\//, "");
53
+ }
54
+ function binEntries(bin, packageName) {
55
+ if (typeof bin === "string") {
56
+ const derived = packageName?.startsWith("@") ? packageName.split("/")[1] : packageName;
57
+ const name = cleanString(derived);
58
+ return name ? [[name, bin]] : [];
59
+ }
60
+ if (!bin || typeof bin !== "object" || Array.isArray(bin)) return [];
61
+ return Object.entries(bin).filter((entry) => cleanString(entry[0]) != null && typeof entry[1] === "string").map(([name, target]) => [name, target]);
62
+ }
63
+ function filesList(files) {
64
+ if (files == null) return void 0;
65
+ if (!Array.isArray(files)) return [];
66
+ return files.filter((entry) => typeof entry === "string" && entry.trim() !== "");
67
+ }
68
+ function filesIncludes(files, relPath) {
69
+ const normalized = normalizePackagePath(relPath);
70
+ return files.some((entry) => {
71
+ const item = normalizePackagePath(entry);
72
+ return item === normalized || normalized.startsWith(`${item.replace(/\/$/, "")}/`);
73
+ });
74
+ }
75
+ function add(findings, severity, code, message) {
76
+ findings.push({ severity, code, message });
77
+ }
78
+ function expectedAliases(pkg, packageName) {
79
+ const out = /* @__PURE__ */ new Set();
80
+ const mcpName = cleanString(pkg.mcpName) ?? (pkg.mcp && typeof pkg.mcp === "object" && !Array.isArray(pkg.mcp) ? cleanString(pkg.mcp.mcpName) ?? cleanString(pkg.mcp.name) : void 0);
81
+ if (mcpName) {
82
+ const alias = deriveHostAliasFromMcpName(mcpName);
83
+ if (alias) out.add(alias);
84
+ }
85
+ if (packageName) {
86
+ const alias = deriveHostAliasFromPackageName(packageName);
87
+ if (alias) out.add(alias);
88
+ }
89
+ return [...out];
90
+ }
91
+ function auditLoadedConnector(input) {
92
+ const { pkg, packageJsonPath, connectorPath, connector } = input;
93
+ const packageDir = dirname(packageJsonPath);
94
+ const findings = [];
95
+ const packageName = cleanString(pkg.name);
96
+ const packageVersion = cleanString(pkg.version);
97
+ const entries = binEntries(pkg.bin, packageName);
98
+ const metadata = readConnectorPackageMetadataFromPackageJson(packageJsonPath);
99
+ const metadataMcp = metadata.mcp;
100
+ const aliasCandidates = expectedAliases(pkg, packageName);
101
+ const selectedBin = metadataMcp?.bin;
102
+ if (!packageName) {
103
+ add(findings, "error", "missing-package-name", "package.json must declare a non-empty `name`.");
104
+ } else {
105
+ add(findings, "info", "package-name", `package name: ${packageName}`);
106
+ }
107
+ if (!packageVersion) {
108
+ add(findings, "error", "missing-version", "package.json must declare a non-empty `version`.");
109
+ } else {
110
+ add(findings, "info", "package-version", `package version: ${packageVersion}`);
111
+ }
112
+ if (entries.length === 0) {
113
+ add(findings, "error", "missing-bin", "branded MCP packages must expose a `bin` command.");
114
+ } else if (!selectedBin) {
115
+ add(
116
+ findings,
117
+ "error",
118
+ "ambiguous-bin",
119
+ "package.json `bin` could not be mapped to one branded command; use one bin or a bin matching the package basename."
120
+ );
121
+ } else {
122
+ add(findings, "info", "bin", `branded bin: ${selectedBin}`);
123
+ }
124
+ for (const [binName, target] of entries) {
125
+ const targetPath = resolve(packageDir, target);
126
+ if (!existsSync(targetPath)) {
127
+ add(findings, "error", "missing-bin-target", `bin "${binName}" points at a missing file: ${target}`);
128
+ }
129
+ }
130
+ const dep = dependencyVersion(pkg, "@ken-jo/agent-connector");
131
+ const depField = dependencyField(pkg, "@ken-jo/agent-connector");
132
+ if (!dep) {
133
+ add(
134
+ findings,
135
+ "error",
136
+ "missing-agent-connector-dependency",
137
+ "package.json must depend on `@ken-jo/agent-connector` so the branded bin works after install."
138
+ );
139
+ } else if (depField !== "dependencies") {
140
+ add(
141
+ findings,
142
+ "warn",
143
+ "agent-connector-not-runtime-dependency",
144
+ `@ken-jo/agent-connector is in ${depField}; published MCP packages usually need it in dependencies.`
145
+ );
146
+ } else {
147
+ add(findings, "info", "agent-connector-dependency", `@ken-jo/agent-connector dependency: ${dep}`);
148
+ }
149
+ if (metadataMcp?.packageName && connector.mcp?.packageName && connector.mcp.packageName !== metadataMcp.packageName) {
150
+ add(
151
+ findings,
152
+ "error",
153
+ "package-name-drift",
154
+ `connector mcp.packageName (${connector.mcp.packageName}) differs from package.json name (${metadataMcp.packageName}).`
155
+ );
156
+ }
157
+ if (packageVersion && connector.version !== packageVersion) {
158
+ add(
159
+ findings,
160
+ "warn",
161
+ "version-drift",
162
+ `connector version (${connector.version}) differs from package.json version (${packageVersion}); keep package.json as the source of truth unless this is intentional.`
163
+ );
164
+ }
165
+ if (aliasCandidates.length > 0 && !aliasCandidates.includes(connector.id)) {
166
+ add(
167
+ findings,
168
+ "warn",
169
+ "connector-id-drift",
170
+ `connector id (${connector.id}) does not match package-derived alias candidates (${aliasCandidates.join(", ")}).`
171
+ );
172
+ }
173
+ if (selectedBin && selectedBin !== connector.id) {
174
+ add(
175
+ findings,
176
+ "warn",
177
+ "bin-id-drift",
178
+ `branded bin (${selectedBin}) differs from connector id (${connector.id}); users may see two names for one MCP package.`
179
+ );
180
+ }
181
+ const files = filesList(pkg.files);
182
+ if (files && files.length === 0) {
183
+ add(findings, "error", "invalid-files", "`files` must be an array of package paths when present.");
184
+ } else if (files) {
185
+ const connectorRel = normalizePackagePath(relative(packageDir, connectorPath));
186
+ if (!connectorRel.startsWith("../") && !isAbsolute(connectorRel) && !filesIncludes(files, connectorRel)) {
187
+ add(
188
+ findings,
189
+ "warn",
190
+ "files-missing-connector",
191
+ `package.json files does not include the connector config (${connectorRel}).`
192
+ );
193
+ }
194
+ for (const [binName, target] of entries) {
195
+ const rel = normalizePackagePath(target);
196
+ if (!filesIncludes(files, rel)) {
197
+ add(findings, "warn", "files-missing-bin", `package.json files does not include bin "${binName}" target (${rel}).`);
198
+ }
199
+ }
200
+ }
201
+ const hasError = findings.some((finding) => finding.severity === "error");
202
+ return {
203
+ ok: !hasError,
204
+ packageJsonPath,
205
+ connectorPath,
206
+ ...packageName ? { packageName } : {},
207
+ ...packageVersion ? { packageVersion } : {},
208
+ connectorId: connector.id,
209
+ connectorVersion: connector.version,
210
+ ...selectedBin ? { binName: selectedBin } : {},
211
+ findings
212
+ };
213
+ }
214
+ async function auditConnectorPackage(input) {
215
+ const packageJsonPath = resolve(input.packageJsonPath);
216
+ const connectorPath = resolve(input.connectorPath);
217
+ const findings = [];
218
+ if (!existsSync(packageJsonPath)) {
219
+ add(findings, "error", "package-json-not-found", `package.json not found: ${packageJsonPath}`);
220
+ return { ok: false, packageJsonPath, connectorPath, findings };
221
+ }
222
+ if (!existsSync(connectorPath)) {
223
+ add(findings, "error", "connector-not-found", `connector config not found: ${connectorPath}`);
224
+ return { ok: false, packageJsonPath, connectorPath, findings };
225
+ }
226
+ let pkg;
227
+ try {
228
+ pkg = readRawPackageJson(packageJsonPath);
229
+ } catch (err) {
230
+ add(
231
+ findings,
232
+ "error",
233
+ "package-json-invalid",
234
+ `package.json could not be parsed: ${err instanceof Error ? err.message : String(err)}`
235
+ );
236
+ return { ok: false, packageJsonPath, connectorPath, findings };
237
+ }
238
+ try {
239
+ const { connector } = await loadConnectorFromPath(connectorPath);
240
+ return auditLoadedConnector({ pkg, packageJsonPath, connectorPath, connector });
241
+ } catch (err) {
242
+ add(
243
+ findings,
244
+ "error",
245
+ "connector-load-failed",
246
+ `connector config could not be loaded: ${err instanceof Error ? err.message : String(err)}`
247
+ );
248
+ return { ok: false, packageJsonPath, connectorPath, findings };
249
+ }
250
+ }
251
+
252
+ // src/cli/commands/audit.ts
253
+ function glyph(severity) {
254
+ return severity === "error" ? "x" : severity === "warn" ? "!" : "\u2713";
255
+ }
256
+ function renderAudit(result) {
257
+ const lines = [
258
+ `audit ${result.connectorId ? `"${result.connectorId}"` : "package"}`,
259
+ ` package: ${result.packageJsonPath}`,
260
+ ` connector: ${result.connectorPath}`
261
+ ];
262
+ if (result.binName) lines.push(` bin: ${result.binName}`);
263
+ lines.push("");
264
+ for (const finding of result.findings) {
265
+ lines.push(` ${glyph(finding.severity)} ${finding.message}`);
266
+ }
267
+ const errors = result.findings.filter((finding) => finding.severity === "error").length;
268
+ const warnings = result.findings.filter((finding) => finding.severity === "warn").length;
269
+ lines.push("");
270
+ lines.push(
271
+ errors === 0 ? `\u2713 package audit passed${warnings > 0 ? ` with ${warnings} warning${warnings === 1 ? "" : "s"}` : ""}.` : `x package audit failed with ${errors} error${errors === 1 ? "" : "s"}${warnings > 0 ? ` and ${warnings} warning${warnings === 1 ? "" : "s"}` : ""}.`
272
+ );
273
+ return lines.join("\n");
274
+ }
275
+ async function run(argv) {
276
+ const { values } = parseArgs({
277
+ args: argv,
278
+ options: {
279
+ connector: { type: "string" },
280
+ "package-json": { type: "string" },
281
+ project: { type: "string" },
282
+ json: { type: "boolean", default: false },
283
+ strict: { type: "boolean", default: false }
284
+ },
285
+ allowPositionals: false
286
+ });
287
+ const projectDir = values.project ?? process.cwd();
288
+ const connectorPath = values.connector ?? findConnectorConfig(projectDir);
289
+ if (!connectorPath) {
290
+ return fail(
291
+ "no connector config found. Pass --connector <path> or add an agent-connector.config.{mjs,js,json} to your project."
292
+ );
293
+ }
294
+ const packageJsonPath = values["package-json"] ?? findNearestPackageJson(dirname2(connectorPath));
295
+ if (!packageJsonPath) {
296
+ return fail("no package.json found. Pass --package-json <path>.");
297
+ }
298
+ const result = await auditConnectorPackage({ connectorPath, packageJsonPath });
299
+ if (values.json) {
300
+ print(JSON.stringify(result, null, 2));
301
+ } else {
302
+ print(renderAudit(result));
303
+ }
304
+ const hasError = result.findings.some((finding) => finding.severity === "error");
305
+ const hasWarning = result.findings.some((finding) => finding.severity === "warn");
306
+ return hasError || values.strict && hasWarning ? 1 : 0;
307
+ }
308
+ export {
309
+ run
310
+ };
311
+ //# sourceMappingURL=audit-3E5JAOP2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/audit.ts","../src/core/package-audit.ts"],"sourcesContent":["/**\n * cli/commands/audit — pre-install package identity lint for branded MCP packages.\n *\n * This command catches the mistakes that make a connector feel unbranded after\n * publish: missing bin, missing runtime dependency, package/connector version\n * drift, and mismatched package-derived aliases.\n */\n\nimport { dirname } from \"node:path\";\nimport { parseArgs } from \"node:util\";\n\nimport { findConnectorConfig } from \"../../core/load-connector.js\";\nimport {\n auditConnectorPackage,\n type PackageAuditFinding,\n type PackageAuditResult,\n} from \"../../core/package-audit.js\";\nimport { findNearestPackageJson } from \"../../core/package-metadata.js\";\nimport { fail, print } from \"../app.js\";\n\nfunction glyph(severity: PackageAuditFinding[\"severity\"]): string {\n return severity === \"error\" ? \"x\" : severity === \"warn\" ? \"!\" : \"✓\";\n}\n\nfunction renderAudit(result: PackageAuditResult): string {\n const lines = [\n `audit ${result.connectorId ? `\"${result.connectorId}\"` : \"package\"}`,\n ` package: ${result.packageJsonPath}`,\n ` connector: ${result.connectorPath}`,\n ];\n if (result.binName) lines.push(` bin: ${result.binName}`);\n lines.push(\"\");\n\n for (const finding of result.findings) {\n lines.push(` ${glyph(finding.severity)} ${finding.message}`);\n }\n\n const errors = result.findings.filter((finding) => finding.severity === \"error\").length;\n const warnings = result.findings.filter((finding) => finding.severity === \"warn\").length;\n lines.push(\"\");\n lines.push(\n errors === 0\n ? `✓ package audit passed${warnings > 0 ? ` with ${warnings} warning${warnings === 1 ? \"\" : \"s\"}` : \"\"}.`\n : `x package audit failed with ${errors} error${errors === 1 ? \"\" : \"s\"}${warnings > 0 ? ` and ${warnings} warning${warnings === 1 ? \"\" : \"s\"}` : \"\"}.`,\n );\n return lines.join(\"\\n\");\n}\n\nexport async function run(argv: string[]): Promise<number> {\n const { values } = parseArgs({\n args: argv,\n options: {\n connector: { type: \"string\" },\n \"package-json\": { type: \"string\" },\n project: { type: \"string\" },\n json: { type: \"boolean\", default: false },\n strict: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n const projectDir = values.project ?? process.cwd();\n const connectorPath = values.connector ?? findConnectorConfig(projectDir);\n if (!connectorPath) {\n return fail(\n \"no connector config found. Pass --connector <path> or add an \" +\n \"agent-connector.config.{mjs,js,json} to your project.\",\n );\n }\n\n const packageJsonPath =\n values[\"package-json\"] ?? findNearestPackageJson(dirname(connectorPath));\n if (!packageJsonPath) {\n return fail(\"no package.json found. Pass --package-json <path>.\");\n }\n\n const result = await auditConnectorPackage({ connectorPath, packageJsonPath });\n if (values.json) {\n print(JSON.stringify(result, null, 2));\n } else {\n print(renderAudit(result));\n }\n\n const hasError = result.findings.some((finding) => finding.severity === \"error\");\n const hasWarning = result.findings.some((finding) => finding.severity === \"warn\");\n return hasError || (values.strict && hasWarning) ? 1 : 0;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, relative, resolve } from \"node:path\";\n\nimport { loadConnectorFromPath } from \"./load-connector.js\";\nimport {\n deriveHostAliasFromMcpName,\n deriveHostAliasFromPackageName,\n readConnectorPackageMetadataFromPackageJson,\n} from \"./package-metadata.js\";\nimport type { ResolvedConnector } from \"./types.js\";\n\nexport type PackageAuditSeverity = \"error\" | \"warn\" | \"info\";\n\nexport interface PackageAuditFinding {\n severity: PackageAuditSeverity;\n code: string;\n message: string;\n}\n\nexport interface PackageAuditResult {\n ok: boolean;\n packageJsonPath: string;\n connectorPath: string;\n packageName?: string;\n packageVersion?: string;\n connectorId?: string;\n connectorVersion?: string;\n binName?: string;\n findings: PackageAuditFinding[];\n}\n\ninterface RawPackageJson {\n name?: unknown;\n version?: unknown;\n mcpName?: unknown;\n mcp?: unknown;\n bin?: unknown;\n files?: unknown;\n dependencies?: unknown;\n devDependencies?: unknown;\n peerDependencies?: unknown;\n}\n\nfunction cleanString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction readRawPackageJson(path: string): RawPackageJson {\n return JSON.parse(readFileSync(path, \"utf8\")) as RawPackageJson;\n}\n\nfunction dependencyVersion(pkg: RawPackageJson, name: string): string | undefined {\n for (const field of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const deps = pkg[field];\n if (!deps || typeof deps !== \"object\" || Array.isArray(deps)) continue;\n const value = (deps as Record<string, unknown>)[name];\n if (typeof value === \"string\" && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction dependencyField(pkg: RawPackageJson, name: string): string | undefined {\n for (const field of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const deps = pkg[field];\n if (!deps || typeof deps !== \"object\" || Array.isArray(deps)) continue;\n if (typeof (deps as Record<string, unknown>)[name] === \"string\") return field;\n }\n return undefined;\n}\n\nfunction normalizePackagePath(path: string): string {\n return path.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction binEntries(bin: unknown, packageName: string | undefined): [string, string][] {\n if (typeof bin === \"string\") {\n const derived = packageName?.startsWith(\"@\")\n ? packageName.split(\"/\")[1]\n : packageName;\n const name = cleanString(derived);\n return name ? [[name, bin]] : [];\n }\n if (!bin || typeof bin !== \"object\" || Array.isArray(bin)) return [];\n return Object.entries(bin)\n .filter((entry): entry is [string, string] => cleanString(entry[0]) != null && typeof entry[1] === \"string\")\n .map(([name, target]) => [name, target]);\n}\n\nfunction filesList(files: unknown): string[] | undefined {\n if (files == null) return undefined;\n if (!Array.isArray(files)) return [];\n return files.filter((entry): entry is string => typeof entry === \"string\" && entry.trim() !== \"\");\n}\n\nfunction filesIncludes(files: string[], relPath: string): boolean {\n const normalized = normalizePackagePath(relPath);\n return files.some((entry) => {\n const item = normalizePackagePath(entry);\n return item === normalized || normalized.startsWith(`${item.replace(/\\/$/, \"\")}/`);\n });\n}\n\nfunction add(\n findings: PackageAuditFinding[],\n severity: PackageAuditSeverity,\n code: string,\n message: string,\n): void {\n findings.push({ severity, code, message });\n}\n\nfunction expectedAliases(pkg: RawPackageJson, packageName: string | undefined): string[] {\n const out = new Set<string>();\n const mcpName =\n cleanString(pkg.mcpName) ??\n (pkg.mcp && typeof pkg.mcp === \"object\" && !Array.isArray(pkg.mcp)\n ? cleanString((pkg.mcp as { name?: unknown; mcpName?: unknown }).mcpName) ??\n cleanString((pkg.mcp as { name?: unknown; mcpName?: unknown }).name)\n : undefined);\n if (mcpName) {\n const alias = deriveHostAliasFromMcpName(mcpName);\n if (alias) out.add(alias);\n }\n if (packageName) {\n const alias = deriveHostAliasFromPackageName(packageName);\n if (alias) out.add(alias);\n }\n return [...out];\n}\n\nfunction auditLoadedConnector(input: {\n pkg: RawPackageJson;\n packageJsonPath: string;\n connectorPath: string;\n connector: ResolvedConnector;\n}): PackageAuditResult {\n const { pkg, packageJsonPath, connectorPath, connector } = input;\n const packageDir = dirname(packageJsonPath);\n const findings: PackageAuditFinding[] = [];\n const packageName = cleanString(pkg.name);\n const packageVersion = cleanString(pkg.version);\n const entries = binEntries(pkg.bin, packageName);\n const metadata = readConnectorPackageMetadataFromPackageJson(packageJsonPath);\n const metadataMcp = metadata.mcp;\n const aliasCandidates = expectedAliases(pkg, packageName);\n const selectedBin = metadataMcp?.bin;\n\n if (!packageName) {\n add(findings, \"error\", \"missing-package-name\", \"package.json must declare a non-empty `name`.\");\n } else {\n add(findings, \"info\", \"package-name\", `package name: ${packageName}`);\n }\n\n if (!packageVersion) {\n add(findings, \"error\", \"missing-version\", \"package.json must declare a non-empty `version`.\");\n } else {\n add(findings, \"info\", \"package-version\", `package version: ${packageVersion}`);\n }\n\n if (entries.length === 0) {\n add(findings, \"error\", \"missing-bin\", \"branded MCP packages must expose a `bin` command.\");\n } else if (!selectedBin) {\n add(\n findings,\n \"error\",\n \"ambiguous-bin\",\n \"package.json `bin` could not be mapped to one branded command; use one bin or a bin matching the package basename.\",\n );\n } else {\n add(findings, \"info\", \"bin\", `branded bin: ${selectedBin}`);\n }\n\n for (const [binName, target] of entries) {\n const targetPath = resolve(packageDir, target);\n if (!existsSync(targetPath)) {\n add(findings, \"error\", \"missing-bin-target\", `bin \"${binName}\" points at a missing file: ${target}`);\n }\n }\n\n const dep = dependencyVersion(pkg, \"@ken-jo/agent-connector\");\n const depField = dependencyField(pkg, \"@ken-jo/agent-connector\");\n if (!dep) {\n add(\n findings,\n \"error\",\n \"missing-agent-connector-dependency\",\n \"package.json must depend on `@ken-jo/agent-connector` so the branded bin works after install.\",\n );\n } else if (depField !== \"dependencies\") {\n add(\n findings,\n \"warn\",\n \"agent-connector-not-runtime-dependency\",\n `@ken-jo/agent-connector is in ${depField}; published MCP packages usually need it in dependencies.`,\n );\n } else {\n add(findings, \"info\", \"agent-connector-dependency\", `@ken-jo/agent-connector dependency: ${dep}`);\n }\n\n if (metadataMcp?.packageName && connector.mcp?.packageName && connector.mcp.packageName !== metadataMcp.packageName) {\n add(\n findings,\n \"error\",\n \"package-name-drift\",\n `connector mcp.packageName (${connector.mcp.packageName}) differs from package.json name (${metadataMcp.packageName}).`,\n );\n }\n\n if (packageVersion && connector.version !== packageVersion) {\n add(\n findings,\n \"warn\",\n \"version-drift\",\n `connector version (${connector.version}) differs from package.json version (${packageVersion}); keep package.json as the source of truth unless this is intentional.`,\n );\n }\n\n if (aliasCandidates.length > 0 && !aliasCandidates.includes(connector.id)) {\n add(\n findings,\n \"warn\",\n \"connector-id-drift\",\n `connector id (${connector.id}) does not match package-derived alias candidates (${aliasCandidates.join(\", \")}).`,\n );\n }\n\n if (selectedBin && selectedBin !== connector.id) {\n add(\n findings,\n \"warn\",\n \"bin-id-drift\",\n `branded bin (${selectedBin}) differs from connector id (${connector.id}); users may see two names for one MCP package.`,\n );\n }\n\n const files = filesList(pkg.files);\n if (files && files.length === 0) {\n add(findings, \"error\", \"invalid-files\", \"`files` must be an array of package paths when present.\");\n } else if (files) {\n const connectorRel = normalizePackagePath(relative(packageDir, connectorPath));\n if (!connectorRel.startsWith(\"../\") && !isAbsolute(connectorRel) && !filesIncludes(files, connectorRel)) {\n add(\n findings,\n \"warn\",\n \"files-missing-connector\",\n `package.json files does not include the connector config (${connectorRel}).`,\n );\n }\n for (const [binName, target] of entries) {\n const rel = normalizePackagePath(target);\n if (!filesIncludes(files, rel)) {\n add(findings, \"warn\", \"files-missing-bin\", `package.json files does not include bin \"${binName}\" target (${rel}).`);\n }\n }\n }\n\n const hasError = findings.some((finding) => finding.severity === \"error\");\n return {\n ok: !hasError,\n packageJsonPath,\n connectorPath,\n ...(packageName ? { packageName } : {}),\n ...(packageVersion ? { packageVersion } : {}),\n connectorId: connector.id,\n connectorVersion: connector.version,\n ...(selectedBin ? { binName: selectedBin } : {}),\n findings,\n };\n}\n\nexport async function auditConnectorPackage(input: {\n connectorPath: string;\n packageJsonPath: string;\n}): Promise<PackageAuditResult> {\n const packageJsonPath = resolve(input.packageJsonPath);\n const connectorPath = resolve(input.connectorPath);\n const findings: PackageAuditFinding[] = [];\n\n if (!existsSync(packageJsonPath)) {\n add(findings, \"error\", \"package-json-not-found\", `package.json not found: ${packageJsonPath}`);\n return { ok: false, packageJsonPath, connectorPath, findings };\n }\n\n if (!existsSync(connectorPath)) {\n add(findings, \"error\", \"connector-not-found\", `connector config not found: ${connectorPath}`);\n return { ok: false, packageJsonPath, connectorPath, findings };\n }\n\n let pkg: RawPackageJson;\n try {\n pkg = readRawPackageJson(packageJsonPath);\n } catch (err) {\n add(\n findings,\n \"error\",\n \"package-json-invalid\",\n `package.json could not be parsed: ${err instanceof Error ? err.message : String(err)}`,\n );\n return { ok: false, packageJsonPath, connectorPath, findings };\n }\n\n try {\n const { connector } = await loadConnectorFromPath(connectorPath);\n return auditLoadedConnector({ pkg, packageJsonPath, connectorPath, connector });\n } catch (err) {\n add(\n findings,\n \"error\",\n \"connector-load-failed\",\n `connector config could not be loaded: ${err instanceof Error ? err.message : String(err)}`,\n );\n return { ok: false, packageJsonPath, connectorPath, findings };\n }\n}\n"],"mappings":"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","names":["dirname","dirname"]}
@@ -3,13 +3,13 @@ import {
3
3
  defineConnector,
4
4
  readConnectorPackageMetadataNearFile,
5
5
  withConnectorPackageMetadata
6
- } from "./chunk-KJLFGQQM.js";
6
+ } from "./chunk-7ZFK2WEO.js";
7
7
  import {
8
8
  assertNoSymlinkInPath,
9
9
  connectorDir,
10
10
  connectorsDir,
11
11
  ensureDir
12
- } from "./chunk-GZGLCCEE.js";
12
+ } from "./chunk-QYOUQCC6.js";
13
13
 
14
14
  // src/core/load-connector.ts
15
15
  import { existsSync, readdirSync, readFileSync, realpathSync, rmSync, writeFileSync } from "fs";
@@ -193,4 +193,4 @@ export {
193
193
  connectorFromMeta,
194
194
  listRegisteredConnectors
195
195
  };
196
- //# sourceMappingURL=chunk-KSPMSRVU.js.map
196
+ //# sourceMappingURL=chunk-3EP5V2F4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/load-connector.ts"],"sourcesContent":["/**\r\n * core/load-connector — discover, load, and register connector definitions.\r\n *\r\n * Responsibilities:\r\n * 1. Locate the developer's `agent-connector.config.{mjs,js,json}` by walking\r\n * upward from a start directory (the project root convention).\r\n * 2. Load a config from a path into a LIVE ResolvedConnector (with handlers).\r\n * 3. Register a connector by persisting SERIALIZABLE metadata (no functions)\r\n * to `connectorDir(id)/connector.json`, pointing at the source module so\r\n * live handlers can be re-imported at runtime from a stable record.\r\n *\r\n * Why split live vs. serialized? Hook handlers are functions and cannot survive\r\n * JSON. The registry stores only what JSON can hold plus an absolute\r\n * `modulePath`; the runtime re-imports that module to recover the live handlers.\r\n */\r\n\r\nimport { existsSync, readdirSync, readFileSync, realpathSync, rmSync, writeFileSync } from \"node:fs\";\r\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\r\nimport { pathToFileURL } from \"node:url\";\r\n\r\nimport type {\r\n CommandDef,\r\n HookEventName,\r\n InstallScope,\r\n MemoryDef,\r\n PlatformId,\r\n PlatformOverride,\r\n ResolvedConnector,\r\n ServerDef,\r\n SkillDef,\r\n SubagentDef,\r\n} from \"./types.js\";\r\nimport { defineConnector } from \"./define-connector.js\";\r\nimport { assertNoSymlinkInPath, connectorDir, connectorsDir, ensureDir } from \"./paths.js\";\r\nimport {\r\n readConnectorPackageMetadataNearFile,\r\n withConnectorPackageMetadata,\r\n} from \"./package-metadata.js\";\r\n\r\n/** Candidate config filenames, in resolution-precedence order. */\r\nconst CONFIG_FILENAMES = [\r\n \"agent-connector.config.mjs\",\r\n \"agent-connector.config.js\",\r\n \"agent-connector.config.json\",\r\n] as const;\r\n\r\n/**\r\n * The serializable subset of a connector persisted to `connector.json`.\r\n * Hook handler functions are intentionally absent — only the absolute\r\n * `modulePath` is stored so the live ResolvedConnector can be re-imported.\r\n */\r\nexport interface RegisteredMeta {\r\n id: string;\r\n displayName: string;\r\n version: string;\r\n /** Package-derived identity, when available from config or package.json. */\r\n mcp?: ResolvedConnector[\"mcp\"];\r\n /** Absolute path to the source module that produced this connector. */\r\n modulePath: string;\r\n telemetry: ResolvedConnector[\"telemetry\"];\r\n /** Canonical event names the connector handles (handlers themselves stripped). */\r\n hookEvents: HookEventName[];\r\n hasServer: boolean;\r\n server: ServerDef | null;\r\n /**\r\n * Content surfaces (commands/skills/subagents). These are JSON-serializable\r\n * (no functions) so they persist cleanly and let uninstall locate the files\r\n * to remove even when the source module is gone.\r\n */\r\n commands: CommandDef[];\r\n skills: SkillDef[];\r\n subagents: SubagentDef[];\r\n /**\r\n * Memory entries (managed-block content surface). Plain content, persisted\r\n * whole so uninstall normally has the full entry list even when the source\r\n * module is gone (the marker prefix-scan is the fallback beyond that).\r\n */\r\n memory: MemoryDef[];\r\n targets: ResolvedConnector[\"targets\"];\r\n /** Per-platform overrides with any hook handler functions stripped. */\r\n platforms: Partial<Record<PlatformId, PlatformOverride>>;\r\n /**\r\n * The install scope this connector was registered under, persisted so the\r\n * runtime entrypoints (hook/statusline/action) can recover it cheaply (sync)\r\n * and stamp it onto the HostCtx/event — scope is an install-time property the\r\n * runtime otherwise has no access to. OPTIONAL: absent for an ad-hoc register\r\n * that passed no scope, or a record written before this field existed.\r\n * This is the install's RUN-WIDE DEFAULT scope; it can differ from the\r\n * effective per-host scope when a `platforms[host].scope` override is set (the\r\n * record is keyed by connector id only and holds no per-host scope map).\r\n */\r\n scope?: InstallScope;\r\n}\r\n\r\n/**\r\n * Search `startDir` and each ancestor for a connector config file. Returns the\r\n * absolute path to the first match (filesystem-root-stopping), or null.\r\n */\r\nexport function findConnectorConfig(startDir: string): string | null {\r\n let dir = resolve(startDir);\r\n // Walk upward until `dirname(dir) === dir` (filesystem root).\r\n for (;;) {\r\n for (const name of CONFIG_FILENAMES) {\r\n const candidate = join(dir, name);\r\n if (existsSync(candidate)) return candidate;\r\n }\r\n const parent = dirname(dir);\r\n if (parent === dir) break;\r\n dir = parent;\r\n }\r\n return null;\r\n}\r\n\r\n/** True if a value already looks like a ResolvedConnector (vs. a raw config). */\r\nfunction isResolvedConnector(value: unknown): value is ResolvedConnector {\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n Array.isArray((value as { hookEvents?: unknown }).hookEvents)\r\n );\r\n}\r\n\r\n/**\r\n * Load a connector from an absolute or relative path.\r\n * - `.json` → JSON.parse, then defineConnector().\r\n * - `.mjs` / `.js` → dynamic import (via pathToFileURL, Windows-safe),\r\n * take the default export. If it already looks like a\r\n * ResolvedConnector use it as-is; otherwise treat it as\r\n * a ConnectorConfig and run it through defineConnector().\r\n * Returns the live connector plus the absolute module path it came from.\r\n */\r\nexport async function loadConnectorFromPath(\r\n path: string,\r\n): Promise<{ connector: ResolvedConnector; modulePath: string }> {\r\n let modulePath = isAbsolute(path) ? path : resolve(path);\r\n // Canonicalize before building the file:// URL for dynamic import. On Windows a\r\n // short (8.3) temp path like C:\\Users\\RUNNER~1\\...\\x.mjs round-trips the \"~\" as\r\n // %7E and fails to load; realpathSync.native expands it to the real long path.\r\n // It also resolves symlinked temp roots (e.g. macOS /var -> /private/var).\r\n // If the file does not exist yet, fall through with the resolve()'d path so the\r\n // subsequent read/import throws the real not-found error.\r\n try {\r\n modulePath = realpathSync.native(modulePath);\r\n } catch {\r\n /* keep the resolve()'d path */\r\n }\r\n\r\n if (modulePath.endsWith(\".json\")) {\r\n const text = readFileSync(modulePath, \"utf8\");\r\n const config = JSON.parse(text) as unknown;\r\n const connector = await withConnectorPackageMetadata(\r\n readConnectorPackageMetadataNearFile(modulePath),\r\n async () => defineConnector(config as Parameters<typeof defineConnector>[0]),\r\n );\r\n return { connector, modulePath };\r\n }\r\n\r\n // .mjs / .js — dynamic ESM import. pathToFileURL keeps Windows paths valid.\r\n const moduleUrl = pathToFileURL(modulePath).href;\r\n const connector = await withConnectorPackageMetadata(\r\n readConnectorPackageMetadataNearFile(modulePath),\r\n async () => {\r\n const mod = (await import(/* @vite-ignore */ moduleUrl)) as {\r\n default?: unknown;\r\n };\r\n const exported = mod.default;\r\n if (exported == null) {\r\n throw new Error(\r\n `Connector module has no default export: ${modulePath}`,\r\n );\r\n }\r\n return isResolvedConnector(exported)\r\n ? exported\r\n : defineConnector(exported as Parameters<typeof defineConnector>[0]);\r\n },\r\n );\r\n return { connector, modulePath };\r\n}\r\n\r\n/**\r\n * Strip any function-valued `hooks` from per-platform overrides so the result\r\n * is JSON-serializable. A boolean `hooks` override is preserved; an object\r\n * override is dropped (it can only carry handler functions, which are not\r\n * serializable). `nativeHooks` declarations are persisted HANDLER-LESS (event\r\n * name + matcher only) so meta-based inspection (doctor / health checks / the\r\n * hook CLI) can still see WHICH native events were declared — the live handlers\r\n * are re-imported from `modulePath` at runtime, exactly like normalized hooks.\r\n * Everything else on the override is kept verbatim — notably `configPatch`\r\n * declarations, which are pure JSON (key/value/reason/docsUrl, no functions)\r\n * and persist WHOLE so uninstall/doctor can reason about them even when the\r\n * source module is gone.\r\n */\r\nfunction serializablePlatforms(\r\n platforms: Partial<Record<PlatformId, PlatformOverride>>,\r\n): Partial<Record<PlatformId, PlatformOverride>> {\r\n const out: Partial<Record<PlatformId, PlatformOverride>> = {};\r\n for (const [id, override] of Object.entries(platforms) as [\r\n PlatformId,\r\n PlatformOverride | undefined,\r\n ][]) {\r\n if (!override) continue;\r\n const { hooks, nativeHooks, ...rest } = override;\r\n const clean: PlatformOverride = { ...rest };\r\n // Keep only a boolean hooks flag; object hooks carry handler functions.\r\n if (typeof hooks === \"boolean\") clean.hooks = hooks;\r\n if (nativeHooks && typeof nativeHooks === \"object\") {\r\n const stripped: Record<string, { matcher?: string }> = {};\r\n for (const [event, def] of Object.entries(nativeHooks)) {\r\n stripped[event] =\r\n typeof def?.matcher === \"string\" ? { matcher: def.matcher } : {};\r\n }\r\n // Cast: the persisted record deliberately omits the (non-serializable)\r\n // handler; consumers of meta-derived connectors never dispatch handlers.\r\n clean.nativeHooks = stripped as PlatformOverride[\"nativeHooks\"];\r\n }\r\n out[id] = clean;\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Persist a connector's serializable metadata to `connectorDir(id)/connector.json`.\r\n * Handlers are NOT serialized — they are re-imported from `modulePath` at runtime.\r\n * The optional `scope` (the install scope the caller deployed under) is persisted\r\n * so the runtime entrypoints can recover it and stamp it onto the HostCtx/event.\r\n * Returns the absolute path of the written record.\r\n */\r\nexport function registerConnector(\r\n connector: ResolvedConnector,\r\n modulePath: string,\r\n scope?: InstallScope,\r\n): string {\r\n const meta: RegisteredMeta = {\r\n id: connector.id,\r\n displayName: connector.displayName,\r\n version: connector.version,\r\n ...(connector.mcp ? { mcp: connector.mcp } : {}),\r\n modulePath: resolve(modulePath),\r\n telemetry: connector.telemetry,\r\n hookEvents: connector.hookEvents,\r\n hasServer: !!connector.server,\r\n server: connector.server ?? null,\r\n commands: connector.commands,\r\n skills: connector.skills,\r\n subagents: connector.subagents,\r\n memory: connector.memory,\r\n targets: connector.targets,\r\n platforms: serializablePlatforms(connector.platforms),\r\n // Persist the install scope when the caller supplied one (the installer\r\n // passes its install scope). Omitted from the record when undefined so an\r\n // ad-hoc register stays minimal and round-trips as \"no scope known\".\r\n ...(scope !== undefined ? { scope } : {}),\r\n };\r\n\r\n const dir = connectorDir(connector.id);\r\n const outPath = join(dir, \"connector.json\");\r\n assertNoSymlinkInPath(outPath);\r\n ensureDir(dir);\r\n writeFileSync(outPath, `${JSON.stringify(meta, null, 2)}\\n`, \"utf8\");\r\n return outPath;\r\n}\r\n\r\n/**\r\n * Deregister a connector by removing its DATA-dir record directory\r\n * (`connectorDir(id)`) recursively. This is the inverse of {@link registerConnector}:\r\n * registerConnector writes `connectorDir(id)/connector.json`, but per-target\r\n * uninstall only strips host-native registrations — it never removes this record,\r\n * leaving an orphan behind. Best-effort + guarded: returns the directory path and\r\n * whether it existed before removal.\r\n */\r\nexport function deregisterConnector(id: string): {\r\n removed: boolean;\r\n path: string;\r\n} {\r\n const dir = connectorDir(id);\r\n assertNoSymlinkInPath(dir);\r\n const existed = existsSync(dir);\r\n if (existed) rmSync(dir, { recursive: true, force: true });\r\n return { removed: existed, path: dir };\r\n}\r\n\r\n/**\r\n * Read the registered metadata record for `id`, or null if not registered or\r\n * the record is unreadable/corrupt.\r\n */\r\nexport function readRegisteredMeta(id: string): RegisteredMeta | null {\r\n const recordPath = join(connectorDir(id), \"connector.json\");\r\n if (!existsSync(recordPath)) return null;\r\n try {\r\n return JSON.parse(readFileSync(recordPath, \"utf8\")) as RegisteredMeta;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Load the LIVE ResolvedConnector (with hook handlers) for a registered id by\r\n * re-importing its source module. Throws a clear error when the connector is\r\n * not registered or its source module no longer resolves to it.\r\n */\r\nexport async function loadRegisteredConnector(\r\n id: string,\r\n): Promise<ResolvedConnector> {\r\n const meta = readRegisteredMeta(id);\r\n if (!meta) {\r\n throw new Error(\r\n `Connector \"${id}\" is not registered (no record at ${join(connectorDir(id), \"connector.json\")}). ` +\r\n `Run an install/register step first.`,\r\n );\r\n }\r\n if (!meta.modulePath || !existsSync(meta.modulePath)) {\r\n throw new Error(\r\n `Connector \"${id}\" record points at a missing module: ${meta.modulePath}`,\r\n );\r\n }\r\n const { connector } = await loadConnectorFromPath(meta.modulePath);\r\n return connector;\r\n}\r\n\r\n/**\r\n * Build a handler-less ResolvedConnector from stored metadata. Suitable for\r\n * inspection/doctor where live hook handlers are not needed (and where the\r\n * source module may even be gone). `hooks` is empty; `hookEvents` is preserved.\r\n */\r\nexport function connectorFromMeta(meta: RegisteredMeta): ResolvedConnector {\r\n return {\r\n id: meta.id,\r\n displayName: meta.displayName,\r\n version: meta.version,\r\n ...(meta.mcp ? { mcp: meta.mcp } : {}),\r\n ...(meta.server ? { server: meta.server } : {}),\r\n hooks: {},\r\n hookEvents: meta.hookEvents ?? [],\r\n telemetry: meta.telemetry,\r\n commands: meta.commands ?? [],\r\n skills: meta.skills ?? [],\r\n subagents: meta.subagents ?? [],\r\n memory: meta.memory ?? [],\r\n // Actions carry live `run` handlers, so they are NOT serialized into the\r\n // record (like the statusline render). A handler-less meta-derived connector\r\n // gets [] — inspection/uninstall never dispatch action handlers, and the\r\n // BaseAdapter action default already tolerates an empty list.\r\n actions: [],\r\n platforms: meta.platforms ?? {},\r\n targets: meta.targets,\r\n };\r\n}\r\n\r\n/**\r\n * List every registered connector as a handler-less ResolvedConnector (read\r\n * from `connectorsDir()`). Used by doctor to health-check what is actually\r\n * installed, rather than guessing from the local working directory.\r\n */\r\nexport function listRegisteredConnectors(): ResolvedConnector[] {\r\n const dir = connectorsDir();\r\n if (!existsSync(dir)) return [];\r\n const out: ResolvedConnector[] = [];\r\n for (const entry of readdirSync(dir)) {\r\n const meta = readRegisteredMeta(entry);\r\n if (meta) out.push(connectorFromMeta(meta));\r\n }\r\n return out;\r\n}\r\n"],"mappings":"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","names":["connector"]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  buildHomeBinActionCommand,
4
4
  buildHomeBinHookCommand
5
- } from "./chunk-4NHXLXSD.js";
5
+ } from "./chunk-Y3K6KJMS.js";
6
6
  import {
7
7
  MEMORY_CONTENT_SOFT_BUDGET_BYTES,
8
8
  listManagedBlocks,
@@ -11,12 +11,12 @@ import {
11
11
  removeManagedBlocksFile,
12
12
  saveMemoryLedger,
13
13
  upsertManagedBlockFile
14
- } from "./chunk-UMQ6NBQR.js";
14
+ } from "./chunk-ILWHLGIC.js";
15
15
  import {
16
16
  backupsDir,
17
17
  ensureDir,
18
18
  firstSymlinkInPath
19
- } from "./chunk-GZGLCCEE.js";
19
+ } from "./chunk-QYOUQCC6.js";
20
20
 
21
21
  // src/core/jsonc.ts
22
22
  function stripJsonc(text) {
@@ -1265,4 +1265,4 @@ export {
1265
1265
  renderOpenCodeSubagentMd,
1266
1266
  BaseAdapter
1267
1267
  };
1268
- //# sourceMappingURL=chunk-MGTDQLJJ.js.map
1268
+ //# sourceMappingURL=chunk-3FINQ2ZF.js.map