@ken-jo/agent-connector 0.4.7 → 0.4.26

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 (271) hide show
  1. package/README.md +36 -24
  2. package/dist/{action-YCU53FNE.js → action-AZRZ3V7E.js} +14 -14
  3. package/dist/amazon-q-BWSOHTW5.js +571 -0
  4. package/dist/amazon-q-BWSOHTW5.js.map +1 -0
  5. package/dist/{amp-TULUPXXL.js → amp-BQZOL5GR.js} +2 -2
  6. package/dist/{amp-JPBQJJVM.js → amp-TF5X6OGH.js} +18 -50
  7. package/dist/amp-TF5X6OGH.js.map +1 -0
  8. package/dist/antigravity-3XHBPXZK.js +19 -0
  9. package/dist/{antigravity-STHZWMP3.js → antigravity-EA4L225L.js} +2 -2
  10. package/dist/{antigravity-cli-P6HADOAO.js → antigravity-cli-B2HXZFYQ.js} +2 -2
  11. package/dist/{antigravity-cli-D4PCCUG2.js → antigravity-cli-TJGOBUPK.js} +8 -7
  12. package/dist/{antigravity-cli-D4PCCUG2.js.map → antigravity-cli-TJGOBUPK.js.map} +1 -1
  13. package/dist/{chunk-CYOAH23F.js → chunk-25BNMXPP.js} +18 -18
  14. package/dist/{chunk-NLFPH4S2.js → chunk-2RPHDVHW.js} +2 -2
  15. package/dist/{chunk-PFDUGDOA.js → chunk-3I7UG52L.js} +25 -6
  16. package/dist/chunk-3I7UG52L.js.map +1 -0
  17. package/dist/{chunk-F5RX62T7.js → chunk-7QRUZAUG.js} +2 -2
  18. package/dist/{chunk-BCHWFTV4.js → chunk-F4DSMVZ7.js} +2 -2
  19. package/dist/chunk-FBJQGRET.js +38 -0
  20. package/dist/chunk-FBJQGRET.js.map +1 -0
  21. package/dist/{chunk-WZA4CSGJ.js → chunk-H53QZQJI.js} +15 -2
  22. package/dist/chunk-H53QZQJI.js.map +1 -0
  23. package/dist/{chunk-2F5QH3D4.js → chunk-HU6DZZBG.js} +36 -36
  24. package/dist/{chunk-7ECYDK5T.js → chunk-HZDU3J4U.js} +10 -5
  25. package/dist/chunk-HZDU3J4U.js.map +1 -0
  26. package/dist/{chunk-7L6ITC4T.js → chunk-IEGR4TP3.js} +22 -6
  27. package/dist/chunk-IEGR4TP3.js.map +1 -0
  28. package/dist/{chunk-SCVBYSF7.js → chunk-IRUYJD23.js} +28 -28
  29. package/dist/{chunk-6RYPUR6O.js → chunk-IW46JIQM.js} +34 -44
  30. package/dist/chunk-IW46JIQM.js.map +1 -0
  31. package/dist/{chunk-WFXWJITA.js → chunk-JLMD3IGK.js} +2 -2
  32. package/dist/{chunk-TZQBASI7.js → chunk-KD4BE5MW.js} +13 -49
  33. package/dist/chunk-KD4BE5MW.js.map +1 -0
  34. package/dist/{chunk-FAHIMJRU.js → chunk-L7ESV37V.js} +2 -2
  35. package/dist/{chunk-JNM3TPLX.js → chunk-LETB5HCK.js} +2 -2
  36. package/dist/{chunk-G5CQHVQG.js → chunk-M3H7PQWT.js} +13 -16
  37. package/dist/chunk-M3H7PQWT.js.map +1 -0
  38. package/dist/{chunk-JWNT5KW7.js → chunk-O7SDRBVB.js} +3 -1
  39. package/dist/chunk-O7SDRBVB.js.map +1 -0
  40. package/dist/{chunk-YQLQJZ7S.js → chunk-OLI5SD6I.js} +8 -4
  41. package/dist/chunk-OLI5SD6I.js.map +1 -0
  42. package/dist/{chunk-SDPIT4HW.js → chunk-Q5HR4ADS.js} +2 -2
  43. package/dist/{chunk-TRQKHP7D.js → chunk-QY42WGBX.js} +23 -2
  44. package/dist/chunk-QY42WGBX.js.map +1 -0
  45. package/dist/{chunk-I5MLE6S7.js → chunk-TO57WYBB.js} +15 -1
  46. package/dist/chunk-TO57WYBB.js.map +1 -0
  47. package/dist/chunk-UM5S7DKK.js +33 -0
  48. package/dist/chunk-UM5S7DKK.js.map +1 -0
  49. package/dist/{chunk-MDNX7HTN.js → chunk-YEJCNOET.js} +4 -4
  50. package/dist/{chunk-HAIMYUEY.js → chunk-YKVNI44Y.js} +51 -28
  51. package/dist/chunk-YKVNI44Y.js.map +1 -0
  52. package/dist/{chunk-DT6Y7XBI.js → chunk-YRBFSZ2G.js} +17 -39
  53. package/dist/chunk-YRBFSZ2G.js.map +1 -0
  54. package/dist/{chunk-SPWFUHHK.js → chunk-ZVTPSV5Z.js} +11 -10
  55. package/dist/{chunk-SPWFUHHK.js.map → chunk-ZVTPSV5Z.js.map} +1 -1
  56. package/dist/{chunk-N6HH7K6P.js → chunk-ZY25RG4Y.js} +2 -2
  57. package/dist/{claude-code-ROSIILTM.js → claude-code-JLPFUZ4V.js} +18 -41
  58. package/dist/claude-code-JLPFUZ4V.js.map +1 -0
  59. package/dist/{claude-code-W74MNTAC.js → claude-code-NMRKTAP7.js} +2 -2
  60. package/dist/cli/sdk.js +7 -7
  61. package/dist/cli.js +1 -1
  62. package/dist/{cline-JUTO4V27.js → cline-GBP3EVSX.js} +17 -49
  63. package/dist/cline-GBP3EVSX.js.map +1 -0
  64. package/dist/{codebuff-3PMZJJHP.js → codebuff-ETYT5UBL.js} +2 -2
  65. package/dist/{codebuff-2QUHL6HO.js → codebuff-WMKFUVER.js} +11 -42
  66. package/dist/codebuff-WMKFUVER.js.map +1 -0
  67. package/dist/{codex-YBBTIDD4.js → codex-5CZR5XKX.js} +28 -64
  68. package/dist/codex-5CZR5XKX.js.map +1 -0
  69. package/dist/{codex-Q3ATRRX3.js → codex-YAORPCOD.js} +2 -2
  70. package/dist/{continue-W4TU4JSB.js → continue-3AGXWM5W.js} +12 -35
  71. package/dist/continue-3AGXWM5W.js.map +1 -0
  72. package/dist/{copilot-cli-Y74SOP5G.js → copilot-cli-IH4P3GRZ.js} +17 -66
  73. package/dist/copilot-cli-IH4P3GRZ.js.map +1 -0
  74. package/dist/{copilot-cli-SJGIXVSD.js → copilot-cli-MZTAWMPW.js} +2 -2
  75. package/dist/{crush-GMEWLXK5.js → crush-FDBL3JEK.js} +17 -44
  76. package/dist/crush-FDBL3JEK.js.map +1 -0
  77. package/dist/{crush-LN5QFFR2.js → crush-QBXLNN7T.js} +2 -2
  78. package/dist/{cursor-QZ6MTO74.js → cursor-DIW43TRZ.js} +2 -2
  79. package/dist/{cursor-JBS4B3Q4.js → cursor-R5QB4YR4.js} +15 -53
  80. package/dist/cursor-R5QB4YR4.js.map +1 -0
  81. package/dist/{detect-2NIXILMZ.js → detect-L5OZPVFO.js} +4 -4
  82. package/dist/{doctor-QWJBWALA.js → doctor-WDIQ2YFE.js} +16 -15
  83. package/dist/{doctor-QWJBWALA.js.map → doctor-WDIQ2YFE.js.map} +1 -1
  84. package/dist/{droid-W5WF5XEX.js → droid-U3ZBLQFO.js} +2 -2
  85. package/dist/{droid-TJMTNCQE.js → droid-X2QHQL7D.js} +19 -42
  86. package/dist/droid-X2QHQL7D.js.map +1 -0
  87. package/dist/{gemini-cli-RAONGZRG.js → gemini-cli-HCN7XKSX.js} +17 -65
  88. package/dist/gemini-cli-HCN7XKSX.js.map +1 -0
  89. package/dist/{gemini-cli-CIRW37TU.js → gemini-cli-NMVVBO3K.js} +2 -2
  90. package/dist/{goose-A3M5GODH.js → goose-64V46Y2W.js} +2 -2
  91. package/dist/{goose-G4KKM6YU.js → goose-ILMM76JP.js} +21 -57
  92. package/dist/goose-ILMM76JP.js.map +1 -0
  93. package/dist/{hermes-ZYLMOFLZ.js → hermes-F3EGTK6N.js} +2 -2
  94. package/dist/{hermes-PJDTJE6F.js → hermes-YX2ODUZL.js} +17 -55
  95. package/dist/hermes-YX2ODUZL.js.map +1 -0
  96. package/dist/{hook-FDGIQPRC.js → hook-JRDQ56BN.js} +14 -14
  97. package/dist/index.d.ts +2 -2
  98. package/dist/index.js +5 -5
  99. package/dist/{install-TLG3QVP3.js → install-HRCVPRAQ.js} +16 -15
  100. package/dist/{install-TLG3QVP3.js.map → install-HRCVPRAQ.js.map} +1 -1
  101. package/dist/{introspect-Cn3MSA4_.d.ts → introspect-B164-hj3.d.ts} +1 -1
  102. package/dist/{jetbrains-copilot-DNXSLQE5.js → jetbrains-copilot-QESFUN6W.js} +12 -39
  103. package/dist/jetbrains-copilot-QESFUN6W.js.map +1 -0
  104. package/dist/{kilo-FERJ3X46.js → kilo-POTCYIRG.js} +28 -92
  105. package/dist/kilo-POTCYIRG.js.map +1 -0
  106. package/dist/{kilo-NSWAVP6P.js → kilo-SW7BH6EG.js} +2 -2
  107. package/dist/{kilo-cli-TDCONH5G.js → kilo-cli-MO6FSMH2.js} +19 -50
  108. package/dist/kilo-cli-MO6FSMH2.js.map +1 -0
  109. package/dist/{kilo-cli-EVBKUODA.js → kilo-cli-ZF272ZHN.js} +2 -2
  110. package/dist/{kimi-EI3UM3ZV.js → kimi-5FHEXGZD.js} +72 -13
  111. package/dist/kimi-5FHEXGZD.js.map +1 -0
  112. package/dist/{kimi-RIRD4J5J.js → kimi-RXS36OJP.js} +36 -50
  113. package/dist/kimi-RXS36OJP.js.map +1 -0
  114. package/dist/{kiro-X7JVLAN7.js → kiro-VTLX7CMF.js} +12 -33
  115. package/dist/kiro-VTLX7CMF.js.map +1 -0
  116. package/dist/{kiro-UCLSLBW2.js → kiro-WGOI5CGT.js} +2 -2
  117. package/dist/{leaderboard-MXGENYXN.js → leaderboard-ASGR3E2U.js} +6 -6
  118. package/dist/{mimo-code-RFLQ727H.js → mimo-code-F4BWMESO.js} +57 -91
  119. package/dist/mimo-code-F4BWMESO.js.map +1 -0
  120. package/dist/{mux-D77HBSBU.js → mux-2YFCYFM7.js} +11 -41
  121. package/dist/mux-2YFCYFM7.js.map +1 -0
  122. package/dist/{mux-ZMLVAXOO.js → mux-XM6AP35L.js} +2 -2
  123. package/dist/{nemoclaw-LXUTMR56.js → nemoclaw-QDB6O22A.js} +7 -7
  124. package/dist/{omp-CO7IXURG.js → omp-P2JNAEPN.js} +18 -50
  125. package/dist/omp-P2JNAEPN.js.map +1 -0
  126. package/dist/openclaw-3UMBSSZM.js +18 -0
  127. package/dist/{openclaw-IYA7ASL6.js → openclaw-5EQFGOWL.js} +2 -2
  128. package/dist/{opencode-QKZ5EIYU.js → opencode-Q6H4YT66.js} +24 -90
  129. package/dist/opencode-Q6H4YT66.js.map +1 -0
  130. package/dist/{opencode-HWT3RSMN.js → opencode-QGP4ALQY.js} +2 -2
  131. package/dist/{package-IA56LSC3.js → package-IXBSG7HD.js} +11 -11
  132. package/dist/{pi-UFX2OYFV.js → pi-GGDQREVG.js} +2 -2
  133. package/dist/{pi-YGBXYWY5.js → pi-GW25LPC3.js} +6 -6
  134. package/dist/{qwen-code-W7NUCDEN.js → qwen-code-GQILBJ5B.js} +2 -2
  135. package/dist/{qwen-code-E2MSEZK6.js → qwen-code-R6XXEEHJ.js} +13 -34
  136. package/dist/qwen-code-R6XXEEHJ.js.map +1 -0
  137. package/dist/{roo-code-AGGJ473T.js → roo-code-EZPNFC5V.js} +17 -54
  138. package/dist/roo-code-EZPNFC5V.js.map +1 -0
  139. package/dist/{roo-code-ZLKH4A7N.js → roo-code-SUWI4BBN.js} +2 -2
  140. package/dist/runtime/index.d.ts +1 -1
  141. package/dist/runtime/index.js +12 -12
  142. package/dist/sdk/index.d.ts +3 -3
  143. package/dist/sdk/index.js +6 -6
  144. package/dist/sdk/test.d.ts +2 -2
  145. package/dist/sdk/test.js +9 -9
  146. package/dist/{serve-RNUCK5F7.js → serve-CFBQYKRB.js} +14 -14
  147. package/dist/{status-JOX6RLJU.js → status-ASBFEFQQ.js} +11 -10
  148. package/dist/{status-JOX6RLJU.js.map → status-ASBFEFQQ.js.map} +1 -1
  149. package/dist/{statusline-ZVFI5DRT.js → statusline-WKLWSM7I.js} +13 -13
  150. package/dist/{synthetic-UKR6SMGS.js → synthetic-6FRA7P5Q.js} +2 -2
  151. package/dist/{telemetry-3FN6HDVU.js → telemetry-64GCGNIW.js} +10 -10
  152. package/dist/{trae-6L226ZDU.js → trae-6VQW2UVP.js} +12 -41
  153. package/dist/trae-6VQW2UVP.js.map +1 -0
  154. package/dist/{trae-PA26DPBW.js → trae-CPPYASR2.js} +2 -2
  155. package/dist/{types-_6arHbX9.d.ts → types-COSBYpKs.d.ts} +7 -5
  156. package/dist/{uninstall-SCKZYB4J.js → uninstall-KDJYE5ET.js} +16 -15
  157. package/dist/{uninstall-SCKZYB4J.js.map → uninstall-KDJYE5ET.js.map} +1 -1
  158. package/dist/{upgrade-WU3KZWR4.js → upgrade-YQRVYR5U.js} +16 -15
  159. package/dist/{upgrade-WU3KZWR4.js.map → upgrade-YQRVYR5U.js.map} +1 -1
  160. package/dist/{usage-G72SF7JG.js → usage-OV2BDZKF.js} +3 -3
  161. package/dist/{usage-event-DHSEBO5T.js → usage-event-KPI3NEX3.js} +13 -13
  162. package/dist/{vscode-copilot-6EOZDLXC.js → vscode-copilot-UOEEV4P3.js} +17 -67
  163. package/dist/vscode-copilot-UOEEV4P3.js.map +1 -0
  164. package/dist/{warp-N5YYN5BF.js → warp-LUK2BPCU.js} +9 -21
  165. package/dist/warp-LUK2BPCU.js.map +1 -0
  166. package/dist/{warp-JNQA7PBU.js → warp-NRBBJQR2.js} +2 -2
  167. package/dist/{windsurf-4TGSJIVV.js → windsurf-NZ3G42NQ.js} +8 -20
  168. package/dist/windsurf-NZ3G42NQ.js.map +1 -0
  169. package/dist/{zed-6P2UFWXU.js → zed-LGWGZ4EO.js} +13 -23
  170. package/dist/zed-LGWGZ4EO.js.map +1 -0
  171. package/dist/{zed-NNNX5MNT.js → zed-XJFOOKCO.js} +2 -2
  172. package/package.json +7 -2
  173. package/dist/amazon-q-W574ZX35.js +0 -276
  174. package/dist/amazon-q-W574ZX35.js.map +0 -1
  175. package/dist/amp-JPBQJJVM.js.map +0 -1
  176. package/dist/antigravity-VK2Y3FGV.js +0 -18
  177. package/dist/chunk-6RYPUR6O.js.map +0 -1
  178. package/dist/chunk-7ECYDK5T.js.map +0 -1
  179. package/dist/chunk-7L6ITC4T.js.map +0 -1
  180. package/dist/chunk-DT6Y7XBI.js.map +0 -1
  181. package/dist/chunk-G5CQHVQG.js.map +0 -1
  182. package/dist/chunk-HAIMYUEY.js.map +0 -1
  183. package/dist/chunk-I5MLE6S7.js.map +0 -1
  184. package/dist/chunk-JWNT5KW7.js.map +0 -1
  185. package/dist/chunk-PFDUGDOA.js.map +0 -1
  186. package/dist/chunk-TRQKHP7D.js.map +0 -1
  187. package/dist/chunk-TZQBASI7.js.map +0 -1
  188. package/dist/chunk-WZA4CSGJ.js.map +0 -1
  189. package/dist/chunk-YQLQJZ7S.js.map +0 -1
  190. package/dist/claude-code-ROSIILTM.js.map +0 -1
  191. package/dist/cline-JUTO4V27.js.map +0 -1
  192. package/dist/codebuff-2QUHL6HO.js.map +0 -1
  193. package/dist/codex-YBBTIDD4.js.map +0 -1
  194. package/dist/continue-W4TU4JSB.js.map +0 -1
  195. package/dist/copilot-cli-Y74SOP5G.js.map +0 -1
  196. package/dist/crush-GMEWLXK5.js.map +0 -1
  197. package/dist/cursor-JBS4B3Q4.js.map +0 -1
  198. package/dist/droid-TJMTNCQE.js.map +0 -1
  199. package/dist/gemini-cli-RAONGZRG.js.map +0 -1
  200. package/dist/goose-G4KKM6YU.js.map +0 -1
  201. package/dist/hermes-PJDTJE6F.js.map +0 -1
  202. package/dist/jetbrains-copilot-DNXSLQE5.js.map +0 -1
  203. package/dist/kilo-FERJ3X46.js.map +0 -1
  204. package/dist/kilo-cli-TDCONH5G.js.map +0 -1
  205. package/dist/kimi-EI3UM3ZV.js.map +0 -1
  206. package/dist/kimi-RIRD4J5J.js.map +0 -1
  207. package/dist/kiro-X7JVLAN7.js.map +0 -1
  208. package/dist/mimo-code-RFLQ727H.js.map +0 -1
  209. package/dist/mux-D77HBSBU.js.map +0 -1
  210. package/dist/omp-CO7IXURG.js.map +0 -1
  211. package/dist/openclaw-XWJLEW35.js +0 -18
  212. package/dist/opencode-QKZ5EIYU.js.map +0 -1
  213. package/dist/qwen-code-E2MSEZK6.js.map +0 -1
  214. package/dist/roo-code-AGGJ473T.js.map +0 -1
  215. package/dist/trae-6L226ZDU.js.map +0 -1
  216. package/dist/vscode-copilot-6EOZDLXC.js.map +0 -1
  217. package/dist/warp-N5YYN5BF.js.map +0 -1
  218. package/dist/windsurf-4TGSJIVV.js.map +0 -1
  219. package/dist/zed-6P2UFWXU.js.map +0 -1
  220. /package/dist/{action-YCU53FNE.js.map → action-AZRZ3V7E.js.map} +0 -0
  221. /package/dist/{amp-TULUPXXL.js.map → amp-BQZOL5GR.js.map} +0 -0
  222. /package/dist/{antigravity-VK2Y3FGV.js.map → antigravity-3XHBPXZK.js.map} +0 -0
  223. /package/dist/{antigravity-STHZWMP3.js.map → antigravity-EA4L225L.js.map} +0 -0
  224. /package/dist/{antigravity-cli-P6HADOAO.js.map → antigravity-cli-B2HXZFYQ.js.map} +0 -0
  225. /package/dist/{chunk-CYOAH23F.js.map → chunk-25BNMXPP.js.map} +0 -0
  226. /package/dist/{chunk-NLFPH4S2.js.map → chunk-2RPHDVHW.js.map} +0 -0
  227. /package/dist/{chunk-F5RX62T7.js.map → chunk-7QRUZAUG.js.map} +0 -0
  228. /package/dist/{chunk-BCHWFTV4.js.map → chunk-F4DSMVZ7.js.map} +0 -0
  229. /package/dist/{chunk-2F5QH3D4.js.map → chunk-HU6DZZBG.js.map} +0 -0
  230. /package/dist/{chunk-SCVBYSF7.js.map → chunk-IRUYJD23.js.map} +0 -0
  231. /package/dist/{chunk-WFXWJITA.js.map → chunk-JLMD3IGK.js.map} +0 -0
  232. /package/dist/{chunk-FAHIMJRU.js.map → chunk-L7ESV37V.js.map} +0 -0
  233. /package/dist/{chunk-JNM3TPLX.js.map → chunk-LETB5HCK.js.map} +0 -0
  234. /package/dist/{chunk-SDPIT4HW.js.map → chunk-Q5HR4ADS.js.map} +0 -0
  235. /package/dist/{chunk-MDNX7HTN.js.map → chunk-YEJCNOET.js.map} +0 -0
  236. /package/dist/{chunk-N6HH7K6P.js.map → chunk-ZY25RG4Y.js.map} +0 -0
  237. /package/dist/{claude-code-W74MNTAC.js.map → claude-code-NMRKTAP7.js.map} +0 -0
  238. /package/dist/{codebuff-3PMZJJHP.js.map → codebuff-ETYT5UBL.js.map} +0 -0
  239. /package/dist/{codex-Q3ATRRX3.js.map → codex-YAORPCOD.js.map} +0 -0
  240. /package/dist/{copilot-cli-SJGIXVSD.js.map → copilot-cli-MZTAWMPW.js.map} +0 -0
  241. /package/dist/{crush-LN5QFFR2.js.map → crush-QBXLNN7T.js.map} +0 -0
  242. /package/dist/{cursor-QZ6MTO74.js.map → cursor-DIW43TRZ.js.map} +0 -0
  243. /package/dist/{detect-2NIXILMZ.js.map → detect-L5OZPVFO.js.map} +0 -0
  244. /package/dist/{droid-W5WF5XEX.js.map → droid-U3ZBLQFO.js.map} +0 -0
  245. /package/dist/{gemini-cli-CIRW37TU.js.map → gemini-cli-NMVVBO3K.js.map} +0 -0
  246. /package/dist/{goose-A3M5GODH.js.map → goose-64V46Y2W.js.map} +0 -0
  247. /package/dist/{hermes-ZYLMOFLZ.js.map → hermes-F3EGTK6N.js.map} +0 -0
  248. /package/dist/{hook-FDGIQPRC.js.map → hook-JRDQ56BN.js.map} +0 -0
  249. /package/dist/{kilo-NSWAVP6P.js.map → kilo-SW7BH6EG.js.map} +0 -0
  250. /package/dist/{kilo-cli-EVBKUODA.js.map → kilo-cli-ZF272ZHN.js.map} +0 -0
  251. /package/dist/{kiro-UCLSLBW2.js.map → kiro-WGOI5CGT.js.map} +0 -0
  252. /package/dist/{leaderboard-MXGENYXN.js.map → leaderboard-ASGR3E2U.js.map} +0 -0
  253. /package/dist/{mux-ZMLVAXOO.js.map → mux-XM6AP35L.js.map} +0 -0
  254. /package/dist/{nemoclaw-LXUTMR56.js.map → nemoclaw-QDB6O22A.js.map} +0 -0
  255. /package/dist/{openclaw-XWJLEW35.js.map → openclaw-3UMBSSZM.js.map} +0 -0
  256. /package/dist/{openclaw-IYA7ASL6.js.map → openclaw-5EQFGOWL.js.map} +0 -0
  257. /package/dist/{opencode-HWT3RSMN.js.map → opencode-QGP4ALQY.js.map} +0 -0
  258. /package/dist/{package-IA56LSC3.js.map → package-IXBSG7HD.js.map} +0 -0
  259. /package/dist/{pi-UFX2OYFV.js.map → pi-GGDQREVG.js.map} +0 -0
  260. /package/dist/{pi-YGBXYWY5.js.map → pi-GW25LPC3.js.map} +0 -0
  261. /package/dist/{qwen-code-W7NUCDEN.js.map → qwen-code-GQILBJ5B.js.map} +0 -0
  262. /package/dist/{roo-code-ZLKH4A7N.js.map → roo-code-SUWI4BBN.js.map} +0 -0
  263. /package/dist/{serve-RNUCK5F7.js.map → serve-CFBQYKRB.js.map} +0 -0
  264. /package/dist/{statusline-ZVFI5DRT.js.map → statusline-WKLWSM7I.js.map} +0 -0
  265. /package/dist/{synthetic-UKR6SMGS.js.map → synthetic-6FRA7P5Q.js.map} +0 -0
  266. /package/dist/{telemetry-3FN6HDVU.js.map → telemetry-64GCGNIW.js.map} +0 -0
  267. /package/dist/{trae-PA26DPBW.js.map → trae-CPPYASR2.js.map} +0 -0
  268. /package/dist/{usage-G72SF7JG.js.map → usage-OV2BDZKF.js.map} +0 -0
  269. /package/dist/{usage-event-DHSEBO5T.js.map → usage-event-KPI3NEX3.js.map} +0 -0
  270. /package/dist/{warp-JNQA7PBU.js.map → warp-NRBBJQR2.js.map} +0 -0
  271. /package/dist/{zed-NNNX5MNT.js.map → zed-XJFOOKCO.js.map} +0 -0
@@ -6,10 +6,11 @@ import {
6
6
  } from "./chunk-RK6VBLXP.js";
7
7
  import {
8
8
  expandHome,
9
- firstExistingRoot,
9
+ hostRoots,
10
10
  isDir,
11
+ isFile,
11
12
  walkFiles
12
- } from "./chunk-JWNT5KW7.js";
13
+ } from "./chunk-O7SDRBVB.js";
13
14
  import {
14
15
  emptyTokens
15
16
  } from "./chunk-XD7MY6HB.js";
@@ -19,6 +20,7 @@ import { basename, dirname, join } from "path";
19
20
  var PLATFORM_ID = "kimi";
20
21
  var DEFAULT_MODEL = "kimi-for-coding";
21
22
  var DEFAULT_PROVIDER = "moonshot";
23
+ var MAX_HOME_WALK_LEVELS = 6;
22
24
  function toNonNegInt(v) {
23
25
  const n = typeof v === "number" ? v : typeof v === "string" ? Number(v) : NaN;
24
26
  if (!Number.isFinite(n)) return 0;
@@ -30,19 +32,31 @@ function parseWireTs(v) {
30
32
  }
31
33
  return null;
32
34
  }
33
- function readModelFromConfig(wirePath) {
34
- const sessionDir = dirname(wirePath);
35
- const groupDir = dirname(sessionDir);
36
- const sessionsDir = dirname(groupDir);
37
- const homeDir = dirname(sessionsDir);
38
- const configPath = join(homeDir, "config.json");
39
- const parsed = readJsonFile(configPath);
35
+ function normalizeTimestampMs(v) {
36
+ if (typeof v === "number" && Number.isFinite(v) && v > 0) {
37
+ return v > 1e12 ? Math.trunc(v) : Math.trunc(v * 1e3);
38
+ }
39
+ return null;
40
+ }
41
+ function modelFromConfigAt(dir) {
42
+ const parsed = readJsonFile(join(dir, "config.json"));
40
43
  if (typeof parsed === "object" && parsed !== null) {
41
44
  const model = parsed.model;
42
45
  if (typeof model === "string" && model !== "") return model;
43
46
  }
44
47
  return DEFAULT_MODEL;
45
48
  }
49
+ function readModelFromConfig(wirePath) {
50
+ let dir = dirname(wirePath);
51
+ for (let level = 0; level <= MAX_HOME_WALK_LEVELS; level += 1) {
52
+ if (isFile(join(dir, "config.json"))) return modelFromConfigAt(dir);
53
+ if (basename(dir) === "sessions") return modelFromConfigAt(dirname(dir));
54
+ const parent = dirname(dir);
55
+ if (parent === dir) break;
56
+ dir = parent;
57
+ }
58
+ return DEFAULT_MODEL;
59
+ }
46
60
  function extractSessionId(wirePath) {
47
61
  const dir = basename(dirname(wirePath));
48
62
  return dir === "" ? "unknown" : dir;
@@ -115,14 +129,59 @@ function parseKimiFile(path) {
115
129
  }
116
130
  return out;
117
131
  }
132
+ function parseKimiCodeFile(path) {
133
+ const lines = readJsonlLines(path);
134
+ if (lines.length === 0) return [];
135
+ const sessionId = extractSessionId(path);
136
+ const mtime = fileMtimeMs(path);
137
+ const out = [];
138
+ for (const raw of lines) {
139
+ if (typeof raw !== "object" || raw === null) continue;
140
+ const rec = raw;
141
+ if (rec.type !== "usage.record") continue;
142
+ const usage = rec.usage;
143
+ if (typeof usage !== "object" || usage === null) continue;
144
+ const input = toNonNegInt(usage.inputOther);
145
+ const output = toNonNegInt(usage.output);
146
+ const cacheRead = toNonNegInt(usage.inputCacheRead);
147
+ const cacheWrite = toNonNegInt(usage.inputCacheCreation);
148
+ if (input + output + cacheRead + cacheWrite === 0) continue;
149
+ const ts = normalizeTimestampMs(rec.time) ?? mtime;
150
+ const tokens = emptyTokens();
151
+ tokens.input = input;
152
+ tokens.output = output;
153
+ tokens.cacheRead = cacheRead;
154
+ tokens.cacheWrite = cacheWrite;
155
+ const model = typeof rec.model === "string" && rec.model !== "" ? rec.model : DEFAULT_MODEL;
156
+ out.push({
157
+ platformId: PLATFORM_ID,
158
+ modelId: model,
159
+ providerId: DEFAULT_PROVIDER,
160
+ sessionId,
161
+ tokens,
162
+ ts,
163
+ messageCount: 1,
164
+ confidence: "host-reported"
165
+ });
166
+ }
167
+ return out;
168
+ }
169
+ function parseWireFile(path) {
170
+ const lines = readJsonlLines(path);
171
+ for (const raw of lines) {
172
+ if (typeof raw === "object" && raw !== null && raw.type === "usage.record") {
173
+ return parseKimiCodeFile(path);
174
+ }
175
+ }
176
+ return parseKimiFile(path);
177
+ }
118
178
  function kimiSessionRoots() {
119
179
  const roots = [];
120
180
  const codeHome = process.env.KIMI_CODE_HOME;
121
181
  if (codeHome != null && codeHome.trim() !== "") {
122
182
  roots.push(join(expandHome(codeHome.trim()), "sessions"));
123
183
  }
124
- const standard = firstExistingRoot(PLATFORM_ID);
125
- if (standard !== void 0) roots.push(standard);
184
+ for (const root of hostRoots(PLATFORM_ID)) roots.push(root);
126
185
  return roots;
127
186
  }
128
187
  var kimiReader = {
@@ -138,7 +197,7 @@ var kimiReader = {
138
197
  for (const file of files) {
139
198
  if (seen.has(file)) continue;
140
199
  seen.add(file);
141
- const rows = parseKimiFile(file);
200
+ const rows = parseWireFile(file);
142
201
  for (const row of rows) {
143
202
  if (sinceMs !== void 0 && row.ts < sinceMs) continue;
144
203
  records.push(row);
@@ -152,4 +211,4 @@ var kimi_default = kimiReader;
152
211
  export {
153
212
  kimi_default as default
154
213
  };
155
- //# sourceMappingURL=kimi-EI3UM3ZV.js.map
214
+ //# sourceMappingURL=kimi-5FHEXGZD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/usage/readers/kimi.ts"],"sourcesContent":["/**\n * usage/readers/kimi — Moonshot native session-log reader (TWO products).\n *\n * Originally a faithful port of tokscale sessions/kimi.rs (origin of the Kimi\n * CLI wire parse), this reader now PARSES BOTH Moonshot products that share the\n * \"kimi\" platform id. They lay out their logs DIFFERENTLY *and* write a\n * different wire.jsonl record shape, so the parser auto-routes per line (a given\n * wire.jsonl is one product's format; no root-based branching is needed):\n *\n * - Kimi CLI (older, ~/.kimi):\n * ~/.kimi/sessions/<GROUP_ID>/<SESSION_UUID>/wire.jsonl\n * config.json sits at ~/.kimi/config.json. This is the tree tokscale's\n * sessions/kimi.rs reads and the one this port was first written against.\n * PARSE MODEL: progressive `message.type===\"StatusUpdate\"` snapshots,\n * deduped by `payload.message_id` keeping the MAX total (see parseKimiFile).\n *\n * - Kimi Code (newer, @moonshot-ai/kimi-code, ~/.kimi-code):\n * ~/.kimi-code/sessions/<SESSION>/agents/<AGENT>/wire.jsonl\n * config.json sits at ~/.kimi-code/config.json. This is a DEEPER tree (an\n * extra `agents/<AGENT>/` level) — the product our connector adapter\n * targets. The `~/.kimi-code` base + `$KIMI_CODE_HOME` override are\n * primary-doc-confirmed (moonshotai.github.io/kimi-code/en/configuration/\n * config-files.html), as is the `wire.jsonl` filename (\"the agent event\n * stream\", moonshotai.github.io/kimi-code docs).\n * PARSE MODEL: per-LLM-call usage DELTAS, SUMMED (see parseKimiCodeFile).\n *\n * Both default trees are scanned (Kimi Code preferred first); $KIMI_CODE_HOME\n * relocates the Kimi Code home and is honored ahead of the defaults; the\n * AGENT_CONNECTOR_KIMI_DIR override (via paths.ts hostRoots) is honored first.\n *\n * ─── Kimi CLI wire frame parse (port of tokscale sessions/kimi.rs) ───\n * Each line is a timestamped wire frame; only frames whose\n * `message.type === \"StatusUpdate\"` carry a `payload.token_usage` block:\n * input_other → input\n * output → output\n * input_cache_read → cacheRead\n * input_cache_creation → cacheWrite (cache CREATION cost, not a read)\n * reasoning is always 0 (the wire protocol folds reasoning into output).\n * The first line (`{\"type\":\"metadata\", …}`) and every non-StatusUpdate frame\n * (TurnBegin / ContentPart / ToolCall / StepBegin …) are skipped. Zero-token\n * StatusUpdates are dropped.\n * DEDUP (the double-counting hazard): Kimi CLI emits PROGRESSIVE StatusUpdates\n * for a single assistant message as generation streams (e.g. message_id \"msg-x\"\n * at 100→10 tokens, then 120→30). We dedup by `payload.message_id`, keeping the\n * row with the MAX total tokens (tie-break: the later timestamp). Records\n * WITHOUT a (non-empty) message_id are never merged — each passes through as its\n * own row, exactly as the Rust push_or_replace_status_update does. The kept\n * row's `dedupKey` is its message_id (absent for un-keyed rows).\n *\n * ─── Kimi Code wire record parse (SOURCE-VERIFIED from MoonshotAI/kimi-code) ───\n * The on-disk usage record is `{ type:\"usage.record\", time?, model, usage,\n * usageScope? }` — verified against the readable (non-minified) TypeScript\n * source:\n * - packages/agent-core/src/agent/records/types.ts → the wire.jsonl usage\n * record shape `{ type:\"usage.record\", time?:number, model:string,\n * usage:TokenUsage, usageScope?:\"session\"|\"turn\" }`.\n * - packages/kosong/src/usage.ts → `TokenUsage = { inputOther, output,\n * inputCacheRead, inputCacheCreation }` (camelCase; NO reasoning field).\n * - packages/agent-core/src/agent/usage/index.ts `record(model, usage, scope)`\n * logs exactly ONE `usage.record` per LLM call carrying that call's per-call\n * DELTA usage; the canonical session total is the SUM of all deltas\n * (`addUsage`), confirmed by packages/agent-core/test/agent/usage.test.ts\n * (record(inputOther:1)+record(inputOther:10) ⇒ total inputOther:11).\n * - `usageScope` ('session'|'turn') only drives an IN-MEMORY currentTurn\n * rollup; exactly one `usage.record` is written per record() call, so SUMMING\n * ALL usage.record deltas of ANY scope = the correct session total with NO\n * double-count. We deliberately do NOT filter or dedup by scope.\n * Field map (TokenUsage → TokenBreakdown):\n * inputOther → input\n * output → output\n * inputCacheRead → cacheRead\n * inputCacheCreation → cacheWrite\n * reasoning is always 0 (TokenUsage has no reasoning field).\n * Each usage.record is a DELTA, so each becomes its OWN row (no message_id\n * dedup; dedupKey is absent so aggregation never merges them) and the rows SUM\n * downstream. Zero-token records are dropped (consistent with the CLI path).\n * Per-record `model` is taken from the record itself (DEFAULT_MODEL fallback),\n * so the config.json walk is NOT consulted for the Kimi Code model. Timestamp is\n * `record.time` normalized via normalizeTimestampMs (>1e12 ⇒ ms, else\n * seconds×1000), falling back to the file mtime like the CLI path.\n *\n * Model (Kimi CLI only): `.model` from <home>/config.json (fallback\n * \"kimi-for-coding\"), where <home> is found by walking UP from wire.jsonl to the\n * nearest dir containing config.json — depth-robust, so it lands on ~/.kimi for\n * the CLI tree (and would land on ~/.kimi-code for the deeper tree, though Kimi\n * Code records carry their own model). Provider is hard-coded \"moonshot\".\n * Session id is the immediate parent dir of wire.jsonl: the SESSION_UUID for\n * Kimi CLI; for the deeper Kimi Code tree that is the <AGENT> dir (the best\n * available id at that depth — documented, acceptable). Kimi's wire log carries\n * no cwd, so there is no project attribution. Confidence is \"host-reported\"\n * (real host token counts).\n *\n * Fail-open: no root → []; an unreadable/malformed file or line → skipped.\n */\n\nimport { basename, dirname, join } from \"node:path\";\n\nimport type { TokenBreakdown, UsageReader, UsageRecord } from \"../types.js\";\nimport { emptyTokens } from \"../aggregate.js\";\nimport { fileMtimeMs, readJsonFile, readJsonlLines } from \"../jsonl.js\";\nimport { expandHome, hostRoots, isDir, isFile, walkFiles } from \"../paths.js\";\n\nconst PLATFORM_ID = \"kimi\" as const;\nconst DEFAULT_MODEL = \"kimi-for-coding\";\nconst DEFAULT_PROVIDER = \"moonshot\";\n\n/**\n * Bound on the upward config.json walk. Kimi CLI needs 4 hops (wire.jsonl →\n * UUID → GROUP → sessions → home); Kimi Code's deeper tree needs 5 (wire.jsonl →\n * AGENT → agents → SESSION → sessions → home). 6 leaves headroom without letting\n * a stray config.json far up the filesystem masquerade as the Kimi home.\n */\nconst MAX_HOME_WALK_LEVELS = 6;\n\n/** A Kimi CLI wire.jsonl line: metadata header OR a timestamped message frame. */\ninterface WireLine {\n type?: unknown;\n timestamp?: unknown;\n message?: {\n type?: unknown;\n payload?: {\n token_usage?: {\n input_other?: unknown;\n output?: unknown;\n input_cache_read?: unknown;\n input_cache_creation?: unknown;\n };\n message_id?: unknown;\n };\n };\n}\n\n/**\n * A Kimi Code wire.jsonl `usage.record` line (SOURCE-VERIFIED, see header). The\n * `usage` block is TokenUsage (camelCase, no reasoning); `time` is the record\n * timestamp; `model` is the per-call model; `usageScope` is informational only\n * and intentionally not read (every record is summed regardless of scope).\n */\ninterface KimiCodeUsageRecord {\n type?: unknown;\n time?: unknown;\n model?: unknown;\n usage?: {\n inputOther?: unknown;\n output?: unknown;\n inputCacheRead?: unknown;\n inputCacheCreation?: unknown;\n };\n}\n\n/** Coerce an unknown to a non-negative integer (0 on absence/garbage). */\nfunction toNonNegInt(v: unknown): number {\n const n = typeof v === \"number\" ? v : typeof v === \"string\" ? Number(v) : NaN;\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.trunc(n));\n}\n\n/**\n * Convert the Kimi CLI wire `timestamp` (Unix seconds, often fractional like\n * 1770983426.420942) to epoch ms. Returns null when unusable so the caller can\n * fall back to the file mtime (port of `timestamp * 1000.0 as i64`).\n */\nfunction parseWireTs(v: unknown): number | null {\n if (typeof v === \"number\" && Number.isFinite(v) && v > 0) {\n return Math.trunc(v * 1000);\n }\n return null;\n}\n\n/**\n * Normalize a Kimi Code `usage.record.time` to epoch ms, disambiguating\n * seconds-vs-ms by magnitude (the repo-wide convention): a value already in ms\n * (> 1e12) passes through truncated; a smaller value is treated as Unix seconds\n * (× 1000). Returns null when unusable so the caller falls back to the file mtime.\n */\nfunction normalizeTimestampMs(v: unknown): number | null {\n if (typeof v === \"number\" && Number.isFinite(v) && v > 0) {\n return v > 1e12 ? Math.trunc(v) : Math.trunc(v * 1000);\n }\n return null;\n}\n\n/**\n * Find the Kimi home for a wire.jsonl and read its `.model` (depth-robust\n * evolution of the Rust read_model_from_config). The two product trees differ in\n * DEPTH:\n * Kimi CLI : <home>/sessions/<GROUP_ID>/<SESSION_UUID>/wire.jsonl (4 hops)\n * Kimi Code: <home>/sessions/<SESSION>/agents/<AGENT>/wire.jsonl (5 hops)\n * A fixed dirname-hop count would land on `sessions/` for the deeper tree, so we\n * walk UP the ancestor chain (bounded by MAX_HOME_WALK_LEVELS) reading the first\n * `config.json` found — but the home is DEFINITIONALLY the parent of the\n * `sessions/` segment, so the moment we reach the `sessions` dir we read its\n * parent's config.json and STOP. That hard ceiling keeps the search inside the\n * Kimi home: it can never escape into an ancestor (e.g. a repo's or $HOME's stray\n * config.json) when the real home lacks one. For the Kimi CLI tree this resolves\n * the SAME <home> as the old 4-hop logic, so CLI behavior is byte-identical.\n * Fail-open to DEFAULT_MODEL on no config.json or any missing/garbage value.\n */\nfunction modelFromConfigAt(dir: string): string {\n const parsed = readJsonFile(join(dir, \"config.json\"));\n if (typeof parsed === \"object\" && parsed !== null) {\n const model = (parsed as { model?: unknown }).model;\n if (typeof model === \"string\" && model !== \"\") return model;\n }\n return DEFAULT_MODEL; // config.json absent/unreadable or no usable .model\n}\n\nfunction readModelFromConfig(wirePath: string): string {\n let dir = dirname(wirePath);\n for (let level = 0; level <= MAX_HOME_WALK_LEVELS; level += 1) {\n if (isFile(join(dir, \"config.json\"))) return modelFromConfigAt(dir);\n // The home is the parent of the `sessions/` segment — read it and STOP so the\n // walk never climbs above the Kimi home into a stray ancestor config.json.\n if (basename(dir) === \"sessions\") return modelFromConfigAt(dirname(dir));\n const parent = dirname(dir);\n if (parent === dir) break; // reached filesystem root\n dir = parent;\n }\n return DEFAULT_MODEL;\n}\n\n/**\n * Session id from the wire path: the immediate parent directory of wire.jsonl\n * (port of extract_session_id, UNCHANGED). For Kimi CLI that is the SESSION_UUID;\n * for the deeper Kimi Code tree (.../sessions/<SESSION>/agents/<AGENT>/wire.jsonl)\n * that is the <AGENT> dir — the best available id at that depth (documented,\n * acceptable). Keeping the immediate-parent rule keeps Kimi CLI byte-identical.\n */\nfunction extractSessionId(wirePath: string): string {\n const dir = basename(dirname(wirePath));\n return dir === \"\" ? \"unknown\" : dir;\n}\n\n/** Sum of the five token dimensions (port of TokenBreakdown::total). */\nfunction tokenTotal(t: TokenBreakdown): number {\n return t.input + t.output + t.cacheRead + t.cacheWrite + t.reasoning;\n}\n\n/**\n * Whether `candidate` should replace `existing` for the same message_id. Port of\n * should_replace_status_update: a strictly larger total wins; on an equal total\n * the later-or-equal timestamp wins (so the freshest progressive update is kept).\n */\nfunction shouldReplace(existing: UsageRecord, candidate: UsageRecord): boolean {\n const existingTotal = tokenTotal(existing.tokens);\n const candidateTotal = tokenTotal(candidate.tokens);\n return (\n candidateTotal > existingTotal ||\n (candidateTotal === existingTotal && candidate.ts >= existing.ts)\n );\n}\n\n/** Parse one Kimi wire.jsonl file into usage records (port of parse_kimi_file). */\nfunction parseKimiFile(path: string): UsageRecord[] {\n const lines = readJsonlLines(path);\n if (lines.length === 0) return [];\n\n const model = readModelFromConfig(path);\n const sessionId = extractSessionId(path);\n const mtime = fileMtimeMs(path);\n\n const out: UsageRecord[] = [];\n // message_id → index into `out`, for progressive-StatusUpdate dedup.\n const keyedIndices = new Map<string, number>();\n\n for (const raw of lines) {\n if (typeof raw !== \"object\" || raw === null) continue;\n const wire = raw as WireLine;\n\n // Skip the metadata header line.\n if (wire.type === \"metadata\") continue;\n\n const message = wire.message;\n if (typeof message !== \"object\" || message === null) continue;\n\n // Only StatusUpdate frames carry token usage.\n if (message.type !== \"StatusUpdate\") continue;\n\n const payload = message.payload;\n if (typeof payload !== \"object\" || payload === null) continue;\n\n const usage = payload.token_usage;\n if (typeof usage !== \"object\" || usage === null) continue;\n\n const input = toNonNegInt(usage.input_other);\n const output = toNonNegInt(usage.output);\n const cacheRead = toNonNegInt(usage.input_cache_read);\n const cacheWrite = toNonNegInt(usage.input_cache_creation);\n\n // Skip zero-token entries.\n if (input + output + cacheRead + cacheWrite === 0) continue;\n\n const ts = parseWireTs(wire.timestamp) ?? mtime;\n\n const tokens = emptyTokens();\n tokens.input = input;\n tokens.output = output;\n tokens.cacheRead = cacheRead;\n tokens.cacheWrite = cacheWrite;\n // reasoning stays 0 — the Kimi wire protocol folds reasoning into output.\n\n const messageId = payload.message_id;\n const dedupKey =\n typeof messageId === \"string\" && messageId !== \"\" ? messageId : undefined;\n\n const record: UsageRecord = {\n platformId: PLATFORM_ID,\n modelId: model,\n providerId: DEFAULT_PROVIDER,\n sessionId,\n tokens,\n ts,\n messageCount: 1,\n confidence: \"host-reported\",\n };\n if (dedupKey !== undefined) record.dedupKey = dedupKey;\n\n if (dedupKey === undefined) {\n // Un-keyed StatusUpdates are never merged — each is its own row.\n out.push(record);\n continue;\n }\n\n const existingIndex = keyedIndices.get(dedupKey);\n if (existingIndex !== undefined) {\n const existing = out[existingIndex];\n if (existing !== undefined && shouldReplace(existing, record)) {\n out[existingIndex] = record;\n }\n continue;\n }\n\n keyedIndices.set(dedupKey, out.length);\n out.push(record);\n }\n\n return out;\n}\n\n/**\n * Parse one Kimi Code wire.jsonl file into usage records (SOURCE-VERIFIED, see\n * header). Each `type === \"usage.record\"` line is a per-LLM-call usage DELTA;\n * we emit each as its OWN row (NO message_id dedup — dedupKey is absent so\n * aggregation never merges them) and the rows SUM to the canonical session\n * total. usageScope is ignored on purpose: exactly one usage.record is written\n * per record() call, so summing all deltas of any scope never double-counts.\n * Non-usage.record lines (metadata, turn_begin, …) are skipped; zero-token\n * records are dropped, matching the CLI path.\n */\nfunction parseKimiCodeFile(path: string): UsageRecord[] {\n const lines = readJsonlLines(path);\n if (lines.length === 0) return [];\n\n const sessionId = extractSessionId(path);\n const mtime = fileMtimeMs(path);\n\n const out: UsageRecord[] = [];\n\n for (const raw of lines) {\n if (typeof raw !== \"object\" || raw === null) continue;\n const rec = raw as KimiCodeUsageRecord;\n\n // Only usage.record lines carry token usage in the Kimi Code format.\n if (rec.type !== \"usage.record\") continue;\n\n const usage = rec.usage;\n if (typeof usage !== \"object\" || usage === null) continue;\n\n // TokenUsage → TokenBreakdown (camelCase source fields; no reasoning field).\n const input = toNonNegInt(usage.inputOther);\n const output = toNonNegInt(usage.output);\n const cacheRead = toNonNegInt(usage.inputCacheRead);\n const cacheWrite = toNonNegInt(usage.inputCacheCreation);\n\n // Skip zero-token deltas (consistent with the CLI path).\n if (input + output + cacheRead + cacheWrite === 0) continue;\n\n const ts = normalizeTimestampMs(rec.time) ?? mtime;\n\n const tokens = emptyTokens();\n tokens.input = input;\n tokens.output = output;\n tokens.cacheRead = cacheRead;\n tokens.cacheWrite = cacheWrite;\n // reasoning stays 0 — Kimi Code's TokenUsage has no reasoning field.\n\n const model =\n typeof rec.model === \"string\" && rec.model !== \"\" ? rec.model : DEFAULT_MODEL;\n\n // Each delta is its own row (no dedupKey ⇒ never merged at aggregation).\n out.push({\n platformId: PLATFORM_ID,\n modelId: model,\n providerId: DEFAULT_PROVIDER,\n sessionId,\n tokens,\n ts,\n messageCount: 1,\n confidence: \"host-reported\",\n });\n }\n\n return out;\n}\n\n/**\n * Detect which product wrote a wire.jsonl by its record shape (a given file is\n * ONE product's format). A file is Kimi Code iff it carries any\n * `type === \"usage.record\"` line; otherwise it is parsed as Kimi CLI. This keeps\n * the Kimi CLI path (parseKimiFile) provably untouched — a CLI StatusUpdate file\n * has no usage.record line and routes to parseKimiFile byte-identically.\n */\nfunction parseWireFile(path: string): UsageRecord[] {\n const lines = readJsonlLines(path);\n for (const raw of lines) {\n if (typeof raw === \"object\" && raw !== null && (raw as KimiCodeUsageRecord).type === \"usage.record\") {\n return parseKimiCodeFile(path);\n }\n }\n return parseKimiFile(path);\n}\n\n/**\n * Candidate Kimi session roots, most-preferred first. Covers BOTH Moonshot\n * products under the \"kimi\" id:\n * 1. $KIMI_CODE_HOME/sessions — Kimi Code's relocated home, when set (the env\n * var our adapter and the official kimi-code docs honor).\n * 2. paths.ts hostRoots(\"kimi\"), in order:\n * - AGENT_CONNECTOR_KIMI_DIR/sessions (explicit framework override)\n * - ~/.kimi-code/sessions (Kimi Code default — preferred)\n * - ~/.kimi/sessions (Kimi CLI default)\n * All existing roots are scanned (not just the first) so a box running BOTH\n * products is fully covered; the reader's `seen` set de-overlaps any duplicate\n * wire.jsonl reached via two roots (e.g. KIMI_CODE_HOME == ~/.kimi-code).\n */\nfunction kimiSessionRoots(): string[] {\n const roots: string[] = [];\n\n const codeHome = process.env.KIMI_CODE_HOME;\n if (codeHome != null && codeHome.trim() !== \"\") {\n roots.push(join(expandHome(codeHome.trim()), \"sessions\"));\n }\n\n // hostRoots already prepends the AGENT_CONNECTOR_KIMI_DIR override and lists\n // ~/.kimi-code/sessions then ~/.kimi/sessions as the two product defaults.\n for (const root of hostRoots(PLATFORM_ID)) roots.push(root);\n\n return roots;\n}\n\n/** The Kimi CLI usage reader singleton. */\nconst kimiReader: UsageReader = {\n platformId: PLATFORM_ID,\n kind: \"local\",\n async read({ sinceMs }: { sinceMs?: number }): Promise<UsageRecord[]> {\n const roots = kimiSessionRoots().filter((r) => isDir(r));\n if (roots.length === 0) return []; // no session root present → fail-open\n\n // Kimi CLI : <root>/<GROUP_ID>/<SESSION_UUID>/wire.jsonl\n // Kimi Code: <root>/<SESSION>/agents/<AGENT>/wire.jsonl (deeper — walkFiles\n // recurses, so the extra `agents/` level is found transparently).\n // parseWireFile routes each file to its product parser by record shape.\n const seen = new Set<string>();\n const records: UsageRecord[] = [];\n for (const root of roots) {\n const files = walkFiles(root, (name) => name === \"wire.jsonl\");\n for (const file of files) {\n if (seen.has(file)) continue; // de-overlap across overlapping roots\n seen.add(file);\n const rows = parseWireFile(file);\n for (const row of rows) {\n if (sinceMs !== undefined && row.ts < sinceMs) continue;\n records.push(row);\n }\n }\n }\n return records;\n },\n};\n\nexport default kimiReader;\n"],"mappings":"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","names":[]}
@@ -1,28 +1,30 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ normalizeSessionSource
4
+ } from "./chunk-H53QZQJI.js";
2
5
  import {
3
6
  resolveEnvRefsDeep
4
7
  } from "./chunk-DBQMX75U.js";
5
8
  import {
6
9
  BaseAdapter
7
- } from "./chunk-PFDUGDOA.js";
10
+ } from "./chunk-3I7UG52L.js";
8
11
  import {
9
12
  renderSkillMd
10
- } from "./chunk-7L6ITC4T.js";
13
+ } from "./chunk-IEGR4TP3.js";
11
14
  import {
12
15
  buildHomeBinHookCommand,
13
- buildServeWrapperCommand,
14
- isHomeBinHookCommand,
15
- shouldWrapForTelemetry
16
- } from "./chunk-I5MLE6S7.js";
17
- import "./chunk-N6HH7K6P.js";
16
+ buildWrappedStdio,
17
+ isHomeBinHookCommand
18
+ } from "./chunk-TO57WYBB.js";
19
+ import "./chunk-ZY25RG4Y.js";
18
20
  import {
19
21
  ensureDir
20
- } from "./chunk-TRQKHP7D.js";
22
+ } from "./chunk-QY42WGBX.js";
21
23
 
22
24
  // src/adapters/kimi/index.ts
23
25
  import { existsSync, readFileSync, writeFileSync } from "fs";
24
26
  import { homedir } from "os";
25
- import { dirname, join } from "path";
27
+ import { dirname, join, resolve } from "path";
26
28
  import TOML from "@iarna/toml";
27
29
  var HOST = "kimi";
28
30
  var MCP_ROOT_KEY = "mcpServers";
@@ -76,8 +78,8 @@ var KimiAdapter = class extends BaseAdapter {
76
78
  // url entry with transport:"sse" (kimi.com/code/docs/en/kimi-code-cli/
77
79
  // customization/mcp.html: "supports three MCP server connection methods").
78
80
  transports: ["stdio", "http", "sse"],
79
- // Skills surface: Kimi reads SKILL.md from ~/.kimi/skills/<name>/SKILL.md
80
- // (user scope) and .kimi/skills/<name>/SKILL.md (project scope).
81
+ // Skills surface: Kimi reads SKILL.md from ~/.kimi-code/skills/<name>/SKILL.md
82
+ // (user scope) and .kimi-code/skills/<name>/SKILL.md (project scope).
81
83
  // Confirmed: kilo-pi-ground-truth.md § "Already-known skills gaps".
82
84
  supportsSkills: true,
83
85
  // Native passthrough hooks: Kimi's observation-only single-host events —
@@ -103,9 +105,11 @@ var KimiAdapter = class extends BaseAdapter {
103
105
  configPath: mcpPath,
104
106
  scope: "user",
105
107
  reason: installed ? `found Kimi CLI config under ${baseDir}` : `no Kimi CLI config at ${baseDir}`,
106
- // Path confidence is medium even when present: the ~/.kimi-code layout is the
107
- // documented shape but less battle-tested than Claude/Codex.
108
- confidence: "medium"
108
+ // Path confidence is high: the ~/.kimi-code base (override $KIMI_CODE_HOME) is
109
+ // the primary-doc-verified shape (moonshotai.github.io/kimi-code/en/
110
+ // configuration/config-files.html) and live-confirmed via `kimi doctor config`
111
+ // on @moonshot-ai/kimi-code v0.18.0.
112
+ confidence: "high"
109
113
  };
110
114
  }
111
115
  // ── Native paths ───────────────────────────────────────────────────────
@@ -121,21 +125,26 @@ var KimiAdapter = class extends BaseAdapter {
121
125
  return join(this.getConfigDir(ctx), "config.toml");
122
126
  }
123
127
  /**
124
- * `$KIMI_HOME` || `$KIMI_CODE_HOME` (with `~` expansion) || `~/.kimi`.
125
- * The real Moonshot Kimi CLI (v1.46.0) keeps its config under `~/.kimi`
126
- * (mcp.json · mcpServers) verified by a live `kimi mcp` probe; the legacy
127
- * `~/.kimi-code` guess was wrong. `$KIMI_CODE_HOME` is still honored as an
128
- * override for back-compat alongside the newer `$KIMI_HOME`.
128
+ * `$KIMI_CODE_HOME` (with `~` expansion, then resolved) when set & non-empty,
129
+ * else `~/.kimi-code`. This mirrors `codexConfigHome()` in core/host-paths.ts
130
+ * (tilde-expand-then-default) so the writer and any probe agree on the dir.
131
+ *
132
+ * Per the official Kimi Code CLI docs the config dir is `~/.kimi-code/`,
133
+ * overridable ONLY by `$KIMI_CODE_HOME` — there is NO `$KIMI_HOME` env var, so
134
+ * the old `$KIMI_HOME`-first resolution was the bug (with `$KIMI_HOME` set the
135
+ * adapter wrote where Kimi never reads). Doc:
136
+ * moonshotai.github.io/kimi-code/en/configuration/config-files.html;
137
+ * live-confirmed by `kimi doctor config` on @moonshot-ai/kimi-code v0.18.0.
129
138
  */
130
139
  baseDir() {
131
- const env = process.env.KIMI_HOME ?? process.env.KIMI_CODE_HOME;
140
+ const env = process.env.KIMI_CODE_HOME;
132
141
  if (env && env.trim() !== "") {
133
142
  if (env.startsWith("~")) {
134
143
  return join(homedir(), env.replace(/^~[/\\]?/, ""));
135
144
  }
136
- return env;
145
+ return resolve(env);
137
146
  }
138
- return join(homedir(), ".kimi");
147
+ return join(homedir(), ".kimi-code");
139
148
  }
140
149
  // ── MCP server install / uninstall (mcp.json → mcpServers.<id>) ──────────
141
150
  installServer(ctx) {
@@ -182,18 +191,7 @@ var KimiAdapter = class extends BaseAdapter {
182
191
  if (transport === "stdio") {
183
192
  let command = server.command ?? "";
184
193
  let args = [...server.args ?? []];
185
- if (shouldWrapForTelemetry(server, ctx.connector.telemetry)) {
186
- const wrapped = buildServeWrapperCommand(
187
- ctx.homeBinPath,
188
- ctx.connector.id,
189
- command,
190
- args,
191
- ctx.scope,
192
- this.id
193
- );
194
- command = wrapped.command;
195
- args = wrapped.args;
196
- }
194
+ ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));
197
195
  command = resolveEnvRefsDeep(command);
198
196
  args = resolveEnvRefsDeep(args);
199
197
  const entry2 = { command };
@@ -219,11 +217,11 @@ var KimiAdapter = class extends BaseAdapter {
219
217
  }
220
218
  // ── Skills surface ────────────────────────────────────────────────────────
221
219
  // Kimi reads SKILL.md from <baseDir>/skills/<name>/SKILL.md.
222
- // user scope: ~/.kimi/skills/<name>/SKILL.md
223
- // project scope: <projectDir>/.kimi/skills/<name>/SKILL.md
220
+ // user scope: ~/.kimi-code/skills/<name>/SKILL.md
221
+ // project scope: <projectDir>/.kimi-code/skills/<name>/SKILL.md
224
222
  // Confirmed: kilo-pi-ground-truth.md § "Already-known skills gaps".
225
223
  skillsDir(ctx) {
226
- return ctx.scope === "project" ? join(ctx.projectDir, ".kimi", "skills") : join(this.baseDir(), "skills");
224
+ return ctx.scope === "project" ? join(ctx.projectDir, ".kimi-code", "skills") : join(this.baseDir(), "skills");
227
225
  }
228
226
  skillDir(ctx, name) {
229
227
  return join(this.skillsDir(ctx), name);
@@ -631,18 +629,6 @@ function toolResponseToString(value) {
631
629
  return void 0;
632
630
  }
633
631
  }
634
- function normalizeSessionSource(source) {
635
- switch (source) {
636
- case "compact":
637
- return "compact";
638
- case "resume":
639
- return "resume";
640
- case "clear":
641
- return "clear";
642
- default:
643
- return "startup";
644
- }
645
- }
646
632
  var adapter = new KimiAdapter();
647
633
  var kimi_default = adapter;
648
634
  export {
@@ -650,4 +636,4 @@ export {
650
636
  adapter,
651
637
  kimi_default as default
652
638
  };
653
- //# sourceMappingURL=kimi-RIRD4J5J.js.map
639
+ //# sourceMappingURL=kimi-RXS36OJP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/kimi/index.ts"],"sourcesContent":["/**\n * adapters/kimi — Kimi CLI (Moonshot) platform adapter for agent-connector.\n *\n * Kimi CLI is a json-stdio host: the runner pipes a JSON payload to a command on\n * stdin and reads an exit code (and optional reason) back. Two native config\n * files live under the Kimi base dir (`$KIMI_CODE_HOME` || `~/.kimi-code`, per the\n * official docs — moonshotai.github.io/kimi-code/en/configuration/config-files.html):\n * - mcp.json → `mcpServers.<id>` MCP registration (JSON, stdio shape:\n * {command,args,env}). Handled via BaseAdapter's JSON helpers.\n * - config.toml → `[[hooks]]` array-of-tables (TOML), each table\n * { event, matcher, command }. Parsed/serialized with @iarna/toml: every\n * config VALUE (unrelated sections, sibling hooks, scalars) is preserved,\n * but a parse→stringify round-trip does NOT preserve user COMMENTS or the\n * original key ordering/formatting in config.toml (values survive; comments\n * and layout do not).\n *\n * Hook surface is intentionally narrow: Kimi CLI only honors a PreToolUse DENY.\n * It cannot rewrite tool args, rewrite tool output, or inject session context —\n * so every other decision degrades to a silent allow (exit 0). Kimi Code uses\n * the Claude/Codex reply shape: a PreToolUse deny is signalled with EXIT 0 plus\n * a `hookSpecificOutput` JSON object on stdout carrying\n * permissionDecision:\"deny\" + permissionDecisionReason — that is how Kimi's\n * runner blocks the pending tool call. An allow is exit 0 with empty stdout.\n *\n * E1 extension events (verified against moonshotai.github.io/kimi-cli hooks):\n * - PostToolUseFailure — native (tool_name, tool_input, error; tool-name\n * matcher). Feedback-only: Kimi's exit-0 protocol adds non-empty stdout to\n * context, so \"context\" (and a degraded \"deny\") emit plain-text stdout.\n * - SubagentStart / SubagentStop — native, but with Kimi-specific wire\n * fields: agent_name (→ normalized agentType; there is no agent_id) plus\n * prompt (start) / response (stop → lastAssistantMessage). SubagentStop\n * deny uses Kimi's generic block protocol: EXIT 2 with the reason on\n * stderr (fed back to the model as correction).\n * - PermissionRequest — fired just before Kimi waits for user approval\n * (observation only). Wired; its return value does not affect the flow.\n * - The remaining canonical events (PostToolUse, UserPromptSubmit, Stop,\n * SessionStart, SessionEnd, PreCompact, PostCompact, Notification) are all\n * documented Kimi hooks and now wired 1:1 (PascalCase). Of these only\n * UserPromptSubmit + Stop are BLOCKABLE — they share SubagentStop's exit-2\n * block protocol (deny → EXIT 2 + stderr reason); the rest are observation\n * only. Verified against the kimi-code hooks docs (kimi.com/code/docs/en/\n * kimi-code-cli/customization/hooks.html): \"Only blockable events\n * (PreToolUse, Stop, UserPromptSubmit) have return values that affect the\n * main flow. All other events are observation-only.\"\n *\n * Path confidence: the `~/.kimi-code` base + mcp.json (`mcpServers`) layout is\n * PRIMARY-DOC-CONFIRMED against the official Kimi Code CLI docs (config dir\n * `~/.kimi-code/`, override `$KIMI_CODE_HOME` — there is NO `$KIMI_HOME`;\n * moonshotai.github.io/kimi-code/en/configuration/config-files.html +\n * .../customization/mcp.html) and corroborated by a live `kimi doctor config`\n * probe of `@moonshot-ai/kimi-code` v0.18.0 (reads `~/.kimi-code`, honors\n * `$KIMI_CODE_HOME`, ignores `KIMI_HOME`). We still install + doctor-report\n * presence so a future path move surfaces as a FAIL rather than silently\n * misbehaving.\n *\n * NOT YET COVERED: three observation-only Kimi-only events — StopFailure,\n * PermissionResult, Interrupt — are documented but NOT promoted to the core\n * normalized model (each is below the ≥3-host bar for a core HookEventName).\n * A connector that needs them on Kimi can declare them via the nativeHooks\n * passthrough. Kimi also has a PLUGIN system (`<base>/plugins/<name>/\n * kimi.plugin.json`), not yet surfaced.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport TOML from \"@iarna/toml\";\n\nimport { BaseAdapter } from \"../base.js\";\nimport type { Adapter, HookReply, InstallContext, NormalizedEvent } from \"../spi.js\";\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookEventName,\n HookParadigm,\n HookResponse,\n NotificationEvent,\n PermissionRequestEvent,\n PlatformCapabilities,\n PlatformId,\n PostToolUseEvent,\n PostToolUseFailureEvent,\n PostCompactEvent,\n PreCompactEvent,\n PreToolUseEvent,\n SessionEndEvent,\n SessionStartEvent,\n ServerDef,\n SkillDef,\n StopEvent,\n SubagentStartEvent,\n SubagentStopEvent,\n Transport,\n UserPromptSubmitEvent,\n} from \"../../core/types.js\";\nimport { renderSkillMd } from \"../claude-code/render.js\";\nimport { ensureDir } from \"../../core/paths.js\";\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\nimport {\n buildHomeBinHookCommand,\n buildWrappedStdio,\n isHomeBinHookCommand,\n} from \"../../core/spawn.js\";\nimport { normalizeSessionSource } from \"../claude-code/wire.js\";\n\nconst HOST: PlatformId = \"kimi\";\nconst MCP_ROOT_KEY = \"mcpServers\";\n\n// ─────────────────────────────────────────────────────────────────────────\n// Native shapes\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Raw Kimi CLI hook payload (Claude-style: PascalCase event, snake_case fields). */\ninterface KimiHookInput {\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_response?: unknown;\n session_id?: string;\n cwd?: string;\n hook_event_name?: string;\n source?: string;\n prompt?: string;\n is_error?: boolean;\n stop_hook_active?: boolean;\n trigger?: string;\n message?: string;\n reason?: string;\n // PostToolUseFailure — the failure message.\n error?: string;\n // SubagentStart / SubagentStop — Kimi sends agent_name (NOT agent_id /\n // agent_type) plus prompt (start) / response (stop).\n agent_name?: string;\n response?: string;\n connector?: string;\n}\n\n/** One `[[hooks]]` array-of-tables entry as Kimi stores it in config.toml. */\ninterface KimiTomlHook {\n event: string;\n matcher?: string;\n command: string;\n [key: string]: unknown;\n}\n\n/** Parsed config.toml shape we care about (rest preserved verbatim). */\ninterface KimiConfigToml {\n hooks?: KimiTomlHook[];\n [key: string]: unknown;\n}\n\n/** Native stdio MCP server entry under `mcpServers`. */\ninterface KimiStdioServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/** Native remote MCP server entry under `mcpServers`. */\ninterface KimiHttpServer {\n url: string;\n /**\n * Present only for a legacy SSE endpoint. Per the kimi mcp docs a bare `url`\n * (no transport) IS an HTTP server; `transport:\"sse\"` selects the older\n * HTTP+SSE transport.\n */\n transport?: \"sse\";\n headers?: Record<string, string>;\n}\n\n/**\n * Kimi CLI hook events agent-connector registers: every canonical event in the\n * core model — Kimi documents all of them as native hooks (PascalCase 1:1). The\n * PreToolUse matcher below is charset-clean (Rust-regex safe: no look-around) so\n * Kimi's matcher accepts it; copied in spirit from the Codex/context-mode\n * matchers. Order mirrors the core ALL_EVENTS sequence.\n */\nconst KIMI_HOOK_EVENTS = [\n \"SessionStart\",\n \"SessionEnd\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PreCompact\",\n \"Stop\",\n \"Notification\",\n \"PermissionRequest\",\n \"PostToolUseFailure\",\n \"SubagentStart\",\n \"SubagentStop\",\n \"PostCompact\",\n] as const;\ntype KimiHookEventName = (typeof KIMI_HOOK_EVENTS)[number];\n\n/**\n * Canonical events with NO Kimi analog. Kimi documents a native hook for EVERY\n * current core event, so this is empty today. It stays as the seam: if a future\n * core HookEventName lands that Kimi cannot fire, add it here and declared hooks\n * for it warn-skip at install — the degradation is reported, never silent.\n */\nconst WARN_SKIP_EVENTS: ReadonlySet<HookEventName> = new Set<HookEventName>([]);\n\nconst PRE_TOOL_USE_MATCHER =\n \"Bash|Shell|shell|exec_command|Read|Edit|Write|WebFetch|Agent|mcp__\";\n\n// ─────────────────────────────────────────────────────────────────────────\n// Adapter\n// ─────────────────────────────────────────────────────────────────────────\n\nexport class KimiAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Kimi CLI\";\n readonly paradigm: HookParadigm = \"json-stdio\";\n\n readonly capabilities: PlatformCapabilities = {\n // Memory surface: AGENTS.md-first managed block via the BaseAdapter default\n // (memoryTargets: project <projectDir>/AGENTS.md; user scope where documented).\n supportsMemory: true,\n // Kimi documents a native hook for EVERY canonical event. BLOCKABLE decisions\n // (deny that affects the flow) are honored only for PreToolUse, Stop and\n // UserPromptSubmit per the docs; the rest fire observation-only, but we still\n // register them so a connector's handler runs (e.g. for telemetry/context).\n preToolUse: true,\n postToolUse: true,\n preCompact: true,\n sessionStart: true,\n sessionEnd: true,\n userPromptSubmit: true,\n stop: true,\n notification: true,\n permissionRequest: true,\n postToolUseFailure: true,\n subagentStart: true,\n subagentStop: true,\n postCompact: true,\n // Kimi cannot rewrite args/output nor inject session context — deny-only.\n canModifyArgs: false,\n canModifyOutput: false,\n canInjectSessionContext: false,\n // Kimi documents three MCP transports: stdio, HTTP and (legacy) SSE — a\n // url entry with transport:\"sse\" (kimi.com/code/docs/en/kimi-code-cli/\n // customization/mcp.html: \"supports three MCP server connection methods\").\n transports: [\"stdio\", \"http\", \"sse\"],\n // Skills surface: Kimi reads SKILL.md from ~/.kimi-code/skills/<name>/SKILL.md\n // (user scope) and .kimi-code/skills/<name>/SKILL.md (project scope).\n // Confirmed: kilo-pi-ground-truth.md § \"Already-known skills gaps\".\n supportsSkills: true,\n // Native passthrough hooks: Kimi's observation-only single-host events —\n // StopFailure, PermissionResult, Interrupt — have NO normalized HookEventName\n // (below the >=3-host core bar; see\n // docs/research/host-specific-hook-events-design.md). A connector reaches them\n // by declaring platforms[\"kimi\"].nativeHooks; installHooks writes those\n // event-name [[hooks]] entries verbatim, and the generic uninstall reverses them.\n supportsNativeHooks: true,\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(_projectDir: string): DetectedPlatform {\n const baseDir = this.baseDir();\n const mcpPath = join(baseDir, \"mcp.json\");\n const configPath = join(baseDir, \"config.toml\");\n const installed = existsSync(baseDir) || existsSync(mcpPath) || existsSync(configPath);\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath: mcpPath,\n scope: \"user\",\n reason: installed\n ? `found Kimi CLI config under ${baseDir}`\n : `no Kimi CLI config at ${baseDir}`,\n // Path confidence is high: the ~/.kimi-code base (override $KIMI_CODE_HOME) is\n // the primary-doc-verified shape (moonshotai.github.io/kimi-code/en/\n // configuration/config-files.html) and live-confirmed via `kimi doctor config`\n // on @moonshot-ai/kimi-code v0.18.0.\n confidence: \"high\",\n };\n }\n\n // ── Native paths ───────────────────────────────────────────────────────\n\n getConfigDir(_ctx: InstallContext): string {\n return this.baseDir();\n }\n\n /** MCP registration file (JSON). */\n getServerConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"mcp.json\");\n }\n\n /** Hook registration file (TOML) — distinct from the MCP file. */\n getHookConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"config.toml\");\n }\n\n /**\n * `$KIMI_CODE_HOME` (with `~` expansion, then resolved) when set & non-empty,\n * else `~/.kimi-code`. This mirrors `codexConfigHome()` in core/host-paths.ts\n * (tilde-expand-then-default) so the writer and any probe agree on the dir.\n *\n * Per the official Kimi Code CLI docs the config dir is `~/.kimi-code/`,\n * overridable ONLY by `$KIMI_CODE_HOME` — there is NO `$KIMI_HOME` env var, so\n * the old `$KIMI_HOME`-first resolution was the bug (with `$KIMI_HOME` set the\n * adapter wrote where Kimi never reads). Doc:\n * moonshotai.github.io/kimi-code/en/configuration/config-files.html;\n * live-confirmed by `kimi doctor config` on @moonshot-ai/kimi-code v0.18.0.\n */\n private baseDir(): string {\n const env = process.env.KIMI_CODE_HOME;\n if (env && env.trim() !== \"\") {\n if (env.startsWith(\"~\")) {\n return join(homedir(), env.replace(/^~[/\\\\]?/, \"\"));\n }\n return resolve(env);\n }\n return join(homedir(), \".kimi-code\");\n }\n\n // ── MCP server install / uninstall (mcp.json → mcpServers.<id>) ──────────\n\n installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const override = connector.platforms[HOST]?.server;\n if (!connector.server || override === false) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: connector.server\n ? \"server registration disabled for kimi\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n\n const server: ServerDef =\n override && typeof override === \"object\"\n ? { ...connector.server, ...override }\n : connector.server;\n\n const changes: ChangeRecord[] = [];\n // Honesty: Kimi documents only stdio/http/sse. A connector declaring another\n // transport (e.g. the non-spec \"ws\") is still rendered best-effort as a bare\n // URL entry, but the mismatch is REPORTED rather than silently misregistered\n // — same \"degradation is never silent\" posture as the hook warn-skips.\n if (!this.capabilities.transports.includes(server.transport)) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `transport \"${server.transport}\" is not a Kimi MCP transport (stdio/http/sse); registered best-effort as a URL entry`,\n });\n }\n\n const serverPath = this.getServerConfigPath(ctx);\n const entry = this.renderServerEntry(ctx, server);\n changes.push(\n this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun),\n );\n return changes;\n }\n\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\n const serverPath = this.getServerConfigPath(ctx);\n return [\n this.removeServerFromJson(serverPath, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun),\n ];\n }\n\n /**\n * Render a normalized ServerDef into Kimi's native mcpServers entry. Kimi's\n * mcp.json has no documented native interpolation, so `${env:VAR}` refs are\n * resolved to literals at install time (same posture as the TOML hosts).\n */\n private renderServerEntry(\n ctx: InstallContext,\n server: ServerDef,\n ): KimiStdioServer | KimiHttpServer {\n const transport: Transport = server.transport;\n\n if (transport === \"stdio\") {\n let command = server.command ?? \"\";\n let args = [...(server.args ?? [])];\n\n // Transparent telemetry wrapping: route through\n // `<homeBin> serve --connector <id> -- <command> <args...>`.\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\n\n command = resolveEnvRefsDeep(command);\n args = resolveEnvRefsDeep(args);\n\n const entry: KimiStdioServer = { command };\n if (args.length > 0) entry.args = args;\n const env = this.renderEnv(server.env);\n if (env) entry.env = env;\n return entry;\n }\n\n // Remote transports — Kimi registers a URL entry. A bare `url` is an HTTP\n // server; a legacy HTTP+SSE endpoint needs transport:\"sse\". (ws is not a\n // Kimi-documented transport — it falls through as a plain url, best-effort.)\n const entry: KimiHttpServer = { url: resolveEnvRefsDeep(server.url ?? \"\") };\n if (transport === \"sse\") entry.transport = \"sse\";\n const headers = this.renderEnv(server.headers);\n if (headers) entry.headers = headers;\n return entry;\n }\n\n /** Resolve env/header values to literals (no native interpolation on Kimi). */\n private renderEnv(\n env: Record<string, string> | undefined,\n ): Record<string, string> | undefined {\n if (!env || Object.keys(env).length === 0) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(env))) {\n out[k] = String(v);\n }\n return out;\n }\n\n // ── Skills surface ────────────────────────────────────────────────────────\n // Kimi reads SKILL.md from <baseDir>/skills/<name>/SKILL.md.\n // user scope: ~/.kimi-code/skills/<name>/SKILL.md\n // project scope: <projectDir>/.kimi-code/skills/<name>/SKILL.md\n // Confirmed: kilo-pi-ground-truth.md § \"Already-known skills gaps\".\n\n private skillsDir(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \".kimi-code\", \"skills\")\n : join(this.baseDir(), \"skills\");\n }\n\n private skillDir(ctx: InstallContext, name: string): string {\n return join(this.skillsDir(ctx), name);\n }\n\n override installSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.skills === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for kimi\" }];\n }\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n changes.push(\n this.writeContentFile(join(dir, \"SKILL.md\"), this.renderSkill(skill), ctx.dryRun),\n );\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\n });\n continue;\n }\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\n }\n }\n return changes;\n }\n\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\n for (const rel of Object.keys(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) continue;\n changes.push(this.removeContentFile(target, ctx.dryRun));\n }\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\n }\n return changes;\n }\n\n private renderSkill(skill: SkillDef): string {\n return renderSkillMd(skill);\n }\n\n // ── Hook install / uninstall (config.toml → [[hooks]]) ───────────────────\n\n installHooks(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const override = connector.platforms[HOST];\n\n // `hooks: false` disables only the NORMALIZED events (effectiveHookEvents /\n // warnSkipHookEvents already return [] for it). nativeHooks is a sibling,\n // kimi-scoped declaration on the same override and installs regardless.\n const events = this.effectiveHookEvents(ctx);\n const dropped = this.warnSkipHookEvents(ctx);\n const nativeHooks = override?.nativeHooks ?? {};\n const nativeEvents = Object.keys(nativeHooks);\n const path = this.getHookConfigPath(ctx);\n\n if (events.length === 0 && dropped.length === 0 && nativeEvents.length === 0) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: override?.hooks === false ? \"hooks disabled for kimi\" : \"no hooks declared\",\n },\n ];\n }\n\n const cfg = this.readToml(path);\n // Kimi's `hooks` is an ARRAY-of-tables ([[hooks]]); the BaseAdapter object-map\n // guard would mis-flag it. Inverse guard: a present-but-non-array `hooks`\n // (hand-edited to an object/primitive) cannot take `.push`/`.findIndex` — warn\n // and skip so the user's malformed value is preserved untouched.\n if (cfg.hooks !== undefined && !Array.isArray(cfg.hooks)) {\n return [\n {\n platform: this.id,\n action: \"warn\",\n path,\n detail: `existing \"hooks\" in ${path} is not an array; left untouched (fix it, then re-run)`,\n },\n ];\n }\n const hooks = (cfg.hooks ??= []);\n const changes: ChangeRecord[] = [];\n let mutated = false;\n\n // Declared events Kimi cannot fire are reported, never silently dropped.\n for (const event of dropped) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n path,\n detail: `${event} has no Kimi CLI hook equivalent — skipped`,\n });\n }\n\n for (const event of events) {\n const desired = this.renderHook(ctx, event);\n // Match our entry FOR THIS EVENT — isOurHook alone would find whichever\n // of our entries comes first and clobber a sibling event's registration.\n const idx = hooks.findIndex((h) => this.isOurHook(ctx, h) && h?.event === event);\n if (idx < 0) {\n hooks.push(desired);\n changes.push({ platform: this.id, action: \"create\", path, detail: `hooks.${event}` });\n mutated = true;\n } else if (JSON.stringify(hooks[idx]) !== JSON.stringify(desired)) {\n hooks[idx] = desired;\n changes.push({ platform: this.id, action: \"update\", path, detail: `hooks.${event}` });\n mutated = true;\n } else {\n changes.push({ platform: this.id, action: \"skip\", path, detail: `hooks.${event}` });\n }\n }\n\n // NATIVE passthrough events: Kimi-native event names (e.g. StopFailure,\n // PermissionResult, Interrupt) written VERBATIM as [[hooks]] entries — no\n // canonical mapping, same command shape + idempotency. Matched by EXACT\n // command so a native name that coincides with a canonical event never\n // clobbers it.\n for (const event of nativeEvents) {\n const command = buildHomeBinHookCommand(ctx.homeBinPath, HOST, event, connector.id);\n const desired = { event, matcher: nativeHooks[event]?.matcher ?? \"\", command };\n const idx = hooks.findIndex((h) => h?.event === event && h?.command === command);\n if (idx < 0) {\n hooks.push(desired);\n changes.push({ platform: this.id, action: \"create\", path, detail: `hooks.${event} (native)` });\n mutated = true;\n } else if (JSON.stringify(hooks[idx]) !== JSON.stringify(desired)) {\n hooks[idx] = desired;\n changes.push({ platform: this.id, action: \"update\", path, detail: `hooks.${event} (native)` });\n mutated = true;\n } else {\n changes.push({ platform: this.id, action: \"skip\", path, detail: `hooks.${event} (native)` });\n }\n }\n\n if (mutated) this.writeToml(path, cfg, ctx.dryRun);\n return changes;\n }\n\n uninstallHooks(ctx: InstallContext): ChangeRecord[] {\n const path = this.getHookConfigPath(ctx);\n if (!existsSync(path)) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no config.toml\" }];\n }\n const cfg = this.readToml(path);\n const hooks = cfg.hooks;\n if (!Array.isArray(hooks) || hooks.length === 0) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no hooks present\" }];\n }\n\n const kept = hooks.filter((h) => !this.isOurHook(ctx, h));\n const removed = hooks.length - kept.length;\n if (removed === 0) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no agent-connector hooks present\" }];\n }\n\n if (kept.length > 0) cfg.hooks = kept;\n else delete cfg.hooks;\n this.writeToml(path, cfg, ctx.dryRun);\n return [{ platform: this.id, action: \"remove\", path, detail: `hooks (${removed})` }];\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const serverPath = this.getServerConfigPath(ctx);\n const hookPath = this.getHookConfigPath(ctx);\n const connectorId = ctx.connector.id;\n const homeBin = ctx.homeBinPath;\n const hookEvents = this.effectiveHookEvents(ctx);\n const checks: HealthCheck[] = [\n {\n name: `${this.name}: mcp.json present`,\n check: () =>\n existsSync(serverPath)\n ? { status: \"OK\", detail: serverPath }\n : { status: \"FAIL\", detail: `not found: ${serverPath}` },\n },\n {\n name: `${this.name}: mcpServers.${connectorId} registered`,\n check: () => {\n if (!ctx.connector.server) {\n return { status: \"OK\", detail: \"no MCP server declared\" };\n }\n const cfg = this.readJson<Record<string, Record<string, unknown>>>(serverPath);\n const bucket = cfg?.[MCP_ROOT_KEY];\n const present =\n typeof bucket === \"object\" && bucket !== null && connectorId in bucket;\n return present\n ? { status: \"OK\", detail: `mcpServers.${connectorId}` }\n : { status: \"FAIL\", detail: `mcpServers.${connectorId} not found in ${serverPath}` };\n },\n },\n {\n name: `${this.name}: hook command registered`,\n check: () => {\n if (hookEvents.length === 0) {\n return { status: \"OK\", detail: \"no hooks declared\" };\n }\n if (!existsSync(hookPath)) {\n return { status: \"FAIL\", detail: `not found: ${hookPath}` };\n }\n const cfg = this.readToml(hookPath);\n const registered = (cfg.hooks ?? []).some((h) =>\n isHomeBinHookCommand(h?.command, homeBin, connectorId),\n );\n return registered\n ? { status: \"OK\", detail: \"hook command present\" }\n : { status: \"FAIL\", detail: `no hook for ${connectorId} in ${hookPath}` };\n },\n },\n ];\n for (const skill of ctx.connector.skills) {\n const p = join(this.skillDir(ctx, skill.name), \"SKILL.md\");\n checks.push({\n name: `${this.name}: skill ${skill.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n return checks;\n }\n\n // ── Runtime: parse Kimi stdin JSON → normalized event ────────────────────\n\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\n const input = (raw ?? {}) as KimiHookInput;\n const connectorId = typeof input.connector === \"string\" ? input.connector : \"\";\n const sessionId = input.session_id ?? `pid-${process.ppid}`;\n const projectDir = input.cwd ?? process.env.KIMI_PROJECT_DIR ?? process.cwd();\n\n const base = {\n hostPlatform: HOST,\n connectorId,\n sessionId,\n projectDir,\n raw,\n } as const;\n\n switch (event) {\n case \"PreToolUse\": {\n const ev: PreToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n };\n return ev;\n }\n case \"PostToolUse\": {\n const ev: PostToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n ...(toolResponseToString(input.tool_response) !== undefined\n ? { toolOutput: toolResponseToString(input.tool_response) }\n : {}),\n isError: input.is_error ?? false,\n };\n return ev;\n }\n case \"SessionStart\": {\n const ev: SessionStartEvent = {\n ...base,\n source: normalizeSessionSource(input.source),\n };\n return ev;\n }\n case \"SessionEnd\": {\n const ev: SessionEndEvent = {\n ...base,\n ...(typeof input.message === \"string\" ? { reason: input.message } : {}),\n };\n return ev;\n }\n case \"UserPromptSubmit\": {\n const ev: UserPromptSubmitEvent = {\n ...base,\n prompt: typeof input.prompt === \"string\" ? input.prompt : \"\",\n };\n return ev;\n }\n case \"PreCompact\": {\n const ev: PreCompactEvent = {\n ...base,\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\n ? { trigger: input.trigger }\n : {}),\n };\n return ev;\n }\n case \"PostCompact\": {\n // Kimi fires PostCompact after compaction completes (observation only),\n // payload `trigger`: manual|auto — mirrors PreCompact.\n const ev: PostCompactEvent = {\n ...base,\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\n ? { trigger: input.trigger }\n : {}),\n };\n return ev;\n }\n case \"Stop\": {\n const ev: StopEvent = {\n ...base,\n ...(typeof input.stop_hook_active === \"boolean\"\n ? { stopHookActive: input.stop_hook_active }\n : {}),\n };\n return ev;\n }\n case \"Notification\": {\n const ev: NotificationEvent = {\n ...base,\n message: typeof input.message === \"string\" ? input.message : \"\",\n };\n return ev;\n }\n case \"PermissionRequest\": {\n // Kimi fires PermissionRequest just before waiting for user approval\n // (observation only); payload subject is the tool name.\n const ev: PermissionRequestEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n };\n return ev;\n }\n case \"PostToolUseFailure\": {\n // Kimi documents tool_name/tool_input/error only (no tool_use_id /\n // is_interrupt / duration_ms) — the optionals stay unset.\n const ev: PostToolUseFailureEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n error: typeof input.error === \"string\" ? input.error : \"\",\n };\n return ev;\n }\n case \"SubagentStart\": {\n // Kimi sends agent_name (the matcher subject) — normalize it as\n // agentType; there is no agent_id. The start prompt rides in `raw`.\n const ev: SubagentStartEvent = {\n ...base,\n ...(typeof input.agent_name === \"string\"\n ? { agentType: input.agent_name }\n : {}),\n };\n return ev;\n }\n case \"SubagentStop\": {\n const ev: SubagentStopEvent = {\n ...base,\n ...(typeof input.agent_name === \"string\"\n ? { agentType: input.agent_name }\n : {}),\n ...(typeof input.response === \"string\"\n ? { lastAssistantMessage: input.response }\n : {}),\n };\n return ev;\n }\n default: {\n const _never: never = event;\n throw new Error(`unsupported kimi hook event: ${String(_never)}`);\n }\n }\n }\n\n // ── Runtime: normalized response → Kimi native hook reply ────────────────\n\n formatReply(event: HookEventName, response: HookResponse): HookReply {\n const decision = response.decision ?? \"allow\";\n\n // deny → block the pending tool call. Kimi Code uses the Claude/Codex reply\n // shape: EXIT 0 + a `hookSpecificOutput` JSON object on stdout carrying\n // permissionDecision:\"deny\". PreToolUse is the only event using this\n // structured reply; the other blockable events (Stop, UserPromptSubmit,\n // SubagentStop) use the generic exit-2 protocol below.\n if (decision === \"deny\" && event === \"PreToolUse\") {\n return {\n exitCode: 0,\n stdout: JSON.stringify({\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"deny\",\n permissionDecisionReason: response.reason ?? \"Blocked by hook\",\n },\n }),\n };\n }\n\n // PostToolUseFailure (feedback beside the error) and SubagentStart (context\n // for the subagent) are observe/context-only: Kimi's documented protocol\n // adds non-empty stdout on exit 0 to context, so \"context\" emits the text\n // PLAIN (no JSON envelope) and a \"deny\" DEGRADES to the same shape carrying\n // the reason (the tool already failed / the spawn is not blockable).\n if (event === \"PostToolUseFailure\" || event === \"SubagentStart\") {\n const context =\n decision === \"context\"\n ? response.additionalContext\n : decision === \"deny\"\n ? response.reason ?? response.additionalContext\n : undefined;\n if (context) return { exitCode: 0, stdout: context };\n return { exitCode: 0 };\n }\n\n // BLOCKABLE events via Kimi's generic block protocol: deny → EXIT 2 with the\n // reason on stderr (fed back to the model). Per the kimi-code docs the\n // blockable events are PreToolUse (handled above with its structured reply),\n // Stop and UserPromptSubmit; SubagentStop reuses the same Stop semantics. For\n // Stop the stderr reason lets the model continue; for UserPromptSubmit EXIT 2\n // blocks the turn (the model is not called). \"context\" rides the exit-0\n // stdout channel (Kimi appends non-empty stdout to context).\n if (event === \"SubagentStop\" || event === \"Stop\" || event === \"UserPromptSubmit\") {\n if (decision === \"deny\") {\n return { exitCode: 2, stderr: response.reason ?? \"Blocked by hook\" };\n }\n if (decision === \"context\" && response.additionalContext) {\n return { exitCode: 0, stdout: response.additionalContext };\n }\n return { exitCode: 0 };\n }\n\n // allow / modify / context / ask / unsupported-event → passthrough (exit 0,\n // empty stdout). Kimi cannot rewrite args/output or inject context, so those\n // are dropped.\n return { exitCode: 0 };\n }\n\n // ── Internal helpers ───────────────────────────────────────────────────\n\n /** Which canonical hook events to register for Kimi, honoring overrides. */\n private effectiveHookEvents(ctx: InstallContext): KimiHookEventName[] {\n if (ctx.connector.platforms[HOST]?.hooks === false) return [];\n return KIMI_HOOK_EVENTS.filter((e) => ctx.connector.hookEvents.includes(e));\n }\n\n /** Declared events Kimi has no analog for — install reports a warn-skip. */\n private warnSkipHookEvents(ctx: InstallContext): HookEventName[] {\n if (ctx.connector.platforms[HOST]?.hooks === false) return [];\n return ctx.connector.hookEvents.filter((e) => WARN_SKIP_EVENTS.has(e));\n }\n\n /**\n * Render one `[[hooks]]` entry pointing at the stable home binary. Only the\n * PreToolUse deny gate carries the native tool matcher; the E1 events register\n * \"\" (match every tool failure / agent name) and the universal entrypoint\n * applies the connector's own matcher at runtime.\n */\n private renderHook(ctx: InstallContext, event: KimiHookEventName): KimiTomlHook {\n const command = buildHomeBinHookCommand(ctx.homeBinPath, HOST, event, ctx.connector.id);\n return {\n event,\n matcher: event === \"PreToolUse\" ? PRE_TOOL_USE_MATCHER : \"\",\n command,\n };\n }\n\n /**\n * Does this `[[hooks]]` entry belong to this connector? Anchored on the\n * home-bin + connector-id token (isHomeBinHookCommand) so uninstalling a\n * shared-prefix connector id never strips a sibling's hook.\n */\n private isOurHook(ctx: InstallContext, hook: KimiTomlHook | undefined): boolean {\n if (!hook || typeof hook !== \"object\") return false;\n return isHomeBinHookCommand(hook.command, ctx.homeBinPath, ctx.connector.id);\n }\n\n // ── TOML config IO (config.toml is TOML; MCP stays JSON via BaseAdapter) ──\n\n private readToml(path: string): KimiConfigToml {\n if (!existsSync(path)) return {};\n try {\n return TOML.parse(readFileSync(path, \"utf8\")) as unknown as KimiConfigToml;\n } catch {\n return {};\n }\n }\n\n private writeToml(path: string, data: KimiConfigToml, dryRun: boolean): void {\n if (dryRun) return;\n ensureDir(dirname(path));\n // NOTE: a @iarna/toml parse→stringify round-trip preserves config VALUES but\n // NOT user comments or the original key ordering/formatting in config.toml.\n // Values are safe; comments authored by the user are not preserved.\n writeFileSync(path, TOML.stringify(data as never), \"utf8\");\n }\n}\n\n/** Best-effort stringify of Kimi's tool_response into a normalized toolOutput. */\nfunction toolResponseToString(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n\nexport const adapter = new KimiAdapter();\nexport default adapter;\n"],"mappings":"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","names":["entry"]}
@@ -1,21 +1,23 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ normalizeSessionSource
4
+ } from "./chunk-H53QZQJI.js";
2
5
  import {
3
6
  resolveEnvRefsDeep
4
7
  } from "./chunk-DBQMX75U.js";
5
8
  import {
6
9
  BaseAdapter
7
- } from "./chunk-PFDUGDOA.js";
10
+ } from "./chunk-3I7UG52L.js";
8
11
  import {
9
12
  renderSkillMd
10
- } from "./chunk-7L6ITC4T.js";
13
+ } from "./chunk-IEGR4TP3.js";
11
14
  import {
12
15
  buildHomeBinHookCommand,
13
- buildServeWrapperCommand,
14
- isHomeBinHookCommand,
15
- shouldWrapForTelemetry
16
- } from "./chunk-I5MLE6S7.js";
17
- import "./chunk-N6HH7K6P.js";
18
- import "./chunk-TRQKHP7D.js";
16
+ buildWrappedStdio,
17
+ isHomeBinHookCommand
18
+ } from "./chunk-TO57WYBB.js";
19
+ import "./chunk-ZY25RG4Y.js";
20
+ import "./chunk-QY42WGBX.js";
19
21
 
20
22
  // src/adapters/kiro/index.ts
21
23
  import { existsSync } from "fs";
@@ -167,18 +169,7 @@ var KiroAdapter = class extends BaseAdapter {
167
169
  if (transport === "stdio") {
168
170
  let command = server.command ?? "";
169
171
  let args = [...server.args ?? []];
170
- if (shouldWrapForTelemetry(server, ctx.connector.telemetry)) {
171
- const wrapped = buildServeWrapperCommand(
172
- ctx.homeBinPath,
173
- ctx.connector.id,
174
- command,
175
- args,
176
- ctx.scope,
177
- this.id
178
- );
179
- command = wrapped.command;
180
- args = wrapped.args;
181
- }
172
+ ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));
182
173
  const entry2 = { command: resolveEnvRefsDeep(command) };
183
174
  if (args.length > 0) entry2.args = resolveEnvRefsDeep(args);
184
175
  const env = this.renderEnv(server.env);
@@ -525,18 +516,6 @@ function toolResponseToString(value) {
525
516
  return String(value);
526
517
  }
527
518
  }
528
- function normalizeSessionSource(source) {
529
- switch (source) {
530
- case "compact":
531
- return "compact";
532
- case "resume":
533
- return "resume";
534
- case "clear":
535
- return "clear";
536
- default:
537
- return "startup";
538
- }
539
- }
540
519
  var adapter = new KiroAdapter();
541
520
  var kiro_default = adapter;
542
521
  export {
@@ -544,4 +523,4 @@ export {
544
523
  adapter,
545
524
  kiro_default as default
546
525
  };
547
- //# sourceMappingURL=kiro-X7JVLAN7.js.map
526
+ //# sourceMappingURL=kiro-VTLX7CMF.js.map