@ken-jo/agent-connector 0.4.95 → 0.4.98

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +6 -6
  3. package/README.md +605 -599
  4. package/dist/{action-Q7GGO4PA.js → action-5JM23CFJ.js} +16 -16
  5. package/dist/action-5JM23CFJ.js.map +1 -0
  6. package/dist/{amazon-q-ETMAGY3D.js → amazon-q-LFZNGN27.js} +6 -6
  7. package/dist/amazon-q-LFZNGN27.js.map +1 -0
  8. package/dist/{amp-BQZOL5GR.js → amp-CEWOSWQO.js} +4 -4
  9. package/dist/amp-CEWOSWQO.js.map +1 -0
  10. package/dist/{amp-67BZONGF.js → amp-S22XTPEQ.js} +7 -7
  11. package/dist/amp-S22XTPEQ.js.map +1 -0
  12. package/dist/{antigravity-EA4L225L.js → antigravity-LHFEFNMC.js} +5 -5
  13. package/dist/antigravity-LHFEFNMC.js.map +1 -0
  14. package/dist/antigravity-PZXYAO3X.js +18 -0
  15. package/dist/{antigravity-cli-B2HXZFYQ.js → antigravity-cli-MOKFSWOU.js} +5 -5
  16. package/dist/antigravity-cli-MOKFSWOU.js.map +1 -0
  17. package/dist/{antigravity-cli-OM6SC3PE.js → antigravity-cli-PN474FXM.js} +9 -9
  18. package/dist/antigravity-cli-PN474FXM.js.map +1 -0
  19. package/dist/audit-2H7E3Z4N.js +311 -0
  20. package/dist/audit-2H7E3Z4N.js.map +1 -0
  21. package/dist/{chunk-KHO5WNTP.js → chunk-4GH2KA7V.js} +1 -1
  22. package/dist/chunk-4GH2KA7V.js.map +1 -0
  23. package/dist/{chunk-7F5KHLEP.js → chunk-6XWORQM6.js} +4 -4
  24. package/dist/chunk-6XWORQM6.js.map +1 -0
  25. package/dist/{chunk-2Y2MZRLP.js → chunk-7C2IPIIB.js} +3 -3
  26. package/dist/chunk-7C2IPIIB.js.map +1 -0
  27. package/dist/{chunk-NLE2J5P4.js → chunk-7HHW23AC.js} +29 -29
  28. package/dist/chunk-7HHW23AC.js.map +1 -0
  29. package/dist/{chunk-XD7MY6HB.js → chunk-7PSNXUFK.js} +1 -1
  30. package/dist/chunk-7PSNXUFK.js.map +1 -0
  31. package/dist/{chunk-YPAXJ7EW.js → chunk-7VSZXOXJ.js} +13 -13
  32. package/dist/chunk-7VSZXOXJ.js.map +1 -0
  33. package/dist/{chunk-ISEJWBFF.js → chunk-B6PKHS5I.js} +2 -2
  34. package/dist/chunk-B6PKHS5I.js.map +1 -0
  35. package/dist/{chunk-UM5S7DKK.js → chunk-C747DYNT.js} +1 -1
  36. package/dist/chunk-C747DYNT.js.map +1 -0
  37. package/dist/{chunk-PW42ZXCB.js → chunk-DOPFBUCX.js} +3 -3
  38. package/dist/chunk-DOPFBUCX.js.map +1 -0
  39. package/dist/{chunk-I5UXHIDT.js → chunk-DWZ5IWF4.js} +8 -8
  40. package/dist/chunk-DWZ5IWF4.js.map +1 -0
  41. package/dist/{chunk-6WZODR3Z.js → chunk-FJ6F5U3W.js} +5 -5
  42. package/dist/chunk-FJ6F5U3W.js.map +1 -0
  43. package/dist/{chunk-H33M77DD.js → chunk-HATCOSQT.js} +22 -19
  44. package/dist/chunk-HATCOSQT.js.map +1 -0
  45. package/dist/{chunk-UMQ6NBQR.js → chunk-ILWHLGIC.js} +2 -2
  46. package/dist/chunk-ILWHLGIC.js.map +1 -0
  47. package/dist/{chunk-IVAWP6HH.js → chunk-IOJDZJ72.js} +2 -2
  48. package/dist/chunk-IOJDZJ72.js.map +1 -0
  49. package/dist/{chunk-NBYKLUF6.js → chunk-KFPSJRHR.js} +2 -2
  50. package/dist/chunk-KFPSJRHR.js.map +1 -0
  51. package/dist/{chunk-O7SDRBVB.js → chunk-KM2YXO6V.js} +1 -1
  52. package/dist/chunk-KM2YXO6V.js.map +1 -0
  53. package/dist/{chunk-3NH2ARIS.js → chunk-KTBAB556.js} +6 -6
  54. package/dist/chunk-KTBAB556.js.map +1 -0
  55. package/dist/{chunk-5IOTP7LQ.js → chunk-KWC5DQ5Z.js} +7 -5
  56. package/dist/chunk-KWC5DQ5Z.js.map +1 -0
  57. package/dist/{chunk-JKKU2WKG.js → chunk-LD5HAN6O.js} +4 -4
  58. package/dist/chunk-LD5HAN6O.js.map +1 -0
  59. package/dist/{chunk-OP4KBXUO.js → chunk-LFWYYWLV.js} +1 -1
  60. package/dist/chunk-LFWYYWLV.js.map +1 -0
  61. package/dist/{chunk-APZDTY76.js → chunk-LZL2YITN.js} +7 -7
  62. package/dist/chunk-LZL2YITN.js.map +1 -0
  63. package/dist/{chunk-H53QZQJI.js → chunk-PSGTHJQU.js} +1 -1
  64. package/dist/chunk-PSGTHJQU.js.map +1 -0
  65. package/dist/{chunk-FBJQGRET.js → chunk-Q4ISQHUQ.js} +1 -1
  66. package/dist/chunk-Q4ISQHUQ.js.map +1 -0
  67. package/dist/{chunk-6TF7MHG5.js → chunk-Q7PR2WGT.js} +2 -2
  68. package/dist/chunk-Q7PR2WGT.js.map +1 -0
  69. package/dist/{chunk-GZGLCCEE.js → chunk-QYOUQCC6.js} +1 -1
  70. package/dist/chunk-QYOUQCC6.js.map +1 -0
  71. package/dist/{chunk-Z2MRSS2I.js → chunk-RNVIK5YJ.js} +2 -2
  72. package/dist/chunk-RNVIK5YJ.js.map +1 -0
  73. package/dist/{chunk-XC5SJ35F.js → chunk-RPWD5H6Y.js} +5 -5
  74. package/dist/chunk-RPWD5H6Y.js.map +1 -0
  75. package/dist/{chunk-PAPMUAR5.js → chunk-S25MVWBP.js} +12 -12
  76. package/dist/chunk-S25MVWBP.js.map +1 -0
  77. package/dist/{chunk-FJCUKXGX.js → chunk-THI4PI4H.js} +2 -2
  78. package/dist/chunk-THI4PI4H.js.map +1 -0
  79. package/dist/{chunk-D4ELPBB5.js → chunk-TOSNS2BY.js} +43 -43
  80. package/dist/chunk-TOSNS2BY.js.map +1 -0
  81. package/dist/{chunk-MGTDQLJJ.js → chunk-UNU2KPYJ.js} +11 -9
  82. package/dist/chunk-UNU2KPYJ.js.map +1 -0
  83. package/dist/{chunk-MQPNU2CY.js → chunk-UZZTWWGG.js} +1 -1
  84. package/dist/chunk-UZZTWWGG.js.map +1 -0
  85. package/dist/{chunk-4NHXLXSD.js → chunk-W7AGWAMH.js} +2 -2
  86. package/dist/chunk-W7AGWAMH.js.map +1 -0
  87. package/dist/{chunk-OPXAP3AC.js → chunk-XN7S44U4.js} +1 -1
  88. package/dist/chunk-XN7S44U4.js.map +1 -0
  89. package/dist/{chunk-BEFVJ2OE.js → chunk-XXLCMSD3.js} +1 -1
  90. package/dist/chunk-XXLCMSD3.js.map +1 -0
  91. package/dist/{chunk-YT43MUSJ.js → chunk-XZWMJLIT.js} +1 -1
  92. package/dist/chunk-XZWMJLIT.js.map +1 -0
  93. package/dist/{chunk-RK6VBLXP.js → chunk-ZSOS2KOR.js} +1 -1
  94. package/dist/chunk-ZSOS2KOR.js.map +1 -0
  95. package/dist/{claude-code-NMRKTAP7.js → claude-code-FS42PXZO.js} +4 -4
  96. package/dist/claude-code-FS42PXZO.js.map +1 -0
  97. package/dist/{claude-code-GRWO6XBZ.js → claude-code-TA53454O.js} +13 -13
  98. package/dist/claude-code-TA53454O.js.map +1 -0
  99. package/dist/cli/sdk.js +9 -8
  100. package/dist/cli/sdk.js.map +1 -1
  101. package/dist/cli.js +1 -1
  102. package/dist/cli.js.map +1 -1
  103. package/dist/{cline-25KW25IN.js → cline-GZFN32BM.js} +6 -6
  104. package/dist/cline-GZFN32BM.js.map +1 -0
  105. package/dist/{codebuddy-ZNYQACMF.js → codebuddy-IYS3TQZ3.js} +7 -7
  106. package/dist/codebuddy-IYS3TQZ3.js.map +1 -0
  107. package/dist/{codebuff-ETYT5UBL.js → codebuff-6KWBW6CT.js} +4 -4
  108. package/dist/codebuff-6KWBW6CT.js.map +1 -0
  109. package/dist/{codebuff-VR6JUDIY.js → codebuff-D3MIKJHC.js} +6 -6
  110. package/dist/codebuff-D3MIKJHC.js.map +1 -0
  111. package/dist/{codex-YAORPCOD.js → codex-DKBAAUCO.js} +4 -4
  112. package/dist/codex-DKBAAUCO.js.map +1 -0
  113. package/dist/{codex-CPNKTXG3.js → codex-ZKLP5IXZ.js} +9 -9
  114. package/dist/codex-ZKLP5IXZ.js.map +1 -0
  115. package/dist/{continue-WU2IB5KS.js → continue-I34FNSTJ.js} +8 -8
  116. package/dist/continue-I34FNSTJ.js.map +1 -0
  117. package/dist/{copilot-cli-MZTAWMPW.js → copilot-cli-CLBJACQ5.js} +4 -4
  118. package/dist/copilot-cli-CLBJACQ5.js.map +1 -0
  119. package/dist/{copilot-cli-PAP377OM.js → copilot-cli-NWPM5GE6.js} +7 -7
  120. package/dist/copilot-cli-NWPM5GE6.js.map +1 -0
  121. package/dist/{crush-QBXLNN7T.js → crush-A5C5USRL.js} +4 -4
  122. package/dist/crush-A5C5USRL.js.map +1 -0
  123. package/dist/{crush-3AVQA4YU.js → crush-MDGPZSZU.js} +7 -7
  124. package/dist/crush-MDGPZSZU.js.map +1 -0
  125. package/dist/{cursor-DIW43TRZ.js → cursor-D5SWDVSW.js} +3 -3
  126. package/dist/cursor-D5SWDVSW.js.map +1 -0
  127. package/dist/cursor-JRVK56QA.js +22 -0
  128. package/dist/{define-connector-DTWb46UB.d.ts → define-connector-B7tLHVnx.d.ts} +1 -1
  129. package/dist/{detect-6V4LC3MA.js → detect-FKJC36P4.js} +4 -4
  130. package/dist/detect-FKJC36P4.js.map +1 -0
  131. package/dist/{devin-QMEM3OFA.js → devin-TZMRC57O.js} +7 -7
  132. package/dist/devin-TZMRC57O.js.map +1 -0
  133. package/dist/{doctor-2YDUVSAU.js → doctor-PGVYUQYG.js} +26 -26
  134. package/dist/doctor-PGVYUQYG.js.map +1 -0
  135. package/dist/{droid-U3ZBLQFO.js → droid-PFQ2PZSF.js} +4 -4
  136. package/dist/droid-PFQ2PZSF.js.map +1 -0
  137. package/dist/{droid-MOKV53J4.js → droid-SCFWDJR4.js} +7 -7
  138. package/dist/droid-SCFWDJR4.js.map +1 -0
  139. package/dist/{gemini-cli-47ZHCOZR.js → gemini-cli-MLDGOR2L.js} +8 -8
  140. package/dist/gemini-cli-MLDGOR2L.js.map +1 -0
  141. package/dist/{gemini-cli-NMVVBO3K.js → gemini-cli-Y6RJMU24.js} +4 -4
  142. package/dist/gemini-cli-Y6RJMU24.js.map +1 -0
  143. package/dist/{goose-4EI5MYTI.js → goose-5DBHDSJW.js} +9 -9
  144. package/dist/goose-5DBHDSJW.js.map +1 -0
  145. package/dist/{goose-64V46Y2W.js → goose-K2HKUTBK.js} +4 -4
  146. package/dist/goose-K2HKUTBK.js.map +1 -0
  147. package/dist/{grok-cli-QYQPDSVB.js → grok-cli-LX6Q6RUY.js} +7 -7
  148. package/dist/grok-cli-LX6Q6RUY.js.map +1 -0
  149. package/dist/{hermes-F75OSK3Y.js → hermes-LJB3SJKB.js} +7 -7
  150. package/dist/hermes-LJB3SJKB.js.map +1 -0
  151. package/dist/{hermes-F3EGTK6N.js → hermes-MF3NX4ZY.js} +4 -4
  152. package/dist/hermes-MF3NX4ZY.js.map +1 -0
  153. package/dist/{hook-OEVRDMXD.js → hook-PVGBQUQI.js} +16 -16
  154. package/dist/hook-PVGBQUQI.js.map +1 -0
  155. package/dist/index.d.ts +3 -3
  156. package/dist/index.js +5 -5
  157. package/dist/{install-5NMCUDG5.js → install-HPDIK7F6.js} +192 -28
  158. package/dist/install-HPDIK7F6.js.map +1 -0
  159. package/dist/{introspect-dNekqPDY.d.ts → introspect-DWCu0Krk.d.ts} +1 -1
  160. package/dist/{jetbrains-copilot-ZGIWI6YV.js → jetbrains-copilot-2DSVAJMJ.js} +6 -6
  161. package/dist/jetbrains-copilot-2DSVAJMJ.js.map +1 -0
  162. package/dist/{junie-DIFN2P22.js → junie-GUBDRADP.js} +6 -6
  163. package/dist/junie-GUBDRADP.js.map +1 -0
  164. package/dist/{kilo-EMZJBEBB.js → kilo-HRLWMENX.js} +8 -8
  165. package/dist/kilo-HRLWMENX.js.map +1 -0
  166. package/dist/{kilo-SW7BH6EG.js → kilo-SMHPOHJ5.js} +4 -4
  167. package/dist/kilo-SMHPOHJ5.js.map +1 -0
  168. package/dist/{kilo-cli-S3GXBPAE.js → kilo-cli-IQMFMYZF.js} +8 -8
  169. package/dist/kilo-cli-IQMFMYZF.js.map +1 -0
  170. package/dist/{kilo-cli-ZF272ZHN.js → kilo-cli-T2SRRRJS.js} +5 -5
  171. package/dist/kilo-cli-T2SRRRJS.js.map +1 -0
  172. package/dist/{kimi-IQJOIY6B.js → kimi-EPD46UJK.js} +7 -7
  173. package/dist/kimi-EPD46UJK.js.map +1 -0
  174. package/dist/{kimi-5FHEXGZD.js → kimi-MSIDEMCI.js} +4 -4
  175. package/dist/kimi-MSIDEMCI.js.map +1 -0
  176. package/dist/{kiro-BYX4HEAJ.js → kiro-A7DL52FX.js} +7 -7
  177. package/dist/kiro-A7DL52FX.js.map +1 -0
  178. package/dist/{kiro-WGOI5CGT.js → kiro-NYRRBIKW.js} +4 -4
  179. package/dist/kiro-NYRRBIKW.js.map +1 -0
  180. package/dist/{leaderboard-XEKS7B3H.js → leaderboard-KCT7XPCI.js} +7 -7
  181. package/dist/leaderboard-KCT7XPCI.js.map +1 -0
  182. package/dist/{mimo-code-7R53QDHB.js → mimo-code-NDGLBXNC.js} +7 -7
  183. package/dist/mimo-code-NDGLBXNC.js.map +1 -0
  184. package/dist/{mistral-vibe-LHJ55FSB.js → mistral-vibe-LLWASF5X.js} +6 -6
  185. package/dist/mistral-vibe-LLWASF5X.js.map +1 -0
  186. package/dist/{mux-XM6AP35L.js → mux-7PIJ7HUQ.js} +4 -4
  187. package/dist/mux-7PIJ7HUQ.js.map +1 -0
  188. package/dist/{mux-NYCNGL43.js → mux-ON4QK3OC.js} +6 -6
  189. package/dist/mux-ON4QK3OC.js.map +1 -0
  190. package/dist/{nemoclaw-WSIPSE7U.js → nemoclaw-45R5MFBF.js} +7 -7
  191. package/dist/nemoclaw-45R5MFBF.js.map +1 -0
  192. package/dist/{omp-562NK5BJ.js → omp-ROCTFV3A.js} +7 -7
  193. package/dist/omp-ROCTFV3A.js.map +1 -0
  194. package/dist/{open-interpreter-I2CNOEXY.js → open-interpreter-V6CN542J.js} +6 -6
  195. package/dist/open-interpreter-V6CN542J.js.map +1 -0
  196. package/dist/openclaw-AOKFJGRQ.js +17 -0
  197. package/dist/{openclaw-5EQFGOWL.js → openclaw-KAFTNLR2.js} +4 -4
  198. package/dist/openclaw-KAFTNLR2.js.map +1 -0
  199. package/dist/{opencode-YS4WX2E2.js → opencode-YYWQ45LF.js} +7 -7
  200. package/dist/opencode-YYWQ45LF.js.map +1 -0
  201. package/dist/{opencode-QGP4ALQY.js → opencode-Z65JYILL.js} +4 -4
  202. package/dist/opencode-Z65JYILL.js.map +1 -0
  203. package/dist/{openhands-QMYIKNOS.js → openhands-OFFMWCQW.js} +7 -7
  204. package/dist/openhands-OFFMWCQW.js.map +1 -0
  205. package/dist/{package-G25GVTH2.js → package-TALOSRQ4.js} +15 -15
  206. package/dist/package-TALOSRQ4.js.map +1 -0
  207. package/dist/{pi-644FIN3A.js → pi-4W74ETTI.js} +6 -6
  208. package/dist/pi-4W74ETTI.js.map +1 -0
  209. package/dist/{pi-GGDQREVG.js → pi-DLKCPOJE.js} +4 -4
  210. package/dist/pi-DLKCPOJE.js.map +1 -0
  211. package/dist/{qwen-code-GQILBJ5B.js → qwen-code-26CSFDX6.js} +4 -4
  212. package/dist/qwen-code-26CSFDX6.js.map +1 -0
  213. package/dist/{qwen-code-STDMX7EM.js → qwen-code-JOBFNEVT.js} +16 -16
  214. package/dist/qwen-code-JOBFNEVT.js.map +1 -0
  215. package/dist/{roo-code-SUWI4BBN.js → roo-code-HSAE2CJU.js} +4 -4
  216. package/dist/roo-code-HSAE2CJU.js.map +1 -0
  217. package/dist/{roo-code-DLPIHHQ6.js → roo-code-RHIGJZNY.js} +6 -6
  218. package/dist/roo-code-RHIGJZNY.js.map +1 -0
  219. package/dist/runtime/index.d.ts +9 -8
  220. package/dist/runtime/index.js +14 -14
  221. package/dist/sdk/index.d.ts +4 -4
  222. package/dist/sdk/index.js +6 -6
  223. package/dist/sdk/index.js.map +1 -1
  224. package/dist/sdk/test.d.ts +2 -2
  225. package/dist/sdk/test.js +11 -11
  226. package/dist/{serve-XTMIUHKK.js → serve-4TEHK726.js} +16 -16
  227. package/dist/serve-4TEHK726.js.map +1 -0
  228. package/dist/{status-VJAGO4Z7.js → status-DVD4EHMX.js} +11 -11
  229. package/dist/status-DVD4EHMX.js.map +1 -0
  230. package/dist/{statusline-EY2E2UGF.js → statusline-ZVNH7XBK.js} +15 -15
  231. package/dist/statusline-ZVNH7XBK.js.map +1 -0
  232. package/dist/{synthetic-6FRA7P5Q.js → synthetic-LUT6V6SD.js} +4 -4
  233. package/dist/synthetic-LUT6V6SD.js.map +1 -0
  234. package/dist/{telemetry-OLZQBADT.js → telemetry-NWUJPIK3.js} +10 -10
  235. package/dist/telemetry-NWUJPIK3.js.map +1 -0
  236. package/dist/{trae-CPPYASR2.js → trae-SIQI3C66.js} +4 -4
  237. package/dist/trae-SIQI3C66.js.map +1 -0
  238. package/dist/{trae-UOYD6JZZ.js → trae-TLAFSQRQ.js} +6 -6
  239. package/dist/trae-TLAFSQRQ.js.map +1 -0
  240. package/dist/{types-JyhpJHJa.d.ts → types-C6j18a6R.d.ts} +13 -14
  241. package/dist/{uninstall-AZEUPAND.js → uninstall-DZVFV7KE.js} +21 -21
  242. package/dist/uninstall-DZVFV7KE.js.map +1 -0
  243. package/dist/{upgrade-CAUUHSSC.js → upgrade-OUE4ED52.js} +21 -21
  244. package/dist/upgrade-OUE4ED52.js.map +1 -0
  245. package/dist/{usage-3KHZ4RYZ.js → usage-NT3ZXALZ.js} +4 -4
  246. package/dist/usage-NT3ZXALZ.js.map +1 -0
  247. package/dist/{usage-event-TZWOZPRJ.js → usage-event-IELZE6WO.js} +15 -15
  248. package/dist/usage-event-IELZE6WO.js.map +1 -0
  249. package/dist/{vscode-copilot-NIMH2DGU.js → vscode-copilot-VZ5XYSTK.js} +7 -7
  250. package/dist/vscode-copilot-VZ5XYSTK.js.map +1 -0
  251. package/dist/{warp-NRBBJQR2.js → warp-5YBSP7FP.js} +4 -4
  252. package/dist/warp-5YBSP7FP.js.map +1 -0
  253. package/dist/{warp-QYJGKURM.js → warp-P2HWXIKT.js} +6 -6
  254. package/dist/warp-P2HWXIKT.js.map +1 -0
  255. package/dist/{windsurf-75LLZ37C.js → windsurf-3JC73GZK.js} +6 -6
  256. package/dist/windsurf-3JC73GZK.js.map +1 -0
  257. package/dist/{zed-HKAZXEJW.js → zed-6CMUKXLI.js} +7 -7
  258. package/dist/zed-6CMUKXLI.js.map +1 -0
  259. package/dist/{zed-XJFOOKCO.js → zed-XXCNYOIN.js} +4 -4
  260. package/dist/zed-XXCNYOIN.js.map +1 -0
  261. package/package.json +92 -88
  262. package/dist/action-Q7GGO4PA.js.map +0 -1
  263. package/dist/amazon-q-ETMAGY3D.js.map +0 -1
  264. package/dist/amp-67BZONGF.js.map +0 -1
  265. package/dist/amp-BQZOL5GR.js.map +0 -1
  266. package/dist/antigravity-EA4L225L.js.map +0 -1
  267. package/dist/antigravity-VXLDLTO7.js +0 -18
  268. package/dist/antigravity-cli-B2HXZFYQ.js.map +0 -1
  269. package/dist/antigravity-cli-OM6SC3PE.js.map +0 -1
  270. package/dist/chunk-2Y2MZRLP.js.map +0 -1
  271. package/dist/chunk-3NH2ARIS.js.map +0 -1
  272. package/dist/chunk-4NHXLXSD.js.map +0 -1
  273. package/dist/chunk-5IOTP7LQ.js.map +0 -1
  274. package/dist/chunk-6TF7MHG5.js.map +0 -1
  275. package/dist/chunk-6WZODR3Z.js.map +0 -1
  276. package/dist/chunk-7F5KHLEP.js.map +0 -1
  277. package/dist/chunk-APZDTY76.js.map +0 -1
  278. package/dist/chunk-BEFVJ2OE.js.map +0 -1
  279. package/dist/chunk-D4ELPBB5.js.map +0 -1
  280. package/dist/chunk-FBJQGRET.js.map +0 -1
  281. package/dist/chunk-FJCUKXGX.js.map +0 -1
  282. package/dist/chunk-GZGLCCEE.js.map +0 -1
  283. package/dist/chunk-H33M77DD.js.map +0 -1
  284. package/dist/chunk-H53QZQJI.js.map +0 -1
  285. package/dist/chunk-I5UXHIDT.js.map +0 -1
  286. package/dist/chunk-ISEJWBFF.js.map +0 -1
  287. package/dist/chunk-IVAWP6HH.js.map +0 -1
  288. package/dist/chunk-JKKU2WKG.js.map +0 -1
  289. package/dist/chunk-KHO5WNTP.js.map +0 -1
  290. package/dist/chunk-MGTDQLJJ.js.map +0 -1
  291. package/dist/chunk-MQPNU2CY.js.map +0 -1
  292. package/dist/chunk-NBYKLUF6.js.map +0 -1
  293. package/dist/chunk-NLE2J5P4.js.map +0 -1
  294. package/dist/chunk-O7SDRBVB.js.map +0 -1
  295. package/dist/chunk-OP4KBXUO.js.map +0 -1
  296. package/dist/chunk-OPXAP3AC.js.map +0 -1
  297. package/dist/chunk-PAPMUAR5.js.map +0 -1
  298. package/dist/chunk-PW42ZXCB.js.map +0 -1
  299. package/dist/chunk-RK6VBLXP.js.map +0 -1
  300. package/dist/chunk-UM5S7DKK.js.map +0 -1
  301. package/dist/chunk-UMQ6NBQR.js.map +0 -1
  302. package/dist/chunk-XC5SJ35F.js.map +0 -1
  303. package/dist/chunk-XD7MY6HB.js.map +0 -1
  304. package/dist/chunk-YPAXJ7EW.js.map +0 -1
  305. package/dist/chunk-YT43MUSJ.js.map +0 -1
  306. package/dist/chunk-Z2MRSS2I.js.map +0 -1
  307. package/dist/claude-code-GRWO6XBZ.js.map +0 -1
  308. package/dist/claude-code-NMRKTAP7.js.map +0 -1
  309. package/dist/cline-25KW25IN.js.map +0 -1
  310. package/dist/codebuddy-ZNYQACMF.js.map +0 -1
  311. package/dist/codebuff-ETYT5UBL.js.map +0 -1
  312. package/dist/codebuff-VR6JUDIY.js.map +0 -1
  313. package/dist/codex-CPNKTXG3.js.map +0 -1
  314. package/dist/codex-YAORPCOD.js.map +0 -1
  315. package/dist/continue-WU2IB5KS.js.map +0 -1
  316. package/dist/copilot-cli-MZTAWMPW.js.map +0 -1
  317. package/dist/copilot-cli-PAP377OM.js.map +0 -1
  318. package/dist/crush-3AVQA4YU.js.map +0 -1
  319. package/dist/crush-QBXLNN7T.js.map +0 -1
  320. package/dist/cursor-DIW43TRZ.js.map +0 -1
  321. package/dist/cursor-GSLUET3V.js +0 -22
  322. package/dist/detect-6V4LC3MA.js.map +0 -1
  323. package/dist/devin-QMEM3OFA.js.map +0 -1
  324. package/dist/doctor-2YDUVSAU.js.map +0 -1
  325. package/dist/droid-MOKV53J4.js.map +0 -1
  326. package/dist/droid-U3ZBLQFO.js.map +0 -1
  327. package/dist/gemini-cli-47ZHCOZR.js.map +0 -1
  328. package/dist/gemini-cli-NMVVBO3K.js.map +0 -1
  329. package/dist/goose-4EI5MYTI.js.map +0 -1
  330. package/dist/goose-64V46Y2W.js.map +0 -1
  331. package/dist/grok-cli-QYQPDSVB.js.map +0 -1
  332. package/dist/hermes-F3EGTK6N.js.map +0 -1
  333. package/dist/hermes-F75OSK3Y.js.map +0 -1
  334. package/dist/hook-OEVRDMXD.js.map +0 -1
  335. package/dist/install-5NMCUDG5.js.map +0 -1
  336. package/dist/jetbrains-copilot-ZGIWI6YV.js.map +0 -1
  337. package/dist/junie-DIFN2P22.js.map +0 -1
  338. package/dist/kilo-EMZJBEBB.js.map +0 -1
  339. package/dist/kilo-SW7BH6EG.js.map +0 -1
  340. package/dist/kilo-cli-S3GXBPAE.js.map +0 -1
  341. package/dist/kilo-cli-ZF272ZHN.js.map +0 -1
  342. package/dist/kimi-5FHEXGZD.js.map +0 -1
  343. package/dist/kimi-IQJOIY6B.js.map +0 -1
  344. package/dist/kiro-BYX4HEAJ.js.map +0 -1
  345. package/dist/kiro-WGOI5CGT.js.map +0 -1
  346. package/dist/leaderboard-XEKS7B3H.js.map +0 -1
  347. package/dist/mimo-code-7R53QDHB.js.map +0 -1
  348. package/dist/mistral-vibe-LHJ55FSB.js.map +0 -1
  349. package/dist/mux-NYCNGL43.js.map +0 -1
  350. package/dist/mux-XM6AP35L.js.map +0 -1
  351. package/dist/nemoclaw-WSIPSE7U.js.map +0 -1
  352. package/dist/omp-562NK5BJ.js.map +0 -1
  353. package/dist/open-interpreter-I2CNOEXY.js.map +0 -1
  354. package/dist/openclaw-5EQFGOWL.js.map +0 -1
  355. package/dist/openclaw-7EYBQS4R.js +0 -17
  356. package/dist/opencode-QGP4ALQY.js.map +0 -1
  357. package/dist/opencode-YS4WX2E2.js.map +0 -1
  358. package/dist/openhands-QMYIKNOS.js.map +0 -1
  359. package/dist/package-G25GVTH2.js.map +0 -1
  360. package/dist/pi-644FIN3A.js.map +0 -1
  361. package/dist/pi-GGDQREVG.js.map +0 -1
  362. package/dist/qwen-code-GQILBJ5B.js.map +0 -1
  363. package/dist/qwen-code-STDMX7EM.js.map +0 -1
  364. package/dist/roo-code-DLPIHHQ6.js.map +0 -1
  365. package/dist/roo-code-SUWI4BBN.js.map +0 -1
  366. package/dist/serve-XTMIUHKK.js.map +0 -1
  367. package/dist/status-VJAGO4Z7.js.map +0 -1
  368. package/dist/statusline-EY2E2UGF.js.map +0 -1
  369. package/dist/synthetic-6FRA7P5Q.js.map +0 -1
  370. package/dist/telemetry-OLZQBADT.js.map +0 -1
  371. package/dist/trae-CPPYASR2.js.map +0 -1
  372. package/dist/trae-UOYD6JZZ.js.map +0 -1
  373. package/dist/uninstall-AZEUPAND.js.map +0 -1
  374. package/dist/upgrade-CAUUHSSC.js.map +0 -1
  375. package/dist/usage-3KHZ4RYZ.js.map +0 -1
  376. package/dist/usage-event-TZWOZPRJ.js.map +0 -1
  377. package/dist/vscode-copilot-NIMH2DGU.js.map +0 -1
  378. package/dist/warp-NRBBJQR2.js.map +0 -1
  379. package/dist/warp-QYJGKURM.js.map +0 -1
  380. package/dist/windsurf-75LLZ37C.js.map +0 -1
  381. package/dist/zed-HKAZXEJW.js.map +0 -1
  382. package/dist/zed-XJFOOKCO.js.map +0 -1
  383. /package/dist/{antigravity-VXLDLTO7.js.map → antigravity-PZXYAO3X.js.map} +0 -0
  384. /package/dist/{cursor-GSLUET3V.js.map → cursor-JRVK56QA.js.map} +0 -0
  385. /package/dist/{openclaw-7EYBQS4R.js.map → openclaw-AOKFJGRQ.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/goose/index.ts"],"sourcesContent":["/**\r\n * adapters/goose — Block's Goose platform adapter for agent-connector.\r\n *\r\n * Goose is a json-stdio host, but its two config surfaces use DIFFERENT formats:\r\n *\r\n * - MCP servers (Goose calls them \"extensions\") live in a YAML config under the\r\n * root key `extensions`. Goose's `ExtensionConfig` is a `#[serde(tag=\"type\")]`\r\n * enum (crates/goose/src/agents/extension.rs); we render two of its variants:\r\n * stdio → { type: \"stdio\", cmd: <exe>, args: [...], envs: {...}, timeout, enabled }\r\n * NOTE the field is `cmd` (NOT `command`) and the env map is `envs` (NOT\r\n * `env`).\r\n * http → { type: \"streamable_http\", uri, headers?, envs?, timeout, enabled }\r\n * Goose's CURRENT remote transport is Streamable HTTP — the field is `uri`\r\n * (NOT `url`). The legacy `type: \"sse\"` variant still deserializes for old\r\n * config-file compatibility but Goose REJECTS it at connect time\r\n * (\"SSE is unsupported, migrate to streamable_http\" —\r\n * crates/goose/src/agents/extension_manager.rs), so we do NOT emit it and\r\n * do NOT advertise `sse` in capabilities; an `sse`/`ws` server warn-skips.\r\n * Because the file is YAML, the BaseAdapter JSON helpers do not apply — we\r\n * merge via core/yaml's readYaml/writeYaml, preserving any other config.\r\n *\r\n * - Hooks use Goose's Open Plugins system, which stores hook registrations in\r\n * JSON at <root>/.agents/plugins/<plugin-name>/hooks/hooks.json (project root\r\n * = <projectDir>/.agents; user root = ~/.agents):\r\n * { hooks: { <Event>: [ { matcher?, hooks:[{ type:\"command\", command }] } ] } }\r\n * The shape is the Claude-style NESTED rule (an optional `matcher` plus an\r\n * inner `hooks` array), and there is NO top-level `version` key. This file is\r\n * plain JSON, so the standard fs/JSON helpers are used for it.\r\n *\r\n * Wire protocol (parse) is Claude-compatible JSON on stdin, except Goose names\r\n * the working directory field `working_dir` (not `cwd`). The deny reply is\r\n * Goose's `{ decision: \"block\", reason }` (NOT Claude's hookSpecificOutput\r\n * permissionDecision shape).\r\n *\r\n * Native config locations (user scope):\r\n * - Linux/macOS: ~/.config/goose/config.yaml\r\n * - Windows: %APPDATA%/Block/goose/config/config.yaml\r\n */\r\n\r\nimport { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { dirname, join } from \"node:path\";\r\n\r\nimport { BaseAdapter, type HookMergeDescriptor } from \"../base.js\";\r\nimport type { Adapter, HookReply, InstallContext, MemoryTarget, NormalizedEvent } from \"../spi.js\";\r\nimport type {\r\n ChangeRecord,\r\n DetectedPlatform,\r\n HealthCheck,\r\n HookEventName,\r\n HookParadigm,\r\n HookResponse,\r\n NotificationEvent,\r\n PlatformCapabilities,\r\n PlatformId,\r\n PostToolUseEvent,\r\n PostToolUseFailureEvent,\r\n PreCompactEvent,\r\n PreToolUseEvent,\r\n SessionEndEvent,\r\n SessionStartEvent,\r\n ServerDef,\r\n StopEvent,\r\n Transport,\r\n UserPromptSubmitEvent,\r\n} from \"../../core/types.js\";\r\nimport { removeFromObjectMap, upsertInObjectMap } from \"../../core/object-map.js\";\r\nimport { roamingAppData } from \"../../core/host-paths.js\";\r\nimport { readYaml, yamlObjectMapCodec } from \"../../core/yaml.js\";\r\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\r\nimport { buildWrappedStdio, isHomeBinHookCommand } from \"../../core/spawn.js\";\r\nimport { renderSkillMd } from \"../claude-code/render.js\";\r\nimport { normalizeSessionSource } from \"../claude-code/wire.js\";\r\n\r\nconst HOST: PlatformId = \"goose\";\r\n/** Root key under which Goose stores MCP servers (\"extensions\") in config.yaml. */\r\nconst MCP_ROOT_KEY = \"extensions\";\r\n\r\n/**\r\n * Map each normalized hook event to the matching capability flag on this\r\n * adapter. The adapter's own `capabilities` literal is the single source of\r\n * truth for what Goose's Open-Plugins runtime delivers (PreToolUse/PostToolUse/\r\n * SessionStart/PostToolUseFailure); installHooks filters declared events\r\n * through this map so an unsupported event (e.g. UserPromptSubmit) is never\r\n * written verbatim into hooks.json — it is reported as a graceful warn/skip\r\n * instead.\r\n */\r\nconst EVENT_CAPABILITY: Record<HookEventName, keyof PlatformCapabilities> = {\r\n SessionStart: \"sessionStart\",\r\n SessionEnd: \"sessionEnd\",\r\n UserPromptSubmit: \"userPromptSubmit\",\r\n PreToolUse: \"preToolUse\",\r\n PostToolUse: \"postToolUse\",\r\n PreCompact: \"preCompact\",\r\n Stop: \"stop\",\r\n Notification: \"notification\",\r\n // Newer events. Goose's hooks system ships a dedicated PostToolUseFailure;\r\n // it has NO permission-dialog or subagent lifecycle events, so those three\r\n // flags stay unset on `capabilities` and warn-skip at install.\r\n PermissionRequest: \"permissionRequest\",\r\n PostToolUseFailure: \"postToolUseFailure\",\r\n SubagentStart: \"subagentStart\",\r\n SubagentStop: \"subagentStop\",\r\n // Goose has no post-compaction hook either — postCompact stays unset on\r\n // `capabilities`, so a declared PostCompact warn-skips at install.\r\n PostCompact: \"postCompact\",\r\n};\r\n\r\n/**\r\n * Goose extension (MCP server) entry — note the Goose-specific field names:\r\n * `cmd` (not `command`) and `envs` (not `env`).\r\n */\r\ninterface GooseStdioExtension {\r\n type: \"stdio\";\r\n cmd: string;\r\n args: string[];\r\n envs?: Record<string, string>;\r\n timeout: number;\r\n enabled: boolean;\r\n}\r\n\r\n/**\r\n * Goose remote extension (MCP Streamable HTTP server) — Goose's CURRENT remote\r\n * transport. Note the Goose-specific field name `uri` (NOT `url`); `headers` and\r\n * `envs` are the StreamableHttp variant's optional maps (see the `ExtensionConfig`\r\n * enum in crates/goose/src/agents/extension.rs).\r\n */\r\ninterface GooseStreamableHttpExtension {\r\n type: \"streamable_http\";\r\n uri: string;\r\n headers?: Record<string, string>;\r\n envs?: Record<string, string>;\r\n timeout: number;\r\n enabled: boolean;\r\n}\r\n\r\ntype GooseExtension = GooseStdioExtension | GooseStreamableHttpExtension;\r\n\r\n/** One inner command entry inside a hook rule. */\r\ninterface GooseHookCommand {\r\n type: \"command\";\r\n command: string;\r\n}\r\n\r\n/**\r\n * One nested-rule entry under a hook event. Goose's Open Plugins spec uses the\r\n * Claude-shaped nested rule: an optional `matcher` plus an inner `hooks` array\r\n * of `{ type, command }` commands (NOT a flat list of commands).\r\n */\r\ninterface GooseHookRule {\r\n matcher?: string;\r\n hooks: GooseHookCommand[];\r\n}\r\n\r\n/**\r\n * Goose Open-Plugins hooks.json shape: `{ hooks: { <Event>: [ rule, ... ] } }`.\r\n * There is NO top-level `version` key in the spec.\r\n */\r\ninterface GooseHooksFile {\r\n hooks: Record<string, GooseHookRule[]>;\r\n}\r\n\r\n/**\r\n * Raw Goose hook stdin payload — the serialized `HookContext` struct\r\n * (crates/goose/src/hooks/mod.rs:162-176). Goose's HookContext carries ONLY:\r\n * event, session_id, matcher_context, tool_name?, tool_input?, tool_output?,\r\n * message?, working_dir?\r\n * It is NOT Claude-compatible: there is no `prompt`, `tool_response`, `error`,\r\n * `is_error`, `source`, `reason`, `stop_hook_active`, `tool_use_id`,\r\n * `is_interrupt`, or `duration_ms` field on the wire — reading any of those\r\n * (kimi #189 false-friend class) yields undefined for every event. The prompt\r\n * rides on `message` (`.with_message`, agent.rs:1505-1509); the tool result\r\n * rides on `tool_output` (NOT `tool_response`).\r\n */\r\ninterface GooseWireInput {\r\n session_id?: string;\r\n /** Goose names the working directory `working_dir`; `cwd` is a fallback. */\r\n working_dir?: string;\r\n cwd?: string;\r\n hook_event_name?: string;\r\n tool_name?: string;\r\n tool_input?: Record<string, unknown>;\r\n /** PostToolUse result field is `tool_output` (NOT Claude's `tool_response`);\r\n * goose's PostToolUse ctx never calls with_tool_output, so it is absent on the\r\n * wire — kept for forward-compat (agent.rs:534-536, hooks/mod.rs:171,200-203). */\r\n tool_output?: unknown;\r\n /** UserPromptSubmit prompt text lives here via `.with_message`\r\n * (agent.rs:1505-1509); goose has NO `prompt` field. */\r\n message?: string;\r\n trigger?: string;\r\n /** Injected by the entrypoint so the runtime knows which connector to dispatch. */\r\n connector?: string;\r\n}\r\n\r\nexport class GooseAdapter extends BaseAdapter implements Adapter {\r\n readonly id: PlatformId = HOST;\r\n readonly name = \"Goose\";\r\n readonly paradigm: HookParadigm = \"json-stdio\";\r\n\r\n readonly capabilities: PlatformCapabilities = {\r\n // Memory surface: AGENTS.md-first managed block (project <projectDir>/AGENTS.md\r\n // via the base default — goose reads AGENTS.md AND .goosehints at each level,\r\n // .goosehints left untouched; user scope → the global .goosehints below).\r\n supportsMemory: true,\r\n preToolUse: true,\r\n postToolUse: true,\r\n preCompact: false,\r\n sessionStart: true,\r\n // Goose's Open Plugins runtime fires SessionEnd / UserPromptSubmit / Stop\r\n // (goose-docs.ai/blog/2026/05/14/goose-hooks/); parseEvent + the wire types\r\n // already handle all three, so they are wired (were incorrectly gated false).\r\n sessionEnd: true,\r\n userPromptSubmit: true,\r\n stop: true,\r\n notification: false,\r\n // Newer events: Goose ships a dedicated PostToolUseFailure hook (feedback\r\n // beside the error; the failure itself is not blockable). Goose has no\r\n // permission-dialog event and no subagent lifecycle hooks, so\r\n // permissionRequest / subagentStart / subagentStop stay unset — install\r\n // reports the standard skip-warn for them.\r\n postToolUseFailure: true,\r\n // Open Plugins documents PreToolUse/PostToolUse/SessionStart; argument\r\n // rewrite is not guaranteed across versions, so default to the safe value.\r\n canModifyArgs: false,\r\n canModifyOutput: false,\r\n canInjectSessionContext: true,\r\n // Goose registers two MCP extension transports: local `stdio` and remote\r\n // `http` (rendered as Goose's `type: \"streamable_http\"`). The legacy\r\n // `type: \"sse\"` variant still parses for old-config compatibility but Goose\r\n // refuses to connect over it (\"SSE is unsupported, migrate to\r\n // streamable_http\" — crates/goose/src/agents/extension_manager.rs), so it is\r\n // NOT advertised — an `sse`/`ws` server warn-skips at install.\r\n transports: [\"stdio\", \"http\"],\r\n // Content surfaces: goose reads SKILL.md from the cross-agent .agents dir\r\n // skill → <projectDir>/.agents/skills/<name>/SKILL.md (project)\r\n // skill → ~/.agents/skills/<name>/SKILL.md (user)\r\n // (NOT ~/.config/goose). Commands/subagents have no confirmed native dir, so\r\n // those flags stay unset and warn-skip via the BaseAdapter default.\r\n supportsSkills: true,\r\n };\r\n\r\n // ── Detection ────────────────────────────────────────────────────────────\r\n\r\n detectInstalled(_projectDir: string): DetectedPlatform {\r\n const configPath = this.userConfigPath();\r\n const configDir = dirname(configPath);\r\n const installed = existsSync(configDir) || existsSync(configPath);\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n installed,\r\n paradigm: this.paradigm,\r\n capabilities: this.capabilities,\r\n configPath,\r\n scope: \"user\",\r\n reason: installed\r\n ? `found Goose config at ${configPath}`\r\n : `no Goose config at ${configPath}`,\r\n confidence: installed ? \"high\" : \"low\",\r\n };\r\n }\r\n\r\n // ── Native paths ─────────────────────────────────────────────────────────\r\n\r\n override getConfigDir(_ctx: InstallContext): string {\r\n return dirname(this.userConfigPath());\r\n }\r\n\r\n /** MCP config: the YAML config.yaml (user scope). */\r\n override getServerConfigPath(_ctx: InstallContext): string {\r\n return this.userConfigPath();\r\n }\r\n\r\n /**\r\n * Hooks: Open-Plugins hooks.json under the `.agents/plugins/<plugin-name>/`\r\n * dir. The connector id is the plugin name. Project scope roots at\r\n * `<projectDir>/.agents`; user scope roots at `~/.agents`.\r\n */\r\n override getHookConfigPath(ctx: InstallContext): string {\r\n const root = ctx.scope === \"project\" ? ctx.projectDir : homedir();\r\n return join(root, \".agents\", \"plugins\", ctx.connector.id, \"hooks\", \"hooks.json\");\r\n }\r\n\r\n /**\r\n * OS-correct user config.yaml path:\r\n * - Windows: %APPDATA%/Block/goose/config/config.yaml\r\n * - macOS/Linux: ~/.config/goose/config.yaml\r\n */\r\n private userConfigPath(): string {\r\n if (process.platform === \"win32\") {\r\n return join(roamingAppData(), \"Block\", \"goose\", \"config\", \"config.yaml\");\r\n }\r\n return join(homedir(), \".config\", \"goose\", \"config.yaml\");\r\n }\r\n\r\n // ── Memory surface: global .goosehints at user scope ────────────────────\r\n // Project scope stays on the AGENTS.md base default (goose reads project\r\n // AGENTS.md and .goosehints at each level by default — one canonical copy in\r\n // the standard file; the user's .goosehints is never touched). User scope:\r\n // goose's only documented global memory file is the .goosehints next to\r\n // config.yaml (~/.config/goose/.goosehints; Windows under\r\n // %APPDATA%\\Block\\goose\\config — adapter-corroborated, verify per version).\r\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\r\n if (this.memoryOverride(ctx)?.path || ctx.scope !== \"user\") {\r\n return super.memoryTargets(ctx);\r\n }\r\n return [\r\n {\r\n path: join(dirname(this.userConfigPath()), \".goosehints\"),\r\n reason: \"goose global hints file (.goosehints beside config.yaml)\",\r\n },\r\n ];\r\n }\r\n\r\n // ── MCP server install / uninstall (YAML — merge via readYaml/writeYaml) ──\r\n\r\n override installServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n const path = this.getServerConfigPath(ctx);\r\n const server = this.effectiveServer(ctx);\r\n\r\n if (!server) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: connector.server\r\n ? \"server registration disabled for goose\"\r\n : \"connector declares no MCP server\",\r\n },\r\n ];\r\n }\r\n\r\n // Goose registers stdio extensions ({ type:\"stdio\", cmd, args }) AND remote\r\n // Streamable-HTTP extensions ({ type:\"streamable_http\", uri }). It has no\r\n // live SSE transport (the `sse` variant parses but Goose refuses to connect —\r\n // crates/goose/src/agents/extension_manager.rs), so anything else is\r\n // reported, never silently written as a broken empty-cmd stdio entry.\r\n const transport: Transport = server.transport;\r\n const isStdio = transport === \"stdio\" && !!server.command;\r\n const isHttp = transport === \"http\" && !!server.url;\r\n if (!isStdio && !isHttp) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: `transport \"${transport}\" not registrable in ${MCP_ROOT_KEY} (stdio + http/streamable_http only)`,\r\n },\r\n ];\r\n }\r\n\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n const entry = this.renderExtension(ctx, server);\r\n\r\n // Merge into existing YAML, preserving every other config key + extension.\r\n return [\r\n upsertInObjectMap({\r\n codec: yamlObjectMapCodec(),\r\n rootKey: MCP_ROOT_KEY,\r\n policy: \"coerce\",\r\n platform: this.id,\r\n configPath: path,\r\n entryId: connector.id,\r\n entry,\r\n dryRun,\r\n }),\r\n ];\r\n }\r\n\r\n override uninstallServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n const path = this.getServerConfigPath(ctx);\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n return [\r\n removeFromObjectMap({\r\n codec: yamlObjectMapCodec(),\r\n rootKey: MCP_ROOT_KEY,\r\n policy: \"coerce\",\r\n platform: this.id,\r\n configPath: path,\r\n entryId: connector.id,\r\n dryRun,\r\n }),\r\n ];\r\n }\r\n\r\n /**\r\n * Render a normalized ServerDef into Goose's native extension entry. Goose has\r\n * no native env interpolation, so `${env:VAR}` refs are resolved to literals at\r\n * install time.\r\n *\r\n * stdio → { type:\"stdio\", cmd, args, envs?, timeout, enabled } — honors the\r\n * telemetry serve-wrapper (cmd=homeBin, args=[serve…]).\r\n * http → { type:\"streamable_http\", uri, headers?, envs?, timeout, enabled } —\r\n * a remote URL has no local command to route through the serve proxy,\r\n * so it is never telemetry-wrapped; env-refs in uri/headers/env resolve\r\n * to literals. The Goose field is `uri` (NOT `url`).\r\n */\r\n private renderExtension(ctx: InstallContext, server: ServerDef): GooseExtension {\r\n const timeoutMs = server.timeoutMs;\r\n const timeout =\r\n typeof timeoutMs === \"number\" && timeoutMs > 0 ? Math.round(timeoutMs / 1000) : 300;\r\n\r\n // Remote (Streamable HTTP) — never serve-wrapped; `uri` is the Goose field.\r\n if (server.transport === \"http\") {\r\n const entry: GooseStreamableHttpExtension = {\r\n type: \"streamable_http\",\r\n uri: resolveEnvRefsDeep(server.url ?? \"\"),\r\n timeout,\r\n enabled: server.enabled !== false,\r\n };\r\n if (server.headers && Object.keys(server.headers).length > 0) {\r\n const headers: Record<string, string> = {};\r\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.headers))) {\r\n headers[k] = String(v);\r\n }\r\n entry.headers = headers;\r\n }\r\n if (server.env && Object.keys(server.env).length > 0) {\r\n const envs: Record<string, string> = {};\r\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.env))) {\r\n envs[k] = String(v);\r\n }\r\n entry.envs = envs;\r\n }\r\n return entry;\r\n }\r\n\r\n let cmd = server.command ?? \"\";\r\n let args = [...(server.args ?? [])];\r\n\r\n ({ command: cmd, args } = buildWrappedStdio(ctx, server, this.id, cmd, args));\r\n\r\n cmd = resolveEnvRefsDeep(cmd);\r\n args = resolveEnvRefsDeep(args);\r\n\r\n const entry: GooseStdioExtension = {\r\n type: \"stdio\",\r\n cmd,\r\n args,\r\n timeout,\r\n enabled: server.enabled !== false,\r\n };\r\n\r\n if (server.env && Object.keys(server.env).length > 0) {\r\n const envs: Record<string, string> = {};\r\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.env))) {\r\n envs[k] = String(v);\r\n }\r\n entry.envs = envs;\r\n }\r\n return entry;\r\n }\r\n\r\n // ── Hook install / uninstall (JSON Open-Plugins hooks.json) ───────────────\r\n\r\n override installHooks(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n const path = this.getHookConfigPath(ctx);\r\n\r\n if (connector.platforms[HOST]?.hooks === false) {\r\n return [{ platform: this.id, action: \"skip\", path, detail: \"hooks disabled for goose\" }];\r\n }\r\n if (connector.hookEvents.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", path, detail: \"connector declares no hooks\" }];\r\n }\r\n\r\n const pending = connector.hookEvents.map((event) => ({\r\n event,\r\n matcher: connector.hooks[event]?.matcher ?? \"\",\r\n }));\r\n return this.upsertHookEntries(ctx, path, pending, this.hookDescriptor(ctx));\r\n }\r\n\r\n override uninstallHooks(ctx: InstallContext): ChangeRecord[] {\r\n return this.removeHookEntries(ctx, this.getHookConfigPath(ctx), this.hookDescriptor(ctx));\r\n }\r\n\r\n /**\r\n * Goose's hook-merge descriptor for the shared object-map engine. Goose's hook\r\n * file is the DEDICATED per-connector `.agents/plugins/<id>/hooks/hooks.json`\r\n * (NESTED rule shape `{ matcher?, hooks:[{type,command}] }`), so every\r\n * observable string + ownership predicate is carried here to reproduce the\r\n * prior in-adapter loop byte-for-byte:\r\n * - malformedPolicy \"coerce\" — a present-but-malformed `hooks` root (array /\r\n * primitive, hand-edited) and a non-array event bucket are coerced to fresh\r\n * containers, matching the old readHooksFile coerce + the `??=` bucket fill.\r\n * - mapEvent = the CAPABILITY FILTER: an event Goose's Open-Plugins runtime\r\n * does not deliver (e.g. UserPromptSubmit, PreCompact) maps to undefined →\r\n * the engine emits the `<event> unsupported on goose — skipped` warn and\r\n * never writes it; supported events map to themselves (identity).\r\n * - entryOwnsCommand is connector-GENERIC (ANY of our commands in the nested\r\n * inner `hooks`) — the old ruleHasOurCommand.\r\n * - uninstall is NESTED: ownsEntryForRemove is never-true so the engine only\r\n * runs stripInner — strip our owned inner commands, keep foreign ones, drop\r\n * emptied rules. The rebuilt rule OMITS `matcher` when it was undefined\r\n * (distinct from claude/droid/qwen, which always emit a matcher); `removed`\r\n * is the inner-command count, surfaced in the `(<n>)` remove detail.\r\n */\r\n private hookDescriptor(ctx: InstallContext): HookMergeDescriptor<GooseHookRule> {\r\n return {\r\n malformedPolicy: \"coerce\",\r\n // CAPABILITY FILTER → identity-or-undefined: supported events map to\r\n // themselves; an unsupported one (capability !== true) maps to undefined,\r\n // routing it to the warn-skip path.\r\n mapEvent: (e) =>\r\n this.capabilities[EVENT_CAPABILITY[e as HookEventName]] === true ? e : undefined,\r\n unmappedWarnDetail: (e) => `${e} unsupported on goose — skipped`,\r\n // NESTED rule, matcher-FIRST key order (matches the old `desired`).\r\n renderEntry: (_event, matcher, command) => ({\r\n matcher,\r\n hooks: [{ type: \"command\", command }],\r\n }),\r\n // Connector-generic find (= the old ruleHasOurCommand): ANY inner command ours.\r\n entryOwnsCommand: (rule, _command) =>\r\n (rule.hooks ?? []).some((h) => this.isOurCommand(h.command, ctx)),\r\n // NESTED: never drop a whole rule; inner-strip only.\r\n ownsEntryForRemove: () => () => false,\r\n stripInner: (c) => (rule) => {\r\n const innerBefore = rule.hooks?.length ?? 0;\r\n const inner = (rule.hooks ?? []).filter((h) => !this.isOurCommand(h.command, c));\r\n return {\r\n // MATCHER-OMITTED-WHEN-UNDEFINED: reproduce the old rebuild exactly —\r\n // key order is `matcher` (only when present) then `hooks`.\r\n next:\r\n inner.length > 0\r\n ? { ...(rule.matcher !== undefined ? { matcher: rule.matcher } : {}), hooks: inner }\r\n : null,\r\n removed: innerBefore - inner.length,\r\n };\r\n },\r\n skipDetail: (e) => `hooks.${e}`,\r\n removeDetail: (e, n) => `hooks.${e} (${n})`,\r\n absentDetail: \"no hooks.json\",\r\n noMatchDetail: \"no matching hook entries\",\r\n };\r\n }\r\n\r\n /** True when a hook command is ours (anchored home-bin + connector id). */\r\n private isOurCommand(command: string | undefined, ctx: InstallContext): boolean {\r\n return isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id);\r\n }\r\n\r\n // ── Diagnostics ──────────────────────────────────────────────────────────\r\n\r\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\r\n const serverPath = this.getServerConfigPath(ctx);\r\n const hookPath = this.getHookConfigPath(ctx);\r\n const id = ctx.connector.id;\r\n const homeBin = ctx.homeBinPath;\r\n const hookEvents = ctx.connector.hookEvents;\r\n const checks: HealthCheck[] = [\r\n {\r\n name: `${this.name}: config.yaml present`,\r\n check: () =>\r\n existsSync(serverPath)\r\n ? { status: \"OK\", detail: serverPath }\r\n : { status: \"FAIL\", detail: `not found: ${serverPath}` },\r\n },\r\n {\r\n name: `${this.name}: ${MCP_ROOT_KEY}.${id} registered`,\r\n check: () => {\r\n if (!ctx.connector.server) return { status: \"OK\", detail: \"no MCP server declared\" };\r\n const cfg = readYaml<Record<string, unknown>>(serverPath);\r\n const bucket = cfg?.[MCP_ROOT_KEY];\r\n const present =\r\n typeof bucket === \"object\" &&\r\n bucket !== null &&\r\n !Array.isArray(bucket) &&\r\n id in (bucket as Record<string, unknown>);\r\n return present\r\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${id}` }\r\n : { status: \"FAIL\", detail: `${MCP_ROOT_KEY}.${id} not found in ${serverPath}` };\r\n },\r\n },\r\n {\r\n name: `${this.name}: hook command registered`,\r\n check: () => {\r\n if (hookEvents.length === 0) return { status: \"OK\", detail: \"no hooks declared\" };\r\n const file = this.readJson<GooseHooksFile>(hookPath);\r\n if (!file || !file.hooks) {\r\n return { status: \"FAIL\", detail: `cannot read ${hookPath}` };\r\n }\r\n const registered = Object.values(file.hooks).some((bucket) =>\r\n (bucket ?? []).some((rule) =>\r\n (rule.hooks ?? []).some((h) => isHomeBinHookCommand(h.command, homeBin, id)),\r\n ),\r\n );\r\n return registered\r\n ? { status: \"OK\", detail: \"hook command present\" }\r\n : { status: \"FAIL\", detail: `no hook for ${id} in ${hookPath}` };\r\n },\r\n },\r\n ];\r\n\r\n // Content-surface checks: assert presence only for skills this connector\r\n // declares (goose skills live under the .agents skills dir at either scope).\r\n for (const skill of ctx.connector.skills) {\r\n const p = join(this.skillDir(ctx, skill.name), \"SKILL.md\");\r\n checks.push({\r\n name: `${this.name}: skill ${skill.name} present`,\r\n check: () =>\r\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\r\n });\r\n }\r\n return checks;\r\n }\r\n\r\n // ── Content surface: skills ───────────────────────────────────────────────\r\n // CONTENT-ONLY: pure native-file writer. No runtime dispatch, no home-bin\r\n // pointer, no telemetry wrap. Idempotent (byte-identical → skip) via\r\n // writeContentFile and reversible via removeContentFile + removeDirIfEmpty.\r\n // Honors platforms[\"goose\"].skills === false to skip.\r\n //\r\n // goose reads SKILL.md from the cross-agent .agents dir (NOT ~/.config/goose):\r\n // project scope → <projectDir>/.agents/skills/<name>/SKILL.md\r\n // user scope → ~/.agents/skills/<name>/SKILL.md\r\n\r\n private skillsDir(ctx: InstallContext): string {\r\n return ctx.scope === \"project\"\r\n ? join(ctx.projectDir, \".agents\", \"skills\")\r\n : join(homedir(), \".agents\", \"skills\");\r\n }\r\n\r\n private skillDir(ctx: InstallContext, name: string): string {\r\n return join(this.skillsDir(ctx), name);\r\n }\r\n\r\n override installSkills(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.platforms[HOST]?.skills === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for goose\" }];\r\n }\r\n if (connector.skills.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\r\n }\r\n const changes: ChangeRecord[] = [];\r\n for (const skill of connector.skills) {\r\n const dir = this.skillDir(ctx, skill.name);\r\n changes.push(\r\n this.writeContentFile(join(dir, \"SKILL.md\"), renderSkillMd(skill), ctx.dryRun),\r\n );\r\n // Bundle any resource files beside SKILL.md (relative path → contents).\r\n // Defense-in-depth: skip+warn on any key that escapes the skill dir\r\n // (config-time validation already rejects these, but never trust input).\r\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\r\n const target = this.resolveWithin(dir, rel);\r\n if (target === null) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\r\n });\r\n continue;\r\n }\r\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.skills.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\r\n }\r\n const changes: ChangeRecord[] = [];\r\n for (const skill of connector.skills) {\r\n const dir = this.skillDir(ctx, skill.name);\r\n // Remove only the files we wrote (SKILL.md + declared resources), then the\r\n // skill dir itself when we own its full contents.\r\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\r\n for (const rel of Object.keys(skill.resources ?? {})) {\r\n const target = this.resolveWithin(dir, rel);\r\n if (target === null) continue; // never delete outside the skill dir\r\n changes.push(this.removeContentFile(target, ctx.dryRun));\r\n }\r\n // Only remove the skill dir when WE own its full contents — never rm -rf a\r\n // dir that still holds user-added / sibling-tool / shared files.\r\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\r\n }\r\n return changes;\r\n }\r\n\r\n // ── Runtime: parse Goose stdin JSON → normalized event ───────────────────\r\n\r\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\r\n const input = (raw ?? {}) as GooseWireInput;\r\n // Goose sends the working directory as `working_dir`; fall back to `cwd`.\r\n const projectDir =\r\n typeof input.working_dir === \"string\"\r\n ? input.working_dir\r\n : typeof input.cwd === \"string\"\r\n ? input.cwd\r\n : undefined;\r\n const base = {\r\n hostPlatform: HOST,\r\n connectorId: typeof input.connector === \"string\" ? input.connector : \"\",\r\n sessionId: typeof input.session_id === \"string\" ? input.session_id : \"\",\r\n ...(projectDir !== undefined ? { projectDir } : {}),\r\n raw,\r\n } as const;\r\n\r\n switch (event) {\r\n case \"PreToolUse\": {\r\n const ev: PreToolUseEvent = {\r\n ...base,\r\n toolName: input.tool_name ?? \"\",\r\n toolInput: input.tool_input ?? {},\r\n };\r\n return ev;\r\n }\r\n case \"PostToolUse\": {\r\n // SOURCE (hooks/mod.rs:171, agent.rs:534-536): the result field is\r\n // `tool_output` (NOT `tool_response`), AND goose's PostToolUse ctx is\r\n // built with only with_tool + with_working_dir — it never calls\r\n // with_tool_output — so no output is on the wire today. The read is kept\r\n // for forward-compat (if goose later populates tool_output it maps here).\r\n // There is NO `is_error` field on HookContext: goose signals failure by\r\n // emitting PostToolUseFailure as a DISTINCT event (agent.rs:526-531),\r\n // not via a boolean — so isError is never set here.\r\n const ev: PostToolUseEvent = {\r\n ...base,\r\n toolName: input.tool_name ?? \"\",\r\n toolInput: input.tool_input ?? {},\r\n ...(toolOutputToString(input.tool_output) !== undefined\r\n ? { toolOutput: toolOutputToString(input.tool_output) }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n case \"SessionStart\": {\r\n // SOURCE (agent.rs:409-416 emit_hook + hooks/mod.rs:736-737 test): goose\r\n // emits SessionStart as a BARE HookContext::new with no builders — its\r\n // struct has no `source` discriminator, so there is no field to read.\r\n // normalizeSessionSource(undefined) → 'startup'; that is the only honest\r\n // value goose can supply. If goose later adds a start-reason field, map\r\n // it here.\r\n const ev: SessionStartEvent = { ...base, source: normalizeSessionSource(undefined) };\r\n return ev;\r\n }\r\n case \"SessionEnd\": {\r\n // SOURCE (agent.rs:409-416 emit_hook): SessionEnd is also a bare\r\n // HookContext with no `reason` field on the struct — goose provides no\r\n // end-reason on stdin (the hooks/mod.rs `reason` is the hook→host deny\r\n // REPLY direction, not input). The optional normalized reason is omitted.\r\n const ev: SessionEndEvent = { ...base };\r\n return ev;\r\n }\r\n case \"UserPromptSubmit\": {\r\n // SOURCE (agent.rs:1505-1509 .with_message + hooks/mod.rs:173): goose has\r\n // NO `prompt` field; the prompt text is carried on `message`. Reading\r\n // input.prompt always dropped the whole prompt — read input.message.\r\n const ev: UserPromptSubmitEvent = {\r\n ...base,\r\n prompt: typeof input.message === \"string\" ? input.message : \"\",\r\n };\r\n return ev;\r\n }\r\n case \"PreCompact\": {\r\n const ev: PreCompactEvent = {\r\n ...base,\r\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\r\n ? { trigger: input.trigger }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n case \"Stop\": {\r\n // SOURCE (agent.rs:1851-1854, 2536-2539, 2575 emit_hook + hooks/mod.rs\r\n // :162-176): every Stop emit site constructs a bare HookContext::new\r\n // (Stop); the struct has no `stop_hook_active` field, so the optional\r\n // stopHookActive is omitted (goose emits no such boolean).\r\n const ev: StopEvent = { ...base };\r\n return ev;\r\n }\r\n case \"Notification\": {\r\n const ev: NotificationEvent = {\r\n ...base,\r\n message: typeof input.message === \"string\" ? input.message : \"\",\r\n };\r\n return ev;\r\n }\r\n case \"PostToolUseFailure\": {\r\n // SOURCE (agent.rs:526-537 + hooks/mod.rs:162-176): goose builds the\r\n // failure HookContext with ONLY with_tool + with_working_dir. The struct\r\n // carries no `error` text on the wire — HOST GAP: the failure message is\r\n // genuinely never serialized on stdin (the hooks/mod.rs `reason` is the\r\n // hook→host deny REPLY, not input), so the REQUIRED normalized `error`\r\n // stays \"\". There is also no `tool_use_id`, `is_interrupt`, or\r\n // `duration_ms` field on HookContext — those optional fields are omitted\r\n // (no correlation id / interrupt flag / duration is delivered).\r\n const ev: PostToolUseFailureEvent = {\r\n ...base,\r\n toolName: input.tool_name ?? \"\",\r\n toolInput: input.tool_input ?? {},\r\n error: \"\",\r\n };\r\n return ev;\r\n }\r\n case \"PermissionRequest\":\r\n case \"SubagentStart\":\r\n case \"SubagentStop\":\r\n case \"PostCompact\": {\r\n // No Goose analog (no permission-dialog event, no subagent lifecycle\r\n // hooks, no post-compaction hook). Install already skip-warns these via\r\n // EVENT_CAPABILITY; a runtime dispatch is a mis-route — fail loudly.\r\n throw new Error(`unsupported goose hook event: ${String(event)}`);\r\n }\r\n default: {\r\n const _never: never = event;\r\n throw new Error(`unsupported goose hook event: ${String(_never)}`);\r\n }\r\n }\r\n }\r\n\r\n // ── Runtime: normalized response → Goose native hook reply (Claude-shaped) ─\r\n\r\n formatReply(event: HookEventName, response: HookResponse): HookReply {\r\n const decision = response.decision ?? \"allow\";\r\n\r\n // PostToolUseFailure is feedback-only (the tool already failed, nothing is\r\n // blockable): \"context\" injects additionalContext beside the error, and a\r\n // \"deny\" DEGRADES to the same shape carrying the reason — it must never\r\n // render as `{ decision: \"block\" }`.\r\n if (event === \"PostToolUseFailure\") {\r\n const context =\r\n decision === \"context\"\r\n ? response.additionalContext\r\n : decision === \"deny\"\r\n ? response.reason ?? response.additionalContext\r\n : undefined;\r\n if (context) return this.stdout({ additionalContext: context });\r\n return { exitCode: 0 };\r\n }\r\n\r\n // deny → Goose blocks via `{ decision: \"block\", reason }` on stdout JSON\r\n // (NOT Claude's hookSpecificOutput.permissionDecision shape).\r\n if (decision === \"deny\") {\r\n return this.stdout({\r\n decision: \"block\",\r\n reason: response.reason ?? \"Blocked by hook\",\r\n });\r\n }\r\n\r\n // ask → Goose has no native \"ask\"; degrade to block to stay fail-safe.\r\n if (decision === \"ask\") {\r\n return this.stdout({\r\n decision: \"block\",\r\n reason: response.reason ?? \"Confirmation required by hook\",\r\n });\r\n }\r\n\r\n if (decision === \"context\" && response.additionalContext) {\r\n return this.stdout({ additionalContext: response.additionalContext });\r\n }\r\n\r\n // allow / modify (unsupported) / void → pass through.\r\n return { exitCode: 0 };\r\n }\r\n\r\n private stdout(payload: unknown): HookReply {\r\n return { exitCode: 0, stdout: JSON.stringify(payload) };\r\n }\r\n\r\n // ── Internal helpers ──────────────────────────────────────────────────────\r\n\r\n /** Resolve the per-platform server override into an effective ServerDef. */\r\n private effectiveServer(ctx: InstallContext): ServerDef | undefined {\r\n const override = ctx.connector.platforms[this.id]?.server;\r\n if (override === false) return undefined;\r\n const base = ctx.connector.server;\r\n if (!base) return undefined;\r\n return override && typeof override === \"object\" ? { ...base, ...override } : base;\r\n }\r\n}\r\n\r\n/** Coerce a Goose PostToolUse `tool_output` (hooks/mod.rs:171) into a string. */\r\nfunction toolOutputToString(value: unknown): string | undefined {\r\n if (value == null) return undefined;\r\n if (typeof value === \"string\") return value;\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n}\r\n\r\nexport const adapter = new GooseAdapter();\r\nexport default adapter;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY;AAiC9B,IAAM,OAAmB;AAEzB,IAAM,eAAe;AAWrB,IAAM,mBAAsE;AAAA,EAC1E,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,cAAc;AAAA;AAAA;AAAA;AAAA,EAId,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,cAAc;AAAA;AAAA;AAAA,EAGd,aAAa;AACf;AAwFO,IAAM,eAAN,cAA2B,YAA+B;AAAA,EACtD,KAAiB;AAAA,EACjB,OAAO;AAAA,EACP,WAAyB;AAAA,EAEzB,eAAqC;AAAA;AAAA;AAAA;AAAA,IAI5C,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,cAAc;AAAA;AAAA;AAAA;AAAA,IAId,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,MAAM;AAAA,IACN,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMd,oBAAoB;AAAA;AAAA;AAAA,IAGpB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOzB,YAAY,CAAC,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM5B,gBAAgB;AAAA,EAClB;AAAA;AAAA,EAIA,gBAAgB,aAAuC;AACrD,UAAM,aAAa,KAAK,eAAe;AACvC,UAAM,YAAY,QAAQ,UAAU;AACpC,UAAM,YAAY,WAAW,SAAS,KAAK,WAAW,UAAU;AAChE,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX;AAAA,MACA,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,OAAO;AAAA,MACP,QAAQ,YACJ,yBAAyB,UAAU,KACnC,sBAAsB,UAAU;AAAA,MACpC,YAAY,YAAY,SAAS;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAIS,aAAa,MAA8B;AAClD,WAAO,QAAQ,KAAK,eAAe,CAAC;AAAA,EACtC;AAAA;AAAA,EAGS,oBAAoB,MAA8B;AACzD,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,kBAAkB,KAA6B;AACtD,UAAM,OAAO,IAAI,UAAU,YAAY,IAAI,aAAa,QAAQ;AAChE,WAAO,KAAK,MAAM,WAAW,WAAW,IAAI,UAAU,IAAI,SAAS,YAAY;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,iBAAyB;AAC/B,QAAI,QAAQ,aAAa,SAAS;AAChC,aAAO,KAAK,eAAe,GAAG,SAAS,SAAS,UAAU,aAAa;AAAA,IACzE;AACA,WAAO,KAAK,QAAQ,GAAG,WAAW,SAAS,aAAa;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASmB,cAAc,KAAqC;AACpE,QAAI,KAAK,eAAe,GAAG,GAAG,QAAQ,IAAI,UAAU,QAAQ;AAC1D,aAAO,MAAM,cAAc,GAAG;AAAA,IAChC;AACA,WAAO;AAAA,MACL;AAAA,QACE,MAAM,KAAK,QAAQ,KAAK,eAAe,CAAC,GAAG,aAAa;AAAA,QACxD,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIS,cAAc,KAAqC;AAC1D,UAAM,EAAE,WAAW,OAAO,IAAI;AAC9B,UAAM,OAAO,KAAK,oBAAoB,GAAG;AACzC,UAAM,SAAS,KAAK,gBAAgB,GAAG;AAEvC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ,UAAU,SACd,2CACA;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAOA,UAAM,YAAuB,OAAO;AACpC,UAAM,UAAU,cAAc,WAAW,CAAC,CAAC,OAAO;AAClD,UAAM,SAAS,cAAc,UAAU,CAAC,CAAC,OAAO;AAChD,QAAI,CAAC,WAAW,CAAC,QAAQ;AACvB,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ,cAAc,SAAS,wBAAwB,YAAY;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,mBAAmB,IAAI;AAC5C,QAAI,QAAS,QAAO,CAAC,OAAO;AAE5B,UAAM,QAAQ,KAAK,gBAAgB,KAAK,MAAM;AAG9C,WAAO;AAAA,MACL,kBAAkB;AAAA,QAChB,OAAO,mBAAmB;AAAA,QAC1B,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU,KAAK;AAAA,QACf,YAAY;AAAA,QACZ,SAAS,UAAU;AAAA,QACnB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAES,gBAAgB,KAAqC;AAC5D,UAAM,EAAE,WAAW,OAAO,IAAI;AAC9B,UAAM,OAAO,KAAK,oBAAoB,GAAG;AACzC,UAAM,UAAU,KAAK,mBAAmB,IAAI;AAC5C,QAAI,QAAS,QAAO,CAAC,OAAO;AAE5B,WAAO;AAAA,MACL,oBAAoB;AAAA,QAClB,OAAO,mBAAmB;AAAA,QAC1B,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU,KAAK;AAAA,QACf,YAAY;AAAA,QACZ,SAAS,UAAU;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,gBAAgB,KAAqB,QAAmC;AAC9E,UAAM,YAAY,OAAO;AACzB,UAAM,UACJ,OAAO,cAAc,YAAY,YAAY,IAAI,KAAK,MAAM,YAAY,GAAI,IAAI;AAGlF,QAAI,OAAO,cAAc,QAAQ;AAC/B,YAAMA,SAAsC;AAAA,QAC1C,MAAM;AAAA,QACN,KAAK,mBAAmB,OAAO,OAAO,EAAE;AAAA,QACxC;AAAA,QACA,SAAS,OAAO,YAAY;AAAA,MAC9B;AACA,UAAI,OAAO,WAAW,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,GAAG;AAC5D,cAAM,UAAkC,CAAC;AACzC,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,mBAAmB,OAAO,OAAO,CAAC,GAAG;AACvE,kBAAQ,CAAC,IAAI,OAAO,CAAC;AAAA,QACvB;AACA,QAAAA,OAAM,UAAU;AAAA,MAClB;AACA,UAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,GAAG;AACpD,cAAM,OAA+B,CAAC;AACtC,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,mBAAmB,OAAO,GAAG,CAAC,GAAG;AACnE,eAAK,CAAC,IAAI,OAAO,CAAC;AAAA,QACpB;AACA,QAAAA,OAAM,OAAO;AAAA,MACf;AACA,aAAOA;AAAA,IACT;AAEA,QAAI,MAAM,OAAO,WAAW;AAC5B,QAAI,OAAO,CAAC,GAAI,OAAO,QAAQ,CAAC,CAAE;AAElC,KAAC,EAAE,SAAS,KAAK,KAAK,IAAI,kBAAkB,KAAK,QAAQ,KAAK,IAAI,KAAK,IAAI;AAE3E,UAAM,mBAAmB,GAAG;AAC5B,WAAO,mBAAmB,IAAI;AAE9B,UAAM,QAA6B;AAAA,MACjC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,OAAO,YAAY;AAAA,IAC9B;AAEA,QAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,GAAG;AACpD,YAAM,OAA+B,CAAC;AACtC,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,mBAAmB,OAAO,GAAG,CAAC,GAAG;AACnE,aAAK,CAAC,IAAI,OAAO,CAAC;AAAA,MACpB;AACA,YAAM,OAAO;AAAA,IACf;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIS,aAAa,KAAqC;AACzD,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,OAAO,KAAK,kBAAkB,GAAG;AAEvC,QAAI,UAAU,UAAU,IAAI,GAAG,UAAU,OAAO;AAC9C,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,MAAM,QAAQ,2BAA2B,CAAC;AAAA,IACzF;AACA,QAAI,UAAU,WAAW,WAAW,GAAG;AACrC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,MAAM,QAAQ,8BAA8B,CAAC;AAAA,IAC5F;AAEA,UAAM,UAAU,UAAU,WAAW,IAAI,CAAC,WAAW;AAAA,MACnD;AAAA,MACA,SAAS,UAAU,MAAM,KAAK,GAAG,WAAW;AAAA,IAC9C,EAAE;AACF,WAAO,KAAK,kBAAkB,KAAK,MAAM,SAAS,KAAK,eAAe,GAAG,CAAC;AAAA,EAC5E;AAAA,EAES,eAAe,KAAqC;AAC3D,WAAO,KAAK,kBAAkB,KAAK,KAAK,kBAAkB,GAAG,GAAG,KAAK,eAAe,GAAG,CAAC;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBQ,eAAe,KAAyD;AAC9E,WAAO;AAAA,MACL,iBAAiB;AAAA;AAAA;AAAA;AAAA,MAIjB,UAAU,CAAC,MACT,KAAK,aAAa,iBAAiB,CAAkB,CAAC,MAAM,OAAO,IAAI;AAAA,MACzE,oBAAoB,CAAC,MAAM,GAAG,CAAC;AAAA;AAAA,MAE/B,aAAa,CAAC,QAAQ,SAAS,aAAa;AAAA,QAC1C;AAAA,QACA,OAAO,CAAC,EAAE,MAAM,WAAW,QAAQ,CAAC;AAAA,MACtC;AAAA;AAAA,MAEA,kBAAkB,CAAC,MAAM,cACtB,KAAK,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,aAAa,EAAE,SAAS,GAAG,CAAC;AAAA;AAAA,MAElE,oBAAoB,MAAM,MAAM;AAAA,MAChC,YAAY,CAAC,MAAM,CAAC,SAAS;AAC3B,cAAM,cAAc,KAAK,OAAO,UAAU;AAC1C,cAAM,SAAS,KAAK,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,aAAa,EAAE,SAAS,CAAC,CAAC;AAC/E,eAAO;AAAA;AAAA;AAAA,UAGL,MACE,MAAM,SAAS,IACX,EAAE,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC,GAAI,OAAO,MAAM,IACjF;AAAA,UACN,SAAS,cAAc,MAAM;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,YAAY,CAAC,MAAM,SAAS,CAAC;AAAA,MAC7B,cAAc,CAAC,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC;AAAA,MACxC,cAAc;AAAA,MACd,eAAe;AAAA,IACjB;AAAA,EACF;AAAA;AAAA,EAGQ,aAAa,SAA6B,KAA8B;AAC9E,WAAO,qBAAqB,SAAS,IAAI,aAAa,IAAI,UAAU,EAAE;AAAA,EACxE;AAAA;AAAA,EAIS,gBAAgB,KAA6C;AACpE,UAAM,aAAa,KAAK,oBAAoB,GAAG;AAC/C,UAAM,WAAW,KAAK,kBAAkB,GAAG;AAC3C,UAAM,KAAK,IAAI,UAAU;AACzB,UAAM,UAAU,IAAI;AACpB,UAAM,aAAa,IAAI,UAAU;AACjC,UAAM,SAAwB;AAAA,MAC5B;AAAA,QACE,MAAM,GAAG,KAAK,IAAI;AAAA,QAClB,OAAO,MACL,WAAW,UAAU,IACjB,EAAE,QAAQ,MAAM,QAAQ,WAAW,IACnC,EAAE,QAAQ,QAAQ,QAAQ,cAAc,UAAU,GAAG;AAAA,MAC7D;AAAA,MACA;AAAA,QACE,MAAM,GAAG,KAAK,IAAI,KAAK,YAAY,IAAI,EAAE;AAAA,QACzC,OAAO,MAAM;AACX,cAAI,CAAC,IAAI,UAAU,OAAQ,QAAO,EAAE,QAAQ,MAAM,QAAQ,yBAAyB;AACnF,gBAAM,MAAM,SAAkC,UAAU;AACxD,gBAAM,SAAS,MAAM,YAAY;AACjC,gBAAM,UACJ,OAAO,WAAW,YAClB,WAAW,QACX,CAAC,MAAM,QAAQ,MAAM,KACrB,MAAO;AACT,iBAAO,UACH,EAAE,QAAQ,MAAM,QAAQ,GAAG,YAAY,IAAI,EAAE,GAAG,IAChD,EAAE,QAAQ,QAAQ,QAAQ,GAAG,YAAY,IAAI,EAAE,iBAAiB,UAAU,GAAG;AAAA,QACnF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM,GAAG,KAAK,IAAI;AAAA,QAClB,OAAO,MAAM;AACX,cAAI,WAAW,WAAW,EAAG,QAAO,EAAE,QAAQ,MAAM,QAAQ,oBAAoB;AAChF,gBAAM,OAAO,KAAK,SAAyB,QAAQ;AACnD,cAAI,CAAC,QAAQ,CAAC,KAAK,OAAO;AACxB,mBAAO,EAAE,QAAQ,QAAQ,QAAQ,eAAe,QAAQ,GAAG;AAAA,UAC7D;AACA,gBAAM,aAAa,OAAO,OAAO,KAAK,KAAK,EAAE;AAAA,YAAK,CAAC,YAChD,UAAU,CAAC,GAAG;AAAA,cAAK,CAAC,UAClB,KAAK,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,qBAAqB,EAAE,SAAS,SAAS,EAAE,CAAC;AAAA,YAC7E;AAAA,UACF;AACA,iBAAO,aACH,EAAE,QAAQ,MAAM,QAAQ,uBAAuB,IAC/C,EAAE,QAAQ,QAAQ,QAAQ,eAAe,EAAE,OAAO,QAAQ,GAAG;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAIA,eAAW,SAAS,IAAI,UAAU,QAAQ;AACxC,YAAM,IAAI,KAAK,KAAK,SAAS,KAAK,MAAM,IAAI,GAAG,UAAU;AACzD,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,KAAK,IAAI,WAAW,MAAM,IAAI;AAAA,QACvC,OAAO,MACL,WAAW,CAAC,IAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,cAAc,CAAC,GAAG;AAAA,MAC9F,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,UAAU,KAA6B;AAC7C,WAAO,IAAI,UAAU,YACjB,KAAK,IAAI,YAAY,WAAW,QAAQ,IACxC,KAAK,QAAQ,GAAG,WAAW,QAAQ;AAAA,EACzC;AAAA,EAEQ,SAAS,KAAqB,MAAsB;AAC1D,WAAO,KAAK,KAAK,UAAU,GAAG,GAAG,IAAI;AAAA,EACvC;AAAA,EAES,cAAc,KAAqC;AAC1D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,IAAI,GAAG,WAAW,OAAO;AAC/C,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,4BAA4B,CAAC;AAAA,IACpF;AACA,QAAI,UAAU,OAAO,WAAW,GAAG;AACjC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,+BAA+B,CAAC;AAAA,IACvF;AACA,UAAM,UAA0B,CAAC;AACjC,eAAW,SAAS,UAAU,QAAQ;AACpC,YAAM,MAAM,KAAK,SAAS,KAAK,MAAM,IAAI;AACzC,cAAQ;AAAA,QACN,KAAK,iBAAiB,KAAK,KAAK,UAAU,GAAG,cAAc,KAAK,GAAG,IAAI,MAAM;AAAA,MAC/E;AAIA,iBAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,MAAM,aAAa,CAAC,CAAC,GAAG;AACnE,cAAM,SAAS,KAAK,cAAc,KAAK,GAAG;AAC1C,YAAI,WAAW,MAAM;AACnB,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,QAAQ,mBAAmB,GAAG;AAAA,UAChC,CAAC;AACD;AAAA,QACF;AACA,gBAAQ,KAAK,KAAK,iBAAiB,QAAQ,UAAU,IAAI,MAAM,CAAC;AAAA,MAClE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAES,gBAAgB,KAAqC;AAC5D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,OAAO,WAAW,GAAG;AACjC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,+BAA+B,CAAC;AAAA,IACvF;AACA,UAAM,UAA0B,CAAC;AACjC,eAAW,SAAS,UAAU,QAAQ;AACpC,YAAM,MAAM,KAAK,SAAS,KAAK,MAAM,IAAI;AAGzC,cAAQ,KAAK,KAAK,kBAAkB,KAAK,KAAK,UAAU,GAAG,IAAI,MAAM,CAAC;AACtE,iBAAW,OAAO,OAAO,KAAK,MAAM,aAAa,CAAC,CAAC,GAAG;AACpD,cAAM,SAAS,KAAK,cAAc,KAAK,GAAG;AAC1C,YAAI,WAAW,KAAM;AACrB,gBAAQ,KAAK,KAAK,kBAAkB,QAAQ,IAAI,MAAM,CAAC;AAAA,MACzD;AAGA,cAAQ,KAAK,KAAK,iBAAiB,KAAK,IAAI,MAAM,CAAC;AAAA,IACrD;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,WAAW,OAAsB,KAA+B;AAC9D,UAAM,QAAS,OAAO,CAAC;AAEvB,UAAM,aACJ,OAAO,MAAM,gBAAgB,WACzB,MAAM,cACN,OAAO,MAAM,QAAQ,WACnB,MAAM,MACN;AACR,UAAM,OAAO;AAAA,MACX,cAAc;AAAA,MACd,aAAa,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY;AAAA,MACrE,WAAW,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;AAAA,MACrE,GAAI,eAAe,SAAY,EAAE,WAAW,IAAI,CAAC;AAAA,MACjD;AAAA,IACF;AAEA,YAAQ,OAAO;AAAA,MACb,KAAK,cAAc;AACjB,cAAM,KAAsB;AAAA,UAC1B,GAAG;AAAA,UACH,UAAU,MAAM,aAAa;AAAA,UAC7B,WAAW,MAAM,cAAc,CAAC;AAAA,QAClC;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,eAAe;AASlB,cAAM,KAAuB;AAAA,UAC3B,GAAG;AAAA,UACH,UAAU,MAAM,aAAa;AAAA,UAC7B,WAAW,MAAM,cAAc,CAAC;AAAA,UAChC,GAAI,mBAAmB,MAAM,WAAW,MAAM,SAC1C,EAAE,YAAY,mBAAmB,MAAM,WAAW,EAAE,IACpD,CAAC;AAAA,QACP;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,gBAAgB;AAOnB,cAAM,KAAwB,EAAE,GAAG,MAAM,QAAQ,uBAAuB,MAAS,EAAE;AACnF,eAAO;AAAA,MACT;AAAA,MACA,KAAK,cAAc;AAKjB,cAAM,KAAsB,EAAE,GAAG,KAAK;AACtC,eAAO;AAAA,MACT;AAAA,MACA,KAAK,oBAAoB;AAIvB,cAAM,KAA4B;AAAA,UAChC,GAAG;AAAA,UACH,QAAQ,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAAA,QAC9D;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,cAAc;AACjB,cAAM,KAAsB;AAAA,UAC1B,GAAG;AAAA,UACH,GAAI,MAAM,YAAY,UAAU,MAAM,YAAY,WAC9C,EAAE,SAAS,MAAM,QAAQ,IACzB,CAAC;AAAA,QACP;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,QAAQ;AAKX,cAAM,KAAgB,EAAE,GAAG,KAAK;AAChC,eAAO;AAAA,MACT;AAAA,MACA,KAAK,gBAAgB;AACnB,cAAM,KAAwB;AAAA,UAC5B,GAAG;AAAA,UACH,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAAA,QAC/D;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,sBAAsB;AASzB,cAAM,KAA8B;AAAA,UAClC,GAAG;AAAA,UACH,UAAU,MAAM,aAAa;AAAA,UAC7B,WAAW,MAAM,cAAc,CAAC;AAAA,UAChC,OAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,eAAe;AAIlB,cAAM,IAAI,MAAM,iCAAiC,OAAO,KAAK,CAAC,EAAE;AAAA,MAClE;AAAA,MACA,SAAS;AACP,cAAM,SAAgB;AACtB,cAAM,IAAI,MAAM,iCAAiC,OAAO,MAAM,CAAC,EAAE;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,YAAY,OAAsB,UAAmC;AACnE,UAAM,WAAW,SAAS,YAAY;AAMtC,QAAI,UAAU,sBAAsB;AAClC,YAAM,UACJ,aAAa,YACT,SAAS,oBACT,aAAa,SACX,SAAS,UAAU,SAAS,oBAC5B;AACR,UAAI,QAAS,QAAO,KAAK,OAAO,EAAE,mBAAmB,QAAQ,CAAC;AAC9D,aAAO,EAAE,UAAU,EAAE;AAAA,IACvB;AAIA,QAAI,aAAa,QAAQ;AACvB,aAAO,KAAK,OAAO;AAAA,QACjB,UAAU;AAAA,QACV,QAAQ,SAAS,UAAU;AAAA,MAC7B,CAAC;AAAA,IACH;AAGA,QAAI,aAAa,OAAO;AACtB,aAAO,KAAK,OAAO;AAAA,QACjB,UAAU;AAAA,QACV,QAAQ,SAAS,UAAU;AAAA,MAC7B,CAAC;AAAA,IACH;AAEA,QAAI,aAAa,aAAa,SAAS,mBAAmB;AACxD,aAAO,KAAK,OAAO,EAAE,mBAAmB,SAAS,kBAAkB,CAAC;AAAA,IACtE;AAGA,WAAO,EAAE,UAAU,EAAE;AAAA,EACvB;AAAA,EAEQ,OAAO,SAA6B;AAC1C,WAAO,EAAE,UAAU,GAAG,QAAQ,KAAK,UAAU,OAAO,EAAE;AAAA,EACxD;AAAA;AAAA;AAAA,EAKQ,gBAAgB,KAA4C;AAClE,UAAM,WAAW,IAAI,UAAU,UAAU,KAAK,EAAE,GAAG;AACnD,QAAI,aAAa,MAAO,QAAO;AAC/B,UAAM,OAAO,IAAI,UAAU;AAC3B,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,YAAY,OAAO,aAAa,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,IAAI;AAAA,EAC/E;AACF;AAGA,SAAS,mBAAmB,OAAoC;AAC9D,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEO,IAAM,UAAU,IAAI,aAAa;AACxC,IAAO,gBAAQ;","names":["entry"]}
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  openSqlite
4
- } from "./chunk-YT43MUSJ.js";
4
+ } from "./chunk-XZWMJLIT.js";
5
5
  import {
6
6
  firstExistingRoot
7
- } from "./chunk-O7SDRBVB.js";
7
+ } from "./chunk-KM2YXO6V.js";
8
8
  import {
9
9
  emptyTokens,
10
10
  inferProvider
11
- } from "./chunk-XD7MY6HB.js";
11
+ } from "./chunk-7PSNXUFK.js";
12
12
 
13
13
  // src/usage/readers/goose.ts
14
14
  var PLATFORM_ID = "goose";
@@ -209,4 +209,4 @@ var goose_default = gooseReader;
209
209
  export {
210
210
  goose_default as default
211
211
  };
212
- //# sourceMappingURL=goose-64V46Y2W.js.map
212
+ //# sourceMappingURL=goose-K2HKUTBK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/usage/readers/goose.ts"],"sourcesContent":["/**\r\n * usage/readers/goose — Goose CLI usage reader (SQLite, sessions table).\r\n *\r\n * Faithful port of tokscale sessions/goose.rs. Goose stores one row per session\r\n * in a `sessions` table inside a single SQLite database:\r\n * • Linux: ~/.local/share/goose/sessions/sessions.db\r\n * • macOS: ~/Library/Application Support/goose/sessions/sessions.db\r\n * • Legacy: ~/.local/share/Block/goose/sessions/sessions.db\r\n * (host roots, incl. the AGENT_CONNECTOR_GOOSE_DIR override, are resolved by\r\n * paths.ts hostRoots(\"goose\"); the macOS / Block variants are listed there.)\r\n *\r\n * One SELECT pulls every session that carries a model config:\r\n * SELECT id, model_config_json, provider_name, created_at,\r\n * total_tokens, input_tokens, output_tokens,\r\n * accumulated_total_tokens, accumulated_input_tokens,\r\n * accumulated_output_tokens\r\n * FROM sessions\r\n * WHERE model_config_json IS NOT NULL AND TRIM(model_config_json) != ''\r\n *\r\n * Token extraction (flat columns, no JSON token nesting):\r\n * input = accumulated_input_tokens ?? input_tokens ?? 0 (clamped ≥ 0)\r\n * output = accumulated_output_tokens ?? output_tokens ?? 0 (clamped ≥ 0)\r\n * total = accumulated_total_tokens ?? total_tokens ?? 0 (clamped ≥ 0)\r\n * reasoning = total > input + output ? total - input - output : 0 (INFERRED)\r\n * cacheRead / cacheWrite are always 0 (Goose does not report them).\r\n * Rows with input == 0 && output == 0 && total == 0 are skipped.\r\n *\r\n * The reasoning value is *inferred*, not host-reported (Goose has no reasoning\r\n * column); we surface it but flag the inference in `detail`.\r\n *\r\n * Model: `model_config_json` is parsed for its `model_name` field (trimmed; the\r\n * row is dropped when it is missing/empty). Provider: canonical_provider() of the\r\n * `provider_name` column when present, else inferProvider(model), else \"goose\".\r\n * Timestamp: `created_at` (RFC3339, \"YYYY-MM-DD HH:MM:SS\", or \"YYYY-MM-DD\"),\r\n * parsed to epoch ms then disambiguated s↔ms. Session id = the `id` column, which\r\n * is also the dedup key (one row per session). No project/workspace in the schema.\r\n * Confidence is \"host-reported\".\r\n *\r\n * Fail-open: db missing/locked/unreadable → openSqlite returns null → []; a bad\r\n * row is skipped, never thrown.\r\n */\r\n\r\nimport type { UsageReader, UsageRecord } from \"../types.js\";\r\nimport { emptyTokens } from \"../aggregate.js\";\r\nimport { inferProvider } from \"../normalize.js\";\r\nimport { firstExistingRoot } from \"../paths.js\";\r\nimport { openSqlite } from \"../sqlite.js\";\r\n\r\nconst PLATFORM_ID = \"goose\" as const;\r\nconst DEFAULT_PROVIDER = \"goose\";\r\n\r\n/** The session columns we read (everything optional / unknown off the row). */\r\ninterface GooseRow {\r\n id?: unknown;\r\n model_config_json?: unknown;\r\n provider_name?: unknown;\r\n created_at?: unknown;\r\n total_tokens?: unknown;\r\n input_tokens?: unknown;\r\n output_tokens?: unknown;\r\n accumulated_total_tokens?: unknown;\r\n accumulated_input_tokens?: unknown;\r\n accumulated_output_tokens?: unknown;\r\n}\r\n\r\nconst QUERY = `\r\n SELECT\r\n id,\r\n model_config_json,\r\n provider_name,\r\n created_at,\r\n total_tokens,\r\n input_tokens,\r\n output_tokens,\r\n accumulated_total_tokens,\r\n accumulated_input_tokens,\r\n accumulated_output_tokens\r\n FROM sessions\r\n WHERE model_config_json IS NOT NULL\r\n AND TRIM(model_config_json) != ''\r\n`;\r\n\r\n/**\r\n * Parse `model_config_json` for its `model_name` (port of parse_model_config):\r\n * JSON-parse the column, take the trimmed `model_name` string, or null when the\r\n * json is invalid / the name is absent or empty.\r\n */\r\nfunction parseModelConfig(json: string): string | null {\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(json);\r\n } catch {\r\n return null;\r\n }\r\n if (typeof parsed !== \"object\" || parsed === null) return null;\r\n const name = (parsed as { model_name?: unknown }).model_name;\r\n if (typeof name !== \"string\") return null;\r\n const trimmed = name.trim();\r\n return trimmed === \"\" ? null : trimmed;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Provider resolution (port of provider_identity.rs canonical_provider)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Canonicalize a single provider segment (port of canonicalize_provider_segment):\r\n * trim, drop a trailing slash, lowercase, `-`→`_`; reject `<…>` placeholders, the\r\n * empty/`unknown` segment, and unknown segments that contain a digit (those are\r\n * model-name fragments). Returns the canonical id or undefined.\r\n */\r\nfunction canonicalizeProviderSegment(segment: string): string | undefined {\r\n const normalized = segment.trim().replace(/\\/+$/, \"\").toLowerCase().replace(/-/g, \"_\");\r\n if (normalized.startsWith(\"<\") && normalized.endsWith(\">\")) return undefined;\r\n switch (normalized) {\r\n case \"\":\r\n case \"unknown\":\r\n return undefined;\r\n case \"x_ai\":\r\n case \"xai\":\r\n return \"xai\";\r\n case \"z_ai\":\r\n case \"zai\":\r\n return \"zai\";\r\n case \"moonshot\":\r\n case \"moonshotai\":\r\n return \"moonshotai\";\r\n case \"meta\":\r\n case \"meta_llama\":\r\n return \"meta_llama\";\r\n case \"azure\":\r\n case \"azure_ai\":\r\n return \"azure_ai\";\r\n case \"anthropic\":\r\n case \"vertex\":\r\n case \"vertex_ai\":\r\n return \"anthropic\";\r\n case \"together\":\r\n case \"together_ai\":\r\n return \"together_ai\";\r\n case \"fireworks\":\r\n case \"fireworks_ai\":\r\n return \"fireworks_ai\";\r\n case \"google\":\r\n case \"gemini\":\r\n return \"google\";\r\n case \"openai\":\r\n case \"openai_codex\":\r\n return \"openai\";\r\n case \"minimax\":\r\n case \"minimaxai\":\r\n case \"minimax_ai\":\r\n return \"minimax\";\r\n case \"mistral\":\r\n case \"mistralai\":\r\n return \"mistralai\";\r\n case \"ai21\":\r\n return \"ai21\";\r\n default:\r\n if (/[0-9]/.test(normalized)) return undefined;\r\n return normalized;\r\n }\r\n}\r\n\r\n/**\r\n * Port of canonical_provider: the first canonical tag from `provider_tags(raw)`\r\n * (split on '/', and for any dotted segment also try its dot-parts), or undefined\r\n * when no segment canonicalizes. Unlike the droid port, this returns undefined\r\n * (not the raw string) so goose's resolver can fall through to model inference,\r\n * matching the Rust `Option<String>` semantics.\r\n */\r\nfunction canonicalProvider(raw: string): string | undefined {\r\n for (const segment of raw.trim().replace(/\\/+$/, \"\").split(\"/\")) {\r\n const tag = canonicalizeProviderSegment(segment);\r\n if (tag !== undefined) return tag;\r\n if (segment.includes(\".\")) {\r\n for (const dotted of segment.split(\".\")) {\r\n const dottedTag = canonicalizeProviderSegment(dotted);\r\n if (dottedTag !== undefined) return dottedTag;\r\n }\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Resolve the provider (port of resolved_provider): canonical_provider of a\r\n * non-blank `provider_name`, else inferProvider(model), else \"goose\".\r\n */\r\nfunction resolvedProvider(providerName: unknown, modelId: string): string {\r\n if (typeof providerName === \"string\") {\r\n const trimmed = providerName.trim();\r\n if (trimmed !== \"\") {\r\n const canonical = canonicalProvider(trimmed);\r\n if (canonical !== undefined) return canonical;\r\n }\r\n }\r\n return inferProvider(modelId) ?? DEFAULT_PROVIDER;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Timestamps & numbers\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Parse `created_at` to epoch ms (port of parse_created_at). Accepts RFC3339,\r\n * \"YYYY-MM-DD HH:MM:SS\" (interpreted as UTC), and \"YYYY-MM-DD\" (UTC midnight).\r\n * Returns 0 when unparseable (mirroring the Rust 0.0 sentinel).\r\n */\r\nfunction parseCreatedAt(s: string): number {\r\n // ORDER MATTERS: the bare \"YYYY-MM-DD HH:MM:SS\" and \"YYYY-MM-DD\" forms must be\r\n // matched BEFORE the Date.parse fallback. V8's Date.parse accepts both shapes\r\n // but interprets them as LOCAL time, whereas goose.rs treats them as UTC\r\n // (chrono NaiveDateTime/NaiveDate.and_utc()). Detecting them first via regex\r\n // and building with Date.UTC keeps the timestamp tz-stable (mirrors cursor.ts).\r\n\r\n // \"YYYY-MM-DD HH:MM:SS\" → treat the space-separated form as UTC.\r\n const dt = /^(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})$/.exec(s);\r\n if (dt) {\r\n const ms = Date.UTC(\r\n Number(dt[1]),\r\n Number(dt[2]) - 1,\r\n Number(dt[3]),\r\n Number(dt[4]),\r\n Number(dt[5]),\r\n Number(dt[6]),\r\n );\r\n return Number.isNaN(ms) ? 0 : ms;\r\n }\r\n\r\n // \"YYYY-MM-DD\" → UTC midnight.\r\n const d = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\r\n if (d) {\r\n const ms = Date.UTC(Number(d[1]), Number(d[2]) - 1, Number(d[3]));\r\n return Number.isNaN(ms) ? 0 : ms;\r\n }\r\n\r\n // RFC3339 (e.g. \"2026-04-14T16:18:53Z\" / with offset). Date.parse handles these\r\n // with explicit tz info, so the local-vs-UTC ambiguity above does not apply.\r\n const iso = Date.parse(s);\r\n if (!Number.isNaN(iso)) return iso;\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Disambiguate a seconds-or-ms timestamp (port of timestamp_secs_to_ms): values\r\n * already in ms (> 1e12) pass through; smaller values are treated as seconds.\r\n * `parseCreatedAt` already yields ms, but we replicate the Rust pipeline exactly\r\n * (parse_created_at → timestamp_secs_to_ms) so a 0 sentinel stays 0.\r\n */\r\nfunction timestampSecsToMs(ts: number): number {\r\n return ts > 1e12 ? Math.trunc(ts) : Math.trunc(ts * 1000);\r\n}\r\n\r\n/** Coerce an unknown SQLite cell to a non-negative integer, or null when absent. */\r\nfunction toIntOrNull(v: unknown): number | null {\r\n if (v === null || v === undefined) return null;\r\n const n = typeof v === \"number\" ? v : typeof v === \"string\" ? Number(v) : NaN;\r\n if (!Number.isFinite(n)) return null;\r\n return Math.trunc(n);\r\n}\r\n\r\n/** First non-null of (accumulated, plain), defaulting to 0, clamped ≥ 0. */\r\nfunction preferAccumulated(accumulated: unknown, plain: unknown): number {\r\n const acc = toIntOrNull(accumulated);\r\n const value = acc ?? toIntOrNull(plain) ?? 0;\r\n return Math.max(0, value);\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Reader\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/** The Goose CLI usage reader singleton. */\r\nconst gooseReader: UsageReader = {\r\n platformId: PLATFORM_ID,\r\n kind: \"local\",\r\n async read({ sinceMs }: { sinceMs?: number }): Promise<UsageRecord[]> {\r\n const dbPath = firstExistingRoot(PLATFORM_ID);\r\n if (dbPath === undefined) return []; // no sessions.db → fail-open\r\n\r\n const db = await openSqlite(dbPath);\r\n if (db === null) return []; // missing / locked / unreadable / non-sqlite → fail-open\r\n\r\n try {\r\n const rows = db.all(QUERY); // bad SQL / schema mismatch → [] (fail-open)\r\n const records: UsageRecord[] = [];\r\n\r\n for (const raw of rows) {\r\n const row = raw as GooseRow;\r\n\r\n const sessionId = row.id;\r\n if (typeof sessionId !== \"string\" || sessionId === \"\") continue;\r\n\r\n const modelConfig = row.model_config_json;\r\n if (typeof modelConfig !== \"string\") continue;\r\n const modelId = parseModelConfig(modelConfig);\r\n if (modelId === null) continue;\r\n\r\n const input = preferAccumulated(row.accumulated_input_tokens, row.input_tokens);\r\n const output = preferAccumulated(row.accumulated_output_tokens, row.output_tokens);\r\n const total = preferAccumulated(row.accumulated_total_tokens, row.total_tokens);\r\n\r\n // Skip all-zero sessions (matches the Rust input==0 && output==0 && total==0 check).\r\n if (input === 0 && output === 0 && total === 0) continue;\r\n\r\n // Reasoning is INFERRED, not reported: total minus accounted input+output.\r\n const reasoning = total > input + output ? total - input - output : 0;\r\n\r\n const createdAtRaw = typeof row.created_at === \"string\" ? row.created_at : \"\";\r\n const ts = timestampSecsToMs(parseCreatedAt(createdAtRaw));\r\n if (sinceMs !== undefined && ts < sinceMs) continue;\r\n\r\n const providerId = resolvedProvider(row.provider_name, modelId);\r\n\r\n const tokens = emptyTokens();\r\n tokens.input = input;\r\n tokens.output = output;\r\n tokens.reasoning = reasoning;\r\n // cacheRead / cacheWrite stay 0 (Goose does not report them).\r\n\r\n const record: UsageRecord = {\r\n platformId: PLATFORM_ID,\r\n modelId,\r\n providerId,\r\n sessionId,\r\n tokens,\r\n ts,\r\n messageCount: 1,\r\n dedupKey: sessionId, // one row per session → session id is the dedup key\r\n confidence: \"host-reported\",\r\n };\r\n records.push(record);\r\n }\r\n\r\n return records;\r\n } finally {\r\n db.close();\r\n }\r\n },\r\n};\r\n\r\nexport default gooseReader;\r\n"],"mappings":"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","names":[]}
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  normalizeSessionSource
4
- } from "./chunk-H53QZQJI.js";
4
+ } from "./chunk-PSGTHJQU.js";
5
5
  import {
6
6
  resolveEnvRefsDeep
7
- } from "./chunk-BEFVJ2OE.js";
7
+ } from "./chunk-XXLCMSD3.js";
8
8
  import {
9
9
  BaseAdapter
10
- } from "./chunk-MGTDQLJJ.js";
10
+ } from "./chunk-UNU2KPYJ.js";
11
11
  import {
12
12
  buildWrappedStdio,
13
13
  isHomeBinHookCommand
14
- } from "./chunk-4NHXLXSD.js";
15
- import "./chunk-UMQ6NBQR.js";
16
- import "./chunk-GZGLCCEE.js";
14
+ } from "./chunk-W7AGWAMH.js";
15
+ import "./chunk-ILWHLGIC.js";
16
+ import "./chunk-QYOUQCC6.js";
17
17
 
18
18
  // src/adapters/grok-cli/index.ts
19
19
  import { existsSync } from "fs";
@@ -479,4 +479,4 @@ export {
479
479
  adapter,
480
480
  grok_cli_default as default
481
481
  };
482
- //# sourceMappingURL=grok-cli-QYQPDSVB.js.map
482
+ //# sourceMappingURL=grok-cli-LX6Q6RUY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/grok-cli/index.ts"],"sourcesContent":["/**\r\n * adapters/grok-cli — Grok CLI (the community superagent-ai/grok-cli, npm\r\n * `grok-dev`, bin `grok`, MIT) platform adapter for agent-connector.\r\n *\r\n * Disambiguation: id is `grok-cli` (NOT `grok`) to keep it distinct from xAI's\r\n * separate \"Grok Build\" product. This adapter targets the OPEN-SOURCE community\r\n * CLI only — byte-confirmed against its source on 2026-06-21:\r\n * - package.json → name \"grok-dev\", bin { \"grok\": \"dist/index.js\" }, MIT.\r\n * - src/utils/settings.ts → USER settings at ~/.grok/user-settings.json\r\n * (USER_SETTINGS_PATH = join(homedir(), \".grok\", \"user-settings.json\")).\r\n *\r\n * Grok CLI is a **json-stdio** host. Its native surfaces are USER-SCOPE ONLY and\r\n * BOTH live in the SAME file (~/.grok/user-settings.json):\r\n *\r\n * 1. MCP servers — under the NESTED key `mcp.servers`, which is a JSON **ARRAY**\r\n * of McpServerConfig objects (NOT a top-level `mcpServers` keyed object map —\r\n * the README's casual \"(mcpServers)\" wording is misleading; the source reads\r\n * `loadUserSettings().mcp?.servers`). Each entry:\r\n * { id, label, enabled, transport: \"stdio\"|\"http\"|\"sse\",\r\n * url?, headers?, command?, args?, env?, cwd? }\r\n * (src/utils/settings.ts `McpServerConfig`). We key entries on `id` =\r\n * connector id (mirrors continue's array-by-name merge, but JSON not YAML).\r\n * Project `.grok/settings.json` holds ONLY { model, sandboxMode, sandbox,\r\n * lsp } — NO mcp, NO hooks — so this adapter is user-scope.\r\n *\r\n * 2. Hooks — under the top-level `hooks` key (Claude NESTED-rule shape:\r\n * { hooks: { <Event>: [ { matcher?, hooks:[{ type:\"command\", command,\r\n * timeout? }] } ] } }), loaded from user-settings.json ONLY (project-level\r\n * hooks are DELIBERATELY excluded by Grok for security — a committed repo\r\n * file must not execute unsandboxed host commands). So `hooks` is wired\r\n * through the SAME shared object-map hook-merge engine droid/claude use.\r\n *\r\n * Supported hook events (byte-confirmed src/hooks/types.ts HOOK_EVENTS): the\r\n * Grok set is a SUPERSET of our canonical names plus host-specific ones. We wire\r\n * the canonical events Grok fires (PascalCase, 1:1): PreToolUse, PostToolUse,\r\n * PostToolUseFailure, UserPromptSubmit, SessionStart, SessionEnd, Stop,\r\n * SubagentStart, SubagentStop, PreCompact, PostCompact, Notification. Grok also\r\n * fires StopFailure, TaskCreated, TaskCompleted, InstructionsLoaded, CwdChanged\r\n * (no canonical analog — they ride the nativeHooks passthrough) and has no\r\n * PermissionRequest event (warn/skip at install).\r\n *\r\n * Stdin wire field names DIFFER from Claude's in two false-friend spots\r\n * (byte-confirmed src/hooks/types.ts): UserPromptSubmit carries `user_prompt`\r\n * (NOT `prompt`), and PostToolUse carries `tool_output` (NOT `tool_response`).\r\n * PostToolUseFailure/StopFailure carry `error` (string); SubagentStart/Stop carry\r\n * `agent_type` + `description`; SessionStart carries `source`; PreCompact/\r\n * PostCompact carry `trigger`; Notification carries `message`. `session_id` is\r\n * optional; `cwd` is always present.\r\n *\r\n * Reply protocol (byte-confirmed src/hooks/executor.ts aggregateHookResults):\r\n * stdout is parsed as JSON when it starts with `{`. A hook BLOCKS via either\r\n * exit code 2 OR a stdout `{ \"decision\": \"block\" }`; `{ \"decision\": \"approve\" }`\r\n * explicitly approves; `additionalContext` is injected as context; `continue:\r\n * false` + `stopReason` prevents continuation. We emit exit 0 + a structured\r\n * stdout object (so the JSON is always parsed): deny → {decision:\"block\",reason};\r\n * context → {additionalContext}. Grok has no \"ask\"/\"modify\" reply path — those\r\n * degrade to a plain exit-0 passthrough (canModifyArgs/Output stay false).\r\n *\r\n * Env handling: Grok documents no native ${VAR} server interpolation, so env/\r\n * header/url refs resolve to literals at install time via resolveEnvRefsDeep\r\n * (the safe default matching continue/droid).\r\n */\r\n\r\nimport { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\n\r\nimport { BaseAdapter, type HookMergeDescriptor } from \"../base.js\";\r\nimport type { Adapter, HookReply, InstallContext, NormalizedEvent } from \"../spi.js\";\r\nimport type {\r\n ChangeRecord,\r\n DetectedPlatform,\r\n HealthCheck,\r\n HookEventName,\r\n HookParadigm,\r\n HookResponse,\r\n NotificationEvent,\r\n PlatformCapabilities,\r\n PlatformId,\r\n PostCompactEvent,\r\n PostToolUseEvent,\r\n PostToolUseFailureEvent,\r\n PreCompactEvent,\r\n PreToolUseEvent,\r\n ServerDef,\r\n SessionEndEvent,\r\n SessionStartEvent,\r\n StopEvent,\r\n SubagentStartEvent,\r\n SubagentStopEvent,\r\n Transport,\r\n UserPromptSubmitEvent,\r\n} from \"../../core/types.js\";\r\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\r\nimport { buildWrappedStdio, isHomeBinHookCommand } from \"../../core/spawn.js\";\r\nimport { normalizeSessionSource } from \"../claude-code/wire.js\";\r\n\r\nconst HOST: PlatformId = \"grok-cli\";\r\n\r\n/**\r\n * Canonical events Grok fires (PascalCase, 1:1 with our names). PermissionRequest\r\n * is absent from Grok's HOOK_EVENTS, so it warn/skips at install. The host-only\r\n * events (StopFailure, TaskCreated, TaskCompleted, InstructionsLoaded, CwdChanged)\r\n * have no canonical analog and ride the nativeHooks passthrough.\r\n */\r\nconst SUPPORTED_EVENTS: ReadonlySet<HookEventName> = new Set<HookEventName>([\r\n \"PreToolUse\",\r\n \"PostToolUse\",\r\n \"PostToolUseFailure\",\r\n \"UserPromptSubmit\",\r\n \"SessionStart\",\r\n \"SessionEnd\",\r\n \"Stop\",\r\n \"SubagentStart\",\r\n \"SubagentStop\",\r\n \"PreCompact\",\r\n \"PostCompact\",\r\n \"Notification\",\r\n]);\r\n\r\n/**\r\n * Native MCP server entry shape (src/utils/settings.ts `McpServerConfig`). The\r\n * array lives at `mcp.servers`. `id`/`label`/`enabled`/`transport` are required;\r\n * stdio carries command/args/env/cwd, remote carries url/headers.\r\n */\r\ninterface GrokMcpServer {\r\n id: string;\r\n label: string;\r\n enabled: boolean;\r\n transport: Transport;\r\n url?: string;\r\n headers?: Record<string, string>;\r\n command?: string;\r\n args?: string[];\r\n env?: Record<string, string>;\r\n cwd?: string;\r\n}\r\n\r\n/** The shape of user-settings.json (only the parts this adapter touches). */\r\ninterface GrokUserSettings {\r\n mcp?: { servers?: GrokMcpServer[] };\r\n hooks?: Record<string, GrokHookEntry[]>;\r\n [key: string]: unknown;\r\n}\r\n\r\n/** A single Grok native hook registration entry (Claude-shaped, nested). */\r\ninterface GrokHookEntry {\r\n matcher?: string;\r\n hooks: Array<{ type: \"command\"; command: string; timeout?: number }>;\r\n}\r\n\r\n/** Raw Grok CLI hook stdin payload (snake_case; field names per src/hooks/types.ts). */\r\ninterface GrokWireInput {\r\n hook_event_name?: string;\r\n session_id?: string;\r\n cwd?: string;\r\n tool_name?: string;\r\n tool_input?: Record<string, unknown>;\r\n /** PostToolUse — NOTE Grok sends `tool_output` (NOT Claude's `tool_response`). */\r\n tool_output?: unknown;\r\n /** PostToolUseFailure / StopFailure — the captured error message (string). */\r\n error?: unknown;\r\n /** UserPromptSubmit — NOTE Grok sends `user_prompt` (NOT Claude's `prompt`). */\r\n user_prompt?: unknown;\r\n /** SessionStart — startup | resume | clear. */\r\n source?: string;\r\n /** PreCompact / PostCompact — auto | manual. */\r\n trigger?: \"auto\" | \"manual\";\r\n /** Notification — the user-facing message. */\r\n message?: unknown;\r\n /** SubagentStart / SubagentStop / TaskCreated / TaskCompleted. */\r\n agent_type?: unknown;\r\n description?: unknown;\r\n /** Injected by the entrypoint so the runtime knows which connector to dispatch. */\r\n connector?: unknown;\r\n}\r\n\r\nexport class GrokCliAdapter extends BaseAdapter implements Adapter {\r\n readonly id: PlatformId = HOST;\r\n readonly name = \"Grok CLI\";\r\n readonly paradigm: HookParadigm = \"json-stdio\";\r\n\r\n readonly capabilities: PlatformCapabilities = {\r\n // Memory surface: Grok reads AGENTS.md (\"merged from git root down to your\r\n // cwd; AGENTS.override.md wins per directory\" — README). The BaseAdapter\r\n // AGENTS.md-first default handles it.\r\n supportsMemory: true,\r\n preToolUse: true,\r\n postToolUse: true,\r\n postToolUseFailure: true,\r\n userPromptSubmit: true,\r\n sessionStart: true,\r\n sessionEnd: true,\r\n stop: true,\r\n notification: true,\r\n preCompact: true,\r\n // Grok fires PostCompact (its HOOK_EVENTS lists it beside PreCompact).\r\n postCompact: true,\r\n // Grok fires SubagentStart AND SubagentStop (both in HOOK_EVENTS).\r\n subagentStart: true,\r\n subagentStop: true,\r\n // No PermissionRequest event in Grok's HOOK_EVENTS → warn/skip at install.\r\n // Grok's reply protocol is block/approve/context only — it cannot rewrite\r\n // tool args or already-emitted output.\r\n canModifyArgs: false,\r\n canModifyOutput: false,\r\n // Grok injects `additionalContext` from a hook's stdout JSON.\r\n canInjectSessionContext: true,\r\n // Grok's settings.json hook keys are free-form event names (its HOOK_EVENTS\r\n // superset includes StopFailure/TaskCreated/TaskCompleted/InstructionsLoaded/\r\n // CwdChanged with no canonical analog), so any host event declared under\r\n // platforms[\"grok-cli\"].nativeHooks installs verbatim.\r\n supportsNativeHooks: true,\r\n // MCP entry supports stdio + remote (http / sse) per McpServerConfig.transport.\r\n transports: [\"stdio\", \"http\", \"sse\"],\r\n };\r\n\r\n // ── Detection ────────────────────────────────────────────────────────────\r\n\r\n detectInstalled(_projectDir: string): DetectedPlatform {\r\n const userDir = join(homedir(), \".grok\");\r\n const userSettings = join(userDir, \"user-settings.json\");\r\n const installed = existsSync(userDir) || existsSync(userSettings);\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n installed,\r\n paradigm: this.paradigm,\r\n capabilities: this.capabilities,\r\n // MCP + hooks both live in user-settings.json (user scope only).\r\n configPath: userSettings,\r\n scope: \"user\",\r\n reason: installed\r\n ? `found Grok CLI config at ${userSettings}`\r\n : `no Grok CLI config at ${userDir}`,\r\n confidence: installed ? \"high\" : \"low\",\r\n };\r\n }\r\n\r\n // ── Native paths ───────────────────────────────────────────────────────────\r\n // BOTH MCP servers (mcp.servers array) and hooks (top-level hooks map) live in\r\n // the SAME user-settings.json. Project .grok/settings.json holds neither, so\r\n // every scope resolves to the user file.\r\n\r\n getConfigDir(_ctx: InstallContext): string {\r\n return join(homedir(), \".grok\");\r\n }\r\n\r\n getServerConfigPath(ctx: InstallContext): string {\r\n return join(this.getConfigDir(ctx), \"user-settings.json\");\r\n }\r\n\r\n getHookConfigPath(ctx: InstallContext): string {\r\n return join(this.getConfigDir(ctx), \"user-settings.json\");\r\n }\r\n\r\n // ── MCP server install / uninstall (JSON — nested mcp.servers ARRAY) ───────\r\n\r\n installServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n const path = this.getServerConfigPath(ctx);\r\n const override = connector.platforms[HOST]?.server;\r\n if (!connector.server || override === false) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: connector.server\r\n ? \"server registration disabled for grok-cli\"\r\n : \"connector declares no MCP server\",\r\n },\r\n ];\r\n }\r\n\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n // Shallow-merge any per-platform server override into the base ServerDef.\r\n const server: ServerDef =\r\n override && typeof override === \"object\"\r\n ? { ...connector.server, ...override }\r\n : connector.server;\r\n const entry = this.renderServerEntry(ctx, server);\r\n\r\n // OVERWRITE GUARD: never round-trip a present-but-unparseable file into `{}`.\r\n if (this.isPresentButUnparseable(path)) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n path,\r\n detail: `existing ${path} is not parseable; left untouched (back it up / fix it, then re-run)`,\r\n },\r\n ];\r\n }\r\n const cfg = this.readJson<GrokUserSettings>(path) ?? {};\r\n\r\n // NEVER clobber a malformed mcp.servers: if `mcp` exists but is not an object,\r\n // or `mcp.servers` exists but is not an array, WARN + write nothing (leave the\r\n // user's hand-edited value) rather than silently replacing it.\r\n const existingMcp = cfg.mcp;\r\n if (existingMcp !== undefined && (typeof existingMcp !== \"object\" || Array.isArray(existingMcp))) {\r\n return [{ platform: this.id, action: \"warn\", path, detail: \"mcp is not an object — left untouched (manual fix needed)\" }];\r\n }\r\n const existingServers = existingMcp?.servers;\r\n if (existingServers !== undefined && !Array.isArray(existingServers)) {\r\n return [{ platform: this.id, action: \"warn\", path, detail: \"mcp.servers is not an array — left untouched (manual fix needed)\" }];\r\n }\r\n\r\n const list: GrokMcpServer[] = Array.isArray(existingServers) ? [...existingServers] : [];\r\n const idx = list.findIndex((e) => e?.id === connector.id);\r\n\r\n let action: ChangeRecord[\"action\"];\r\n if (idx < 0) {\r\n list.push(entry);\r\n action = \"create\";\r\n } else if (JSON.stringify(list[idx]) === JSON.stringify(entry)) {\r\n action = \"skip\";\r\n } else {\r\n list[idx] = entry;\r\n action = \"update\";\r\n }\r\n\r\n if (action !== \"skip\") {\r\n cfg.mcp = { ...(existingMcp ?? {}), servers: list };\r\n this.writeJson(path, cfg, dryRun);\r\n }\r\n return [{ platform: this.id, action, path, detail: `mcp.servers[id=${connector.id}]` }];\r\n }\r\n\r\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n const path = this.getServerConfigPath(ctx);\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n const cfg = this.readJson<GrokUserSettings>(path);\r\n const rawList = cfg?.mcp?.servers;\r\n if (!cfg || !Array.isArray(rawList)) {\r\n return [{ platform: this.id, action: \"skip\", path, detail: `mcp.servers[id=${connector.id}] absent` }];\r\n }\r\n\r\n const list = rawList as GrokMcpServer[];\r\n const kept = list.filter((e) => e?.id !== connector.id);\r\n if (kept.length === list.length) {\r\n return [{ platform: this.id, action: \"skip\", path, detail: `mcp.servers[id=${connector.id}] absent` }];\r\n }\r\n\r\n cfg.mcp = { ...cfg.mcp, servers: kept };\r\n this.writeJson(path, cfg, dryRun);\r\n return [{ platform: this.id, action: \"remove\", path, detail: `mcp.servers[id=${connector.id}]` }];\r\n }\r\n\r\n /** Render a normalized ServerDef into Grok's native McpServerConfig entry. */\r\n private renderServerEntry(ctx: InstallContext, server: ServerDef): GrokMcpServer {\r\n const transport: Transport = server.transport;\r\n const enabled = server.enabled !== false;\r\n const id = ctx.connector.id;\r\n // `label` is a required display field; reuse the connector displayName.\r\n const label = ctx.connector.displayName?.trim() || id;\r\n\r\n if (transport === \"stdio\") {\r\n let command = server.command ?? \"\";\r\n let args = [...(server.args ?? [])];\r\n\r\n // Transparent telemetry wrapping: route the real command through\r\n // `<homeBin> serve --connector <id> -- <command> <args...>`.\r\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\r\n\r\n const entry: GrokMcpServer = {\r\n id,\r\n label,\r\n enabled,\r\n transport: \"stdio\",\r\n command: resolveEnvRefsDeep(command),\r\n };\r\n if (args.length > 0) entry.args = resolveEnvRefsDeep(args);\r\n const env = this.renderEnv(server.env);\r\n if (env) entry.env = env;\r\n if (typeof server.cwd === \"string\" && server.cwd.length > 0) {\r\n entry.cwd = resolveEnvRefsDeep(server.cwd);\r\n }\r\n return entry;\r\n }\r\n\r\n // Remote (http / sse) — Grok registers a URL (+ optional headers). `ws` has no\r\n // Grok analog; fall back to http (the closest remote shape Grok validates).\r\n const entry: GrokMcpServer = {\r\n id,\r\n label,\r\n enabled,\r\n transport: transport === \"sse\" ? \"sse\" : \"http\",\r\n url: resolveEnvRefsDeep(server.url ?? \"\"),\r\n };\r\n const headers = this.renderEnv(server.headers);\r\n if (headers) entry.headers = headers;\r\n return entry;\r\n }\r\n\r\n /**\r\n * Render env/header values. Grok documents no native ${VAR} server\r\n * interpolation, so resolve `${env:VAR}` references to literals at install\r\n * time (the safe path; matches continue/droid).\r\n */\r\n private renderEnv(\r\n env: Record<string, string> | undefined,\r\n ): Record<string, string> | undefined {\r\n if (!env || Object.keys(env).length === 0) return undefined;\r\n return resolveEnvRefsDeep({ ...env });\r\n }\r\n\r\n // ── Hook install / uninstall (top-level hooks, Claude nested-rule shape) ───\r\n\r\n installHooks(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n const override = connector.platforms[HOST];\r\n\r\n // `hooks: false` disables only the NORMALIZED hooks; nativeHooks is a\r\n // sibling grok-cli-scoped declaration that installs regardless.\r\n const normalizedEvents = override?.hooks === false ? [] : connector.hookEvents;\r\n const nativeHooks = override?.nativeHooks ?? {};\r\n const nativeEvents = Object.keys(nativeHooks);\r\n\r\n if (normalizedEvents.length === 0 && nativeEvents.length === 0) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n detail:\r\n override?.hooks === false\r\n ? \"hooks disabled for grok-cli\"\r\n : \"connector declares no hooks\",\r\n },\r\n ];\r\n }\r\n\r\n const pending = normalizedEvents.map((event) => ({\r\n event: event as string,\r\n matcher: connector.hooks[event]?.matcher ?? \"\",\r\n }));\r\n const native = nativeEvents.map((event) => ({\r\n event,\r\n matcher: nativeHooks[event]?.matcher ?? \"\",\r\n }));\r\n\r\n return this.upsertHookEntries(\r\n ctx,\r\n this.getHookConfigPath(ctx),\r\n pending,\r\n this.hookDescriptor(ctx),\r\n native,\r\n );\r\n }\r\n\r\n uninstallHooks(ctx: InstallContext): ChangeRecord[] {\r\n return this.removeHookEntries(ctx, this.getHookConfigPath(ctx), this.hookDescriptor(ctx));\r\n }\r\n\r\n /**\r\n * Grok's hook-merge descriptor (NESTED shape `{ matcher?, hooks: [...] }`).\r\n * Connector-generic ownership (any of our home-bin commands in the inner\r\n * `hooks`), matching droid:\r\n * - mapEvent drops events outside SUPPORTED_EVENTS (Grok has no\r\n * PermissionRequest); supported events map 1:1 (PascalCase identical);\r\n * - the native pass installs free-form host-only event keys verbatim;\r\n * - uninstall = inner-strip ONLY (ownsEntryForRemove never-true).\r\n */\r\n private hookDescriptor(ctx: InstallContext): HookMergeDescriptor<GrokHookEntry> {\r\n const stripInner = (c: InstallContext) => (entry: GrokHookEntry) => {\r\n const innerBefore = entry.hooks?.length ?? 0;\r\n const inner = (entry.hooks ?? []).filter((h) => !this.isOurCommand(h.command, c));\r\n return {\r\n next: inner.length > 0 ? { matcher: entry.matcher ?? \"\", hooks: inner } : null,\r\n removed: innerBefore - inner.length,\r\n };\r\n };\r\n return {\r\n mapEvent: (e) => (SUPPORTED_EVENTS.has(e as HookEventName) ? e : undefined),\r\n unmappedWarnDetail: (e) => `${e} has no Grok CLI hook equivalent — skipped`,\r\n renderEntry: (_event, matcher, command) => ({\r\n matcher,\r\n hooks: [{ type: \"command\", command }],\r\n }),\r\n entryOwnsCommand: (entry, _command) =>\r\n (entry.hooks ?? []).some((h) => this.isOurCommand(h.command, ctx)),\r\n nativeOwnsCommand: (entry, command) =>\r\n (entry.hooks ?? []).some((h) => h.command === command),\r\n ownsEntryForRemove: () => () => false,\r\n stripInner,\r\n skipDetail: (event) => `hooks.${event} already registered`,\r\n removeDetail: (event, removed) => `hooks.${event} (${removed})`,\r\n nativeSkipDetail: (event) => `hooks.${event} already registered (native)`,\r\n nativeMutateDetail: (event) => `hooks.${event} (native)`,\r\n absentDetail: \"no hooks section present\",\r\n noMatchDetail: \"no matching hook entries\",\r\n };\r\n }\r\n\r\n /** True when a hook command references our home binary AND this connector id. */\r\n private isOurCommand(command: string | undefined, ctx: InstallContext): boolean {\r\n return isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id);\r\n }\r\n\r\n // ── Diagnostics ──────────────────────────────────────────────────────────\r\n\r\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\r\n const path = this.getServerConfigPath(ctx);\r\n const connectorId = ctx.connector.id;\r\n const homeBin = ctx.homeBinPath;\r\n const hookEvents = ctx.connector.hookEvents;\r\n return [\r\n {\r\n name: `${this.name}: user-settings.json present`,\r\n check: () =>\r\n existsSync(path)\r\n ? { status: \"OK\", detail: path }\r\n : { status: \"FAIL\", detail: `not found: ${path}` },\r\n },\r\n {\r\n name: `${this.name}: server entry registered`,\r\n check: () => {\r\n if (!ctx.connector.server) {\r\n return { status: \"OK\", detail: \"no MCP server declared\" };\r\n }\r\n const cfg = this.readJson<GrokUserSettings>(path);\r\n const list = cfg?.mcp?.servers;\r\n if (!cfg || !Array.isArray(list)) {\r\n return { status: \"FAIL\", detail: `no mcp.servers array in ${path}` };\r\n }\r\n return list.some((e) => e?.id === connectorId)\r\n ? { status: \"OK\", detail: `mcp.servers[id=${connectorId}] present` }\r\n : { status: \"FAIL\", detail: `no mcp.servers[id=${connectorId}] in ${path}` };\r\n },\r\n },\r\n {\r\n name: `${this.name}: hook command registered`,\r\n check: () => {\r\n if (hookEvents.length === 0) {\r\n return { status: \"OK\", detail: \"no hooks declared\" };\r\n }\r\n const cfg = this.readJson<GrokUserSettings>(path);\r\n const hooks = cfg?.hooks ?? {};\r\n const registered = Object.values(hooks).some((entries) =>\r\n (entries ?? []).some((e) =>\r\n (e.hooks ?? []).some((h) => isHomeBinHookCommand(h.command, homeBin, connectorId)),\r\n ),\r\n );\r\n return registered\r\n ? { status: \"OK\", detail: \"hook command present\" }\r\n : { status: \"FAIL\", detail: `no hook for ${connectorId} in ${path}` };\r\n },\r\n },\r\n ];\r\n }\r\n\r\n // ── Runtime: parse Grok stdin JSON → normalized event ──────────────────────\r\n\r\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\r\n const input = (raw ?? {}) as GrokWireInput;\r\n const connectorId = typeof input.connector === \"string\" ? input.connector : \"\";\r\n const sessionId = typeof input.session_id === \"string\" ? input.session_id : \"\";\r\n const projectDir = typeof input.cwd === \"string\" ? input.cwd : undefined;\r\n\r\n const base = {\r\n hostPlatform: HOST,\r\n connectorId,\r\n sessionId,\r\n raw,\r\n ...(projectDir !== undefined ? { projectDir } : {}),\r\n } as const;\r\n\r\n switch (event) {\r\n case \"PreToolUse\": {\r\n const ev: PreToolUseEvent = {\r\n ...base,\r\n toolName: typeof input.tool_name === \"string\" ? input.tool_name : \"\",\r\n toolInput: input.tool_input ?? {},\r\n };\r\n return ev;\r\n }\r\n case \"PostToolUse\": {\r\n // Grok sends `tool_output` (NOT Claude's `tool_response`).\r\n const ev: PostToolUseEvent = {\r\n ...base,\r\n toolName: typeof input.tool_name === \"string\" ? input.tool_name : \"\",\r\n toolInput: input.tool_input ?? {},\r\n ...(toolOutputToString(input.tool_output) !== undefined\r\n ? { toolOutput: toolOutputToString(input.tool_output) }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n case \"PostToolUseFailure\": {\r\n const ev: PostToolUseFailureEvent = {\r\n ...base,\r\n toolName: typeof input.tool_name === \"string\" ? input.tool_name : \"\",\r\n toolInput: input.tool_input ?? {},\r\n error: typeof input.error === \"string\" ? input.error : \"\",\r\n };\r\n return ev;\r\n }\r\n case \"UserPromptSubmit\": {\r\n // Grok sends `user_prompt` (NOT Claude's `prompt`).\r\n const ev: UserPromptSubmitEvent = {\r\n ...base,\r\n prompt: typeof input.user_prompt === \"string\" ? input.user_prompt : \"\",\r\n };\r\n return ev;\r\n }\r\n case \"SessionStart\": {\r\n const ev: SessionStartEvent = {\r\n ...base,\r\n source: normalizeSessionSource(input.source),\r\n };\r\n return ev;\r\n }\r\n case \"SessionEnd\": {\r\n const ev: SessionEndEvent = { ...base };\r\n return ev;\r\n }\r\n case \"Stop\": {\r\n const ev: StopEvent = { ...base };\r\n return ev;\r\n }\r\n case \"Notification\": {\r\n const ev: NotificationEvent = {\r\n ...base,\r\n message: typeof input.message === \"string\" ? input.message : \"\",\r\n };\r\n return ev;\r\n }\r\n case \"PreCompact\": {\r\n const ev: PreCompactEvent = {\r\n ...base,\r\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\r\n ? { trigger: input.trigger }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n case \"PostCompact\": {\r\n const ev: PostCompactEvent = {\r\n ...base,\r\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\r\n ? { trigger: input.trigger }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n case \"SubagentStart\": {\r\n const ev: SubagentStartEvent = {\r\n ...base,\r\n ...(typeof input.agent_type === \"string\" ? { agentType: input.agent_type } : {}),\r\n };\r\n return ev;\r\n }\r\n case \"SubagentStop\": {\r\n const ev: SubagentStopEvent = {\r\n ...base,\r\n ...(typeof input.agent_type === \"string\" ? { agentType: input.agent_type } : {}),\r\n };\r\n return ev;\r\n }\r\n default: {\r\n // Grok never delivers PermissionRequest (no native equivalent — see\r\n // SUPPORTED_EVENTS). Surface a dispatch of one loudly rather than\r\n // silently mis-parse.\r\n throw new Error(`unsupported grok-cli hook event: ${String(event)}`);\r\n }\r\n }\r\n }\r\n\r\n // ── Runtime: normalized response → Grok native hook reply ──────────────────\r\n // Grok parses stdout as JSON when it starts with `{` and aggregates:\r\n // decision:\"block\" (or exit 2) → block; decision:\"approve\" → approve;\r\n // additionalContext → injected context; continue:false + stopReason → halt.\r\n // We emit exit 0 + a structured stdout object so the JSON is always parsed.\r\n\r\n formatReply(_event: HookEventName, response: HookResponse): HookReply {\r\n const decision = response.decision ?? \"allow\";\r\n\r\n // deny → block the action with a reason (decision:\"block\").\r\n if (decision === \"deny\") {\r\n return this.stdout({ decision: \"block\", reason: response.reason ?? \"Blocked by hook\" });\r\n }\r\n\r\n // context → inject soft guidance (Grok honors additionalContext).\r\n if (decision === \"context\" && response.additionalContext) {\r\n return this.stdout({ additionalContext: response.additionalContext });\r\n }\r\n\r\n // allow / modify (unsupported) / ask (no Grok analog) / void → passthrough.\r\n return { exitCode: 0 };\r\n }\r\n\r\n private stdout(payload: unknown): HookReply {\r\n return { exitCode: 0, stdout: JSON.stringify(payload) };\r\n }\r\n}\r\n\r\n/** Coerce a Grok PostToolUse `tool_output` into a string for the normalized event. */\r\nfunction toolOutputToString(value: unknown): string | undefined {\r\n if (value == null) return undefined;\r\n if (typeof value === \"string\") return value;\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n}\r\n\r\nexport const adapter = new GrokCliAdapter();\r\nexport default adapter;\r\n"],"mappings":"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","names":["entry"]}
@@ -3,24 +3,24 @@ import {
3
3
  readYaml,
4
4
  writeYaml,
5
5
  yamlObjectMapCodec
6
- } from "./chunk-FJCUKXGX.js";
6
+ } from "./chunk-THI4PI4H.js";
7
7
  import {
8
8
  resolveEnvRefsDeep
9
- } from "./chunk-BEFVJ2OE.js";
9
+ } from "./chunk-XXLCMSD3.js";
10
10
  import {
11
11
  BaseAdapter,
12
12
  removeFromObjectMap,
13
13
  renderSkillMd,
14
14
  upsertInObjectMap
15
- } from "./chunk-MGTDQLJJ.js";
15
+ } from "./chunk-UNU2KPYJ.js";
16
16
  import {
17
17
  buildHomeBinHookCommand,
18
18
  buildWrappedStdio,
19
19
  isHomeBinActionCommand,
20
20
  isHomeBinHookCommand
21
- } from "./chunk-4NHXLXSD.js";
22
- import "./chunk-UMQ6NBQR.js";
23
- import "./chunk-GZGLCCEE.js";
21
+ } from "./chunk-W7AGWAMH.js";
22
+ import "./chunk-ILWHLGIC.js";
23
+ import "./chunk-QYOUQCC6.js";
24
24
 
25
25
  // src/adapters/hermes/index.ts
26
26
  import { existsSync, statSync } from "fs";
@@ -836,4 +836,4 @@ export {
836
836
  adapter,
837
837
  hermes_default as default
838
838
  };
839
- //# sourceMappingURL=hermes-F75OSK3Y.js.map
839
+ //# sourceMappingURL=hermes-LJB3SJKB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/hermes/index.ts"],"sourcesContent":["/**\r\n * adapters/hermes — Hermes Agent platform adapter for agent-connector.\r\n *\r\n * Hermes is a json-stdio host whose ENTIRE configuration — both the MCP servers\r\n * and the lifecycle hooks — lives in a single user-scope YAML file:\r\n *\r\n * ~/.hermes/config.yaml\r\n *\r\n * Because the file is YAML, the BaseAdapter JSON helpers do not apply; this\r\n * adapter merges via core/yaml's readYaml/writeYaml, preserving any unrelated\r\n * config the user has authored.\r\n *\r\n * - MCP servers: top-level snake_case root key `mcp_servers`. The stdio entry\r\n * uses the portable field names { command, args, env } (unlike Goose's\r\n * cmd/envs). Hermes has no native env interpolation, so `${env:VAR}` refs are\r\n * resolved to literals at install time.\r\n *\r\n * - Hooks: a top-level `hooks` map keyed by Hermes' NATIVE snake_case event\r\n * names (pre_tool_call / post_tool_call / on_session_start / on_session_end /\r\n * subagent_stop — NOT the canonical PascalCase names; see EVENT_TO_HERMES).\r\n * Each value is a\r\n * list of shell-hook entries { matcher, command:\"<homeBin> hook …\", timeout }.\r\n * The command keeps the canonical event token so the runtime dispatcher\r\n * (parseEvent/formatReply) stays consistent. Hermes shell hooks pipe the\r\n * event JSON to the command on stdin and read the reply JSON from stdout —\r\n * the same wire protocol as Claude Code, so the runtime parse/format mirror\r\n * the Claude adapter (a Claude-like JSON shape; the exact Hermes field map is\r\n * documented inline where it could vary).\r\n *\r\n * Since hooks are external shell commands (not an in-process plugin), Hermes\r\n * cannot let a hook rewrite tool arguments — canModifyArgs is false. Hermes has\r\n * no SSE transport, so only stdio + http are advertised.\r\n */\r\n\r\nimport { existsSync, statSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { dirname, join } from \"node:path\";\r\n\r\nimport { BaseAdapter } from \"../base.js\";\r\nimport type { Adapter, HookReply, InstallContext, MemoryTarget, NormalizedEvent } from \"../spi.js\";\r\nimport type {\r\n ChangeRecord,\r\n DetectedPlatform,\r\n HealthCheck,\r\n HookEventName,\r\n HookParadigm,\r\n HookResponse,\r\n NotificationEvent,\r\n PlatformCapabilities,\r\n PlatformId,\r\n PostToolUseEvent,\r\n PostCompactEvent,\r\n PreCompactEvent,\r\n PreToolUseEvent,\r\n SessionEndEvent,\r\n SessionStartEvent,\r\n ServerDef,\r\n StopEvent,\r\n SubagentStopEvent,\r\n UserPromptSubmitEvent,\r\n} from \"../../core/types.js\";\r\nimport { removeFromObjectMap, upsertInObjectMap } from \"../../core/object-map.js\";\r\nimport { readYaml, writeYaml, yamlObjectMapCodec } from \"../../core/yaml.js\";\r\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\r\nimport {\r\n buildHomeBinHookCommand,\r\n buildWrappedStdio,\r\n isHomeBinActionCommand,\r\n isHomeBinHookCommand,\r\n} from \"../../core/spawn.js\";\r\nimport { renderSkillMd } from \"../claude-code/render.js\";\r\n\r\nconst HOST: PlatformId = \"hermes\";\r\n/** Root key under which Hermes stores MCP servers in config.yaml (snake_case). */\r\nconst MCP_ROOT_KEY = \"mcp_servers\";\r\n/** Top-level key under which Hermes stores shell hooks in config.yaml. */\r\nconst HOOKS_KEY = \"hooks\";\r\n/**\r\n * Top-level map under which Hermes stores `/<id>` slash commands. A\r\n * `{ type: \"exec\", command }` entry runs the shell command directly, bypassing\r\n * the LLM — the action emitter's target.\r\n */\r\nconst QUICK_COMMANDS_KEY = \"quick_commands\";\r\n/** Default per-hook timeout (seconds) when the connector declares none. */\r\nconst DEFAULT_HOOK_TIMEOUT = 60;\r\n/**\r\n * Documented per-hook timeout bounds (seconds). Hermes' hooks.md states\r\n * `timeout: <seconds>` is \"default 60, capped at 300\" and that `timeout > 300`\r\n * is clamped with a warning by the host. There is no documented minimum; the\r\n * 1s floor is defensive so a sub-second connector timeoutMs never rounds to 0.\r\n */\r\nconst HOOK_TIMEOUT_MAX = 300;\r\nconst HOOK_TIMEOUT_MIN = 1;\r\n\r\n/** One Hermes quick-command entry (a `/<id>` slash command). */\r\ninterface HermesQuickCommand {\r\n type: \"exec\";\r\n command: string;\r\n}\r\n\r\n/**\r\n * Canonical → Hermes native hook event name. Hermes keys its `hooks:` block by\r\n * its OWN snake_case lifecycle names (pre_tool_call / post_tool_call /\r\n * on_session_start / on_session_end — see docs/research/platform-research.json),\r\n * NOT the canonical PascalCase names. A connector event is only wired when it\r\n * appears here AND is declared by the connector; everything else is reported as\r\n * a warn/skip at install time.\r\n */\r\nconst EVENT_TO_HERMES: Partial<Record<HookEventName, string>> = {\r\n PreToolUse: \"pre_tool_call\",\r\n PostToolUse: \"post_tool_call\",\r\n SessionStart: \"on_session_start\",\r\n SessionEnd: \"on_session_end\",\r\n // Hermes is a STOP-ONLY subagent host: subagent_stop fires when a\r\n // delegate_task child exits (child_status ∈ completed/failed/interrupted/\r\n // error); there is NO subagent_start analog. PermissionRequest is also\r\n // deliberately ABSENT: Hermes' pre_approval_request/post_approval_response\r\n // hooks OBSERVE the approval prompt but carry no decision control, so a\r\n // PermissionRequest handler could never be honored — install skip-warns it.\r\n SubagentStop: \"subagent_stop\",\r\n};\r\n\r\n/** Hermes stdio MCP entry — portable field names (command/args/env). */\r\ninterface HermesStdioServer {\r\n command: string;\r\n args?: string[];\r\n env?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Hermes remote HTTP MCP entry — `{ url, headers? }` under the SAME mcp_servers\r\n * key (no transport/type discriminator). Per the Hermes Agent docs\r\n * (website/docs/user-guide/features/mcp.md \"HTTP servers\"); OAuth servers add\r\n * `auth: oauth`, which AC's static-header model does not express.\r\n */\r\ninterface HermesHttpServer {\r\n url: string;\r\n headers?: Record<string, string>;\r\n}\r\n\r\n/** One Hermes shell-hook entry. */\r\ninterface HermesHookEntry {\r\n /** Tool-name matcher (empty = all). Tool events only; \"\" elsewhere. */\r\n matcher: string;\r\n /** The home-bin hook command Hermes invokes (event JSON on stdin). */\r\n command: string;\r\n /** Hook timeout in seconds. */\r\n timeout: number;\r\n}\r\n\r\n/**\r\n * Raw Hermes hook stdin payload — the ACTUAL wire shape emitted by Hermes'\r\n * `agent/shell_hooks.py::_serialize_payload` (NousResearch/hermes-agent), NOT a\r\n * Claude-like guess. The serializer keeps ONLY these top-level keys:\r\n *\r\n * { hook_event_name, tool_name, tool_input, session_id, cwd, extra }\r\n *\r\n * where `tool_name`/`tool_input` come from the invoke kwargs `tool_name`/`args`,\r\n * `session_id` from `session_id` ?? `parent_session_id`, and EVERY other kwarg\r\n * is nested under `extra` (see `_TOP_LEVEL_PAYLOAD_KEYS` = {tool_name, args,\r\n * session_id, parent_session_id}). So all per-event result/status/child fields\r\n * are read from `extra.*` — top-level reads for them are always undefined.\r\n */\r\ninterface HermesWireInput {\r\n session_id?: string;\r\n cwd?: string;\r\n hook_event_name?: string;\r\n tool_name?: string;\r\n /** Top-level: the serializer lifts the `args` kwarg here (PreToolUse). */\r\n tool_input?: Record<string, unknown>;\r\n /**\r\n * Every non-allowlisted invoke kwarg nests here. Per-event contents (verified\r\n * against the host source):\r\n * - post_tool_call: result, status (\"ok\"|\"error\"), error_type, error_message,\r\n * duration_ms, task_id, tool_call_id, turn_id, api_request_id, middleware_trace\r\n * - subagent_stop: child_session_id, child_role, child_summary, child_status\r\n * (\"completed\"|\"failed\"|\"interrupted\"|\"error\"), duration_ms, parent_turn_id\r\n * - on_session_start: model, platform\r\n * - on_session_end: completed (bool), interrupted (bool), task_id, turn_id,\r\n * model, platform\r\n */\r\n extra?: HermesExtra;\r\n /** Injected by the entrypoint so the runtime knows which connector to dispatch. */\r\n connector?: string;\r\n}\r\n\r\n/** The `extra` envelope — non-allowlisted invoke kwargs, by event (see above). */\r\ninterface HermesExtra {\r\n // post_tool_call\r\n result?: unknown;\r\n status?: string;\r\n error_type?: string;\r\n error_message?: string;\r\n // subagent_stop\r\n child_session_id?: string;\r\n child_role?: string;\r\n child_summary?: string;\r\n child_status?: string;\r\n // on_session_end\r\n completed?: boolean;\r\n interrupted?: boolean;\r\n // on_session_start / on_session_end\r\n model?: string;\r\n platform?: string;\r\n // ── Defensive only ──────────────────────────────────────────────────────\r\n // Hermes does NOT fire UserPromptSubmit / PreCompact / PostCompact / Stop /\r\n // Notification (the matching capabilities are false; install warn-skips them).\r\n // Were any ever mis-routed here, the serializer would still nest its kwargs\r\n // under `extra`, so these defensive parse arms read from extra — they never\r\n // resurface as invented top-level fields.\r\n prompt?: string;\r\n trigger?: string;\r\n stop_hook_active?: boolean;\r\n message?: string;\r\n}\r\n\r\nexport class HermesAdapter extends BaseAdapter implements Adapter {\r\n readonly id: PlatformId = HOST;\r\n readonly name = \"Hermes Agent\";\r\n readonly paradigm: HookParadigm = \"json-stdio\";\r\n\r\n readonly capabilities: PlatformCapabilities = {\r\n // Memory surface: AGENTS.md-first managed block. memoryTargets below probes\r\n // for .hermes.md / HERMES.md (first context category wins on hermes —\r\n // AGENTS.md is ignored when they exist); ~/.hermes holds identity/volatile\r\n // files (SOUL.md, MEMORY.md), not a rules surface → user-scope skip-warn.\r\n supportsMemory: true,\r\n preToolUse: true,\r\n postToolUse: true,\r\n preCompact: false,\r\n // Hermes exposes on_session_start / on_session_end lifecycle hooks.\r\n sessionStart: true,\r\n sessionEnd: true,\r\n userPromptSubmit: false,\r\n stop: false,\r\n notification: false,\r\n // Newer events: Hermes ships subagent_stop (stop-only — no subagent_start\r\n // analog). permissionRequest stays unset because pre_approval_request is\r\n // observe-only (no decision control); postToolUseFailure stays unset (a\r\n // tool failure arrives merged into post_tool_call's result, not as a\r\n // dedicated event). Install reports the standard skip-warn for those.\r\n subagentStop: true,\r\n // Shell hooks cannot rewrite tool args/output in-process.\r\n canModifyArgs: false,\r\n canModifyOutput: false,\r\n canInjectSessionContext: true,\r\n // Hermes has no SSE transport.\r\n transports: [\"stdio\", \"http\"],\r\n // Content surface: Hermes auto-discovers dir-per-skill SKILL.md from its\r\n // LOCAL skills root ~/.hermes/skills — the \"single source of truth,\r\n // read-write\" dir (hermes-agent.nousresearch.com/docs/user-guide/features/\r\n // skills, fetched 2026-06-16). The directory name becomes the skill's\r\n // install slug; frontmatter is { name, description } + optional\r\n // metadata.hermes.*. USER scope only — there is no documented hermes-owned\r\n // project skills dir (~/.agents/skills is the cross-tool external dir, not\r\n // ours), so a project-scope install skip-warns via the base default.\r\n supportsSkills: true,\r\n // Native passthrough hooks: Hermes documents many host-specific lifecycle\r\n // events with NO canonical analog — pre_llm_call / post_llm_call /\r\n // on_session_finalize / on_session_reset / pre_gateway_dispatch /\r\n // pre_approval_request / post_approval_response / transform_tool_result\r\n // (docs/research/platform-research.json). They are host-specific (below the\r\n // >=3-host core bar; docs/research/host-specific-hook-events-design.md). A\r\n // connector reaches them by declaring platforms[\"hermes\"].nativeHooks;\r\n // installHooks files those event-name keys verbatim into the YAML hooks map,\r\n // and the generic uninstall reverses them.\r\n supportsNativeHooks: true,\r\n // Actions surface: Hermes ships `quick_commands.<id>: { type: \"exec\",\r\n // command }` — a `/<id>` slash command that runs the shell command directly,\r\n // bypassing the LLM (hermes-agent.nousresearch.com/docs/user-guide/cli:\r\n // \"custom commands that run shell commands instantly without invoking the\r\n // LLM\"). We emit one per declared action bound to the home-bin action verb.\r\n supportsActions: true,\r\n };\r\n\r\n // ── Detection ────────────────────────────────────────────────────────────\r\n\r\n detectInstalled(_projectDir: string): DetectedPlatform {\r\n const configPath = this.userConfigPath();\r\n const configDir = dirname(configPath);\r\n const installed = existsSync(configDir) || existsSync(configPath);\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n installed,\r\n paradigm: this.paradigm,\r\n capabilities: this.capabilities,\r\n configPath,\r\n scope: \"user\",\r\n reason: installed\r\n ? `found Hermes config at ${configPath}`\r\n : `no Hermes config at ${configPath}`,\r\n confidence: installed ? \"high\" : \"low\",\r\n };\r\n }\r\n\r\n // ── Memory surface: .hermes.md / HERMES.md shadow probe (project) ────────\r\n // Hermes assembles project context by FIRST CATEGORY WINS: .hermes.md or\r\n // HERMES.md (cwd walking up to the git root) → AGENTS.md (cwd only) →\r\n // CLAUDE.md (cwd only). When a hermes-native file exists our block must live\r\n // there or it is never loaded. Reason strings note the cwd-only AGENTS.md\r\n // read and hermes' ~20k-chars-per-file truncation.\r\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\r\n if (this.memoryOverride(ctx)?.path || ctx.scope !== \"project\") {\r\n return super.memoryTargets(ctx); // user scope: no rules surface → skip-warn\r\n }\r\n for (const name of [\".hermes.md\", \"HERMES.md\"]) {\r\n const candidate = join(ctx.projectDir, name);\r\n if (existsSync(candidate)) {\r\n return [\r\n {\r\n path: candidate,\r\n reason: `${name} shadows AGENTS.md on hermes (first context category wins)`,\r\n budgetBytes: 18 * 1024, // hermes truncates each context file at ~20k chars\r\n },\r\n ];\r\n }\r\n }\r\n return [\r\n {\r\n path: join(ctx.projectDir, \"AGENTS.md\"),\r\n reason:\r\n \"AGENTS.md (hermes reads it from the cwd only — run from the project root; ~20k chars/file truncation)\",\r\n budgetBytes: 18 * 1024,\r\n },\r\n ];\r\n }\r\n\r\n // ── Native paths (server + hooks share the SAME file) ─────────────────────\r\n\r\n override getConfigDir(_ctx: InstallContext): string {\r\n return dirname(this.userConfigPath());\r\n }\r\n\r\n override getServerConfigPath(_ctx: InstallContext): string {\r\n return this.userConfigPath();\r\n }\r\n\r\n /** Same file as the server config — Hermes hooks live in config.yaml. */\r\n override getHookConfigPath(_ctx: InstallContext): string {\r\n return this.userConfigPath();\r\n }\r\n\r\n private userConfigPath(): string {\r\n return join(homedir(), \".hermes\", \"config.yaml\");\r\n }\r\n\r\n // ── MCP server install / uninstall (YAML mcp_servers) ─────────────────────\r\n\r\n override installServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n const path = this.getServerConfigPath(ctx);\r\n const server = this.effectiveServer(ctx);\r\n\r\n if (!server) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: connector.server\r\n ? \"server registration disabled for hermes\"\r\n : \"connector declares no MCP server\",\r\n },\r\n ];\r\n }\r\n // Hermes registers stdio sidecars ({command,args,env}) AND remote HTTP\r\n // servers ({url,headers}) under the same mcp_servers key. It has no SSE\r\n // transport (docs: website/docs/user-guide/features/mcp.md), so anything\r\n // else is reported, never silently dropped.\r\n const isStdio = server.transport === \"stdio\" && !!server.command;\r\n const isHttp = server.transport === \"http\" && !!server.url;\r\n if (!isStdio && !isHttp) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: `transport \"${server.transport}\" not registrable in ${MCP_ROOT_KEY} (stdio + http only)`,\r\n },\r\n ];\r\n }\r\n\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n const entry = this.renderServerEntry(ctx, server);\r\n\r\n return [\r\n upsertInObjectMap({\r\n codec: yamlObjectMapCodec(),\r\n rootKey: MCP_ROOT_KEY,\r\n policy: \"coerce\",\r\n platform: this.id,\r\n configPath: path,\r\n entryId: connector.id,\r\n entry,\r\n dryRun,\r\n }),\r\n ];\r\n }\r\n\r\n override uninstallServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n const path = this.getServerConfigPath(ctx);\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n return [\r\n removeFromObjectMap({\r\n codec: yamlObjectMapCodec(),\r\n rootKey: MCP_ROOT_KEY,\r\n policy: \"coerce\",\r\n platform: this.id,\r\n configPath: path,\r\n entryId: connector.id,\r\n dryRun,\r\n }),\r\n ];\r\n }\r\n\r\n /**\r\n * Render the MCP entry — a remote HTTP `{ url, headers? }` or a stdio sidecar\r\n * `{ command, args, env }`. Hermes has no native interpolation, so env-refs\r\n * resolve to literals here. The stdio path honors the telemetry serve-wrapper.\r\n */\r\n private renderServerEntry(\r\n ctx: InstallContext,\r\n server: ServerDef,\r\n ): HermesStdioServer | HermesHttpServer {\r\n // Remote HTTP — { url, headers? }. Never telemetry-wrapped (a URL has no\r\n // local command to route through the serve proxy). Hermes has no native env\r\n // token, so ${env:VAR} refs in url/headers resolve to literals.\r\n if (server.transport === \"http\") {\r\n const entry: HermesHttpServer = { url: resolveEnvRefsDeep(server.url ?? \"\") };\r\n if (server.headers && Object.keys(server.headers).length > 0) {\r\n const headers: Record<string, string> = {};\r\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.headers))) {\r\n headers[k] = String(v);\r\n }\r\n entry.headers = headers;\r\n }\r\n return entry;\r\n }\r\n\r\n let command = server.command as string;\r\n let args = [...(server.args ?? [])];\r\n\r\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\r\n\r\n command = resolveEnvRefsDeep(command);\r\n args = resolveEnvRefsDeep(args);\r\n\r\n const entry: HermesStdioServer = { command };\r\n if (args.length > 0) entry.args = args;\r\n if (server.env && Object.keys(server.env).length > 0) {\r\n const env: Record<string, string> = {};\r\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.env))) {\r\n env[k] = String(v);\r\n }\r\n entry.env = env;\r\n }\r\n return entry;\r\n }\r\n\r\n // ── Hook install / uninstall (YAML hooks map in the SAME config.yaml) ─────\r\n\r\n override installHooks(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n const path = this.getHookConfigPath(ctx);\r\n const override = connector.platforms[HOST];\r\n\r\n // `hooks: false` disables only the NORMALIZED events. nativeHooks is a\r\n // sibling, hermes-scoped declaration on the same override and installs\r\n // regardless.\r\n const events = override?.hooks === false ? [] : connector.hookEvents;\r\n const nativeHooks = override?.nativeHooks ?? {};\r\n const nativeEvents = Object.keys(nativeHooks);\r\n\r\n if (events.length === 0 && nativeEvents.length === 0) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: override?.hooks === false ? \"hooks disabled for hermes\" : \"connector declares no hooks\",\r\n },\r\n ];\r\n }\r\n\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n const cfg = readYaml<Record<string, unknown>>(path) ?? {};\r\n const hooks = this.hooksBucket(cfg);\r\n const changes: ChangeRecord[] = [];\r\n let mutated = false;\r\n\r\n for (const event of events) {\r\n const hermesEvent = EVENT_TO_HERMES[event];\r\n if (!hermesEvent) {\r\n // No Hermes equivalent for this canonical event — report and skip.\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n path,\r\n detail: `${event} has no Hermes hook equivalent — skipped`,\r\n });\r\n continue;\r\n }\r\n\r\n // The hook command keeps the CANONICAL event token so the runtime\r\n // dispatcher (parseEvent/formatReply) stays consistent; only the YAML KEY\r\n // the entry is filed under is the native Hermes name.\r\n const command = buildHomeBinHookCommand(ctx.homeBinPath, HOST, event, connector.id);\r\n const matcher = connector.hooks[event]?.matcher ?? \"\";\r\n const timeout = this.hookTimeout(connector.server);\r\n const desired: HermesHookEntry = { matcher, command, timeout };\r\n\r\n const bucket = Array.isArray(hooks[hermesEvent])\r\n ? (hooks[hermesEvent] as HermesHookEntry[])\r\n : (hooks[hermesEvent] = [] as HermesHookEntry[]);\r\n const idx = bucket.findIndex((e) => this.isOurCommand(e?.command, ctx));\r\n\r\n if (idx >= 0) {\r\n if (JSON.stringify(bucket[idx]) === JSON.stringify(desired)) {\r\n changes.push({ platform: this.id, action: \"skip\", path, detail: `${HOOKS_KEY}.${hermesEvent}` });\r\n continue;\r\n }\r\n bucket[idx] = desired;\r\n changes.push({ platform: this.id, action: \"update\", path, detail: `${HOOKS_KEY}.${hermesEvent}` });\r\n } else {\r\n bucket.push(desired);\r\n changes.push({ platform: this.id, action: \"create\", path, detail: `${HOOKS_KEY}.${hermesEvent}` });\r\n }\r\n mutated = true;\r\n }\r\n\r\n // NATIVE passthrough events: Hermes-native event-name keys (e.g. pre_llm_call,\r\n // transform_tool_result) filed VERBATIM into the YAML hooks map — no\r\n // EVENT_TO_HERMES mapping, since they ARE Hermes events. Same entry shape +\r\n // idempotency, matched by EXACT command so a native key coinciding with a\r\n // mapped canonical key never clobbers it.\r\n for (const event of nativeEvents) {\r\n const command = buildHomeBinHookCommand(ctx.homeBinPath, HOST, event, connector.id);\r\n const matcher = nativeHooks[event]?.matcher ?? \"\";\r\n const timeout = this.hookTimeout(connector.server);\r\n const desired: HermesHookEntry = { matcher, command, timeout };\r\n const bucket = Array.isArray(hooks[event])\r\n ? (hooks[event] as HermesHookEntry[])\r\n : (hooks[event] = [] as HermesHookEntry[]);\r\n const idx = bucket.findIndex((e) => e?.command === command);\r\n if (idx >= 0) {\r\n if (JSON.stringify(bucket[idx]) === JSON.stringify(desired)) {\r\n changes.push({ platform: this.id, action: \"skip\", path, detail: `${HOOKS_KEY}.${event} (native)` });\r\n } else {\r\n bucket[idx] = desired;\r\n changes.push({ platform: this.id, action: \"update\", path, detail: `${HOOKS_KEY}.${event} (native)` });\r\n mutated = true;\r\n }\r\n } else {\r\n bucket.push(desired);\r\n changes.push({ platform: this.id, action: \"create\", path, detail: `${HOOKS_KEY}.${event} (native)` });\r\n mutated = true;\r\n }\r\n }\r\n\r\n if (mutated) writeYaml(path, cfg, dryRun);\r\n return changes;\r\n }\r\n\r\n override uninstallHooks(ctx: InstallContext): ChangeRecord[] {\r\n const path = this.getHookConfigPath(ctx);\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n const cfg = readYaml<Record<string, unknown>>(path);\r\n const hooksRaw = cfg?.[HOOKS_KEY];\r\n if (\r\n !cfg ||\r\n !hooksRaw ||\r\n typeof hooksRaw !== \"object\" ||\r\n Array.isArray(hooksRaw)\r\n ) {\r\n return [{ platform: this.id, action: \"skip\", path, detail: \"no hooks section present\" }];\r\n }\r\n const hooks = hooksRaw as Record<string, unknown>;\r\n\r\n const changes: ChangeRecord[] = [];\r\n let mutated = false;\r\n for (const event of Object.keys(hooks)) {\r\n const bucket = hooks[event];\r\n if (!Array.isArray(bucket)) continue;\r\n const kept = (bucket as HermesHookEntry[]).filter(\r\n (e) => !this.isOurCommand(e?.command, ctx),\r\n );\r\n if (kept.length === bucket.length) continue;\r\n mutated = true;\r\n if (kept.length > 0) hooks[event] = kept;\r\n else delete hooks[event];\r\n changes.push({\r\n platform: this.id,\r\n action: \"remove\",\r\n path,\r\n detail: `${HOOKS_KEY}.${event} (${bucket.length - kept.length})`,\r\n });\r\n }\r\n\r\n if (mutated) writeYaml(path, cfg, ctx.dryRun);\r\n if (changes.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", path, detail: \"no matching hook entries\" }];\r\n }\r\n return changes;\r\n }\r\n\r\n // ── Action surface (quick_commands map in the SAME config.yaml) ───────────\r\n // Each declared action emits `quick_commands.<id>: { type: \"exec\", command }`\r\n // where command is the home-bin action verb — a `/<id>` slash command that\r\n // runs it directly, bypassing the LLM. MERGE-preserve: never clobber another\r\n // entry. Set-if-absent per id; if `quick_commands.<id>` exists and is NOT\r\n // ours, skip-warn (the configPatch ownership semantics).\r\n\r\n override installActions(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n const path = this.getHookConfigPath(ctx);\r\n\r\n if (connector.platforms[HOST]?.actions === false) {\r\n return [{ platform: this.id, action: \"skip\", path, detail: \"actions disabled for hermes\" }];\r\n }\r\n const triggers = this.actionTriggers(ctx);\r\n if (triggers.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", path, detail: \"connector declares no actions\" }];\r\n }\r\n\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n const cfg = readYaml<Record<string, unknown>>(path) ?? {};\r\n const bucket = this.objectBucket(cfg, QUICK_COMMANDS_KEY);\r\n const changes: ChangeRecord[] = [];\r\n let mutated = false;\r\n\r\n for (const trigger of triggers) {\r\n const desired: HermesQuickCommand = { type: \"exec\", command: trigger.command };\r\n const existing = bucket[trigger.id];\r\n if (existing !== undefined) {\r\n // Set-if-absent: only re-write an entry that is already OURS (an\r\n // exec entry whose command is our action verb for this connector).\r\n if (!this.isOurQuickCommand(existing, ctx)) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n path,\r\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id} exists and is not ours — skipped`,\r\n });\r\n continue;\r\n }\r\n if (JSON.stringify(existing) === JSON.stringify(desired)) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id}`,\r\n });\r\n continue;\r\n }\r\n bucket[trigger.id] = desired;\r\n changes.push({\r\n platform: this.id,\r\n action: \"update\",\r\n path,\r\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id}`,\r\n });\r\n } else {\r\n bucket[trigger.id] = desired;\r\n changes.push({\r\n platform: this.id,\r\n action: \"create\",\r\n path,\r\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id}`,\r\n });\r\n }\r\n mutated = true;\r\n }\r\n\r\n if (mutated) writeYaml(path, cfg, dryRun);\r\n return changes;\r\n }\r\n\r\n override uninstallActions(ctx: InstallContext): ChangeRecord[] {\r\n const path = this.getHookConfigPath(ctx);\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n const cfg = readYaml<Record<string, unknown>>(path);\r\n const bucketRaw = cfg?.[QUICK_COMMANDS_KEY];\r\n if (\r\n !cfg ||\r\n !bucketRaw ||\r\n typeof bucketRaw !== \"object\" ||\r\n Array.isArray(bucketRaw)\r\n ) {\r\n return [{ platform: this.id, action: \"skip\", path, detail: \"no quick_commands section present\" }];\r\n }\r\n const bucket = bucketRaw as Record<string, unknown>;\r\n\r\n const changes: ChangeRecord[] = [];\r\n let mutated = false;\r\n // Remove ONLY our exec entries; leave foreign entries (and the map itself\r\n // when any remain) untouched.\r\n for (const id of Object.keys(bucket)) {\r\n if (!this.isOurQuickCommand(bucket[id], ctx)) continue;\r\n delete bucket[id];\r\n mutated = true;\r\n changes.push({\r\n platform: this.id,\r\n action: \"remove\",\r\n path,\r\n detail: `${QUICK_COMMANDS_KEY}.${id}`,\r\n });\r\n }\r\n\r\n if (mutated) {\r\n // Drop an emptied map so we leave no orphan key behind.\r\n if (Object.keys(bucket).length === 0) delete cfg[QUICK_COMMANDS_KEY];\r\n writeYaml(path, cfg, ctx.dryRun);\r\n }\r\n if (changes.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", path, detail: \"no matching quick_commands entries\" }];\r\n }\r\n return changes;\r\n }\r\n\r\n /** True when a quick-command entry is OUR exec action verb for this connector. */\r\n private isOurQuickCommand(entry: unknown, ctx: InstallContext): boolean {\r\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return false;\r\n const e = entry as Partial<HermesQuickCommand>;\r\n if (e.type !== \"exec\" || typeof e.command !== \"string\") return false;\r\n return isHomeBinActionCommand(e.command, ctx.homeBinPath, ctx.connector.id);\r\n }\r\n\r\n /** True when a hook command is ours (anchored home-bin + connector id). */\r\n private isOurCommand(command: string | undefined, ctx: InstallContext): boolean {\r\n return isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id);\r\n }\r\n\r\n private hookTimeout(server: ServerDef | undefined): number {\r\n const ms = server?.timeoutMs;\r\n if (typeof ms === \"number\" && ms > 0) {\r\n // Hermes documents `timeout: <seconds>` as \"default 60, capped at 300\";\r\n // a value > 300 is clamped with a warning by Hermes itself (see hooks.md\r\n // on NousResearch/hermes-agent). Clamp here so we never emit a value the\r\n // host would reject/cap. No documented minimum, but a positive timeoutMs\r\n // must not round down to 0 (an undocumented, ambiguous \"no/instant\"\r\n // timeout), so floor at 1s. In-range values (1000–300000ms) are unchanged.\r\n return Math.min(HOOK_TIMEOUT_MAX, Math.max(HOOK_TIMEOUT_MIN, Math.round(ms / 1000)));\r\n }\r\n return DEFAULT_HOOK_TIMEOUT;\r\n }\r\n\r\n // ── Content surface: skills (dir-per-skill SKILL.md) ─────────────────────\r\n // CONTENT-ONLY: pure native-file writers, mirroring goose/openclaw. No\r\n // runtime dispatch, no home-bin pointer, no telemetry wrap. Idempotent\r\n // (byte-identical → skip) via writeContentFile and reversible via\r\n // removeContentFile + removeDirIfEmpty. Honors platforms[\"hermes\"].skills\r\n // === false. No config.yaml entry — Hermes auto-discovers ~/.hermes/skills.\r\n //\r\n // USER scope only: ~/.hermes/skills/<name>/SKILL.md (the documented local,\r\n // read-write \"single source of truth\"). Project scope skip-warns — there is\r\n // no hermes-owned project skills dir documented.\r\n\r\n /** The user-scope skills ROOT dir (~/.hermes/skills). */\r\n private skillsDir(): string {\r\n return join(dirname(this.userConfigPath()), \"skills\");\r\n }\r\n\r\n /** Per-skill directory: ~/.hermes/skills/<name>. */\r\n private skillDir(name: string): string {\r\n return join(this.skillsDir(), name);\r\n }\r\n\r\n override installSkills(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.platforms[HOST]?.skills === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for hermes\" }];\r\n }\r\n if (connector.skills.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\r\n }\r\n if (ctx.scope !== \"user\") {\r\n // Hermes documents only the user-scope ~/.hermes/skills root; there is no\r\n // hermes-owned project skills dir. Report rather than guess a path.\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n detail:\r\n `no project-scope skills dir on hermes (~/.hermes/skills is user-scope only); ` +\r\n `${connector.skills.length} skipped`,\r\n },\r\n ];\r\n }\r\n const changes: ChangeRecord[] = [];\r\n for (const skill of connector.skills) {\r\n const dir = this.skillDir(skill.name);\r\n // Guard a skills path occupied by a regular FILE (would throw ENOTDIR on\r\n // mkdir): skip-warn rather than crash (the cline `.clinerules`-is-a-file\r\n // precedent). The skills root or the per-skill dir is the likely culprit.\r\n const blockingFile = this.firstFileOnSkillPath(dir);\r\n if (blockingFile !== null) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n path: blockingFile,\r\n detail: `${blockingFile} is a file, not a directory; skill \"${skill.name}\" skipped`,\r\n });\r\n continue;\r\n }\r\n changes.push(\r\n this.writeContentFile(join(dir, \"SKILL.md\"), renderSkillMd(skill), ctx.dryRun),\r\n );\r\n // Bundle any resource files beside SKILL.md (relative path → contents).\r\n // Defense-in-depth: skip+warn on any key that escapes the skill dir\r\n // (config-time validation already rejects these, but never trust input).\r\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\r\n const target = this.resolveWithin(dir, rel);\r\n if (target === null) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\r\n });\r\n continue;\r\n }\r\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Walk from the skills root (~/.hermes/skills) down to `leaf` and return the\r\n * FIRST segment that exists as a regular file (a mkdir there throws ENOTDIR),\r\n * else null — so installSkills can skip-warn instead of crashing.\r\n */\r\n private firstFileOnSkillPath(leaf: string): string | null {\r\n const root = this.skillsDir();\r\n const segments: string[] = [];\r\n let cur = leaf;\r\n while (cur.length >= root.length) {\r\n segments.unshift(cur);\r\n if (cur === root) break;\r\n const parent = dirname(cur);\r\n if (parent === cur) break;\r\n cur = parent;\r\n }\r\n for (const p of segments) {\r\n if (!existsSync(p)) return null;\r\n try {\r\n if (statSync(p).isFile()) return p;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.skills.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\r\n }\r\n if (ctx.scope !== \"user\") {\r\n // Nothing is written at project scope (install skip-warned), so nothing\r\n // to clean — report the same scope reason as install for symmetry.\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n detail: \"no project-scope skills dir on hermes (user-scope only); nothing to remove\",\r\n },\r\n ];\r\n }\r\n const changes: ChangeRecord[] = [];\r\n for (const skill of connector.skills) {\r\n const dir = this.skillDir(skill.name);\r\n // Remove only the files we wrote (SKILL.md + declared resources), then the\r\n // skill dir itself when we own its full contents.\r\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\r\n for (const rel of Object.keys(skill.resources ?? {})) {\r\n const target = this.resolveWithin(dir, rel);\r\n if (target === null) continue; // never delete outside the skill dir\r\n changes.push(this.removeContentFile(target, ctx.dryRun));\r\n }\r\n // Only remove the skill dir when WE own its full contents — never rm -rf a\r\n // dir that still holds user-added / sibling-tool / shared files.\r\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\r\n }\r\n return changes;\r\n }\r\n\r\n // ── Diagnostics ──────────────────────────────────────────────────────────\r\n\r\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\r\n const path = this.getServerConfigPath(ctx);\r\n const id = ctx.connector.id;\r\n const homeBin = ctx.homeBinPath;\r\n const hookEvents = ctx.connector.hookEvents;\r\n return [\r\n {\r\n name: `${this.name}: config.yaml present`,\r\n check: () =>\r\n existsSync(path)\r\n ? { status: \"OK\", detail: path }\r\n : { status: \"FAIL\", detail: `not found: ${path}` },\r\n },\r\n {\r\n name: `${this.name}: ${MCP_ROOT_KEY}.${id} registered`,\r\n check: () => {\r\n // Only assert what the connector declares: a server-less connector\r\n // never writes an mcp entry, so its absence is healthy.\r\n if (!ctx.connector.server) return { status: \"OK\", detail: \"no MCP server declared\" };\r\n const cfg = readYaml<Record<string, unknown>>(path);\r\n const bucket = cfg?.[MCP_ROOT_KEY];\r\n const present =\r\n typeof bucket === \"object\" &&\r\n bucket !== null &&\r\n !Array.isArray(bucket) &&\r\n id in (bucket as Record<string, unknown>);\r\n return present\r\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${id}` }\r\n : { status: \"FAIL\", detail: `${MCP_ROOT_KEY}.${id} not found in ${path}` };\r\n },\r\n },\r\n {\r\n name: `${this.name}: hook command registered`,\r\n check: () => {\r\n if (hookEvents.length === 0) return { status: \"OK\", detail: \"no hooks declared\" };\r\n const cfg = readYaml<Record<string, unknown>>(path);\r\n const hooks = cfg?.[HOOKS_KEY];\r\n if (!hooks || typeof hooks !== \"object\" || Array.isArray(hooks)) {\r\n return { status: \"FAIL\", detail: `no ${HOOKS_KEY} section in ${path}` };\r\n }\r\n const registered = Object.values(hooks as Record<string, unknown>).some(\r\n (bucket) =>\r\n Array.isArray(bucket) &&\r\n (bucket as HermesHookEntry[]).some((e) =>\r\n isHomeBinHookCommand(e?.command, homeBin, id),\r\n ),\r\n );\r\n return registered\r\n ? { status: \"OK\", detail: \"hook command present\" }\r\n : { status: \"FAIL\", detail: `no hook for ${id} in ${path}` };\r\n },\r\n },\r\n ];\r\n }\r\n\r\n // ── Runtime: parse Hermes stdin JSON → normalized event ──────────────────\r\n\r\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\r\n const input = (raw ?? {}) as HermesWireInput;\r\n const base = {\r\n hostPlatform: HOST,\r\n connectorId: typeof input.connector === \"string\" ? input.connector : \"\",\r\n sessionId: typeof input.session_id === \"string\" ? input.session_id : \"\",\r\n ...(typeof input.cwd === \"string\" ? { projectDir: input.cwd } : {}),\r\n raw,\r\n } as const;\r\n\r\n switch (event) {\r\n case \"PreToolUse\": {\r\n const ev: PreToolUseEvent = {\r\n ...base,\r\n toolName: input.tool_name ?? \"\",\r\n toolInput: input.tool_input ?? {},\r\n };\r\n return ev;\r\n }\r\n case \"PostToolUse\": {\r\n // VERIFIED (NousResearch/hermes-agent model_tools.py:856-871 +\r\n // shell_hooks.py::_serialize_payload): post_tool_call's `result` kwarg is\r\n // NOT allowlisted, so it lands at extra.result — top-level tool_output/\r\n // tool_response are NEVER emitted. Read extra.result for the output.\r\n const extra = input.extra ?? {};\r\n const out = toStringOrUndefined(extra.result);\r\n // VERIFIED: there is no `is_error` boolean. The host emits status\r\n // (\"ok\"|\"error\") + error_type/error_message (model_tools.py:815-821,\r\n // _tool_result_observer_fields), all under extra. Derive isError from a\r\n // non-ok status or a present error_type; emit only when determinable.\r\n const isError =\r\n typeof extra.status === \"string\"\r\n ? extra.status !== \"ok\"\r\n : typeof extra.error_type === \"string\"\r\n ? true\r\n : undefined;\r\n const ev: PostToolUseEvent = {\r\n ...base,\r\n toolName: input.tool_name ?? \"\",\r\n toolInput: input.tool_input ?? {},\r\n ...(out !== undefined ? { toolOutput: out } : {}),\r\n ...(typeof isError === \"boolean\" ? { isError } : {}),\r\n };\r\n return ev;\r\n }\r\n case \"SessionStart\": {\r\n // VERIFIED (NousResearch/hermes-agent conversation_loop.py:340-344):\r\n // on_session_start is invoked with { session_id, model, platform } only —\r\n // there is NO `source`/start-reason kwarg (model/platform land under\r\n // extra). Hermes fires on_session_start ONLY for a brand-new session (not\r\n // on continuation), so the canonical \"startup\" is the single honest\r\n // value; there is no compact/resume/clear discriminator to normalize.\r\n const ev: SessionStartEvent = { ...base, source: \"startup\" };\r\n return ev;\r\n }\r\n case \"SessionEnd\": {\r\n // VERIFIED (NousResearch/hermes-agent turn_finalizer.py:415-423):\r\n // on_session_end is invoked with completed:bool / interrupted:bool (both\r\n // under extra) — there is NO top-level `reason` kwarg. Derive a reason\r\n // string from the two booleans (interrupted wins; else completed).\r\n const extra = input.extra ?? {};\r\n const reason =\r\n extra.interrupted === true\r\n ? \"interrupted\"\r\n : extra.completed === true\r\n ? \"completed\"\r\n : undefined;\r\n const ev: SessionEndEvent = {\r\n ...base,\r\n ...(reason !== undefined ? { reason } : {}),\r\n };\r\n return ev;\r\n }\r\n // The five arms below parse events Hermes does NOT fire (userPromptSubmit/\r\n // preCompact/stop/notification capabilities are false; PostCompact unset).\r\n // They stay as defensive normalizers for a manual/mis-routed dispatch, and\r\n // read from `extra` because that is the only envelope Hermes' serializer\r\n // produces — never an invented top-level field.\r\n case \"UserPromptSubmit\": {\r\n const extra = input.extra ?? {};\r\n const ev: UserPromptSubmitEvent = {\r\n ...base,\r\n prompt: typeof extra.prompt === \"string\" ? extra.prompt : \"\",\r\n };\r\n return ev;\r\n }\r\n case \"PreCompact\": {\r\n const extra = input.extra ?? {};\r\n const ev: PreCompactEvent = {\r\n ...base,\r\n ...(extra.trigger === \"auto\" || extra.trigger === \"manual\"\r\n ? { trigger: extra.trigger }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n case \"PostCompact\": {\r\n // Hermes does not fire PostCompact natively (postCompact unset →\r\n // warn-skip at install). Parsed defensively, mirroring PreCompact, so a\r\n // manual/mis-routed dispatch normalizes instead of hitting the guard.\r\n const extra = input.extra ?? {};\r\n const ev: PostCompactEvent = {\r\n ...base,\r\n ...(extra.trigger === \"auto\" || extra.trigger === \"manual\"\r\n ? { trigger: extra.trigger }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n case \"Stop\": {\r\n const extra = input.extra ?? {};\r\n const ev: StopEvent = {\r\n ...base,\r\n ...(typeof extra.stop_hook_active === \"boolean\"\r\n ? { stopHookActive: extra.stop_hook_active }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n case \"Notification\": {\r\n const extra = input.extra ?? {};\r\n const ev: NotificationEvent = {\r\n ...base,\r\n message: typeof extra.message === \"string\" ? extra.message : \"\",\r\n };\r\n return ev;\r\n }\r\n case \"SubagentStop\": {\r\n // VERIFIED (NousResearch/hermes-agent delegate_tool.py:2520-2529): the\r\n // subagent_stop invoke passes parent_session_id, child_session_id,\r\n // child_role, child_summary, child_status, duration_ms. Only\r\n // parent_session_id is allowlisted (→ top-level session_id); EVERY child_*\r\n // field nests under extra. So the id/role/output all come from extra.* —\r\n // top-level agent_id/agent_type/child_id/last_assistant_message/\r\n // stop_hook_active are NEVER emitted by Hermes. child_status (∈ completed/\r\n // failed/interrupted/error) stays accessible via `raw`.\r\n const extra = input.extra ?? {};\r\n const ev: SubagentStopEvent = {\r\n ...base,\r\n ...(typeof extra.child_session_id === \"string\"\r\n ? { agentId: extra.child_session_id }\r\n : {}),\r\n ...(typeof extra.child_role === \"string\"\r\n ? { agentType: extra.child_role }\r\n : {}),\r\n ...(typeof extra.child_summary === \"string\"\r\n ? { lastAssistantMessage: extra.child_summary }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n case \"PermissionRequest\":\r\n case \"PostToolUseFailure\":\r\n case \"SubagentStart\": {\r\n // No Hermes analog: pre_approval_request is observe-only (no decision\r\n // control), tool failures arrive merged into post_tool_call, and there\r\n // is no subagent_start. Install already skip-warns these; a runtime\r\n // dispatch is a mis-route — fail loudly.\r\n throw new Error(`unsupported hermes hook event: ${String(event)}`);\r\n }\r\n default: {\r\n const _never: never = event;\r\n throw new Error(`unsupported hermes hook event: ${String(_never)}`);\r\n }\r\n }\r\n }\r\n\r\n // ── Runtime: normalized response → Hermes native hook reply ──────────────\r\n // Hermes shell hooks read a JSON reply from stdout (exit 0 = allow). We emit a\r\n // Claude-like `hookSpecificOutput` wrapper; if Hermes' exact reply schema\r\n // differs, this is the single place to adjust the mapping.\r\n\r\n formatReply(event: HookEventName, response: HookResponse): HookReply {\r\n const decision = response.decision ?? \"allow\";\r\n\r\n if (decision === \"deny\") {\r\n // SubagentStop deny carries Stop semantics — it keeps the subagent\r\n // running with `reason` as its next instruction — and (like Claude's\r\n // Stop class) is honored only as the TOP-LEVEL {\"decision\":\"block\",\r\n // \"reason\"}, not as a permissionDecision envelope.\r\n if (event === \"SubagentStop\") {\r\n return this.stdout({\r\n decision: \"block\",\r\n reason: response.reason ?? \"Blocked by hook\",\r\n });\r\n }\r\n return this.stdout({\r\n hookSpecificOutput: {\r\n hookEventName: event,\r\n permissionDecision: \"deny\",\r\n permissionDecisionReason: response.reason ?? \"Blocked by hook\",\r\n },\r\n });\r\n }\r\n\r\n if (decision === \"ask\") {\r\n return this.stdout({\r\n hookSpecificOutput: {\r\n hookEventName: event,\r\n permissionDecision: \"ask\",\r\n permissionDecisionReason: response.reason ?? \"Confirmation required by hook\",\r\n },\r\n });\r\n }\r\n\r\n if (decision === \"context\" && response.additionalContext) {\r\n return this.stdout({\r\n hookSpecificOutput: { hookEventName: event, additionalContext: response.additionalContext },\r\n });\r\n }\r\n\r\n // allow / modify (unsupported — shell hooks can't rewrite args) / void.\r\n return { exitCode: 0 };\r\n }\r\n\r\n private stdout(payload: unknown): HookReply {\r\n return { exitCode: 0, stdout: JSON.stringify(payload) };\r\n }\r\n\r\n // ── Internal helpers ──────────────────────────────────────────────────────\r\n\r\n /** Resolve the per-platform server override into an effective ServerDef. */\r\n private effectiveServer(ctx: InstallContext): ServerDef | undefined {\r\n const override = ctx.connector.platforms[this.id]?.server;\r\n if (override === false) return undefined;\r\n const base = ctx.connector.server;\r\n if (!base) return undefined;\r\n return override && typeof override === \"object\" ? { ...base, ...override } : base;\r\n }\r\n\r\n /** Get-or-create an object bucket (map) at `cfg[key]`. */\r\n private objectBucket(cfg: Record<string, unknown>, key: string): Record<string, unknown> {\r\n const existing = cfg[key];\r\n if (existing && typeof existing === \"object\" && !Array.isArray(existing)) {\r\n return existing as Record<string, unknown>;\r\n }\r\n const fresh: Record<string, unknown> = {};\r\n cfg[key] = fresh;\r\n return fresh;\r\n }\r\n\r\n /** Get-or-create the hooks map at `cfg.hooks`. */\r\n private hooksBucket(cfg: Record<string, unknown>): Record<string, unknown> {\r\n return this.objectBucket(cfg, HOOKS_KEY);\r\n }\r\n}\r\n\r\n/** Coerce an unknown value into a string for the normalized event. */\r\nfunction toStringOrUndefined(value: unknown): string | undefined {\r\n if (value == null) return undefined;\r\n if (typeof value === \"string\") return value;\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n}\r\n\r\nexport const adapter = new HermesAdapter();\r\nexport default adapter;\r\n"],"mappings":"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","names":["entry"]}
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  openSqlite
4
- } from "./chunk-YT43MUSJ.js";
4
+ } from "./chunk-XZWMJLIT.js";
5
5
  import {
6
6
  firstExistingRoot
7
- } from "./chunk-O7SDRBVB.js";
7
+ } from "./chunk-KM2YXO6V.js";
8
8
  import {
9
9
  emptyTokens,
10
10
  inferProvider
11
- } from "./chunk-XD7MY6HB.js";
11
+ } from "./chunk-7PSNXUFK.js";
12
12
 
13
13
  // src/usage/readers/hermes.ts
14
14
  import { join } from "path";
@@ -193,4 +193,4 @@ var hermes_default = hermesReader;
193
193
  export {
194
194
  hermes_default as default
195
195
  };
196
- //# sourceMappingURL=hermes-F3EGTK6N.js.map
196
+ //# sourceMappingURL=hermes-MF3NX4ZY.js.map