@ken-jo/agent-connector 0.4.44 → 0.4.67

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 (188) hide show
  1. package/README.md +17 -4
  2. package/dist/{action-72J2TCKQ.js → action-RUM6GP23.js} +12 -12
  3. package/dist/{amazon-q-UFLBUSHG.js → amazon-q-KXVJFT7Q.js} +7 -11
  4. package/dist/amazon-q-KXVJFT7Q.js.map +1 -0
  5. package/dist/{amp-5DJK7VAL.js → amp-WAPHJYTK.js} +38 -63
  6. package/dist/amp-WAPHJYTK.js.map +1 -0
  7. package/dist/{antigravity-NWP2TUG6.js → antigravity-GF3RU42A.js} +5 -5
  8. package/dist/{antigravity-cli-KPNLE7X4.js → antigravity-cli-OH27IFH5.js} +5 -5
  9. package/dist/{chunk-QY42WGBX.js → chunk-2HCJV6UO.js} +33 -3
  10. package/dist/chunk-2HCJV6UO.js.map +1 -0
  11. package/dist/{chunk-ERV4TKRV.js → chunk-3Y23ZYYF.js} +10 -10
  12. package/dist/chunk-3Y23ZYYF.js.map +1 -0
  13. package/dist/{chunk-L7ESV37V.js → chunk-7CZKXXBD.js} +4 -2
  14. package/dist/chunk-7CZKXXBD.js.map +1 -0
  15. package/dist/{chunk-ZY25RG4Y.js → chunk-ALVXORZM.js} +4 -2
  16. package/dist/chunk-ALVXORZM.js.map +1 -0
  17. package/dist/{chunk-M3H7PQWT.js → chunk-AXAHW2KU.js} +4 -2
  18. package/dist/chunk-AXAHW2KU.js.map +1 -0
  19. package/dist/{chunk-CFM3JKIR.js → chunk-CSRBMJLU.js} +7 -7
  20. package/dist/{chunk-F4DSMVZ7.js → chunk-D6ZJS4ND.js} +2 -2
  21. package/dist/{chunk-B47MDOV3.js → chunk-E45SUUD7.js} +5 -5
  22. package/dist/{chunk-3Q6YEDCG.js → chunk-F5COBB5F.js} +17 -45
  23. package/dist/chunk-F5COBB5F.js.map +1 -0
  24. package/dist/{chunk-5M2SMDA4.js → chunk-GCRRX4MO.js} +2 -2
  25. package/dist/{chunk-2RPHDVHW.js → chunk-IU42THN7.js} +2 -2
  26. package/dist/{chunk-VPSHGDDQ.js → chunk-IZ4XQ23W.js} +26 -10
  27. package/dist/chunk-IZ4XQ23W.js.map +1 -0
  28. package/dist/{chunk-SBV2QJ5C.js → chunk-LS65GL2P.js} +36 -36
  29. package/dist/{chunk-IKEXNI2W.js → chunk-NXR4HM5N.js} +18 -18
  30. package/dist/{chunk-ASHAMORS.js → chunk-P5KA5NVR.js} +2 -2
  31. package/dist/{chunk-A767JFHW.js → chunk-RHML2NOB.js} +65 -35
  32. package/dist/chunk-RHML2NOB.js.map +1 -0
  33. package/dist/{chunk-UXG64P6R.js → chunk-RQCBBLTA.js} +7 -4
  34. package/dist/chunk-RQCBBLTA.js.map +1 -0
  35. package/dist/{chunk-LETB5HCK.js → chunk-TZ5KGCE2.js} +2 -2
  36. package/dist/{chunk-WZWK4ICE.js → chunk-UVBAH263.js} +10 -7
  37. package/dist/chunk-UVBAH263.js.map +1 -0
  38. package/dist/{chunk-E3GWKJU5.js → chunk-ZEFUDBTY.js} +5 -5
  39. package/dist/{chunk-XW46WVR2.js → chunk-ZSMGHEB5.js} +10 -5
  40. package/dist/chunk-ZSMGHEB5.js.map +1 -0
  41. package/dist/{claude-code-HXIVRZCY.js → claude-code-WLN43K7I.js} +15 -8
  42. package/dist/claude-code-WLN43K7I.js.map +1 -0
  43. package/dist/cli/sdk.js +7 -7
  44. package/dist/cli.js +1 -1
  45. package/dist/{cline-AGFJF4AC.js → cline-PEGTGVQD.js} +4 -4
  46. package/dist/{codebuff-YUQ4PN7G.js → codebuff-UG6LVSOM.js} +4 -4
  47. package/dist/{codex-FLU37DV3.js → codex-4LVDQXCD.js} +32 -6
  48. package/dist/codex-4LVDQXCD.js.map +1 -0
  49. package/dist/{continue-ZMI4YN75.js → continue-DYV5V55Y.js} +9 -5
  50. package/dist/continue-DYV5V55Y.js.map +1 -0
  51. package/dist/{copilot-cli-XPRJ5MQB.js → copilot-cli-NVFXFLUF.js} +66 -51
  52. package/dist/copilot-cli-NVFXFLUF.js.map +1 -0
  53. package/dist/{crush-3OB5ZTCC.js → crush-PP4HYZLT.js} +4 -4
  54. package/dist/{cursor-F4HYO2FP.js → cursor-XMXOZKAP.js} +5 -5
  55. package/dist/{detect-L3NJTBO5.js → detect-IZOWP5AA.js} +4 -4
  56. package/dist/{doctor-PUE4HO3N.js → doctor-5IVUQ2YH.js} +14 -14
  57. package/dist/{droid-NZCKYKOV.js → droid-ETNOUIPJ.js} +6 -12
  58. package/dist/droid-ETNOUIPJ.js.map +1 -0
  59. package/dist/{gemini-cli-3ZGCXUDD.js → gemini-cli-P7XJXWVH.js} +19 -6
  60. package/dist/gemini-cli-P7XJXWVH.js.map +1 -0
  61. package/dist/{goose-MGGNVXJP.js → goose-UZVA6MQC.js} +16 -22
  62. package/dist/goose-UZVA6MQC.js.map +1 -0
  63. package/dist/{hermes-L3CBJ37L.js → hermes-IC6R4CII.js} +44 -22
  64. package/dist/hermes-IC6R4CII.js.map +1 -0
  65. package/dist/{hook-S3DNNGZX.js → hook-7IUPIHCZ.js} +12 -12
  66. package/dist/index.d.ts +2 -2
  67. package/dist/index.js +5 -5
  68. package/dist/{install-7SUJFRYO.js → install-EP6GPQ65.js} +14 -14
  69. package/dist/{introspect-B164-hj3.d.ts → introspect-BFcXpfUp.d.ts} +1 -1
  70. package/dist/{jetbrains-copilot-M2LHJBAW.js → jetbrains-copilot-MZO2RQGJ.js} +19 -15
  71. package/dist/jetbrains-copilot-MZO2RQGJ.js.map +1 -0
  72. package/dist/{kilo-RMRP2EL7.js → kilo-CCB34CQQ.js} +18 -55
  73. package/dist/kilo-CCB34CQQ.js.map +1 -0
  74. package/dist/{kilo-cli-6ITBNHTH.js → kilo-cli-EOMN3WC7.js} +18 -55
  75. package/dist/kilo-cli-EOMN3WC7.js.map +1 -0
  76. package/dist/{kimi-QYHWAY54.js → kimi-GUSJME55.js} +8 -4
  77. package/dist/kimi-GUSJME55.js.map +1 -0
  78. package/dist/{kiro-2K5UJVGC.js → kiro-6OHZ5RGV.js} +5 -5
  79. package/dist/kiro-6OHZ5RGV.js.map +1 -0
  80. package/dist/{leaderboard-2VAAOK3D.js → leaderboard-6I2E5XZK.js} +5 -5
  81. package/dist/{mimo-code-K7AMX2QW.js → mimo-code-ZPJJ6IIW.js} +21 -56
  82. package/dist/mimo-code-ZPJJ6IIW.js.map +1 -0
  83. package/dist/{mux-GT7FWVLH.js → mux-AFTVMGGM.js} +4 -4
  84. package/dist/{nemoclaw-GQMS6CUM.js → nemoclaw-D5EN4G2Q.js} +5 -5
  85. package/dist/{omp-2RPYIZUF.js → omp-GKI2PZ7G.js} +17 -46
  86. package/dist/omp-GKI2PZ7G.js.map +1 -0
  87. package/dist/{openclaw-P5GMEEGC.js → openclaw-A76PCNBV.js} +5 -5
  88. package/dist/{opencode-5D2SK3EX.js → opencode-M34E6PI7.js} +21 -56
  89. package/dist/opencode-M34E6PI7.js.map +1 -0
  90. package/dist/{package-VUX663ET.js → package-BWLV24OO.js} +11 -11
  91. package/dist/{pi-ZMM4KJTO.js → pi-HVG6ZWFE.js} +4 -4
  92. package/dist/{qwen-code-4ZLVGN2C.js → qwen-code-OWLM3I5P.js} +12 -5
  93. package/dist/qwen-code-OWLM3I5P.js.map +1 -0
  94. package/dist/{roo-code-67QGLQRM.js → roo-code-RFKKTNNI.js} +4 -4
  95. package/dist/runtime/index.d.ts +1 -1
  96. package/dist/runtime/index.js +10 -10
  97. package/dist/sdk/index.d.ts +3 -3
  98. package/dist/sdk/index.js +6 -6
  99. package/dist/sdk/test.d.ts +2 -2
  100. package/dist/sdk/test.js +9 -9
  101. package/dist/{serve-MOIIYFER.js → serve-CM4HZPMP.js} +12 -12
  102. package/dist/{status-SCBCWS7H.js → status-BPB4VLQX.js} +10 -10
  103. package/dist/{statusline-NRPDOPGA.js → statusline-HIKR2I4Q.js} +11 -11
  104. package/dist/{telemetry-Q55B5NSZ.js → telemetry-SBVUJYNE.js} +10 -10
  105. package/dist/{trae-TMJPHWZ5.js → trae-FVHQALK3.js} +4 -4
  106. package/dist/{types-COSBYpKs.d.ts → types-ChUrvw0j.d.ts} +8 -8
  107. package/dist/{uninstall-SNI7GPQD.js → uninstall-MO3RGGVE.js} +21 -14
  108. package/dist/uninstall-MO3RGGVE.js.map +1 -0
  109. package/dist/{upgrade-ZUNBJWJ7.js → upgrade-6XIGSPGY.js} +14 -14
  110. package/dist/{usage-UQDBIU42.js → usage-IBN36ZVW.js} +2 -2
  111. package/dist/{usage-event-HPG2BIAY.js → usage-event-4RJP37K6.js} +11 -11
  112. package/dist/{vscode-copilot-H7JKUKLZ.js → vscode-copilot-6FLDRTKV.js} +26 -19
  113. package/dist/vscode-copilot-6FLDRTKV.js.map +1 -0
  114. package/dist/{warp-SVDVKQQI.js → warp-7CC52UJV.js} +4 -4
  115. package/dist/{windsurf-H36YKOMR.js → windsurf-6ZLQMBQW.js} +4 -4
  116. package/dist/{zed-LHWJALLZ.js → zed-FULJMNBV.js} +4 -4
  117. package/package.json +2 -1
  118. package/dist/amazon-q-UFLBUSHG.js.map +0 -1
  119. package/dist/amp-5DJK7VAL.js.map +0 -1
  120. package/dist/chunk-3Q6YEDCG.js.map +0 -1
  121. package/dist/chunk-A767JFHW.js.map +0 -1
  122. package/dist/chunk-ERV4TKRV.js.map +0 -1
  123. package/dist/chunk-L7ESV37V.js.map +0 -1
  124. package/dist/chunk-M3H7PQWT.js.map +0 -1
  125. package/dist/chunk-QY42WGBX.js.map +0 -1
  126. package/dist/chunk-UXG64P6R.js.map +0 -1
  127. package/dist/chunk-VPSHGDDQ.js.map +0 -1
  128. package/dist/chunk-WZWK4ICE.js.map +0 -1
  129. package/dist/chunk-XW46WVR2.js.map +0 -1
  130. package/dist/chunk-ZY25RG4Y.js.map +0 -1
  131. package/dist/claude-code-HXIVRZCY.js.map +0 -1
  132. package/dist/codex-FLU37DV3.js.map +0 -1
  133. package/dist/continue-ZMI4YN75.js.map +0 -1
  134. package/dist/copilot-cli-XPRJ5MQB.js.map +0 -1
  135. package/dist/droid-NZCKYKOV.js.map +0 -1
  136. package/dist/gemini-cli-3ZGCXUDD.js.map +0 -1
  137. package/dist/goose-MGGNVXJP.js.map +0 -1
  138. package/dist/hermes-L3CBJ37L.js.map +0 -1
  139. package/dist/jetbrains-copilot-M2LHJBAW.js.map +0 -1
  140. package/dist/kilo-RMRP2EL7.js.map +0 -1
  141. package/dist/kilo-cli-6ITBNHTH.js.map +0 -1
  142. package/dist/kimi-QYHWAY54.js.map +0 -1
  143. package/dist/kiro-2K5UJVGC.js.map +0 -1
  144. package/dist/mimo-code-K7AMX2QW.js.map +0 -1
  145. package/dist/omp-2RPYIZUF.js.map +0 -1
  146. package/dist/opencode-5D2SK3EX.js.map +0 -1
  147. package/dist/qwen-code-4ZLVGN2C.js.map +0 -1
  148. package/dist/uninstall-SNI7GPQD.js.map +0 -1
  149. package/dist/vscode-copilot-H7JKUKLZ.js.map +0 -1
  150. /package/dist/{action-72J2TCKQ.js.map → action-RUM6GP23.js.map} +0 -0
  151. /package/dist/{antigravity-NWP2TUG6.js.map → antigravity-GF3RU42A.js.map} +0 -0
  152. /package/dist/{antigravity-cli-KPNLE7X4.js.map → antigravity-cli-OH27IFH5.js.map} +0 -0
  153. /package/dist/{chunk-CFM3JKIR.js.map → chunk-CSRBMJLU.js.map} +0 -0
  154. /package/dist/{chunk-F4DSMVZ7.js.map → chunk-D6ZJS4ND.js.map} +0 -0
  155. /package/dist/{chunk-B47MDOV3.js.map → chunk-E45SUUD7.js.map} +0 -0
  156. /package/dist/{chunk-5M2SMDA4.js.map → chunk-GCRRX4MO.js.map} +0 -0
  157. /package/dist/{chunk-2RPHDVHW.js.map → chunk-IU42THN7.js.map} +0 -0
  158. /package/dist/{chunk-SBV2QJ5C.js.map → chunk-LS65GL2P.js.map} +0 -0
  159. /package/dist/{chunk-IKEXNI2W.js.map → chunk-NXR4HM5N.js.map} +0 -0
  160. /package/dist/{chunk-ASHAMORS.js.map → chunk-P5KA5NVR.js.map} +0 -0
  161. /package/dist/{chunk-LETB5HCK.js.map → chunk-TZ5KGCE2.js.map} +0 -0
  162. /package/dist/{chunk-E3GWKJU5.js.map → chunk-ZEFUDBTY.js.map} +0 -0
  163. /package/dist/{cline-AGFJF4AC.js.map → cline-PEGTGVQD.js.map} +0 -0
  164. /package/dist/{codebuff-YUQ4PN7G.js.map → codebuff-UG6LVSOM.js.map} +0 -0
  165. /package/dist/{crush-3OB5ZTCC.js.map → crush-PP4HYZLT.js.map} +0 -0
  166. /package/dist/{cursor-F4HYO2FP.js.map → cursor-XMXOZKAP.js.map} +0 -0
  167. /package/dist/{detect-L3NJTBO5.js.map → detect-IZOWP5AA.js.map} +0 -0
  168. /package/dist/{doctor-PUE4HO3N.js.map → doctor-5IVUQ2YH.js.map} +0 -0
  169. /package/dist/{hook-S3DNNGZX.js.map → hook-7IUPIHCZ.js.map} +0 -0
  170. /package/dist/{install-7SUJFRYO.js.map → install-EP6GPQ65.js.map} +0 -0
  171. /package/dist/{leaderboard-2VAAOK3D.js.map → leaderboard-6I2E5XZK.js.map} +0 -0
  172. /package/dist/{mux-GT7FWVLH.js.map → mux-AFTVMGGM.js.map} +0 -0
  173. /package/dist/{nemoclaw-GQMS6CUM.js.map → nemoclaw-D5EN4G2Q.js.map} +0 -0
  174. /package/dist/{openclaw-P5GMEEGC.js.map → openclaw-A76PCNBV.js.map} +0 -0
  175. /package/dist/{package-VUX663ET.js.map → package-BWLV24OO.js.map} +0 -0
  176. /package/dist/{pi-ZMM4KJTO.js.map → pi-HVG6ZWFE.js.map} +0 -0
  177. /package/dist/{roo-code-67QGLQRM.js.map → roo-code-RFKKTNNI.js.map} +0 -0
  178. /package/dist/{serve-MOIIYFER.js.map → serve-CM4HZPMP.js.map} +0 -0
  179. /package/dist/{status-SCBCWS7H.js.map → status-BPB4VLQX.js.map} +0 -0
  180. /package/dist/{statusline-NRPDOPGA.js.map → statusline-HIKR2I4Q.js.map} +0 -0
  181. /package/dist/{telemetry-Q55B5NSZ.js.map → telemetry-SBVUJYNE.js.map} +0 -0
  182. /package/dist/{trae-TMJPHWZ5.js.map → trae-FVHQALK3.js.map} +0 -0
  183. /package/dist/{upgrade-ZUNBJWJ7.js.map → upgrade-6XIGSPGY.js.map} +0 -0
  184. /package/dist/{usage-UQDBIU42.js.map → usage-IBN36ZVW.js.map} +0 -0
  185. /package/dist/{usage-event-HPG2BIAY.js.map → usage-event-4RJP37K6.js.map} +0 -0
  186. /package/dist/{warp-SVDVKQQI.js.map → warp-7CC52UJV.js.map} +0 -0
  187. /package/dist/{windsurf-H36YKOMR.js.map → windsurf-6ZLQMBQW.js.map} +0 -0
  188. /package/dist/{zed-LHWJALLZ.js.map → zed-FULJMNBV.js.map} +0 -0
@@ -3,10 +3,7 @@ import {
3
3
  readYaml,
4
4
  writeYaml,
5
5
  yamlObjectMapCodec
6
- } from "./chunk-2RPHDVHW.js";
7
- import {
8
- normalizeSessionSource
9
- } from "./chunk-H53QZQJI.js";
6
+ } from "./chunk-IU42THN7.js";
10
7
  import {
11
8
  resolveEnvRefsDeep
12
9
  } from "./chunk-DBQMX75U.js";
@@ -15,15 +12,15 @@ import {
15
12
  removeFromObjectMap,
16
13
  renderSkillMd,
17
14
  upsertInObjectMap
18
- } from "./chunk-A767JFHW.js";
15
+ } from "./chunk-RHML2NOB.js";
19
16
  import {
20
17
  buildHomeBinHookCommand,
21
18
  buildWrappedStdio,
22
19
  isHomeBinActionCommand,
23
20
  isHomeBinHookCommand
24
21
  } from "./chunk-TO57WYBB.js";
25
- import "./chunk-ZY25RG4Y.js";
26
- import "./chunk-QY42WGBX.js";
22
+ import "./chunk-ALVXORZM.js";
23
+ import "./chunk-2HCJV6UO.js";
27
24
 
28
25
  // src/adapters/hermes/index.ts
29
26
  import { existsSync, statSync } from "fs";
@@ -195,6 +192,8 @@ var HermesAdapter = class extends BaseAdapter {
195
192
  }
196
193
  ];
197
194
  }
195
+ const symlink = this.symlinkPathWarning(path);
196
+ if (symlink) return [symlink];
198
197
  const entry = this.renderServerEntry(ctx, server);
199
198
  return [
200
199
  upsertInObjectMap({
@@ -212,6 +211,8 @@ var HermesAdapter = class extends BaseAdapter {
212
211
  uninstallServer(ctx) {
213
212
  const { connector, dryRun } = ctx;
214
213
  const path = this.getServerConfigPath(ctx);
214
+ const symlink = this.symlinkPathWarning(path);
215
+ if (symlink) return [symlink];
215
216
  return [
216
217
  removeFromObjectMap({
217
218
  codec: yamlObjectMapCodec(),
@@ -275,6 +276,8 @@ var HermesAdapter = class extends BaseAdapter {
275
276
  }
276
277
  ];
277
278
  }
279
+ const symlink = this.symlinkPathWarning(path);
280
+ if (symlink) return [symlink];
278
281
  const cfg = readYaml(path) ?? {};
279
282
  const hooks = this.hooksBucket(cfg);
280
283
  const changes = [];
@@ -335,6 +338,8 @@ var HermesAdapter = class extends BaseAdapter {
335
338
  }
336
339
  uninstallHooks(ctx) {
337
340
  const path = this.getHookConfigPath(ctx);
341
+ const symlink = this.symlinkPathWarning(path);
342
+ if (symlink) return [symlink];
338
343
  const cfg = readYaml(path);
339
344
  const hooksRaw = cfg?.[HOOKS_KEY];
340
345
  if (!cfg || !hooksRaw || typeof hooksRaw !== "object" || Array.isArray(hooksRaw)) {
@@ -382,6 +387,8 @@ var HermesAdapter = class extends BaseAdapter {
382
387
  if (triggers.length === 0) {
383
388
  return [{ platform: this.id, action: "skip", path, detail: "connector declares no actions" }];
384
389
  }
390
+ const symlink = this.symlinkPathWarning(path);
391
+ if (symlink) return [symlink];
385
392
  const cfg = readYaml(path) ?? {};
386
393
  const bucket = this.objectBucket(cfg, QUICK_COMMANDS_KEY);
387
394
  const changes = [];
@@ -431,6 +438,8 @@ var HermesAdapter = class extends BaseAdapter {
431
438
  }
432
439
  uninstallActions(ctx) {
433
440
  const path = this.getHookConfigPath(ctx);
441
+ const symlink = this.symlinkPathWarning(path);
442
+ if (symlink) return [symlink];
434
443
  const cfg = readYaml(path);
435
444
  const bucketRaw = cfg?.[QUICK_COMMANDS_KEY];
436
445
  if (!cfg || !bucketRaw || typeof bucketRaw !== "object" || Array.isArray(bucketRaw)) {
@@ -656,70 +665,83 @@ var HermesAdapter = class extends BaseAdapter {
656
665
  return ev;
657
666
  }
658
667
  case "PostToolUse": {
659
- const out = toStringOrUndefined(input.tool_output ?? input.tool_response);
668
+ const extra = input.extra ?? {};
669
+ const out = toStringOrUndefined(extra.result);
670
+ const isError = typeof extra.status === "string" ? extra.status !== "ok" : typeof extra.error_type === "string" ? true : void 0;
660
671
  const ev = {
661
672
  ...base,
662
673
  toolName: input.tool_name ?? "",
663
674
  toolInput: input.tool_input ?? {},
664
675
  ...out !== void 0 ? { toolOutput: out } : {},
665
- ...typeof input.is_error === "boolean" ? { isError: input.is_error } : {}
676
+ ...typeof isError === "boolean" ? { isError } : {}
666
677
  };
667
678
  return ev;
668
679
  }
669
680
  case "SessionStart": {
670
- const ev = { ...base, source: normalizeSessionSource(input.source) };
681
+ const ev = { ...base, source: "startup" };
671
682
  return ev;
672
683
  }
673
684
  case "SessionEnd": {
685
+ const extra = input.extra ?? {};
686
+ const reason = extra.interrupted === true ? "interrupted" : extra.completed === true ? "completed" : void 0;
674
687
  const ev = {
675
688
  ...base,
676
- ...typeof input.reason === "string" ? { reason: input.reason } : {}
689
+ ...reason !== void 0 ? { reason } : {}
677
690
  };
678
691
  return ev;
679
692
  }
693
+ // The five arms below parse events Hermes does NOT fire (userPromptSubmit/
694
+ // preCompact/stop/notification capabilities are false; PostCompact unset).
695
+ // They stay as defensive normalizers for a manual/mis-routed dispatch, and
696
+ // read from `extra` because that is the only envelope Hermes' serializer
697
+ // produces — never an invented top-level field.
680
698
  case "UserPromptSubmit": {
699
+ const extra = input.extra ?? {};
681
700
  const ev = {
682
701
  ...base,
683
- prompt: typeof input.prompt === "string" ? input.prompt : ""
702
+ prompt: typeof extra.prompt === "string" ? extra.prompt : ""
684
703
  };
685
704
  return ev;
686
705
  }
687
706
  case "PreCompact": {
707
+ const extra = input.extra ?? {};
688
708
  const ev = {
689
709
  ...base,
690
- ...input.trigger === "auto" || input.trigger === "manual" ? { trigger: input.trigger } : {}
710
+ ...extra.trigger === "auto" || extra.trigger === "manual" ? { trigger: extra.trigger } : {}
691
711
  };
692
712
  return ev;
693
713
  }
694
714
  case "PostCompact": {
715
+ const extra = input.extra ?? {};
695
716
  const ev = {
696
717
  ...base,
697
- ...input.trigger === "auto" || input.trigger === "manual" ? { trigger: input.trigger } : {}
718
+ ...extra.trigger === "auto" || extra.trigger === "manual" ? { trigger: extra.trigger } : {}
698
719
  };
699
720
  return ev;
700
721
  }
701
722
  case "Stop": {
723
+ const extra = input.extra ?? {};
702
724
  const ev = {
703
725
  ...base,
704
- ...typeof input.stop_hook_active === "boolean" ? { stopHookActive: input.stop_hook_active } : {}
726
+ ...typeof extra.stop_hook_active === "boolean" ? { stopHookActive: extra.stop_hook_active } : {}
705
727
  };
706
728
  return ev;
707
729
  }
708
730
  case "Notification": {
731
+ const extra = input.extra ?? {};
709
732
  const ev = {
710
733
  ...base,
711
- message: typeof input.message === "string" ? input.message : ""
734
+ message: typeof extra.message === "string" ? extra.message : ""
712
735
  };
713
736
  return ev;
714
737
  }
715
738
  case "SubagentStop": {
716
- const agentId = input.agent_id ?? input.child_id;
739
+ const extra = input.extra ?? {};
717
740
  const ev = {
718
741
  ...base,
719
- ...typeof agentId === "string" ? { agentId } : {},
720
- ...typeof input.agent_type === "string" ? { agentType: input.agent_type } : {},
721
- ...typeof input.last_assistant_message === "string" ? { lastAssistantMessage: input.last_assistant_message } : {},
722
- ...typeof input.stop_hook_active === "boolean" ? { stopHookActive: input.stop_hook_active } : {}
742
+ ...typeof extra.child_session_id === "string" ? { agentId: extra.child_session_id } : {},
743
+ ...typeof extra.child_role === "string" ? { agentType: extra.child_role } : {},
744
+ ...typeof extra.child_summary === "string" ? { lastAssistantMessage: extra.child_summary } : {}
723
745
  };
724
746
  return ev;
725
747
  }
@@ -814,4 +836,4 @@ export {
814
836
  adapter,
815
837
  hermes_default as default
816
838
  };
817
- //# sourceMappingURL=hermes-L3CBJ37L.js.map
839
+ //# sourceMappingURL=hermes-IC6R4CII.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/hermes/index.ts"],"sourcesContent":["/**\n * adapters/hermes — Hermes Agent platform adapter for agent-connector.\n *\n * Hermes is a json-stdio host whose ENTIRE configuration — both the MCP servers\n * and the lifecycle hooks — lives in a single user-scope YAML file:\n *\n * ~/.hermes/config.yaml\n *\n * Because the file is YAML, the BaseAdapter JSON helpers do not apply; this\n * adapter merges via core/yaml's readYaml/writeYaml, preserving any unrelated\n * config the user has authored.\n *\n * - MCP servers: top-level snake_case root key `mcp_servers`. The stdio entry\n * uses the portable field names { command, args, env } (unlike Goose's\n * cmd/envs). Hermes has no native env interpolation, so `${env:VAR}` refs are\n * resolved to literals at install time.\n *\n * - Hooks: a top-level `hooks` map keyed by Hermes' NATIVE snake_case event\n * names (pre_tool_call / post_tool_call / on_session_start / on_session_end /\n * subagent_stop — NOT the canonical PascalCase names; see EVENT_TO_HERMES).\n * Each value is a\n * list of shell-hook entries { matcher, command:\"<homeBin> hook …\", timeout }.\n * The command keeps the canonical event token so the runtime dispatcher\n * (parseEvent/formatReply) stays consistent. Hermes shell hooks pipe the\n * event JSON to the command on stdin and read the reply JSON from stdout —\n * the same wire protocol as Claude Code, so the runtime parse/format mirror\n * the Claude adapter (a Claude-like JSON shape; the exact Hermes field map is\n * documented inline where it could vary).\n *\n * Since hooks are external shell commands (not an in-process plugin), Hermes\n * cannot let a hook rewrite tool arguments — canModifyArgs is false. Hermes has\n * no SSE transport, so only stdio + http are advertised.\n */\n\nimport { existsSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport { BaseAdapter } from \"../base.js\";\nimport type { Adapter, HookReply, InstallContext, MemoryTarget, NormalizedEvent } from \"../spi.js\";\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookEventName,\n HookParadigm,\n HookResponse,\n NotificationEvent,\n PlatformCapabilities,\n PlatformId,\n PostToolUseEvent,\n PostCompactEvent,\n PreCompactEvent,\n PreToolUseEvent,\n SessionEndEvent,\n SessionStartEvent,\n ServerDef,\n StopEvent,\n SubagentStopEvent,\n UserPromptSubmitEvent,\n} from \"../../core/types.js\";\nimport { removeFromObjectMap, upsertInObjectMap } from \"../../core/object-map.js\";\nimport { readYaml, writeYaml, yamlObjectMapCodec } from \"../../core/yaml.js\";\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\nimport {\n buildHomeBinHookCommand,\n buildWrappedStdio,\n isHomeBinActionCommand,\n isHomeBinHookCommand,\n} from \"../../core/spawn.js\";\nimport { renderSkillMd } from \"../claude-code/render.js\";\n\nconst HOST: PlatformId = \"hermes\";\n/** Root key under which Hermes stores MCP servers in config.yaml (snake_case). */\nconst MCP_ROOT_KEY = \"mcp_servers\";\n/** Top-level key under which Hermes stores shell hooks in config.yaml. */\nconst HOOKS_KEY = \"hooks\";\n/**\n * Top-level map under which Hermes stores `/<id>` slash commands. A\n * `{ type: \"exec\", command }` entry runs the shell command directly, bypassing\n * the LLM — the action emitter's target.\n */\nconst QUICK_COMMANDS_KEY = \"quick_commands\";\n/** Default per-hook timeout (seconds) when the connector declares none. */\nconst DEFAULT_HOOK_TIMEOUT = 60;\n/**\n * Documented per-hook timeout bounds (seconds). Hermes' hooks.md states\n * `timeout: <seconds>` is \"default 60, capped at 300\" and that `timeout > 300`\n * is clamped with a warning by the host. There is no documented minimum; the\n * 1s floor is defensive so a sub-second connector timeoutMs never rounds to 0.\n */\nconst HOOK_TIMEOUT_MAX = 300;\nconst HOOK_TIMEOUT_MIN = 1;\n\n/** One Hermes quick-command entry (a `/<id>` slash command). */\ninterface HermesQuickCommand {\n type: \"exec\";\n command: string;\n}\n\n/**\n * Canonical → Hermes native hook event name. Hermes keys its `hooks:` block by\n * its OWN snake_case lifecycle names (pre_tool_call / post_tool_call /\n * on_session_start / on_session_end — see docs/research/platform-research.json),\n * NOT the canonical PascalCase names. A connector event is only wired when it\n * appears here AND is declared by the connector; everything else is reported as\n * a warn/skip at install time.\n */\nconst EVENT_TO_HERMES: Partial<Record<HookEventName, string>> = {\n PreToolUse: \"pre_tool_call\",\n PostToolUse: \"post_tool_call\",\n SessionStart: \"on_session_start\",\n SessionEnd: \"on_session_end\",\n // Hermes is a STOP-ONLY subagent host: subagent_stop fires when a\n // delegate_task child exits (child_status ∈ completed/failed/interrupted/\n // error); there is NO subagent_start analog. PermissionRequest is also\n // deliberately ABSENT: Hermes' pre_approval_request/post_approval_response\n // hooks OBSERVE the approval prompt but carry no decision control, so a\n // PermissionRequest handler could never be honored — install skip-warns it.\n SubagentStop: \"subagent_stop\",\n};\n\n/** Hermes stdio MCP entry — portable field names (command/args/env). */\ninterface HermesStdioServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/**\n * Hermes remote HTTP MCP entry — `{ url, headers? }` under the SAME mcp_servers\n * key (no transport/type discriminator). Per the Hermes Agent docs\n * (website/docs/user-guide/features/mcp.md \"HTTP servers\"); OAuth servers add\n * `auth: oauth`, which AC's static-header model does not express.\n */\ninterface HermesHttpServer {\n url: string;\n headers?: Record<string, string>;\n}\n\n/** One Hermes shell-hook entry. */\ninterface HermesHookEntry {\n /** Tool-name matcher (empty = all). Tool events only; \"\" elsewhere. */\n matcher: string;\n /** The home-bin hook command Hermes invokes (event JSON on stdin). */\n command: string;\n /** Hook timeout in seconds. */\n timeout: number;\n}\n\n/**\n * Raw Hermes hook stdin payload — the ACTUAL wire shape emitted by Hermes'\n * `agent/shell_hooks.py::_serialize_payload` (NousResearch/hermes-agent), NOT a\n * Claude-like guess. The serializer keeps ONLY these top-level keys:\n *\n * { hook_event_name, tool_name, tool_input, session_id, cwd, extra }\n *\n * where `tool_name`/`tool_input` come from the invoke kwargs `tool_name`/`args`,\n * `session_id` from `session_id` ?? `parent_session_id`, and EVERY other kwarg\n * is nested under `extra` (see `_TOP_LEVEL_PAYLOAD_KEYS` = {tool_name, args,\n * session_id, parent_session_id}). So all per-event result/status/child fields\n * are read from `extra.*` — top-level reads for them are always undefined.\n */\ninterface HermesWireInput {\n session_id?: string;\n cwd?: string;\n hook_event_name?: string;\n tool_name?: string;\n /** Top-level: the serializer lifts the `args` kwarg here (PreToolUse). */\n tool_input?: Record<string, unknown>;\n /**\n * Every non-allowlisted invoke kwarg nests here. Per-event contents (verified\n * against the host source):\n * - post_tool_call: result, status (\"ok\"|\"error\"), error_type, error_message,\n * duration_ms, task_id, tool_call_id, turn_id, api_request_id, middleware_trace\n * - subagent_stop: child_session_id, child_role, child_summary, child_status\n * (\"completed\"|\"failed\"|\"interrupted\"|\"error\"), duration_ms, parent_turn_id\n * - on_session_start: model, platform\n * - on_session_end: completed (bool), interrupted (bool), task_id, turn_id,\n * model, platform\n */\n extra?: HermesExtra;\n /** Injected by the entrypoint so the runtime knows which connector to dispatch. */\n connector?: string;\n}\n\n/** The `extra` envelope — non-allowlisted invoke kwargs, by event (see above). */\ninterface HermesExtra {\n // post_tool_call\n result?: unknown;\n status?: string;\n error_type?: string;\n error_message?: string;\n // subagent_stop\n child_session_id?: string;\n child_role?: string;\n child_summary?: string;\n child_status?: string;\n // on_session_end\n completed?: boolean;\n interrupted?: boolean;\n // on_session_start / on_session_end\n model?: string;\n platform?: string;\n // ── Defensive only ──────────────────────────────────────────────────────\n // Hermes does NOT fire UserPromptSubmit / PreCompact / PostCompact / Stop /\n // Notification (the matching capabilities are false; install warn-skips them).\n // Were any ever mis-routed here, the serializer would still nest its kwargs\n // under `extra`, so these defensive parse arms read from extra — they never\n // resurface as invented top-level fields.\n prompt?: string;\n trigger?: string;\n stop_hook_active?: boolean;\n message?: string;\n}\n\nexport class HermesAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Hermes Agent\";\n readonly paradigm: HookParadigm = \"json-stdio\";\n\n readonly capabilities: PlatformCapabilities = {\n // Memory surface: AGENTS.md-first managed block. memoryTargets below probes\n // for .hermes.md / HERMES.md (first context category wins on hermes —\n // AGENTS.md is ignored when they exist); ~/.hermes holds identity/volatile\n // files (SOUL.md, MEMORY.md), not a rules surface → user-scope skip-warn.\n supportsMemory: true,\n preToolUse: true,\n postToolUse: true,\n preCompact: false,\n // Hermes exposes on_session_start / on_session_end lifecycle hooks.\n sessionStart: true,\n sessionEnd: true,\n userPromptSubmit: false,\n stop: false,\n notification: false,\n // Newer events: Hermes ships subagent_stop (stop-only — no subagent_start\n // analog). permissionRequest stays unset because pre_approval_request is\n // observe-only (no decision control); postToolUseFailure stays unset (a\n // tool failure arrives merged into post_tool_call's result, not as a\n // dedicated event). Install reports the standard skip-warn for those.\n subagentStop: true,\n // Shell hooks cannot rewrite tool args/output in-process.\n canModifyArgs: false,\n canModifyOutput: false,\n canInjectSessionContext: true,\n // Hermes has no SSE transport.\n transports: [\"stdio\", \"http\"],\n // Content surface: Hermes auto-discovers dir-per-skill SKILL.md from its\n // LOCAL skills root ~/.hermes/skills — the \"single source of truth,\n // read-write\" dir (hermes-agent.nousresearch.com/docs/user-guide/features/\n // skills, fetched 2026-06-16). The directory name becomes the skill's\n // install slug; frontmatter is { name, description } + optional\n // metadata.hermes.*. USER scope only — there is no documented hermes-owned\n // project skills dir (~/.agents/skills is the cross-tool external dir, not\n // ours), so a project-scope install skip-warns via the base default.\n supportsSkills: true,\n // Native passthrough hooks: Hermes documents many host-specific lifecycle\n // events with NO canonical analog — pre_llm_call / post_llm_call /\n // on_session_finalize / on_session_reset / pre_gateway_dispatch /\n // pre_approval_request / post_approval_response / transform_tool_result\n // (docs/research/platform-research.json). They are host-specific (below the\n // >=3-host core bar; docs/research/host-specific-hook-events-design.md). A\n // connector reaches them by declaring platforms[\"hermes\"].nativeHooks;\n // installHooks files those event-name keys verbatim into the YAML hooks map,\n // and the generic uninstall reverses them.\n supportsNativeHooks: true,\n // Actions surface: Hermes ships `quick_commands.<id>: { type: \"exec\",\n // command }` — a `/<id>` slash command that runs the shell command directly,\n // bypassing the LLM (hermes-agent.nousresearch.com/docs/user-guide/cli:\n // \"custom commands that run shell commands instantly without invoking the\n // LLM\"). We emit one per declared action bound to the home-bin action verb.\n supportsActions: true,\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(_projectDir: string): DetectedPlatform {\n const configPath = this.userConfigPath();\n const configDir = dirname(configPath);\n const installed = existsSync(configDir) || existsSync(configPath);\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath,\n scope: \"user\",\n reason: installed\n ? `found Hermes config at ${configPath}`\n : `no Hermes config at ${configPath}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Memory surface: .hermes.md / HERMES.md shadow probe (project) ────────\n // Hermes assembles project context by FIRST CATEGORY WINS: .hermes.md or\n // HERMES.md (cwd walking up to the git root) → AGENTS.md (cwd only) →\n // CLAUDE.md (cwd only). When a hermes-native file exists our block must live\n // there or it is never loaded. Reason strings note the cwd-only AGENTS.md\n // read and hermes' ~20k-chars-per-file truncation.\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\n if (this.memoryOverride(ctx)?.path || ctx.scope !== \"project\") {\n return super.memoryTargets(ctx); // user scope: no rules surface → skip-warn\n }\n for (const name of [\".hermes.md\", \"HERMES.md\"]) {\n const candidate = join(ctx.projectDir, name);\n if (existsSync(candidate)) {\n return [\n {\n path: candidate,\n reason: `${name} shadows AGENTS.md on hermes (first context category wins)`,\n budgetBytes: 18 * 1024, // hermes truncates each context file at ~20k chars\n },\n ];\n }\n }\n return [\n {\n path: join(ctx.projectDir, \"AGENTS.md\"),\n reason:\n \"AGENTS.md (hermes reads it from the cwd only — run from the project root; ~20k chars/file truncation)\",\n budgetBytes: 18 * 1024,\n },\n ];\n }\n\n // ── Native paths (server + hooks share the SAME file) ─────────────────────\n\n override getConfigDir(_ctx: InstallContext): string {\n return dirname(this.userConfigPath());\n }\n\n override getServerConfigPath(_ctx: InstallContext): string {\n return this.userConfigPath();\n }\n\n /** Same file as the server config — Hermes hooks live in config.yaml. */\n override getHookConfigPath(_ctx: InstallContext): string {\n return this.userConfigPath();\n }\n\n private userConfigPath(): string {\n return join(homedir(), \".hermes\", \"config.yaml\");\n }\n\n // ── MCP server install / uninstall (YAML mcp_servers) ─────────────────────\n\n override installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getServerConfigPath(ctx);\n const server = this.effectiveServer(ctx);\n\n if (!server) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: connector.server\n ? \"server registration disabled for hermes\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n // Hermes registers stdio sidecars ({command,args,env}) AND remote HTTP\n // servers ({url,headers}) under the same mcp_servers key. It has no SSE\n // transport (docs: website/docs/user-guide/features/mcp.md), so anything\n // else is reported, never silently dropped.\n const isStdio = server.transport === \"stdio\" && !!server.command;\n const isHttp = server.transport === \"http\" && !!server.url;\n if (!isStdio && !isHttp) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: `transport \"${server.transport}\" not registrable in ${MCP_ROOT_KEY} (stdio + http only)`,\n },\n ];\n }\n\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n const entry = this.renderServerEntry(ctx, server);\n\n return [\n upsertInObjectMap({\n codec: yamlObjectMapCodec(),\n rootKey: MCP_ROOT_KEY,\n policy: \"coerce\",\n platform: this.id,\n configPath: path,\n entryId: connector.id,\n entry,\n dryRun,\n }),\n ];\n }\n\n override uninstallServer(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getServerConfigPath(ctx);\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n return [\n removeFromObjectMap({\n codec: yamlObjectMapCodec(),\n rootKey: MCP_ROOT_KEY,\n policy: \"coerce\",\n platform: this.id,\n configPath: path,\n entryId: connector.id,\n dryRun,\n }),\n ];\n }\n\n /**\n * Render the MCP entry — a remote HTTP `{ url, headers? }` or a stdio sidecar\n * `{ command, args, env }`. Hermes has no native interpolation, so env-refs\n * resolve to literals here. The stdio path honors the telemetry serve-wrapper.\n */\n private renderServerEntry(\n ctx: InstallContext,\n server: ServerDef,\n ): HermesStdioServer | HermesHttpServer {\n // Remote HTTP — { url, headers? }. Never telemetry-wrapped (a URL has no\n // local command to route through the serve proxy). Hermes has no native env\n // token, so ${env:VAR} refs in url/headers resolve to literals.\n if (server.transport === \"http\") {\n const entry: HermesHttpServer = { url: resolveEnvRefsDeep(server.url ?? \"\") };\n if (server.headers && Object.keys(server.headers).length > 0) {\n const headers: Record<string, string> = {};\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.headers))) {\n headers[k] = String(v);\n }\n entry.headers = headers;\n }\n return entry;\n }\n\n let command = server.command as string;\n let args = [...(server.args ?? [])];\n\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\n\n command = resolveEnvRefsDeep(command);\n args = resolveEnvRefsDeep(args);\n\n const entry: HermesStdioServer = { command };\n if (args.length > 0) entry.args = args;\n if (server.env && Object.keys(server.env).length > 0) {\n const env: Record<string, string> = {};\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.env))) {\n env[k] = String(v);\n }\n entry.env = env;\n }\n return entry;\n }\n\n // ── Hook install / uninstall (YAML hooks map in the SAME config.yaml) ─────\n\n override installHooks(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getHookConfigPath(ctx);\n const override = connector.platforms[HOST];\n\n // `hooks: false` disables only the NORMALIZED events. nativeHooks is a\n // sibling, hermes-scoped declaration on the same override and installs\n // regardless.\n const events = override?.hooks === false ? [] : connector.hookEvents;\n const nativeHooks = override?.nativeHooks ?? {};\n const nativeEvents = Object.keys(nativeHooks);\n\n if (events.length === 0 && nativeEvents.length === 0) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: override?.hooks === false ? \"hooks disabled for hermes\" : \"connector declares no hooks\",\n },\n ];\n }\n\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n const cfg = readYaml<Record<string, unknown>>(path) ?? {};\n const hooks = this.hooksBucket(cfg);\n const changes: ChangeRecord[] = [];\n let mutated = false;\n\n for (const event of events) {\n const hermesEvent = EVENT_TO_HERMES[event];\n if (!hermesEvent) {\n // No Hermes equivalent for this canonical event — report and skip.\n changes.push({\n platform: this.id,\n action: \"warn\",\n path,\n detail: `${event} has no Hermes hook equivalent — skipped`,\n });\n continue;\n }\n\n // The hook command keeps the CANONICAL event token so the runtime\n // dispatcher (parseEvent/formatReply) stays consistent; only the YAML KEY\n // the entry is filed under is the native Hermes name.\n const command = buildHomeBinHookCommand(ctx.homeBinPath, HOST, event, connector.id);\n const matcher = connector.hooks[event]?.matcher ?? \"\";\n const timeout = this.hookTimeout(connector.server);\n const desired: HermesHookEntry = { matcher, command, timeout };\n\n const bucket = Array.isArray(hooks[hermesEvent])\n ? (hooks[hermesEvent] as HermesHookEntry[])\n : (hooks[hermesEvent] = [] as HermesHookEntry[]);\n const idx = bucket.findIndex((e) => this.isOurCommand(e?.command, ctx));\n\n if (idx >= 0) {\n if (JSON.stringify(bucket[idx]) === JSON.stringify(desired)) {\n changes.push({ platform: this.id, action: \"skip\", path, detail: `${HOOKS_KEY}.${hermesEvent}` });\n continue;\n }\n bucket[idx] = desired;\n changes.push({ platform: this.id, action: \"update\", path, detail: `${HOOKS_KEY}.${hermesEvent}` });\n } else {\n bucket.push(desired);\n changes.push({ platform: this.id, action: \"create\", path, detail: `${HOOKS_KEY}.${hermesEvent}` });\n }\n mutated = true;\n }\n\n // NATIVE passthrough events: Hermes-native event-name keys (e.g. pre_llm_call,\n // transform_tool_result) filed VERBATIM into the YAML hooks map — no\n // EVENT_TO_HERMES mapping, since they ARE Hermes events. Same entry shape +\n // idempotency, matched by EXACT command so a native key coinciding with a\n // mapped canonical key never clobbers it.\n for (const event of nativeEvents) {\n const command = buildHomeBinHookCommand(ctx.homeBinPath, HOST, event, connector.id);\n const matcher = nativeHooks[event]?.matcher ?? \"\";\n const timeout = this.hookTimeout(connector.server);\n const desired: HermesHookEntry = { matcher, command, timeout };\n const bucket = Array.isArray(hooks[event])\n ? (hooks[event] as HermesHookEntry[])\n : (hooks[event] = [] as HermesHookEntry[]);\n const idx = bucket.findIndex((e) => e?.command === command);\n if (idx >= 0) {\n if (JSON.stringify(bucket[idx]) === JSON.stringify(desired)) {\n changes.push({ platform: this.id, action: \"skip\", path, detail: `${HOOKS_KEY}.${event} (native)` });\n } else {\n bucket[idx] = desired;\n changes.push({ platform: this.id, action: \"update\", path, detail: `${HOOKS_KEY}.${event} (native)` });\n mutated = true;\n }\n } else {\n bucket.push(desired);\n changes.push({ platform: this.id, action: \"create\", path, detail: `${HOOKS_KEY}.${event} (native)` });\n mutated = true;\n }\n }\n\n if (mutated) writeYaml(path, cfg, dryRun);\n return changes;\n }\n\n override uninstallHooks(ctx: InstallContext): ChangeRecord[] {\n const path = this.getHookConfigPath(ctx);\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n const cfg = readYaml<Record<string, unknown>>(path);\n const hooksRaw = cfg?.[HOOKS_KEY];\n if (\n !cfg ||\n !hooksRaw ||\n typeof hooksRaw !== \"object\" ||\n Array.isArray(hooksRaw)\n ) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no hooks section present\" }];\n }\n const hooks = hooksRaw as Record<string, unknown>;\n\n const changes: ChangeRecord[] = [];\n let mutated = false;\n for (const event of Object.keys(hooks)) {\n const bucket = hooks[event];\n if (!Array.isArray(bucket)) continue;\n const kept = (bucket as HermesHookEntry[]).filter(\n (e) => !this.isOurCommand(e?.command, ctx),\n );\n if (kept.length === bucket.length) continue;\n mutated = true;\n if (kept.length > 0) hooks[event] = kept;\n else delete hooks[event];\n changes.push({\n platform: this.id,\n action: \"remove\",\n path,\n detail: `${HOOKS_KEY}.${event} (${bucket.length - kept.length})`,\n });\n }\n\n if (mutated) writeYaml(path, cfg, ctx.dryRun);\n if (changes.length === 0) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no matching hook entries\" }];\n }\n return changes;\n }\n\n // ── Action surface (quick_commands map in the SAME config.yaml) ───────────\n // Each declared action emits `quick_commands.<id>: { type: \"exec\", command }`\n // where command is the home-bin action verb — a `/<id>` slash command that\n // runs it directly, bypassing the LLM. MERGE-preserve: never clobber another\n // entry. Set-if-absent per id; if `quick_commands.<id>` exists and is NOT\n // ours, skip-warn (the configPatch ownership semantics).\n\n override installActions(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getHookConfigPath(ctx);\n\n if (connector.platforms[HOST]?.actions === false) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"actions disabled for hermes\" }];\n }\n const triggers = this.actionTriggers(ctx);\n if (triggers.length === 0) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"connector declares no actions\" }];\n }\n\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n const cfg = readYaml<Record<string, unknown>>(path) ?? {};\n const bucket = this.objectBucket(cfg, QUICK_COMMANDS_KEY);\n const changes: ChangeRecord[] = [];\n let mutated = false;\n\n for (const trigger of triggers) {\n const desired: HermesQuickCommand = { type: \"exec\", command: trigger.command };\n const existing = bucket[trigger.id];\n if (existing !== undefined) {\n // Set-if-absent: only re-write an entry that is already OURS (an\n // exec entry whose command is our action verb for this connector).\n if (!this.isOurQuickCommand(existing, ctx)) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n path,\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id} exists and is not ours — skipped`,\n });\n continue;\n }\n if (JSON.stringify(existing) === JSON.stringify(desired)) {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path,\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id}`,\n });\n continue;\n }\n bucket[trigger.id] = desired;\n changes.push({\n platform: this.id,\n action: \"update\",\n path,\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id}`,\n });\n } else {\n bucket[trigger.id] = desired;\n changes.push({\n platform: this.id,\n action: \"create\",\n path,\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id}`,\n });\n }\n mutated = true;\n }\n\n if (mutated) writeYaml(path, cfg, dryRun);\n return changes;\n }\n\n override uninstallActions(ctx: InstallContext): ChangeRecord[] {\n const path = this.getHookConfigPath(ctx);\n const symlink = this.symlinkPathWarning(path);\n if (symlink) return [symlink];\n\n const cfg = readYaml<Record<string, unknown>>(path);\n const bucketRaw = cfg?.[QUICK_COMMANDS_KEY];\n if (\n !cfg ||\n !bucketRaw ||\n typeof bucketRaw !== \"object\" ||\n Array.isArray(bucketRaw)\n ) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no quick_commands section present\" }];\n }\n const bucket = bucketRaw as Record<string, unknown>;\n\n const changes: ChangeRecord[] = [];\n let mutated = false;\n // Remove ONLY our exec entries; leave foreign entries (and the map itself\n // when any remain) untouched.\n for (const id of Object.keys(bucket)) {\n if (!this.isOurQuickCommand(bucket[id], ctx)) continue;\n delete bucket[id];\n mutated = true;\n changes.push({\n platform: this.id,\n action: \"remove\",\n path,\n detail: `${QUICK_COMMANDS_KEY}.${id}`,\n });\n }\n\n if (mutated) {\n // Drop an emptied map so we leave no orphan key behind.\n if (Object.keys(bucket).length === 0) delete cfg[QUICK_COMMANDS_KEY];\n writeYaml(path, cfg, ctx.dryRun);\n }\n if (changes.length === 0) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no matching quick_commands entries\" }];\n }\n return changes;\n }\n\n /** True when a quick-command entry is OUR exec action verb for this connector. */\n private isOurQuickCommand(entry: unknown, ctx: InstallContext): boolean {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return false;\n const e = entry as Partial<HermesQuickCommand>;\n if (e.type !== \"exec\" || typeof e.command !== \"string\") return false;\n return isHomeBinActionCommand(e.command, ctx.homeBinPath, ctx.connector.id);\n }\n\n /** True when a hook command is ours (anchored home-bin + connector id). */\n private isOurCommand(command: string | undefined, ctx: InstallContext): boolean {\n return isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id);\n }\n\n private hookTimeout(server: ServerDef | undefined): number {\n const ms = server?.timeoutMs;\n if (typeof ms === \"number\" && ms > 0) {\n // Hermes documents `timeout: <seconds>` as \"default 60, capped at 300\";\n // a value > 300 is clamped with a warning by Hermes itself (see hooks.md\n // on NousResearch/hermes-agent). Clamp here so we never emit a value the\n // host would reject/cap. No documented minimum, but a positive timeoutMs\n // must not round down to 0 (an undocumented, ambiguous \"no/instant\"\n // timeout), so floor at 1s. In-range values (1000–300000ms) are unchanged.\n return Math.min(HOOK_TIMEOUT_MAX, Math.max(HOOK_TIMEOUT_MIN, Math.round(ms / 1000)));\n }\n return DEFAULT_HOOK_TIMEOUT;\n }\n\n // ── Content surface: skills (dir-per-skill SKILL.md) ─────────────────────\n // CONTENT-ONLY: pure native-file writers, mirroring goose/openclaw. No\n // runtime dispatch, no home-bin pointer, no telemetry wrap. Idempotent\n // (byte-identical → skip) via writeContentFile and reversible via\n // removeContentFile + removeDirIfEmpty. Honors platforms[\"hermes\"].skills\n // === false. No config.yaml entry — Hermes auto-discovers ~/.hermes/skills.\n //\n // USER scope only: ~/.hermes/skills/<name>/SKILL.md (the documented local,\n // read-write \"single source of truth\"). Project scope skip-warns — there is\n // no hermes-owned project skills dir documented.\n\n /** The user-scope skills ROOT dir (~/.hermes/skills). */\n private skillsDir(): string {\n return join(dirname(this.userConfigPath()), \"skills\");\n }\n\n /** Per-skill directory: ~/.hermes/skills/<name>. */\n private skillDir(name: string): string {\n return join(this.skillsDir(), name);\n }\n\n override installSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.skills === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for hermes\" }];\n }\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n if (ctx.scope !== \"user\") {\n // Hermes documents only the user-scope ~/.hermes/skills root; there is no\n // hermes-owned project skills dir. Report rather than guess a path.\n return [\n {\n platform: this.id,\n action: \"warn\",\n detail:\n `no project-scope skills dir on hermes (~/.hermes/skills is user-scope only); ` +\n `${connector.skills.length} skipped`,\n },\n ];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(skill.name);\n // Guard a skills path occupied by a regular FILE (would throw ENOTDIR on\n // mkdir): skip-warn rather than crash (the cline `.clinerules`-is-a-file\n // precedent). The skills root or the per-skill dir is the likely culprit.\n const blockingFile = this.firstFileOnSkillPath(dir);\n if (blockingFile !== null) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: blockingFile,\n detail: `${blockingFile} is a file, not a directory; skill \"${skill.name}\" skipped`,\n });\n continue;\n }\n changes.push(\n this.writeContentFile(join(dir, \"SKILL.md\"), renderSkillMd(skill), ctx.dryRun),\n );\n // Bundle any resource files beside SKILL.md (relative path → contents).\n // Defense-in-depth: skip+warn on any key that escapes the skill dir\n // (config-time validation already rejects these, but never trust input).\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\n });\n continue;\n }\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\n }\n }\n return changes;\n }\n\n /**\n * Walk from the skills root (~/.hermes/skills) down to `leaf` and return the\n * FIRST segment that exists as a regular file (a mkdir there throws ENOTDIR),\n * else null — so installSkills can skip-warn instead of crashing.\n */\n private firstFileOnSkillPath(leaf: string): string | null {\n const root = this.skillsDir();\n const segments: string[] = [];\n let cur = leaf;\n while (cur.length >= root.length) {\n segments.unshift(cur);\n if (cur === root) break;\n const parent = dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n for (const p of segments) {\n if (!existsSync(p)) return null;\n try {\n if (statSync(p).isFile()) return p;\n } catch {\n return null;\n }\n }\n return null;\n }\n\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n if (ctx.scope !== \"user\") {\n // Nothing is written at project scope (install skip-warned), so nothing\n // to clean — report the same scope reason as install for symmetry.\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"no project-scope skills dir on hermes (user-scope only); nothing to remove\",\n },\n ];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(skill.name);\n // Remove only the files we wrote (SKILL.md + declared resources), then the\n // skill dir itself when we own its full contents.\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\n for (const rel of Object.keys(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) continue; // never delete outside the skill dir\n changes.push(this.removeContentFile(target, ctx.dryRun));\n }\n // Only remove the skill dir when WE own its full contents — never rm -rf a\n // dir that still holds user-added / sibling-tool / shared files.\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\n }\n return changes;\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const path = this.getServerConfigPath(ctx);\n const id = ctx.connector.id;\n const homeBin = ctx.homeBinPath;\n const hookEvents = ctx.connector.hookEvents;\n return [\n {\n name: `${this.name}: config.yaml present`,\n check: () =>\n existsSync(path)\n ? { status: \"OK\", detail: path }\n : { status: \"FAIL\", detail: `not found: ${path}` },\n },\n {\n name: `${this.name}: ${MCP_ROOT_KEY}.${id} registered`,\n check: () => {\n // Only assert what the connector declares: a server-less connector\n // never writes an mcp entry, so its absence is healthy.\n if (!ctx.connector.server) return { status: \"OK\", detail: \"no MCP server declared\" };\n const cfg = readYaml<Record<string, unknown>>(path);\n const bucket = cfg?.[MCP_ROOT_KEY];\n const present =\n typeof bucket === \"object\" &&\n bucket !== null &&\n !Array.isArray(bucket) &&\n id in (bucket as Record<string, unknown>);\n return present\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${id}` }\n : { status: \"FAIL\", detail: `${MCP_ROOT_KEY}.${id} not found in ${path}` };\n },\n },\n {\n name: `${this.name}: hook command registered`,\n check: () => {\n if (hookEvents.length === 0) return { status: \"OK\", detail: \"no hooks declared\" };\n const cfg = readYaml<Record<string, unknown>>(path);\n const hooks = cfg?.[HOOKS_KEY];\n if (!hooks || typeof hooks !== \"object\" || Array.isArray(hooks)) {\n return { status: \"FAIL\", detail: `no ${HOOKS_KEY} section in ${path}` };\n }\n const registered = Object.values(hooks as Record<string, unknown>).some(\n (bucket) =>\n Array.isArray(bucket) &&\n (bucket as HermesHookEntry[]).some((e) =>\n isHomeBinHookCommand(e?.command, homeBin, id),\n ),\n );\n return registered\n ? { status: \"OK\", detail: \"hook command present\" }\n : { status: \"FAIL\", detail: `no hook for ${id} in ${path}` };\n },\n },\n ];\n }\n\n // ── Runtime: parse Hermes stdin JSON → normalized event ──────────────────\n\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\n const input = (raw ?? {}) as HermesWireInput;\n const base = {\n hostPlatform: HOST,\n connectorId: typeof input.connector === \"string\" ? input.connector : \"\",\n sessionId: typeof input.session_id === \"string\" ? input.session_id : \"\",\n ...(typeof input.cwd === \"string\" ? { projectDir: input.cwd } : {}),\n raw,\n } as const;\n\n switch (event) {\n case \"PreToolUse\": {\n const ev: PreToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n };\n return ev;\n }\n case \"PostToolUse\": {\n // VERIFIED (NousResearch/hermes-agent model_tools.py:856-871 +\n // shell_hooks.py::_serialize_payload): post_tool_call's `result` kwarg is\n // NOT allowlisted, so it lands at extra.result — top-level tool_output/\n // tool_response are NEVER emitted. Read extra.result for the output.\n const extra = input.extra ?? {};\n const out = toStringOrUndefined(extra.result);\n // VERIFIED: there is no `is_error` boolean. The host emits status\n // (\"ok\"|\"error\") + error_type/error_message (model_tools.py:815-821,\n // _tool_result_observer_fields), all under extra. Derive isError from a\n // non-ok status or a present error_type; emit only when determinable.\n const isError =\n typeof extra.status === \"string\"\n ? extra.status !== \"ok\"\n : typeof extra.error_type === \"string\"\n ? true\n : undefined;\n const ev: PostToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n ...(out !== undefined ? { toolOutput: out } : {}),\n ...(typeof isError === \"boolean\" ? { isError } : {}),\n };\n return ev;\n }\n case \"SessionStart\": {\n // VERIFIED (NousResearch/hermes-agent conversation_loop.py:340-344):\n // on_session_start is invoked with { session_id, model, platform } only —\n // there is NO `source`/start-reason kwarg (model/platform land under\n // extra). Hermes fires on_session_start ONLY for a brand-new session (not\n // on continuation), so the canonical \"startup\" is the single honest\n // value; there is no compact/resume/clear discriminator to normalize.\n const ev: SessionStartEvent = { ...base, source: \"startup\" };\n return ev;\n }\n case \"SessionEnd\": {\n // VERIFIED (NousResearch/hermes-agent turn_finalizer.py:415-423):\n // on_session_end is invoked with completed:bool / interrupted:bool (both\n // under extra) — there is NO top-level `reason` kwarg. Derive a reason\n // string from the two booleans (interrupted wins; else completed).\n const extra = input.extra ?? {};\n const reason =\n extra.interrupted === true\n ? \"interrupted\"\n : extra.completed === true\n ? \"completed\"\n : undefined;\n const ev: SessionEndEvent = {\n ...base,\n ...(reason !== undefined ? { reason } : {}),\n };\n return ev;\n }\n // The five arms below parse events Hermes does NOT fire (userPromptSubmit/\n // preCompact/stop/notification capabilities are false; PostCompact unset).\n // They stay as defensive normalizers for a manual/mis-routed dispatch, and\n // read from `extra` because that is the only envelope Hermes' serializer\n // produces — never an invented top-level field.\n case \"UserPromptSubmit\": {\n const extra = input.extra ?? {};\n const ev: UserPromptSubmitEvent = {\n ...base,\n prompt: typeof extra.prompt === \"string\" ? extra.prompt : \"\",\n };\n return ev;\n }\n case \"PreCompact\": {\n const extra = input.extra ?? {};\n const ev: PreCompactEvent = {\n ...base,\n ...(extra.trigger === \"auto\" || extra.trigger === \"manual\"\n ? { trigger: extra.trigger }\n : {}),\n };\n return ev;\n }\n case \"PostCompact\": {\n // Hermes does not fire PostCompact natively (postCompact unset →\n // warn-skip at install). Parsed defensively, mirroring PreCompact, so a\n // manual/mis-routed dispatch normalizes instead of hitting the guard.\n const extra = input.extra ?? {};\n const ev: PostCompactEvent = {\n ...base,\n ...(extra.trigger === \"auto\" || extra.trigger === \"manual\"\n ? { trigger: extra.trigger }\n : {}),\n };\n return ev;\n }\n case \"Stop\": {\n const extra = input.extra ?? {};\n const ev: StopEvent = {\n ...base,\n ...(typeof extra.stop_hook_active === \"boolean\"\n ? { stopHookActive: extra.stop_hook_active }\n : {}),\n };\n return ev;\n }\n case \"Notification\": {\n const extra = input.extra ?? {};\n const ev: NotificationEvent = {\n ...base,\n message: typeof extra.message === \"string\" ? extra.message : \"\",\n };\n return ev;\n }\n case \"SubagentStop\": {\n // VERIFIED (NousResearch/hermes-agent delegate_tool.py:2520-2529): the\n // subagent_stop invoke passes parent_session_id, child_session_id,\n // child_role, child_summary, child_status, duration_ms. Only\n // parent_session_id is allowlisted (→ top-level session_id); EVERY child_*\n // field nests under extra. So the id/role/output all come from extra.* —\n // top-level agent_id/agent_type/child_id/last_assistant_message/\n // stop_hook_active are NEVER emitted by Hermes. child_status (∈ completed/\n // failed/interrupted/error) stays accessible via `raw`.\n const extra = input.extra ?? {};\n const ev: SubagentStopEvent = {\n ...base,\n ...(typeof extra.child_session_id === \"string\"\n ? { agentId: extra.child_session_id }\n : {}),\n ...(typeof extra.child_role === \"string\"\n ? { agentType: extra.child_role }\n : {}),\n ...(typeof extra.child_summary === \"string\"\n ? { lastAssistantMessage: extra.child_summary }\n : {}),\n };\n return ev;\n }\n case \"PermissionRequest\":\n case \"PostToolUseFailure\":\n case \"SubagentStart\": {\n // No Hermes analog: pre_approval_request is observe-only (no decision\n // control), tool failures arrive merged into post_tool_call, and there\n // is no subagent_start. Install already skip-warns these; a runtime\n // dispatch is a mis-route — fail loudly.\n throw new Error(`unsupported hermes hook event: ${String(event)}`);\n }\n default: {\n const _never: never = event;\n throw new Error(`unsupported hermes hook event: ${String(_never)}`);\n }\n }\n }\n\n // ── Runtime: normalized response → Hermes native hook reply ──────────────\n // Hermes shell hooks read a JSON reply from stdout (exit 0 = allow). We emit a\n // Claude-like `hookSpecificOutput` wrapper; if Hermes' exact reply schema\n // differs, this is the single place to adjust the mapping.\n\n formatReply(event: HookEventName, response: HookResponse): HookReply {\n const decision = response.decision ?? \"allow\";\n\n if (decision === \"deny\") {\n // SubagentStop deny carries Stop semantics — it keeps the subagent\n // running with `reason` as its next instruction — and (like Claude's\n // Stop class) is honored only as the TOP-LEVEL {\"decision\":\"block\",\n // \"reason\"}, not as a permissionDecision envelope.\n if (event === \"SubagentStop\") {\n return this.stdout({\n decision: \"block\",\n reason: response.reason ?? \"Blocked by hook\",\n });\n }\n return this.stdout({\n hookSpecificOutput: {\n hookEventName: event,\n permissionDecision: \"deny\",\n permissionDecisionReason: response.reason ?? \"Blocked by hook\",\n },\n });\n }\n\n if (decision === \"ask\") {\n return this.stdout({\n hookSpecificOutput: {\n hookEventName: event,\n permissionDecision: \"ask\",\n permissionDecisionReason: response.reason ?? \"Confirmation required by hook\",\n },\n });\n }\n\n if (decision === \"context\" && response.additionalContext) {\n return this.stdout({\n hookSpecificOutput: { hookEventName: event, additionalContext: response.additionalContext },\n });\n }\n\n // allow / modify (unsupported — shell hooks can't rewrite args) / void.\n return { exitCode: 0 };\n }\n\n private stdout(payload: unknown): HookReply {\n return { exitCode: 0, stdout: JSON.stringify(payload) };\n }\n\n // ── Internal helpers ──────────────────────────────────────────────────────\n\n /** Resolve the per-platform server override into an effective ServerDef. */\n private effectiveServer(ctx: InstallContext): ServerDef | undefined {\n const override = ctx.connector.platforms[this.id]?.server;\n if (override === false) return undefined;\n const base = ctx.connector.server;\n if (!base) return undefined;\n return override && typeof override === \"object\" ? { ...base, ...override } : base;\n }\n\n /** Get-or-create an object bucket (map) at `cfg[key]`. */\n private objectBucket(cfg: Record<string, unknown>, key: string): Record<string, unknown> {\n const existing = cfg[key];\n if (existing && typeof existing === \"object\" && !Array.isArray(existing)) {\n return existing as Record<string, unknown>;\n }\n const fresh: Record<string, unknown> = {};\n cfg[key] = fresh;\n return fresh;\n }\n\n /** Get-or-create the hooks map at `cfg.hooks`. */\n private hooksBucket(cfg: Record<string, unknown>): Record<string, unknown> {\n return this.objectBucket(cfg, HOOKS_KEY);\n }\n}\n\n/** Coerce an unknown value into a string for the normalized event. */\nfunction toStringOrUndefined(value: unknown): string | undefined {\n if (value == null) return undefined;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport const adapter = new HermesAdapter();\nexport default adapter;\n"],"mappings":"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","names":["entry"]}
@@ -1,25 +1,25 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  fail
4
- } from "./chunk-IKEXNI2W.js";
5
- import "./chunk-CFM3JKIR.js";
4
+ } from "./chunk-NXR4HM5N.js";
5
+ import "./chunk-CSRBMJLU.js";
6
6
  import "./chunk-OP4KBXUO.js";
7
7
  import "./chunk-7QRUZAUG.js";
8
- import "./chunk-5M2SMDA4.js";
8
+ import "./chunk-GCRRX4MO.js";
9
9
  import {
10
10
  isNativeHookDeclared,
11
11
  runHook,
12
12
  runNativeHook
13
- } from "./chunk-B47MDOV3.js";
14
- import "./chunk-F4DSMVZ7.js";
13
+ } from "./chunk-E45SUUD7.js";
14
+ import "./chunk-D6ZJS4ND.js";
15
15
  import "./chunk-KHO5WNTP.js";
16
- import "./chunk-UXG64P6R.js";
17
- import "./chunk-WZWK4ICE.js";
18
- import "./chunk-SBV2QJ5C.js";
19
- import "./chunk-L7ESV37V.js";
16
+ import "./chunk-RQCBBLTA.js";
17
+ import "./chunk-UVBAH263.js";
18
+ import "./chunk-LS65GL2P.js";
19
+ import "./chunk-7CZKXXBD.js";
20
20
  import "./chunk-TO57WYBB.js";
21
- import "./chunk-ZY25RG4Y.js";
22
- import "./chunk-QY42WGBX.js";
21
+ import "./chunk-ALVXORZM.js";
22
+ import "./chunk-2HCJV6UO.js";
23
23
 
24
24
  // src/cli/commands/hook.ts
25
25
  import { parseArgs } from "util";
@@ -93,4 +93,4 @@ export {
93
93
  HOOK_EVENTS,
94
94
  run
95
95
  };
96
- //# sourceMappingURL=hook-S3DNNGZX.js.map
96
+ //# sourceMappingURL=hook-7IUPIHCZ.js.map
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { A as ActionDef, C as CommandDef, c as ConfigPatchDef, d as ConnectorConfig, R as ResolvedConnector, e as HookEventName, H as HookDefinition, M as MemoryDef, N as NativeHookDef, w as SkillDef, y as StatuslineDef, B as SubagentDef } from './types-COSBYpKs.js';
2
- export { a as ActionResult, b as AuthSpec, V as ChangeRecord, W as DetectedPlatform, X as DiagnosticResult, E as EventPayloadMap, f as HookParadigm, g as HookResponse, h as HooksConfig, i as HostCtx, Y as InstallResult, I as InstallScope, j as NativeHookEvent, k as NotificationEvent, l as PermissionRequestEvent, m as PlatformCapabilities, P as PlatformId, n as PlatformMemoryOverride, o as PlatformOverride, p as PostToolUseEvent, q as PostToolUseFailureEvent, r as PreCompactEvent, s as PreToolUseEvent, S as ServerDef, u as SessionEndEvent, v as SessionStartEvent, x as StatuslineContext, z as StopEvent, D as SubagentStartEvent, F as SubagentStopEvent, T as TelemetryAccessor, K as TelemetryConfig, L as TelemetryUsageSummary, O as ToolFilter, Q as Transport, U as UserPromptSubmitEvent } from './types-COSBYpKs.js';
1
+ import { A as ActionDef, C as CommandDef, c as ConfigPatchDef, d as ConnectorConfig, R as ResolvedConnector, e as HookEventName, H as HookDefinition, M as MemoryDef, N as NativeHookDef, w as SkillDef, y as StatuslineDef, B as SubagentDef } from './types-ChUrvw0j.js';
2
+ export { a as ActionResult, b as AuthSpec, V as ChangeRecord, W as DetectedPlatform, X as DiagnosticResult, E as EventPayloadMap, f as HookParadigm, g as HookResponse, h as HooksConfig, i as HostCtx, Y as InstallResult, I as InstallScope, j as NativeHookEvent, k as NotificationEvent, l as PermissionRequestEvent, m as PlatformCapabilities, P as PlatformId, n as PlatformMemoryOverride, o as PlatformOverride, p as PostToolUseEvent, q as PostToolUseFailureEvent, r as PreCompactEvent, s as PreToolUseEvent, S as ServerDef, u as SessionEndEvent, v as SessionStartEvent, x as StatuslineContext, z as StopEvent, D as SubagentStartEvent, F as SubagentStopEvent, T as TelemetryAccessor, K as TelemetryConfig, L as TelemetryUsageSummary, O as ToolFilter, Q as Transport, U as UserPromptSubmitEvent } from './types-ChUrvw0j.js';
3
3
 
4
4
  /**
5
5
  * core/define-connector — the public write-once entry point.
package/dist/index.js CHANGED
@@ -11,11 +11,11 @@ import {
11
11
  defineSkill,
12
12
  defineStatusline,
13
13
  defineSubagent
14
- } from "./chunk-WZWK4ICE.js";
15
- import "./chunk-SBV2QJ5C.js";
16
- import "./chunk-L7ESV37V.js";
17
- import "./chunk-ZY25RG4Y.js";
18
- import "./chunk-QY42WGBX.js";
14
+ } from "./chunk-UVBAH263.js";
15
+ import "./chunk-LS65GL2P.js";
16
+ import "./chunk-7CZKXXBD.js";
17
+ import "./chunk-ALVXORZM.js";
18
+ import "./chunk-2HCJV6UO.js";
19
19
  export {
20
20
  ConnectorConfigError,
21
21
  defineAction,
@@ -3,35 +3,35 @@ import {
3
3
  installConnector,
4
4
  installViaMarketplace,
5
5
  parseInstallMethod
6
- } from "./chunk-VPSHGDDQ.js";
7
- import "./chunk-E3GWKJU5.js";
8
- import "./chunk-M3H7PQWT.js";
9
- import "./chunk-XW46WVR2.js";
6
+ } from "./chunk-IZ4XQ23W.js";
7
+ import "./chunk-ZEFUDBTY.js";
8
+ import "./chunk-AXAHW2KU.js";
9
+ import "./chunk-ZSMGHEB5.js";
10
10
  import {
11
11
  fail,
12
12
  parseScope,
13
13
  parseTargets,
14
14
  print,
15
15
  renderInstallResult
16
- } from "./chunk-IKEXNI2W.js";
16
+ } from "./chunk-NXR4HM5N.js";
17
17
  import "./chunk-7QRUZAUG.js";
18
- import "./chunk-5M2SMDA4.js";
18
+ import "./chunk-GCRRX4MO.js";
19
19
  import "./chunk-KHO5WNTP.js";
20
20
  import {
21
21
  findConnectorConfig,
22
22
  loadConnectorFromPath
23
- } from "./chunk-UXG64P6R.js";
24
- import "./chunk-WZWK4ICE.js";
25
- import "./chunk-SBV2QJ5C.js";
26
- import "./chunk-L7ESV37V.js";
23
+ } from "./chunk-RQCBBLTA.js";
24
+ import "./chunk-UVBAH263.js";
25
+ import "./chunk-LS65GL2P.js";
26
+ import "./chunk-7CZKXXBD.js";
27
27
  import "./chunk-OPXAP3AC.js";
28
28
  import "./chunk-UM5S7DKK.js";
29
29
  import "./chunk-H53QZQJI.js";
30
30
  import "./chunk-DBQMX75U.js";
31
- import "./chunk-A767JFHW.js";
31
+ import "./chunk-RHML2NOB.js";
32
32
  import "./chunk-TO57WYBB.js";
33
- import "./chunk-ZY25RG4Y.js";
34
- import "./chunk-QY42WGBX.js";
33
+ import "./chunk-ALVXORZM.js";
34
+ import "./chunk-2HCJV6UO.js";
35
35
 
36
36
  // src/cli/commands/install.ts
37
37
  import { parseArgs } from "util";
@@ -93,4 +93,4 @@ async function run(argv) {
93
93
  export {
94
94
  run
95
95
  };
96
- //# sourceMappingURL=install-7SUJFRYO.js.map
96
+ //# sourceMappingURL=install-EP6GPQ65.js.map
@@ -1,4 +1,4 @@
1
- import { m as PlatformCapabilities, P as PlatformId } from './types-COSBYpKs.js';
1
+ import { m as PlatformCapabilities, P as PlatformId } from './types-ChUrvw0j.js';
2
2
 
3
3
  /**
4
4
  * sdk/introspect — host-capability introspection over the adapter registry.
@@ -5,16 +5,16 @@ import {
5
5
  import {
6
6
  BaseAdapter,
7
7
  renderSkillMd
8
- } from "./chunk-A767JFHW.js";
8
+ } from "./chunk-RHML2NOB.js";
9
9
  import {
10
10
  buildHomeBinHookCommand,
11
11
  isHomeBinHookCommand
12
12
  } from "./chunk-TO57WYBB.js";
13
- import "./chunk-ZY25RG4Y.js";
14
- import "./chunk-QY42WGBX.js";
13
+ import "./chunk-ALVXORZM.js";
14
+ import "./chunk-2HCJV6UO.js";
15
15
 
16
16
  // src/adapters/jetbrains-copilot/index.ts
17
- import { existsSync, rmSync } from "fs";
17
+ import { existsSync } from "fs";
18
18
  import { dirname, join } from "path";
19
19
  var HOST = "jetbrains-copilot";
20
20
  var JETBRAINS_HOOKS_VERSION = 1;
@@ -189,6 +189,8 @@ var JetBrainsCopilotAdapter = class extends BaseAdapter {
189
189
  ];
190
190
  }
191
191
  const hooksPath = this.getHookConfigPath(ctx);
192
+ const symlink = this.symlinkPathWarning(hooksPath);
193
+ if (symlink) return [symlink];
192
194
  const file = this.readJson(hooksPath) ?? {};
193
195
  const __skip = this.malformedHookRootSkip(hooksPath, file.hooks);
194
196
  if (__skip) return [__skip];
@@ -279,6 +281,8 @@ var JetBrainsCopilotAdapter = class extends BaseAdapter {
279
281
  }
280
282
  uninstallHooks(ctx) {
281
283
  const hooksPath = this.getHookConfigPath(ctx);
284
+ const symlink = this.symlinkPathWarning(hooksPath);
285
+ if (symlink) return [symlink];
282
286
  const file = this.readJson(hooksPath);
283
287
  const hooks = file?.hooks;
284
288
  if (!file || !hooks) {
@@ -313,13 +317,14 @@ var JetBrainsCopilotAdapter = class extends BaseAdapter {
313
317
  }
314
318
  if (mutated) {
315
319
  if (Object.keys(hooks).length === 0) {
316
- if (!ctx.dryRun) rmSync(hooksPath, { force: true });
317
- changes.push({
318
- platform: this.id,
319
- action: "remove",
320
- path: hooksPath,
321
- detail: "removed empty connector hooks file"
322
- });
320
+ changes.push(
321
+ this.removeManagedFile(
322
+ hooksPath,
323
+ ctx.dryRun,
324
+ "removed empty connector hooks file",
325
+ "no hooks file present"
326
+ )
327
+ );
323
328
  changes.push(this.removeDirIfEmpty(dirname(hooksPath), ctx.dryRun));
324
329
  } else {
325
330
  this.writeJson(hooksPath, file, ctx.dryRun);
@@ -544,13 +549,12 @@ var JetBrainsCopilotAdapter = class extends BaseAdapter {
544
549
  return ev;
545
550
  }
546
551
  case "PostToolUse": {
547
- const toolOutput = toolResponseToString(input.tool_response) ?? input.tool_output ?? input.error_message;
552
+ const toolOutput = toolResponseToString(input.tool_response);
548
553
  const ev = {
549
554
  ...base,
550
555
  toolName: input.tool_name ?? "",
551
556
  toolInput: input.tool_input ?? {},
552
- ...toolOutput !== void 0 ? { toolOutput } : {},
553
- ...input.error_message ? { isError: true } : {}
557
+ ...toolOutput !== void 0 ? { toolOutput } : {}
554
558
  };
555
559
  return ev;
556
560
  }
@@ -684,4 +688,4 @@ export {
684
688
  adapter,
685
689
  jetbrains_copilot_default as default
686
690
  };
687
- //# sourceMappingURL=jetbrains-copilot-M2LHJBAW.js.map
691
+ //# sourceMappingURL=jetbrains-copilot-MZO2RQGJ.js.map