@ken-jo/agent-connector 0.4.95 → 0.4.98

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 -599
  4. package/dist/{action-Q7GGO4PA.js → action-5JM23CFJ.js} +16 -16
  5. package/dist/action-5JM23CFJ.js.map +1 -0
  6. package/dist/{amazon-q-ETMAGY3D.js → amazon-q-LFZNGN27.js} +6 -6
  7. package/dist/amazon-q-LFZNGN27.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-S22XTPEQ.js} +7 -7
  11. package/dist/amp-S22XTPEQ.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-PZXYAO3X.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-PN474FXM.js} +9 -9
  18. package/dist/antigravity-cli-PN474FXM.js.map +1 -0
  19. package/dist/audit-2H7E3Z4N.js +311 -0
  20. package/dist/audit-2H7E3Z4N.js.map +1 -0
  21. package/dist/{chunk-KHO5WNTP.js → chunk-4GH2KA7V.js} +1 -1
  22. package/dist/chunk-4GH2KA7V.js.map +1 -0
  23. package/dist/{chunk-7F5KHLEP.js → chunk-6XWORQM6.js} +4 -4
  24. package/dist/chunk-6XWORQM6.js.map +1 -0
  25. package/dist/{chunk-2Y2MZRLP.js → chunk-7C2IPIIB.js} +3 -3
  26. package/dist/chunk-7C2IPIIB.js.map +1 -0
  27. package/dist/{chunk-NLE2J5P4.js → chunk-7HHW23AC.js} +29 -29
  28. package/dist/chunk-7HHW23AC.js.map +1 -0
  29. package/dist/{chunk-XD7MY6HB.js → chunk-7PSNXUFK.js} +1 -1
  30. package/dist/chunk-7PSNXUFK.js.map +1 -0
  31. package/dist/{chunk-YPAXJ7EW.js → chunk-7VSZXOXJ.js} +13 -13
  32. package/dist/chunk-7VSZXOXJ.js.map +1 -0
  33. package/dist/{chunk-ISEJWBFF.js → chunk-B6PKHS5I.js} +2 -2
  34. package/dist/chunk-B6PKHS5I.js.map +1 -0
  35. package/dist/{chunk-UM5S7DKK.js → chunk-C747DYNT.js} +1 -1
  36. package/dist/chunk-C747DYNT.js.map +1 -0
  37. package/dist/{chunk-PW42ZXCB.js → chunk-DOPFBUCX.js} +3 -3
  38. package/dist/chunk-DOPFBUCX.js.map +1 -0
  39. package/dist/{chunk-I5UXHIDT.js → chunk-DWZ5IWF4.js} +8 -8
  40. package/dist/chunk-DWZ5IWF4.js.map +1 -0
  41. package/dist/{chunk-6WZODR3Z.js → chunk-FJ6F5U3W.js} +5 -5
  42. package/dist/chunk-FJ6F5U3W.js.map +1 -0
  43. package/dist/{chunk-H33M77DD.js → chunk-HATCOSQT.js} +22 -19
  44. package/dist/chunk-HATCOSQT.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-3NH2ARIS.js → chunk-KTBAB556.js} +6 -6
  54. package/dist/chunk-KTBAB556.js.map +1 -0
  55. package/dist/{chunk-5IOTP7LQ.js → chunk-KWC5DQ5Z.js} +7 -5
  56. package/dist/chunk-KWC5DQ5Z.js.map +1 -0
  57. package/dist/{chunk-JKKU2WKG.js → chunk-LD5HAN6O.js} +4 -4
  58. package/dist/chunk-LD5HAN6O.js.map +1 -0
  59. package/dist/{chunk-OP4KBXUO.js → chunk-LFWYYWLV.js} +1 -1
  60. package/dist/chunk-LFWYYWLV.js.map +1 -0
  61. package/dist/{chunk-APZDTY76.js → chunk-LZL2YITN.js} +7 -7
  62. package/dist/chunk-LZL2YITN.js.map +1 -0
  63. package/dist/{chunk-H53QZQJI.js → chunk-PSGTHJQU.js} +1 -1
  64. package/dist/chunk-PSGTHJQU.js.map +1 -0
  65. package/dist/{chunk-FBJQGRET.js → chunk-Q4ISQHUQ.js} +1 -1
  66. package/dist/chunk-Q4ISQHUQ.js.map +1 -0
  67. package/dist/{chunk-6TF7MHG5.js → chunk-Q7PR2WGT.js} +2 -2
  68. package/dist/chunk-Q7PR2WGT.js.map +1 -0
  69. package/dist/{chunk-GZGLCCEE.js → chunk-QYOUQCC6.js} +1 -1
  70. package/dist/chunk-QYOUQCC6.js.map +1 -0
  71. package/dist/{chunk-Z2MRSS2I.js → chunk-RNVIK5YJ.js} +2 -2
  72. package/dist/chunk-RNVIK5YJ.js.map +1 -0
  73. package/dist/{chunk-XC5SJ35F.js → chunk-RPWD5H6Y.js} +5 -5
  74. package/dist/chunk-RPWD5H6Y.js.map +1 -0
  75. package/dist/{chunk-PAPMUAR5.js → chunk-S25MVWBP.js} +12 -12
  76. package/dist/chunk-S25MVWBP.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-D4ELPBB5.js → chunk-TOSNS2BY.js} +43 -43
  80. package/dist/chunk-TOSNS2BY.js.map +1 -0
  81. package/dist/{chunk-MGTDQLJJ.js → chunk-UNU2KPYJ.js} +11 -9
  82. package/dist/chunk-UNU2KPYJ.js.map +1 -0
  83. package/dist/{chunk-MQPNU2CY.js → chunk-UZZTWWGG.js} +1 -1
  84. package/dist/chunk-UZZTWWGG.js.map +1 -0
  85. package/dist/{chunk-4NHXLXSD.js → chunk-W7AGWAMH.js} +2 -2
  86. package/dist/chunk-W7AGWAMH.js.map +1 -0
  87. package/dist/{chunk-OPXAP3AC.js → chunk-XN7S44U4.js} +1 -1
  88. package/dist/chunk-XN7S44U4.js.map +1 -0
  89. package/dist/{chunk-BEFVJ2OE.js → chunk-XXLCMSD3.js} +1 -1
  90. package/dist/chunk-XXLCMSD3.js.map +1 -0
  91. package/dist/{chunk-YT43MUSJ.js → chunk-XZWMJLIT.js} +1 -1
  92. package/dist/chunk-XZWMJLIT.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-GRWO6XBZ.js → claude-code-TA53454O.js} +13 -13
  98. package/dist/claude-code-TA53454O.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-GZFN32BM.js} +6 -6
  104. package/dist/cline-GZFN32BM.js.map +1 -0
  105. package/dist/{codebuddy-ZNYQACMF.js → codebuddy-IYS3TQZ3.js} +7 -7
  106. package/dist/codebuddy-IYS3TQZ3.js.map +1 -0
  107. package/dist/{codebuff-ETYT5UBL.js → codebuff-6KWBW6CT.js} +4 -4
  108. package/dist/codebuff-6KWBW6CT.js.map +1 -0
  109. package/dist/{codebuff-VR6JUDIY.js → codebuff-D3MIKJHC.js} +6 -6
  110. package/dist/codebuff-D3MIKJHC.js.map +1 -0
  111. package/dist/{codex-YAORPCOD.js → codex-DKBAAUCO.js} +4 -4
  112. package/dist/codex-DKBAAUCO.js.map +1 -0
  113. package/dist/{codex-CPNKTXG3.js → codex-ZKLP5IXZ.js} +9 -9
  114. package/dist/codex-ZKLP5IXZ.js.map +1 -0
  115. package/dist/{continue-WU2IB5KS.js → continue-I34FNSTJ.js} +8 -8
  116. package/dist/continue-I34FNSTJ.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-NWPM5GE6.js} +7 -7
  120. package/dist/copilot-cli-NWPM5GE6.js.map +1 -0
  121. package/dist/{crush-QBXLNN7T.js → crush-A5C5USRL.js} +4 -4
  122. package/dist/crush-A5C5USRL.js.map +1 -0
  123. package/dist/{crush-3AVQA4YU.js → crush-MDGPZSZU.js} +7 -7
  124. package/dist/crush-MDGPZSZU.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-JRVK56QA.js +22 -0
  128. package/dist/{define-connector-DTWb46UB.d.ts → define-connector-B7tLHVnx.d.ts} +1 -1
  129. package/dist/{detect-6V4LC3MA.js → detect-FKJC36P4.js} +4 -4
  130. package/dist/detect-FKJC36P4.js.map +1 -0
  131. package/dist/{devin-QMEM3OFA.js → devin-TZMRC57O.js} +7 -7
  132. package/dist/devin-TZMRC57O.js.map +1 -0
  133. package/dist/{doctor-2YDUVSAU.js → doctor-PGVYUQYG.js} +26 -26
  134. package/dist/doctor-PGVYUQYG.js.map +1 -0
  135. package/dist/{droid-U3ZBLQFO.js → droid-PFQ2PZSF.js} +4 -4
  136. package/dist/droid-PFQ2PZSF.js.map +1 -0
  137. package/dist/{droid-MOKV53J4.js → droid-SCFWDJR4.js} +7 -7
  138. package/dist/droid-SCFWDJR4.js.map +1 -0
  139. package/dist/{gemini-cli-47ZHCOZR.js → gemini-cli-MLDGOR2L.js} +8 -8
  140. package/dist/gemini-cli-MLDGOR2L.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-4EI5MYTI.js → goose-5DBHDSJW.js} +9 -9
  144. package/dist/goose-5DBHDSJW.js.map +1 -0
  145. package/dist/{goose-64V46Y2W.js → goose-K2HKUTBK.js} +4 -4
  146. package/dist/goose-K2HKUTBK.js.map +1 -0
  147. package/dist/{grok-cli-QYQPDSVB.js → grok-cli-LX6Q6RUY.js} +7 -7
  148. package/dist/grok-cli-LX6Q6RUY.js.map +1 -0
  149. package/dist/{hermes-F75OSK3Y.js → hermes-LJB3SJKB.js} +7 -7
  150. package/dist/hermes-LJB3SJKB.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-OEVRDMXD.js → hook-PVGBQUQI.js} +16 -16
  154. package/dist/hook-PVGBQUQI.js.map +1 -0
  155. package/dist/index.d.ts +3 -3
  156. package/dist/index.js +5 -5
  157. package/dist/{install-5NMCUDG5.js → install-HPDIK7F6.js} +192 -28
  158. package/dist/install-HPDIK7F6.js.map +1 -0
  159. package/dist/{introspect-dNekqPDY.d.ts → introspect-DWCu0Krk.d.ts} +1 -1
  160. package/dist/{jetbrains-copilot-ZGIWI6YV.js → jetbrains-copilot-2DSVAJMJ.js} +6 -6
  161. package/dist/jetbrains-copilot-2DSVAJMJ.js.map +1 -0
  162. package/dist/{junie-DIFN2P22.js → junie-GUBDRADP.js} +6 -6
  163. package/dist/junie-GUBDRADP.js.map +1 -0
  164. package/dist/{kilo-EMZJBEBB.js → kilo-HRLWMENX.js} +8 -8
  165. package/dist/kilo-HRLWMENX.js.map +1 -0
  166. package/dist/{kilo-SW7BH6EG.js → kilo-SMHPOHJ5.js} +4 -4
  167. package/dist/kilo-SMHPOHJ5.js.map +1 -0
  168. package/dist/{kilo-cli-S3GXBPAE.js → kilo-cli-IQMFMYZF.js} +8 -8
  169. package/dist/kilo-cli-IQMFMYZF.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-EPD46UJK.js} +7 -7
  173. package/dist/kimi-EPD46UJK.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-BYX4HEAJ.js → kiro-A7DL52FX.js} +7 -7
  177. package/dist/kiro-A7DL52FX.js.map +1 -0
  178. package/dist/{kiro-WGOI5CGT.js → kiro-NYRRBIKW.js} +4 -4
  179. package/dist/kiro-NYRRBIKW.js.map +1 -0
  180. package/dist/{leaderboard-XEKS7B3H.js → leaderboard-KCT7XPCI.js} +7 -7
  181. package/dist/leaderboard-KCT7XPCI.js.map +1 -0
  182. package/dist/{mimo-code-7R53QDHB.js → mimo-code-NDGLBXNC.js} +7 -7
  183. package/dist/mimo-code-NDGLBXNC.js.map +1 -0
  184. package/dist/{mistral-vibe-LHJ55FSB.js → mistral-vibe-LLWASF5X.js} +6 -6
  185. package/dist/mistral-vibe-LLWASF5X.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-ON4QK3OC.js} +6 -6
  189. package/dist/mux-ON4QK3OC.js.map +1 -0
  190. package/dist/{nemoclaw-WSIPSE7U.js → nemoclaw-45R5MFBF.js} +7 -7
  191. package/dist/nemoclaw-45R5MFBF.js.map +1 -0
  192. package/dist/{omp-562NK5BJ.js → omp-ROCTFV3A.js} +7 -7
  193. package/dist/omp-ROCTFV3A.js.map +1 -0
  194. package/dist/{open-interpreter-I2CNOEXY.js → open-interpreter-V6CN542J.js} +6 -6
  195. package/dist/open-interpreter-V6CN542J.js.map +1 -0
  196. package/dist/openclaw-AOKFJGRQ.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-YYWQ45LF.js} +7 -7
  200. package/dist/opencode-YYWQ45LF.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-OFFMWCQW.js} +7 -7
  204. package/dist/openhands-OFFMWCQW.js.map +1 -0
  205. package/dist/{package-G25GVTH2.js → package-TALOSRQ4.js} +15 -15
  206. package/dist/package-TALOSRQ4.js.map +1 -0
  207. package/dist/{pi-644FIN3A.js → pi-4W74ETTI.js} +6 -6
  208. package/dist/pi-4W74ETTI.js.map +1 -0
  209. package/dist/{pi-GGDQREVG.js → pi-DLKCPOJE.js} +4 -4
  210. package/dist/pi-DLKCPOJE.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-JOBFNEVT.js} +16 -16
  214. package/dist/qwen-code-JOBFNEVT.js.map +1 -0
  215. package/dist/{roo-code-SUWI4BBN.js → roo-code-HSAE2CJU.js} +4 -4
  216. package/dist/roo-code-HSAE2CJU.js.map +1 -0
  217. package/dist/{roo-code-DLPIHHQ6.js → roo-code-RHIGJZNY.js} +6 -6
  218. package/dist/roo-code-RHIGJZNY.js.map +1 -0
  219. package/dist/runtime/index.d.ts +9 -8
  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-XTMIUHKK.js → serve-4TEHK726.js} +16 -16
  227. package/dist/serve-4TEHK726.js.map +1 -0
  228. package/dist/{status-VJAGO4Z7.js → status-DVD4EHMX.js} +11 -11
  229. package/dist/status-DVD4EHMX.js.map +1 -0
  230. package/dist/{statusline-EY2E2UGF.js → statusline-ZVNH7XBK.js} +15 -15
  231. package/dist/statusline-ZVNH7XBK.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-OLZQBADT.js → telemetry-NWUJPIK3.js} +10 -10
  235. package/dist/telemetry-NWUJPIK3.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-TLAFSQRQ.js} +6 -6
  239. package/dist/trae-TLAFSQRQ.js.map +1 -0
  240. package/dist/{types-JyhpJHJa.d.ts → types-C6j18a6R.d.ts} +13 -14
  241. package/dist/{uninstall-AZEUPAND.js → uninstall-DZVFV7KE.js} +21 -21
  242. package/dist/uninstall-DZVFV7KE.js.map +1 -0
  243. package/dist/{upgrade-CAUUHSSC.js → upgrade-OUE4ED52.js} +21 -21
  244. package/dist/upgrade-OUE4ED52.js.map +1 -0
  245. package/dist/{usage-3KHZ4RYZ.js → usage-NT3ZXALZ.js} +4 -4
  246. package/dist/usage-NT3ZXALZ.js.map +1 -0
  247. package/dist/{usage-event-TZWOZPRJ.js → usage-event-IELZE6WO.js} +15 -15
  248. package/dist/usage-event-IELZE6WO.js.map +1 -0
  249. package/dist/{vscode-copilot-NIMH2DGU.js → vscode-copilot-VZ5XYSTK.js} +7 -7
  250. package/dist/vscode-copilot-VZ5XYSTK.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-P2HWXIKT.js} +6 -6
  254. package/dist/warp-P2HWXIKT.js.map +1 -0
  255. package/dist/{windsurf-75LLZ37C.js → windsurf-3JC73GZK.js} +6 -6
  256. package/dist/windsurf-3JC73GZK.js.map +1 -0
  257. package/dist/{zed-HKAZXEJW.js → zed-6CMUKXLI.js} +7 -7
  258. package/dist/zed-6CMUKXLI.js.map +1 -0
  259. package/dist/{zed-XJFOOKCO.js → zed-XXCNYOIN.js} +4 -4
  260. package/dist/zed-XXCNYOIN.js.map +1 -0
  261. package/package.json +92 -88
  262. package/dist/action-Q7GGO4PA.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-2Y2MZRLP.js.map +0 -1
  271. package/dist/chunk-3NH2ARIS.js.map +0 -1
  272. package/dist/chunk-4NHXLXSD.js.map +0 -1
  273. package/dist/chunk-5IOTP7LQ.js.map +0 -1
  274. package/dist/chunk-6TF7MHG5.js.map +0 -1
  275. package/dist/chunk-6WZODR3Z.js.map +0 -1
  276. package/dist/chunk-7F5KHLEP.js.map +0 -1
  277. package/dist/chunk-APZDTY76.js.map +0 -1
  278. package/dist/chunk-BEFVJ2OE.js.map +0 -1
  279. package/dist/chunk-D4ELPBB5.js.map +0 -1
  280. package/dist/chunk-FBJQGRET.js.map +0 -1
  281. package/dist/chunk-FJCUKXGX.js.map +0 -1
  282. package/dist/chunk-GZGLCCEE.js.map +0 -1
  283. package/dist/chunk-H33M77DD.js.map +0 -1
  284. package/dist/chunk-H53QZQJI.js.map +0 -1
  285. package/dist/chunk-I5UXHIDT.js.map +0 -1
  286. package/dist/chunk-ISEJWBFF.js.map +0 -1
  287. package/dist/chunk-IVAWP6HH.js.map +0 -1
  288. package/dist/chunk-JKKU2WKG.js.map +0 -1
  289. package/dist/chunk-KHO5WNTP.js.map +0 -1
  290. package/dist/chunk-MGTDQLJJ.js.map +0 -1
  291. package/dist/chunk-MQPNU2CY.js.map +0 -1
  292. package/dist/chunk-NBYKLUF6.js.map +0 -1
  293. package/dist/chunk-NLE2J5P4.js.map +0 -1
  294. package/dist/chunk-O7SDRBVB.js.map +0 -1
  295. package/dist/chunk-OP4KBXUO.js.map +0 -1
  296. package/dist/chunk-OPXAP3AC.js.map +0 -1
  297. package/dist/chunk-PAPMUAR5.js.map +0 -1
  298. package/dist/chunk-PW42ZXCB.js.map +0 -1
  299. package/dist/chunk-RK6VBLXP.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-YPAXJ7EW.js.map +0 -1
  305. package/dist/chunk-YT43MUSJ.js.map +0 -1
  306. package/dist/chunk-Z2MRSS2I.js.map +0 -1
  307. package/dist/claude-code-GRWO6XBZ.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-6V4LC3MA.js.map +0 -1
  323. package/dist/devin-QMEM3OFA.js.map +0 -1
  324. package/dist/doctor-2YDUVSAU.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-OEVRDMXD.js.map +0 -1
  335. package/dist/install-5NMCUDG5.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-XEKS7B3H.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-G25GVTH2.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-XTMIUHKK.js.map +0 -1
  367. package/dist/status-VJAGO4Z7.js.map +0 -1
  368. package/dist/statusline-EY2E2UGF.js.map +0 -1
  369. package/dist/synthetic-6FRA7P5Q.js.map +0 -1
  370. package/dist/telemetry-OLZQBADT.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-AZEUPAND.js.map +0 -1
  374. package/dist/upgrade-CAUUHSSC.js.map +0 -1
  375. package/dist/usage-3KHZ4RYZ.js.map +0 -1
  376. package/dist/usage-event-TZWOZPRJ.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-PZXYAO3X.js.map} +0 -0
  384. /package/dist/{cursor-GSLUET3V.js.map → cursor-JRVK56QA.js.map} +0 -0
  385. /package/dist/{openclaw-7EYBQS4R.js.map → openclaw-AOKFJGRQ.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/claude-code/wire.ts"],"sourcesContent":["/**\r\n * adapters/claude-code/wire — Claude Code hook wire protocol.\r\n *\r\n * Claude Code pipes a JSON object to a hook command on stdin and reads a JSON\r\n * object (or empty) from stdout, interpreting the exit code as well. This module\r\n * captures the exact stdin shape and the canonical reply shape so the adapter's\r\n * parse/format methods are a single source of truth.\r\n *\r\n * Stdin (documented Claude Code hook input):\r\n * {\r\n * session_id, transcript_path, cwd, hook_event_name,\r\n * tool_name, tool_input, tool_response, // tool events\r\n * permission_suggestions, // PermissionRequest\r\n * tool_use_id, error, is_interrupt, duration_ms, // PostToolUseFailure\r\n * agent_id, agent_type, // SubagentStart/Stop\r\n * agent_transcript_path, last_assistant_message, // SubagentStop\r\n * source, // SessionStart\r\n * reason, // SessionEnd\r\n * prompt, // UserPromptSubmit\r\n * trigger, // PreCompact\r\n * stop_hook_active, // Stop / SubagentStop\r\n * message // Notification\r\n * }\r\n *\r\n * Stdout (canonical reply): a `hookSpecificOutput` object keyed by\r\n * `hookEventName`, carrying `permissionDecision` (allow|deny|ask) +\r\n * `permissionDecisionReason`, `additionalContext`, and (PreToolUse)\r\n * `updatedInput`; PermissionRequest instead takes a nested\r\n * `decision: { behavior: \"allow\"|\"deny\", ... }`; Stop-class blocks\r\n * (Stop / SubagentStop / UserPromptSubmit / PostToolUse) take the TOP-LEVEL\r\n * `{\"decision\":\"block\",\"reason\"}`. Exit 0 = proceed; the JSON refines the\r\n * decision.\r\n */\r\n\r\nimport type { SessionStartEvent } from \"../../core/types.js\";\r\n\r\n/** Canonical Claude Code hook event names (the values of `hook_event_name`). */\r\nexport const CLAUDE_HOOK_EVENTS = [\r\n \"PreToolUse\",\r\n \"PostToolUse\",\r\n \"PreCompact\",\r\n \"SessionStart\",\r\n \"SessionEnd\",\r\n \"UserPromptSubmit\",\r\n \"Stop\",\r\n \"Notification\",\r\n \"PermissionRequest\",\r\n \"PostToolUseFailure\",\r\n \"SubagentStart\",\r\n \"SubagentStop\",\r\n] as const;\r\n\r\nexport type ClaudeHookEvent = (typeof CLAUDE_HOOK_EVENTS)[number];\r\n\r\n/**\r\n * Raw Claude Code hook stdin payload. Every field is optional — a given event\r\n * only populates the subset relevant to it. `connector` is NOT a Claude field;\r\n * it is threaded in by the universal entrypoint so parseEvent can recover the\r\n * connector id (the home binary passes `--connector <id>` and may inject it).\r\n */\r\nexport interface ClaudeWireInput {\r\n session_id?: string;\r\n transcript_path?: string;\r\n cwd?: string;\r\n hook_event_name?: string;\r\n\r\n // tool events\r\n tool_name?: string;\r\n tool_input?: Record<string, unknown>;\r\n /** PostToolUse result payload (string or structured). */\r\n tool_response?: unknown;\r\n\r\n // PermissionRequest — permission-update entries the dialog would offer.\r\n // NOTE: the docs explicitly state PermissionRequest has NO tool_use_id.\r\n permission_suggestions?: unknown[];\r\n\r\n // PostToolUseFailure\r\n tool_use_id?: string;\r\n error?: string;\r\n is_interrupt?: boolean;\r\n duration_ms?: number;\r\n\r\n // SubagentStart / SubagentStop — agent_type is unreliable on SubagentStop\r\n // (the SDK may not populate it); treat both as optional everywhere.\r\n agent_id?: string;\r\n agent_type?: string;\r\n // SubagentStop — the subagent's OWN transcript (transcript_path stays the\r\n // parent session's) + the text of its final response.\r\n agent_transcript_path?: string;\r\n last_assistant_message?: string;\r\n\r\n // SessionStart\r\n source?: string;\r\n // SessionEnd\r\n reason?: string;\r\n // UserPromptSubmit\r\n prompt?: string;\r\n // PreCompact\r\n trigger?: string;\r\n // Stop / SubagentStop\r\n stop_hook_active?: boolean;\r\n // Notification\r\n message?: string;\r\n\r\n /** Injected by the entrypoint so the runtime knows which connector to dispatch. */\r\n connector?: string;\r\n}\r\n\r\n/**\r\n * Extract a stable session id from a Claude wire payload.\r\n * Priority mirrors the proven adapter: transcript UUID > session_id > \"\".\r\n * (The framework's normalized event uses \"\" when no id is available, per\r\n * core/types BaseEvent.sessionId docstring — no ppid fabrication here.)\r\n */\r\nexport function extractSessionId(input: ClaudeWireInput): string {\r\n if (typeof input.transcript_path === \"string\") {\r\n const m = input.transcript_path.match(/([a-f0-9-]{36})\\.jsonl$/);\r\n if (m && m[1]) return m[1];\r\n }\r\n if (typeof input.session_id === \"string\" && input.session_id !== \"\") {\r\n return input.session_id;\r\n }\r\n return \"\";\r\n}\r\n\r\n/** Coerce a Claude PostToolUse `tool_response` into a string for the normalized event. */\r\nexport function toolResponseToString(value: unknown): string | undefined {\r\n if (value == null) return undefined;\r\n if (typeof value === \"string\") return value;\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n}\r\n\r\n/** Map a host's raw session-start \"source\" to the canonical SessionStart source. */\r\nexport function normalizeSessionSource(source: string | undefined): SessionStartEvent[\"source\"] {\r\n switch (source) {\r\n case \"compact\":\r\n return \"compact\";\r\n case \"resume\":\r\n return \"resume\";\r\n case \"clear\":\r\n return \"clear\";\r\n default:\r\n return \"startup\";\r\n }\r\n}\r\n"],"mappings":";;;AAkHO,SAAS,iBAAiB,OAAgC;AAC/D,MAAI,OAAO,MAAM,oBAAoB,UAAU;AAC7C,UAAM,IAAI,MAAM,gBAAgB,MAAM,yBAAyB;AAC/D,QAAI,KAAK,EAAE,CAAC,EAAG,QAAO,EAAE,CAAC;AAAA,EAC3B;AACA,MAAI,OAAO,MAAM,eAAe,YAAY,MAAM,eAAe,IAAI;AACnE,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;AAGO,SAAS,qBAAqB,OAAoC;AACvE,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAGO,SAAS,uBAAuB,QAAyD;AAC9F,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;","names":[]}
@@ -35,4 +35,4 @@ function bridge(event, payload) {
35
35
  export {
36
36
  renderBridgePrelude
37
37
  };
38
- //# sourceMappingURL=chunk-FBJQGRET.js.map
38
+ //# sourceMappingURL=chunk-Q4ISQHUQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/ts-plugin-bridge.ts"],"sourcesContent":["/**\r\n * Pure string-builder for the byte-identical HEAD of every ts-plugin host's\r\n * generated plugin module: the `HOME_BIN`/`CONNECTOR_ID` consts plus the\r\n * cross-OS `bridge(event, payload)` entrypoint (win32 `execSync`-quoted vs\r\n * POSIX `execFileSync`, fail-open `JSON.parse`).\r\n *\r\n * This module emits SOURCE TEXT only — it imports nothing at runtime and is\r\n * never loaded by a generated plugin. The 6 adopting hosts (amp, kilo,\r\n * kilo-cli, mimo-code, omp, opencode) differ in this region by exactly four\r\n * host-specific tokens, captured below. Changing the emitted bytes here changes\r\n * every host's generated plugin in lockstep; each host's adapter suite runs the\r\n * generated plugin live and asserts source substrings, so it is the byte oracle.\r\n */\r\n\r\nexport interface BridgePreludeOptions {\r\n /** Absolute home-bin path (raw — JSON.stringified inside). */\r\n homeBin: string;\r\n /** Connector id (raw — JSON.stringified inside). */\r\n connectorId: string;\r\n /** Host hook subcommand slug used in the `hook <slug>` argv (e.g. \"opencode\", \"amp\"). */\r\n hookSlug: string;\r\n /** Host noun for the jsdoc `@param payload <noun>-shaped …` line (e.g. \"OpenCode\", \"amp\", \"OMP\"). */\r\n payloadNoun: string;\r\n /** Optional suffix on the jsdoc `@param event canonical event name<eventDoc>` line (e.g. \" (PreToolUse|PostToolUse|SessionStart)\"). Default \"\". */\r\n eventDoc?: string;\r\n /** The exact fail-open catch-comment line (host wording differs). */\r\n failOpenComment: string;\r\n}\r\n\r\n/**\r\n * Render the HOME_BIN/CONNECTOR_ID consts + the universal-entrypoint bridge() —\r\n * the byte-identical head of every ts-plugin host's generated plugin module.\r\n */\r\nexport function renderBridgePrelude(opts: BridgePreludeOptions): string {\r\n return `const HOME_BIN = ${JSON.stringify(opts.homeBin)};\r\nconst CONNECTOR_ID = ${JSON.stringify(opts.connectorId)};\r\n\r\n/**\r\n * Invoke the universal hook entrypoint for one event.\r\n * @param {string} event canonical event name${opts.eventDoc ?? \"\"}\r\n * @param {object} payload ${opts.payloadNoun}-shaped payload posted on stdin\r\n * @returns {object|null} normalized HookResponse, or null on any failure\r\n */\r\nfunction bridge(event, payload) {\r\n try {\r\n // On Windows HOME_BIN is the agent-connector.cmd launcher: Node cannot\r\n // execFile a batch file, and shell+args is deprecated (DEP0190), so run one\r\n // quoted command line via a shell. POSIX keeps the direct execFile (no shell).\r\n const args = [\"hook\", ${JSON.stringify(opts.hookSlug)}, event, \"--connector\", CONNECTOR_ID];\r\n const opts = { input: JSON.stringify(payload), encoding: \"utf8\" };\r\n const stdout =\r\n process.platform === \"win32\"\r\n ? execSync([HOME_BIN, ...args].map((a) => '\"' + a + '\"').join(\" \"), opts)\r\n : execFileSync(HOME_BIN, args, opts);\r\n const text = (stdout || \"\").trim();\r\n if (text === \"\") return { decision: \"allow\" };\r\n return JSON.parse(text);\r\n } catch {\r\n // ${opts.failOpenComment}\r\n return null;\r\n }\r\n}`;\r\n}\r\n"],"mappings":";;;AAiCO,SAAS,oBAAoB,MAAoC;AACtE,SAAO,oBAAoB,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA,uBAClC,KAAK,UAAU,KAAK,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA,+CAIR,KAAK,YAAY,EAAE;AAAA,6BACrC,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAQjB,KAAK,UAAU,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAUhD,KAAK,eAAe;AAAA;AAAA;AAAA;AAI7B;","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  inferModelFamily,
5
5
  openStore,
6
6
  worstConfidence
7
- } from "./chunk-IVAWP6HH.js";
7
+ } from "./chunk-IOJDZJ72.js";
8
8
 
9
9
  // src/telemetry/surface-footprint.ts
10
10
  function countParts(parts, family, tok) {
@@ -590,4 +590,4 @@ export {
590
590
  formatHostNativeTurns,
591
591
  formatSurfaceLeaderboard
592
592
  };
593
- //# sourceMappingURL=chunk-6TF7MHG5.js.map
593
+ //# sourceMappingURL=chunk-Q7PR2WGT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/telemetry/surface-footprint.ts","../src/telemetry/leaderboard.ts"],"sourcesContent":["/**\r\n * telemetry/surface-footprint — the STATIC developer-axis surfaces.\r\n *\r\n * Commands, skills, and subagents are NOT runtime-intercepted: the host loads\r\n * them as context (slash-command bodies, SKILL.md + resources, subagent system\r\n * prompts) and we never sit in the byte path the way the serve-proxy does for a\r\n * server or the hook runtime does for a hook. So we do NOT (and must not) write\r\n * fake usage rows for them. Instead we compute a deterministic STATIC FOOTPRINT:\r\n * the token cost the surface IMPOSES on a host that loads it, tokenized with the\r\n * SAME shared tokenizer the proxy + hook runtime use.\r\n *\r\n * This is pure: the only input is the passed {@link ResolvedConnector}; there is\r\n * no IO beyond reading that object's already-loaded fields.\r\n */\r\n\r\nimport type { ResolvedConnector } from \"../core/types.js\";\r\nimport { getTokenizer, inferModelFamily } from \"./tokenizer.js\";\r\nimport type { ModelFamily, SurfaceKind, Tokenizer } from \"./types.js\";\r\n\r\n/**\r\n * One static surface footprint: a content surface (command/skill/subagent) and\r\n * the token cost it imposes on a host that loads it. `kind` is the surface kind\r\n * (never `server`/`hook` — those are runtime-measured), `name` is the surface's\r\n * declared name, and `tokens` is the tokenized whole-surface footprint.\r\n */\r\nexport interface SurfaceFootprint {\r\n surfaceKind: Extract<SurfaceKind, \"command\" | \"skill\" | \"subagent\">;\r\n name: string;\r\n tokens: number;\r\n}\r\n\r\n/** Tokenize a list of text fragments (joined with \"\\n\") under `family`. */\r\nfunction countParts(\r\n parts: readonly string[],\r\n family: ModelFamily,\r\n tok: Tokenizer,\r\n): number {\r\n // A surface's footprint is its concatenated content — joining with a newline\r\n // mirrors how the host renders the fields together as one context blob.\r\n return tok.count(parts.join(\"\\n\"), family).tokens;\r\n}\r\n\r\n/**\r\n * Compute the STATIC footprints of every content surface declared on a\r\n * connector, deterministically (same input → same output) and without IO.\r\n *\r\n * • command → description + prompt + argumentHint\r\n * • skill → description + body + every resource value (sorted by path for\r\n * deterministic ordering, so the joined text is stable)\r\n * • subagent → description + prompt\r\n *\r\n * The shared {@link Tokenizer} is used so a command/skill/subagent footprint is\r\n * directly comparable with the runtime `server`/`hook` token counts. The model\r\n * family is inferred from the connector's telemetry hint (no host context here).\r\n */\r\nexport function computeSurfaceFootprints(\r\n connector: ResolvedConnector,\r\n tok: Tokenizer = getTokenizer(),\r\n): SurfaceFootprint[] {\r\n const family = inferModelFamily(\"\", connector.telemetry.modelFamilyHint);\r\n const out: SurfaceFootprint[] = [];\r\n\r\n for (const cmd of connector.commands) {\r\n const parts: string[] = [];\r\n if (cmd.description !== undefined) parts.push(cmd.description);\r\n parts.push(cmd.prompt);\r\n if (cmd.argumentHint !== undefined) parts.push(cmd.argumentHint);\r\n out.push({\r\n surfaceKind: \"command\",\r\n name: cmd.name,\r\n tokens: countParts(parts, family, tok),\r\n });\r\n }\r\n\r\n for (const skill of connector.skills) {\r\n const parts: string[] = [skill.description, skill.body];\r\n if (skill.resources !== undefined) {\r\n // Sort by resource path so the joined text (and thus the count) is stable\r\n // regardless of object key insertion order.\r\n const paths = Object.keys(skill.resources).sort();\r\n for (const p of paths) {\r\n const value = skill.resources[p];\r\n if (value !== undefined) parts.push(value);\r\n }\r\n }\r\n out.push({\r\n surfaceKind: \"skill\",\r\n name: skill.name,\r\n tokens: countParts(parts, family, tok),\r\n });\r\n }\r\n\r\n for (const agent of connector.subagents) {\r\n out.push({\r\n surfaceKind: \"subagent\",\r\n name: agent.name,\r\n tokens: countParts([agent.description, agent.prompt], family, tok),\r\n });\r\n }\r\n\r\n return out;\r\n}\r\n","/**\r\n * telemetry/leaderboard — the PLUGIN / MCP leaderboard, derived from the per-MCP\r\n * serve-proxy telemetry store (src/telemetry/*).\r\n *\r\n * This is the signature MCP-dev metric: of the MCP servers WE wrap, which one\r\n * costs the most tokens — platform-independent, because it measures the server's\r\n * OWN bytes (tool args in, tool result out, tool-defs schemas) tokenized locally,\r\n * the only signal identical across every host. Origin is always `mcp-self`; it is\r\n * NEVER summed with host-native usage (src/usage/*), which measures a different\r\n * thing (whole-conversation tokens).\r\n *\r\n * Pure aggregation + pure formatting over {@link TelemetryStore.query}. The scope\r\n * dimension (installScope/launchMethod) is OPTIONAL on each row — rows written\r\n * before those fields existed are read as \"unknown\" and are honestly labeled.\r\n */\r\n\r\nimport type { ResolvedConnector } from \"../core/types.js\";\r\nimport { openStore } from \"./store.js\";\r\nimport { computeSurfaceFootprints } from \"./surface-footprint.js\";\r\nimport { worstConfidence } from \"./types.js\";\r\nimport type {\r\n ConfidenceSource,\r\n LaunchMethod,\r\n QueryFilter,\r\n SurfaceKind,\r\n TelemetryInstallScope,\r\n TelemetryStore,\r\n ToolEventRecord,\r\n} from \"./types.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Options + scope filter\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * A scope filter value the leaderboards accept. The two install buckets\r\n * (`user`/`project`) and the launch methods (`npx`/`bunx`/`uvx`/`node`/`binary`/\r\n * `http`) plus the honest `unknown` fallback. A record matches a `user`/`project`\r\n * value by its `installScope`, and a launch-method value by its `launchMethod`.\r\n */\r\nexport type ScopeFilter =\r\n | TelemetryInstallScope\r\n | LaunchMethod;\r\n\r\n/** Every accepted {@link ScopeFilter} string, for CLI validation. */\r\nexport const SCOPE_FILTER_VALUES: readonly ScopeFilter[] = [\r\n \"user\",\r\n \"project\",\r\n \"npx\",\r\n \"bunx\",\r\n \"uvx\",\r\n \"node\",\r\n \"binary\",\r\n \"http\",\r\n \"unknown\",\r\n] as const;\r\n\r\n/** Options shared by every leaderboard query. */\r\nexport interface LeaderboardOptions {\r\n /** An open store to read from. Defaults to {@link openStore} on the data-root. */\r\n store?: TelemetryStore;\r\n /** Lower-bound epoch ms (inclusive) — forwarded as the store's sinceMs filter. */\r\n sinceMs?: number;\r\n /** Restrict to one connector. */\r\n connectorId?: string;\r\n /** Slice by install scope (user|project) or launch method (npx|binary|http|…). */\r\n scope?: ScopeFilter;\r\n}\r\n\r\n/** Is `value` one of the accepted scope-filter strings? */\r\nexport function isScopeFilter(value: string): value is ScopeFilter {\r\n return (SCOPE_FILTER_VALUES as readonly string[]).includes(value);\r\n}\r\n\r\n/** The install/launch values a `user`/`project` scope filter matches against. */\r\nconst INSTALL_SCOPES: ReadonlySet<string> = new Set<string>([\"user\", \"project\"]);\r\n\r\n/**\r\n * Does a record satisfy the requested scope slice? `user`/`project` match the\r\n * record's `installScope`; any concrete launch method matches the record's\r\n * `launchMethod`. The honest `unknown` filter is special: it matches ONLY a\r\n * record that lacks BOTH dimensions (a truly pre-scope row) — a record carrying\r\n * a known installScope but no launchMethod (or vice-versa) is NOT \"unknown\" and\r\n * must not be swept into that bucket.\r\n */\r\nfunction matchesScope(record: ToolEventRecord, scope: ScopeFilter): boolean {\r\n if (scope === \"unknown\") {\r\n return record.installScope === undefined && record.launchMethod === undefined;\r\n }\r\n if (INSTALL_SCOPES.has(scope)) {\r\n return record.installScope === scope;\r\n }\r\n return record.launchMethod === scope;\r\n}\r\n\r\n/** Build the store {@link QueryFilter} from the shared options. */\r\nfunction toFilter(opts: LeaderboardOptions): QueryFilter {\r\n const filter: QueryFilter = {};\r\n if (opts.sinceMs !== undefined) filter.sinceMs = opts.sinceMs;\r\n if (opts.connectorId !== undefined && opts.connectorId !== \"\") {\r\n filter.connectorId = opts.connectorId;\r\n }\r\n return filter;\r\n}\r\n\r\n/**\r\n * Query the store and apply the (in-memory) scope slice the store cannot. By\r\n * default EXCLUDES the host-native `model_turn` rows: this selector feeds the\r\n * per-MCP/plugin views (mcp/tool/scope), which measure per-MCP `call` + the\r\n * `tool_defs` overhead and must NEVER sum the whole-conversation host-native\r\n * turns. Pass `includeModelTurn: true` to read those rows instead (used by\r\n * {@link hostNativeTurns}).\r\n */\r\nfunction selectRecords(\r\n opts: LeaderboardOptions,\r\n includeModelTurn = false,\r\n): ToolEventRecord[] {\r\n const store = opts.store ?? openStore({});\r\n const owned = opts.store === undefined;\r\n try {\r\n let rows = store.query(toFilter(opts));\r\n rows = includeModelTurn\r\n ? rows.filter((r) => r.scope === \"model_turn\")\r\n : rows.filter((r) => r.scope !== \"model_turn\");\r\n if (opts.scope === undefined) return rows;\r\n const scope = opts.scope;\r\n return rows.filter((r) => matchesScope(r, scope));\r\n } finally {\r\n if (owned) store.close();\r\n }\r\n}\r\n\r\n// Confidence ranking + worst-of comparison live in ./types (the single source\r\n// of truth, imported as worstConfidence above) so a new ConfidenceSource value\r\n// orders correctly here as well.\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Leaderboard rows\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * One row of the MCP/plugin leaderboard — a connector ranked by total measured\r\n * tokens. `tools` is the count of distinct tool names seen (excluding the\r\n * tool-defs `*` pseudo-tool); `hostPlatforms` is the distinct set of hosts that\r\n * ran this server, evidence that the count aggregates across machines.\r\n */\r\nexport interface McpLeaderboardRow {\r\n connectorId: string;\r\n calls: number;\r\n inputTokens: number;\r\n outputTokens: number;\r\n totalTokens: number;\r\n /** Count of distinct real tool names (the tool-defs `*` row is excluded). */\r\n tools: number;\r\n /** Distinct host platforms that produced records, sorted for stable output. */\r\n hostPlatforms: string[];\r\n /** Worst (least-confident) source in the group, for honest labeling. */\r\n confidence: ConfidenceSource;\r\n lastTs: number;\r\n}\r\n\r\n/**\r\n * One row of the per-tool leaderboard — a (connector, tool) pair ranked by total\r\n * measured tokens. The tool-defs pseudo-tool (`*`, scope `tool_defs`) is kept as\r\n * its own row so the fixed schema overhead is visible rather than hidden.\r\n */\r\nexport interface ToolLeaderboardRow {\r\n connectorId: string;\r\n toolName: string;\r\n /** \"call\" round-trips vs the one-time \"tool_defs\" overhead measurement. */\r\n scope: ToolEventRecord[\"scope\"];\r\n calls: number;\r\n inputTokens: number;\r\n outputTokens: number;\r\n totalTokens: number;\r\n confidence: ConfidenceSource;\r\n lastTs: number;\r\n}\r\n\r\n/**\r\n * One row of the scope breakdown — usage grouped by (installScope, launchMethod),\r\n * both honestly reported as \"unknown\" when the underlying record lacks the field.\r\n */\r\nexport interface ScopeBreakdownRow {\r\n installScope: TelemetryInstallScope | \"unknown\";\r\n launchMethod: LaunchMethod;\r\n calls: number;\r\n inputTokens: number;\r\n outputTokens: number;\r\n totalTokens: number;\r\n confidence: ConfidenceSource;\r\n lastTs: number;\r\n}\r\n\r\n/**\r\n * One row of the host-native turns aggregation — a (host, session) pair ranked by\r\n * total host-reported tokens for that whole-conversation turn stream. This is the\r\n * THIRD origin (`host-native-live`): it comes from the opt-in AfterModel /\r\n * PostInvocation usage hook (scope `model_turn`, confidence `host-native`) and is\r\n * NEVER summed with the per-MCP `call` rows or the usage-reader host-scan numbers.\r\n */\r\nexport interface HostNativeTurnsRow {\r\n hostPlatform: string;\r\n sessionId: string;\r\n /** Number of recorded model turns (scope `model_turn` rows) in this group. */\r\n turns: number;\r\n inputTokens: number;\r\n outputTokens: number;\r\n totalTokens: number;\r\n /** Distinct connector ids that produced turns under this host/session. */\r\n connectors: string[];\r\n confidence: ConfidenceSource;\r\n lastTs: number;\r\n}\r\n\r\n/** Mutable accumulator for the host-native turns fold (set finalized to count). */\r\ninterface HostNativeAcc {\r\n hostPlatform: string;\r\n sessionId: string;\r\n turns: number;\r\n inputTokens: number;\r\n outputTokens: number;\r\n totalTokens: number;\r\n connectors: Set<string>;\r\n confidence: ConfidenceSource;\r\n lastTs: number;\r\n}\r\n\r\n/** Mutable accumulator for the MCP leaderboard fold (sets finalized to counts). */\r\ninterface McpAcc {\r\n connectorId: string;\r\n calls: number;\r\n inputTokens: number;\r\n outputTokens: number;\r\n totalTokens: number;\r\n tools: Set<string>;\r\n hostPlatforms: Set<string>;\r\n confidence: ConfidenceSource;\r\n lastTs: number;\r\n}\r\n\r\n/**\r\n * The PLUGIN / MCP leaderboard: rank connectors by total measured tokens desc\r\n * (ties broken by recency). This is the headline \"which MCP server costs the\r\n * most\" metric, platform-independent by construction.\r\n */\r\nexport function mcpLeaderboard(opts: LeaderboardOptions = {}): McpLeaderboardRow[] {\r\n const groups = new Map<string, McpAcc>();\r\n\r\n for (const r of selectRecords(opts)) {\r\n let g = groups.get(r.connectorId);\r\n if (g === undefined) {\r\n g = {\r\n connectorId: r.connectorId,\r\n calls: 0,\r\n inputTokens: 0,\r\n outputTokens: 0,\r\n totalTokens: 0,\r\n tools: new Set<string>(),\r\n hostPlatforms: new Set<string>(),\r\n confidence: r.confidenceSource,\r\n lastTs: r.ts,\r\n };\r\n groups.set(r.connectorId, g);\r\n }\r\n // A tool_defs row is a one-time schema overhead, not a call: count its\r\n // tokens but do not inflate the call count or the distinct-tool count.\r\n if (r.scope === \"call\") {\r\n g.calls += 1;\r\n g.tools.add(r.toolName);\r\n }\r\n g.inputTokens += r.inputTokens;\r\n g.outputTokens += r.outputTokens;\r\n g.totalTokens += r.inputTokens + r.outputTokens;\r\n g.hostPlatforms.add(r.hostPlatform);\r\n g.confidence = worstConfidence(g.confidence, r.confidenceSource);\r\n if (r.ts > g.lastTs) g.lastTs = r.ts;\r\n }\r\n\r\n const rows: McpLeaderboardRow[] = [];\r\n for (const g of groups.values()) {\r\n rows.push({\r\n connectorId: g.connectorId,\r\n calls: g.calls,\r\n inputTokens: g.inputTokens,\r\n outputTokens: g.outputTokens,\r\n totalTokens: g.totalTokens,\r\n tools: g.tools.size,\r\n hostPlatforms: [...g.hostPlatforms].sort(),\r\n confidence: g.confidence,\r\n lastTs: g.lastTs,\r\n });\r\n }\r\n rows.sort((a, b) => b.totalTokens - a.totalTokens || b.lastTs - a.lastTs);\r\n return rows;\r\n}\r\n\r\n/**\r\n * The per-tool leaderboard: rank (connector, tool) pairs by total tokens desc\r\n * (ties broken by recency). Drills the MCP leaderboard down to which individual\r\n * tool is the expensive one.\r\n */\r\nexport function toolLeaderboard(opts: LeaderboardOptions = {}): ToolLeaderboardRow[] {\r\n const groups = new Map<string, ToolLeaderboardRow>();\r\n\r\n for (const r of selectRecords(opts)) {\r\n const key = `${r.connectorId}\\u0000${r.toolName}\\u0000${r.scope}`;\r\n const g = groups.get(key);\r\n if (g === undefined) {\r\n groups.set(key, {\r\n connectorId: r.connectorId,\r\n toolName: r.toolName,\r\n scope: r.scope,\r\n calls: r.scope === \"call\" ? 1 : 0,\r\n inputTokens: r.inputTokens,\r\n outputTokens: r.outputTokens,\r\n totalTokens: r.inputTokens + r.outputTokens,\r\n confidence: r.confidenceSource,\r\n lastTs: r.ts,\r\n });\r\n } else {\r\n if (r.scope === \"call\") g.calls += 1;\r\n g.inputTokens += r.inputTokens;\r\n g.outputTokens += r.outputTokens;\r\n g.totalTokens += r.inputTokens + r.outputTokens;\r\n g.confidence = worstConfidence(g.confidence, r.confidenceSource);\r\n if (r.ts > g.lastTs) g.lastTs = r.ts;\r\n }\r\n }\r\n\r\n const rows = [...groups.values()];\r\n rows.sort((a, b) => b.totalTokens - a.totalTokens || b.lastTs - a.lastTs);\r\n return rows;\r\n}\r\n\r\n/**\r\n * The scope breakdown: group usage by (installScope, launchMethod). Both\r\n * dimensions read \"unknown\" when the source row lacks the field, so a pre-scope\r\n * row is honestly bucketed rather than dropped or mis-attributed.\r\n */\r\nexport function scopeBreakdown(opts: LeaderboardOptions = {}): ScopeBreakdownRow[] {\r\n const groups = new Map<string, ScopeBreakdownRow>();\r\n\r\n for (const r of selectRecords(opts)) {\r\n const installScope: TelemetryInstallScope | \"unknown\" = r.installScope ?? \"unknown\";\r\n const launchMethod: LaunchMethod = r.launchMethod ?? \"unknown\";\r\n const key = `${installScope}\\u0000${launchMethod}`;\r\n const g = groups.get(key);\r\n if (g === undefined) {\r\n groups.set(key, {\r\n installScope,\r\n launchMethod,\r\n calls: r.scope === \"call\" ? 1 : 0,\r\n inputTokens: r.inputTokens,\r\n outputTokens: r.outputTokens,\r\n totalTokens: r.inputTokens + r.outputTokens,\r\n confidence: r.confidenceSource,\r\n lastTs: r.ts,\r\n });\r\n } else {\r\n if (r.scope === \"call\") g.calls += 1;\r\n g.inputTokens += r.inputTokens;\r\n g.outputTokens += r.outputTokens;\r\n g.totalTokens += r.inputTokens + r.outputTokens;\r\n g.confidence = worstConfidence(g.confidence, r.confidenceSource);\r\n if (r.ts > g.lastTs) g.lastTs = r.ts;\r\n }\r\n }\r\n\r\n const rows = [...groups.values()];\r\n rows.sort((a, b) => b.totalTokens - a.totalTokens || b.lastTs - a.lastTs);\r\n return rows;\r\n}\r\n\r\n/**\r\n * The THIRD origin: host-native turns. Aggregates ONLY the `model_turn` rows (the\r\n * opt-in AfterModel / PostInvocation host-native usage hook) by (host, session),\r\n * ranked by total host-reported tokens desc. This is whole-conversation usage the\r\n * host itself reported — exact, but a DIFFERENT thing than the per-MCP `call`\r\n * rows; it is surfaced separately and NEVER summed with the other two origins.\r\n */\r\nexport function hostNativeTurns(opts: LeaderboardOptions = {}): HostNativeTurnsRow[] {\r\n const groups = new Map<string, HostNativeAcc>();\r\n\r\n for (const r of selectRecords(opts, /* includeModelTurn */ true)) {\r\n const key = `${r.hostPlatform}\\u0000${r.sessionId}`;\r\n let g = groups.get(key);\r\n if (g === undefined) {\r\n g = {\r\n hostPlatform: r.hostPlatform,\r\n sessionId: r.sessionId,\r\n turns: 0,\r\n inputTokens: 0,\r\n outputTokens: 0,\r\n totalTokens: 0,\r\n connectors: new Set<string>(),\r\n confidence: r.confidenceSource,\r\n lastTs: r.ts,\r\n };\r\n groups.set(key, g);\r\n }\r\n g.turns += 1;\r\n g.inputTokens += r.inputTokens;\r\n g.outputTokens += r.outputTokens;\r\n g.totalTokens += r.inputTokens + r.outputTokens;\r\n g.connectors.add(r.connectorId);\r\n g.confidence = worstConfidence(g.confidence, r.confidenceSource);\r\n if (r.ts > g.lastTs) g.lastTs = r.ts;\r\n }\r\n\r\n const rows: HostNativeTurnsRow[] = [];\r\n for (const g of groups.values()) {\r\n rows.push({\r\n hostPlatform: g.hostPlatform,\r\n sessionId: g.sessionId,\r\n turns: g.turns,\r\n inputTokens: g.inputTokens,\r\n outputTokens: g.outputTokens,\r\n totalTokens: g.totalTokens,\r\n connectors: [...g.connectors].sort(),\r\n confidence: g.confidence,\r\n lastTs: g.lastTs,\r\n });\r\n }\r\n rows.sort((a, b) => b.totalTokens - a.totalTokens || b.lastTs - a.lastTs);\r\n return rows;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Per-surface leaderboard (the FIVE developer-axis surfaces)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * One row of the per-surface developer breakdown — a (surfaceKind, name) pair.\r\n * Combines the RUNTIME-measured surfaces (server `call`+`tool_defs` rows and the\r\n * new `hook` rows from the telemetry store) with the STATIC content footprints\r\n * (command/skill/subagent) from {@link computeSurfaceFootprints}.\r\n *\r\n * • `kind` distinguishes RUNTIME (measured live) from STATIC (footprint of\r\n * context the host loads — never an intercepted usage row).\r\n * • For static rows `calls` is 0, `outputTokens` is 0, the cost sits in\r\n * `inputTokens`/`totalTokens`, and `confidence` is the tokenizer source for\r\n * the connector's family. For runtime rows everything aggregates the store.\r\n */\r\nexport interface SurfaceLeaderboardRow {\r\n surfaceKind: SurfaceKind;\r\n /** Per-item name: the tool name (server), the event name (hook), or the\r\n * command/skill/subagent name (static surfaces). */\r\n name: string;\r\n /** RUNTIME (server/hook store rows) vs STATIC (command/skill/subagent footprint). */\r\n kind: \"runtime\" | \"static\";\r\n calls: number;\r\n inputTokens: number;\r\n outputTokens: number;\r\n totalTokens: number;\r\n confidence: ConfidenceSource;\r\n lastTs: number;\r\n}\r\n\r\n/** Mutable accumulator for the runtime side of the per-surface fold. */\r\ninterface SurfaceAcc {\r\n surfaceKind: SurfaceKind;\r\n name: string;\r\n calls: number;\r\n inputTokens: number;\r\n outputTokens: number;\r\n totalTokens: number;\r\n confidence: ConfidenceSource;\r\n lastTs: number;\r\n}\r\n\r\n/**\r\n * A record's developer-axis surface kind, backward-compatibly. Rows written\r\n * before `surfaceKind` existed (every legacy serve-proxy `call`/`tool_defs` row)\r\n * lack it and are read as `server`; the `hook` runtime stamps it explicitly.\r\n */\r\nfunction recordSurfaceKind(r: ToolEventRecord): SurfaceKind {\r\n if (r.surfaceKind !== undefined) return r.surfaceKind;\r\n // No explicit kind → it predates this field → it is a serve-proxy server row.\r\n return \"server\";\r\n}\r\n\r\n/** Options for {@link surfaceLeaderboard}: the shared query opts + the connectors\r\n * whose STATIC footprints are folded in. */\r\nexport interface SurfaceLeaderboardOptions extends LeaderboardOptions {\r\n /** Registered connectors to compute static command/skill/subagent footprints\r\n * over. Omit/empty → only the runtime (server/hook) rows are reported. */\r\n connectors?: readonly ResolvedConnector[];\r\n}\r\n\r\n/**\r\n * The PER-SURFACE developer leaderboard across all FIVE surfaces.\r\n *\r\n * RUNTIME side: the store's `call`/`tool_defs` rows (surface `server`) and the\r\n * `hook` rows (surface `hook`), grouped by (surfaceKind, name) with IN/OUT/TOTAL\r\n * and a call count. (`model_turn` rows are excluded by `selectRecords`, exactly\r\n * as the per-MCP views exclude them.)\r\n *\r\n * STATIC side: one row per command/skill/subagent from\r\n * {@link computeSurfaceFootprints} over each passed connector, deduped by\r\n * (surfaceKind, name) and summed when the same surface is declared by more than\r\n * one connector. Static rows carry the footprint in `inputTokens` (the cost the\r\n * host pays to load that context); `outputTokens`/`calls` are 0.\r\n *\r\n * Sorted by total tokens desc, ties broken by recency (static rows have lastTs 0\r\n * so they sort after equal-token runtime rows).\r\n */\r\nexport function surfaceLeaderboard(\r\n opts: SurfaceLeaderboardOptions = {},\r\n): SurfaceLeaderboardRow[] {\r\n // ── RUNTIME: aggregate server + hook store rows by (surfaceKind, name) ──\r\n const runtime = new Map<string, SurfaceAcc>();\r\n for (const r of selectRecords(opts)) {\r\n const surfaceKind = recordSurfaceKind(r);\r\n const key = `${surfaceKind} ${r.toolName}`;\r\n let g = runtime.get(key);\r\n if (g === undefined) {\r\n g = {\r\n surfaceKind,\r\n name: r.toolName,\r\n calls: 0,\r\n inputTokens: 0,\r\n outputTokens: 0,\r\n totalTokens: 0,\r\n confidence: r.confidenceSource,\r\n lastTs: r.ts,\r\n };\r\n runtime.set(key, g);\r\n }\r\n // tool_defs is a one-time schema overhead, not a call — count tokens only.\r\n if (r.scope === \"call\" || r.scope === \"hook\") g.calls += 1;\r\n g.inputTokens += r.inputTokens;\r\n g.outputTokens += r.outputTokens;\r\n g.totalTokens += r.inputTokens + r.outputTokens;\r\n g.confidence = worstConfidence(g.confidence, r.confidenceSource);\r\n if (r.ts > g.lastTs) g.lastTs = r.ts;\r\n }\r\n\r\n const rows: SurfaceLeaderboardRow[] = [];\r\n for (const g of runtime.values()) {\r\n rows.push({\r\n surfaceKind: g.surfaceKind,\r\n name: g.name,\r\n kind: \"runtime\",\r\n calls: g.calls,\r\n inputTokens: g.inputTokens,\r\n outputTokens: g.outputTokens,\r\n totalTokens: g.totalTokens,\r\n confidence: g.confidence,\r\n lastTs: g.lastTs,\r\n });\r\n }\r\n\r\n // ── STATIC: fold in command/skill/subagent footprints per connector ──────\r\n const staticRows = new Map<\r\n string,\r\n { surfaceKind: SurfaceKind; name: string; tokens: number }\r\n >();\r\n for (const connector of opts.connectors ?? []) {\r\n for (const fp of computeSurfaceFootprints(connector)) {\r\n const key = `${fp.surfaceKind} ${fp.name}`;\r\n const existing = staticRows.get(key);\r\n if (existing === undefined) {\r\n staticRows.set(key, { surfaceKind: fp.surfaceKind, name: fp.name, tokens: fp.tokens });\r\n } else {\r\n existing.tokens += fp.tokens;\r\n }\r\n }\r\n }\r\n // A pure tokenizer footprint carries no host-reported truth — label it with the\r\n // tokenizer source the connector's family would yield. We derive that once via\r\n // a throwaway count so the static confidence is honest (approx vs exact).\r\n const staticConfidence: ConfidenceSource = staticFootprintConfidence(opts.connectors ?? []);\r\n for (const s of staticRows.values()) {\r\n rows.push({\r\n surfaceKind: s.surfaceKind,\r\n name: s.name,\r\n kind: \"static\",\r\n calls: 0,\r\n inputTokens: s.tokens,\r\n outputTokens: 0,\r\n totalTokens: s.tokens,\r\n confidence: staticConfidence,\r\n lastTs: 0,\r\n });\r\n }\r\n\r\n rows.sort((a, b) => b.totalTokens - a.totalTokens || b.lastTs - a.lastTs);\r\n return rows;\r\n}\r\n\r\n/**\r\n * The confidence label for the static footprints: the tokenizer source for the\r\n * first connector's family (exact for openai, approx otherwise). Defaults to\r\n * `tokenizer-approx` when no connector is supplied — an honest estimate label.\r\n */\r\nfunction staticFootprintConfidence(\r\n connectors: readonly ResolvedConnector[],\r\n): ConfidenceSource {\r\n const first = connectors[0];\r\n if (first === undefined) return \"tokenizer-approx\";\r\n // openai family → exact BPE; everything else → approx. Mirrors tokenizer.bpeSource.\r\n return first.telemetry.modelFamilyHint === \"openai\"\r\n ? \"tokenizer-exact\"\r\n : \"tokenizer-approx\";\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Formatting (mirrors telemetry/report.ts: aligned table + honesty legend)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Sources whose counts are estimates (vs real / host-reported numbers).\r\n * `tokenizer-calibrated` is still an estimate — an approximation nudged toward\r\n * truth by a sampled Anthropic count_tokens factor — so it belongs here too.\r\n */\r\nconst ESTIMATE_SOURCES: ReadonlySet<ConfidenceSource> = new Set<ConfidenceSource>([\r\n \"heuristic\",\r\n \"tokenizer-approx\",\r\n \"tokenizer-calibrated\",\r\n]);\r\n\r\n/** Compact integer formatting with thousands separators. */\r\nfunction fmtInt(n: number): string {\r\n return n.toLocaleString(\"en-US\");\r\n}\r\n\r\n/** Right-pad (left-aligned columns). */\r\nfunction padRight(s: string, width: number): string {\r\n return s.length >= width ? s : s + \" \".repeat(width - s.length);\r\n}\r\n\r\n/** Left-pad (right-aligned numeric columns). */\r\nfunction padLeft(s: string, width: number): string {\r\n return s.length >= width ? s : \" \".repeat(width - s.length) + s;\r\n}\r\n\r\n/**\r\n * Render an aligned table given headers, the data cells, and which columns are\r\n * left-aligned (text) vs right-aligned (numbers). Adds rule lines and a TOTAL\r\n * footer. Shared by every leaderboard formatter for one consistent style.\r\n */\r\nfunction renderTable(\r\n headers: string[],\r\n dataRows: string[][],\r\n leftAlignedCols: ReadonlySet<number>,\r\n totalRow: string[],\r\n emptyMessage: string,\r\n): string[] {\r\n const widths = headers.map((h, col) => {\r\n let w = h.length;\r\n for (const row of dataRows) w = Math.max(w, (row[col] ?? \"\").length);\r\n w = Math.max(w, (totalRow[col] ?? \"\").length);\r\n return w;\r\n });\r\n\r\n const renderRow = (cells: string[]): string =>\r\n cells\r\n .map((c, col) =>\r\n leftAlignedCols.has(col)\r\n ? padRight(c, widths[col] ?? 0)\r\n : padLeft(c, widths[col] ?? 0),\r\n )\r\n .join(\" \")\r\n .trimEnd();\r\n\r\n const ruleWidth = widths.reduce((a, b) => a + b, 0) + 2 * (widths.length - 1);\r\n const rule = \"-\".repeat(ruleWidth);\r\n\r\n const lines: string[] = [];\r\n lines.push(renderRow(headers));\r\n lines.push(rule);\r\n if (dataRows.length === 0) {\r\n lines.push(emptyMessage);\r\n } else {\r\n for (const row of dataRows) lines.push(renderRow(row));\r\n }\r\n lines.push(rule);\r\n lines.push(renderRow(totalRow));\r\n return lines;\r\n}\r\n\r\n/** Append the estimate legend when any row carries an estimate confidence. */\r\nfunction appendEstimateLegend(\r\n lines: string[],\r\n confidences: ConfidenceSource[],\r\n): void {\r\n if (confidences.some((c) => ESTIMATE_SOURCES.has(c))) {\r\n lines.push(\"\");\r\n lines.push(\r\n \"note: heuristic and tokenizer-approx token counts are estimates, \" +\r\n \"not exact host-reported usage.\",\r\n );\r\n if (confidences.some((c) => c === \"tokenizer-calibrated\")) {\r\n lines.push(\r\n \"note: tokenizer-calibrated = local approx adjusted by a sampled \" +\r\n \"Anthropic count_tokens factor (opt-in; content sampled off-box only \" +\r\n \"when AGENT_CONNECTOR_CALIBRATE=anthropic).\",\r\n );\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Format the MCP/plugin leaderboard as an aligned table:\r\n * RANK | CONNECTOR | CALLS | TOOLS | IN | OUT | TOTAL | HOSTS | CONFIDENCE\r\n * sorted by total tokens desc, with a TOTAL footer and the honesty legend.\r\n */\r\nexport function formatMcpLeaderboard(rows: McpLeaderboardRow[]): string {\r\n const sorted = [...rows].sort(\r\n (a, b) => b.totalTokens - a.totalTokens || b.lastTs - a.lastTs,\r\n );\r\n const headers = [\r\n \"RANK\",\r\n \"CONNECTOR\",\r\n \"CALLS\",\r\n \"TOOLS\",\r\n \"IN\",\r\n \"OUT\",\r\n \"TOTAL\",\r\n \"HOSTS\",\r\n \"CONFIDENCE\",\r\n ];\r\n const dataRows = sorted.map((r, i) => [\r\n `${i + 1}`,\r\n r.connectorId,\r\n fmtInt(r.calls),\r\n fmtInt(r.tools),\r\n fmtInt(r.inputTokens),\r\n fmtInt(r.outputTokens),\r\n fmtInt(r.totalTokens),\r\n r.hostPlatforms.length === 0 ? \"-\" : r.hostPlatforms.join(\",\"),\r\n r.confidence,\r\n ]);\r\n\r\n const totals = sorted.reduce(\r\n (acc, r) => {\r\n acc.calls += r.calls;\r\n acc.inputTokens += r.inputTokens;\r\n acc.outputTokens += r.outputTokens;\r\n acc.totalTokens += r.totalTokens;\r\n return acc;\r\n },\r\n { calls: 0, inputTokens: 0, outputTokens: 0, totalTokens: 0 },\r\n );\r\n const totalRow = [\r\n \"\",\r\n \"TOTAL\",\r\n fmtInt(totals.calls),\r\n \"\",\r\n fmtInt(totals.inputTokens),\r\n fmtInt(totals.outputTokens),\r\n fmtInt(totals.totalTokens),\r\n \"\",\r\n \"\",\r\n ];\r\n\r\n // Left-align RANK (0), CONNECTOR (1), HOSTS (7), CONFIDENCE (8); numbers right.\r\n const leftCols = new Set<number>([0, 1, 7, 8]);\r\n const lines = renderTable(\r\n headers,\r\n dataRows,\r\n leftCols,\r\n totalRow,\r\n \"(no MCP telemetry recorded)\",\r\n );\r\n appendEstimateLegend(\r\n lines,\r\n sorted.map((r) => r.confidence),\r\n );\r\n return lines.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Format the per-tool leaderboard:\r\n * RANK | CONNECTOR | TOOL | SCOPE | CALLS | IN | OUT | TOTAL | CONFIDENCE\r\n * sorted by total tokens desc, with a TOTAL footer and the honesty legend.\r\n */\r\nexport function formatToolLeaderboard(rows: ToolLeaderboardRow[]): string {\r\n const sorted = [...rows].sort(\r\n (a, b) => b.totalTokens - a.totalTokens || b.lastTs - a.lastTs,\r\n );\r\n const headers = [\r\n \"RANK\",\r\n \"CONNECTOR\",\r\n \"TOOL\",\r\n \"SCOPE\",\r\n \"CALLS\",\r\n \"IN\",\r\n \"OUT\",\r\n \"TOTAL\",\r\n \"CONFIDENCE\",\r\n ];\r\n const dataRows = sorted.map((r, i) => [\r\n `${i + 1}`,\r\n r.connectorId,\r\n r.toolName,\r\n r.scope,\r\n fmtInt(r.calls),\r\n fmtInt(r.inputTokens),\r\n fmtInt(r.outputTokens),\r\n fmtInt(r.totalTokens),\r\n r.confidence,\r\n ]);\r\n\r\n const totals = sorted.reduce(\r\n (acc, r) => {\r\n acc.calls += r.calls;\r\n acc.inputTokens += r.inputTokens;\r\n acc.outputTokens += r.outputTokens;\r\n acc.totalTokens += r.totalTokens;\r\n return acc;\r\n },\r\n { calls: 0, inputTokens: 0, outputTokens: 0, totalTokens: 0 },\r\n );\r\n const totalRow = [\r\n \"\",\r\n \"TOTAL\",\r\n \"\",\r\n \"\",\r\n fmtInt(totals.calls),\r\n fmtInt(totals.inputTokens),\r\n fmtInt(totals.outputTokens),\r\n fmtInt(totals.totalTokens),\r\n \"\",\r\n ];\r\n\r\n // Left-align RANK (0), CONNECTOR (1), TOOL (2), SCOPE (3), CONFIDENCE (8).\r\n const leftCols = new Set<number>([0, 1, 2, 3, 8]);\r\n const lines = renderTable(\r\n headers,\r\n dataRows,\r\n leftCols,\r\n totalRow,\r\n \"(no MCP telemetry recorded)\",\r\n );\r\n appendEstimateLegend(\r\n lines,\r\n sorted.map((r) => r.confidence),\r\n );\r\n return lines.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Format the scope breakdown:\r\n * INSTALL | LAUNCH | CALLS | IN | OUT | TOTAL | CONFIDENCE\r\n * with a TOTAL footer and the honesty legend.\r\n */\r\nexport function formatScopeBreakdown(rows: ScopeBreakdownRow[]): string {\r\n const sorted = [...rows].sort(\r\n (a, b) => b.totalTokens - a.totalTokens || b.lastTs - a.lastTs,\r\n );\r\n const headers = [\"INSTALL\", \"LAUNCH\", \"CALLS\", \"IN\", \"OUT\", \"TOTAL\", \"CONFIDENCE\"];\r\n const dataRows = sorted.map((r) => [\r\n r.installScope,\r\n r.launchMethod,\r\n fmtInt(r.calls),\r\n fmtInt(r.inputTokens),\r\n fmtInt(r.outputTokens),\r\n fmtInt(r.totalTokens),\r\n r.confidence,\r\n ]);\r\n\r\n const totals = sorted.reduce(\r\n (acc, r) => {\r\n acc.calls += r.calls;\r\n acc.inputTokens += r.inputTokens;\r\n acc.outputTokens += r.outputTokens;\r\n acc.totalTokens += r.totalTokens;\r\n return acc;\r\n },\r\n { calls: 0, inputTokens: 0, outputTokens: 0, totalTokens: 0 },\r\n );\r\n const totalRow = [\r\n \"TOTAL\",\r\n \"\",\r\n fmtInt(totals.calls),\r\n fmtInt(totals.inputTokens),\r\n fmtInt(totals.outputTokens),\r\n fmtInt(totals.totalTokens),\r\n \"\",\r\n ];\r\n\r\n // Left-align INSTALL (0), LAUNCH (1), CONFIDENCE (6); numbers right-aligned.\r\n const leftCols = new Set<number>([0, 1, 6]);\r\n const lines = renderTable(\r\n headers,\r\n dataRows,\r\n leftCols,\r\n totalRow,\r\n \"(no MCP telemetry recorded)\",\r\n );\r\n appendEstimateLegend(\r\n lines,\r\n sorted.map((r) => r.confidence),\r\n );\r\n return lines.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Format the host-native turns aggregation (the THIRD origin):\r\n * RANK | HOST | SESSION | TURNS | IN | OUT | TOTAL | CONNECTORS | CONFIDENCE\r\n * sorted by total tokens desc, with a TOTAL footer. These are whole-conversation,\r\n * host-reported (exact) counts — a DIFFERENT thing than the per-MCP rows, so the\r\n * footer total is for THIS section alone and is never added to the others.\r\n */\r\nexport function formatHostNativeTurns(rows: HostNativeTurnsRow[]): string {\r\n const sorted = [...rows].sort(\r\n (a, b) => b.totalTokens - a.totalTokens || b.lastTs - a.lastTs,\r\n );\r\n const headers = [\r\n \"RANK\",\r\n \"HOST\",\r\n \"SESSION\",\r\n \"TURNS\",\r\n \"IN\",\r\n \"OUT\",\r\n \"TOTAL\",\r\n \"CONNECTORS\",\r\n \"CONFIDENCE\",\r\n ];\r\n const dataRows = sorted.map((r, i) => [\r\n `${i + 1}`,\r\n r.hostPlatform,\r\n r.sessionId === \"\" ? \"-\" : r.sessionId,\r\n fmtInt(r.turns),\r\n fmtInt(r.inputTokens),\r\n fmtInt(r.outputTokens),\r\n fmtInt(r.totalTokens),\r\n r.connectors.length === 0 ? \"-\" : r.connectors.join(\",\"),\r\n r.confidence,\r\n ]);\r\n\r\n const totals = sorted.reduce(\r\n (acc, r) => {\r\n acc.turns += r.turns;\r\n acc.inputTokens += r.inputTokens;\r\n acc.outputTokens += r.outputTokens;\r\n acc.totalTokens += r.totalTokens;\r\n return acc;\r\n },\r\n { turns: 0, inputTokens: 0, outputTokens: 0, totalTokens: 0 },\r\n );\r\n const totalRow = [\r\n \"\",\r\n \"TOTAL\",\r\n \"\",\r\n fmtInt(totals.turns),\r\n fmtInt(totals.inputTokens),\r\n fmtInt(totals.outputTokens),\r\n fmtInt(totals.totalTokens),\r\n \"\",\r\n \"\",\r\n ];\r\n\r\n // Left-align RANK (0), HOST (1), SESSION (2), CONNECTORS (7), CONFIDENCE (8).\r\n const leftCols = new Set<number>([0, 1, 2, 7, 8]);\r\n const lines = renderTable(\r\n headers,\r\n dataRows,\r\n leftCols,\r\n totalRow,\r\n \"(no host-native turns recorded — enable opt-in host-native usage)\",\r\n );\r\n return lines.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Format the per-surface developer breakdown:\r\n * SURFACE | NAME | IN | OUT | TOTAL | KIND\r\n * one row per (surfaceKind, name) across all FIVE surfaces — server + hook\r\n * (runtime, measured from the store) and command/skill/subagent (static\r\n * footprints). Sorted by total tokens desc, with a TOTAL footer and the honesty\r\n * legend (static footprints + any estimate-confidence runtime rows).\r\n *\r\n * NOTE: the TOTAL footer sums BOTH runtime and static tokens for at-a-glance\r\n * scale; the KIND column keeps the distinction explicit so the two are never\r\n * silently conflated (runtime = live usage; static = context-load footprint).\r\n */\r\nexport function formatSurfaceLeaderboard(rows: SurfaceLeaderboardRow[]): string {\r\n const sorted = [...rows].sort(\r\n (a, b) => b.totalTokens - a.totalTokens || b.lastTs - a.lastTs,\r\n );\r\n const headers = [\"SURFACE\", \"NAME\", \"IN\", \"OUT\", \"TOTAL\", \"KIND\"];\r\n const dataRows = sorted.map((r) => [\r\n r.surfaceKind,\r\n r.name,\r\n fmtInt(r.inputTokens),\r\n fmtInt(r.outputTokens),\r\n fmtInt(r.totalTokens),\r\n r.kind,\r\n ]);\r\n\r\n const totals = sorted.reduce(\r\n (acc, r) => {\r\n acc.inputTokens += r.inputTokens;\r\n acc.outputTokens += r.outputTokens;\r\n acc.totalTokens += r.totalTokens;\r\n return acc;\r\n },\r\n { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\r\n );\r\n const totalRow = [\r\n \"TOTAL\",\r\n \"\",\r\n fmtInt(totals.inputTokens),\r\n fmtInt(totals.outputTokens),\r\n fmtInt(totals.totalTokens),\r\n \"\",\r\n ];\r\n\r\n // Left-align SURFACE (0), NAME (1), KIND (5); numbers right-aligned.\r\n const leftCols = new Set<number>([0, 1, 5]);\r\n const lines = renderTable(\r\n headers,\r\n dataRows,\r\n leftCols,\r\n totalRow,\r\n \"(no developer surfaces recorded)\",\r\n );\r\n if (sorted.some((r) => r.kind === \"static\")) {\r\n lines.push(\"\");\r\n lines.push(\r\n \"note: KIND=static rows are the tokenized FOOTPRINT a command/skill/subagent \" +\r\n \"imposes on a host that loads it as context — not intercepted usage rows.\",\r\n );\r\n }\r\n appendEstimateLegend(\r\n lines,\r\n sorted.map((r) => r.confidence),\r\n );\r\n return lines.join(\"\\n\");\r\n}\r\n"],"mappings":"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","names":[]}
@@ -152,4 +152,4 @@ export {
152
152
  ensureHomeBin,
153
153
  projectIdentity
154
154
  };
155
- //# sourceMappingURL=chunk-GZGLCCEE.js.map
155
+ //# sourceMappingURL=chunk-QYOUQCC6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/ids.ts","../src/core/paths.ts"],"sourcesContent":["/** Shared connector-id grammar for author-time configs and runtime ids. */\r\nexport const CONNECTOR_ID_RE = /^[a-z0-9][a-z0-9-]*$/;\r\n\r\nexport function isValidConnectorId(id: unknown): id is string {\r\n return typeof id === \"string\" && CONNECTOR_ID_RE.test(id);\r\n}\r\n\r\nexport function assertConnectorId(id: unknown, label = \"connector id\"): string {\r\n if (isValidConnectorId(id)) return id;\r\n throw new Error(\r\n `${label} must be kebab-case matching ${CONNECTOR_ID_RE} (got ${JSON.stringify(id)})`,\r\n );\r\n}\r\n","/**\r\n * core/paths — home data-root, stable home binary, and project identity.\r\n *\r\n * Operating model (docs/ARCHITECTURE.md §3):\r\n * • One home data-root holds the single binary + shared telemetry + state.\r\n * Override with AGENT_CONNECTOR_DATA_DIR (the cross-agent shared-DB key).\r\n * This relocates FRAMEWORK state only — never platform-native config files.\r\n * • The home binary lives at a STABLE path so every host's pointer config\r\n * keeps working across updates (no versioned cache dir → no cache-heal bug).\r\n * • Per-project data is keyed by a stable project identity (git remote ||\r\n * normalized absolute path), hashed — not by code location.\r\n */\r\n\r\nimport { createHash } from \"node:crypto\";\r\nimport {\r\n chmodSync,\r\n existsSync,\r\n lstatSync,\r\n mkdirSync,\r\n readFileSync,\r\n writeFileSync,\r\n} from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { basename, isAbsolute, join, parse, relative, resolve, sep } from \"node:path\";\r\n\r\nimport { assertConnectorId } from \"./ids.js\";\r\n\r\n/** The built-in default framework data-root (`~/.agent-connector`), ignoring\r\n * any AGENT_CONNECTOR_DATA_DIR override. */\r\nexport function defaultDataRoot(): string {\r\n return join(homedir(), \".agent-connector\");\r\n}\r\n\r\n/** Framework data-root: AGENT_CONNECTOR_DATA_DIR || ~/.agent-connector. */\r\nexport function dataRoot(): string {\r\n const override = process.env.AGENT_CONNECTOR_DATA_DIR;\r\n if (override && override.trim() !== \"\") return resolve(override);\r\n return defaultDataRoot();\r\n}\r\n\r\n/**\r\n * True when `root` is a NON-DEFAULT data root — i.e. it differs from the\r\n * built-in `~/.agent-connector`. Compared after `resolve()` so two spellings of\r\n * the same dir read as equal. Used at install time to decide whether the\r\n * telemetry serve-wrap must carry an explicit `--data-dir` flag: a default-root\r\n * install relies on the (correct) fallback and stays flag-free, but an overridden\r\n * root must be passed explicitly because some hosts (codex) strip the child env,\r\n * so the spawned `serve` would otherwise resolve the default root and fail to\r\n * find the connector record written under the overridden one.\r\n */\r\nexport function isNonDefaultDataRoot(root: string): boolean {\r\n return resolve(root) !== resolve(defaultDataRoot());\r\n}\r\n\r\nexport function connectorsDir(): string {\r\n return join(dataRoot(), \"connectors\");\r\n}\r\n/**\r\n * Stable cache root for REMOTE connector sources fetched by `install <source>`\r\n * (one subdir per `<owner>__<repo>[__<ref>]`). Lives under the data-root — NOT a\r\n * temp dir — so a fetched connector whose server is a LOCAL stdio command\r\n * (`node <path-in-the-clone>`) keeps resolving after install across reboots.\r\n */\r\nexport function sourcesDir(): string {\r\n return join(dataRoot(), \"sources\");\r\n}\r\nexport function connectorDir(id: string): string {\r\n const root = resolve(connectorsDir());\r\n const safeId = assertConnectorId(id);\r\n const dir = resolve(root, safeId);\r\n const rel = relative(root, dir);\r\n if (rel === \"\" || rel.startsWith(\"..\") || isAbsolute(rel)) {\r\n throw new Error(`connector record path escapes ${root}: ${id}`);\r\n }\r\n return dir;\r\n}\r\nexport function backupsDir(): string {\r\n return join(dataRoot(), \"backups\");\r\n}\r\nexport function logsDir(): string {\r\n return join(dataRoot(), \"logs\");\r\n}\r\n\r\n/** Telemetry store path for the selected backend. */\r\nexport function telemetryPath(store: \"ndjson\" | \"sqlite\" = \"ndjson\"): string {\r\n return join(dataRoot(), store === \"sqlite\" ? \"telemetry.db\" : \"telemetry.ndjson\");\r\n}\r\n\r\n/** Stable, OS-correct path to the single home binary pointer. */\r\nexport function homeBinPath(): string {\r\n const name = process.platform === \"win32\" ? \"agent-connector.cmd\" : \"agent-connector\";\r\n return join(dataRoot(), \"bin\", name);\r\n}\r\n\r\nexport function ensureDir(dir: string): void {\r\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\r\n}\r\n\r\n/**\r\n * Return the first existing symbolic-link component in `path`, or null when the\r\n * existing prefix is symlink-free. Stops at the first missing component so new\r\n * directories/files can still be created normally.\r\n */\r\nexport function firstSymlinkInPath(path: string): string | null {\r\n const abs = resolve(path);\r\n const root = parse(abs).root;\r\n const rest = relative(root, abs);\r\n if (rest === \"\") return null;\r\n\r\n let cur = root;\r\n for (const part of rest.split(sep)) {\r\n if (part === \"\") continue;\r\n cur = join(cur, part);\r\n try {\r\n if (lstatSync(cur).isSymbolicLink()) return cur;\r\n } catch (err) {\r\n const code = (err as NodeJS.ErrnoException).code;\r\n if (code === \"ENOENT\") return null;\r\n throw err;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function assertNoSymlinkInPath(path: string): void {\r\n const symlink = firstSymlinkInPath(path);\r\n if (symlink !== null) {\r\n throw new Error(`${basename(path)} skipped: symbolic link in path (${symlink})`);\r\n }\r\n}\r\n\r\n/**\r\n * Write a stable launcher at homeBinPath() that execs the real CLI entry.\r\n * Avoids symlinks (Windows constraint) and versioned paths. Idempotent.\r\n *\r\n * @param cliEntry absolute path to the installed cli.js\r\n * @param nodePath node runtime to exec with (defaults to current process.execPath)\r\n * @returns the stable launcher path\r\n */\r\nexport function ensureHomeBin(cliEntry: string, nodePath: string = process.execPath): string {\r\n const binPath = homeBinPath();\r\n assertNoSymlinkInPath(binPath);\r\n ensureDir(join(dataRoot(), \"bin\"));\r\n const node = nodePath.replace(/\\\\/g, \"/\");\r\n const cli = cliEntry.replace(/\\\\/g, \"/\");\r\n if (process.platform === \"win32\") {\r\n writeFileSync(binPath, `@echo off\\r\\n\"${node}\" \"${cli}\" %*\\r\\n`, \"utf8\");\r\n } else {\r\n writeFileSync(binPath, `#!/bin/sh\\nexec \"${node}\" \"${cli}\" \"$@\"\\n`, \"utf8\");\r\n chmodSync(binPath, 0o755);\r\n }\r\n return binPath;\r\n}\r\n\r\n/** Read remote.origin.url from a project's .git/config without spawning git. */\r\nfunction gitRemoteUrl(projectDir: string): string | null {\r\n const cfg = join(projectDir, \".git\", \"config\");\r\n if (!existsSync(cfg)) return null;\r\n try {\r\n const text = readFileSync(cfg, \"utf8\");\r\n // Find [remote \"origin\"] ... url = X\r\n const lines = text.split(/\\r?\\n/);\r\n let inOrigin = false;\r\n for (const line of lines) {\r\n const s = line.trim();\r\n if (s.startsWith(\"[\")) inOrigin = /^\\[remote\\s+\"origin\"\\]$/.test(s);\r\n else if (inOrigin) {\r\n const m = s.match(/^url\\s*=\\s*(.+)$/);\r\n if (m && m[1]) return m[1].trim();\r\n }\r\n }\r\n } catch {\r\n /* ignore */\r\n }\r\n return null;\r\n}\r\n\r\nexport interface ProjectIdentity {\r\n /** Hashed stable key used to partition telemetry/state. */\r\n key: string;\r\n /** Human-readable label (git remote or directory name). */\r\n label: string;\r\n /** Absolute project directory. */\r\n dir: string;\r\n}\r\n\r\n/**\r\n * Derive a stable project identity. Prefers the git origin URL (stable across\r\n * clones/locations); falls back to the normalized absolute path.\r\n */\r\nexport function projectIdentity(projectDir: string): ProjectIdentity {\r\n const dir = resolve(projectDir);\r\n const remote = gitRemoteUrl(dir);\r\n const basis = remote ?? dir;\r\n const key = createHash(\"sha256\").update(basis).digest(\"hex\").slice(0, 16);\r\n return { key, label: remote ?? basename(dir), dir };\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  resolveSpawnCommand
4
- } from "./chunk-4NHXLXSD.js";
4
+ } from "./chunk-W7AGWAMH.js";
5
5
 
6
6
  // src/core/spawn-child.ts
7
7
  import { spawn } from "child_process";
@@ -18,4 +18,4 @@ function spawnChild(command, args, options) {
18
18
  export {
19
19
  spawnChild
20
20
  };
21
- //# sourceMappingURL=chunk-Z2MRSS2I.js.map
21
+ //# sourceMappingURL=chunk-RNVIK5YJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/spawn-child.ts"],"sourcesContent":["/**\r\n * core/spawn-child — the cross-platform child_process.spawn wrapper.\r\n *\r\n * Kept SEPARATE from core/spawn.ts (pure string/path helpers, imported widely\r\n * and early) so that pulling in `node:child_process` here does not perturb the\r\n * module-eval order of test suites that vi.mock(\"node:child_process\").\r\n */\r\n\r\nimport { type ChildProcess, type SpawnOptions, spawn } from \"node:child_process\";\r\n\r\nimport { resolveSpawnCommand } from \"./spawn.js\";\r\n\r\n/**\r\n * Quote one token for a cmd.exe command line: wrap in double quotes, doubling any\r\n * embedded double quote. Sufficient for the paths / package names / flags we\r\n * spawn (connector config, not untrusted end-user input) — we intentionally do\r\n * not escape cmd metacharacters (& | ^ %), which never appear in those tokens.\r\n */\r\nfunction winQuoteArg(s: string): string {\r\n return `\"${s.replace(/\"/g, '\"\"')}\"`;\r\n}\r\n\r\n/**\r\n * Cross-platform child spawn that fixes native-Windows package-runner launches.\r\n * Direct spawn on macOS/Linux. On win32 it routes through\r\n * {@link resolveSpawnCommand}; an `.exe` runs directly, while a `.cmd`/`.bat`\r\n * (npx.cmd, the agent-connector.cmd launcher) is launched via a SINGLE quoted\r\n * command line with `shell: true` — a string rather than an args array, which\r\n * Node requires for a batch file AND which avoids the DEP0190 deprecation that\r\n * `shell: true` + an args array triggers on Node ≥ 24.\r\n */\r\nexport function spawnChild(\r\n command: string,\r\n args: string[],\r\n options: SpawnOptions,\r\n): ChildProcess {\r\n const resolved = resolveSpawnCommand(command);\r\n if (!resolved.needsShell) return spawn(resolved.file, args, options);\r\n const line = [resolved.file, ...args].map(winQuoteArg).join(\" \");\r\n return spawn(line, { ...options, shell: true });\r\n}\r\n"],"mappings":";;;;;;AAQA,SAA+C,aAAa;AAU5D,SAAS,YAAY,GAAmB;AACtC,SAAO,IAAI,EAAE,QAAQ,MAAM,IAAI,CAAC;AAClC;AAWO,SAAS,WACd,SACA,MACA,SACc;AACd,QAAM,WAAW,oBAAoB,OAAO;AAC5C,MAAI,CAAC,SAAS,WAAY,QAAO,MAAM,SAAS,MAAM,MAAM,OAAO;AACnE,QAAM,OAAO,CAAC,SAAS,MAAM,GAAG,IAAI,EAAE,IAAI,WAAW,EAAE,KAAK,GAAG;AAC/D,SAAO,MAAM,MAAM,EAAE,GAAG,SAAS,OAAO,KAAK,CAAC;AAChD;","names":[]}
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  normalizeSessionSource
4
- } from "./chunk-H53QZQJI.js";
4
+ } from "./chunk-PSGTHJQU.js";
5
5
  import {
6
6
  resolveEnvRefsDeep
7
- } from "./chunk-BEFVJ2OE.js";
7
+ } from "./chunk-XXLCMSD3.js";
8
8
  import {
9
9
  BaseAdapter,
10
10
  renderSkillMd
11
- } from "./chunk-MGTDQLJJ.js";
11
+ } from "./chunk-UNU2KPYJ.js";
12
12
  import {
13
13
  buildHomeBinHookCommand,
14
14
  buildUsageEventCommand,
@@ -16,7 +16,7 @@ import {
16
16
  isHomeBinHookCommand,
17
17
  isHostNativeUsageEnabled,
18
18
  isUsageEventCommand
19
- } from "./chunk-4NHXLXSD.js";
19
+ } from "./chunk-W7AGWAMH.js";
20
20
 
21
21
  // src/adapters/antigravity/index.ts
22
22
  import { existsSync } from "fs";
@@ -687,4 +687,4 @@ export {
687
687
  adapter,
688
688
  antigravity_default
689
689
  };
690
- //# sourceMappingURL=chunk-XC5SJ35F.js.map
690
+ //# sourceMappingURL=chunk-RPWD5H6Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/antigravity/index.ts"],"sourcesContent":["/**\r\n * adapters/antigravity — Google Antigravity (IDE) platform adapter.\r\n *\r\n * Antigravity is a Gemini-family host that, as of the 2.0 line, exposes a real\r\n * lifecycle-hook system on top of MCP — so this adapter is `json-stdio` (not the\r\n * old `mcp-only` framing): the host pipes a JSON payload to a hook command on\r\n * stdin and reads a JSON control object back, the same paradigm as Claude Code /\r\n * Gemini CLI. It installs the MCP server, lifecycle hooks, slash-command\r\n * Workflows, and Agent Skills.\r\n *\r\n * CONFIRMED-BY-INSTALL (2026-06-03, docs/research/antigravity-paths-confirmed.md):\r\n * a real machine with Antigravity IDE + `agy` CLI v1.0.0 shows the canonical user\r\n * customization root is `~/.gemini/antigravity/` — `~/.gemini/antigravity/mcp_config.json`\r\n * EXISTS and `~/.gemini/config/mcp_config.json` does NOT. So the fresh-install\r\n * default user MCP path is `~/.gemini/antigravity/mcp_config.json` (candidate[0]);\r\n * the `config/` and `antigravity-cli/` paths remain probed fallbacks only (honored\r\n * when a pre-existing config is found there, never the fresh default).\r\n *\r\n * STILL MEDIUM-CONFIDENCE / PATH-PROBING: hooks.json and the global skills dir were\r\n * NOT present on the observed install, so those locations stay corroborated-but-not-\r\n * byte-verified. Every user-scope path is PROBED at runtime — prefer a candidate\r\n * that already exists on disk, else fall back to the canonical path — and the doctor\r\n * flags each probed path with \"verify for your Antigravity version.\" We NEVER\r\n * hard-code a single guessed path, and any unsupported event or surface warn-skips\r\n * (never throws) at install time.\r\n *\r\n * Native config formats:\r\n * - MCP config (JSONC; we WRITE plain JSON), root key \"mcpServers\". stdio is\r\n * `{ command, args, env }`; a remote server is `{ serverUrl, headers }`\r\n * (NOTE: the key is `serverUrl`, NOT `url` and NOT Gemini CLI's `httpUrl`).\r\n * user scope → prefer existing of:\r\n * ~/.gemini/antigravity/mcp_config.json (CONFIRMED canonical)\r\n * ~/.gemini/config/mcp_config.json (probed fallback)\r\n * ~/.gemini/antigravity-cli/mcp_config.json (probed fallback)\r\n * else default to candidate[0] (antigravity/).\r\n * project scope → <projectDir>/.agents/mcp_config.json\r\n * - Hooks: a SEPARATE hooks.json in the customization dir (NOT the mcp_config),\r\n * project → <projectDir>/.agents/hooks.json\r\n * user → <resolvedUserConfigDir>/hooks.json\r\n * Shape: { hooks: { <Event>: [ { matcher, hooks:[{ type:\"command\", command }] } ] } }.\r\n * Supported events: PreToolUse, PostToolUse, SessionStart, Stop. All other\r\n * normalized events warn-skip. I/O fields are camelCase (see parse/format).\r\n * - Commands = \"Workflows\": markdown `.md` (body = the prompt; an optional\r\n * leading description line). Project prefer existing <proj>/.agent/workflows\r\n * or <proj>/.agents/workflows (default .agent/workflows per launch docs);\r\n * user ~/.gemini/antigravity/global_workflows.\r\n * - Skills = Agent Skills (uniform SKILL.md). Project\r\n * <proj>/.agents/skills/<name>/SKILL.md; user PROBE\r\n * ~/.gemini/antigravity-cli/skills then ~/.gemini/skills (NEVER\r\n * ~/.gemini/antigravity/skills — reportedly broken). NOTE: the global skills\r\n * dir was NOT present on the confirmed install, so it stays medium-confidence\r\n * + doctor \"verify for your version.\"\r\n * - Subagents: declarative subagents exist only inside a plugin bundle, which\r\n * agent-connector does not emit; supportsSubagents is false and the\r\n * BaseAdapter skip/warn default applies.\r\n *\r\n * Env handling: Antigravity (Gemini family) documents no `${env:VAR}` token of\r\n * the framework's syntax, so env/header/url refs are resolved to literals at\r\n * install time via resolveEnvRefsDeep — the safe default matching the Gemini CLI\r\n * adapter.\r\n */\r\n\r\nimport { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { dirname, join } from \"node:path\";\r\n\r\nimport { BaseAdapter } from \"../base.js\";\r\nimport type { Adapter, HookReply, InstallContext, NormalizedEvent } from \"../spi.js\";\r\nimport type {\r\n ChangeRecord,\r\n CommandDef,\r\n DetectedPlatform,\r\n HealthCheck,\r\n HookEventName,\r\n HookParadigm,\r\n HookResponse,\r\n PlatformCapabilities,\r\n PlatformId,\r\n PostToolUseEvent,\r\n PreToolUseEvent,\r\n ServerDef,\r\n SessionStartEvent,\r\n StopEvent,\r\n Transport,\r\n} from \"../../core/types.js\";\r\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\r\nimport {\r\n buildHomeBinHookCommand,\r\n buildWrappedStdio,\r\n buildUsageEventCommand,\r\n isHomeBinHookCommand,\r\n isHostNativeUsageEnabled,\r\n isUsageEventCommand,\r\n} from \"../../core/spawn.js\";\r\nimport { renderSkillMd } from \"../claude-code/render.js\";\r\nimport { normalizeSessionSource } from \"../claude-code/wire.js\";\r\n\r\nconst HOST: PlatformId = \"antigravity\";\r\nconst MCP_ROOT_KEY = \"mcpServers\";\r\n\r\n/**\r\n * Known user-scope MCP config candidates, in preference order. We pick the first\r\n * that already exists on disk; otherwise we default to candidate[0]\r\n * (~/.gemini/antigravity/mcp_config.json — CONFIRMED canonical on a real install:\r\n * docs/research/antigravity-paths-confirmed.md). The `config/` and CLI-only\r\n * `antigravity-cli/` paths are kept ONLY as probed fallbacks so a pre-existing\r\n * config in either is still honored, but neither is ever the fresh-install default.\r\n */\r\nconst USER_CONFIG_CANDIDATES = [\r\n [\".gemini\", \"antigravity\", \"mcp_config.json\"],\r\n [\".gemini\", \"config\", \"mcp_config.json\"],\r\n [\".gemini\", \"antigravity-cli\", \"mcp_config.json\"],\r\n] as const;\r\n\r\n/**\r\n * Antigravity's supported lifecycle hook events. These happen to share the\r\n * normalized PascalCase names 1:1; everything else has no Antigravity equivalent\r\n * and is reported as a warn/skip at install time.\r\n */\r\nconst SUPPORTED_EVENTS: ReadonlySet<HookEventName> = new Set<HookEventName>([\r\n \"PreToolUse\",\r\n \"PostToolUse\",\r\n \"SessionStart\",\r\n \"Stop\",\r\n]);\r\n\r\n/**\r\n * Native hooks.json key for the OPT-IN host-native turn-usage hook (enricher 4a).\r\n * Antigravity shares the Gemini-family `AfterModel` model-turn hook, whose payload\r\n * carries `usageMetadata`. This is a host-native-only sink (no connector handler);\r\n * it is installed ONLY when host-native capture is enabled and records a DISTINCT\r\n * `model_turn` telemetry row that is never summed with the per-MCP `serve` rows.\r\n */\r\nconst USAGE_HOOK_EVENT = \"AfterModel\";\r\n\r\n/** A single Antigravity native hook registration entry (nested, Claude-shaped). */\r\ninterface AntigravityHookEntry {\r\n matcher: string;\r\n hooks: Array<{ type: \"command\"; command: string }>;\r\n}\r\n\r\n/** The shape of Antigravity's hooks.json (only the parts we touch). */\r\ninterface AntigravityHooksFile {\r\n hooks?: Record<string, AntigravityHookEntry[]>;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Native MCP server entry shapes Antigravity accepts under `mcpServers`.\r\n * A stdio server is `{ command, args, env }`; a remote server is\r\n * `{ serverUrl, headers }` — the key is `serverUrl` (NOT `url`).\r\n */\r\ninterface AntigravityStdioServer {\r\n command: string;\r\n args?: string[];\r\n env?: Record<string, string>;\r\n}\r\ninterface AntigravityHttpServer {\r\n serverUrl: string;\r\n headers?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Raw Antigravity hook stdin payload (camelCase wire fields).\r\n *\r\n * SOURCE-VERIFIED against Google's official Antigravity hooks docs\r\n * (antigravity.google/docs/hooks) and corroborated by production integrations\r\n * (Cisco defenseclaw, camjac251/tool-gates, ntd4996/agentpet): Antigravity does\r\n * NOT use the flat Claude-Code shape. It carries no `hook_event_name`; the tool\r\n * descriptor is NESTED under `toolCall` (`toolCall.name` / `toolCall.args`); the\r\n * stable session id is `conversationId`; and the workspace roots are a string\r\n * array `workspacePaths` (first entry is the project dir). PostToolUse sends NO\r\n * tool fields — only `stepIdx`, an `error` string (empty/absent on success), and\r\n * the common fields.\r\n */\r\ninterface AntigravityToolCall {\r\n name?: string;\r\n args?: Record<string, unknown>;\r\n}\r\ninterface AntigravityWireInput {\r\n connector?: unknown;\r\n /** PreToolUse: nested tool descriptor (`toolCall.name`, `toolCall.args`). */\r\n toolCall?: AntigravityToolCall;\r\n toolOutput?: string;\r\n /** PostToolUse: runtime error message — empty/absent on success. */\r\n error?: string;\r\n /** Stable session id (the active agent conversation UUID). */\r\n conversationId?: string;\r\n /** Mounted workspace roots; the first entry is the project dir. */\r\n workspacePaths?: string[];\r\n source?: string;\r\n reason?: string;\r\n stopHookActive?: boolean;\r\n}\r\n\r\nexport class AntigravityAdapter extends BaseAdapter implements Adapter {\r\n readonly id: PlatformId = HOST;\r\n readonly name: string = \"Google Antigravity\";\r\n readonly paradigm: HookParadigm = \"json-stdio\";\r\n\r\n readonly capabilities: PlatformCapabilities = {\r\n // Memory surface: AGENTS.md-first managed block via the BaseAdapter default\r\n // (memoryTargets: project <projectDir>/AGENTS.md; user scope where documented).\r\n supportsMemory: true,\r\n // Antigravity 2.0 fires PreToolUse / PostToolUse / SessionStart / Stop.\r\n preToolUse: true,\r\n postToolUse: true,\r\n sessionStart: true,\r\n stop: true,\r\n // No documented equivalents — kept false; the corresponding normalized\r\n // events warn-skip at install time.\r\n preCompact: false,\r\n sessionEnd: false,\r\n userPromptSubmit: false,\r\n notification: false,\r\n // Newer events: no documented permission-dialog, tool-failure, or subagent\r\n // lifecycle hooks on Antigravity (IDE or `agy` CLI — the CLI adapter\r\n // inherits this surface), so permissionRequest / postToolUseFailure /\r\n // subagentStart / subagentStop stay unset — install reports the standard\r\n // skip-warn for them.\r\n // Transform-category hooks can rewrite tool input and tool output; the\r\n // SessionStart hook can inject additional context.\r\n canModifyArgs: true,\r\n canModifyOutput: true,\r\n canInjectSessionContext: true,\r\n // Antigravity registers stdio, SSE, and Streamable HTTP MCP servers.\r\n transports: [\"stdio\", \"sse\", \"http\"],\r\n // Content surfaces: Workflows (markdown commands) + Agent Skills (SKILL.md).\r\n // Declarative subagents exist only inside a plugin bundle (not emitted), so\r\n // subagents are unsupported and inherit the BaseAdapter skip/warn default.\r\n supportsCommands: true,\r\n supportsSkills: true,\r\n supportsSubagents: false,\r\n };\r\n\r\n // ── Detection ────────────────────────────────────────────────────────────\r\n\r\n detectInstalled(projectDir: string): DetectedPlatform {\r\n const userConfig = this.resolveUserConfigPath();\r\n const userDir = join(homedir(), \".gemini\");\r\n const projectConfig = join(projectDir, \".agents\", \"mcp_config.json\");\r\n\r\n const userInstalled =\r\n existsSync(userDir) ||\r\n this.userConfigCandidates().some((parts) => existsSync(join(homedir(), ...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 config at ${projectConfig}`\r\n : `found Antigravity config under ${userDir}`\r\n : `no Antigravity config at ${userDir} or ${projectConfig}`,\r\n confidence: installed ? \"high\" : \"low\",\r\n };\r\n }\r\n\r\n /**\r\n * The lifecycle hook events this host actually writes; every other normalized\r\n * event warn-skips at install time. Defaults to the IDE's\r\n * {@link SUPPORTED_EVENTS}. Overridable by forks whose underlying binary\r\n * recognizes a DIFFERENT event set (e.g. the `agy` CLI, which does NOT\r\n * recognize SessionStart). Kept in lock-step with the per-event capability\r\n * flags so the docs hooks-matrix and the fleet-wide never-silent-drop contract\r\n * stay consistent.\r\n */\r\n protected supportedHookEvents(): ReadonlySet<HookEventName> {\r\n return SUPPORTED_EVENTS;\r\n }\r\n\r\n // ── Native paths ─────────────────────────────────────────────────────────\r\n\r\n getConfigDir(ctx: InstallContext): string {\r\n if (ctx.scope === \"project\") return join(ctx.projectDir, \".agents\");\r\n // User scope: parent dir of the resolved user mcp_config.json.\r\n return dirname(this.resolveUserConfigPath());\r\n }\r\n\r\n getServerConfigPath(ctx: InstallContext): string {\r\n return ctx.scope === \"project\"\r\n ? join(ctx.projectDir, \".agents\", \"mcp_config.json\")\r\n : this.resolveUserConfigPath();\r\n }\r\n\r\n /**\r\n * Hooks live in a SEPARATE hooks.json in the customization dir — NOT the\r\n * mcp_config.json. Project → <proj>/.agents/hooks.json; user →\r\n * <resolvedUserConfigDir>/hooks.json (the dir holding the resolved user MCP\r\n * config). Path is medium-confidence and surfaced by the doctor.\r\n */\r\n getHookConfigPath(ctx: InstallContext): string {\r\n return join(this.getConfigDir(ctx), \"hooks.json\");\r\n }\r\n\r\n /**\r\n * The user-scope MCP config candidates, in preference order. Overridable by\r\n * forks (e.g. the Antigravity CLI) that resolve a different user-scope root\r\n * while reusing resolveUserConfigPath's prefer-existing-else-candidate[0] logic.\r\n */\r\n protected userConfigCandidates(): ReadonlyArray<readonly string[]> {\r\n return USER_CONFIG_CANDIDATES;\r\n }\r\n\r\n /**\r\n * Pick the user-scope mcp_config.json: prefer a candidate that already exists,\r\n * else default to candidate[0] (the CONFIRMED canonical ~/.gemini/antigravity path).\r\n */\r\n protected resolveUserConfigPath(): string {\r\n const home = homedir();\r\n const candidates = this.userConfigCandidates();\r\n for (const parts of candidates) {\r\n const p = join(home, ...parts);\r\n if (existsSync(p)) return p;\r\n }\r\n const fallback = candidates[0];\r\n if (fallback === undefined) {\r\n // Defensive: a non-empty candidate list is an invariant, but never throw.\r\n return join(home, \".gemini\", \"antigravity\", \"mcp_config.json\");\r\n }\r\n return join(home, ...fallback);\r\n }\r\n\r\n /**\r\n * Resolve the Workflows (slash-command) dir, prefer-existing-else-canonical.\r\n * project → prefer existing <proj>/.agent/workflows or <proj>/.agents/workflows;\r\n * default .agent/workflows (launch-era singular `.agent`).\r\n * user → ~/.gemini/antigravity/global_workflows.\r\n */\r\n protected resolveWorkflowsDir(ctx: InstallContext): string {\r\n if (ctx.scope === \"project\") {\r\n const singular = join(ctx.projectDir, \".agent\", \"workflows\");\r\n const plural = join(ctx.projectDir, \".agents\", \"workflows\");\r\n if (existsSync(singular)) return singular;\r\n if (existsSync(plural)) return plural;\r\n return singular;\r\n }\r\n return join(homedir(), \".gemini\", \"antigravity\", \"global_workflows\");\r\n }\r\n\r\n /**\r\n * Resolve the Agent Skills dir, prefer-existing-else-canonical.\r\n * project → <proj>/.agents/skills (plural — matches mcp/skills convention).\r\n * user → prefer existing ~/.gemini/antigravity-cli/skills, else\r\n * ~/.gemini/skills. NEVER ~/.gemini/antigravity/skills\r\n * (reportedly broken), so it is not a candidate.\r\n */\r\n protected resolveSkillsDir(ctx: InstallContext): string {\r\n if (ctx.scope === \"project\") {\r\n return join(ctx.projectDir, \".agents\", \"skills\");\r\n }\r\n const home = homedir();\r\n const cliSkills = join(home, \".gemini\", \"antigravity-cli\", \"skills\");\r\n const sharedSkills = join(home, \".gemini\", \"skills\");\r\n if (existsSync(cliSkills)) return cliSkills;\r\n if (existsSync(sharedSkills)) return sharedSkills;\r\n return cliSkills;\r\n }\r\n\r\n // ── MCP server install / uninstall ───────────────────────────────────────\r\n\r\n installServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n const override = connector.platforms[this.id]?.server;\r\n if (!connector.server || override === false) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n detail: connector.server\r\n ? `server registration disabled for ${this.id}`\r\n : \"connector declares no MCP server\",\r\n },\r\n ];\r\n }\r\n\r\n // Shallow-merge any per-platform server override into the base ServerDef.\r\n const server: ServerDef =\r\n override && typeof override === \"object\"\r\n ? { ...connector.server, ...override }\r\n : connector.server;\r\n\r\n const serverPath = this.getServerConfigPath(ctx);\r\n const entry = this.renderServerEntry(ctx, server);\r\n\r\n return [\r\n this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun),\r\n ];\r\n }\r\n\r\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\r\n const serverPath = this.getServerConfigPath(ctx);\r\n return [\r\n this.removeServerFromJson(serverPath, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun),\r\n ];\r\n }\r\n\r\n /** Render a normalized ServerDef into Antigravity's native mcpServers entry. */\r\n private renderServerEntry(\r\n ctx: InstallContext,\r\n server: ServerDef,\r\n ): AntigravityStdioServer | AntigravityHttpServer {\r\n const transport: Transport = server.transport;\r\n\r\n if (transport === \"stdio\") {\r\n let command = server.command ?? \"\";\r\n let args = [...(server.args ?? [])];\r\n\r\n // Transparent telemetry wrapping: route the real command through\r\n // `<homeBin> serve --connector <id> --scope <scope> -- <command> <args...>`.\r\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\r\n\r\n // Antigravity (Gemini family) has no documented native interpolation token,\r\n // so resolve every ${env:VAR} to a literal at install time.\r\n const entry: AntigravityStdioServer = { command: resolveEnvRefsDeep(command) };\r\n if (args.length > 0) entry.args = resolveEnvRefsDeep(args);\r\n const env = this.renderEnv(server.env);\r\n if (env) entry.env = env;\r\n return entry;\r\n }\r\n\r\n // sse / http (and any other remote transport) — Antigravity registers a URL\r\n // under the `serverUrl` key (NOT `url`).\r\n const entry: AntigravityHttpServer = { serverUrl: resolveEnvRefsDeep(server.url ?? \"\") };\r\n const headers = this.renderEnv(server.headers);\r\n if (headers) entry.headers = headers;\r\n return entry;\r\n }\r\n\r\n /**\r\n * Render env/header values. Antigravity documents no native interpolation\r\n * token, so resolve `${env:VAR}` references to literals at install time.\r\n */\r\n private renderEnv(\r\n env: Record<string, string> | undefined,\r\n ): Record<string, string> | undefined {\r\n if (!env || Object.keys(env).length === 0) return undefined;\r\n return resolveEnvRefsDeep({ ...env });\r\n }\r\n\r\n // ── Hook install / uninstall ─────────────────────────────────────────────\r\n\r\n installHooks(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.platforms[this.id]?.hooks === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: `hooks disabled for ${this.id}` }];\r\n }\r\n // The opt-in host-native usage hook (4a) needs no connector handler, so it may\r\n // be installed even when the connector declares no normalized hook events.\r\n const hostNative = isHostNativeUsageEnabled(connector.telemetry);\r\n if (connector.hookEvents.length === 0 && !hostNative) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no hooks\" }];\r\n }\r\n\r\n const hooksPath = this.getHookConfigPath(ctx);\r\n // OVERWRITE GUARD: never clobber a present-but-unparseable hooks.json.\r\n if (this.isPresentButUnparseable(hooksPath)) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n path: hooksPath,\r\n detail: `existing ${hooksPath} is not parseable; left untouched (back it up / fix it, then re-run)`,\r\n },\r\n ];\r\n }\r\n\r\n const file = this.readJson<AntigravityHooksFile>(hooksPath) ?? {};\r\n const __skip = this.malformedHookRootSkip(hooksPath, (file as Record<string, unknown>).hooks);\r\n if (__skip) return [__skip];\r\n const hooks = (file.hooks ??= {});\r\n\r\n const changes: ChangeRecord[] = [];\r\n let mutated = false;\r\n\r\n const supportedEvents = this.supportedHookEvents();\r\n for (const event of connector.hookEvents) {\r\n if (!supportedEvents.has(event)) {\r\n // No Antigravity equivalent for this normalized event — report.\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n path: hooksPath,\r\n detail: `${event} has no Antigravity hook equivalent — skipped`,\r\n });\r\n continue;\r\n }\r\n\r\n const command = buildHomeBinHookCommand(ctx.homeBinPath, this.id, event, connector.id);\r\n const matcher = connector.hooks[event]?.matcher ?? \"\";\r\n const entry: AntigravityHookEntry = {\r\n matcher,\r\n hooks: [{ type: \"command\", command }],\r\n };\r\n\r\n const bucket = (hooks[event] ??= []);\r\n const existingIdx = bucket.findIndex((e) => this.entryHasOurCommand(e, ctx));\r\n\r\n if (existingIdx >= 0) {\r\n if (JSON.stringify(bucket[existingIdx]) === JSON.stringify(entry)) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"skip\",\r\n path: hooksPath,\r\n detail: `hooks.${event} already registered`,\r\n });\r\n continue;\r\n }\r\n bucket[existingIdx] = entry;\r\n changes.push({\r\n platform: this.id,\r\n action: \"update\",\r\n path: hooksPath,\r\n detail: `hooks.${event}`,\r\n });\r\n } else {\r\n bucket.push(entry);\r\n changes.push({\r\n platform: this.id,\r\n action: \"create\",\r\n path: hooksPath,\r\n detail: `hooks.${event}`,\r\n });\r\n }\r\n mutated = true;\r\n }\r\n\r\n // OPT-IN host-native usage hook (4a): register the AfterModel `usage-event`\r\n // sink when enabled. Records a DISTINCT `model_turn` row (whole-conversation),\r\n // never summed with the per-MCP `serve`-proxy rows.\r\n if (hostNative) {\r\n if (this.installUsageHook(hooks, ctx, hooksPath, changes)) mutated = true;\r\n }\r\n\r\n if (mutated) this.writeJson(hooksPath, file, ctx.dryRun);\r\n return changes;\r\n }\r\n\r\n /**\r\n * Register the opt-in AfterModel host-native usage hook (4a) into `hooks`.\r\n * Idempotent (byte-identical → skip, drift → update); returns true on mutation.\r\n * The command is the hidden `usage-event` entrypoint (NOT a connector hook), so\r\n * it carries an empty matcher. Reads `this.id` so the CLI fork installs its own\r\n * `usage-event antigravity-cli …` variant.\r\n */\r\n private installUsageHook(\r\n hooks: Record<string, AntigravityHookEntry[]>,\r\n ctx: InstallContext,\r\n hooksPath: string,\r\n changes: ChangeRecord[],\r\n ): boolean {\r\n const command = buildUsageEventCommand(ctx.homeBinPath, this.id, ctx.connector.id);\r\n const entry: AntigravityHookEntry = {\r\n matcher: \"\",\r\n hooks: [{ type: \"command\", command }],\r\n };\r\n const bucket = (hooks[USAGE_HOOK_EVENT] ??= []);\r\n const existingIdx = bucket.findIndex((e) =>\r\n (e.hooks ?? []).some((h) => isUsageEventCommand(h.command, ctx.homeBinPath, ctx.connector.id)),\r\n );\r\n\r\n if (existingIdx >= 0) {\r\n if (JSON.stringify(bucket[existingIdx]) === JSON.stringify(entry)) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"skip\",\r\n path: hooksPath,\r\n detail: `hooks.${USAGE_HOOK_EVENT} (host-native usage) already registered`,\r\n });\r\n return false;\r\n }\r\n bucket[existingIdx] = entry;\r\n changes.push({\r\n platform: this.id,\r\n action: \"update\",\r\n path: hooksPath,\r\n detail: `hooks.${USAGE_HOOK_EVENT} (host-native usage)`,\r\n });\r\n } else {\r\n bucket.push(entry);\r\n changes.push({\r\n platform: this.id,\r\n action: \"create\",\r\n path: hooksPath,\r\n detail: `hooks.${USAGE_HOOK_EVENT} (host-native usage)`,\r\n });\r\n }\r\n return true;\r\n }\r\n\r\n uninstallHooks(ctx: InstallContext): ChangeRecord[] {\r\n const hooksPath = this.getHookConfigPath(ctx);\r\n const file = this.readJson<AntigravityHooksFile>(hooksPath);\r\n const hooks = file?.hooks;\r\n if (!file || !hooks) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path: hooksPath,\r\n detail: \"no hooks section present\",\r\n },\r\n ];\r\n }\r\n\r\n const changes: ChangeRecord[] = [];\r\n let mutated = false;\r\n\r\n for (const event of Object.keys(hooks)) {\r\n const bucket = hooks[event];\r\n if (!Array.isArray(bucket)) continue;\r\n\r\n // Strip our hook command from each entry; drop entries left empty so we\r\n // never remove another connector's (or the user's own) hook commands.\r\n const next: AntigravityHookEntry[] = [];\r\n let removed = 0;\r\n for (const e of bucket) {\r\n const innerBefore = e.hooks?.length ?? 0;\r\n const inner = (e.hooks ?? []).filter((h) => !this.isOurCommand(h.command, ctx));\r\n removed += innerBefore - inner.length;\r\n if (inner.length > 0) next.push({ matcher: e.matcher ?? \"\", hooks: inner });\r\n }\r\n\r\n if (removed > 0) {\r\n if (next.length > 0) hooks[event] = next;\r\n else delete hooks[event];\r\n changes.push({\r\n platform: this.id,\r\n action: \"remove\",\r\n path: hooksPath,\r\n detail: `hooks.${event} (${removed})`,\r\n });\r\n mutated = true;\r\n }\r\n }\r\n\r\n if (mutated) this.writeJson(hooksPath, file, ctx.dryRun);\r\n if (changes.length === 0) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"skip\",\r\n path: hooksPath,\r\n detail: \"no matching hook entries\",\r\n });\r\n }\r\n return changes;\r\n }\r\n\r\n private entryHasOurCommand(entry: AntigravityHookEntry, ctx: InstallContext): boolean {\r\n return (entry.hooks ?? []).some((h) => this.isOurCommand(h.command, ctx));\r\n }\r\n\r\n /**\r\n * True when a hook command is ONE OF OURS for this connector — the universal\r\n * `hook` dispatcher OR the opt-in `usage-event` sink. Both are anchored on the\r\n * connector id (see isHomeBinHookCommand) so a shared-prefix id can't collide,\r\n * and so uninstall reverses the AfterModel usage hook too.\r\n */\r\n private isOurCommand(command: string | undefined, ctx: InstallContext): boolean {\r\n return (\r\n isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id) ||\r\n isUsageEventCommand(command, ctx.homeBinPath, ctx.connector.id)\r\n );\r\n }\r\n\r\n // ── Content surfaces: commands (Workflows) / skills ───────────────────────\r\n // CONTENT-ONLY: pure native-file writers under the probed workflows / skills\r\n // dirs. No runtime dispatch, no home-bin pointer, no telemetry wrap. Each\r\n // method is idempotent (byte-identical → skip) via BaseAdapter.writeContentFile\r\n // and reversible via removeContentFile. Honors platforms[\"antigravity\"]\r\n // per-surface false to skip. Commands are markdown Workflows (NOT TOML, unlike\r\n // gemini-cli); skills are the uniform Claude-compatible SKILL.md. Subagents are\r\n // unsupported (plugin-bundle-only) and inherit the BaseAdapter skip/warn.\r\n\r\n /** Native Workflow file path: <workflowsDir>/<name>.md. */\r\n private commandPath(ctx: InstallContext, name: string): string {\r\n return join(this.resolveWorkflowsDir(ctx), `${name}.md`);\r\n }\r\n /** Native skill dir: <skillsDir>/<name>. */\r\n private skillDir(ctx: InstallContext, name: string): string {\r\n return join(this.resolveSkillsDir(ctx), name);\r\n }\r\n\r\n // ── Commands (Workflows) ──────────────────────────────────────────────────\r\n\r\n override installCommands(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.platforms[this.id]?.commands === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: `commands disabled for ${this.id}` }];\r\n }\r\n if (connector.commands.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\r\n }\r\n return connector.commands.map((cmd) =>\r\n this.writeContentFile(this.commandPath(ctx, cmd.name), this.renderCommand(cmd), ctx.dryRun),\r\n );\r\n }\r\n\r\n override uninstallCommands(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.commands.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\r\n }\r\n return connector.commands.map((cmd) =>\r\n this.removeContentFile(this.commandPath(ctx, cmd.name), ctx.dryRun),\r\n );\r\n }\r\n\r\n /**\r\n * Render a command to an Antigravity Workflow: a plain markdown `.md` whose\r\n * body is the command prompt, optionally preceded by a leading description\r\n * line. No frontmatter / TOML (unlike gemini-cli).\r\n */\r\n private renderCommand(cmd: CommandDef): string {\r\n const body = cmd.prompt.endsWith(\"\\n\") ? cmd.prompt : `${cmd.prompt}\\n`;\r\n if (cmd.description !== undefined && cmd.description !== \"\") {\r\n return `${cmd.description}\\n\\n${body}`;\r\n }\r\n return body;\r\n }\r\n\r\n // ── Skills ────────────────────────────────────────────────────────────────\r\n\r\n override installSkills(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.platforms[this.id]?.skills === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: `skills disabled for ${this.id}` }];\r\n }\r\n if (connector.skills.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\r\n }\r\n const changes: ChangeRecord[] = [];\r\n for (const skill of connector.skills) {\r\n const dir = this.skillDir(ctx, skill.name);\r\n changes.push(\r\n this.writeContentFile(join(dir, \"SKILL.md\"), renderSkillMd(skill), ctx.dryRun),\r\n );\r\n // Bundle any resource files beside SKILL.md (relative path → contents).\r\n // Defense-in-depth: skip+warn on any key that escapes the skill dir.\r\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\r\n const target = this.resolveWithin(dir, rel);\r\n if (target === null) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\r\n });\r\n continue;\r\n }\r\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.skills.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\r\n }\r\n const changes: ChangeRecord[] = [];\r\n for (const skill of connector.skills) {\r\n const dir = this.skillDir(ctx, skill.name);\r\n // Remove only the files we wrote (SKILL.md + declared resources), then the\r\n // skill dir itself when we own its full contents.\r\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\r\n for (const rel of Object.keys(skill.resources ?? {})) {\r\n const target = this.resolveWithin(dir, rel);\r\n if (target === null) continue; // never delete outside the skill dir\r\n changes.push(this.removeContentFile(target, ctx.dryRun));\r\n }\r\n // Only remove the skill dir when WE own its full contents — never rm -rf a\r\n // dir that still holds user-added / sibling-tool / shared files.\r\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\r\n }\r\n return changes;\r\n }\r\n\r\n // ── Diagnostics ──────────────────────────────────────────────────────────\r\n\r\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\r\n const mcpPath = this.getServerConfigPath(ctx);\r\n const hooksPath = this.getHookConfigPath(ctx);\r\n const connectorId = ctx.connector.id;\r\n const homeBin = ctx.homeBinPath;\r\n const hookEvents = ctx.connector.hookEvents;\r\n const workflowsDir = this.resolveWorkflowsDir(ctx);\r\n const skillsDir = this.resolveSkillsDir(ctx);\r\n\r\n const checks: HealthCheck[] = [\r\n {\r\n name: `${this.name}: mcp_config.json present`,\r\n check: () =>\r\n existsSync(mcpPath)\r\n ? { status: \"OK\", detail: `${mcpPath} (path probed; verify for your Antigravity version)` }\r\n : { status: \"FAIL\", detail: `not found: ${mcpPath} (path probed; verify for your Antigravity version)` },\r\n },\r\n {\r\n name: `${this.name}: server entry registered`,\r\n check: () => {\r\n if (!ctx.connector.server) {\r\n return { status: \"OK\", detail: \"no MCP server declared\" };\r\n }\r\n const cfg = this.readJson<{ [k: string]: Record<string, unknown> }>(mcpPath);\r\n const bucket = cfg?.[MCP_ROOT_KEY];\r\n if (!cfg || !bucket) {\r\n return { status: \"FAIL\", detail: `no ${MCP_ROOT_KEY} in ${mcpPath}` };\r\n }\r\n return connectorId in bucket\r\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${connectorId} present` }\r\n : {\r\n status: \"FAIL\",\r\n detail: `no ${MCP_ROOT_KEY}.${connectorId} in ${mcpPath}`,\r\n };\r\n },\r\n },\r\n {\r\n name: `${this.name}: hooks.json hook command registered`,\r\n check: () => {\r\n if (hookEvents.length === 0) {\r\n return { status: \"OK\", detail: \"no hooks declared\" };\r\n }\r\n const file = this.readJson<AntigravityHooksFile>(hooksPath);\r\n if (!file) {\r\n return {\r\n status: \"FAIL\",\r\n detail: `not found: ${hooksPath} (path probed; verify for your Antigravity version)`,\r\n };\r\n }\r\n const hooks = file.hooks ?? {};\r\n const registered = Object.values(hooks).some((entries) =>\r\n (entries ?? []).some((e) =>\r\n (e.hooks ?? []).some((h) =>\r\n isHomeBinHookCommand(h.command, homeBin, connectorId),\r\n ),\r\n ),\r\n );\r\n return registered\r\n ? { status: \"OK\", detail: `hook command present in ${hooksPath}` }\r\n : { status: \"FAIL\", detail: `no hook for ${connectorId} in ${hooksPath}` };\r\n },\r\n },\r\n ];\r\n\r\n // Content-surface checks: only assert presence of the files this connector\r\n // declares (skip silently for surfaces it never asked for). The probed dirs\r\n // are noted so doctor output makes the medium-confidence path explicit.\r\n for (const cmd of ctx.connector.commands) {\r\n const p = join(workflowsDir, `${cmd.name}.md`);\r\n checks.push({\r\n name: `${this.name}: workflow ${cmd.name} present`,\r\n check: () =>\r\n existsSync(p)\r\n ? { status: \"OK\", detail: `${p} (workflows dir probed; verify for your version)` }\r\n : { status: \"FAIL\", detail: `not found: ${p} (workflows dir probed; verify for your version)` },\r\n });\r\n }\r\n for (const skill of ctx.connector.skills) {\r\n const p = join(skillsDir, skill.name, \"SKILL.md\");\r\n checks.push({\r\n name: `${this.name}: skill ${skill.name} present`,\r\n check: () =>\r\n existsSync(p)\r\n ? { status: \"OK\", detail: `${p} (skills dir probed; verify for your version)` }\r\n : { status: \"FAIL\", detail: `not found: ${p} (skills dir probed; verify for your version)` },\r\n });\r\n }\r\n return checks;\r\n }\r\n\r\n // ── Runtime: parse Antigravity stdin JSON → normalized event ──────────────\r\n\r\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\r\n const input = (raw ?? {}) as AntigravityWireInput;\r\n const connectorId = typeof input.connector === \"string\" ? input.connector : \"\";\r\n // Stable session id is `conversationId` (NOT a flat `sessionId`).\r\n const sessionId = typeof input.conversationId === \"string\" ? input.conversationId : \"\";\r\n // Project dir is the first mounted workspace root (`workspacePaths[0]`), a\r\n // string array — NOT a flat `cwd` string.\r\n const projectDir =\r\n Array.isArray(input.workspacePaths) && typeof input.workspacePaths[0] === \"string\"\r\n ? input.workspacePaths[0]\r\n : undefined;\r\n\r\n const base = {\r\n hostPlatform: this.id,\r\n connectorId,\r\n sessionId,\r\n raw,\r\n ...(projectDir !== undefined ? { projectDir } : {}),\r\n } as const;\r\n\r\n switch (event) {\r\n case \"PreToolUse\": {\r\n // Tool descriptor is nested under `toolCall` (`.name` / `.args`).\r\n const ev: PreToolUseEvent = {\r\n ...base,\r\n toolName: input.toolCall?.name ?? \"\",\r\n toolInput: input.toolCall?.args ?? {},\r\n };\r\n return ev;\r\n }\r\n case \"PostToolUse\": {\r\n // Antigravity's PostToolUse carries no tool fields — only `stepIdx`,\r\n // an `error` string, and the common fields. Derive isError from a\r\n // non-empty error string and surface it as the failure output.\r\n const error = typeof input.error === \"string\" ? input.error : \"\";\r\n const ev: PostToolUseEvent = {\r\n ...base,\r\n toolName: \"\",\r\n toolInput: {},\r\n ...(error.length > 0\r\n ? { isError: true, toolOutput: error }\r\n : input.toolOutput !== undefined\r\n ? { toolOutput: input.toolOutput }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n case \"SessionStart\": {\r\n const ev: SessionStartEvent = {\r\n ...base,\r\n source: normalizeSessionSource(input.source),\r\n };\r\n return ev;\r\n }\r\n case \"Stop\": {\r\n const ev: StopEvent = {\r\n ...base,\r\n ...(typeof input.stopHookActive === \"boolean\"\r\n ? { stopHookActive: input.stopHookActive }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n default: {\r\n // Antigravity only delivers the four SUPPORTED_EVENTS. If the runtime\r\n // dispatches anything else, surface it loudly rather than mis-parse.\r\n throw new Error(`unsupported ${this.id} hook event: ${String(event)}`);\r\n }\r\n }\r\n }\r\n\r\n // ── Runtime: normalized response → Antigravity native hook reply ──────────\r\n\r\n formatReply(event: HookEventName, response: HookResponse): HookReply {\r\n const decision = response.decision ?? \"allow\";\r\n\r\n // deny → Antigravity blocks the action via a top-level `decision:\"deny\"` +\r\n // reason (the Decide category).\r\n if (decision === \"deny\") {\r\n return this.stdout({\r\n decision: \"deny\",\r\n reason: response.reason ?? \"Blocked by hook\",\r\n });\r\n }\r\n\r\n // ask → Antigravity has no native \"ask\"; degrade to deny to stay fail-safe.\r\n if (decision === \"ask\") {\r\n return this.stdout({\r\n decision: \"deny\",\r\n reason: response.reason ?? \"Action requires user confirmation (security policy)\",\r\n });\r\n }\r\n\r\n // modify → Transform category. camelCase: rewrite PreToolUse input via\r\n // updatedInput; rewrite PostToolUse output via updatedOutput.\r\n if (decision === \"modify\") {\r\n if (event === \"PreToolUse\" && response.updatedInput) {\r\n return this.stdout({ updatedInput: response.updatedInput });\r\n }\r\n if (event === \"PostToolUse\" && response.updatedOutput !== undefined) {\r\n return this.stdout({ updatedOutput: response.updatedOutput });\r\n }\r\n // Nothing to apply; fall through to allow.\r\n }\r\n\r\n // context → inject soft guidance via additionalContext (the SessionStart\r\n // context-injection path).\r\n if (decision === \"context\" && response.additionalContext) {\r\n return this.stdout({ additionalContext: response.additionalContext });\r\n }\r\n\r\n // allow / void / unsupported-degradation → pass through with exit 0.\r\n return { exitCode: 0 };\r\n }\r\n\r\n private stdout(payload: unknown): HookReply {\r\n return { exitCode: 0, stdout: JSON.stringify(payload) };\r\n }\r\n}\r\n\r\nexport const adapter = new AntigravityAdapter();\r\nexport default adapter;\r\n"],"mappings":"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","names":["entry"]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  installInstructions,
4
4
  packageConnector
5
- } from "./chunk-APZDTY76.js";
5
+ } from "./chunk-LZL2YITN.js";
6
6
  import {
7
7
  MARKETPLACE_NAME,
8
8
  agyPluginInstalled,
@@ -43,34 +43,34 @@ import {
43
43
  readMarketplaceInstalls,
44
44
  readNpmConfig,
45
45
  writeMarketplaceInstalls
46
- } from "./chunk-2Y2MZRLP.js";
46
+ } from "./chunk-7C2IPIIB.js";
47
47
  import {
48
48
  spawnChild
49
- } from "./chunk-Z2MRSS2I.js";
49
+ } from "./chunk-RNVIK5YJ.js";
50
50
  import {
51
51
  detectInstalledPlatforms
52
- } from "./chunk-ISEJWBFF.js";
52
+ } from "./chunk-B6PKHS5I.js";
53
53
  import {
54
54
  log
55
- } from "./chunk-KHO5WNTP.js";
55
+ } from "./chunk-4GH2KA7V.js";
56
56
  import {
57
57
  deregisterConnector,
58
58
  loadRegisteredConnector,
59
59
  registerConnector
60
- } from "./chunk-PW42ZXCB.js";
60
+ } from "./chunk-DOPFBUCX.js";
61
61
  import {
62
62
  REGISTERED_PLATFORM_IDS,
63
63
  loadAdapter
64
- } from "./chunk-D4ELPBB5.js";
64
+ } from "./chunk-TOSNS2BY.js";
65
65
  import {
66
66
  configPatchManualEdit
67
- } from "./chunk-NBYKLUF6.js";
67
+ } from "./chunk-KFPSJRHR.js";
68
68
  import {
69
69
  findUnsetEnvRefs
70
- } from "./chunk-BEFVJ2OE.js";
70
+ } from "./chunk-XXLCMSD3.js";
71
71
  import {
72
72
  hasMemoryLedger
73
- } from "./chunk-UMQ6NBQR.js";
73
+ } from "./chunk-ILWHLGIC.js";
74
74
  import {
75
75
  connectorDir,
76
76
  connectorsDir,
@@ -79,7 +79,7 @@ import {
79
79
  ensureHomeBin,
80
80
  firstSymlinkInPath,
81
81
  homeBinPath
82
- } from "./chunk-GZGLCCEE.js";
82
+ } from "./chunk-QYOUQCC6.js";
83
83
 
84
84
  // src/core/installer.ts
85
85
  import { existsSync, readdirSync, rmSync } from "fs";
@@ -3396,4 +3396,4 @@ export {
3396
3396
  upgradeViaMarketplace,
3397
3397
  marketplaceDoctorChecks
3398
3398
  };
3399
- //# sourceMappingURL=chunk-PAPMUAR5.js.map
3399
+ //# sourceMappingURL=chunk-S25MVWBP.js.map