@ken-jo/agent-connector 0.4.97 → 0.4.99

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 (387) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +6 -6
  3. package/README.md +604 -596
  4. package/dist/{action-IPFDPOZU.js → action-5OEM3QC4.js} +17 -16
  5. package/dist/action-5OEM3QC4.js.map +1 -0
  6. package/dist/{amazon-q-IT44LEWV.js → amazon-q-7DPVJXJN.js} +6 -6
  7. package/dist/amazon-q-7DPVJXJN.js.map +1 -0
  8. package/dist/{amp-CEWOSWQO.js → amp-BQZOL5GR.js} +4 -4
  9. package/dist/amp-BQZOL5GR.js.map +1 -0
  10. package/dist/{amp-P35FRU2Z.js → amp-VYXZWHXW.js} +7 -7
  11. package/dist/amp-VYXZWHXW.js.map +1 -0
  12. package/dist/{antigravity-LHFEFNMC.js → antigravity-EA4L225L.js} +5 -5
  13. package/dist/antigravity-EA4L225L.js.map +1 -0
  14. package/dist/antigravity-VXHL6ZPM.js +18 -0
  15. package/dist/{antigravity-cli-MOKFSWOU.js → antigravity-cli-B2HXZFYQ.js} +5 -5
  16. package/dist/antigravity-cli-B2HXZFYQ.js.map +1 -0
  17. package/dist/{antigravity-cli-MPE27LPI.js → antigravity-cli-JHQ7JGNX.js} +10 -9
  18. package/dist/antigravity-cli-JHQ7JGNX.js.map +1 -0
  19. package/dist/{audit-3E5JAOP2.js → audit-BO7JQYIH.js} +8 -8
  20. package/dist/{chunk-7C2IPIIB.js → chunk-2Y2MZRLP.js} +3 -3
  21. package/dist/chunk-2Y2MZRLP.js.map +1 -0
  22. package/dist/{chunk-GZZCHJDP.js → chunk-4KIXXJ7B.js} +2 -2
  23. package/dist/chunk-4KIXXJ7B.js.map +1 -0
  24. package/dist/chunk-4NFDNY3C.js +34 -0
  25. package/dist/chunk-4NFDNY3C.js.map +1 -0
  26. package/dist/{chunk-C63AAXK7.js → chunk-4QXCNZMD.js} +5 -5
  27. package/dist/chunk-4QXCNZMD.js.map +1 -0
  28. package/dist/{chunk-Q7PR2WGT.js → chunk-6TF7MHG5.js} +2 -2
  29. package/dist/chunk-6TF7MHG5.js.map +1 -0
  30. package/dist/{chunk-7ZFK2WEO.js → chunk-6WN37NVN.js} +113 -10
  31. package/dist/chunk-6WN37NVN.js.map +1 -0
  32. package/dist/{chunk-GCPEPUD7.js → chunk-6XMV2OOA.js} +6 -6
  33. package/dist/chunk-6XMV2OOA.js.map +1 -0
  34. package/dist/{chunk-XXLCMSD3.js → chunk-BEFVJ2OE.js} +1 -1
  35. package/dist/chunk-BEFVJ2OE.js.map +1 -0
  36. package/dist/{chunk-N4ENLZEU.js → chunk-BV5WK6VQ.js} +19 -19
  37. package/dist/chunk-BV5WK6VQ.js.map +1 -0
  38. package/dist/{chunk-WPTNMYYM.js → chunk-BXPSDNIB.js} +6 -6
  39. package/dist/chunk-BXPSDNIB.js.map +1 -0
  40. package/dist/{chunk-Q4ISQHUQ.js → chunk-FBJQGRET.js} +1 -1
  41. package/dist/chunk-FBJQGRET.js.map +1 -0
  42. package/dist/{chunk-THI4PI4H.js → chunk-FJCUKXGX.js} +2 -2
  43. package/dist/chunk-FJCUKXGX.js.map +1 -0
  44. package/dist/{chunk-L2C5UMKW.js → chunk-FKW5A6HE.js} +23 -7
  45. package/dist/chunk-FKW5A6HE.js.map +1 -0
  46. package/dist/{chunk-NDMNMAKP.js → chunk-G5HAIYRM.js} +43 -43
  47. package/dist/chunk-G5HAIYRM.js.map +1 -0
  48. package/dist/{chunk-SLJI5BOM.js → chunk-GDIAHWNY.js} +2 -2
  49. package/dist/chunk-GDIAHWNY.js.map +1 -0
  50. package/dist/{chunk-QYOUQCC6.js → chunk-GZGLCCEE.js} +1 -1
  51. package/dist/chunk-GZGLCCEE.js.map +1 -0
  52. package/dist/{chunk-PSGTHJQU.js → chunk-H53QZQJI.js} +1 -1
  53. package/dist/chunk-H53QZQJI.js.map +1 -0
  54. package/dist/{chunk-7HHW23AC.js → chunk-IRUYJD23.js} +29 -29
  55. package/dist/chunk-IRUYJD23.js.map +1 -0
  56. package/dist/{chunk-IOJDZJ72.js → chunk-IVAWP6HH.js} +2 -2
  57. package/dist/chunk-IVAWP6HH.js.map +1 -0
  58. package/dist/{chunk-3FINQ2ZF.js → chunk-JTN3AKZO.js} +30 -20
  59. package/dist/chunk-JTN3AKZO.js.map +1 -0
  60. package/dist/{chunk-4GH2KA7V.js → chunk-KHO5WNTP.js} +1 -1
  61. package/dist/chunk-KHO5WNTP.js.map +1 -0
  62. package/dist/{chunk-MLU7NDAZ.js → chunk-KLZBRNFP.js} +12 -12
  63. package/dist/chunk-KLZBRNFP.js.map +1 -0
  64. package/dist/{chunk-3EP5V2F4.js → chunk-M6OS4OLU.js} +3 -3
  65. package/dist/chunk-M6OS4OLU.js.map +1 -0
  66. package/dist/{chunk-UZZTWWGG.js → chunk-MQPNU2CY.js} +1 -1
  67. package/dist/chunk-MQPNU2CY.js.map +1 -0
  68. package/dist/{chunk-LQ55E7QI.js → chunk-N4STCQGP.js} +7 -7
  69. package/dist/chunk-N4STCQGP.js.map +1 -0
  70. package/dist/{chunk-KFPSJRHR.js → chunk-NBYKLUF6.js} +2 -2
  71. package/dist/chunk-NBYKLUF6.js.map +1 -0
  72. package/dist/{chunk-KM2YXO6V.js → chunk-O7SDRBVB.js} +1 -1
  73. package/dist/chunk-O7SDRBVB.js.map +1 -0
  74. package/dist/{chunk-LFWYYWLV.js → chunk-OP4KBXUO.js} +1 -1
  75. package/dist/chunk-OP4KBXUO.js.map +1 -0
  76. package/dist/{chunk-XN7S44U4.js → chunk-OPXAP3AC.js} +1 -1
  77. package/dist/chunk-OPXAP3AC.js.map +1 -0
  78. package/dist/{chunk-TGZFDXNH.js → chunk-PWCBWAM4.js} +6 -4
  79. package/dist/chunk-PWCBWAM4.js.map +1 -0
  80. package/dist/{chunk-Y3K6KJMS.js → chunk-QSY74NAP.js} +2 -2
  81. package/dist/chunk-QSY74NAP.js.map +1 -0
  82. package/dist/{chunk-ZSOS2KOR.js → chunk-RK6VBLXP.js} +1 -1
  83. package/dist/chunk-RK6VBLXP.js.map +1 -0
  84. package/dist/{chunk-FHYR5Q5T.js → chunk-SFY6YLVK.js} +19 -12
  85. package/dist/chunk-SFY6YLVK.js.map +1 -0
  86. package/dist/{chunk-C747DYNT.js → chunk-UM5S7DKK.js} +1 -1
  87. package/dist/chunk-UM5S7DKK.js.map +1 -0
  88. package/dist/{chunk-ILWHLGIC.js → chunk-UMQ6NBQR.js} +2 -2
  89. package/dist/chunk-UMQ6NBQR.js.map +1 -0
  90. package/dist/{chunk-7PSNXUFK.js → chunk-XD7MY6HB.js} +1 -1
  91. package/dist/chunk-XD7MY6HB.js.map +1 -0
  92. package/dist/{chunk-XVEJAFKW.js → chunk-XY3N2U6L.js} +5 -5
  93. package/dist/chunk-XY3N2U6L.js.map +1 -0
  94. package/dist/{chunk-XZWMJLIT.js → chunk-YT43MUSJ.js} +1 -1
  95. package/dist/chunk-YT43MUSJ.js.map +1 -0
  96. package/dist/{claude-code-QBWDT5RT.js → claude-code-LJ6DVXWQ.js} +24 -14
  97. package/dist/claude-code-LJ6DVXWQ.js.map +1 -0
  98. package/dist/{claude-code-FS42PXZO.js → claude-code-NMRKTAP7.js} +4 -4
  99. package/dist/claude-code-NMRKTAP7.js.map +1 -0
  100. package/dist/cli/sdk.js +7 -7
  101. package/dist/cli/sdk.js.map +1 -1
  102. package/dist/cli.js +1 -1
  103. package/dist/cli.js.map +1 -1
  104. package/dist/{cline-JKEAYWVR.js → cline-JAPJNOZQ.js} +6 -6
  105. package/dist/cline-JAPJNOZQ.js.map +1 -0
  106. package/dist/{codebuddy-EB6EYPC3.js → codebuddy-GC7VAE2Y.js} +7 -7
  107. package/dist/codebuddy-GC7VAE2Y.js.map +1 -0
  108. package/dist/{codebuff-5RSXFU6G.js → codebuff-3VODFPD4.js} +6 -6
  109. package/dist/codebuff-3VODFPD4.js.map +1 -0
  110. package/dist/{codebuff-6KWBW6CT.js → codebuff-ETYT5UBL.js} +4 -4
  111. package/dist/codebuff-ETYT5UBL.js.map +1 -0
  112. package/dist/{codex-ART46CDD.js → codex-RXIS5BHM.js} +9 -9
  113. package/dist/codex-RXIS5BHM.js.map +1 -0
  114. package/dist/{codex-DKBAAUCO.js → codex-YAORPCOD.js} +4 -4
  115. package/dist/codex-YAORPCOD.js.map +1 -0
  116. package/dist/{continue-JHZCMSPH.js → continue-MECVDV4Z.js} +8 -8
  117. package/dist/continue-MECVDV4Z.js.map +1 -0
  118. package/dist/{copilot-cli-CLBJACQ5.js → copilot-cli-MZTAWMPW.js} +4 -4
  119. package/dist/copilot-cli-MZTAWMPW.js.map +1 -0
  120. package/dist/{copilot-cli-QVAU5CFM.js → copilot-cli-WVWAWNSM.js} +7 -7
  121. package/dist/copilot-cli-WVWAWNSM.js.map +1 -0
  122. package/dist/{crush-A5C5USRL.js → crush-QBXLNN7T.js} +4 -4
  123. package/dist/crush-QBXLNN7T.js.map +1 -0
  124. package/dist/{crush-7TORBYUL.js → crush-YB3SK6NK.js} +7 -7
  125. package/dist/crush-YB3SK6NK.js.map +1 -0
  126. package/dist/{cursor-D5SWDVSW.js → cursor-DIW43TRZ.js} +3 -3
  127. package/dist/cursor-DIW43TRZ.js.map +1 -0
  128. package/dist/cursor-RSLHA2CY.js +22 -0
  129. package/dist/{define-connector-DTWb46UB.d.ts → define-connector-odRHEC4H.d.ts} +1 -1
  130. package/dist/{detect-JHSA3G3U.js → detect-ALP4G7WG.js} +4 -4
  131. package/dist/detect-ALP4G7WG.js.map +1 -0
  132. package/dist/{devin-SSR7S4WX.js → devin-WPDN3MXE.js} +7 -7
  133. package/dist/devin-WPDN3MXE.js.map +1 -0
  134. package/dist/{doctor-CQJ7TZPA.js → doctor-YEQWCWZJ.js} +27 -26
  135. package/dist/doctor-YEQWCWZJ.js.map +1 -0
  136. package/dist/{droid-45PJ7JGF.js → droid-HS6MX3IL.js} +10 -8
  137. package/dist/droid-HS6MX3IL.js.map +1 -0
  138. package/dist/{droid-PFQ2PZSF.js → droid-U3ZBLQFO.js} +4 -4
  139. package/dist/droid-U3ZBLQFO.js.map +1 -0
  140. package/dist/{gemini-cli-Y6RJMU24.js → gemini-cli-NMVVBO3K.js} +4 -4
  141. package/dist/gemini-cli-NMVVBO3K.js.map +1 -0
  142. package/dist/{gemini-cli-24PFDK7D.js → gemini-cli-VJ6X5DNF.js} +8 -8
  143. package/dist/gemini-cli-VJ6X5DNF.js.map +1 -0
  144. package/dist/{goose-U5D3LCPC.js → goose-3X7ID7YW.js} +9 -9
  145. package/dist/goose-3X7ID7YW.js.map +1 -0
  146. package/dist/{goose-K2HKUTBK.js → goose-64V46Y2W.js} +4 -4
  147. package/dist/goose-64V46Y2W.js.map +1 -0
  148. package/dist/{grok-cli-L2MHAPBY.js → grok-cli-4VFVF2CQ.js} +7 -7
  149. package/dist/grok-cli-4VFVF2CQ.js.map +1 -0
  150. package/dist/{hermes-2S5JUTTJ.js → hermes-AIVUE7LX.js} +10 -8
  151. package/dist/hermes-AIVUE7LX.js.map +1 -0
  152. package/dist/{hermes-MF3NX4ZY.js → hermes-F3EGTK6N.js} +4 -4
  153. package/dist/hermes-F3EGTK6N.js.map +1 -0
  154. package/dist/{hook-VHICXHXL.js → hook-F63I3SD5.js} +17 -16
  155. package/dist/hook-F63I3SD5.js.map +1 -0
  156. package/dist/index.d.ts +3 -3
  157. package/dist/index.js +5 -5
  158. package/dist/{install-WLENR4KF.js → install-23WRRFBY.js} +21 -21
  159. package/dist/install-23WRRFBY.js.map +1 -0
  160. package/dist/{introspect-dNekqPDY.d.ts → introspect-gTx6GzpW.d.ts} +1 -1
  161. package/dist/{jetbrains-copilot-Z4FC3RM3.js → jetbrains-copilot-XBO2JZRO.js} +6 -6
  162. package/dist/jetbrains-copilot-XBO2JZRO.js.map +1 -0
  163. package/dist/{junie-ULGJJIHB.js → junie-UCOS6Q37.js} +6 -6
  164. package/dist/junie-UCOS6Q37.js.map +1 -0
  165. package/dist/{kilo-SMHPOHJ5.js → kilo-SW7BH6EG.js} +4 -4
  166. package/dist/kilo-SW7BH6EG.js.map +1 -0
  167. package/dist/{kilo-WWIJOVWD.js → kilo-T4OXNUYY.js} +8 -8
  168. package/dist/kilo-T4OXNUYY.js.map +1 -0
  169. package/dist/{kilo-cli-QKE2EQLS.js → kilo-cli-I2S3W245.js} +8 -8
  170. package/dist/kilo-cli-I2S3W245.js.map +1 -0
  171. package/dist/{kilo-cli-T2SRRRJS.js → kilo-cli-ZF272ZHN.js} +5 -5
  172. package/dist/kilo-cli-ZF272ZHN.js.map +1 -0
  173. package/dist/{kimi-MSIDEMCI.js → kimi-5FHEXGZD.js} +4 -4
  174. package/dist/kimi-5FHEXGZD.js.map +1 -0
  175. package/dist/{kimi-JMUFTVSF.js → kimi-VLSUFLYV.js} +7 -7
  176. package/dist/kimi-VLSUFLYV.js.map +1 -0
  177. package/dist/{kiro-UWUCRKR3.js → kiro-AQFXGOJX.js} +10 -8
  178. package/dist/kiro-AQFXGOJX.js.map +1 -0
  179. package/dist/{kiro-NYRRBIKW.js → kiro-WGOI5CGT.js} +4 -4
  180. package/dist/kiro-WGOI5CGT.js.map +1 -0
  181. package/dist/{leaderboard-NJWKGMXP.js → leaderboard-YBD3IKC2.js} +7 -7
  182. package/dist/leaderboard-YBD3IKC2.js.map +1 -0
  183. package/dist/{mimo-code-BPNYYIVM.js → mimo-code-KETL7W7D.js} +7 -7
  184. package/dist/mimo-code-KETL7W7D.js.map +1 -0
  185. package/dist/{mistral-vibe-LT3DAJ3L.js → mistral-vibe-3AU7N2CA.js} +6 -6
  186. package/dist/mistral-vibe-3AU7N2CA.js.map +1 -0
  187. package/dist/{mux-AHNUAY5Z.js → mux-BO2L5CTW.js} +6 -6
  188. package/dist/mux-BO2L5CTW.js.map +1 -0
  189. package/dist/{mux-7PIJ7HUQ.js → mux-XM6AP35L.js} +4 -4
  190. package/dist/mux-XM6AP35L.js.map +1 -0
  191. package/dist/{nemoclaw-RE5RZASZ.js → nemoclaw-WA7RSKF2.js} +7 -7
  192. package/dist/nemoclaw-WA7RSKF2.js.map +1 -0
  193. package/dist/{omp-D2EXEPH7.js → omp-UDYJ2PYY.js} +9 -7
  194. package/dist/omp-UDYJ2PYY.js.map +1 -0
  195. package/dist/{open-interpreter-SSGBEUKX.js → open-interpreter-WMBNM4MQ.js} +6 -6
  196. package/dist/open-interpreter-WMBNM4MQ.js.map +1 -0
  197. package/dist/openclaw-3DHVHX5P.js +17 -0
  198. package/dist/{openclaw-KAFTNLR2.js → openclaw-5EQFGOWL.js} +4 -4
  199. package/dist/openclaw-5EQFGOWL.js.map +1 -0
  200. package/dist/{opencode-YKUKZY3J.js → opencode-IKMI3RI7.js} +7 -7
  201. package/dist/opencode-IKMI3RI7.js.map +1 -0
  202. package/dist/{opencode-Z65JYILL.js → opencode-QGP4ALQY.js} +4 -4
  203. package/dist/opencode-QGP4ALQY.js.map +1 -0
  204. package/dist/{openhands-SEZMCUC3.js → openhands-QGXMQR6I.js} +7 -7
  205. package/dist/openhands-QGXMQR6I.js.map +1 -0
  206. package/dist/{package-JECVQEFT.js → package-TAUTPP7Z.js} +15 -15
  207. package/dist/package-TAUTPP7Z.js.map +1 -0
  208. package/dist/{pi-YPYV2ULH.js → pi-A2HCGRJG.js} +9 -7
  209. package/dist/pi-A2HCGRJG.js.map +1 -0
  210. package/dist/{pi-DLKCPOJE.js → pi-GGDQREVG.js} +4 -4
  211. package/dist/pi-GGDQREVG.js.map +1 -0
  212. package/dist/{qwen-code-ZHCLCYMC.js → qwen-code-DNQTGJOF.js} +35 -17
  213. package/dist/qwen-code-DNQTGJOF.js.map +1 -0
  214. package/dist/{qwen-code-26CSFDX6.js → qwen-code-GQILBJ5B.js} +4 -4
  215. package/dist/qwen-code-GQILBJ5B.js.map +1 -0
  216. package/dist/{roo-code-HSAE2CJU.js → roo-code-SUWI4BBN.js} +4 -4
  217. package/dist/roo-code-SUWI4BBN.js.map +1 -0
  218. package/dist/{roo-code-7F4HYB34.js → roo-code-VI2ZKTZC.js} +6 -6
  219. package/dist/roo-code-VI2ZKTZC.js.map +1 -0
  220. package/dist/runtime/index.d.ts +9 -8
  221. package/dist/runtime/index.js +15 -14
  222. package/dist/sdk/index.d.ts +4 -4
  223. package/dist/sdk/index.js +6 -6
  224. package/dist/sdk/index.js.map +1 -1
  225. package/dist/sdk/test.d.ts +2 -2
  226. package/dist/sdk/test.js +12 -11
  227. package/dist/{serve-LYSBH43G.js → serve-6MDLRQS2.js} +17 -16
  228. package/dist/serve-6MDLRQS2.js.map +1 -0
  229. package/dist/{status-PHKKGEW5.js → status-IUP75XHP.js} +11 -11
  230. package/dist/status-IUP75XHP.js.map +1 -0
  231. package/dist/{statusline-ZDD4OZ4F.js → statusline-PRODZV2J.js} +16 -15
  232. package/dist/statusline-PRODZV2J.js.map +1 -0
  233. package/dist/{synthetic-LUT6V6SD.js → synthetic-6FRA7P5Q.js} +4 -4
  234. package/dist/synthetic-6FRA7P5Q.js.map +1 -0
  235. package/dist/{telemetry-HDGMI2BK.js → telemetry-X4PLZEDB.js} +10 -10
  236. package/dist/telemetry-X4PLZEDB.js.map +1 -0
  237. package/dist/{trae-SIQI3C66.js → trae-CPPYASR2.js} +4 -4
  238. package/dist/trae-CPPYASR2.js.map +1 -0
  239. package/dist/{trae-Y67HSDOW.js → trae-VOJXUYRN.js} +6 -6
  240. package/dist/trae-VOJXUYRN.js.map +1 -0
  241. package/dist/{types-JyhpJHJa.d.ts → types-DWXnnx-N.d.ts} +96 -22
  242. package/dist/{uninstall-RWO2GM2I.js → uninstall-BSIJ4QXN.js} +21 -21
  243. package/dist/uninstall-BSIJ4QXN.js.map +1 -0
  244. package/dist/{upgrade-YJCXNUEE.js → upgrade-ZSICU3NE.js} +21 -21
  245. package/dist/upgrade-ZSICU3NE.js.map +1 -0
  246. package/dist/{usage-IWO4RQN6.js → usage-EQUNVSCT.js} +4 -4
  247. package/dist/usage-EQUNVSCT.js.map +1 -0
  248. package/dist/{usage-event-AFFKCLHE.js → usage-event-J5CQ6LNT.js} +16 -15
  249. package/dist/usage-event-J5CQ6LNT.js.map +1 -0
  250. package/dist/{vscode-copilot-5CI5B3X6.js → vscode-copilot-ZBXRPKGG.js} +7 -7
  251. package/dist/vscode-copilot-ZBXRPKGG.js.map +1 -0
  252. package/dist/{warp-5YBSP7FP.js → warp-NRBBJQR2.js} +4 -4
  253. package/dist/warp-NRBBJQR2.js.map +1 -0
  254. package/dist/{warp-INAKVGBV.js → warp-S444B2S3.js} +9 -7
  255. package/dist/warp-S444B2S3.js.map +1 -0
  256. package/dist/{windsurf-4HM57QAY.js → windsurf-R6D2JUTN.js} +6 -6
  257. package/dist/windsurf-R6D2JUTN.js.map +1 -0
  258. package/dist/{zed-YN5X37PQ.js → zed-DQV3ZUCU.js} +10 -8
  259. package/dist/zed-DQV3ZUCU.js.map +1 -0
  260. package/dist/{zed-XXCNYOIN.js → zed-XJFOOKCO.js} +4 -4
  261. package/dist/zed-XJFOOKCO.js.map +1 -0
  262. package/package.json +88 -88
  263. package/dist/action-IPFDPOZU.js.map +0 -1
  264. package/dist/amazon-q-IT44LEWV.js.map +0 -1
  265. package/dist/amp-CEWOSWQO.js.map +0 -1
  266. package/dist/amp-P35FRU2Z.js.map +0 -1
  267. package/dist/antigravity-LHFEFNMC.js.map +0 -1
  268. package/dist/antigravity-TWIWXTQH.js +0 -18
  269. package/dist/antigravity-cli-MOKFSWOU.js.map +0 -1
  270. package/dist/antigravity-cli-MPE27LPI.js.map +0 -1
  271. package/dist/chunk-3EP5V2F4.js.map +0 -1
  272. package/dist/chunk-3FINQ2ZF.js.map +0 -1
  273. package/dist/chunk-4GH2KA7V.js.map +0 -1
  274. package/dist/chunk-7C2IPIIB.js.map +0 -1
  275. package/dist/chunk-7HHW23AC.js.map +0 -1
  276. package/dist/chunk-7PSNXUFK.js.map +0 -1
  277. package/dist/chunk-7ZFK2WEO.js.map +0 -1
  278. package/dist/chunk-C63AAXK7.js.map +0 -1
  279. package/dist/chunk-C747DYNT.js.map +0 -1
  280. package/dist/chunk-FHYR5Q5T.js.map +0 -1
  281. package/dist/chunk-GCPEPUD7.js.map +0 -1
  282. package/dist/chunk-GZZCHJDP.js.map +0 -1
  283. package/dist/chunk-ILWHLGIC.js.map +0 -1
  284. package/dist/chunk-IOJDZJ72.js.map +0 -1
  285. package/dist/chunk-KFPSJRHR.js.map +0 -1
  286. package/dist/chunk-KM2YXO6V.js.map +0 -1
  287. package/dist/chunk-L2C5UMKW.js.map +0 -1
  288. package/dist/chunk-LFWYYWLV.js.map +0 -1
  289. package/dist/chunk-LQ55E7QI.js.map +0 -1
  290. package/dist/chunk-MLU7NDAZ.js.map +0 -1
  291. package/dist/chunk-N4ENLZEU.js.map +0 -1
  292. package/dist/chunk-NDMNMAKP.js.map +0 -1
  293. package/dist/chunk-PSGTHJQU.js.map +0 -1
  294. package/dist/chunk-Q4ISQHUQ.js.map +0 -1
  295. package/dist/chunk-Q7PR2WGT.js.map +0 -1
  296. package/dist/chunk-QYOUQCC6.js.map +0 -1
  297. package/dist/chunk-SLJI5BOM.js.map +0 -1
  298. package/dist/chunk-TGZFDXNH.js.map +0 -1
  299. package/dist/chunk-THI4PI4H.js.map +0 -1
  300. package/dist/chunk-UZZTWWGG.js.map +0 -1
  301. package/dist/chunk-WPTNMYYM.js.map +0 -1
  302. package/dist/chunk-XN7S44U4.js.map +0 -1
  303. package/dist/chunk-XVEJAFKW.js.map +0 -1
  304. package/dist/chunk-XXLCMSD3.js.map +0 -1
  305. package/dist/chunk-XZWMJLIT.js.map +0 -1
  306. package/dist/chunk-Y3K6KJMS.js.map +0 -1
  307. package/dist/chunk-ZSOS2KOR.js.map +0 -1
  308. package/dist/claude-code-FS42PXZO.js.map +0 -1
  309. package/dist/claude-code-QBWDT5RT.js.map +0 -1
  310. package/dist/cline-JKEAYWVR.js.map +0 -1
  311. package/dist/codebuddy-EB6EYPC3.js.map +0 -1
  312. package/dist/codebuff-5RSXFU6G.js.map +0 -1
  313. package/dist/codebuff-6KWBW6CT.js.map +0 -1
  314. package/dist/codex-ART46CDD.js.map +0 -1
  315. package/dist/codex-DKBAAUCO.js.map +0 -1
  316. package/dist/continue-JHZCMSPH.js.map +0 -1
  317. package/dist/copilot-cli-CLBJACQ5.js.map +0 -1
  318. package/dist/copilot-cli-QVAU5CFM.js.map +0 -1
  319. package/dist/crush-7TORBYUL.js.map +0 -1
  320. package/dist/crush-A5C5USRL.js.map +0 -1
  321. package/dist/cursor-D5SWDVSW.js.map +0 -1
  322. package/dist/cursor-W7I4QUFO.js +0 -22
  323. package/dist/detect-JHSA3G3U.js.map +0 -1
  324. package/dist/devin-SSR7S4WX.js.map +0 -1
  325. package/dist/doctor-CQJ7TZPA.js.map +0 -1
  326. package/dist/droid-45PJ7JGF.js.map +0 -1
  327. package/dist/droid-PFQ2PZSF.js.map +0 -1
  328. package/dist/gemini-cli-24PFDK7D.js.map +0 -1
  329. package/dist/gemini-cli-Y6RJMU24.js.map +0 -1
  330. package/dist/goose-K2HKUTBK.js.map +0 -1
  331. package/dist/goose-U5D3LCPC.js.map +0 -1
  332. package/dist/grok-cli-L2MHAPBY.js.map +0 -1
  333. package/dist/hermes-2S5JUTTJ.js.map +0 -1
  334. package/dist/hermes-MF3NX4ZY.js.map +0 -1
  335. package/dist/hook-VHICXHXL.js.map +0 -1
  336. package/dist/install-WLENR4KF.js.map +0 -1
  337. package/dist/jetbrains-copilot-Z4FC3RM3.js.map +0 -1
  338. package/dist/junie-ULGJJIHB.js.map +0 -1
  339. package/dist/kilo-SMHPOHJ5.js.map +0 -1
  340. package/dist/kilo-WWIJOVWD.js.map +0 -1
  341. package/dist/kilo-cli-QKE2EQLS.js.map +0 -1
  342. package/dist/kilo-cli-T2SRRRJS.js.map +0 -1
  343. package/dist/kimi-JMUFTVSF.js.map +0 -1
  344. package/dist/kimi-MSIDEMCI.js.map +0 -1
  345. package/dist/kiro-NYRRBIKW.js.map +0 -1
  346. package/dist/kiro-UWUCRKR3.js.map +0 -1
  347. package/dist/leaderboard-NJWKGMXP.js.map +0 -1
  348. package/dist/mimo-code-BPNYYIVM.js.map +0 -1
  349. package/dist/mistral-vibe-LT3DAJ3L.js.map +0 -1
  350. package/dist/mux-7PIJ7HUQ.js.map +0 -1
  351. package/dist/mux-AHNUAY5Z.js.map +0 -1
  352. package/dist/nemoclaw-RE5RZASZ.js.map +0 -1
  353. package/dist/omp-D2EXEPH7.js.map +0 -1
  354. package/dist/open-interpreter-SSGBEUKX.js.map +0 -1
  355. package/dist/openclaw-IJ33K45M.js +0 -17
  356. package/dist/openclaw-KAFTNLR2.js.map +0 -1
  357. package/dist/opencode-YKUKZY3J.js.map +0 -1
  358. package/dist/opencode-Z65JYILL.js.map +0 -1
  359. package/dist/openhands-SEZMCUC3.js.map +0 -1
  360. package/dist/package-JECVQEFT.js.map +0 -1
  361. package/dist/pi-DLKCPOJE.js.map +0 -1
  362. package/dist/pi-YPYV2ULH.js.map +0 -1
  363. package/dist/qwen-code-26CSFDX6.js.map +0 -1
  364. package/dist/qwen-code-ZHCLCYMC.js.map +0 -1
  365. package/dist/roo-code-7F4HYB34.js.map +0 -1
  366. package/dist/roo-code-HSAE2CJU.js.map +0 -1
  367. package/dist/serve-LYSBH43G.js.map +0 -1
  368. package/dist/status-PHKKGEW5.js.map +0 -1
  369. package/dist/statusline-ZDD4OZ4F.js.map +0 -1
  370. package/dist/synthetic-LUT6V6SD.js.map +0 -1
  371. package/dist/telemetry-HDGMI2BK.js.map +0 -1
  372. package/dist/trae-SIQI3C66.js.map +0 -1
  373. package/dist/trae-Y67HSDOW.js.map +0 -1
  374. package/dist/uninstall-RWO2GM2I.js.map +0 -1
  375. package/dist/upgrade-YJCXNUEE.js.map +0 -1
  376. package/dist/usage-IWO4RQN6.js.map +0 -1
  377. package/dist/usage-event-AFFKCLHE.js.map +0 -1
  378. package/dist/vscode-copilot-5CI5B3X6.js.map +0 -1
  379. package/dist/warp-5YBSP7FP.js.map +0 -1
  380. package/dist/warp-INAKVGBV.js.map +0 -1
  381. package/dist/windsurf-4HM57QAY.js.map +0 -1
  382. package/dist/zed-XXCNYOIN.js.map +0 -1
  383. package/dist/zed-YN5X37PQ.js.map +0 -1
  384. /package/dist/{antigravity-TWIWXTQH.js.map → antigravity-VXHL6ZPM.js.map} +0 -0
  385. /package/dist/{audit-3E5JAOP2.js.map → audit-BO7JQYIH.js.map} +0 -0
  386. /package/dist/{cursor-W7I4QUFO.js.map → cursor-RSLHA2CY.js.map} +0 -0
  387. /package/dist/{openclaw-IJ33K45M.js.map → openclaw-3DHVHX5P.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/package-metadata.ts","../src/core/define-connector.ts","../src/core/mcp-standard.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\r\nimport { existsSync, readFileSync } from \"node:fs\";\r\nimport { dirname, join, resolve } from \"node:path\";\r\n\r\nimport type {\r\n McpPackageIdentity,\r\n ResolvedMcpPackageIdentity,\r\n ServerDef,\r\n} from \"./types.js\";\r\n\r\nconst GENERIC_PACKAGE_BASENAMES = new Set([\r\n \"mcp\",\r\n \"server\",\r\n \"mcp-server\",\r\n \"connector\",\r\n \"tool\",\r\n \"tools\",\r\n \"cli\",\r\n]);\r\n\r\nexport interface ConnectorPackageMetadata {\r\n /** Package-derived MCP identity used to derive host aliases and install ids. */\r\n mcp?: McpPackageIdentity;\r\n /** package.json version used as the connector version default. */\r\n version?: string;\r\n}\r\n\r\nconst PACKAGE_METADATA_CONTEXT = new AsyncLocalStorage<ConnectorPackageMetadata>();\r\n\r\nfunction kebab(raw: string): string {\r\n return raw\r\n .trim()\r\n .replace(/^@/, \"\")\r\n .replace(/[\\\\/_.\\s]+/g, \"-\")\r\n .replace(/[^a-zA-Z0-9-]+/g, \"-\")\r\n .replace(/-{2,}/g, \"-\")\r\n .replace(/^-+|-+$/g, \"\")\r\n .toLowerCase();\r\n}\r\n\r\nfunction scopedPackageParts(packageName: string): {\r\n scope?: string;\r\n basename: string;\r\n} {\r\n const raw = packageName.trim();\r\n if (raw.startsWith(\"@\")) {\r\n const [scope, basename] = raw.slice(1).split(\"/\");\r\n return { scope: scope ? kebab(scope) : undefined, basename: basename ?? \"\" };\r\n }\r\n return { basename: raw };\r\n}\r\n\r\nfunction cleanMcpBasename(raw: string): string {\r\n let name = kebab(raw);\r\n name = name.replace(/^mcp-server-/, \"\");\r\n name = name.replace(/^server-/, \"\");\r\n name = name.replace(/-mcp-server$/, \"\");\r\n name = name.replace(/-mcp$/, \"\");\r\n name = name.replace(/-server$/, \"\");\r\n return kebab(name);\r\n}\r\n\r\nfunction isGeneric(name: string | undefined): boolean {\r\n return !name || GENERIC_PACKAGE_BASENAMES.has(name);\r\n}\r\n\r\nfunction cleanString(value: unknown): string | undefined {\r\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\r\n}\r\n\r\nfunction objectKeys(value: unknown): string[] {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return [];\r\n return Object.keys(value).filter((key) => key.trim());\r\n}\r\n\r\nfunction packageBinName(bin: unknown, packageName: string | undefined): string | undefined {\r\n if (typeof bin === \"string\") {\r\n return packageName ? deriveHostAliasFromPackageName(packageName) : undefined;\r\n }\r\n\r\n const keys = objectKeys(bin);\r\n if (keys.length === 0) return undefined;\r\n if (keys.length === 1) return keys[0];\r\n\r\n const packageAlias = packageName ? deriveHostAliasFromPackageName(packageName) : undefined;\r\n if (packageAlias && keys.includes(packageAlias)) return packageAlias;\r\n\r\n const unscoped = packageName?.startsWith(\"@\") ? packageName.split(\"/\")[1] : packageName;\r\n const cleanUnscoped = unscoped ? cleanMcpBasename(unscoped) : undefined;\r\n if (cleanUnscoped && keys.includes(cleanUnscoped)) return cleanUnscoped;\r\n\r\n return undefined;\r\n}\r\n\r\nexport function currentMcpPackageIdentity(): McpPackageIdentity | undefined {\r\n return currentConnectorPackageMetadata()?.mcp;\r\n}\r\n\r\nexport function currentConnectorPackageMetadata():\r\n | ConnectorPackageMetadata\r\n | undefined {\r\n return PACKAGE_METADATA_CONTEXT.getStore();\r\n}\r\n\r\nexport async function withConnectorPackageMetadata<T>(\r\n metadata: ConnectorPackageMetadata | undefined,\r\n run: () => Promise<T>,\r\n): Promise<T> {\r\n if (!metadata || Object.keys(metadata).length === 0) return run();\r\n return PACKAGE_METADATA_CONTEXT.run(metadata, run);\r\n}\r\n\r\nexport async function withMcpPackageIdentity<T>(\r\n identity: McpPackageIdentity | undefined,\r\n run: () => Promise<T>,\r\n): Promise<T> {\r\n if (!identity || Object.keys(identity).length === 0) return run();\r\n return withConnectorPackageMetadata({ mcp: identity }, run);\r\n}\r\n\r\nexport function findNearestPackageJson(startDir: string): string | undefined {\r\n let dir = resolve(startDir);\r\n for (;;) {\r\n const candidate = join(dir, \"package.json\");\r\n if (existsSync(candidate)) return candidate;\r\n\r\n const parent = dirname(dir);\r\n if (parent === dir) return undefined;\r\n dir = parent;\r\n }\r\n}\r\n\r\nexport function readMcpPackageIdentityFromPackageJson(\r\n packageJsonPath: string,\r\n): McpPackageIdentity {\r\n return readConnectorPackageMetadataFromPackageJson(packageJsonPath).mcp ?? {};\r\n}\r\n\r\nexport function readConnectorPackageMetadataFromPackageJson(\r\n packageJsonPath: string,\r\n): ConnectorPackageMetadata {\r\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\r\n name?: unknown;\r\n version?: unknown;\r\n mcpName?: unknown;\r\n mcp?: unknown;\r\n bin?: unknown;\r\n };\r\n const packageName = cleanString(parsed.name);\r\n const version = cleanString(parsed.version);\r\n const mcp =\r\n parsed.mcp && typeof parsed.mcp === \"object\" && !Array.isArray(parsed.mcp)\r\n ? (parsed.mcp as { name?: unknown; mcpName?: unknown })\r\n : undefined;\r\n const mcpName =\r\n cleanString(parsed.mcpName) ??\r\n cleanString(mcp?.mcpName) ??\r\n cleanString(mcp?.name);\r\n const bin = packageBinName(parsed.bin, packageName);\r\n\r\n const identity: McpPackageIdentity = {\r\n ...(packageName ? { packageName } : {}),\r\n ...(mcpName ? { mcpName } : {}),\r\n ...(bin ? { bin } : {}),\r\n };\r\n\r\n return {\r\n ...(Object.keys(identity).length > 0 ? { mcp: identity } : {}),\r\n ...(version ? { version } : {}),\r\n };\r\n}\r\n\r\nexport function readMcpPackageIdentityNearFile(\r\n filePath: string,\r\n): McpPackageIdentity | undefined {\r\n return readConnectorPackageMetadataNearFile(filePath)?.mcp;\r\n}\r\n\r\nexport function readConnectorPackageMetadataNearFile(\r\n filePath: string,\r\n): ConnectorPackageMetadata | undefined {\r\n const packageJsonPath = findNearestPackageJson(dirname(filePath));\r\n if (!packageJsonPath) return undefined;\r\n try {\r\n const metadata = readConnectorPackageMetadataFromPackageJson(packageJsonPath);\r\n return Object.keys(metadata).length > 0 ? metadata : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/** Derive the host-facing MCP server key from a package name. */\r\nexport function deriveHostAliasFromPackageName(\r\n packageName: string,\r\n): string | undefined {\r\n const { scope, basename } = scopedPackageParts(packageName);\r\n const fromBasename = cleanMcpBasename(basename);\r\n if (!isGeneric(fromBasename)) return fromBasename;\r\n const fromScope = scope ? cleanMcpBasename(scope) : undefined;\r\n return isGeneric(fromScope) ? undefined : fromScope;\r\n}\r\n\r\n/** Derive the host-facing MCP server key from an MCP registry name. */\r\nexport function deriveHostAliasFromMcpName(\r\n mcpName: string,\r\n): string | undefined {\r\n const [namespace, name] = mcpName.trim().split(\"/\");\r\n const fromName = cleanMcpBasename(name ?? namespace ?? \"\");\r\n if (!isGeneric(fromName)) return fromName;\r\n\r\n const namespaceParts = (namespace ?? \"\").split(\".\").filter(Boolean);\r\n const fromNamespace = cleanMcpBasename(namespaceParts.at(-1) ?? \"\");\r\n return isGeneric(fromNamespace) ? undefined : fromNamespace;\r\n}\r\n\r\n/** Infer an npm package from common npx-style stdio server definitions. */\r\nexport function inferNpmPackageFromServer(\r\n server: ServerDef | undefined,\r\n): string | undefined {\r\n if (!server || server.transport !== \"stdio\") return undefined;\r\n if (typeof server.command !== \"string\" || server.command.trim() === \"\") {\r\n return undefined;\r\n }\r\n const runner = kebab(server.command.split(/[\\\\/]/).pop() ?? server.command);\r\n if (![\"npx\", \"npm\", \"pnpm\", \"yarn\", \"bun\"].includes(runner)) return undefined;\r\n\r\n const args = server.args ?? [];\r\n for (let i = 0; i < args.length; i += 1) {\r\n const arg = args[i]!;\r\n if (arg === \"--\") continue;\r\n if (arg === \"exec\" || arg === \"dlx\" || arg === \"x\") continue;\r\n if (arg === \"-y\" || arg === \"--yes\" || arg === \"--no-install\") continue;\r\n if (arg === \"--package\" || arg === \"-p\") {\r\n i += 1;\r\n continue;\r\n }\r\n if (arg.startsWith(\"-\")) continue;\r\n return arg;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function resolveMcpPackageIdentity(input: {\r\n id?: string;\r\n mcp?: McpPackageIdentity;\r\n server?: ServerDef;\r\n}): ResolvedMcpPackageIdentity {\r\n const packageName =\r\n input.mcp?.packageName ?? inferNpmPackageFromServer(input.server);\r\n const hostAlias =\r\n input.mcp?.hostAlias ??\r\n (input.mcp?.mcpName\r\n ? deriveHostAliasFromMcpName(input.mcp.mcpName)\r\n : undefined) ??\r\n (packageName ? deriveHostAliasFromPackageName(packageName) : undefined) ??\r\n (input.mcp?.bin ? cleanMcpBasename(input.mcp.bin) : undefined);\r\n\r\n return {\r\n ...(packageName ? { packageName } : {}),\r\n ...(input.mcp?.mcpName ? { mcpName: input.mcp.mcpName } : {}),\r\n ...(input.mcp?.bin ? { bin: input.mcp.bin } : {}),\r\n ...(hostAlias ? { hostAlias } : {}),\r\n };\r\n}\r\n","/**\r\n * core/define-connector — the public write-once entry point.\r\n *\r\n * Validates a ConnectorConfig and normalizes it into a ResolvedConnector with\r\n * every optional field resolved to a default. Validation is intentionally\r\n * dependency-free (no zod) to keep the single-binary install lean.\r\n */\r\n\r\nimport { isAbsolute, normalize } from \"node:path\";\r\n\r\nimport type {\r\n ActionDef,\r\n CommandDef,\r\n ConfigPatchDef,\r\n ConnectorConfig,\r\n HookDefinition,\r\n HookEventName,\r\n HooksConfig,\r\n MemoryDef,\r\n NativeHookDef,\r\n PlatformId,\r\n PublishConfig,\r\n ResolvedConnector,\r\n SkillDef,\r\n StatuslineDef,\r\n SubagentDef,\r\n} from \"./types.js\";\r\nimport { REGISTERED_PLATFORM_IDS } from \"../adapters/registry.js\";\r\nimport { REGISTRY_NAMESPACE_RE } from \"./mcp-standard.js\";\r\nimport { CONNECTOR_ID_RE, isValidConnectorId } from \"./ids.js\";\r\nimport {\r\n currentConnectorPackageMetadata,\r\n resolveMcpPackageIdentity,\r\n} from \"./package-metadata.js\";\r\nimport {\r\n MANAGED_BLOCK_BEGIN_TOKEN,\r\n MANAGED_BLOCK_END_TOKEN,\r\n MEMORY_CONTENT_HARD_CAP_BYTES,\r\n} from \"./managed-block.js\";\r\nimport {\r\n CONFIG_PATCH_SEGMENT_RE,\r\n configPatchNamespaceViolation,\r\n isJsonValue,\r\n isValidConfigPatchKey,\r\n} from \"./config-patch-ledger.js\";\r\n\r\n/** kebab-case name regex shared by command/skill/subagent names. */\r\nconst SURFACE_NAME_RE = /^[a-z0-9][a-z0-9-]*$/;\r\n\r\n/** Max length of a skill description (Agent Skills open standard). */\r\nconst SKILL_DESCRIPTION_MAX = 1024;\r\n\r\n// NOTE: canonical ordering — append new events at the END (hookEvents ordering\r\n// is pinned by tests and feeds install-file ordering). Exported so the\r\n// hook-dispatch gate + Claude-bundle event sets can be drift-tested against it.\r\nexport const ALL_EVENTS: HookEventName[] = [\r\n \"SessionStart\",\r\n \"SessionEnd\",\r\n \"UserPromptSubmit\",\r\n \"PreToolUse\",\r\n \"PostToolUse\",\r\n \"PreCompact\",\r\n \"Stop\",\r\n \"Notification\",\r\n \"PermissionRequest\",\r\n \"PostToolUseFailure\",\r\n \"SubagentStart\",\r\n \"SubagentStop\",\r\n \"PostCompact\",\r\n];\r\n\r\n/** Thrown on an invalid connector configuration. */\r\nexport class ConnectorConfigError extends Error {\r\n constructor(message: string) {\r\n super(`Invalid connector config: ${message}`);\r\n this.name = \"ConnectorConfigError\";\r\n }\r\n}\r\n\r\nfunction declaredEvents(hooks: HooksConfig | undefined): HookEventName[] {\r\n if (!hooks) return [];\r\n return ALL_EVENTS.filter((e) => typeof hooks[e]?.handler === \"function\");\r\n}\r\n\r\n/**\r\n * Validate + normalize a connector definition.\r\n * Returns a ResolvedConnector that adapters and the CLI consume directly.\r\n */\r\nexport function defineConnector(config: ConnectorConfig): ResolvedConnector {\r\n if (!config || typeof config !== \"object\") {\r\n throw new ConnectorConfigError(\"config must be an object\");\r\n }\r\n\r\n const packageMetadata = currentConnectorPackageMetadata();\r\n const packageIdentity = packageMetadata?.mcp;\r\n if (packageIdentity && Object.keys(packageIdentity).length > 0) {\r\n config = {\r\n ...config,\r\n mcp: {\r\n ...packageIdentity,\r\n ...config.mcp,\r\n },\r\n };\r\n }\r\n\r\n const mcpIdentity = resolveMcpPackageIdentity(config);\r\n const connectorId = config.id ?? mcpIdentity.hostAlias;\r\n if (!isValidConnectorId(connectorId)) {\r\n throw new ConnectorConfigError(\r\n `id must be kebab-case matching ${CONNECTOR_ID_RE} or derivable from mcp/package metadata (got ${JSON.stringify(config.id)})`,\r\n );\r\n }\r\n const hasCommands = Array.isArray(config.commands) && config.commands.length > 0;\r\n const hasSkills = Array.isArray(config.skills) && config.skills.length > 0;\r\n const hasSubagents = Array.isArray(config.subagents) && config.subagents.length > 0;\r\n const hasMemory = Array.isArray(config.memory) && config.memory.length > 0;\r\n // A statusline (a HUD) is a legitimate sole payload — a connector whose whole\r\n // job is rendering a status line. SINGULAR (one per connector), so a plain\r\n // presence check (object with a render handler — validated in normalizeStatusline).\r\n const hasStatusline = config.statusline != null;\r\n // Actions (each a user-invokable run handler) are a legitimate sole payload —\r\n // a connector whose whole job is shipping dispatchable actions.\r\n const hasActions = Array.isArray(config.actions) && config.actions.length > 0;\r\n // A platform-scoped nativeHooks declaration is a legitimate sole payload\r\n // (a hooks-only connector wired entirely through native passthrough events).\r\n const hasNativeHooks = Object.values(config.platforms ?? {}).some(\r\n (override) =>\r\n override?.nativeHooks != null && Object.keys(override.nativeHooks).length > 0,\r\n );\r\n // Likewise a platform-scoped configPatch declaration (a connector whose whole\r\n // job is asserting a host config key, e.g. an experimental feature flag).\r\n const hasConfigPatch = Object.values(config.platforms ?? {}).some(\r\n (override) => Array.isArray(override?.configPatch) && override.configPatch.length > 0,\r\n );\r\n if (\r\n !config.server &&\r\n !config.hooks &&\r\n !hasCommands &&\r\n !hasSkills &&\r\n !hasSubagents &&\r\n !hasMemory &&\r\n !hasStatusline &&\r\n !hasActions &&\r\n !hasNativeHooks &&\r\n !hasConfigPatch\r\n ) {\r\n throw new ConnectorConfigError(\r\n \"a connector must declare at least one of `server`, `hooks`, `commands`, `skills`, `subagents`, `memory`, `statusline`, `actions`, \" +\r\n \"or a per-platform `nativeHooks` / `configPatch` declaration\",\r\n );\r\n }\r\n\r\n if (config.server) {\r\n const s = config.server;\r\n if (s.transport === \"stdio\") {\r\n if (!s.command || typeof s.command !== \"string\") {\r\n throw new ConnectorConfigError(\r\n \"server.command is required for stdio transport\",\r\n );\r\n }\r\n } else {\r\n if (!s.url || typeof s.url !== \"string\") {\r\n throw new ConnectorConfigError(\r\n `server.url is required for ${s.transport} transport`,\r\n );\r\n }\r\n }\r\n }\r\n\r\n // Validate hook handlers are functions, plus any per-host override map.\r\n if (config.hooks) {\r\n for (const ev of ALL_EVENTS) {\r\n const def = config.hooks[ev];\r\n if (def != null && typeof def.handler !== \"function\") {\r\n throw new ConnectorConfigError(`hooks.${ev}.handler must be a function`);\r\n }\r\n // Per-host override map: every key must be a registered platform id and\r\n // every entry's handler a function (author-time hard error, not skip-warn).\r\n validateHostsMap(def?.hosts, `hooks.${ev}.hosts`, \"handler\");\r\n }\r\n }\r\n\r\n // Validate per-platform native passthrough hooks (handlers live in this same\r\n // config module, exactly like normalized hooks — the resolved connector keeps\r\n // `platforms` verbatim, so live handlers survive resolution and are recovered\r\n // at runtime by re-importing the module via the registry's modulePath).\r\n validateNativeHooks(config.platforms);\r\n\r\n // Validate per-platform declarative config patches (pure JSON — persisted\r\n // whole; semantics are FIXED set-if-absent/skip-warn, so only the shape is\r\n // validated here; the host adapter enforces its sensitive-key denylist).\r\n validateConfigPatches(config.platforms);\r\n\r\n const commands = normalizeCommands(config.commands);\r\n const skills = normalizeSkills(config.skills);\r\n const subagents = normalizeSubagents(config.subagents);\r\n const memory = normalizeMemory(config.memory);\r\n const statusline = normalizeStatusline(config.statusline);\r\n const actions = normalizeActions(config.actions);\r\n\r\n const t = config.telemetry ?? {};\r\n\r\n const resolved: ResolvedConnector = {\r\n id: connectorId,\r\n ...(Object.keys(mcpIdentity).length > 0 ? { mcp: mcpIdentity } : {}),\r\n displayName: config.displayName ?? connectorId,\r\n version: config.version ?? packageMetadata?.version ?? \"0.0.0\",\r\n ...(config.server ? { server: normalizeServer(config.server) } : {}),\r\n hooks: config.hooks ?? {},\r\n hookEvents: declaredEvents(config.hooks),\r\n telemetry: {\r\n enabled: t.enabled ?? true,\r\n modelFamilyHint: t.modelFamilyHint ?? \"auto\",\r\n measureToolDefs: t.measureToolDefs ?? true,\r\n // OPT-IN: host-native turn-usage capture is OFF unless explicitly enabled\r\n // in config (or forced on at install via AGENT_CONNECTOR_HOST_NATIVE=1).\r\n hostNativeUsage: t.hostNativeUsage ?? false,\r\n store: t.store ?? \"ndjson\",\r\n calibration: {\r\n anthropicCountTokens: t.calibration?.anthropicCountTokens ?? false,\r\n },\r\n },\r\n commands,\r\n skills,\r\n subagents,\r\n memory,\r\n ...(statusline ? { statusline } : {}),\r\n actions,\r\n platforms: config.platforms ?? {},\r\n targets: config.targets ?? \"auto\",\r\n ...(config.publish ? { publish: normalizePublish(config.publish) } : {}),\r\n };\r\n\r\n return resolved;\r\n}\r\n\r\n/** The 13 normalized event names, for the nativeHooks collision check. */\r\nconst NORMALIZED_EVENT_SET: ReadonlySet<string> = new Set(ALL_EVENTS);\r\n\r\n/**\r\n * Validate a per-host override map (`hosts?:`) declared on a hook definition or\r\n * on the statusline. Shared by the hook-validation loop and normalizeStatusline:\r\n * - the value must be a plain object keyed by platform id;\r\n * - every key MUST be a REGISTERED platform id (REGISTERED_PLATFORM_IDS) —\r\n * an unknown id is an author-time ConnectorConfigError (NOT a skip-warn:\r\n * a typo'd host would otherwise silently never fire);\r\n * - every entry's implementation field (`handler` for hooks, `render` for\r\n * statusline, `run` for actions) MUST be a function (it is re-imported from\r\n * the connector module at runtime, like the top-level handler/render/run).\r\n * `undefined` (no map) is valid and skipped.\r\n */\r\nfunction validateHostsMap(\r\n map: unknown,\r\n surfaceLabel: string,\r\n implField: \"handler\" | \"render\" | \"run\",\r\n): void {\r\n if (map == null) return;\r\n if (typeof map !== \"object\" || Array.isArray(map)) {\r\n throw new ConnectorConfigError(\r\n `${surfaceLabel} must be an object keyed by platform id`,\r\n );\r\n }\r\n for (const [platformId, entry] of Object.entries(map as Record<string, unknown>)) {\r\n if (!REGISTERED_PLATFORM_IDS.has(platformId as PlatformId)) {\r\n const valid = [...REGISTERED_PLATFORM_IDS].sort().join(\", \");\r\n throw new ConnectorConfigError(\r\n `unknown platform id \"${platformId}\" in hosts map for ${surfaceLabel}; valid ids: ${valid}`,\r\n );\r\n }\r\n if (\r\n entry == null ||\r\n typeof entry !== \"object\" ||\r\n typeof (entry as Record<string, unknown>)[implField] !== \"function\"\r\n ) {\r\n throw new ConnectorConfigError(\r\n `${surfaceLabel}.${platformId}.${implField} must be a function`,\r\n );\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Validate every `platforms[<id>].nativeHooks` declaration:\r\n * - the value must be an object keyed by HOST-NATIVE event name;\r\n * - an event name must NOT collide with the normalized {@link HookEventName}\r\n * union (those belong in the cross-platform `hooks` API, which gets\r\n * normalization, matcher evaluation, and HookResponse mapping);\r\n * - each handler must be a function (it is re-imported from the config module\r\n * at runtime, like normalized hook handlers);\r\n * - `matcher`, when present, must be a string (written verbatim into the\r\n * host's hook config — the host evaluates it).\r\n */\r\nfunction validateNativeHooks(platforms: ConnectorConfig[\"platforms\"]): void {\r\n if (platforms == null) return;\r\n for (const [platformId, override] of Object.entries(platforms)) {\r\n const native = override?.nativeHooks;\r\n if (native == null) continue;\r\n const where = `platforms.${platformId}.nativeHooks`;\r\n if (typeof native !== \"object\" || Array.isArray(native)) {\r\n throw new ConnectorConfigError(\r\n `${where} must be an object keyed by host-native event name`,\r\n );\r\n }\r\n for (const [event, def] of Object.entries(native)) {\r\n if (NORMALIZED_EVENT_SET.has(event)) {\r\n throw new ConnectorConfigError(\r\n `${where}.${event} collides with the normalized hook event \"${event}\"; ` +\r\n `declare it under \\`hooks.${event}\\` (the normalized, cross-platform hooks API) instead`,\r\n );\r\n }\r\n if (def == null || typeof def !== \"object\" || typeof def.handler !== \"function\") {\r\n throw new ConnectorConfigError(`${where}.${event}.handler must be a function`);\r\n }\r\n if (def.matcher !== undefined && typeof def.matcher !== \"string\") {\r\n throw new ConnectorConfigError(`${where}.${event}.matcher must be a string`);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Validate every `platforms[<id>].configPatch` declaration:\r\n * - the value must be an array of patch objects;\r\n * - `key` must be a dotted LEAF path whose segments match\r\n * {@link CONFIG_PATCH_SEGMENT_RE} — no dots-in-key, no array indices;\r\n * - `key` must not collide with the agent-connector-modeled namespace\r\n * (`hooks*` → hooks/nativeHooks; `mcpServers*` & friends → server/extra);\r\n * - duplicate keys within one platform's list are rejected (a duplicate\r\n * would double-apply / fight itself on refcounts);\r\n * - `value` must be JSON-serializable data (it is persisted whole in the\r\n * connector record and in the ownership ledger);\r\n * - `reason` is REQUIRED (printed in the install diff and every skip-warn);\r\n * - `docsUrl`, when present, must be a string.\r\n * The HOST-side sensitive-key denylist is deliberately NOT validated here —\r\n * it lives in (and is documented by) each supporting adapter.\r\n */\r\nfunction validateConfigPatches(platforms: ConnectorConfig[\"platforms\"]): void {\r\n if (platforms == null) return;\r\n for (const [platformId, override] of Object.entries(platforms)) {\r\n const patches = override?.configPatch;\r\n if (patches == null) continue;\r\n const where = `platforms.${platformId}.configPatch`;\r\n if (!Array.isArray(patches)) {\r\n throw new ConnectorConfigError(`${where} must be an array of patch objects`);\r\n }\r\n const seen = new Set<string>();\r\n patches.forEach((patch, i) => {\r\n if (patch == null || typeof patch !== \"object\" || Array.isArray(patch)) {\r\n throw new ConnectorConfigError(`${where}[${i}] must be an object`);\r\n }\r\n if (!isValidConfigPatchKey(patch.key)) {\r\n throw new ConnectorConfigError(\r\n `${where}[${i}].key must be a dotted LEAF path whose segments match ` +\r\n `${CONFIG_PATCH_SEGMENT_RE} (no dots-in-key, no array indices); ` +\r\n `got ${JSON.stringify(patch.key)}`,\r\n );\r\n }\r\n const violation = configPatchNamespaceViolation(patch.key);\r\n if (violation) {\r\n throw new ConnectorConfigError(`${where}[${i}].key ${violation}`);\r\n }\r\n if (seen.has(patch.key)) {\r\n throw new ConnectorConfigError(\r\n `${where}[${i}] duplicate key \"${patch.key}\"`,\r\n );\r\n }\r\n seen.add(patch.key);\r\n if (!isJsonValue(patch.value)) {\r\n throw new ConnectorConfigError(\r\n `${where}[${i}].value must be JSON-serializable data ` +\r\n `(string/finite number/boolean/null/array/plain object)`,\r\n );\r\n }\r\n if (typeof patch.reason !== \"string\" || patch.reason.trim() === \"\") {\r\n throw new ConnectorConfigError(\r\n `${where}[${i}].reason is required (a human-readable why, printed in ` +\r\n `the install diff and every skip-warn)`,\r\n );\r\n }\r\n if (patch.docsUrl !== undefined && typeof patch.docsUrl !== \"string\") {\r\n throw new ConnectorConfigError(`${where}[${i}].docsUrl must be a string`);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Validate the optional `publish` block (registry server.json + MCPB bundle\r\n * distribution metadata). Light, dependency-free: we only reject shapes that\r\n * would emit a clearly INVALID standard artifact. The per-format required-field\r\n * checks (e.g. server.json needs registryNamespace, mcpb needs author.name)\r\n * live in the emitters so a connector that never publishes pays nothing.\r\n */\r\nfunction normalizePublish(publish: PublishConfig): PublishConfig {\r\n if (typeof publish !== \"object\" || Array.isArray(publish)) {\r\n throw new ConnectorConfigError(\"publish must be an object\");\r\n }\r\n if (publish.registryNamespace !== undefined) {\r\n const ns = publish.registryNamespace;\r\n if (typeof ns !== \"string\" || !REGISTRY_NAMESPACE_RE.test(ns)) {\r\n throw new ConnectorConfigError(\r\n `publish.registryNamespace must be a reverse-DNS namespace matching ${REGISTRY_NAMESPACE_RE} ` +\r\n `(e.g. \"io.github.acme\" or \"com.acme\"); got ${JSON.stringify(ns)}`,\r\n );\r\n }\r\n }\r\n if (publish.packageName !== undefined && typeof publish.packageName !== \"string\") {\r\n throw new ConnectorConfigError(\"publish.packageName must be a string\");\r\n }\r\n if (publish.author !== undefined) {\r\n const a = publish.author;\r\n if (typeof a !== \"object\" || a == null || typeof a.name !== \"string\" || a.name === \"\") {\r\n throw new ConnectorConfigError(\"publish.author.name must be a non-empty string\");\r\n }\r\n }\r\n return { ...publish };\r\n}\r\n\r\n/** Validate a surface name (kebab-case) or throw a ConnectorConfigError. */\r\nfunction assertSurfaceName(\r\n surface: string,\r\n name: unknown,\r\n index: number,\r\n field = \"name\",\r\n): string {\r\n if (typeof name !== \"string\" || !SURFACE_NAME_RE.test(name)) {\r\n throw new ConnectorConfigError(\r\n `${surface}[${index}].${field} must be kebab-case matching ${SURFACE_NAME_RE} (got ${JSON.stringify(name)})`,\r\n );\r\n }\r\n return name;\r\n}\r\n\r\n/** Require a non-empty string field on a surface entry. */\r\nfunction assertNonEmptyString(\r\n surface: string,\r\n index: number,\r\n field: string,\r\n value: unknown,\r\n): string {\r\n if (typeof value !== \"string\" || value.length === 0) {\r\n throw new ConnectorConfigError(`${surface}[${index}].${field} must be a non-empty string`);\r\n }\r\n return value;\r\n}\r\n\r\n/** Detect a duplicate surface name within one array, throwing on collision. */\r\nfunction assertNoDuplicate(\r\n surface: string,\r\n seen: Set<string>,\r\n name: string,\r\n index: number,\r\n field = \"name\",\r\n): void {\r\n if (seen.has(name)) {\r\n throw new ConnectorConfigError(`${surface}[${index}] duplicate ${field} \"${name}\"`);\r\n }\r\n seen.add(name);\r\n}\r\n\r\nfunction normalizeCommands(input: CommandDef[] | undefined): CommandDef[] {\r\n if (input == null) return [];\r\n if (!Array.isArray(input)) {\r\n throw new ConnectorConfigError(\"commands must be an array\");\r\n }\r\n const seen = new Set<string>();\r\n return input.map((cmd, i) => {\r\n if (!cmd || typeof cmd !== \"object\") {\r\n throw new ConnectorConfigError(`commands[${i}] must be an object`);\r\n }\r\n const name = assertSurfaceName(\"commands\", cmd.name, i);\r\n assertNoDuplicate(\"commands\", seen, name, i);\r\n assertNonEmptyString(\"commands\", i, \"prompt\", cmd.prompt);\r\n // Pass through verbatim (content); arrays are content, not handlers.\r\n return { ...cmd, name };\r\n });\r\n}\r\n\r\nfunction normalizeSkills(input: SkillDef[] | undefined): SkillDef[] {\r\n if (input == null) return [];\r\n if (!Array.isArray(input)) {\r\n throw new ConnectorConfigError(\"skills must be an array\");\r\n }\r\n const seen = new Set<string>();\r\n return input.map((skill, i) => {\r\n if (!skill || typeof skill !== \"object\") {\r\n throw new ConnectorConfigError(`skills[${i}] must be an object`);\r\n }\r\n const name = assertSurfaceName(\"skills\", skill.name, i);\r\n assertNoDuplicate(\"skills\", seen, name, i);\r\n const description = assertNonEmptyString(\"skills\", i, \"description\", skill.description);\r\n if (description.length > SKILL_DESCRIPTION_MAX) {\r\n throw new ConnectorConfigError(\r\n `skills[${i}].description exceeds ${SKILL_DESCRIPTION_MAX} chars (got ${description.length})`,\r\n );\r\n }\r\n assertNonEmptyString(\"skills\", i, \"body\", skill.body);\r\n assertSafeResourceKeys(\"skills\", i, skill.resources);\r\n return { ...skill, name };\r\n });\r\n}\r\n\r\n/**\r\n * Validate every `skill.resources` key as a SAFE relative path that stays inside\r\n * the skill dir. Each resource is later written/removed via join(skillDir, rel)\r\n * by every adapter, so an unvalidated key like \"../../settings.json\" would\r\n * escape the skill dir → arbitrary file write/delete. Reject (throw) when a key\r\n * is empty/\".\", absolute, or normalizes to a path that begins with \"..\" or\r\n * contains a \"/..\" (or platform-sep) traversal segment.\r\n */\r\nfunction assertSafeResourceKeys(\r\n surface: string,\r\n index: number,\r\n resources: Record<string, string> | undefined,\r\n): void {\r\n if (resources == null) return;\r\n if (typeof resources !== \"object\" || Array.isArray(resources)) {\r\n throw new ConnectorConfigError(`${surface}[${index}].resources must be an object`);\r\n }\r\n for (const rel of Object.keys(resources)) {\r\n if (rel === \"\" || rel === \".\" || rel.trim() === \"\") {\r\n throw new ConnectorConfigError(\r\n `${surface}[${index}].resources key must be a non-empty relative path (got ${JSON.stringify(rel)})`,\r\n );\r\n }\r\n if (isAbsolute(rel)) {\r\n throw new ConnectorConfigError(\r\n `${surface}[${index}].resources key must be a relative path inside the skill dir, not absolute (got ${JSON.stringify(rel)})`,\r\n );\r\n }\r\n // Normalize with BOTH posix and native separators flattened so a Windows\r\n // \"..\\\\x\" or a posix \"../x\" is caught regardless of the host OS.\r\n const norm = normalize(rel.replace(/\\\\/g, \"/\"));\r\n const segs = norm.split(/[/\\\\]/);\r\n if (norm === \"..\" || norm.startsWith(\"../\") || norm.startsWith(\"..\\\\\") || segs.includes(\"..\")) {\r\n throw new ConnectorConfigError(\r\n `${surface}[${index}].resources key must not escape the skill dir via \"..\" (got ${JSON.stringify(rel)})`,\r\n );\r\n }\r\n }\r\n}\r\n\r\n/** Default name for a single-entry memory declaration. */\r\nconst MEMORY_DEFAULT_NAME = \"memory\";\r\n\r\n/**\r\n * Validate + normalize `memory` entries (the managed-block content surface).\r\n * - `name` defaults to \"memory\", then must be kebab-case and unique — it is\r\n * half of the block marker id (`<connectorId>/<name>`) and must stay stable;\r\n * - `content` must be a non-empty string, ≤ 16 KiB (hard cap — memory files\r\n * are injected into every prompt of every session on the host), and must\r\n * NOT contain the literal marker tokens `agent-connector:begin` /\r\n * `agent-connector:end` (they would corrupt marker scanning in the shared\r\n * file — rephrase the guidance instead). The 4 KiB SOFT budget is reported\r\n * at install time as a `warn` ChangeRecord, not a config error\r\n * (defineConnector has no warning channel).\r\n */\r\nfunction normalizeMemory(input: MemoryDef[] | undefined): MemoryDef[] {\r\n if (input == null) return [];\r\n if (!Array.isArray(input)) {\r\n throw new ConnectorConfigError(\"memory must be an array\");\r\n }\r\n const seen = new Set<string>();\r\n return input.map((entry, i) => {\r\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\r\n throw new ConnectorConfigError(`memory[${i}] must be an object`);\r\n }\r\n const name =\r\n entry.name === undefined\r\n ? MEMORY_DEFAULT_NAME\r\n : assertSurfaceName(\"memory\", entry.name, i);\r\n assertNoDuplicate(\"memory\", seen, name, i);\r\n const content = assertNonEmptyString(\"memory\", i, \"content\", entry.content);\r\n const bytes = Buffer.byteLength(content, \"utf8\");\r\n if (bytes > MEMORY_CONTENT_HARD_CAP_BYTES) {\r\n throw new ConnectorConfigError(\r\n `memory[${i}].content exceeds the ${MEMORY_CONTENT_HARD_CAP_BYTES}-byte hard cap ` +\r\n `(got ${bytes} bytes); memory is inlined into every prompt of every targeted host — keep it terse`,\r\n );\r\n }\r\n for (const token of [MANAGED_BLOCK_BEGIN_TOKEN, MANAGED_BLOCK_END_TOKEN]) {\r\n if (content.includes(token)) {\r\n throw new ConnectorConfigError(\r\n `memory[${i}].content must not contain the literal marker token \"${token}\" ` +\r\n `(it would corrupt managed-block scanning in the shared memory file); rephrase the guidance`,\r\n );\r\n }\r\n }\r\n if (entry.description !== undefined && typeof entry.description !== \"string\") {\r\n throw new ConnectorConfigError(`memory[${i}].description must be a string`);\r\n }\r\n return { ...entry, name };\r\n });\r\n}\r\n\r\n/** Default name for the (singular) statusline declaration. */\r\nconst STATUSLINE_DEFAULT_NAME = \"statusline\";\r\n\r\n/**\r\n * Validate + normalize the SINGULAR `statusline` (a HUD handler surface):\r\n * - `render` MUST be a function (it is the renderer, re-imported at runtime\r\n * like a hook handler);\r\n * - `name` defaults to \"statusline\", then must be kebab-case (the shared\r\n * surface-name validator);\r\n * - `description`, when present, must be a string.\r\n * Returns undefined when no statusline is declared (it is optional and singular,\r\n * unlike the memory[] array).\r\n */\r\nfunction normalizeStatusline(\r\n input: StatuslineDef | undefined,\r\n): StatuslineDef | undefined {\r\n if (input == null) return undefined;\r\n if (typeof input !== \"object\" || Array.isArray(input)) {\r\n throw new ConnectorConfigError(\"statusline must be an object\");\r\n }\r\n if (typeof input.render !== \"function\") {\r\n throw new ConnectorConfigError(\"statusline.render must be a function\");\r\n }\r\n const name =\r\n input.name === undefined\r\n ? STATUSLINE_DEFAULT_NAME\r\n : assertSurfaceName(\"statusline\", input.name, 0);\r\n if (input.description !== undefined && typeof input.description !== \"string\") {\r\n throw new ConnectorConfigError(\"statusline.description must be a string\");\r\n }\r\n // Per-host render override map: registered platform ids only, each render a\r\n // function (author-time hard error, mirroring the hook hosts-map validation).\r\n validateHostsMap(input.hosts, \"statusline.hosts\", \"render\");\r\n return { ...input, name };\r\n}\r\n\r\n/**\r\n * Validate + normalize `actions` (the user-invokable action handler surface):\r\n * - the value must be an array;\r\n * - each entry's `id` must be kebab-case (the shared surface-name validator)\r\n * and UNIQUE within the connector (ConnectorConfigError on dup — the id is\r\n * the verb's positional arg, so a duplicate would be ambiguous);\r\n * - `run` MUST be a function (it is the handler, re-imported at runtime like a\r\n * hook handler / statusline render);\r\n * - `description`, when present, must be a string;\r\n * - the per-host `hosts:` override map is validated via the shared\r\n * validateHostsMap (registered platform ids only, each `run` a function).\r\n * Returns [] when no actions are declared (defaults applied, like the other\r\n * array surfaces).\r\n */\r\nfunction normalizeActions(input: ActionDef[] | undefined): ActionDef[] {\r\n if (input == null) return [];\r\n if (!Array.isArray(input)) {\r\n throw new ConnectorConfigError(\"actions must be an array\");\r\n }\r\n const seen = new Set<string>();\r\n return input.map((action, i) => {\r\n if (!action || typeof action !== \"object\" || Array.isArray(action)) {\r\n throw new ConnectorConfigError(`actions[${i}] must be an object`);\r\n }\r\n const id = assertSurfaceName(\"actions\", action.id, i, \"id\");\r\n assertNoDuplicate(\"actions\", seen, id, i, \"id\");\r\n if (typeof action.run !== \"function\") {\r\n throw new ConnectorConfigError(`actions[${i}].run must be a function`);\r\n }\r\n if (action.description !== undefined && typeof action.description !== \"string\") {\r\n throw new ConnectorConfigError(`actions[${i}].description must be a string`);\r\n }\r\n // Per-host run override map: registered platform ids only, each run a\r\n // function (author-time hard error, mirroring the statusline/hook hosts-map).\r\n validateHostsMap(action.hosts, `actions.${id}.hosts`, \"run\");\r\n return { ...action, id };\r\n });\r\n}\r\n\r\n/**\r\n * Typed identity helper for authoring a status line in its own module:\r\n * export const myStatusline = defineStatusline({ render: (ctx) => \"…\" });\r\n * Mirrors the (informal) defineX helpers; gives the developer full type\r\n * inference on {@link StatuslineContext} without importing the type by hand.\r\n */\r\nexport const defineStatusline = (def: StatuslineDef): StatuslineDef => def;\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Typed identity helpers (the `define*` authoring family)\r\n//\r\n// Each is a one-line identity function: it returns its argument UNCHANGED and\r\n// does NOT validate or mutate (validation still happens centrally in\r\n// defineConnector). Their only job is ergonomics — authoring a surface in its\r\n// own module with full type inference + autocomplete on the *Def shape, and a\r\n// single import site — mirroring the existing {@link defineStatusline}.\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Typed identity helper for authoring ONE normalized lifecycle hook in its own\r\n * module, EVENT-PARAMETERIZED so the handler's payload narrows to that event:\r\n *\r\n * export const onPre = defineHook(\"PreToolUse\", {\r\n * handler(evt) { evt.toolName // ← typed as a PreToolUseEvent, not the union\r\n * return { decision: \"deny\", reason: \"no\" };\r\n * },\r\n * });\r\n *\r\n * The leading `event` argument exists ONLY to infer `E`; the def is returned\r\n * unchanged (identity — validation still happens in defineConnector). Passing\r\n * `HookDefinition` without an event would widen the handler param to the full\r\n * {@link HookEventName} union and lose per-event narrowing, so the event tag is\r\n * required.\r\n */\r\nexport const defineHook = <E extends HookEventName>(\r\n event: E,\r\n def: HookDefinition<E>,\r\n): HookDefinition<E> => {\r\n void event; // tag-only: used solely to infer E (the def carries no event field)\r\n return def;\r\n};\r\n\r\n/**\r\n * Typed identity helper for authoring a slash {@link CommandDef} in its own\r\n * module. Returns the def unchanged (kebab-case name + prompt are validated by\r\n * defineConnector when the connector is assembled).\r\n */\r\nexport const defineCommand = (def: CommandDef): CommandDef => def;\r\n\r\n/**\r\n * Typed identity helper for authoring an Agent {@link SkillDef} in its own\r\n * module. Returns the def unchanged (name/description/body + safe resource keys\r\n * are validated by defineConnector).\r\n */\r\nexport const defineSkill = (def: SkillDef): SkillDef => def;\r\n\r\n/**\r\n * Typed identity helper for authoring a {@link SubagentDef} in its own module.\r\n * Returns the def unchanged (name/description/prompt validated by defineConnector).\r\n */\r\nexport const defineSubagent = (def: SubagentDef): SubagentDef => def;\r\n\r\n/**\r\n * Typed identity helper for authoring a {@link MemoryDef} (standing-guidance\r\n * managed block) in its own module. Returns the def unchanged (name/content +\r\n * byte budget + marker-token guard validated by defineConnector).\r\n */\r\nexport const defineMemory = (def: MemoryDef): MemoryDef => def;\r\n\r\n/**\r\n * Typed identity helper for authoring a user-invokable {@link ActionDef} in its\r\n * own module. Returns the def unchanged (kebab-case unique id + run-is-function\r\n * + the per-host hosts map validated by defineConnector when the connector is\r\n * assembled).\r\n */\r\nexport const defineAction = (def: ActionDef): ActionDef => def;\r\n\r\n/**\r\n * Typed identity helper for authoring a declarative {@link ConfigPatchDef}\r\n * (set-if-absent host-config key patch) in its own module. Returns the def\r\n * unchanged (leaf-path grammar + namespace guard + required reason validated by\r\n * defineConnector when it appears under `platforms[<id>].configPatch`).\r\n */\r\nexport const defineConfigPatch = (def: ConfigPatchDef): ConfigPatchDef => def;\r\n\r\n/**\r\n * Typed identity helper for authoring a {@link NativeHookDef} (host-native\r\n * passthrough hook) in its own module. Returns the def unchanged (event-name\r\n * collision + handler-is-function validated by defineConnector when it appears\r\n * under `platforms[<id>].nativeHooks`).\r\n */\r\nexport const defineNativeHook = (def: NativeHookDef): NativeHookDef => def;\r\n\r\nfunction normalizeSubagents(input: SubagentDef[] | undefined): SubagentDef[] {\r\n if (input == null) return [];\r\n if (!Array.isArray(input)) {\r\n throw new ConnectorConfigError(\"subagents must be an array\");\r\n }\r\n const seen = new Set<string>();\r\n return input.map((agent, i) => {\r\n if (!agent || typeof agent !== \"object\") {\r\n throw new ConnectorConfigError(`subagents[${i}] must be an object`);\r\n }\r\n const name = assertSurfaceName(\"subagents\", agent.name, i);\r\n assertNoDuplicate(\"subagents\", seen, name, i);\r\n assertNonEmptyString(\"subagents\", i, \"description\", agent.description);\r\n assertNonEmptyString(\"subagents\", i, \"prompt\", agent.prompt);\r\n return { ...agent, name };\r\n });\r\n}\r\n\r\nfunction normalizeServer(server: ConnectorConfig[\"server\"]): ResolvedConnector[\"server\"] {\r\n if (!server) return undefined;\r\n const wrapDefault = server.transport === \"stdio\";\r\n return {\r\n ...server,\r\n enabled: server.enabled ?? true,\r\n tools: server.tools ?? { include: [\"*\"] },\r\n wrapForTelemetry: server.wrapForTelemetry ?? wrapDefault,\r\n };\r\n}\r\n","/**\r\n * core/mcp-standard — pinned literals + guards for the official MCP standards\r\n * agent-connector EMITS (registry server.json, MCPB bundle) or SPEAKS (the\r\n * connection-lifecycle wire used by `doctor --probe`).\r\n *\r\n * Each pinned constant is the CURRENT released value verified 2026-06-05 against\r\n * the upstream spec/schema. They are deliberately centralized + annotated\r\n * MUST-VERIFY-AT-IMPLEMENTATION: a newer spec revision can supersede any of them\r\n * without breaking us, so the bump is a one-line change here, never scattered.\r\n *\r\n * Sources:\r\n * • server.schema.json 2025-12-11 — https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json\r\n * • MCPB manifest 0.3 — github.com/anthropics/mcpb (MANIFEST.md)\r\n * • MCP protocol 2025-11-25 — modelcontextprotocol.io/specification/2025-11-25\r\n * (latest RELEASED revision. 2026-07-28 is a release-candidate only — do NOT\r\n * advance to it until it publishes as a stable dated revision. The probe\r\n * offers this version but ACCEPTS whatever a server negotiates, so the\r\n * offered literal being stale never breaks interop — only this constant.)\r\n */\r\n\r\nimport type { Transport } from \"./types.js\";\r\n\r\n/** Registry server.json JSON Schema URL (released 2025-12-11). MUST-VERIFY on bump. */\r\nexport const MCP_SERVER_SCHEMA_URL =\r\n \"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json\";\r\n\r\n/** Current MCPB bundle manifest_version (anthropics/mcpb). MUST-VERIFY on bump. */\r\nexport const MCPB_MANIFEST_VERSION = \"0.3\";\r\n\r\n/**\r\n * Latest RELEASED MCP protocol revision `doctor --probe` offers in `initialize`.\r\n * Current = 2025-11-25. MUST-VERIFY on bump; stay on the latest *released*\r\n * revision (2026-07-28 is RC-only as of 2026-06). Negotiation accepts whatever\r\n * the server returns, so this is the offered value, not a hard requirement.\r\n */\r\nexport const MCP_PROTOCOL_VERSION = \"2025-11-25\";\r\n\r\n/** Default npm registry base URL stamped into server.json npm packages. */\r\nexport const NPM_REGISTRY_BASE_URL = \"https://registry.npmjs.org\";\r\n\r\n/**\r\n * server.json transport.type enum — the EXACT values the 2025-12-11 schema\r\n * accepts (packages[].transport.type and remotes[].type). Our `http` Transport\r\n * maps to the spec slug \"streamable-http\"; \"ws\" is non-spec (see below).\r\n */\r\nexport type RegistryTransportType = \"stdio\" | \"streamable-http\" | \"sse\";\r\n\r\n/**\r\n * Map our {@link Transport} union to the registry/server.json transport slug.\r\n * Returns null for \"ws\" — WebSocket is NOT a spec transport (it can only exist\r\n * as a vendor custom transport, e.g. Claude Code's non-spec type:\"ws\"), so a\r\n * conformant artifact must REJECT it rather than emit an invalid type. The spec\r\n * defines exactly stdio + streamable-http, with sse the deprecated HTTP+SSE.\r\n */\r\nexport function registryTransportType(transport: Transport): RegistryTransportType | null {\r\n switch (transport) {\r\n case \"stdio\":\r\n return \"stdio\";\r\n case \"http\":\r\n return \"streamable-http\";\r\n case \"sse\":\r\n return \"sse\";\r\n case \"ws\":\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Is `v` a CONCRETE version the MCP Registry accepts? The registry rejects\r\n * ranges (\"^1.2.3\", \"~1.2.3\", \">=1.2.3\", \"1.x\", \"1.*\"); only a pinned SemVer\r\n * (optionally with a -prerelease / +build suffix) is valid. \"0.0.0\" is concrete\r\n * (so it passes this guard) but is the unset placeholder — callers warn on it\r\n * separately via {@link isPlaceholderVersion}.\r\n */\r\nexport function isConcreteSemver(v: string): boolean {\r\n return /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/.test(v);\r\n}\r\n\r\n/** The unset default version a connector ships with until the dev sets a real one. */\r\nexport function isPlaceholderVersion(v: string): boolean {\r\n return v === \"0.0.0\";\r\n}\r\n\r\n/**\r\n * Reverse-DNS registry namespace pattern (the part BEFORE the \"/\" in a\r\n * server.json `name`). The full name regex is\r\n * `^[a-zA-Z0-9.-]+/[a-zA-Z0-9._-]+$`; the namespace side allows letters, digits,\r\n * dots and hyphens (NO underscore) — e.g. \"io.github.acme\" or \"com.acme\".\r\n */\r\nexport const REGISTRY_NAMESPACE_RE = /^[a-zA-Z0-9.-]+$/;\r\n\r\n/** The full server.json `name` regex (namespace \"/\" server-name), per the schema. */\r\nexport const REGISTRY_NAME_RE = /^[a-zA-Z0-9.-]+\\/[a-zA-Z0-9._-]+$/;\r\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/host-paths.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────────────────────────\r\n// host-paths.ts — shared OS user-config-dir base resolvers\r\n//\r\n// Several adapters resolve the SAME per-OS \"user config base\" directory with\r\n// the same logic (XDG on posix; %APPDATA%/%LOCALAPPDATA% on Windows, each with\r\n// a ~/AppData fallback). These helpers consolidate that resolution so the\r\n// per-host adapters only carry their host-specific SUFFIX. The result is\r\n// byte-identical for absolute/clean config-dir inputs (the realistic case);\r\n// a non-canonical env value (relative, trailing slash, `..`) is normalized via\r\n// `resolve()` rather than passed through bare — a safe canonicalization.\r\n//\r\n// Scope note: these are the USER-CONFIG-DIR bases (where a host keeps its\r\n// settings/config files). The agent-connector *data-root* paths (our own\r\n// per-project state) live in core/paths.ts — do NOT conflate the two.\r\n//\r\n// Host-specific config-home resolvers that are SHARED across modules (e.g.\r\n// `codexConfigHome`, used by BOTH the codex adapter and marketplace detection)\r\n// DO live here, so the writer and the probe can never disagree on the dir.\r\n// Single-caller host envs (PI_CODING_AGENT_DIR, OPENCLAW_*) stay in their own\r\n// adapter.\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nimport { homedir } from \"node:os\";\r\nimport { join, resolve } from \"node:path\";\r\n\r\n/** $XDG_CONFIG_HOME when set & non-empty, else ~/.config. */\r\nexport function xdgConfigHome(): string {\r\n const xdg = process.env.XDG_CONFIG_HOME;\r\n return xdg && xdg.trim() !== \"\" ? resolve(xdg) : join(homedir(), \".config\");\r\n}\r\n\r\n/** %APPDATA% (Roaming) when set & non-empty, else ~/AppData/Roaming. */\r\nexport function roamingAppData(): string {\r\n const appData = process.env.APPDATA;\r\n return appData && appData.trim() !== \"\"\r\n ? resolve(appData)\r\n : join(homedir(), \"AppData\", \"Roaming\");\r\n}\r\n\r\n/** %LOCALAPPDATA% when set & non-empty, else ~/AppData/Local. */\r\nexport function localAppData(): string {\r\n const local = process.env.LOCALAPPDATA;\r\n return local && local.trim() !== \"\"\r\n ? resolve(local)\r\n : join(homedir(), \"AppData\", \"Local\");\r\n}\r\n\r\n/** Codex's config home: $CODEX_HOME (tilde-expanded, then resolved) when set\r\n * & non-empty, else ~/.codex. Shared by the codex adapter (writer) and the\r\n * marketplace detection probe so they never disagree on the config dir. */\r\nexport function codexConfigHome(): string {\r\n const env = process.env.CODEX_HOME;\r\n if (env && env.trim() !== \"\") {\r\n if (env.startsWith(\"~\")) return join(homedir(), env.replace(/^~[/\\\\]?/, \"\"));\r\n return resolve(env);\r\n }\r\n return join(homedir(), \".codex\");\r\n}\r\n"],"mappings":";;;AAsBA,SAAS,eAAe;AACxB,SAAS,MAAM,eAAe;AAGvB,SAAS,gBAAwB;AACtC,QAAM,MAAM,QAAQ,IAAI;AACxB,SAAO,OAAO,IAAI,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAI,KAAK,QAAQ,GAAG,SAAS;AAC5E;AAGO,SAAS,iBAAyB;AACvC,QAAM,UAAU,QAAQ,IAAI;AAC5B,SAAO,WAAW,QAAQ,KAAK,MAAM,KACjC,QAAQ,OAAO,IACf,KAAK,QAAQ,GAAG,WAAW,SAAS;AAC1C;AAGO,SAAS,eAAuB;AACrC,QAAM,QAAQ,QAAQ,IAAI;AAC1B,SAAO,SAAS,MAAM,KAAK,MAAM,KAC7B,QAAQ,KAAK,IACb,KAAK,QAAQ,GAAG,WAAW,OAAO;AACxC;AAKO,SAAS,kBAA0B;AACxC,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,OAAO,IAAI,KAAK,MAAM,IAAI;AAC5B,QAAI,IAAI,WAAW,GAAG,EAAG,QAAO,KAAK,QAAQ,GAAG,IAAI,QAAQ,YAAY,EAAE,CAAC;AAC3E,WAAO,QAAQ,GAAG;AAAA,EACpB;AACA,SAAO,KAAK,QAAQ,GAAG,QAAQ;AACjC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/serve.ts","../src/telemetry/calibration.ts","../src/telemetry/proxy.ts","../src/runtime/usage-event.ts","../src/runtime/statusline-entrypoint.ts","../src/runtime/action-entrypoint.ts"],"sourcesContent":["/**\r\n * runtime/serve — the `agent-connector serve` telemetry-wrapping entrypoint.\r\n *\r\n * When a stdio MCP server opts into transparent telemetry, its host config is\r\n * rewritten (by the adapter, via core/spawn.buildServeWrapperCommand) to launch\r\n * <homeBin> serve --connector <id> -- <realCommand> <realArgs...>\r\n * instead of the server directly. The CLI parses those flags and calls\r\n * {@link runServe}, which stands up the per-session telemetry context (store,\r\n * tokenizer, project identity, host detection) and hands off to the proxy.\r\n *\r\n * The proxy (telemetry/proxy.runServeProxy) forwards bytes VERBATIM in both\r\n * directions and measures aggregate per-tool token counts out of band, so this\r\n * wrapper is transparent to both the host and the real server. It resolves with\r\n * the child server's exit code, which the CLI uses as its own.\r\n */\r\n\r\nimport { randomUUID } from \"node:crypto\";\r\n\r\nimport { detectRuntimeHost } from \"../adapters/detect.js\";\r\nimport { REGISTERED_PLATFORM_IDS } from \"../adapters/registry.js\";\r\nimport { readRegisteredMeta } from \"../core/load-connector.js\";\r\nimport { projectIdentity } from \"../core/paths.js\";\r\nimport { detectLaunchMethod } from \"../core/spawn.js\";\r\nimport type { PlatformId } from \"../core/types.js\";\r\nimport { runServeProxy } from \"../telemetry/proxy.js\";\r\nimport { openStore } from \"../telemetry/store.js\";\r\nimport { getTokenizer } from \"../telemetry/tokenizer.js\";\r\nimport type { TelemetryInstallScope } from \"../telemetry/types.js\";\r\n\r\n/** Flags the CLI hands to {@link runServe}. */\r\nexport interface RunServeOptions {\r\n /** Connector id from `--connector <id>`; selects telemetry config + stamps records. */\r\n connectorId: string;\r\n /** The real MCP server executable to spawn (everything after `--`). */\r\n serverCommand: string;\r\n /** Arguments passed to that executable. */\r\n serverArgs: string[];\r\n /**\r\n * Install scope from `--scope <user|project>`. OPTIONAL: absent for configs\r\n * written before scope plumbing existed — left unstamped so older rows read\r\n * as \"unknown\". Stamped verbatim onto every telemetry record when present.\r\n */\r\n installScope?: TelemetryInstallScope;\r\n /**\r\n * Install TARGET platform id from `--host <platformId>` (baked into the\r\n * wrapper at install time). OPTIONAL: when a recognized platform id, it\r\n * OVERRIDES runtime env detection so headless spawns stamp hostPlatform\r\n * correctly (detectRuntimeHost only knows env markers for a few hosts and\r\n * otherwise mis-attributes). Absent/unrecognized → fall back to detection.\r\n */\r\n hostPlatformOverride?: PlatformId;\r\n /**\r\n * Framework data-root from `--data-dir <path>` (baked into the wrapper at\r\n * install time, only for a NON-DEFAULT root). OPTIONAL: when present, it pins\r\n * the data-root the WHOLE child resolves — connector record lookup AND the\r\n * telemetry store — by populating AGENT_CONNECTOR_DATA_DIR before anything\r\n * reads it. This is the env-independent path for hosts (codex) that strip the\r\n * MCP child's environment and would otherwise drop the override, leaving the\r\n * child to resolve the default `~/.agent-connector` and fail \"not registered\".\r\n * Absent → resolve the data-root the usual way (env or default).\r\n */\r\n dataDir?: string;\r\n}\r\n\r\n/**\r\n * Launch the developer's real MCP server under the telemetry-wrapping proxy.\r\n *\r\n * Resolves with the child server's exit code (propagated as this process's exit\r\n * code by the CLI). The session id comes from AGENT_CONNECTOR_SESSION when the\r\n * host sets it (empty otherwise); the host platform is detected from runtime env\r\n * markers; the project identity partitions telemetry by the stable project key.\r\n */\r\n/**\r\n * Resolve a session id for telemetry attribution. Prefers a host-provided\r\n * session/thread marker (so records from the same host session group together);\r\n * falls back to a per-process UUID — each `serve` invocation is one server\r\n * session, a sensible default granularity — so `--by session` rollups are never\r\n * collapsed into a single empty-keyed group.\r\n */\r\nfunction resolveSessionId(env: NodeJS.ProcessEnv = process.env): string {\r\n return (\r\n env.AGENT_CONNECTOR_SESSION ||\r\n env.CLAUDE_SESSION_ID ||\r\n env.CODEX_THREAD_ID ||\r\n env.CURSOR_TRACE_ID ||\r\n env.MCP_SESSION_ID ||\r\n `proc-${randomUUID()}`\r\n );\r\n}\r\n\r\nexport async function runServe(opts: RunServeOptions): Promise<number> {\r\n const {\r\n connectorId,\r\n serverCommand,\r\n serverArgs,\r\n installScope,\r\n hostPlatformOverride,\r\n dataDir,\r\n } = opts;\r\n\r\n // Pin the data-root BEFORE anything resolves it (the connector record lookup\r\n // below and openStore later both read dataRoot()). The wrapper passes\r\n // --data-dir only for a non-default root on a host that may strip the child\r\n // env (codex) — populating AGENT_CONNECTOR_DATA_DIR here makes the whole child\r\n // resolve that root regardless of whether the host propagated the env var.\r\n if (dataDir !== undefined && dataDir.trim() !== \"\") {\r\n process.env.AGENT_CONNECTOR_DATA_DIR = dataDir;\r\n }\r\n\r\n const connector = readRegisteredMeta(connectorId);\r\n if (!connector) {\r\n throw new Error(\r\n `Connector \"${connectorId}\" is not registered. Run an install/register step first.`,\r\n );\r\n }\r\n\r\n const id = projectIdentity(process.cwd());\r\n // Prefer the install TARGET platform baked into the wrapper (--host), but only\r\n // when it is a KNOWN registered platform id — a bad/unknown value falls back to\r\n // runtime env detection so a config typo can never poison hostPlatform.\r\n const hostPlatform: PlatformId =\r\n hostPlatformOverride !== undefined &&\r\n REGISTERED_PLATFORM_IDS.has(hostPlatformOverride)\r\n ? hostPlatformOverride\r\n : detectRuntimeHost().platform;\r\n const sessionId = resolveSessionId();\r\n\r\n // `serve` only ever wraps a locally-spawned stdio server (a remote/http server\r\n // is never launched through the proxy), so isRemote is always false here.\r\n const launchMethod = detectLaunchMethod(serverCommand, serverArgs);\r\n\r\n const store = openStore({});\r\n const tok = getTokenizer();\r\n\r\n return runServeProxy({\r\n connectorId,\r\n command: serverCommand,\r\n args: serverArgs,\r\n store,\r\n tokenizer: tok,\r\n modelFamilyHint: connector.telemetry.modelFamilyHint,\r\n hostPlatform,\r\n sessionId,\r\n projectKey: id.key,\r\n projectDir: id.dir,\r\n measureToolDefs: connector.telemetry.measureToolDefs,\r\n installScope,\r\n launchMethod,\r\n });\r\n}\r\n","/**\r\n * telemetry/calibration — OPT-IN Anthropic count_tokens calibration.\r\n *\r\n * The default tokenizer counts every family with the OpenAI o200k_base BPE, so\r\n * an Anthropic session's counts are an honest-but-approximate stand-in\r\n * (\"tokenizer-approx\"). This module lets a developer OPT IN to calibrating that\r\n * approximation against Anthropic's real `count_tokens` endpoint: we sample a\r\n * tiny fraction of tool calls off-box, learn a per-family correction factor\r\n * (rolling mean of exact/approx), and apply it to the locally-tokenized counts\r\n * so they land much closer to the host's real numbers — labeled honestly as\r\n * \"tokenizer-calibrated\".\r\n *\r\n * PRIVACY + SAFETY — load-bearing invariants:\r\n * • OPT-IN only. Nothing here runs unless BOTH AGENT_CONNECTOR_CALIBRATE\r\n * contains \"anthropic\" AND ANTHROPIC_API_KEY is set (see isCalibrationEnabled).\r\n * • Sampling only — shouldSample() rate-limits hard so we never hammer the API.\r\n * • Content leaves the box ONLY on a sampled call, ONLY when opted in. We store\r\n * a single scalar factor + sample count — NEVER the sampled text itself.\r\n * • Fail-open everywhere: a network/parse/IO error returns null / passes the\r\n * approximation through unchanged and NEVER throws into a tool call or hook.\r\n *\r\n * No new dependencies: uses Node's global fetch (Node >= 18) and node:fs.\r\n */\r\n\r\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { join } from \"node:path\";\r\n\r\nimport { dataRoot, ensureDir } from \"../core/paths.js\";\r\nimport type { ConfidenceSource, ModelFamily } from \"./types.js\";\r\n\r\n// ── Env switches ──────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Is opt-in Anthropic calibration enabled for this process?\r\n *\r\n * Requires BOTH:\r\n * • AGENT_CONNECTOR_CALIBRATE — a comma-separated allowlist that INCLUDES\r\n * `anthropic` (so a future `AGENT_CONNECTOR_CALIBRATE=openai,anthropic` can\r\n * opt other families in without touching this gate), and\r\n * • ANTHROPIC_API_KEY — a non-empty key to authenticate the off-box call.\r\n *\r\n * Either missing → disabled (the privacy-safe default).\r\n */\r\nexport function isCalibrationEnabled(): boolean {\r\n const families = (process.env.AGENT_CONNECTOR_CALIBRATE || \"\")\r\n .split(\",\")\r\n .map((s) => s.trim())\r\n .filter((s) => s !== \"\");\r\n const key = (process.env.ANTHROPIC_API_KEY || \"\").trim();\r\n return families.includes(\"anthropic\") && key !== \"\";\r\n}\r\n\r\n// ── Factor store (dataRoot/calibration.json) ────────────────────────────────\r\n\r\n/** One learned correction factor for a model family: factor + sample count. */\r\nexport interface CalibrationFactor {\r\n /** Multiply an approx count by this to estimate the real count. */\r\n factor: number;\r\n /** How many samples have folded into the rolling mean. */\r\n samples: number;\r\n}\r\n\r\n/** The on-disk factor map, keyed by model family. */\r\nexport type CalibrationFactors = Partial<Record<ModelFamily, CalibrationFactor>>;\r\n\r\n/** Path to the learned-factor store: dataRoot()/calibration.json. */\r\nexport function calibrationPath(): string {\r\n return join(dataRoot(), \"calibration.json\");\r\n}\r\n\r\n/**\r\n * Clamp a measured exact/approx ratio into a sane range. A pathological sample\r\n * (e.g. an empty-string approx of 0 → Infinity, or a parse glitch) must never\r\n * poison the rolling mean, so ratios are pinned to [0.2, 5].\r\n */\r\nconst RATIO_MIN = 0.2;\r\nconst RATIO_MAX = 5;\r\n\r\nfunction clampRatio(ratio: number): number | null {\r\n if (!Number.isFinite(ratio) || ratio <= 0) return null;\r\n if (ratio < RATIO_MIN) return RATIO_MIN;\r\n if (ratio > RATIO_MAX) return RATIO_MAX;\r\n return ratio;\r\n}\r\n\r\n/**\r\n * Load the learned factors from disk. Fail-open: a missing/unreadable/malformed\r\n * file returns an empty map rather than throwing.\r\n */\r\nexport function loadFactors(): CalibrationFactors {\r\n const path = calibrationPath();\r\n if (!existsSync(path)) return {};\r\n try {\r\n const parsed = JSON.parse(readFileSync(path, \"utf8\")) as unknown;\r\n if (parsed === null || typeof parsed !== \"object\") return {};\r\n const out: CalibrationFactors = {};\r\n for (const [family, value] of Object.entries(parsed as Record<string, unknown>)) {\r\n if (value === null || typeof value !== \"object\") continue;\r\n const rec = value as Record<string, unknown>;\r\n const factor = rec[\"factor\"];\r\n const samples = rec[\"samples\"];\r\n if (\r\n typeof factor === \"number\" &&\r\n Number.isFinite(factor) &&\r\n factor > 0 &&\r\n typeof samples === \"number\" &&\r\n Number.isFinite(samples) &&\r\n samples >= 0\r\n ) {\r\n (out as Record<string, CalibrationFactor>)[family] = {\r\n factor,\r\n samples,\r\n };\r\n }\r\n }\r\n return out;\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Fold one observed exact/approx `ratio` into the rolling mean for `family` and\r\n * persist it. A running average converges to the true mean while staying cheap\r\n * and stateless across processes (each writer reads the prior count, blends in\r\n * the new sample, writes back). Fail-open: any read/write/clamp problem leaves\r\n * the store untouched and never throws.\r\n */\r\nexport function recordSample(family: ModelFamily, ratio: number): void {\r\n const clamped = clampRatio(ratio);\r\n if (clamped === null) return;\r\n try {\r\n const factors = loadFactors();\r\n const prior = factors[family];\r\n let next: CalibrationFactor;\r\n if (prior === undefined || prior.samples <= 0) {\r\n next = { factor: clamped, samples: 1 };\r\n } else {\r\n const samples = prior.samples + 1;\r\n // Running average: new mean = old mean + (sample - old mean) / n.\r\n const factor = prior.factor + (clamped - prior.factor) / samples;\r\n next = { factor, samples };\r\n }\r\n const updated: CalibrationFactors = { ...factors, [family]: next };\r\n const path = calibrationPath();\r\n ensureDir(dataRoot());\r\n writeFileSync(path, `${JSON.stringify(updated, null, 2)}\\n`, \"utf8\");\r\n } catch {\r\n /* fail-open: a calibration write must never break a tool call */\r\n }\r\n}\r\n\r\n// ── Anthropic count_tokens (off-box, sampled, fail-open) ─────────────────────\r\n\r\n/** Default model used for count_tokens when no family→model map applies. */\r\nconst DEFAULT_ANTHROPIC_MODEL = \"claude-3-5-sonnet-latest\";\r\n\r\n/** Anthropic count_tokens endpoint. */\r\nconst COUNT_TOKENS_URL = \"https://api.anthropic.com/v1/messages/count_tokens\";\r\n\r\n/** The single field we read out of a successful response. */\r\ninterface CountTokensResponse {\r\n input_tokens?: unknown;\r\n}\r\n\r\n/**\r\n * Ask Anthropic's `count_tokens` endpoint for the exact token count of `text`\r\n * under `model`. Returns the integer count, or `null` on ANY failure (no key,\r\n * non-200, network error, unparseable body) — fail-open by contract.\r\n *\r\n * Only ever called on a SAMPLED tool call when calibration is opted in, so the\r\n * sampled text leaves the box only under explicit operator consent.\r\n */\r\nexport async function countTokensAnthropic(\r\n text: string,\r\n model: string = DEFAULT_ANTHROPIC_MODEL,\r\n): Promise<number | null> {\r\n const apiKey = (process.env.ANTHROPIC_API_KEY || \"\").trim();\r\n if (apiKey === \"\") return null;\r\n try {\r\n const res = await fetch(COUNT_TOKENS_URL, {\r\n method: \"POST\",\r\n headers: {\r\n \"x-api-key\": apiKey,\r\n \"anthropic-version\": \"2023-06-01\",\r\n \"content-type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n model,\r\n messages: [{ role: \"user\", content: text }],\r\n }),\r\n });\r\n if (!res.ok) return null;\r\n const body = (await res.json()) as CountTokensResponse;\r\n const n = body.input_tokens;\r\n if (typeof n === \"number\" && Number.isFinite(n) && n >= 0) {\r\n return n;\r\n }\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n// ── Sampling (rate-limit so we never hammer the API) ─────────────────────────\r\n\r\n/**\r\n * Sample roughly 1 in {@link SAMPLE_EVERY} calls, with a hard per-minute cap so\r\n * a burst of tool calls can never fan out into a burst of API calls. Both\r\n * counters are in-memory (per process) — calibration is a best-effort,\r\n * low-volume background signal, not a per-call requirement.\r\n */\r\nconst SAMPLE_EVERY = 20;\r\nconst MAX_SAMPLES_PER_MINUTE = 10;\r\n\r\nlet callCounter = 0;\r\nlet windowStartMs = 0;\r\nlet samplesThisWindow = 0;\r\n\r\n/**\r\n * Should THIS call fire an off-box count_tokens sample? Combines a 1-in-N\r\n * counter with a rolling per-minute cap. Pure in-memory bookkeeping; never\r\n * throws, never blocks.\r\n */\r\nexport function shouldSample(now: number = Date.now()): boolean {\r\n // Roll the per-minute window.\r\n if (now - windowStartMs >= 60_000) {\r\n windowStartMs = now;\r\n samplesThisWindow = 0;\r\n }\r\n callCounter += 1;\r\n if (callCounter % SAMPLE_EVERY !== 0) return false;\r\n if (samplesThisWindow >= MAX_SAMPLES_PER_MINUTE) return false;\r\n samplesThisWindow += 1;\r\n return true;\r\n}\r\n\r\n/** Reset the in-memory sampling counters. Test-only seam; cheap + side-effect-free. */\r\nexport function _resetSamplingForTest(): void {\r\n callCounter = 0;\r\n windowStartMs = 0;\r\n samplesThisWindow = 0;\r\n}\r\n\r\n// ── Apply a learned factor to a local approximation ──────────────────────────\r\n\r\n/** Result of {@link applyCalibration}: the adjusted count + its honest source. */\r\nexport interface CalibratedCount {\r\n tokens: number;\r\n source: Extract<ConfidenceSource, \"tokenizer-approx\" | \"tokenizer-calibrated\">;\r\n}\r\n\r\n/**\r\n * Adjust a locally-tokenized `approxTokens` count by the learned factor for\r\n * `family`. When a stored factor exists for the anthropic family, return the\r\n * scaled count labeled \"tokenizer-calibrated\"; otherwise pass the approximation\r\n * through unchanged as \"tokenizer-approx\". Pure: reads the factor store but\r\n * mutates nothing.\r\n */\r\nexport function applyCalibration(\r\n approxTokens: number,\r\n family: ModelFamily,\r\n factors: CalibrationFactors = loadFactors(),\r\n): CalibratedCount {\r\n if (family === \"anthropic\") {\r\n const f = factors[family];\r\n if (f !== undefined && f.samples > 0 && Number.isFinite(f.factor) && f.factor > 0) {\r\n return {\r\n tokens: Math.max(0, Math.round(approxTokens * f.factor)),\r\n source: \"tokenizer-calibrated\",\r\n };\r\n }\r\n }\r\n return { tokens: approxTokens, source: \"tokenizer-approx\" };\r\n}\r\n\r\n/** The model used for a family's count_tokens sample (anthropic → default model). */\r\nexport function modelForFamily(_family: ModelFamily): string {\r\n return DEFAULT_ANTHROPIC_MODEL;\r\n}\r\n","/**\r\n * telemetry/proxy — the telemetry-wrapping MCP stdio proxy.\r\n *\r\n * `agent-connector serve <command> <args…>` spawns the developer's REAL MCP\r\n * server as a child and sits transparently between the host and that server,\r\n * speaking the MCP stdio wire format: NEWLINE-DELIMITED JSON-RPC (one single-line\r\n * JSON object per message, terminated by `\\n`; stdio has NO Content-Length\r\n * framing). Bytes are forwarded VERBATIM in both directions so the proxy can\r\n * never corrupt the stream; a side line-buffer tees a COPY of each direction,\r\n * parses complete messages, and measures per-tool token usage out of band.\r\n *\r\n * Honesty / safety rules baked in here:\r\n * • Forwarding always happens FIRST. Measurement runs after the bytes are out\r\n * the door and is wrapped so a measurement bug can never break a tool call.\r\n * • Telemetry stores AGGREGATE COUNTS ONLY — the parsed `tools/call` arguments\r\n * and results are tokenized and discarded; raw content is never persisted.\r\n * • AGENT_CONNECTOR_TELEMETRY=0 → still proxy transparently, skip all measure.\r\n *\r\n * The proxy resolves with the child's exit code and propagates SIGINT/SIGTERM.\r\n */\r\n\r\nimport type { PlatformId } from \"../core/types.js\";\r\nimport { spawnChild } from \"../core/spawn-child.js\";\r\nimport { type JsonRpcMessage, LineBuffer, idKey, isObject } from \"./jsonrpc.js\";\r\nimport {\r\n applyCalibration,\r\n countTokensAnthropic,\r\n isCalibrationEnabled,\r\n modelForFamily,\r\n recordSample,\r\n shouldSample,\r\n} from \"./calibration.js\";\r\nimport { measureToolCall, measureToolDefs } from \"./measure.js\";\r\nimport { newRecordId } from \"./store.js\";\r\nimport { inferModelFamily } from \"./tokenizer.js\";\r\nimport type {\r\n ConfidenceSource,\r\n LaunchMethod,\r\n ModelFamily,\r\n TelemetryInstallScope,\r\n TelemetryStore,\r\n Tokenizer,\r\n ToolEventRecord,\r\n} from \"./types.js\";\r\n\r\n/** Options for {@link runServeProxy}. */\r\nexport interface RunServeProxyOptions {\r\n /** Connector id this server belongs to (stamped on every record). */\r\n connectorId: string;\r\n /** The real MCP server executable to spawn. */\r\n command: string;\r\n /** Arguments passed to that executable. */\r\n args: string[];\r\n /** Where measured records are appended. */\r\n store: TelemetryStore;\r\n /** Tokenizer used for measurement (defaults baked into measure helpers). */\r\n tokenizer: Tokenizer;\r\n /**\r\n * Telemetry model-family hint. \"auto\" infers the family from the MCP client's\r\n * `initialize` clientInfo.name; any explicit family wins outright.\r\n */\r\n modelFamilyHint: \"auto\" | ModelFamily;\r\n /** Host platform executing this proxy (stamped on every record). */\r\n hostPlatform: PlatformId;\r\n /** Host session id (stamped on every record). */\r\n sessionId: string;\r\n /** Hashed stable project identity (stamped on every record). */\r\n projectKey: string;\r\n /** Human-readable project directory (stamped on every record). */\r\n projectDir: string;\r\n /** When true, tokenize the `tools/list` schema once → tool-defs overhead. */\r\n measureToolDefs: boolean;\r\n /**\r\n * Install scope (global user vs project-local) stamped on every record.\r\n * OPTIONAL: omitted for configs written before scope plumbing existed, leaving\r\n * the field off the row so it reads as \"unknown\".\r\n */\r\n installScope?: TelemetryInstallScope;\r\n /**\r\n * How the wrapped server was launched (npx/bunx/uvx/node/binary/http), stamped\r\n * on every record. OPTIONAL for the same backward-compat reason as above.\r\n */\r\n launchMethod?: LaunchMethod;\r\n}\r\n\r\n// ── JSON-RPC shapes we read (kept local + narrow; everything else opaque) ─────\r\n\r\n/** A client→server `tools/call` we remember until its result comes back. */\r\ninterface PendingCall {\r\n toolName: string;\r\n args: unknown;\r\n}\r\n\r\n/**\r\n * Canonical string form of a tool call's arguments for an off-box count_tokens\r\n * sample — mirrors the tokenizer's own serialization so the sampled text equals\r\n * the bytes we approximated locally. A string passes through; anything else is\r\n * JSON-stringified; a value that stringifies to undefined becomes \"\".\r\n */\r\nfunction canonicalArgs(value: unknown): string {\r\n if (typeof value === \"string\") return value;\r\n try {\r\n return JSON.stringify(value) ?? \"\";\r\n } catch {\r\n return \"\";\r\n }\r\n}\r\n\r\n/**\r\n * Run the telemetry-wrapping MCP stdio proxy.\r\n *\r\n * Spawns `command args` with piped stdin/stdout (stderr inherited), forwards\r\n * both directions byte-for-byte, and measures `tools/call` round-trips and the\r\n * one-time `tools/list` tool-defs overhead into `store`. Resolves with the\r\n * child's exit code (or a signal-derived code) once the child closes.\r\n */\r\nexport async function runServeProxy(\r\n opts: RunServeProxyOptions,\r\n): Promise<number> {\r\n const {\r\n connectorId,\r\n command,\r\n args,\r\n store,\r\n tokenizer,\r\n modelFamilyHint,\r\n hostPlatform,\r\n sessionId,\r\n projectKey,\r\n projectDir,\r\n measureToolDefs: shouldMeasureToolDefs,\r\n installScope,\r\n launchMethod,\r\n } = opts;\r\n\r\n // Global kill switch: still proxy transparently, but skip ALL measurement.\r\n const measuringEnabled = process.env.AGENT_CONNECTOR_TELEMETRY !== \"0\";\r\n // OPT-IN Anthropic count_tokens calibration. Resolved once per session — the\r\n // gate (AGENT_CONNECTOR_CALIBRATE + ANTHROPIC_API_KEY) is process-level and\r\n // does not change mid-session. Off by default; privacy-safe.\r\n const calibrationEnabled = isCalibrationEnabled();\r\n\r\n // spawnChild fixes native-Windows package-runner launches: a bare npx/uvx\r\n // resolves to a .cmd shim that raw CreateProcess can't find/launch, so it is\r\n // run via a quoted single command line with a shell. No-op on macOS/Linux.\r\n const child = spawnChild(command, args, {\r\n stdio: [\"pipe\", \"pipe\", \"inherit\"],\r\n env: process.env,\r\n });\r\n\r\n // ── Per-session measurement state ───────────────────────────────────────\r\n // Family resolved from the client's `initialize` (or the hint) and cached.\r\n let family: ModelFamily = inferModelFamily(\"\", modelFamilyHint);\r\n // Outstanding tools/call requests, keyed by JSON-RPC id.\r\n const pending = new Map<string, PendingCall>();\r\n // Monotonic sequence so two records in the same ms still get distinct ids.\r\n let seq = 0;\r\n // tools/list overhead is measured exactly once per session.\r\n let toolDefsMeasured = false;\r\n\r\n /**\r\n * Build a base record stamped with the per-session identity fields plus the\r\n * scope dimensions. `installScope` / `launchMethod` are spread in ONLY when\r\n * defined, so a session without them leaves those fields off the row entirely\r\n * (read as \"unknown\") rather than writing an explicit `undefined`.\r\n */\r\n function baseRecord(): Omit<\r\n ToolEventRecord,\r\n \"toolName\" | \"scope\" | \"inputTokens\" | \"outputTokens\" | \"confidenceSource\" | \"isError\"\r\n > {\r\n return {\r\n id: newRecordId(seq++),\r\n ts: Date.now(),\r\n connectorId,\r\n hostPlatform,\r\n sessionId,\r\n projectKey,\r\n projectDir,\r\n ...(installScope !== undefined ? { installScope } : {}),\r\n ...(launchMethod !== undefined ? { launchMethod } : {}),\r\n };\r\n }\r\n\r\n /**\r\n * Inspect one parsed CLIENT→SERVER message. Caches the model family on\r\n * `initialize` and remembers `tools/call` requests so their results can be\r\n * measured when they come back. Never throws into the data path.\r\n */\r\n function onClientMessage(msg: JsonRpcMessage): void {\r\n const method = msg.method;\r\n if (method === \"initialize\") {\r\n const params = isObject(msg.params) ? msg.params : undefined;\r\n const clientInfo =\r\n params && isObject(params[\"clientInfo\"])\r\n ? (params[\"clientInfo\"] as Record<string, unknown>)\r\n : undefined;\r\n const clientName =\r\n clientInfo && typeof clientInfo[\"name\"] === \"string\"\r\n ? (clientInfo[\"name\"] as string)\r\n : \"\";\r\n family = inferModelFamily(clientName, modelFamilyHint);\r\n return;\r\n }\r\n\r\n if (method === \"tools/call\") {\r\n const key = idKey(msg.id);\r\n if (key === null) return; // a call with no id has no result to match\r\n const params = isObject(msg.params) ? msg.params : undefined;\r\n const toolName =\r\n params && typeof params[\"name\"] === \"string\"\r\n ? (params[\"name\"] as string)\r\n : \"unknown\";\r\n const callArgs = params ? params[\"arguments\"] : undefined;\r\n pending.set(key, { toolName, args: callArgs });\r\n }\r\n }\r\n\r\n /**\r\n * Inspect one parsed SERVER→CLIENT message. Matches `tools/call` results to\r\n * remembered requests and measures them; measures `tools/list` results once.\r\n * Never throws into the data path.\r\n */\r\n function onServerMessage(msg: JsonRpcMessage): void {\r\n const key = idKey(msg.id);\r\n if (key === null) return; // notifications carry no id we can correlate\r\n\r\n const pendingCall = pending.get(key);\r\n if (pendingCall !== undefined) {\r\n pending.delete(key);\r\n recordToolCall(pendingCall, msg);\r\n return;\r\n }\r\n\r\n // Not a tracked tools/call — it may be the tools/list result we measure\r\n // once for the fixed tool-definition overhead.\r\n if (shouldMeasureToolDefs && !toolDefsMeasured) {\r\n const result = isObject(msg.result) ? msg.result : undefined;\r\n const tools = result ? result[\"tools\"] : undefined;\r\n if (Array.isArray(tools)) {\r\n recordToolDefs(tools);\r\n }\r\n }\r\n }\r\n\r\n /** Measure a matched tools/call round-trip and append the record. */\r\n function recordToolCall(call: PendingCall, response: JsonRpcMessage): void {\r\n const hasError = response.error !== undefined;\r\n const result = response.result;\r\n // A JSON-RPC error has no `result`; measure against an empty object so the\r\n // input (args) tokens are still recorded honestly.\r\n const resultForMeasure = hasError ? {} : result;\r\n const measurement = measureToolCall(\r\n call.args,\r\n resultForMeasure,\r\n family,\r\n tokenizer,\r\n );\r\n\r\n // OPT-IN calibration: for an anthropic session, nudge the locally-tokenized\r\n // approx counts toward Anthropic's real numbers via the learned factor, and\r\n // fire a sampled off-box count_tokens to keep that factor fresh. Both steps\r\n // are best-effort and wrapped so they can never break the record path.\r\n let inputTokens = measurement.inputTokens;\r\n let outputTokens = measurement.outputTokens;\r\n let confidenceSource: ConfidenceSource = measurement.source;\r\n if (calibrationEnabled && family === \"anthropic\") {\r\n try {\r\n ({ inputTokens, outputTokens, confidenceSource } = calibrateCounts(\r\n measurement.inputTokens,\r\n measurement.outputTokens,\r\n measurement.source,\r\n ));\r\n maybeSampleCalibration(call.args, measurement.inputTokens);\r\n } catch {\r\n // Calibration is a non-essential enrichment — fall back to the raw\r\n // measurement values already captured above.\r\n }\r\n }\r\n\r\n // MCP signals a tool-level failure via result.isError===true; a JSON-RPC\r\n // protocol error (response.error) is also a failure.\r\n const resultIsError =\r\n isObject(result) && result[\"isError\"] === true;\r\n store.append({\r\n ...baseRecord(),\r\n toolName: call.toolName,\r\n scope: \"call\",\r\n inputTokens,\r\n outputTokens,\r\n confidenceSource,\r\n isError: hasError || resultIsError,\r\n });\r\n }\r\n\r\n /**\r\n * Apply the learned anthropic factor to the approx input/output counts. Only\r\n * a `tokenizer-approx` measurement is calibratable (a heuristic fallback or\r\n * host-native count is left exactly as-is); the combined source becomes\r\n * `tokenizer-calibrated` only when at least one side was actually scaled.\r\n */\r\n function calibrateCounts(\r\n rawIn: number,\r\n rawOut: number,\r\n rawSource: ConfidenceSource,\r\n ): { inputTokens: number; outputTokens: number; confidenceSource: ConfidenceSource } {\r\n if (rawSource !== \"tokenizer-approx\") {\r\n return { inputTokens: rawIn, outputTokens: rawOut, confidenceSource: rawSource };\r\n }\r\n const cin = applyCalibration(rawIn, family);\r\n const cout = applyCalibration(rawOut, family);\r\n const calibrated =\r\n cin.source === \"tokenizer-calibrated\" || cout.source === \"tokenizer-calibrated\";\r\n return {\r\n inputTokens: cin.tokens,\r\n outputTokens: cout.tokens,\r\n confidenceSource: calibrated ? \"tokenizer-calibrated\" : \"tokenizer-approx\",\r\n };\r\n }\r\n\r\n /**\r\n * On a SAMPLED call, fire-and-forget an off-box count_tokens for the call's\r\n * input args and fold the resulting exact/approx ratio into the learned\r\n * factor. Returns immediately — the network round-trip never blocks\r\n * forwarding or measurement. Fail-open: any error is swallowed.\r\n */\r\n function maybeSampleCalibration(args: unknown, approxInputTokens: number): void {\r\n if (approxInputTokens <= 0) return; // nothing to ratio against\r\n if (!shouldSample()) return;\r\n const text = canonicalArgs(args);\r\n if (text === \"\") return;\r\n // Detached promise — intentionally NOT awaited so the proxy never blocks on\r\n // the network. Errors are handled inside countTokensAnthropic (returns null)\r\n // and the .catch is a belt-and-braces guard against an unhandled rejection.\r\n void countTokensAnthropic(text, modelForFamily(family))\r\n .then((exact) => {\r\n if (exact !== null && exact > 0) {\r\n recordSample(family, exact / approxInputTokens);\r\n }\r\n })\r\n .catch(() => {\r\n /* fail-open: a calibration sample must never surface an error */\r\n });\r\n }\r\n\r\n /** Measure the one-time tools/list overhead and append the record. */\r\n function recordToolDefs(tools: readonly unknown[]): void {\r\n toolDefsMeasured = true;\r\n const count = measureToolDefs(tools, family, tokenizer);\r\n store.append({\r\n ...baseRecord(),\r\n toolName: \"*\",\r\n scope: \"tool_defs\",\r\n inputTokens: count.tokens,\r\n outputTokens: 0,\r\n confidenceSource: count.source,\r\n isError: false,\r\n });\r\n }\r\n\r\n /** Parse one NDJSON line and route it, swallowing any measurement error. */\r\n function handleLine(line: string, direction: \"client\" | \"server\"): void {\r\n if (!measuringEnabled) return;\r\n let msg: JsonRpcMessage;\r\n try {\r\n const parsed = JSON.parse(line) as unknown;\r\n if (!isObject(parsed)) return;\r\n msg = parsed as JsonRpcMessage;\r\n } catch {\r\n return; // not a complete/valid JSON message — ignore for telemetry\r\n }\r\n try {\r\n if (direction === \"client\") onClientMessage(msg);\r\n else onServerMessage(msg);\r\n } catch {\r\n // Measurement must NEVER break the proxy. Drop the record silently.\r\n }\r\n }\r\n\r\n const clientLines = new LineBuffer((line) => handleLine(line, \"client\"));\r\n const serverLines = new LineBuffer((line) => handleLine(line, \"server\"));\r\n\r\n // ── Transparent byte forwarding (host stdin → child stdin) ───────────────\r\n // Forward VERBATIM first, then tee a copy into the line buffer to measure.\r\n // Honor backpressure: if the child's stdin buffer is full, pause the host\r\n // stdin and resume on drain so a slow server can't make us buffer unboundedly.\r\n process.stdin.on(\"data\", (chunk: Buffer) => {\r\n if (child.stdin && child.stdin.writable) {\r\n const ok = child.stdin.write(chunk);\r\n if (!ok) {\r\n process.stdin.pause();\r\n child.stdin.once(\"drain\", () => process.stdin.resume());\r\n }\r\n }\r\n if (measuringEnabled) {\r\n try {\r\n clientLines.push(chunk);\r\n } catch {\r\n /* tee side-channel must never affect forwarding */\r\n }\r\n }\r\n });\r\n process.stdin.on(\"end\", () => {\r\n if (child.stdin && !child.stdin.destroyed) child.stdin.end();\r\n });\r\n\r\n // ── Transparent byte forwarding (child stdout → host stdout) ─────────────\r\n if (child.stdout) {\r\n const childStdout = child.stdout;\r\n childStdout.on(\"data\", (chunk: Buffer) => {\r\n const ok = process.stdout.write(chunk);\r\n if (!ok) {\r\n childStdout.pause();\r\n process.stdout.once(\"drain\", () => childStdout.resume());\r\n }\r\n if (measuringEnabled) {\r\n try {\r\n serverLines.push(chunk);\r\n } catch {\r\n /* tee side-channel must never affect forwarding */\r\n }\r\n }\r\n });\r\n }\r\n\r\n // ── Signal propagation: forward SIGINT/SIGTERM to the child ──────────────\r\n const forwardSignal = (signal: NodeJS.Signals): void => {\r\n try {\r\n if (!child.killed) child.kill(signal);\r\n } catch {\r\n /* child may already be gone */\r\n }\r\n };\r\n const onSigint = (): void => forwardSignal(\"SIGINT\");\r\n const onSigterm = (): void => forwardSignal(\"SIGTERM\");\r\n process.on(\"SIGINT\", onSigint);\r\n process.on(\"SIGTERM\", onSigterm);\r\n\r\n // ── Resolve with the child's exit code (or signal-derived code) ──────────\r\n return await new Promise<number>((resolve) => {\r\n const finish = (code: number): void => {\r\n process.removeListener(\"SIGINT\", onSigint);\r\n process.removeListener(\"SIGTERM\", onSigterm);\r\n try {\r\n store.close();\r\n } catch {\r\n /* best-effort flush */\r\n }\r\n resolve(code);\r\n };\r\n\r\n child.on(\"error\", () => {\r\n // The server could not be spawned/launched. Surface a conventional\r\n // \"command not executable\" style failure code.\r\n finish(126);\r\n });\r\n\r\n child.on(\"close\", (code, signal) => {\r\n if (typeof code === \"number\") {\r\n finish(code);\r\n return;\r\n }\r\n // Killed by a signal → conventional 128 + signal number where known.\r\n if (signal) {\r\n const num = signalToNumber(signal);\r\n finish(num === undefined ? 1 : 128 + num);\r\n return;\r\n }\r\n finish(1);\r\n });\r\n });\r\n}\r\n\r\n/** Map the common termination signals to their numbers for exit-code math. */\r\nfunction signalToNumber(signal: NodeJS.Signals): number | undefined {\r\n const table: Partial<Record<NodeJS.Signals, number>> = {\r\n SIGINT: 2,\r\n SIGQUIT: 3,\r\n SIGKILL: 9,\r\n SIGTERM: 15,\r\n };\r\n return table[signal];\r\n}\r\n\r\nexport default runServeProxy;\r\n","/**\r\n * runtime/usage-event — the OPT-IN host-native turn-usage enricher (enricher 4a).\r\n *\r\n * Gemini CLI / Antigravity fire an `AfterModel` (Antigravity CLI: `PostInvocation`)\r\n * hook AFTER each model turn, whose stdin payload carries a `usageMetadata` block\r\n * with the host's OWN exact token accounting for that whole conversation turn:\r\n * { promptTokenCount, candidatesTokenCount, cachedContentTokenCount,\r\n * thoughtsTokenCount, totalTokenCount }\r\n * This is the single point in the whole matrix where a host reports REAL per-turn\r\n * usage to a command we control — so we record it as `confidenceSource:\"host-native\"`\r\n * (the top of CONFIDENCE_RANK), upgrading those rows from the serve-proxy estimate.\r\n *\r\n * DISTINCT, NEVER-SUMMED ORIGIN. Host-native turn usage is WHOLE-CONVERSATION, not\r\n * per-MCP. To avoid double-counting against (a) the per-MCP serve-proxy `call`\r\n * rows and (b) the usage-reader host-scan numbers, every record written here uses\r\n * the DISTINCT scope `\"model_turn\"`. The MCP leaderboard excludes that scope (just\r\n * as it special-cases `tool_defs`); the unified leaderboard surfaces it as its own\r\n * clearly-labeled section that is explicitly never added to the other two origins.\r\n *\r\n * PRIVACY + FAIL-OPEN. This enricher is OPT-IN at install time (see the adapters);\r\n * it stores AGGREGATE COUNTS ONLY (no raw content — the payload's prompt/response\r\n * text is never read). ANY parse / store / IO error degrades to exit 0 and records\r\n * NOTHING: a host-native usage hook must never break a model turn. This function\r\n * never throws.\r\n */\r\n\r\nimport { projectIdentity } from \"../core/paths.js\";\r\nimport { newRecordId, openStore } from \"../telemetry/store.js\";\r\nimport type { PlatformId } from \"../core/types.js\";\r\nimport type { ToolEventRecord } from \"../telemetry/types.js\";\r\n\r\n/** Flags + stdin the CLI hands to {@link runUsageEvent}. */\r\nexport interface RunUsageEventOptions {\r\n /** Host platform id from the command (`usage-event <platformId> …`). */\r\n platformId: string;\r\n /** Connector id from `--connector <id>` (stamped on the record). */\r\n connectorId: string;\r\n /** Raw stdin payload (host-native JSON). Empty string is tolerated → no record. */\r\n stdin: string;\r\n}\r\n\r\n/** Process-level result the CLI translates into an exit code. */\r\nexport interface RunUsageEventResult {\r\n /** Always 0 — a host-native usage hook must never block a model turn. */\r\n exitCode: number;\r\n /** True when a `model_turn` record was appended (false on any fail-open path). */\r\n recorded: boolean;\r\n}\r\n\r\n/** The never-records, never-throws result. */\r\nconst NOOP: RunUsageEventResult = { exitCode: 0, recorded: false };\r\n\r\nfunction isObject(v: unknown): v is Record<string, unknown> {\r\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\r\n}\r\n\r\n/** Coerce a value to a non-negative safe integer (NaN/negatives/floats → 0). */\r\nfunction toNonNegInt(v: unknown): number {\r\n const n = typeof v === \"number\" ? v : typeof v === \"string\" ? Number(v) : NaN;\r\n if (!Number.isFinite(n) || n < 0) return 0;\r\n return Math.floor(n);\r\n}\r\n\r\n/** First non-empty string among the given keys of an object. */\r\nfunction firstStr(obj: Record<string, unknown>, keys: readonly string[]): string | undefined {\r\n for (const k of keys) {\r\n const v = obj[k];\r\n if (typeof v === \"string\" && v.trim() !== \"\") return v;\r\n }\r\n return undefined;\r\n}\r\n\r\n/** Read a token field tolerant of both camelCase and snake_case spellings. */\r\nfunction tokenField(\r\n meta: Record<string, unknown>,\r\n keys: readonly string[],\r\n): number {\r\n for (const k of keys) {\r\n if (k in meta) return toNonNegInt(meta[k]);\r\n }\r\n return 0;\r\n}\r\n\r\n/** Locate the `usageMetadata` block under either spelling, top-level or nested. */\r\nfunction findUsageMetadata(root: Record<string, unknown>): Record<string, unknown> | undefined {\r\n for (const k of [\"usageMetadata\", \"usage_metadata\"]) {\r\n if (isObject(root[k])) return root[k] as Record<string, unknown>;\r\n }\r\n // Some hosts nest the model response (with its usage) under a `response` /\r\n // `modelResponse` envelope — probe one level down, best-effort.\r\n for (const k of [\"response\", \"modelResponse\", \"model_response\"]) {\r\n const nested = root[k];\r\n if (isObject(nested)) {\r\n for (const mk of [\"usageMetadata\", \"usage_metadata\"]) {\r\n if (isObject(nested[mk])) return nested[mk] as Record<string, unknown>;\r\n }\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/** A registered PlatformId, or \"unknown\" when the id is not one we know. */\r\nconst KNOWN_PLATFORMS: ReadonlySet<string> = new Set<PlatformId>([\r\n \"claude-code\", \"codex\", \"cursor\", \"vscode-copilot\", \"jetbrains-copilot\",\r\n \"copilot-cli\", \"gemini-cli\", \"opencode\", \"kilo\", \"kilo-cli\", \"warp\", \"hermes\",\r\n \"openclaw\", \"zed\", \"antigravity\", \"antigravity-cli\", \"kiro\", \"qwen-code\",\r\n \"kimi\", \"pi\", \"omp\", \"droid\", \"roo-code\", \"trae\", \"amp\", \"codebuff\", \"mux\",\r\n \"crush\", \"goose\", \"synthetic\", \"unknown\",\r\n]);\r\n\r\nfunction asPlatformId(id: string): PlatformId {\r\n return (KNOWN_PLATFORMS.has(id) ? id : \"unknown\") as PlatformId;\r\n}\r\n\r\n/**\r\n * Record one host-native model turn. Parses the host's `usageMetadata`, maps it to\r\n * a DISTINCT `model_turn` `ToolEventRecord` (confidence `host-native`, toolName\r\n * `\"*\"`), and appends it to the shared telemetry store. NEVER throws and never\r\n * blocks the turn: every failure path resolves to {@link NOOP} (exit 0, nothing\r\n * recorded).\r\n */\r\nexport async function runUsageEvent(\r\n opts: RunUsageEventOptions,\r\n): Promise<RunUsageEventResult> {\r\n try {\r\n // Global telemetry kill switch is honored by the store's append (no-op when\r\n // AGENT_CONNECTOR_TELEMETRY=0); we still parse cheaply and let append drop it.\r\n const trimmed = opts.stdin.trim();\r\n if (trimmed === \"\") return NOOP;\r\n\r\n let raw: unknown;\r\n try {\r\n raw = JSON.parse(trimmed);\r\n } catch {\r\n return NOOP; // malformed payload → fail-open, record nothing\r\n }\r\n if (!isObject(raw)) return NOOP;\r\n\r\n const meta = findUsageMetadata(raw);\r\n if (meta === undefined) return NOOP;\r\n\r\n const promptTokens = tokenField(meta, [\"promptTokenCount\", \"prompt_token_count\"]);\r\n const candidates = tokenField(meta, [\"candidatesTokenCount\", \"candidates_token_count\"]);\r\n const cached = tokenField(meta, [\"cachedContentTokenCount\", \"cached_content_token_count\"]);\r\n const thoughts = tokenField(meta, [\"thoughtsTokenCount\", \"thoughts_token_count\"]);\r\n\r\n // promptTokenCount is cache-INCLUSIVE (Gemini-family semantics, mirrored by\r\n // the antigravity-shared usage reader): net fresh input = prompt - cached.\r\n const inputTokens = Math.max(0, promptTokens - Math.min(cached, promptTokens));\r\n // Output = generated candidates + reasoning (\"thoughts\") tokens.\r\n const outputTokens = candidates + thoughts;\r\n\r\n // A turn with no measurable tokens is not worth a row.\r\n if (inputTokens === 0 && outputTokens === 0) return NOOP;\r\n\r\n // Identity: prefer payload session/cwd; fall back to process.cwd() for the\r\n // project key so a turn always lands in a stable project partition.\r\n const sessionId =\r\n firstStr(raw, [\"session_id\", \"sessionId\", \"conversationId\", \"conversation_id\"]) ?? \"\";\r\n const cwd = firstStr(raw, [\"cwd\", \"workspace\", \"projectDir\", \"project_dir\"]) ?? process.cwd();\r\n const id = projectIdentity(cwd);\r\n\r\n const record: ToolEventRecord = {\r\n id: newRecordId(0),\r\n ts: Date.now(),\r\n connectorId: opts.connectorId,\r\n toolName: \"*\",\r\n scope: \"model_turn\",\r\n hostPlatform: asPlatformId(opts.platformId),\r\n sessionId,\r\n projectKey: id.key,\r\n projectDir: id.dir,\r\n inputTokens,\r\n outputTokens,\r\n confidenceSource: \"host-native\",\r\n isError: false,\r\n };\r\n\r\n const store = openStore({});\r\n try {\r\n store.append(record);\r\n } finally {\r\n try {\r\n store.close();\r\n } catch {\r\n /* best-effort flush */\r\n }\r\n }\r\n return { exitCode: 0, recorded: true };\r\n } catch {\r\n // Fail-open: a host-native usage enricher must never surface an error.\r\n return NOOP;\r\n }\r\n}\r\n\r\nexport default runUsageEvent;\r\n","/**\r\n * runtime/statusline-entrypoint — the universal statusline (HUD) renderer.\r\n *\r\n * A statusline-supporting host points its status line config at the single stable\r\n * home binary (`<homeBin> statusline <platformId> --connector <id>`, built by\r\n * core/spawn.buildHomeBinStatuslineCommand). The CLI reads stdin and calls\r\n * {@link runStatusline} with the parsed flags + the raw stdin string. This module:\r\n *\r\n * 1. Loads the registered connector (live render handler) and the host adapter.\r\n * 2. Parses the host's raw status payload into a normalized StatuslineContext.\r\n * 3. Calls the connector's render(ctx) and coerces the result to a string.\r\n * 4. Formats the line into the host's native status reply (exit code + stdout).\r\n *\r\n * FAIL-SAFE is the contract (NOT fail-open with carve-outs like hooks): a status\r\n * line is decorative — it must NEVER wedge the host or spew an error/stack trace\r\n * into the status bar. So ANY error path — bad payload, missing connector,\r\n * throwing render, adapter without statusline support — returns exit 0 with NO\r\n * stdout (an empty status line), never a non-zero exit and never partial output.\r\n *\r\n * NOTE (follow-up): no telemetry is recorded for statusline renders in v1 (out of\r\n * scope). When added, it MUST stay inside the same fail-safe envelope.\r\n */\r\n\r\nimport type { PlatformId } from \"../core/types.js\";\r\nimport { log } from \"../core/logger.js\";\r\nimport {\r\n loadRegisteredConnector,\r\n readRegisteredMeta,\r\n} from \"../core/load-connector.js\";\r\nimport { loadAdapter } from \"../adapters/registry.js\";\r\nimport {\r\n attachLazyTelemetryUsage,\r\n buildTelemetryAccessor,\r\n} from \"./telemetry-accessor.js\";\r\n\r\n/** Flags + stdin the CLI hands to {@link runStatusline}. */\r\nexport interface RunStatuslineOptions {\r\n /** Host platform id from the command (`statusline <platformId> …`). */\r\n platformId: string;\r\n /** Connector id from `--connector <id>`. */\r\n connectorId: string;\r\n /** Raw stdin payload (host-native status JSON). Empty string is tolerated → `{}`. */\r\n stdin: string;\r\n}\r\n\r\n/** Process-level result the CLI translates into exit code + stdout/stderr. */\r\nexport interface RunStatuslineResult {\r\n exitCode: number;\r\n stdout?: string;\r\n stderr?: string;\r\n}\r\n\r\n/** The fail-safe result: exit 0, no output (an empty status line). */\r\nconst EMPTY: RunStatuslineResult = { exitCode: 0 };\r\n\r\n/**\r\n * Tolerantly parse the host's stdin payload. Empty / whitespace-only input is a\r\n * legitimate \"no payload\" signal and resolves to `{}`. Malformed JSON also\r\n * degrades to `{}` rather than throwing — fail-safe is the contract.\r\n */\r\nfunction parseStdin(stdin: string): unknown {\r\n const trimmed = stdin.trim();\r\n if (trimmed === \"\") return {};\r\n try {\r\n return JSON.parse(trimmed);\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Render one host status-line invocation. Always resolves (never rejects): every\r\n * failure path returns the empty {@link EMPTY} result so the CLI exits cleanly\r\n * with an empty status line. See the module header for the fail-safe contract.\r\n */\r\nexport async function runStatusline(\r\n opts: RunStatuslineOptions,\r\n): Promise<RunStatuslineResult> {\r\n const { platformId, connectorId, stdin } = opts;\r\n\r\n try {\r\n const connector = await loadRegisteredConnector(connectorId);\r\n const adapter = await loadAdapter(platformId);\r\n\r\n // Nothing to render: no statusline declared, or the host adapter has no\r\n // statusline runtime support (parse/format pair). Empty line, exit 0.\r\n if (\r\n !connector.statusline ||\r\n typeof connector.statusline.render !== \"function\" ||\r\n !adapter ||\r\n !adapter.parseStatusInput ||\r\n !adapter.formatStatusOutput\r\n ) {\r\n return EMPTY;\r\n }\r\n\r\n const raw = parseStdin(stdin);\r\n const ctx = adapter.parseStatusInput(raw);\r\n // The command carries the authoritative connector id; stamp it so render()\r\n // sees the connector it was dispatched for.\r\n ctx.connectorId = connectorId;\r\n // capabilities is REQUIRED on StatuslineContext. claude-code's parseStatusInput\r\n // sets it, but a future/third-party adapter could omit it — backfill so the\r\n // runtime guarantee matches the type (mirrors the simulate harness). Never\r\n // let render() see undefined capabilities while the type claims it is present.\r\n if (ctx.capabilities == null) ctx.capabilities = adapter.capabilities;\r\n // Recover the install scope from the registered metadata (sync) and stamp it\r\n // onto the ctx — scope is an install-time property the entrypoint has no\r\n // other access to. Undefined when the meta carries none. Also expose the\r\n // per-connector telemetry usage accessor (lazy, fail-safe to zeros).\r\n ctx.scope = readRegisteredMeta(connectorId)?.scope;\r\n ctx.telemetry = buildTelemetryAccessor(connectorId);\r\n // Keep `ctx.usage` synchronous for render functions, but compute it only if\r\n // the render actually reads the property. Status lines refresh frequently,\r\n // and the NDJSON backend has to scan the store for an all-time summary.\r\n attachLazyTelemetryUsage(ctx, connectorId);\r\n\r\n // Per-host render override: when rendering for host X, `hosts[X].render`\r\n // wins over the top-level render; a host not listed (or a per-host entry\r\n // that is somehow not a function) falls back to the top-level render.\r\n // Selection NEVER throws — fail-safe is preserved.\r\n const perHost = connector.statusline.hosts?.[platformId as PlatformId]?.render;\r\n const render =\r\n typeof perHost === \"function\" ? perHost : connector.statusline.render;\r\n\r\n const rendered = await render(ctx);\r\n // Coerce: a non-string return (number, accidental object) is stringified so\r\n // a misbehaving render never crashes the format step. null/undefined → \"\".\r\n const line = rendered == null ? \"\" : String(rendered);\r\n\r\n const reply = adapter.formatStatusOutput(line);\r\n return {\r\n exitCode: reply.exitCode,\r\n ...(reply.stdout !== undefined ? { stdout: reply.stdout } : {}),\r\n ...(reply.stderr !== undefined ? { stderr: reply.stderr } : {}),\r\n };\r\n } catch (err) {\r\n // FAIL-SAFE: a status line must never wedge the host or surface an error.\r\n // Log for diagnostics (stderr of the home binary — not the status bar) and\r\n // return the empty line.\r\n const message = err instanceof Error ? err.message : String(err);\r\n log.error(`statusline ${platformId} (${connectorId}) failed:`, message);\r\n return EMPTY;\r\n }\r\n}\r\n\r\nexport default runStatusline;\r\n","/**\r\n * runtime/action-entrypoint — the universal user-invokable action dispatcher.\r\n *\r\n * A future host affordance (slash command / keybinding) points at the single\r\n * stable home binary (`<homeBin> action <platformId> <actionId> --connector\r\n * <id>`, built by core/spawn.buildHomeBinActionCommand). The CLI parses the\r\n * flags and calls {@link runAction}. This module:\r\n *\r\n * 1. Loads the registered connector (live run handler) and the host adapter.\r\n * 2. Builds the shared {@link HostCtx} (host + the adapter's capabilities; NO\r\n * stdin — an action takes no host payload, unlike a hook or status line).\r\n * 3. Finds the action by id, resolves the per-host run override, runs it, and\r\n * prints the optional result.message.\r\n *\r\n * USER-TRIGGERED ERROR SEMANTICS (the key difference from hooks/statusline):\r\n * actions are invoked DELIBERATELY by a user, so errors are SURFACED, never\r\n * failed silently. An unknown action id or a throwing run → exit 1 + a stderr\r\n * message. (Hooks fail-open to exit 0; the statusline fail-safes to an empty\r\n * line — both are passive surfaces a host fires automatically. An action is not:\r\n * swallowing its failure would leave the user staring at nothing, unable to\r\n * tell the action ran.)\r\n *\r\n * NOTE (follow-up): no telemetry is recorded for action runs in v1 (out of\r\n * scope), and no adapter EMITS the affordance yet — v1 ships the dispatch\r\n * backbone only.\r\n */\r\n\r\nimport type {\r\n HostCtx,\r\n PlatformCapabilities,\r\n PlatformId,\r\n} from \"../core/types.js\";\r\nimport {\r\n loadRegisteredConnector,\r\n readRegisteredMeta,\r\n} from \"../core/load-connector.js\";\r\nimport { loadAdapter, REGISTERED_PLATFORM_IDS } from \"../adapters/registry.js\";\r\nimport { buildTelemetryAccessor } from \"./telemetry-accessor.js\";\r\n\r\n/** Flags the CLI hands to {@link runAction} (no stdin — actions take no payload). */\r\nexport interface RunActionOptions {\r\n /** Host platform id from the command (`action <platformId> <actionId> …`). */\r\n platformId: string;\r\n /** Connector id from `--connector <id>`. */\r\n connectorId: string;\r\n /** The action id positional (`action <platformId> <actionId> …`). */\r\n actionId: string;\r\n}\r\n\r\n/** Process-level result the CLI translates into exit code + stdout/stderr. */\r\nexport interface RunActionResult {\r\n exitCode: number;\r\n stdout?: string;\r\n stderr?: string;\r\n}\r\n\r\n/**\r\n * Minimal all-false capabilities for the fallback ctx when the host adapter is\r\n * unknown/unregistered. The action still runs (it takes no host payload), but\r\n * branching on `ctx.capabilities` reads every flag as off — no affordance is\r\n * advertised for a host we cannot describe.\r\n */\r\nconst EMPTY_CAPABILITIES: PlatformCapabilities = {\r\n preToolUse: false,\r\n postToolUse: false,\r\n preCompact: false,\r\n sessionStart: false,\r\n sessionEnd: false,\r\n userPromptSubmit: false,\r\n stop: false,\r\n notification: false,\r\n canModifyArgs: false,\r\n canModifyOutput: false,\r\n canInjectSessionContext: false,\r\n transports: [],\r\n};\r\n\r\n/**\r\n * Dispatch one user-invokable action. Always resolves (never rejects): every\r\n * path returns a concrete {@link RunActionResult} so the CLI can exit cleanly,\r\n * but UNLIKE the hook/statusline runtimes an error resolves to exit 1 + a stderr\r\n * message (actions are user-triggered — surface the failure). See the module\r\n * header for the user-triggered error contract.\r\n */\r\nexport async function runAction(\r\n opts: RunActionOptions,\r\n): Promise<RunActionResult> {\r\n const { platformId, connectorId, actionId } = opts;\r\n\r\n let connector;\r\n try {\r\n connector = await loadRegisteredConnector(connectorId);\r\n } catch (err) {\r\n // A user asked to run an action on a connector we cannot load — surface it\r\n // (do NOT fail-open: the user would otherwise see nothing and assume it ran).\r\n const message = err instanceof Error ? err.message : String(err);\r\n return { exitCode: 1, stderr: message };\r\n }\r\n\r\n const action = connector.actions.find((a) => a.id === actionId);\r\n if (!action) {\r\n return {\r\n exitCode: 1,\r\n stderr: `no action \"${actionId}\" on connector ${connectorId}`,\r\n };\r\n }\r\n\r\n // Build the shared HostCtx. capabilities come from the adapter; an unknown\r\n // adapter still runs with the minimal ctx (an action takes no host payload).\r\n const adapter = await loadAdapter(platformId).catch(() => undefined);\r\n const host: PlatformId = REGISTERED_PLATFORM_IDS.has(platformId as PlatformId)\r\n ? (platformId as PlatformId)\r\n : \"unknown\";\r\n const ctx: HostCtx = {\r\n host,\r\n capabilities: adapter?.capabilities ?? EMPTY_CAPABILITIES,\r\n // Recover the install scope from the registered metadata (sync) — scope is\r\n // an install-time property the entrypoint otherwise has no access to —\r\n // and expose the per-connector telemetry usage accessor (lazy, fail-safe).\r\n scope: readRegisteredMeta(connectorId)?.scope,\r\n telemetry: buildTelemetryAccessor(connectorId),\r\n };\r\n\r\n // Per-host run override: when running for host X, `hosts[X].run` wins over the\r\n // top-level run; a host not listed (or a per-host entry that is somehow not a\r\n // function) falls back to the top-level run.\r\n const perHost = action.hosts?.[platformId as PlatformId]?.run;\r\n const run = typeof perHost === \"function\" ? perHost : action.run;\r\n\r\n try {\r\n const result = await run(ctx);\r\n const message = result?.message;\r\n if (typeof message === \"string\" && message !== \"\") {\r\n return { exitCode: 0, stdout: message };\r\n }\r\n // void / no message → success with no output.\r\n return { exitCode: 0 };\r\n } catch (err) {\r\n // USER-TRIGGERED: a throwing action surfaces its failure (exit 1 + stderr),\r\n // never a silent fail-open. This is the documented difference from\r\n // hooks/statusline.\r\n const message = err instanceof Error ? err.message : String(err);\r\n return {\r\n exitCode: 1,\r\n stderr: `action \"${actionId}\" failed: ${message}`,\r\n };\r\n }\r\n}\r\n\r\nexport default runAction;\r\n"],"mappings":"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","names":["args","isObject"]}