@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
@@ -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 back the install. Their scope-resolution DIFFERS (verified against the\n * kimi-code source, MIT/public — see the Native paths section):\n * - mcp.json → `mcpServers.<id>` MCP registration (JSON, stdio shape:\n * {command,args,env}). Project-local at `<projectDir>/.kimi-code/mcp.json`\n * under project scope, else the user base dir (`$KIMI_CODE_HOME` ||\n * `~/.kimi-code`). Handled via BaseAdapter's JSON helpers.\n * - config.toml → `[[hooks]]` array-of-tables (TOML), each table — ALWAYS the\n * user base dir (Kimi reads no project-local config.toml).\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 // PostToolUse (success) — tool output as a string (kimi turn/index.ts:739,\n // toolOutputText(output).slice(0,2000)). kimi has NO `tool_response` field\n // (0 hits repo-wide; that key is a Claude-Code false-friend); the EVENT TYPE\n // (PostToolUse vs PostToolUseFailure, chosen at turn/index.ts:731) encodes\n // success/failure, so there is also no `is_error` field on the wire.\n tool_output?: string;\n session_id?: string;\n cwd?: string;\n hook_event_name?: string;\n source?: string;\n // UserPromptSubmit — kimi sends `readonly ContentPart[]` (turn/index.ts:571,\n // sole call site; a text prompt is [{type:'text', text}], kosong\n // message.ts:3-6). SubagentStart sends a plain string. Accept both.\n prompt?: unknown;\n is_error?: boolean;\n stop_hook_active?: boolean;\n trigger?: string;\n message?: string;\n reason?: string;\n // PostToolUseFailure — kimi sends a KimiErrorPayload OBJECT\n // {code, message, name?, details?, retryable} (turn/index.ts:738 via\n // toKimiErrorPayload; agent-core errors/serialize.ts:22-27), NOT a string.\n error?: unknown;\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 <projectDir>/.kimi-code/skills/<name>/SKILL.md (project\n // scope). Both are documented scan dirs (docs/en/customization/skills.md;\n // \"Project > User\" priority). Project-local mcp.json is likewise read\n // (docs/en/customization/mcp.md); config.toml/hooks are user-only.\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 // Kimi's config surfaces are NOT uniformly project-aware — each one resolves\n // from a different root, verified against the kimi-code source (MIT, public):\n // - mcp.json (MCP) → project-local SUPPORTED. config-loader.ts loads\n // three sources and `project: join(cwd, '.kimi-code', 'mcp.json')` wins\n // over user (`~/.kimi-code/mcp.json`). Doc: docs/en/customization/mcp.md\n // (\"Project level: .kimi-code/mcp.json\").\n // - skills → project-local SUPPORTED (.kimi-code/skills/, scanned\n // above the user dir). Doc: docs/en/customization/skills.md.\n // - config.toml (hooks) → USER-ONLY. config/path.ts resolveConfigPath()\n // resolves it solely from resolveKimiHome (KIMI_CODE_HOME ?? ~/.kimi-code);\n // config/toml.ts loadRuntimeConfigSafe reads that SINGLE file with no\n // cwd/project merge. There is no project-local config.toml — so a\n // project-scope install must still write hooks to the user base dir or\n // Kimi never loads them.\n // Hence getConfigDir() (the project-aware root) drives MCP + skills, while\n // getHookConfigPath() stays pinned to baseDir() regardless of scope.\n\n /**\n * Project-aware config dir: `<projectDir>/.kimi-code` for project scope, else\n * the user base dir. Mirrors codex's getConfigDir. Drives the surfaces Kimi\n * reads project-locally (mcp.json + skills) — NOT config.toml (see below).\n */\n getConfigDir(ctx: InstallContext): string {\n if (ctx.scope === \"project\") return join(ctx.projectDir, \".kimi-code\");\n return this.baseDir();\n }\n\n /** MCP registration file (JSON) — project-local under project scope. */\n getServerConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"mcp.json\");\n }\n\n /**\n * Hook registration file (TOML) — ALWAYS the user base dir. Kimi resolves\n * config.toml only from KIMI_CODE_HOME ?? ~/.kimi-code (no project-local\n * variant), so this intentionally ignores ctx.scope: a project-scope install\n * writes hooks here so Kimi actually fires them.\n */\n getHookConfigPath(_ctx: InstallContext): string {\n return join(this.baseDir(), \"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 <skills dir>/<name>/SKILL.md, scanning project then\n // user (docs/en/customization/skills.md, \"Project > User\"):\n // user scope: ~/.kimi-code/skills/<name>/SKILL.md\n // project scope: <projectDir>/.kimi-code/skills/<name>/SKILL.md\n // Derived from getConfigDir(ctx) so skills + mcp.json share ONE scope-resolved\n // root (config.toml/hooks deliberately do not — see getHookConfigPath).\n\n private skillsDir(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"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 symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\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 const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\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 ...(typeof input.tool_output === \"string\"\n ? { toolOutput: input.tool_output }\n : {}),\n // kimi sends no `is_error` on the wire; success is encoded by the\n // event type (PostToolUseFailure fires on failure), so `?? false`\n // is always the correct value here.\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: extractPromptText(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: extractErrorMessage(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/**\n * Extract the prompt text from Kimi's UserPromptSubmit payload. Kimi sends\n * `readonly ContentPart[]` (turn/index.ts:571); a text prompt is\n * [{type:'text', text}] (kosong message.ts:3-6). Concatenate the `text` of the\n * text parts. A plain string (e.g. SubagentStart) is returned as-is.\n */\nfunction extractPromptText(prompt: unknown): string {\n if (typeof prompt === \"string\") return prompt;\n if (Array.isArray(prompt)) {\n return prompt\n .map((part) =>\n part && typeof (part as { text?: unknown }).text === \"string\"\n ? (part as { text: string }).text\n : \"\",\n )\n .join(\"\");\n }\n return \"\";\n}\n\n/**\n * Extract the failure message from Kimi's PostToolUseFailure payload. Kimi\n * sends a KimiErrorPayload object {code, message, ...} (turn/index.ts:738);\n * use its `message`. A plain string is accepted defensively.\n */\nfunction extractErrorMessage(error: unknown): string {\n if (typeof error === \"string\") return error;\n if (error && typeof (error as { message?: unknown }).message === \"string\") {\n return (error as { message: string }).message;\n }\n return \"\";\n}\n\nexport const adapter = new KimiAdapter();\nexport default adapter;\n"],"mappings":"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","names":["entry"]}
@@ -1,21 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  normalizeSessionSource
4
- } from "./chunk-PSGTHJQU.js";
4
+ } from "./chunk-H53QZQJI.js";
5
5
  import {
6
6
  resolveEnvRefsDeep
7
- } from "./chunk-XXLCMSD3.js";
7
+ } from "./chunk-BEFVJ2OE.js";
8
8
  import {
9
9
  BaseAdapter,
10
10
  renderSkillMd
11
- } from "./chunk-3FINQ2ZF.js";
11
+ } from "./chunk-JTN3AKZO.js";
12
12
  import {
13
13
  buildHomeBinHookCommand,
14
14
  buildWrappedStdio,
15
15
  isHomeBinHookCommand
16
- } from "./chunk-Y3K6KJMS.js";
17
- import "./chunk-ILWHLGIC.js";
18
- import "./chunk-QYOUQCC6.js";
16
+ } from "./chunk-QSY74NAP.js";
17
+ import "./chunk-UMQ6NBQR.js";
18
+ import "./chunk-GZGLCCEE.js";
19
19
 
20
20
  // src/adapters/kiro/index.ts
21
21
  import { existsSync } from "fs";
@@ -81,7 +81,9 @@ var KiroAdapter = class extends BaseAdapter {
81
81
  // user-invokable from the Agent Hooks panel / Command Palette. WORKSPACE
82
82
  // (project) scope ONLY — Kiro does not scan ~/.kiro/hooks/ — so user scope
83
83
  // warn-skips (see installActions).
84
- supportsActions: true
84
+ supportsActions: true,
85
+ actionInvocationMode: "manual-hook",
86
+ actionAffordanceKind: "hook-panel"
85
87
  };
86
88
  // ── Detection ────────────────────────────────────────────────────────────
87
89
  detectInstalled(projectDir) {
@@ -593,4 +595,4 @@ export {
593
595
  adapter,
594
596
  kiro_default as default
595
597
  };
596
- //# sourceMappingURL=kiro-UWUCRKR3.js.map
598
+ //# sourceMappingURL=kiro-AQFXGOJX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/kiro/index.ts"],"sourcesContent":["/**\n * adapters/kiro — Kiro (AWS) platform adapter for agent-connector.\n *\n * Kiro is a json-stdio host with TWO native config surfaces that live in\n * DIFFERENT files (so getServerConfigPath ≠ getHookConfigPath):\n *\n * 1. MCP servers — `mcp.json` under `~/.kiro/settings/` (user) or\n * `<projectDir>/.kiro/settings/` (project). The file is JSONC; we WRITE\n * plain JSON (valid JSONC), mirroring the other JSON-config adapters. Root\n * key `mcpServers`; a stdio server is `{ command, args, env }`.\n * Ref: https://kiro.dev/docs/mcp/configuration/\n *\n * 2. Hooks — NOT a settings file but an AGENT file:\n * `~/.kiro/agents/kiro_default.json`. Kiro auto-loads the built-in default\n * agent `kiro_default` for a new chat session, so hooks must register on\n * THAT agent (a file literally named `default.json` would define an inactive\n * custom agent the user must `/agent`-swap to). We merge a `hooks` key into\n * the existing agent JSON, creating a minimal agent object if absent.\n * Ref: kiro.dev/docs/cli/custom-agents/configuration-reference#hooks-field\n *\n * Hook protocol is EXIT-CODE based (unlike Claude's JSON-decision wrapper):\n * - exit 0 → allow the action.\n * - exit 2 → block the action; the reason is written to stderr (PreToolUse).\n * - context injection → exit 0 with the guidance text written as PLAIN STDOUT\n * (NOT a JSON envelope). Kiro adds a hook's STDOUT to the agent's context\n * ONLY for agentSpawn and userPromptSubmit; for preToolUse / postToolUse /\n * stop the docs say STDOUT is \"captured but not shown\" — there is no\n * context channel, so a `context` decision on those degrades to exit 0.\n * Ref: https://kiro.dev/docs/cli/hooks (Hook output / Hook types).\n * Kiro CANNOT rewrite tool arguments or output (exit codes only), so\n * canModifyArgs / canModifyOutput are false; `modify` degrades to allow.\n *\n * Native hook event vocabulary differs from the canonical names and is mapped:\n * PreToolUse → preToolUse\n * PostToolUse → postToolUse\n * SessionStart → agentSpawn (Kiro's session-start equivalent)\n * UserPromptSubmit → userPromptSubmit\n * Stop → stop (documented Kiro hook)\n * Kiro has no equivalent for PreCompact / SessionEnd / Notification; those are\n * reported as a warn/skip at install time.\n *\n * Env handling: Kiro documents no `${env:VAR}` token of the framework's syntax,\n * so env/header/url refs are resolved to literals at install time via\n * resolveEnvRefsDeep — the safe default matching the Gemini/Codex adapters.\n *\n * Actions surface: Kiro reads `.kiro/hooks/<id>.kiro.hook` files (JSON) where a\n * `{ when:{ type:\"manual\" } }` Manual-Trigger paired with a\n * `{ then:{ type:\"runCommand\", command } }` Shell-Command action runs a local\n * shell command (NO LLM) and is user-invokable from the Agent Hooks panel /\n * Command Palette (kiro.dev/docs/hooks — \"Run Command\" action; verified against\n * real `.kiro.hook` files in the wild). For each AC action we write ONE fully\n * owned `.kiro/hooks/<id>.kiro.hook` that execs `<homeBin> action kiro <id>\n * --connector <id>`. CONSTRAINT (verified): Kiro discovers hooks ONLY from the\n * WORKSPACE `.kiro/hooks/` dir — `~/.kiro/hooks/` is NOT scanned — so actions\n * install at PROJECT scope only and warn-skip at user scope (mirrors warp's\n * project-only skills/actions precedent).\n *\n * Grounded in context-mode's proven Kiro adapter (src/adapters/kiro/*).\n */\n\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { BaseAdapter } from \"../base.js\";\nimport type { Adapter, HookReply, InstallContext, MemoryTarget, NormalizedEvent } from \"../spi.js\";\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookEventName,\n HookParadigm,\n HookResponse,\n PlatformCapabilities,\n PlatformId,\n PostToolUseEvent,\n PreToolUseEvent,\n ServerDef,\n SessionStartEvent,\n SkillDef,\n StopEvent,\n Transport,\n UserPromptSubmitEvent,\n} from \"../../core/types.js\";\nimport { renderSkillMd } from \"../claude-code/render.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 = \"kiro\";\nconst MCP_ROOT_KEY = \"mcpServers\";\n\n/** The built-in agent Kiro auto-loads for a new chat session. */\nconst DEFAULT_AGENT_FILE = \"kiro_default.json\";\n\n/**\n * Kiro-native hook event names (the keys under an agent file's `hooks` object).\n * Only the events Kiro actually fires for the json-stdio command paradigm.\n */\nconst KIRO_EVENT = {\n preToolUse: \"preToolUse\",\n postToolUse: \"postToolUse\",\n agentSpawn: \"agentSpawn\",\n userPromptSubmit: \"userPromptSubmit\",\n stop: \"stop\",\n} as const;\n\n/**\n * Map canonical event names → Kiro's native hook event names. Only the events\n * Kiro supports are present; PreCompact / SessionEnd / Notification have no Kiro\n * equivalent and are reported as a warn/skip at install time.\n */\nconst EVENT_MAP: Partial<Record<HookEventName, string>> = {\n PreToolUse: KIRO_EVENT.preToolUse,\n PostToolUse: KIRO_EVENT.postToolUse,\n SessionStart: KIRO_EVENT.agentSpawn,\n UserPromptSubmit: KIRO_EVENT.userPromptSubmit,\n Stop: KIRO_EVENT.stop,\n};\n\n/**\n * Kiro events whose hook STDOUT is added to the agent's context: agentSpawn\n * (≈ SessionStart) and userPromptSubmit. For preToolUse / postToolUse / stop the\n * docs say STDOUT is \"captured but not shown to user\" — no context channel — so a\n * `context` decision on those degrades to a plain exit-0 pass-through.\n * Ref: https://kiro.dev/docs/cli/hooks\n */\nconst CONTEXT_EVENTS: ReadonlySet<string> = new Set([\n KIRO_EVENT.agentSpawn,\n KIRO_EVENT.userPromptSubmit,\n]);\n\n/** A single Kiro native hook registration entry (Claude-shaped, nested). */\ninterface KiroHookEntry {\n matcher: string;\n hooks: Array<{ type: \"command\"; command: string }>;\n}\n\n/** The shape of a Kiro agent file (only the parts we touch). */\ninterface KiroAgentFile {\n hooks?: Record<string, KiroHookEntry[]>;\n [key: string]: unknown;\n}\n\n/** The shape of Kiro's mcp.json (only the parts we touch). */\ninterface KiroMcpFile {\n mcpServers?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/** Native MCP server entry shapes Kiro accepts under `mcpServers`. */\ninterface KiroStdioServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n}\ninterface KiroHttpServer {\n url: string;\n headers?: Record<string, string>;\n}\n\n/**\n * Raw Kiro CLI hook stdin payload (snake_case wire fields).\n *\n * Fields are the ones Kiro ACTUALLY serializes onto a hook's stdin per\n * kiro.dev/docs/cli/hooks. NOTE the stop hook: its stdin is exactly\n * `{ hook_event_name, cwd, session_id, assistant_response }` — there is NO\n * `stop_hook_active` field (Kiro does not model a re-entrant stop-hook flag),\n * so we read `assistant_response` (the agent's last response text) rather than a\n * never-emitted boolean. Ref: kiro.dev/docs/cli/hooks (Stop Hook → Hook Event).\n */\ninterface KiroWireInput {\n connector?: unknown;\n hook_event_name?: string;\n cwd?: string;\n session_id?: string;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_response?: unknown;\n source?: string;\n prompt?: string;\n /** Stop hook only: the text of the assistant's last response. */\n assistant_response?: string;\n}\n\nexport class KiroAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Kiro\";\n readonly paradigm: HookParadigm = \"json-stdio\";\n\n readonly capabilities: PlatformCapabilities = {\n // Memory surface: AGENTS.md-first managed block (project <projectDir>/AGENTS.md\n // via the base default — always included, no inclusion modes; user scope →\n // ~/.kiro/steering/agent-connector.md below).\n supportsMemory: true,\n preToolUse: true,\n postToolUse: true,\n preCompact: false,\n sessionStart: true,\n sessionEnd: false,\n // Kiro fires userPromptSubmit and stop, but it has no PreCompact /\n // SessionEnd / Notification equivalent.\n userPromptSubmit: true,\n stop: true,\n notification: false,\n // Newer events: Kiro's native set (agentSpawn / userPromptSubmit /\n // preToolUse / postToolUse / stop) has no permission-dialog, tool-failure,\n // or subagent lifecycle events, so permissionRequest / postToolUseFailure /\n // subagentStart / subagentStop stay unset — install reports the standard\n // skip-warn for them.\n // Kiro's hook protocol is exit-code only — a hook can allow (0), block (2),\n // or inject agentSpawn context, but it CANNOT rewrite tool args or output.\n canModifyArgs: false,\n canModifyOutput: false,\n // agentSpawn (and userPromptSubmit) add the hook's plain STDOUT to context.\n canInjectSessionContext: true,\n transports: [\"stdio\", \"http\"],\n // Skills: Kiro reads SKILL.md from .kiro/skills/<name>/SKILL.md (project)\n // and ~/.kiro/skills/<name>/SKILL.md (user).\n supportsSkills: true,\n // Actions: Kiro reads `.kiro/hooks/<id>.kiro.hook` Manual-Trigger +\n // Shell-Command hooks (when.type \"manual\" + then.type \"runCommand\"),\n // user-invokable from the Agent Hooks panel / Command Palette. WORKSPACE\n // (project) scope ONLY — Kiro does not scan ~/.kiro/hooks/ — so user scope\n // warn-skips (see installActions).\n supportsActions: true,\n actionInvocationMode: \"manual-hook\",\n actionAffordanceKind: \"hook-panel\",\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(projectDir: string): DetectedPlatform {\n const userDir = join(homedir(), \".kiro\");\n const userMcp = this.userMcpPath();\n const projectDirKiro = join(projectDir, \".kiro\");\n const projectMcp = this.projectMcpPath(projectDir);\n\n const userInstalled = existsSync(userDir) || existsSync(userMcp);\n const projInstalled = existsSync(projectDirKiro) || existsSync(projectMcp);\n const installed = userInstalled || projInstalled;\n // Report the scope/path that actually matched, so a project-only install\n // isn't misreported as a (non-existent) user install.\n const scope = projInstalled && !userInstalled ? \"project\" : \"user\";\n const configPath = scope === \"project\" ? projectMcp : userMcp;\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath,\n scope,\n reason: installed\n ? scope === \"project\"\n ? `found project Kiro config at ${projectMcp}`\n : `found Kiro config under ${userDir}`\n : `no Kiro config at ${userDir}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Memory surface: global steering dir at user scope ───────────────────\n // Project scope stays on the AGENTS.md base default (workspace-root\n // AGENTS.md is always included, with no inclusion modes). User scope targets\n // a dedicated agent-connector.md in Kiro's documented ~/.kiro/steering/ dir\n // (default-always inclusion; AC-created → cleanly deletable on uninstall).\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\n if (this.memoryOverride(ctx)?.path || ctx.scope !== \"user\") {\n return super.memoryTargets(ctx);\n }\n return [\n {\n path: join(homedir(), \".kiro\", \"steering\", \"agent-connector.md\"),\n reason: \"kiro global steering dir (~/.kiro/steering; agent-connector-owned file)\",\n },\n ];\n }\n\n // ── Native paths ─────────────────────────────────────────────────────────\n\n getConfigDir(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \".kiro\")\n : join(homedir(), \".kiro\");\n }\n\n /** MCP servers live in mcp.json under the scope's `.kiro/settings/`. */\n getServerConfigPath(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? this.projectMcpPath(ctx.projectDir)\n : this.userMcpPath();\n }\n\n /**\n * Hooks live in an AGENT file, NOT a settings file. Kiro auto-loads the\n * built-in default agent (`kiro_default`) for a new chat session, so we always\n * register hooks on the user-scope default agent — that is the agent Kiro\n * actually loads regardless of install scope.\n */\n getHookConfigPath(_ctx: InstallContext): string {\n return join(homedir(), \".kiro\", \"agents\", DEFAULT_AGENT_FILE);\n }\n\n private userMcpPath(): string {\n return join(homedir(), \".kiro\", \"settings\", \"mcp.json\");\n }\n\n private projectMcpPath(projectDir: string): string {\n return join(projectDir, \".kiro\", \"settings\", \"mcp.json\");\n }\n\n // ── MCP server install / uninstall ───────────────────────────────────────\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 kiro\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n\n // Shallow-merge any per-platform server override into the base ServerDef.\n const server: ServerDef =\n override && typeof override === \"object\"\n ? { ...connector.server, ...override }\n : connector.server;\n\n const serverPath = this.getServerConfigPath(ctx);\n const entry = this.renderServerEntry(ctx, server);\n\n return [\n this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun),\n ];\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 /** Render a normalized ServerDef into Kiro's native mcpServers entry. */\n private renderServerEntry(\n ctx: InstallContext,\n server: ServerDef,\n ): KiroStdioServer | KiroHttpServer {\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 the real command through\n // `<homeBin> serve --connector <id> -- <command> <args...>`.\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\n\n // Kiro documents no native interpolation token, so resolve every\n // ${env:VAR} to a literal at install time.\n const entry: KiroStdioServer = { command: resolveEnvRefsDeep(command) };\n if (args.length > 0) entry.args = resolveEnvRefsDeep(args);\n const env = this.renderEnv(server.env);\n if (env) entry.env = env;\n if (server.cwd) entry.cwd = resolveEnvRefsDeep(server.cwd);\n return entry;\n }\n\n // http (and any other remote transport) — Kiro registers a URL.\n const entry: KiroHttpServer = { url: resolveEnvRefsDeep(server.url ?? \"\") };\n const headers = this.renderEnv(server.headers);\n if (headers) entry.headers = headers;\n return entry;\n }\n\n /**\n * Render env/header values. Kiro documents no native interpolation token, so\n * resolve `${env:VAR}` references to literals at install time.\n */\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 return resolveEnvRefsDeep({ ...env });\n }\n\n // ── Skills surface ───────────────────────────────────────────────────────\n // Kiro reads SKILL.md from:\n // project scope → <projectDir>/.kiro/skills/<name>/SKILL.md\n // user scope → ~/.kiro/skills/<name>/SKILL.md\n\n private skillsDir(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \".kiro\", \"skills\")\n : join(homedir(), \".kiro\", \"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 kiro\" }];\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 // ── Action surface (one owned .kiro.hook per action; PROJECT scope only) ──\n // Kiro reads `<projectDir>/.kiro/hooks/<id>.kiro.hook` (JSON): a Manual-Trigger\n // (`when.type \"manual\"`) + Shell-Command (`then.type \"runCommand\"`, `command`)\n // hook, user-invokable from the Agent Hooks panel / Command Palette\n // (kiro.dev/docs/hooks). The command execs `<homeBin> action kiro <id>\n // --connector <id>`. Each file is FULLY OWNED → uninstall removes it.\n // SCOPE: Kiro discovers hooks ONLY from the workspace `.kiro/hooks/` dir\n // (~/.kiro/hooks/ is NOT scanned), so user scope warn-skips (mirrors warp's\n // project-only precedent) rather than writing a file Kiro would never load.\n\n private actionHookPath(ctx: InstallContext, id: string): string {\n return join(ctx.projectDir, \".kiro\", \"hooks\", `${id}.kiro.hook`);\n }\n\n override installActions(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.actions === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"actions disabled for kiro\" }];\n }\n const triggers = this.actionTriggers(ctx);\n if (triggers.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no actions\" }];\n }\n if (ctx.scope !== \"project\") {\n return [\n {\n platform: this.id,\n action: \"warn\",\n detail: `kiro actions are project-scoped only (Kiro does not scan ~/.kiro/hooks/); ${triggers.length} skipped`,\n },\n ];\n }\n return triggers.map((trigger) =>\n this.writeContentFile(\n this.actionHookPath(ctx, trigger.id),\n this.renderActionHook(trigger.label, trigger.description, trigger.command),\n ctx.dryRun,\n ),\n );\n }\n\n override uninstallActions(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.actions.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no actions\" }];\n }\n if (ctx.scope !== \"project\") {\n return [{ platform: this.id, action: \"skip\", detail: \"kiro actions are project-scoped only\" }];\n }\n return connector.actions.map((action) =>\n this.removeContentFile(this.actionHookPath(ctx, action.id), ctx.dryRun),\n );\n }\n\n /**\n * Render a Kiro `.kiro.hook` JSON: a Manual-Trigger (`when.type \"manual\"`) +\n * Shell-Command (`then.type \"runCommand\"`) hook. The key order matches the\n * files Kiro itself emits (enabled, name, description, version, when, then).\n */\n private renderActionHook(name: string, description: string, command: string): string {\n return (\n JSON.stringify(\n {\n enabled: true,\n name,\n description,\n version: \"1\",\n when: { type: \"manual\" },\n then: { type: \"runCommand\", command },\n },\n null,\n 2,\n ) + \"\\n\"\n );\n }\n\n // ── Hook install / uninstall (merge into the agent file) ─────────────────\n\n installHooks(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.hooks === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"hooks disabled for kiro\" }];\n }\n if (connector.hookEvents.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no hooks\" }];\n }\n\n const agentPath = this.getHookConfigPath(ctx);\n // Merge into the existing agent JSON; create a minimal agent object if absent.\n const agent = this.readJson<KiroAgentFile>(agentPath) ?? {};\n const __skip = this.malformedHookRootSkip(agentPath, (agent as Record<string, unknown>).hooks);\n if (__skip) return [__skip];\n const hooks = (agent.hooks ??= {});\n\n const changes: ChangeRecord[] = [];\n let mutated = false;\n\n for (const event of connector.hookEvents) {\n const kiroEvent = EVENT_MAP[event];\n if (!kiroEvent) {\n // No Kiro equivalent for this canonical event — report and continue.\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: agentPath,\n detail: `${event} has no Kiro hook equivalent — skipped`,\n });\n continue;\n }\n\n const command = buildHomeBinHookCommand(ctx.homeBinPath, HOST, event, connector.id);\n const matcher = connector.hooks[event]?.matcher ?? \"\";\n const entry: KiroHookEntry = {\n matcher,\n hooks: [{ type: \"command\", command }],\n };\n\n const bucket = (hooks[kiroEvent] ??= []);\n const existingIdx = bucket.findIndex((e) => this.entryHasOurCommand(e, ctx));\n\n if (existingIdx >= 0) {\n if (JSON.stringify(bucket[existingIdx]) === JSON.stringify(entry)) {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: agentPath,\n detail: `hooks.${kiroEvent} already registered`,\n });\n continue;\n }\n bucket[existingIdx] = entry;\n changes.push({\n platform: this.id,\n action: \"update\",\n path: agentPath,\n detail: `hooks.${kiroEvent}`,\n });\n } else {\n bucket.push(entry);\n changes.push({\n platform: this.id,\n action: \"create\",\n path: agentPath,\n detail: `hooks.${kiroEvent}`,\n });\n }\n mutated = true;\n }\n\n if (mutated) this.writeJson(agentPath, agent, ctx.dryRun);\n return changes;\n }\n\n uninstallHooks(ctx: InstallContext): ChangeRecord[] {\n const agentPath = this.getHookConfigPath(ctx);\n const agent = this.readJson<KiroAgentFile>(agentPath);\n const hooks = agent?.hooks;\n if (!agent || !hooks) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path: agentPath,\n detail: \"no hooks section present\",\n },\n ];\n }\n\n const changes: ChangeRecord[] = [];\n let mutated = false;\n\n for (const kiroEvent of Object.keys(hooks)) {\n const bucket = hooks[kiroEvent];\n if (!Array.isArray(bucket)) continue;\n\n // Strip our hook command from each entry; drop entries left empty so we\n // never remove another connector's (or the user's own) hook commands.\n const next: KiroHookEntry[] = [];\n let removed = 0;\n for (const e of bucket) {\n const innerBefore = e.hooks?.length ?? 0;\n const inner = (e.hooks ?? []).filter((h) => !this.isOurCommand(h.command, ctx));\n removed += innerBefore - inner.length;\n if (inner.length > 0) next.push({ matcher: e.matcher ?? \"\", hooks: inner });\n }\n\n if (removed > 0) {\n if (next.length > 0) hooks[kiroEvent] = next;\n else delete hooks[kiroEvent];\n changes.push({\n platform: this.id,\n action: \"remove\",\n path: agentPath,\n detail: `hooks.${kiroEvent} (${removed})`,\n });\n mutated = true;\n }\n }\n\n if (mutated) this.writeJson(agentPath, agent, ctx.dryRun);\n if (changes.length === 0) {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: agentPath,\n detail: \"no matching hook entries\",\n });\n }\n return changes;\n }\n\n private entryHasOurCommand(entry: KiroHookEntry, ctx: InstallContext): boolean {\n return (entry.hooks ?? []).some((h) => this.isOurCommand(h.command, ctx));\n }\n\n /** True when a hook command references our home binary AND this connector id\n * (anchored so a shared-prefix id can't collide — see isHomeBinHookCommand). */\n private isOurCommand(command: string | undefined, ctx: InstallContext): boolean {\n return isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id);\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const mcpPath = this.getServerConfigPath(ctx);\n const agentPath = this.getHookConfigPath(ctx);\n const connectorId = ctx.connector.id;\n const homeBin = ctx.homeBinPath;\n const hookEvents = ctx.connector.hookEvents;\n return [\n {\n name: `${this.name}: mcp.json present`,\n check: () =>\n existsSync(mcpPath)\n ? { status: \"OK\", detail: mcpPath }\n : { status: \"FAIL\", detail: `not found: ${mcpPath}` },\n },\n {\n name: `${this.name}: server entry registered`,\n check: () => {\n // Only assert what the connector declares (same rule as the hook\n // check below): a server-less connector never writes an mcpServers\n // entry, so its absence is healthy.\n if (!ctx.connector.server) {\n return { status: \"OK\", detail: \"no MCP server declared\" };\n }\n const cfg = this.readJson<KiroMcpFile>(mcpPath);\n const bucket = cfg?.mcpServers;\n if (!cfg || !bucket) {\n return { status: \"FAIL\", detail: `no ${MCP_ROOT_KEY} in ${mcpPath}` };\n }\n return connectorId in bucket\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${connectorId} present` }\n : { status: \"FAIL\", detail: `no ${MCP_ROOT_KEY}.${connectorId} in ${mcpPath}` };\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 const agent = this.readJson<KiroAgentFile>(agentPath);\n if (!agent) return { status: \"FAIL\", detail: `cannot read ${agentPath}` };\n const hooks = agent.hooks ?? {};\n const registered = Object.values(hooks).some((entries) =>\n (entries ?? []).some((e) =>\n (e.hooks ?? []).some((h) =>\n isHomeBinHookCommand(h.command, homeBin, connectorId),\n ),\n ),\n );\n return registered\n ? { status: \"OK\", detail: \"hook command present\" }\n : { status: \"FAIL\", detail: `no hook for ${connectorId} in ${agentPath}` };\n },\n },\n ];\n }\n\n // ── Runtime: parse Kiro stdin JSON → normalized event ────────────────────\n\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\n const input = (raw ?? {}) as KiroWireInput;\n const connectorId = typeof input.connector === \"string\" ? input.connector : \"\";\n const sessionId = typeof input.session_id === \"string\" ? input.session_id : \"\";\n const projectDir = typeof input.cwd === \"string\" ? input.cwd : undefined;\n\n const base = {\n hostPlatform: HOST,\n connectorId,\n sessionId,\n raw,\n ...(projectDir !== undefined ? { projectDir } : {}),\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 };\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 \"UserPromptSubmit\": {\n const ev: UserPromptSubmitEvent = {\n ...base,\n prompt: typeof input.prompt === \"string\" ? input.prompt : \"\",\n };\n return ev;\n }\n case \"Stop\": {\n // Kiro's stop stdin is EXACTLY { hook_event_name, cwd, session_id,\n // assistant_response } — there is no `stop_hook_active` flag (reading it\n // always yielded undefined), so we read the real `assistant_response`\n // (the agent's last response text) instead and surface it as\n // lastAssistantMessage. Ref: kiro.dev/docs/cli/hooks (Stop Hook Event).\n const ev: StopEvent & { lastAssistantMessage?: string } = {\n ...base,\n ...(typeof input.assistant_response === \"string\"\n ? { lastAssistantMessage: input.assistant_response }\n : {}),\n };\n return ev;\n }\n default: {\n // Kiro never delivers PreCompact / SessionEnd / Notification nor the\n // newer PermissionRequest / PostToolUseFailure / SubagentStart /\n // SubagentStop (no native equivalents). If the runtime dispatches one\n // anyway, surface it loudly rather than silently mis-parse.\n throw new Error(`unsupported kiro hook event: ${String(event)}`);\n }\n }\n }\n\n // ── Runtime: normalized response → Kiro native (exit-code) hook reply ─────\n\n formatReply(event: HookEventName, response: HookResponse): HookReply {\n const decision = response.decision ?? \"allow\";\n\n // deny → block the action: exit 2 with the reason on stderr.\n if (decision === \"deny\") {\n return { exitCode: 2, stderr: response.reason ?? \"Blocked by hook\" };\n }\n\n // ask → Kiro has no native \"ask\"; degrade to deny (exit 2) to stay fail-safe.\n if (decision === \"ask\") {\n return {\n exitCode: 2,\n stderr: response.reason ?? \"Action requires user confirmation (security policy)\",\n };\n }\n\n // Stop → exit-code only (deny already handled above as exit 2). There is no\n // context/additionalContext channel on a Stop hook, so anything non-deny\n // passes through with exit 0 (do not fall into the context branch).\n if (event === \"Stop\") {\n return { exitCode: 0 };\n }\n\n // context → inject soft guidance. Kiro adds a hook's PLAIN STDOUT to the\n // agent's context (no JSON envelope), but ONLY for the agentSpawn and\n // userPromptSubmit events; preToolUse / postToolUse have no context channel\n // (their STDOUT is \"captured but not shown\"). So emit the raw text on stdout\n // only when the FIRING event maps to a context-supporting Kiro event;\n // otherwise the context decision degrades to a plain exit-0 pass-through\n // rather than a mislabeled/ineffective payload. exit 0 = allow.\n // Ref: https://kiro.dev/docs/cli/hooks\n const kiroEvent = EVENT_MAP[event];\n if (\n decision === \"context\" &&\n response.additionalContext &&\n kiroEvent !== undefined &&\n CONTEXT_EVENTS.has(kiroEvent)\n ) {\n return { exitCode: 0, stdout: response.additionalContext };\n }\n\n // modify is unsupported on Kiro (exit-code protocol — cannot rewrite\n // args/output); allow / void → pass through with exit 0.\n return { exitCode: 0 };\n }\n}\n\n/** Coerce a Kiro PostToolUse `tool_response` into a string for the normalized event. */\nfunction toolResponseToString(value: unknown): string | undefined {\n if (value == null) return undefined;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport const adapter = new KiroAdapter();\nexport default adapter;\n"],"mappings":"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","names":["entry"]}
@@ -3,16 +3,16 @@ import {
3
3
  fileMtimeMs,
4
4
  readJsonFile,
5
5
  readJsonlLines
6
- } from "./chunk-ZSOS2KOR.js";
6
+ } from "./chunk-RK6VBLXP.js";
7
7
  import {
8
8
  firstExistingRoot,
9
9
  walkFiles
10
- } from "./chunk-KM2YXO6V.js";
10
+ } from "./chunk-O7SDRBVB.js";
11
11
  import {
12
12
  emptyTokens,
13
13
  normalizeWorkspaceKey,
14
14
  workspaceLabelFromKey
15
- } from "./chunk-7PSNXUFK.js";
15
+ } from "./chunk-XD7MY6HB.js";
16
16
 
17
17
  // src/usage/readers/kiro.ts
18
18
  import { basename } from "path";
@@ -214,4 +214,4 @@ var kiro_default = kiroReader;
214
214
  export {
215
215
  kiro_default as default
216
216
  };
217
- //# sourceMappingURL=kiro-NYRRBIKW.js.map
217
+ //# sourceMappingURL=kiro-WGOI5CGT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/usage/readers/kiro.ts"],"sourcesContent":["/**\n * usage/readers/kiro — Kiro CLI (Amazon Bedrock) native session reader.\n *\n * Faithful port of tokscale sessions/kiro.rs (parse_kiro_file). Each session is a\n * pair of adjacent files under ~/.kiro/sessions/cli/:\n * <stem>.json — header: session_id, cwd, and session_state with the model\n * info (model_id, context_window_tokens) and the per-turn\n * metadata list (user_turn_metadatas[*]).\n * <stem>.jsonl — a transcript of Prompt / AssistantMessage entries keyed by\n * message_id, used ONLY to estimate per-turn char counts when\n * the header carries no explicit token counts.\n *\n * Token logic (per turn), ported exactly from the Rust:\n * input = input_token_count when > 0 (host-reported)\n * else context_window × context_usage_percentage/100 when both > 0\n * else ceil(promptChars / 4) (host-estimated)\n * output = output_token_count when > 0 (host-reported)\n * else ceil(assistantChars / 4) (host-estimated)\n * cacheRead / cacheWrite / reasoning are always 0 (Kiro reports none).\n * A turn whose input+output == 0 is dropped (matches the Rust filter_map).\n *\n * Confidence is per-record: \"host-reported\" only when BOTH dimensions came from\n * explicit host counts; any estimation (context% × window, or chars/4) makes the\n * row \"host-estimated\" (design §6: Kiro token counts are often estimated).\n *\n * Provider is hardcoded \"amazon-bedrock\". Session id is the header's session_id\n * (else the JSON file stem). Project is header.cwd normalized to a workspace key.\n * Timestamp prefers the matched Prompt entry's meta.timestamp (float seconds →\n * ms), then end_timestamp (int/float seconds-or-ms / RFC3339 string), then file\n * mtime. Dedup key is `<sessionId>:<turnIndex>` (turn-level uniqueness across\n * file rewrites), exactly the Rust format!(\"{}:{}\", session_id, index).\n *\n * NOTE: kiro.rs also reads a macOS SQLite source\n * (~/Library/Application Support/kiro-cli/data.sqlite3, table conversations_v2).\n * That source is intentionally NOT read in v1 — only the json/jsonl file pairs\n * are parsed here.\n *\n * Fail-open: no root → []; unreadable/malformed json or jsonl → that file is\n * skipped (the jsonl is optional — its absence just leaves char estimation at 0).\n */\n\nimport { basename } from \"node:path\";\n\nimport type { UsageReader, UsageRecord, UsageConfidence } from \"../types.js\";\nimport { emptyTokens } from \"../aggregate.js\";\nimport { fileMtimeMs, readJsonFile, readJsonlLines } from \"../jsonl.js\";\nimport { normalizeWorkspaceKey, workspaceLabelFromKey } from \"../normalize.js\";\nimport { firstExistingRoot, walkFiles } from \"../paths.js\";\n\nconst PLATFORM_ID = \"kiro\" as const;\nconst PROVIDER_ID = \"amazon-bedrock\";\nconst UNKNOWN_MODEL = \"unknown\";\n\n// ─────────────────────────────────────────────────────────────────────────\n// Header (.json) shapes — every field optional / unknown (host may omit any).\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface KiroHeader {\n session_id?: unknown;\n cwd?: unknown;\n session_state?: {\n rts_model_state?: {\n model_info?: {\n model_id?: unknown;\n context_window_tokens?: unknown;\n };\n };\n conversation_metadata?: {\n user_turn_metadatas?: unknown;\n };\n };\n}\n\ninterface KiroTurn {\n input_token_count?: unknown;\n output_token_count?: unknown;\n end_timestamp?: unknown;\n total_request_count?: unknown;\n message_ids?: unknown;\n context_usage_percentage?: unknown;\n}\n\n/** Accumulated char counts (and first prompt ts) for one message_id. */\ninterface KiroMessageContent {\n promptChars: number;\n assistantChars: number;\n promptTimestampMs: number | null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Coercion helpers (tolerant — garbage degrades to a safe default).\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Coerce to a finite number, or null when not numeric. */\nfunction toNum(v: unknown): number | null {\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\n if (typeof v === \"string\") {\n const n = Number(v);\n if (Number.isFinite(n)) return n;\n }\n return null;\n}\n\n/** Coerce to an integer clamped ≥ 0 (Rust `.unwrap_or(0).max(0)`). */\nfunction toNonNegInt(v: unknown): number {\n const n = toNum(v);\n if (n === null) return 0;\n return Math.max(0, Math.trunc(n));\n}\n\n/** ceil(chars / 4) — Rust div_ceil estimation (4 chars per token). */\nfunction estimateTokens(chars: number): number {\n return Math.ceil(Math.max(0, chars) / 4);\n}\n\n/** float seconds → epoch ms (Rust seconds_to_millis: truncating). */\nfunction secondsToMillis(seconds: number): number {\n return Math.trunc(seconds * 1000);\n}\n\n/** Strip a single file extension from a basename. */\nfunction stripExt(name: string): string {\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(0, dot) : name;\n}\n\n/**\n * Parse end_timestamp (port of parse_timestamp_value): a number < 1e12 is\n * seconds (→ ms), ≥ 1e12 is already ms; a string is RFC3339, else numeric\n * seconds. Returns null when unusable.\n */\nfunction parseTimestampValue(v: unknown): number | null {\n if (typeof v === \"number\" && Number.isFinite(v)) {\n return Math.abs(v) < 1_000_000_000_000 ? secondsToMillis(v) : Math.trunc(v);\n }\n if (typeof v === \"string\") {\n const ms = Date.parse(v);\n if (!Number.isNaN(ms)) return ms;\n const n = Number(v);\n if (Number.isFinite(n)) return secondsToMillis(n);\n }\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// JSONL transcript → per-message char counts (port of the BufReader loop).\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Sum chars of the \"text\" parts of a content array (kind absent ⇒ text). */\nfunction textCharCount(content: unknown): number {\n if (!Array.isArray(content)) return 0;\n let total = 0;\n for (const part of content) {\n if (typeof part !== \"object\" || part === null) continue;\n const kind = (part as { kind?: unknown }).kind;\n const isText = kind === undefined || kind === null || kind === \"text\";\n if (!isText) continue;\n const data = (part as { data?: unknown }).data;\n if (typeof data === \"string\") total += [...data].length; // chars, not UTF-16 units\n }\n return total;\n}\n\n/**\n * Build message_id → char-count map from the adjacent .jsonl, exactly as the\n * Rust: a \"Prompt\" entry stages a pending (chars, ts); the next\n * \"AssistantMessage\" attaches the staged prompt to that assistant's message_id\n * and adds the assistant's own chars. A missing/empty jsonl yields an empty map.\n */\nfunction readJsonlContent(jsonlPath: string): Map<string, KiroMessageContent> {\n const byId = new Map<string, KiroMessageContent>();\n const lines = readJsonlLines(jsonlPath);\n if (lines.length === 0) return byId;\n\n let pendingPromptChars: number | null = null;\n let pendingPromptTs: number | null = null;\n\n for (const raw of lines) {\n if (typeof raw !== \"object\" || raw === null) continue;\n const entry = raw as { kind?: unknown; data?: unknown };\n const kind = entry.kind;\n const data = entry.data;\n if (typeof data !== \"object\" || data === null) continue;\n\n const messageId = (data as { message_id?: unknown }).message_id;\n if (typeof messageId !== \"string\") continue;\n\n const textChars = textCharCount((data as { content?: unknown }).content);\n\n if (kind === \"Prompt\") {\n const metaTs = (data as { meta?: { timestamp?: unknown } }).meta?.timestamp;\n const tsNum = toNum(metaTs);\n pendingPromptChars = textChars;\n pendingPromptTs = tsNum === null ? null : secondsToMillis(tsNum);\n } else if (kind === \"AssistantMessage\") {\n let msg = byId.get(messageId);\n if (msg === undefined) {\n msg = { promptChars: 0, assistantChars: 0, promptTimestampMs: null };\n byId.set(messageId, msg);\n }\n if (pendingPromptChars !== null) {\n msg.promptChars += pendingPromptChars;\n if (msg.promptTimestampMs === null) msg.promptTimestampMs = pendingPromptTs;\n pendingPromptChars = null;\n pendingPromptTs = null;\n }\n msg.assistantChars += textChars;\n }\n // other kinds are ignored\n }\n return byId;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// One session (.json + adjacent .jsonl) → usage records.\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction parseKiroFile(jsonPath: string): UsageRecord[] {\n const header = readJsonFile(jsonPath);\n if (typeof header !== \"object\" || header === null) return []; // malformed → skip\n const h = header as KiroHeader;\n\n const fallbackTs = fileMtimeMs(jsonPath);\n\n const sessionId =\n typeof h.session_id === \"string\" && h.session_id !== \"\"\n ? h.session_id\n : stripExt(basename(jsonPath)) || \"unknown\";\n\n const modelInfo = h.session_state?.rts_model_state?.model_info;\n const rawModel = modelInfo?.model_id;\n const modelId =\n typeof rawModel === \"string\" && rawModel.trim() !== \"\" ? rawModel : UNKNOWN_MODEL;\n const contextWindow = toNonNegInt(modelInfo?.context_window_tokens);\n\n let projectKey: string | undefined;\n let projectLabel: string | undefined;\n if (typeof h.cwd === \"string\") {\n projectKey = normalizeWorkspaceKey(h.cwd);\n if (projectKey !== undefined) projectLabel = workspaceLabelFromKey(projectKey);\n }\n\n const turnsRaw = h.session_state?.conversation_metadata?.user_turn_metadatas;\n const turns: KiroTurn[] = Array.isArray(turnsRaw) ? (turnsRaw as KiroTurn[]) : [];\n if (turns.length === 0) return [];\n\n // Adjacent .jsonl (same stem) drives char-based estimation.\n const jsonlPath = jsonPath.replace(/\\.json$/, \".jsonl\");\n const contentById = readJsonlContent(jsonlPath);\n\n const out: UsageRecord[] = [];\n\n turns.forEach((turn, index) => {\n if (typeof turn !== \"object\" || turn === null) return;\n\n // Aggregate char counts / first prompt ts over this turn's message_ids.\n let promptChars = 0;\n let assistantChars = 0;\n let promptTimestampMs: number | null = null;\n const messageIds = turn.message_ids;\n if (Array.isArray(messageIds)) {\n for (const mid of messageIds) {\n if (typeof mid !== \"string\") continue;\n const content = contentById.get(mid);\n if (content === undefined) continue;\n promptChars += content.promptChars;\n assistantChars += content.assistantChars;\n if (promptTimestampMs === null) promptTimestampMs = content.promptTimestampMs;\n }\n }\n\n const explicitInput = toNonNegInt(turn.input_token_count);\n const explicitOutput = toNonNegInt(turn.output_token_count);\n\n let input: number;\n let inputEstimated: boolean;\n if (explicitInput > 0) {\n input = explicitInput;\n inputEstimated = false;\n } else {\n inputEstimated = true;\n const ctxPct = toNum(turn.context_usage_percentage) ?? 0;\n if (contextWindow > 0 && ctxPct > 0) {\n input = Math.trunc((contextWindow * ctxPct) / 100);\n } else {\n input = estimateTokens(promptChars);\n }\n }\n\n let output: number;\n let outputEstimated: boolean;\n if (explicitOutput > 0) {\n output = explicitOutput;\n outputEstimated = false;\n } else {\n output = estimateTokens(assistantChars);\n outputEstimated = true;\n }\n\n if (input + output === 0) return; // matches Rust filter_map drop\n\n const endTs = parseTimestampValue(turn.end_timestamp);\n const ts = promptTimestampMs ?? endTs ?? fallbackTs;\n\n const messageCount = Math.max(1, toNonNegInt(turn.total_request_count) || 1);\n\n const tokens = emptyTokens();\n tokens.input = input;\n tokens.output = output;\n // cacheRead / cacheWrite / reasoning stay 0 (Kiro reports none).\n\n // host-reported only when BOTH dimensions are explicit host counts.\n const confidence: UsageConfidence =\n inputEstimated || outputEstimated ? \"host-estimated\" : \"host-reported\";\n\n const record: UsageRecord = {\n platformId: PLATFORM_ID,\n modelId,\n providerId: PROVIDER_ID,\n sessionId,\n tokens,\n ts,\n messageCount,\n dedupKey: `${sessionId}:${index}`,\n confidence,\n };\n if (projectKey !== undefined) record.projectKey = projectKey;\n if (projectLabel !== undefined) record.projectLabel = projectLabel;\n out.push(record);\n });\n\n return out;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Reader singleton.\n// ─────────────────────────────────────────────────────────────────────────\n\nconst kiroReader: UsageReader = {\n platformId: PLATFORM_ID,\n kind: \"local\",\n async read({ sinceMs }: { sinceMs?: number }): Promise<UsageRecord[]> {\n const root = firstExistingRoot(PLATFORM_ID);\n if (root === undefined) return []; // no ~/.kiro/sessions/cli → fail-open\n\n // Drive off the .json headers; each pulls its adjacent .jsonl when present.\n const files = walkFiles(root, (name) => name.endsWith(\".json\"));\n\n const records: UsageRecord[] = [];\n for (const file of files) {\n const rows = parseKiroFile(file);\n for (const row of rows) {\n if (sinceMs !== undefined && row.ts < sinceMs) continue;\n records.push(row);\n }\n }\n return records;\n },\n};\n\nexport default kiroReader;\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  formatHostLeaderboard,
4
4
  hostLeaderboard
5
- } from "./chunk-7HHW23AC.js";
5
+ } from "./chunk-IRUYJD23.js";
6
6
  import {
7
7
  SCOPE_FILTER_VALUES,
8
8
  formatHostNativeTurns,
@@ -10,14 +10,14 @@ import {
10
10
  hostNativeTurns,
11
11
  isScopeFilter,
12
12
  mcpLeaderboard
13
- } from "./chunk-Q7PR2WGT.js";
14
- import "./chunk-7PSNXUFK.js";
13
+ } from "./chunk-6TF7MHG5.js";
14
+ import "./chunk-XD7MY6HB.js";
15
15
  import {
16
16
  fail,
17
17
  print
18
- } from "./chunk-N4ENLZEU.js";
19
- import "./chunk-IOJDZJ72.js";
20
- import "./chunk-QYOUQCC6.js";
18
+ } from "./chunk-BV5WK6VQ.js";
19
+ import "./chunk-IVAWP6HH.js";
20
+ import "./chunk-GZGLCCEE.js";
21
21
 
22
22
  // src/cli/commands/leaderboard.ts
23
23
  import { parseArgs } from "util";
@@ -134,4 +134,4 @@ export {
134
134
  parseSince,
135
135
  run
136
136
  };
137
- //# sourceMappingURL=leaderboard-NJWKGMXP.js.map
137
+ //# sourceMappingURL=leaderboard-YBD3IKC2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/leaderboard.ts"],"sourcesContent":["/**\n * cli/commands/leaderboard — the unified top-level `agent-connector leaderboard`.\n *\n * Prints THREE leaderboards, each clearly origin-labeled and NEVER summed:\n * 🔌 MCP / Plugin leaderboard ← origin `mcp-self`: the serve-proxy\n * telemetry store (which MCP server WE wrap costs the most — per-MCP `call`\n * + `tool_defs` rows; the `model_turn` rows are EXCLUDED here).\n * 🖥️ Host / User leaderboard ← origin `host-scan-logs`: the host usage\n * readers scanning agent CLI logs (which CLI / host spent the most).\n * 🛰️ Host-native turns (live, exact) ← origin `host-native-live`: the opt-in\n * AfterModel / PostInvocation usage hook (scope `model_turn`, confidence\n * host-native) — whole-conversation usage the host reported in real time.\n *\n * All three measure DIFFERENT things (per-MCP server bytes vs whole-conversation\n * usage from logs vs whole-conversation usage from a live hook). They are reported\n * side by side but their totals are NEVER added together.\n *\n * Flags:\n * --since 7d|24h|… lower-bound window applied to both sources.\n * --scope <value> MCP-section scope slice (user|project|npx|binary|http|…);\n * ignored by the host section (host logs carry no scope).\n * --connector <id> restrict the 🔌 MCP/plugin + 🛰️ host-native-turns\n * sections to ONE connector id. The 🖥️ host-scan section\n * is connector-agnostic (host CLI logs carry no connector\n * attribution) and is intentionally NOT filtered.\n * --json emit { mcp:[...], host:[...] } instead of the tables.\n */\n\nimport { parseArgs } from \"node:util\";\n\nimport {\n formatHostNativeTurns,\n formatMcpLeaderboard,\n hostNativeTurns,\n isScopeFilter,\n mcpLeaderboard,\n SCOPE_FILTER_VALUES,\n type ScopeFilter,\n} from \"../../telemetry/leaderboard.js\";\nimport { formatHostLeaderboard, hostLeaderboard } from \"../../usage/leaderboard.js\";\nimport { fail, print } from \"../app.js\";\n\n/**\n * Parse a relative duration (`Ns`/`Nm`/`Nh`/`Nd`) to a lower-bound epoch ms.\n * Returns undefined for empty input and null for a malformed one. (Kept local so\n * the leaderboard command stays decoupled from the report commands.)\n */\nexport function parseSince(since: string | undefined): number | null | undefined {\n if (since == null || since.trim() === \"\") return undefined;\n const m = since.trim().match(/^(\\d+)\\s*([smhd])$/i);\n if (!m || !m[1] || !m[2]) return null;\n const n = Number(m[1]);\n const unitMs: Record<string, number> = {\n s: 1000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n };\n const factor = unitMs[m[2].toLowerCase()];\n if (factor == null) return null;\n return Date.now() - n * factor;\n}\n\nexport async function run(argv: string[]): Promise<number> {\n const first = argv[0];\n if (first === \"--help\" || first === \"-h\") {\n print(\"usage: agent-connector leaderboard [flags]\");\n print(\" --since 7d|24h|… window applied to BOTH sources\");\n print(` --scope <value> MCP-section slice (${SCOPE_FILTER_VALUES.join(\"|\")})`);\n print(\" --connector <id> restrict the 🔌 MCP + 🛰️ host-native sections to one connector\");\n print(\" --json emit { mcp:[...], host:[...] } (never summed)\");\n return 0;\n }\n\n const { values } = parseArgs({\n args: argv,\n options: {\n since: { type: \"string\" },\n scope: { type: \"string\" },\n connector: { type: \"string\" },\n json: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n const sinceMs = parseSince(values.since);\n if (sinceMs === null) {\n return fail(`invalid --since \"${values.since}\" (use forms like 30s, 15m, 24h, 7d)`);\n }\n\n let scope: ScopeFilter | undefined;\n if (values.scope !== undefined && values.scope.trim() !== \"\") {\n const s = values.scope.trim();\n if (!isScopeFilter(s)) {\n return fail(`invalid --scope \"${s}\" (use ${SCOPE_FILTER_VALUES.join(\"|\")})`);\n }\n scope = s;\n }\n\n // The optional --connector <id> FILTER restricts the two connector-attributed\n // sections (🔌 MCP/plugin + 🛰️ host-native turns) to one connector. The\n // 🖥️ host-scan section below is intentionally NOT filtered: host CLI logs carry\n // no connector attribution, so it stays connector-agnostic (whole-conversation).\n const connectorId =\n values.connector !== undefined && values.connector.trim() !== \"\"\n ? values.connector.trim()\n : undefined;\n\n // 🔌 MCP / Plugin leaderboard — serve-proxy telemetry (origin: mcp-self).\n const mcpOpts: { sinceMs?: number; scope?: ScopeFilter; connectorId?: string } = {};\n if (sinceMs !== undefined) mcpOpts.sinceMs = sinceMs;\n if (scope !== undefined) mcpOpts.scope = scope;\n if (connectorId !== undefined) mcpOpts.connectorId = connectorId;\n const mcp = mcpLeaderboard(mcpOpts);\n\n // 🖥️ Host / User leaderboard — host usage readers (origin: host-scan-logs).\n // Connector-agnostic by construction: NOT filtered by --connector.\n const hostOpts: { sinceMs?: number } = {};\n if (sinceMs !== undefined) hostOpts.sinceMs = sinceMs;\n const host = await hostLeaderboard(hostOpts);\n\n // 🛰️ Host-native turns — opt-in AfterModel usage hook (origin: host-native-live).\n // Scope `model_turn` rows ONLY; the MCP section above already excludes them.\n const turnsOpts: { sinceMs?: number; scope?: ScopeFilter; connectorId?: string } = {};\n if (sinceMs !== undefined) turnsOpts.sinceMs = sinceMs;\n if (scope !== undefined) turnsOpts.scope = scope;\n if (connectorId !== undefined) turnsOpts.connectorId = connectorId;\n const turns = hostNativeTurns(turnsOpts);\n\n if (values.json) {\n // Three separate arrays — by construction the consumer cannot sum origins.\n print(\n JSON.stringify(\n {\n mcp, // origin: mcp-self\n host: host.rows, // origin: host-scan-logs\n hostSkipped: host.skipped,\n hostNativeTurns: turns, // origin: host-native-live (scope model_turn)\n },\n null,\n 2,\n ),\n );\n return 0;\n }\n\n const lines: string[] = [];\n lines.push(\n \"🔌 MCP / Plugin leaderboard (origin: mcp-self — per-MCP server bytes we wrap; \" +\n \"excludes host-native model_turn rows)\",\n );\n if (scope !== undefined) lines.push(` scope: ${scope}`);\n if (connectorId !== undefined) lines.push(` connector: ${connectorId}`);\n lines.push(\"\");\n lines.push(formatMcpLeaderboard(mcp));\n lines.push(\"\");\n lines.push(\n \"🖥️ Host / User leaderboard (origin: host-scan-logs — whole-conversation usage from CLI logs)\",\n );\n if (connectorId !== undefined) {\n lines.push(\" (connector-agnostic — host CLI logs carry no connector attribution; --connector not applied here)\");\n }\n lines.push(\"\");\n lines.push(formatHostLeaderboard(host));\n lines.push(\"\");\n lines.push(\n \"🛰️ Host-native turns (live, exact) (origin: host-native-live — opt-in AfterModel usage hook)\",\n );\n lines.push(\"\");\n lines.push(formatHostNativeTurns(turns));\n lines.push(\"\");\n lines.push(\n \"note: the THREE leaderboards measure DIFFERENT things (per-MCP server bytes vs \" +\n \"whole-conversation usage from logs vs live host-native turns) and are never \" +\n \"summed together (their totals are NEVER added across origins).\",\n );\n print(lines.join(\"\\n\"));\n return 0;\n}\n"],"mappings":"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","names":[]}
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  renderBridgePrelude
4
- } from "./chunk-Q4ISQHUQ.js";
4
+ } from "./chunk-FBJQGRET.js";
5
5
  import {
6
6
  resolveEnvRefsDeep
7
- } from "./chunk-XXLCMSD3.js";
7
+ } from "./chunk-BEFVJ2OE.js";
8
8
  import {
9
9
  BaseAdapter,
10
10
  renderOpenCodeSubagentMd,
11
11
  renderSkillMd
12
- } from "./chunk-3FINQ2ZF.js";
12
+ } from "./chunk-JTN3AKZO.js";
13
13
  import {
14
14
  buildWrappedStdio
15
- } from "./chunk-Y3K6KJMS.js";
16
- import "./chunk-ILWHLGIC.js";
17
- import "./chunk-QYOUQCC6.js";
15
+ } from "./chunk-QSY74NAP.js";
16
+ import "./chunk-UMQ6NBQR.js";
17
+ import "./chunk-GZGLCCEE.js";
18
18
 
19
19
  // src/adapters/mimo-code/index.ts
20
20
  import { existsSync } from "fs";
@@ -716,4 +716,4 @@ export {
716
716
  adapter,
717
717
  mimo_code_default as default
718
718
  };
719
- //# sourceMappingURL=mimo-code-BPNYYIVM.js.map
719
+ //# sourceMappingURL=mimo-code-KETL7W7D.js.map