better-dsh 0.2.4 → 0.2.5

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 (1235) hide show
  1. package/cordis.patch.yml +58 -16
  2. package/docs/10_plans/2026-09-23-remote-execution-framework.md +236 -0
  3. package/docs/10_plans/2026-09-23-remote-framework-impl.md +2083 -0
  4. package/docs/10_plans/2026-09-26-lsp-ast-reminder.md +64 -0
  5. package/docs/20_specs/agent/spec.md +54 -0
  6. package/docs/20_specs/ast/spec.md +34 -0
  7. package/docs/20_specs/compaction-recall/spec.md +46 -0
  8. package/docs/20_specs/ctx/spec.md +107 -0
  9. package/docs/20_specs/dsh/spec.md +47 -0
  10. package/docs/20_specs/dvc/spec.md +87 -0
  11. package/docs/20_specs/escalation-guidance/spec.md +44 -0
  12. package/docs/20_specs/fs-scheme-resolution/spec.md +37 -0
  13. package/docs/20_specs/hash-edit/spec.md +41 -0
  14. package/docs/20_specs/http-read/spec.md +73 -0
  15. package/docs/20_specs/kernel-provisioning/spec.md +53 -0
  16. package/docs/20_specs/lsp/spec.md +121 -0
  17. package/docs/20_specs/mobile-layout/spec.md +108 -0
  18. package/docs/20_specs/model-failover/spec.md +20 -0
  19. package/docs/20_specs/plugins-page-components/spec.md +79 -0
  20. package/docs/20_specs/preact-ui-shell/spec.md +22 -0
  21. package/docs/20_specs/repl-dispatch-resilience/spec.md +21 -0
  22. package/docs/20_specs/skill/spec.md +58 -0
  23. package/docs/20_specs/tool-surface/spec.md +222 -0
  24. package/docs/20_specs/url-schema/spec.md +148 -0
  25. package/docs/20_specs/web-trust-fence/spec.md +43 -0
  26. package/docs/50_test-reports/2026-09-17-plugins/351/241/265/345/205/255/347/273/204/344/273/266/346/213/206/345/210/206/345/256/236/346/265/213/346/212/245/345/221/212.md +76 -0
  27. package/docs/50_test-reports/2026-09-22-4988/345/217/214/345/271/263/351/235/242/345/220/257/345/212/250/344/277/256/345/244/215/345/256/236/346/265/213/346/212/245/345/221/212.md +76 -0
  28. package/docs/50_test-reports/2026-09-22-better-dsh/347/273/204/344/273/266/347/203/255/346/217/222/346/213/224/344/270/216/344/276/235/350/265/226/347/272/247/350/201/224/345/256/236/346/265/213/346/212/245/345/221/212.md +134 -0
  29. package/docs/50_test-reports/2026-09-23-remote-framework/345/256/236/346/265/213/346/212/245/345/221/212.md +92 -0
  30. package/docs/50_test-reports/2026-09-23-remote-framework/347/254/254/344/270/200/344/272/272/347/247/260/345/244/215/346/265/213/346/212/245/345/221/212.md +125 -0
  31. package/docs/50_test-reports/2026-09-23-ssh/345/267/245/345/205/267assisted-pty/344/274/232/350/257/235framing/345/256/236/346/265/213/346/212/245/345/221/212.md +207 -0
  32. package/docs/50_test-reports/2026-09-24-v0.1.7-rc.1/345/257/271/351/275/220/350/275/256-compaction/344/270/216failover/350/256/276/347/275/256/351/235/242/344/277/256/345/244/215/345/256/236/346/265/213/346/212/245/345/221/212.md +65 -0
  33. package/docs/50_test-reports/2026-09-27-lsp-ast-reminder-4999/345/256/236/346/265/213/346/212/245/345/221/212.md +53 -0
  34. package/docs/50_test-reports/2026-09-28-ctx-scheme/351/225/277/344/274/232/350/257/235utility/345/256/236/346/265/213/346/212/245/345/221/212.md +155 -0
  35. package/docs/50_test-reports/2026-10-01-v0.2.4d-web-password-gate/345/256/236/346/265/213/346/212/245/345/221/212.md +105 -0
  36. package/docs/50_test-reports/2026-10-02-ctx-navigation/345/256/236/346/265/213/346/212/245/345/221/212.md +137 -0
  37. package/docs/50_test-reports/2026-10-02-v0.2.0-rc.2/345/257/271/351/275/220/350/275/256/345/256/236/346/265/213/346/212/245/345/221/212.md +38 -0
  38. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/.tools/MdxPage-CTY7atqe.js +11 -0
  39. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/.tools/extract_omp.mjs +42 -0
  40. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/.tools/fetch_pi.py +52 -0
  41. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/.tools/jsx-runtime-BHwPObl3.js +13 -0
  42. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/.tools/omp_extracted.json +1 -0
  43. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/.tools/omp_pages.txt +35 -0
  44. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/.tools/package.json +1 -0
  45. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/.tools/pi_convert.py +49 -0
  46. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/.tools/pi_pages.txt +30 -0
  47. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/.tools/serialize_omp.py +250 -0
  48. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/README.md +80 -0
  49. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/Overview.md +88 -0
  50. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/acp.md +151 -0
  51. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/advisor.md +185 -0
  52. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/agents-and-roles.md +168 -0
  53. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/approvals.md +200 -0
  54. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/cli.md +381 -0
  55. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/code-intelligence.md +225 -0
  56. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/collab.md +207 -0
  57. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/commit.md +169 -0
  58. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/compaction.md +195 -0
  59. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/computer.md +224 -0
  60. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/context-files.md +184 -0
  61. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/custom-models.md +284 -0
  62. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/custom-tools.md +248 -0
  63. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/debugging.md +254 -0
  64. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/editing.md +157 -0
  65. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/env.md +552 -0
  66. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/extension-authoring.md +378 -0
  67. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/files.md +144 -0
  68. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/github.md +175 -0
  69. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/goal.md +156 -0
  70. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/handoff.md +139 -0
  71. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/hooks.md +257 -0
  72. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/keybindings.md +204 -0
  73. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/magic-keywords.md +135 -0
  74. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/marketplace.md +269 -0
  75. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/mcp-authoring.md +243 -0
  76. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/mcp.md +260 -0
  77. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/memory.md +306 -0
  78. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/modes.md +214 -0
  79. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/pages.txt +56 -0
  80. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/plan.md +126 -0
  81. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/plugins.md +287 -0
  82. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/prewalk.md +122 -0
  83. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/prompt-templates.md +149 -0
  84. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/providers.md +229 -0
  85. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/quickstart.md +117 -0
  86. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/review.md +248 -0
  87. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/roles.md +247 -0
  88. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/rpc.md +523 -0
  89. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/sdk.md +260 -0
  90. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/secrets.md +199 -0
  91. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/security.md +260 -0
  92. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/session-format.md +254 -0
  93. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/session-tree.md +135 -0
  94. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/sessions.md +223 -0
  95. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/settings.md +290 -0
  96. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/skills.md +187 -0
  97. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/slash.md +328 -0
  98. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/subagent-authoring.md +165 -0
  99. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/subagents.md +149 -0
  100. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/themes.md +230 -0
  101. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/tools.md +120 -0
  102. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/ttsr.md +242 -0
  103. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/using.md +214 -0
  104. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/vibe.md +187 -0
  105. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/omp/web.md +233 -0
  106. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/compaction.md +427 -0
  107. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/containerization.md +162 -0
  108. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/custom-provider.md +782 -0
  109. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/development.md +96 -0
  110. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/environment-variables.md +104 -0
  111. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/extensions.md +3058 -0
  112. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/index.md +89 -0
  113. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/json.md +105 -0
  114. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/keybindings.md +244 -0
  115. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/llama-cpp.md +106 -0
  116. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/models.md +587 -0
  117. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/packages.md +234 -0
  118. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/pages.txt +30 -0
  119. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/prompt-templates.md +101 -0
  120. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/providers.md +327 -0
  121. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/quickstart.md +172 -0
  122. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/rpc.md +1679 -0
  123. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/sdk.md +1239 -0
  124. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/security.md +64 -0
  125. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/session-format.md +454 -0
  126. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/sessions.md +150 -0
  127. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/settings.md +374 -0
  128. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/shell-aliases.md +18 -0
  129. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/skills.md +241 -0
  130. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/terminal-setup.md +199 -0
  131. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/termux.md +135 -0
  132. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/themes.md +328 -0
  133. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/tmux.md +68 -0
  134. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/tui.md +965 -0
  135. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/usage.md +315 -0
  136. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/pi-and-omp/pi/windows.md +44 -0
  137. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/SKILL.md +147 -0
  138. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch01-user-guide.md +123 -0
  139. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch02-plugin-basics.md +127 -0
  140. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch03-plugin-framework-practice.md +120 -0
  141. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch04-cordis-fundamentals.md +129 -0
  142. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch05-cordis-api.md +115 -0
  143. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch06-architecture.md +109 -0
  144. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch07-capability-seams.md +97 -0
  145. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch08-internals-pipelines.md +111 -0
  146. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch09-api-gateway.md +106 -0
  147. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch10-config-catalog.md +97 -0
  148. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch11-tool-catalog.md +121 -0
  149. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch12-persistence-catalog.md +109 -0
  150. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch13-subsystems-core-session.md +106 -0
  151. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch14-subsystems-agent-loop.md +111 -0
  152. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch15-subsystems-tool-execution.md +106 -0
  153. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch16-subsystems-session-data.md +132 -0
  154. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch17-subsystems-llm-streaming.md +128 -0
  155. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch18-subsystems-web-ui.md +142 -0
  156. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch19-cookbook.md +149 -0
  157. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch20-development-testing.md +87 -0
  158. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch21-postmortems.md +82 -0
  159. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/chapters/ch22-i18n.md +86 -0
  160. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/cheatsheet.md +67 -0
  161. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/glossary.md +57 -0
  162. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/skill/patterns.md +88 -0
  163. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/AGENTS.md +75 -0
  164. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/agent-lifecycle.md +84 -0
  165. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/agent-lifecycle.zh.md +86 -0
  166. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/api-gateway.md +164 -0
  167. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/api-gateway.zh.md +164 -0
  168. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/architecture.md +150 -0
  169. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/architecture.zh.md +154 -0
  170. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/capability-seams.md +543 -0
  171. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/capability-seams.zh.md +545 -0
  172. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/config-catalog.md +3473 -0
  173. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/config-catalog.zh.md +3474 -0
  174. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-a-package.md +117 -0
  175. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-a-package.zh.md +119 -0
  176. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-a-remote-api.md +197 -0
  177. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-a-remote-api.zh.md +197 -0
  178. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-a-settings-card.md +102 -0
  179. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-a-settings-card.zh.md +102 -0
  180. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-a-tool.md +101 -0
  181. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-a-tool.zh.md +103 -0
  182. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-a-vendored-package.md +59 -0
  183. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-a-vendored-package.zh.md +59 -0
  184. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-an-llm-adapter.md +43 -0
  185. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/adding-an-llm-adapter.zh.md +43 -0
  186. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/extension-cookbook.md +132 -0
  187. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/extension-cookbook.zh.md +136 -0
  188. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/maintaining-dsh-code-review.md +64 -0
  189. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/maintaining-dsh-code-review.zh.md +64 -0
  190. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
  191. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
  192. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-api/context.md +364 -0
  193. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-api/context.zh.md +366 -0
  194. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-api/events.md +207 -0
  195. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-api/events.zh.md +209 -0
  196. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-api/fiber.md +375 -0
  197. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-api/fiber.zh.md +377 -0
  198. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-api/inherited.md +39 -0
  199. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-api/registry.md +152 -0
  200. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-api/registry.zh.md +154 -0
  201. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-api/service.md +102 -0
  202. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-api/service.zh.md +104 -0
  203. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-primer.md +45 -0
  204. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-primer.zh.md +51 -0
  205. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/01-first-plugin.md +95 -0
  206. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/01-first-plugin.zh.md +95 -0
  207. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  208. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/02-lifecycle-and-effects.zh.md +98 -0
  209. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/03-services.md +98 -0
  210. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/03-services.zh.md +98 -0
  211. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/04-events.md +144 -0
  212. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/04-events.zh.md +144 -0
  213. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/05-config.md +84 -0
  214. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/05-config.zh.md +84 -0
  215. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/06-composition-and-hmr.md +113 -0
  216. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/06-composition-and-hmr.zh.md +113 -0
  217. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/07-into-the-harness.md +108 -0
  218. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/07-into-the-harness.zh.md +108 -0
  219. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/index.md +60 -0
  220. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/cordis-tutorial/index.zh.md +62 -0
  221. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/deepseek-llm-api-wire-extensions.md +163 -0
  222. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/deepseek-llm-api-wire-extensions.zh.md +163 -0
  223. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/defensive-patterns.md +33 -0
  224. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/defensive-patterns.zh.md +35 -0
  225. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/development.md +167 -0
  226. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/development.zh.md +173 -0
  227. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/event-producer-consumer.md +86 -0
  228. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/event-producer-consumer.zh.md +88 -0
  229. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/glossary.md +45 -0
  230. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/glossary.zh.md +45 -0
  231. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/graph-atlas.md +22 -0
  232. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/graph-atlas.zh.md +24 -0
  233. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/i18n/README.md +60 -0
  234. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/i18n/README.zh.md +62 -0
  235. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/i18n/style-samples.md +87 -0
  236. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/i18n/terminology.md +214 -0
  237. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/i18n/translation-prompt.md +263 -0
  238. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/i18n/translation-rules.md +69 -0
  239. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/i18n/translation-rules.zh.md +69 -0
  240. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/module-graph.md +1411 -0
  241. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/module-graph.zh.md +1413 -0
  242. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/persistence-catalog.md +1075 -0
  243. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/persistence-catalog.zh.md +1077 -0
  244. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/postmortem/0001-acp-default-export-drops-inject.md +113 -0
  245. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
  246. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
  247. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
  248. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
  249. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
  250. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
  251. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
  252. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/postmortem/README.md +18 -0
  253. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/postmortem/README.zh.md +18 -0
  254. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/rescope.md +53 -0
  255. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/rescope.zh.md +53 -0
  256. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/README.md +61 -0
  257. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/README.zh.md +61 -0
  258. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/agent-team.md +207 -0
  259. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/agent-team.zh.md +207 -0
  260. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/approval.md +170 -0
  261. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/approval.zh.md +170 -0
  262. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/attachment.md +351 -0
  263. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/attachment.zh.md +351 -0
  264. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/client-modules.md +168 -0
  265. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/client-modules.zh.md +168 -0
  266. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/code-runtime.md +195 -0
  267. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/code-runtime.zh.md +195 -0
  268. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/commands.md +219 -0
  269. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/commands.zh.md +219 -0
  270. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/compaction.md +238 -0
  271. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/compaction.zh.md +238 -0
  272. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/conversation.md +258 -0
  273. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/conversation.zh.md +258 -0
  274. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/core.md +1209 -0
  275. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/core.zh.md +1219 -0
  276. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/credentials.md +329 -0
  277. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/credentials.zh.md +329 -0
  278. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/extensions.md +382 -0
  279. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/extensions.zh.md +382 -0
  280. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/feedback.md +266 -0
  281. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/feedback.zh.md +266 -0
  282. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/filesystem.md +505 -0
  283. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/filesystem.zh.md +505 -0
  284. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/goal.md +277 -0
  285. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/goal.zh.md +277 -0
  286. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/invariants.md +88 -0
  287. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/invariants.zh.md +88 -0
  288. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/jobs.md +290 -0
  289. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/jobs.zh.md +290 -0
  290. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/llm-streaming.md +1080 -0
  291. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/llm-streaming.zh.md +1086 -0
  292. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/lsp.md +202 -0
  293. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/lsp.zh.md +202 -0
  294. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/permission-presets.md +131 -0
  295. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/permission-presets.zh.md +131 -0
  296. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/persistence.md +395 -0
  297. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/persistence.zh.md +395 -0
  298. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/plan.md +87 -0
  299. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/plan.zh.md +87 -0
  300. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/sandbox.md +220 -0
  301. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/sandbox.zh.md +220 -0
  302. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/schedule.md +192 -0
  303. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/schedule.zh.md +192 -0
  304. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/scope.md +59 -0
  305. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/scope.zh.md +59 -0
  306. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session-projection.md +354 -0
  307. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session-projection.zh.md +354 -0
  308. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session-query.md +509 -0
  309. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session-query.zh.md +509 -0
  310. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session-reference.md +219 -0
  311. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session-reference.zh.md +219 -0
  312. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session-telemetry.md +194 -0
  313. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session-telemetry.zh.md +194 -0
  314. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session-title.md +204 -0
  315. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session-title.zh.md +204 -0
  316. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session.md +1155 -0
  317. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/session.zh.md +1159 -0
  318. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/settings.md +405 -0
  319. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/settings.zh.md +405 -0
  320. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/shell.md +303 -0
  321. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/shell.zh.md +303 -0
  322. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/skills.md +354 -0
  323. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/skills.zh.md +354 -0
  324. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/slots.md +175 -0
  325. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/slots.zh.md +175 -0
  326. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/spill.md +117 -0
  327. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/spill.zh.md +117 -0
  328. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/storage.md +260 -0
  329. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/storage.zh.md +260 -0
  330. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/subagent.md +766 -0
  331. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/subagent.zh.md +770 -0
  332. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/subprocess.md +324 -0
  333. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/subprocess.zh.md +324 -0
  334. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/system-prompt.md +220 -0
  335. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/system-prompt.zh.md +220 -0
  336. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/terminal.md +184 -0
  337. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/terminal.zh.md +184 -0
  338. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/todo.md +32 -0
  339. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/todo.zh.md +32 -0
  340. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/token-meter.md +105 -0
  341. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/token-meter.zh.md +105 -0
  342. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/tools.md +720 -0
  343. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/tools.zh.md +720 -0
  344. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/typert.md +343 -0
  345. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/typert.zh.md +343 -0
  346. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/user-questions.md +178 -0
  347. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/user-questions.zh.md +178 -0
  348. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/web-client.md +95 -0
  349. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/web-client.zh.md +95 -0
  350. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/web-server.md +154 -0
  351. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/web-server.zh.md +154 -0
  352. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/web.md +206 -0
  353. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/web.zh.md +206 -0
  354. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/webhook.md +70 -0
  355. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/webhook.zh.md +70 -0
  356. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/workflow.md +278 -0
  357. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/workflow.zh.md +278 -0
  358. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/workspace.md +321 -0
  359. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/subsystems/workspace.zh.md +321 -0
  360. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/testing.md +54 -0
  361. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/testing.zh.md +54 -0
  362. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/tool-catalog.md +2225 -0
  363. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/tool-catalog.zh.md +2233 -0
  364. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/tool-execution-pipeline.md +62 -0
  365. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/tool-execution-pipeline.zh.md +64 -0
  366. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/basic/config.md +106 -0
  367. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/basic/config.zh.md +106 -0
  368. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/basic/index.md +144 -0
  369. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/basic/index.zh.md +144 -0
  370. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/basic/publish.md +183 -0
  371. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/basic/publish.zh.md +183 -0
  372. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/basic/tool.md +52 -0
  373. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/basic/tool.zh.md +52 -0
  374. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/framework/events.md +143 -0
  375. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/framework/events.zh.md +143 -0
  376. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/framework/index.md +137 -0
  377. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/framework/index.zh.md +137 -0
  378. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/framework/service.md +148 -0
  379. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/framework/service.zh.md +150 -0
  380. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/practice/dynamic-cordis.md +15 -0
  381. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/practice/dynamic-cordis.zh.md +15 -0
  382. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/practice/index.md +155 -0
  383. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/practice/index.zh.md +155 -0
  384. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/practice/llm-adapter.md +189 -0
  385. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/develop/practice/llm-adapter.zh.md +189 -0
  386. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/github-review.md +102 -0
  387. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/github-review.zh.md +102 -0
  388. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/index.md +30 -0
  389. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/index.zh.md +30 -0
  390. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/mcp-memory.md +101 -0
  391. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/mcp-memory.zh.md +101 -0
  392. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/network-proxy.md +85 -0
  393. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/network-proxy.zh.md +85 -0
  394. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/providers.md +190 -0
  395. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/providers.zh.md +190 -0
  396. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/python-sdk.md +150 -0
  397. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/python-sdk.zh.md +150 -0
  398. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/schedule.md +21 -0
  399. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/guide/schedule.zh.md +21 -0
  400. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/index.md +11 -0
  401. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/user/index.zh.md +11 -0
  402. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/web-styling.md +29 -0
  403. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/docs/web-styling.zh.md +29 -0
  404. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/site-pages-map.txt +234 -0
  405. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src/site-pages.json +232 -0
  406. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src-README.md +63 -0
  407. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src-scripts/crawl.py +103 -0
  408. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src-scripts/docs-tree.json +82965 -0
  409. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src-scripts/download.py +56 -0
  410. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src-scripts/gen_mapping.py +125 -0
  411. package/docs/80_upstream-docs-and-skills/dsh-dev-skill/src-scripts/pages.json +232 -0
  412. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/api-plugins.json +1 -0
  413. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/api-skills.json +4 -0
  414. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/_category_.json +8 -0
  415. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/acp-internals.md +181 -0
  416. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/adding-platform-adapters.md +788 -0
  417. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/adding-providers.md +464 -0
  418. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/adding-tools.md +211 -0
  419. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/agent-loop.md +242 -0
  420. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/architecture.md +279 -0
  421. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/billing-lifecycle.md +184 -0
  422. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/browser-provider-plugin.md +153 -0
  423. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/browser-supervisor.md +198 -0
  424. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/chronos-managed-cron-contract.md +227 -0
  425. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/cli-internals.md +85 -0
  426. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/codebase-ownership.md +34 -0
  427. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/completion-backlog-delivery.md +52 -0
  428. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/context-compression-and-caching.md +642 -0
  429. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/context-engine-plugin.md +272 -0
  430. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/contributing.md +303 -0
  431. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/creating-skills.md +438 -0
  432. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/cron-internals.md +380 -0
  433. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/desktop-plugin-sdk.md +952 -0
  434. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/egress-internals.md +319 -0
  435. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/extending-the-cli.md +192 -0
  436. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/gateway-internals.md +297 -0
  437. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/gateway-monitoring.md +309 -0
  438. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/gateway-session-lifecycle.md +621 -0
  439. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/image-gen-provider-plugin.md +316 -0
  440. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/memory-provider-plugin.md +452 -0
  441. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/micro-compaction.md +406 -0
  442. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/middleware.md +266 -0
  443. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/model-provider-plugin.md +327 -0
  444. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/multiplexing-gateway.md +228 -0
  445. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/observer-hooks.md +331 -0
  446. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/plugin-llm-access.md +506 -0
  447. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/plugins/index.md +1775 -0
  448. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/programmatic-integration.md +212 -0
  449. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/prompt-assembly.md +328 -0
  450. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/provider-runtime.md +222 -0
  451. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/relay-connector-contract.md +790 -0
  452. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/relay-shared-metrics.md +487 -0
  453. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/secret-source-plugin.md +192 -0
  454. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/session-storage.md +523 -0
  455. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/state-db-recovery.md +107 -0
  456. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/streaming-tts.md +98 -0
  457. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/subagent-lifecycle-api.md +61 -0
  458. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/terminal-environment-plugin.md +140 -0
  459. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/tools-runtime.md +250 -0
  460. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/trajectory-format.md +232 -0
  461. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/video-gen-provider-plugin.md +231 -0
  462. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/web-search-provider-plugin.md +260 -0
  463. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/developer-guide/worktree-ui-dev.md +168 -0
  464. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/getting-started/_category_.json +8 -0
  465. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/getting-started/installation.md +200 -0
  466. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/getting-started/learning-path.md +169 -0
  467. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/getting-started/nix-setup.md +1234 -0
  468. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/getting-started/platform-support.md +50 -0
  469. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/getting-started/quickstart.md +399 -0
  470. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/getting-started/termux.md +301 -0
  471. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/getting-started/updating.md +374 -0
  472. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/_category_.json +6 -0
  473. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/agent-email-address.md +93 -0
  474. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/automate-with-cron.md +292 -0
  475. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/automation-blueprints.md +595 -0
  476. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/aws-bedrock.md +196 -0
  477. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/azure-foundry.md +334 -0
  478. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/cron-script-only.md +247 -0
  479. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/cron-troubleshooting.md +235 -0
  480. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/daily-briefing-bot.md +272 -0
  481. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/delegation-patterns.md +242 -0
  482. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/desktop-native-signin.md +125 -0
  483. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/github-pr-review-agent.md +303 -0
  484. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/google-gemini.md +270 -0
  485. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/google-vertex.md +148 -0
  486. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/local-llm-on-mac.md +252 -0
  487. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/local-ollama-setup.md +338 -0
  488. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/manage-hermes-cloud-with-mcp.md +176 -0
  489. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/microsoft-graph-app-registration.md +180 -0
  490. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/migrate-from-openclaw.md +252 -0
  491. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/minimax-oauth.md +226 -0
  492. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/oauth-over-ssh.md +172 -0
  493. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/operate-teams-meeting-pipeline.md +295 -0
  494. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/pipe-script-output.md +249 -0
  495. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/python-library.md +333 -0
  496. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/run-hermes-with-nous-portal.md +276 -0
  497. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/run-nemotron-3-ultra-free.md +123 -0
  498. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/secure-hermes-on-a-work-machine.md +182 -0
  499. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/team-telegram-assistant.md +441 -0
  500. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/tips.md +238 -0
  501. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/troubleshooting-agent-quality.md +145 -0
  502. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/use-mcp-with-hermes.md +541 -0
  503. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/use-soul-with-hermes.md +264 -0
  504. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/use-voice-mode-with-hermes.md +473 -0
  505. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/webhook-github-pr-review.md +336 -0
  506. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/work-with-skills.md +290 -0
  507. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/guides/xai-grok-oauth.md +243 -0
  508. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/index.mdx +155 -0
  509. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/integrations/buzz.md +57 -0
  510. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/integrations/index.md +126 -0
  511. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/integrations/nous-portal.md +286 -0
  512. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/integrations/providers.md +1681 -0
  513. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/_category_.json +8 -0
  514. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/automation-blueprints-catalog.mdx +36 -0
  515. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/cli-commands.md +1900 -0
  516. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/cli-symbols.md +126 -0
  517. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/environment-variables.md +952 -0
  518. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/faq.md +874 -0
  519. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/mcp-config-reference.md +439 -0
  520. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/model-catalog.md +121 -0
  521. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/optional-skills-catalog.md +303 -0
  522. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/profile-commands.md +544 -0
  523. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/skills-catalog.md +132 -0
  524. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/slash-commands.md +336 -0
  525. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/tools-reference.md +399 -0
  526. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/reference/toolsets-reference.md +171 -0
  527. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/_category_.json +8 -0
  528. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/bot-mode.md +309 -0
  529. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/checkpoints-and-rollback.md +283 -0
  530. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/cli.md +591 -0
  531. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/configuration.md +2901 -0
  532. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/configuring-models.md +414 -0
  533. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/desktop.md +728 -0
  534. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/docker.md +896 -0
  535. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/egress/index.md +10 -0
  536. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/egress/iron-proxy.md +570 -0
  537. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/egress/network-isolation.md +201 -0
  538. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/_category_.json +8 -0
  539. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/acp.md +407 -0
  540. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/api-server.md +810 -0
  541. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/batch-processing.md +230 -0
  542. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/browser.md +901 -0
  543. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/built-in-plugins.md +366 -0
  544. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/code-execution.md +319 -0
  545. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/codex-app-server-runtime.md +460 -0
  546. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/computer-use.md +636 -0
  547. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/context-files.md +237 -0
  548. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/context-references.md +142 -0
  549. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/credential-pools.md +308 -0
  550. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/credential-vault.md +122 -0
  551. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/cron.md +1262 -0
  552. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/curator.md +409 -0
  553. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/delegation.md +664 -0
  554. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/deliverable-mode.md +134 -0
  555. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/document-extraction.md +58 -0
  556. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/extending-the-dashboard.md +927 -0
  557. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/fallback-providers.md +444 -0
  558. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/goals.md +293 -0
  559. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/heartbeat.md +68 -0
  560. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/honcho.md +276 -0
  561. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/hooks.md +2007 -0
  562. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/image-generation.md +347 -0
  563. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/kanban-multi-gateway.md +52 -0
  564. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/kanban-tutorial.md +310 -0
  565. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/kanban-worker-lanes.md +142 -0
  566. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/kanban.md +1327 -0
  567. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/loops.md +122 -0
  568. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/lsp.md +307 -0
  569. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/mcp.md +957 -0
  570. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/memory-providers.md +699 -0
  571. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/memory.md +466 -0
  572. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/mixture-of-agents.md +246 -0
  573. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/overview.md +57 -0
  574. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/personality.md +289 -0
  575. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/pets.md +236 -0
  576. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/plugin-catalog.md +212 -0
  577. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/plugins.md +847 -0
  578. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/provider-routing.md +229 -0
  579. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/skills.md +1112 -0
  580. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/skins.md +271 -0
  581. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/spotify.md +279 -0
  582. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/subscription-proxy.md +203 -0
  583. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/tool-gateway.md +223 -0
  584. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/tool-search.md +277 -0
  585. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/tools.md +261 -0
  586. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/tts.md +744 -0
  587. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/vision.md +214 -0
  588. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/voice-mode.md +608 -0
  589. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/wake-word.md +343 -0
  590. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/web-dashboard.md +1206 -0
  591. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/web-search.md +506 -0
  592. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/features/x-search.md +167 -0
  593. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/git-worktrees.md +196 -0
  594. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/import-from-other-agents.md +74 -0
  595. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/local-models.md +140 -0
  596. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/managed-scope.md +157 -0
  597. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/_category_.json +8 -0
  598. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/a2a.md +130 -0
  599. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/bluebubbles.md +171 -0
  600. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/buzz.md +162 -0
  601. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/dingtalk.md +283 -0
  602. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/discord.md +936 -0
  603. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/email.md +223 -0
  604. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/feishu.md +599 -0
  605. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/google_chat.md +430 -0
  606. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/homeassistant.md +269 -0
  607. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/index.md +859 -0
  608. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/irc.md +78 -0
  609. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/line.md +201 -0
  610. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/matrix.md +910 -0
  611. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/mattermost.md +340 -0
  612. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/msgraph-webhook.md +142 -0
  613. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/ntfy.md +157 -0
  614. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/open-webui.md +296 -0
  615. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/photon.md +255 -0
  616. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/qqbot.md +123 -0
  617. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/raft.md +70 -0
  618. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/relay.md +212 -0
  619. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/signal.md +262 -0
  620. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/simplex.md +151 -0
  621. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/slack.md +1093 -0
  622. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/sms.md +203 -0
  623. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/teams-meetings.md +242 -0
  624. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/teams.md +288 -0
  625. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/telegram.md +1373 -0
  626. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/webhooks.md +694 -0
  627. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/wecom-callback.md +179 -0
  628. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/wecom.md +306 -0
  629. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/weixin.md +333 -0
  630. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/whatsapp-cloud.md +417 -0
  631. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/whatsapp.md +283 -0
  632. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/messaging/yuanbao.md +342 -0
  633. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/multi-connection-desktop.md +361 -0
  634. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/multi-profile-gateways.md +1062 -0
  635. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/profile-distributions.md +757 -0
  636. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/profiles.md +418 -0
  637. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/secrets/bitwarden.md +155 -0
  638. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/secrets/command.md +50 -0
  639. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/secrets/index.md +50 -0
  640. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/secrets/onepassword.md +169 -0
  641. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/security.md +892 -0
  642. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/sessions.md +990 -0
  643. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/apple/apple-apple-notes.md +110 -0
  644. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/apple/apple-apple-reminders.md +146 -0
  645. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/apple/apple-findmy.md +149 -0
  646. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/apple/apple-imessage.md +118 -0
  647. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-claude-code.md +763 -0
  648. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-codex.md +169 -0
  649. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-computer-use.md +355 -0
  650. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-hermes-agent.md +230 -0
  651. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-merge-reconciler.md +176 -0
  652. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-opencode.md +237 -0
  653. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-architecture-diagram.md +165 -0
  654. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-ascii-art.md +338 -0
  655. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-ascii-video.md +265 -0
  656. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-baoyu-infographic.md +256 -0
  657. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-claude-design.md +668 -0
  658. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-comfyui.md +616 -0
  659. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-design-md.md +238 -0
  660. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-excalidraw.md +212 -0
  661. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-humanizer.md +663 -0
  662. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-manim-video.md +292 -0
  663. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-p5js.md +576 -0
  664. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-popular-web-designs.md +223 -0
  665. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-pretext.md +238 -0
  666. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-sketch.md +240 -0
  667. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/creative/creative-songwriting-and-ai-music.md +319 -0
  668. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/devops/devops-sdlc-review.md +195 -0
  669. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/email/email-email-inbox-triage.md +115 -0
  670. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/email/email-himalaya.md +319 -0
  671. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/github/github-codebase-inspection.md +132 -0
  672. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/github/github-github-auth.md +265 -0
  673. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/github/github-github-code-review.md +499 -0
  674. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/github/github-github-issue-to-pr.md +95 -0
  675. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/github/github-github-issues.md +388 -0
  676. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/github/github-github-pr-workflow.md +385 -0
  677. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/github/github-github-repo-management.md +534 -0
  678. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/media/media-gif-search.md +106 -0
  679. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/media/media-songsee.md +98 -0
  680. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/media/media-youtube-content.md +100 -0
  681. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/mlops/mlops-evaluation-evaluating-llms-harness.md +512 -0
  682. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/mlops/mlops-evaluation-weights-and-biases.md +613 -0
  683. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/mlops/mlops-huggingface-hub.md +100 -0
  684. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/mlops/mlops-inference-llama-cpp.md +267 -0
  685. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/mlops/mlops-inference-serving-llms-vllm.md +387 -0
  686. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/note-taking/note-taking-obsidian.md +85 -0
  687. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-airtable.md +243 -0
  688. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-box.md +132 -0
  689. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-document-to-action-items.md +99 -0
  690. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-docx.md +213 -0
  691. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-google-workspace.md +348 -0
  692. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-maps.md +210 -0
  693. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-meeting-action-items.md +105 -0
  694. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-nano-pdf.md +70 -0
  695. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-notion.md +463 -0
  696. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-ocr-and-documents.md +193 -0
  697. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-pdf.md +142 -0
  698. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-powerpoint.md +237 -0
  699. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-product-price-monitor.md +97 -0
  700. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-session-librarian.md +122 -0
  701. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-teams-meeting-pipeline.md +129 -0
  702. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-weekly-review-planning.md +99 -0
  703. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/productivity/productivity-xlsx.md +213 -0
  704. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/research/research-arxiv.md +300 -0
  705. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/research/research-blocked-page-recovery.md +155 -0
  706. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/research/research-blogwatcher.md +152 -0
  707. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/research/research-competitor-news-monitor.md +106 -0
  708. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/research/research-grounded-citations.md +274 -0
  709. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/research/research-llm-wiki.md +526 -0
  710. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/research/research-research-paper-writing.md +1645 -0
  711. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/smart-home/smart-home-openhue.md +127 -0
  712. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/social-media/social-media-xurl.md +450 -0
  713. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-codebase-inspection.md +132 -0
  714. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-dogfood.md +183 -0
  715. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-github.md +73 -0
  716. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-hermes-agent-skill-authoring.md +230 -0
  717. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-inspecting-hermes-desktop-dom.md +177 -0
  718. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-node-inspect-debugger.md +337 -0
  719. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-python-debugpy.md +391 -0
  720. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-requesting-code-review.md +298 -0
  721. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-simplify-code.md +288 -0
  722. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-spike.md +217 -0
  723. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-systematic-debugging.md +429 -0
  724. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/software-development/software-development-test-driven-development.md +380 -0
  725. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/bundled/web/web-blocked-page-recovery.md +155 -0
  726. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/google-workspace.md +191 -0
  727. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-antigravity-cli.md +259 -0
  728. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-blackbox.md +161 -0
  729. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-dynamic-workflow.md +198 -0
  730. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-grok.md +326 -0
  731. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-honcho.md +446 -0
  732. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-openhands.md +167 -0
  733. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/blockchain/blockchain-evm.md +227 -0
  734. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/blockchain/blockchain-hyperliquid.md +228 -0
  735. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/blockchain/blockchain-solana.md +225 -0
  736. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/communication/communication-one-three-one-rule.md +114 -0
  737. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-ai-presenter-video.md +211 -0
  738. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-archify.md +66 -0
  739. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-ascii-art.md +338 -0
  740. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-audiocraft-audio-generation.md +588 -0
  741. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-auteur.md +195 -0
  742. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-baoyu-article-illustrator.md +225 -0
  743. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-baoyu-comic.md +264 -0
  744. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-comfyui.md +616 -0
  745. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-concept-diagrams.md +379 -0
  746. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-creative-ideation.md +192 -0
  747. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-draw-your-font.md +169 -0
  748. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-dream-loop.md +297 -0
  749. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-excalidraw.md +212 -0
  750. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-heartmula.md +191 -0
  751. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-hyperframes.md +222 -0
  752. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-impeccable.md +56 -0
  753. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-ip-as-logo.md +171 -0
  754. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-kanban-video-orchestrator.md +220 -0
  755. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-meme-generation.md +147 -0
  756. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-mono-color.md +158 -0
  757. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-pixel-art.md +234 -0
  758. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-pretext.md +238 -0
  759. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-simple-english.md +362 -0
  760. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-sketch.md +240 -0
  761. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-social-media-content-calendar.md +88 -0
  762. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-system-atlas.md +105 -0
  763. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-tldraw-offline.md +294 -0
  764. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/creative/creative-unreal-mcp.md +269 -0
  765. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/data-science/data-science-jupyter-notebook.md +195 -0
  766. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/devops/devops-actual-setup.md +164 -0
  767. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/devops/devops-docker-management.md +298 -0
  768. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/devops/devops-hermes-s6-container-supervision.md +198 -0
  769. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/devops/devops-inference-sh-cli.md +173 -0
  770. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/devops/devops-pinggy-tunnel.md +326 -0
  771. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/devops/devops-setup-wizard-generator.md +133 -0
  772. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/devops/devops-watchers.md +126 -0
  773. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/dogfood/dogfood-adversarial-ux-test.md +209 -0
  774. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/email/email-agentmail.md +104 -0
  775. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/finance/finance-3-statement-model.md +451 -0
  776. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/finance/finance-comps-analysis.md +682 -0
  777. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/finance/finance-dcf-model.md +1288 -0
  778. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/finance/finance-excel-author.md +262 -0
  779. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/finance/finance-lbo-model.md +309 -0
  780. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/finance/finance-merger-model.md +162 -0
  781. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/finance/finance-polymarket.md +97 -0
  782. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/finance/finance-pptx-author.md +191 -0
  783. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/finance/finance-stocks.md +112 -0
  784. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/gaming/gaming-minecraft-modpack-server.md +209 -0
  785. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/gaming/gaming-pokemon-player.md +240 -0
  786. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/health/health-fitness-nutrition.md +259 -0
  787. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/health/health-neuroskill-bci.md +470 -0
  788. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mcp/mcp-fastmcp.md +315 -0
  789. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mcp/mcp-mcp-oauth-remote-gateway.md +389 -0
  790. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mcp/mcp-mcporter.md +138 -0
  791. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/migration/migration-openclaw-migration.md +316 -0
  792. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-accelerate.md +366 -0
  793. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-chroma.md +425 -0
  794. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-clip.md +272 -0
  795. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-evaluation-evaluating-llms-harness.md +512 -0
  796. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-evaluation-weights-and-biases.md +613 -0
  797. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-faiss.md +240 -0
  798. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-flash-attention.md +388 -0
  799. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-guidance.md +595 -0
  800. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-huggingface-tokenizers.md +535 -0
  801. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-inference-llama-cpp.md +267 -0
  802. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-inference-outlines.md +679 -0
  803. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-inference-serving-llms-vllm.md +387 -0
  804. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-instructor.md +759 -0
  805. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-lambda-labs.md +568 -0
  806. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-llava.md +323 -0
  807. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-modal.md +368 -0
  808. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-models-huggingface-hub.md +100 -0
  809. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-models-segment-anything-model.md +525 -0
  810. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-nemo-curator.md +415 -0
  811. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-obliteratus.md +360 -0
  812. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-peft.md +452 -0
  813. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-pinecone.md +396 -0
  814. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-pytorch-fsdp.md +97 -0
  815. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-pytorch-lightning.md +365 -0
  816. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-qdrant.md +522 -0
  817. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-research-dspy.md +609 -0
  818. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-saelens.md +439 -0
  819. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-simpo.md +237 -0
  820. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-slime.md +486 -0
  821. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-stable-diffusion.md +542 -0
  822. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-tensorrt-llm.md +208 -0
  823. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-torchtitan.md +404 -0
  824. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-training-axolotl.md +181 -0
  825. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-training-trl-fine-tuning.md +512 -0
  826. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-training-unsloth.md +98 -0
  827. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/mlops/mlops-whisper.md +336 -0
  828. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/payments/payments-mpp-agent.md +142 -0
  829. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/payments/payments-stripe-link-cli.md +202 -0
  830. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/payments/payments-stripe-projects.md +138 -0
  831. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/productivity/productivity-canvas.md +114 -0
  832. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/productivity/productivity-decision-questionnaire.md +133 -0
  833. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/productivity/productivity-here-now.md +231 -0
  834. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/productivity/productivity-live-dashboard.md +126 -0
  835. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/productivity/productivity-memento-flashcards.md +336 -0
  836. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/productivity/productivity-property-listings.md +121 -0
  837. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/productivity/productivity-shop.md +238 -0
  838. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/productivity/productivity-shopify.md +377 -0
  839. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/productivity/productivity-siyuan.md +305 -0
  840. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/productivity/productivity-telephony.md +435 -0
  841. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-bioinformatics.md +254 -0
  842. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-blogwatcher.md +162 -0
  843. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-darwinian-evolver.md +217 -0
  844. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-domain-intel.md +121 -0
  845. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-drug-discovery.md +237 -0
  846. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-duckduckgo-search.md +255 -0
  847. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-gitnexus-explorer.md +232 -0
  848. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-osint-investigation.md +295 -0
  849. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-parallel-cli.md +411 -0
  850. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-pinecone-research.md +125 -0
  851. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-qmd.md +459 -0
  852. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-research-paper-writing.md +1645 -0
  853. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-rss-feeds.md +114 -0
  854. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-scrapling.md +351 -0
  855. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/research/research-searxng-search.md +212 -0
  856. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/security/security-1password.md +173 -0
  857. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/security/security-godmode.md +421 -0
  858. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/security/security-oss-forensics.md +426 -0
  859. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/security/security-sherlock.md +208 -0
  860. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/security/security-unbroker.md +331 -0
  861. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/security/security-web-pentest.md +337 -0
  862. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/smart-home/smart-home-openhue.md +127 -0
  863. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/social-media/social-media-reddit-reading.md +146 -0
  864. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/software-development/software-development-ast-grep.md +307 -0
  865. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/software-development/software-development-code-wiki.md +463 -0
  866. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/software-development/software-development-grill-me.md +135 -0
  867. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/software-development/software-development-pr-lens.md +160 -0
  868. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/software-development/software-development-rest-graphql-debug.md +532 -0
  869. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/software-development/software-development-subagent-driven-development.md +370 -0
  870. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/web-development/web-development-cloudflare-temporary-deploy.md +144 -0
  871. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/web-development/web-development-har-derived-api-client.md +180 -0
  872. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/web-development/web-development-page-agent.md +207 -0
  873. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/web-development/web-development-publish-site.md +174 -0
  874. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/web-development/web-development-scrollcraft.md +257 -0
  875. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/skills/optional/yuanbao/yuanbao-yuanbao.md +127 -0
  876. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/tui.md +313 -0
  877. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/which-file-does-what.md +57 -0
  878. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/windows-native.md +326 -0
  879. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-guide/windows-wsl-quickstart.md +358 -0
  880. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docs/user-stories.mdx +10 -0
  881. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/docusaurus.config.ts +210 -0
  882. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/acp-internals.md +181 -0
  883. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/adding-platform-adapters.md +686 -0
  884. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/adding-providers.md +459 -0
  885. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/adding-tools.md +209 -0
  886. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/agent-loop.md +239 -0
  887. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/architecture.md +277 -0
  888. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/browser-supervisor.md +160 -0
  889. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/context-compression-and-caching.md +328 -0
  890. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/context-engine-plugin.md +193 -0
  891. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/contributing.md +253 -0
  892. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/creating-skills.md +375 -0
  893. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/cron-internals.md +236 -0
  894. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/extending-the-cli.md +192 -0
  895. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/gateway-internals.md +267 -0
  896. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/image-gen-provider-plugin.md +288 -0
  897. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/memory-provider-plugin.md +258 -0
  898. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/model-provider-plugin.md +267 -0
  899. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/plugin-llm-access.md +401 -0
  900. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/plugins/index.md +1156 -0
  901. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/programmatic-integration.md +126 -0
  902. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/prompt-assembly.md +273 -0
  903. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/provider-runtime.md +208 -0
  904. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/session-storage.md +420 -0
  905. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/tools-runtime.md +236 -0
  906. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/trajectory-format.md +222 -0
  907. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/video-gen-provider-plugin.md +231 -0
  908. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/developer-guide/web-search-provider-plugin.md +260 -0
  909. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/getting-started/installation.md +204 -0
  910. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/getting-started/learning-path.md +154 -0
  911. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/getting-started/nix-setup.md +975 -0
  912. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/getting-started/quickstart.md +352 -0
  913. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/getting-started/termux.md +236 -0
  914. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/getting-started/updating.md +231 -0
  915. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/automate-with-cron.md +266 -0
  916. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/automation-blueprints.md +595 -0
  917. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/aws-bedrock.md +170 -0
  918. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/azure-foundry.md +334 -0
  919. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/cron-script-only.md +247 -0
  920. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/cron-troubleshooting.md +227 -0
  921. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/daily-briefing-bot.md +268 -0
  922. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/delegation-patterns.md +239 -0
  923. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/github-pr-review-agent.md +303 -0
  924. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/google-gemini.md +254 -0
  925. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/local-llm-on-mac.md +240 -0
  926. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/local-ollama-setup.md +317 -0
  927. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/microsoft-graph-app-registration.md +180 -0
  928. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/migrate-from-openclaw.md +244 -0
  929. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/minimax-oauth.md +228 -0
  930. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/oauth-over-ssh.md +96 -0
  931. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/operate-teams-meeting-pipeline.md +288 -0
  932. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/pipe-script-output.md +217 -0
  933. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/python-library.md +333 -0
  934. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/run-hermes-with-nous-portal.md +273 -0
  935. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/team-telegram-assistant.md +441 -0
  936. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/tips.md +234 -0
  937. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/use-mcp-with-hermes.md +490 -0
  938. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/use-soul-with-hermes.md +264 -0
  939. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/use-voice-mode-with-hermes.md +469 -0
  940. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/webhook-github-pr-review.md +329 -0
  941. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/work-with-skills.md +290 -0
  942. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/guides/xai-grok-oauth.md +243 -0
  943. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/index.mdx +117 -0
  944. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/integrations/buzz.md +57 -0
  945. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/integrations/index.md +100 -0
  946. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/integrations/nous-portal.md +272 -0
  947. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/integrations/providers.md +1433 -0
  948. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/reference/cli-commands.md +1259 -0
  949. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/reference/environment-variables.md +678 -0
  950. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/reference/faq.md +859 -0
  951. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/reference/mcp-config-reference.md +250 -0
  952. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/reference/model-catalog.md +103 -0
  953. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/reference/optional-skills-catalog.md +220 -0
  954. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/reference/profile-commands.md +467 -0
  955. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/reference/skills-catalog.md +156 -0
  956. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/reference/slash-commands.md +272 -0
  957. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/reference/tools-reference.md +261 -0
  958. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/reference/toolsets-reference.md +162 -0
  959. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/checkpoints-and-rollback.md +251 -0
  960. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/cli.md +445 -0
  961. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/configuration.md +1746 -0
  962. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/configuring-models.md +239 -0
  963. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/docker.md +595 -0
  964. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/acp.md +341 -0
  965. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/api-server.md +456 -0
  966. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/batch-processing.md +229 -0
  967. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/browser.md +629 -0
  968. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/built-in-plugins.md +269 -0
  969. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/code-execution.md +240 -0
  970. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/codex-app-server-runtime.md +441 -0
  971. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/computer-use.md +144 -0
  972. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/context-files.md +218 -0
  973. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/context-references.md +142 -0
  974. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/credential-pools.md +240 -0
  975. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/cron.md +761 -0
  976. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/curator.md +248 -0
  977. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/delegation.md +355 -0
  978. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/deliverable-mode.md +91 -0
  979. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/extending-the-dashboard.md +907 -0
  980. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/fallback-providers.md +408 -0
  981. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/goals.md +180 -0
  982. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/honcho.md +233 -0
  983. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/hooks.md +1388 -0
  984. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/image-generation.md +150 -0
  985. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/kanban-tutorial.md +308 -0
  986. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/kanban-worker-lanes.md +117 -0
  987. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/kanban.md +863 -0
  988. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/lsp.md +217 -0
  989. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/mcp.md +591 -0
  990. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/memory-providers.md +570 -0
  991. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/memory.md +233 -0
  992. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/overview.md +52 -0
  993. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/personality.md +271 -0
  994. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/plugins.md +346 -0
  995. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/provider-routing.md +200 -0
  996. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/skills.md +760 -0
  997. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/skins.md +271 -0
  998. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/spotify.md +279 -0
  999. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/subscription-proxy.md +163 -0
  1000. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/tool-gateway.md +187 -0
  1001. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/tools.md +223 -0
  1002. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/tts.md +456 -0
  1003. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/vision.md +210 -0
  1004. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/voice-mode.md +521 -0
  1005. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/web-dashboard.md +351 -0
  1006. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/web-search.md +422 -0
  1007. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/features/x-search.md +147 -0
  1008. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/git-worktrees.md +173 -0
  1009. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/bluebubbles.md +143 -0
  1010. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/dingtalk.md +283 -0
  1011. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/discord.md +843 -0
  1012. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/email.md +190 -0
  1013. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/feishu.md +538 -0
  1014. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/google_chat.md +283 -0
  1015. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/homeassistant.md +252 -0
  1016. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/index.md +569 -0
  1017. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/line.md +199 -0
  1018. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/matrix.md +677 -0
  1019. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/mattermost.md +340 -0
  1020. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/msgraph-webhook.md +137 -0
  1021. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/ntfy.md +155 -0
  1022. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/open-webui.md +296 -0
  1023. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/qqbot.md +123 -0
  1024. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/signal.md +257 -0
  1025. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/simplex.md +98 -0
  1026. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/slack.md +614 -0
  1027. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/sms.md +203 -0
  1028. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/teams-meetings.md +233 -0
  1029. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/teams.md +255 -0
  1030. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/telegram.md +1241 -0
  1031. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/webhooks.md +601 -0
  1032. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/wecom-callback.md +149 -0
  1033. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/wecom.md +292 -0
  1034. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/weixin.md +312 -0
  1035. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/whatsapp.md +236 -0
  1036. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/messaging/yuanbao.md +341 -0
  1037. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/profile-distributions.md +573 -0
  1038. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/profiles.md +272 -0
  1039. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/secrets/bitwarden.md +143 -0
  1040. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/secrets/index.md +9 -0
  1041. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/security.md +664 -0
  1042. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/sessions.md +609 -0
  1043. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/apple/apple-apple-notes.md +106 -0
  1044. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/apple/apple-apple-reminders.md +114 -0
  1045. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/apple/apple-findmy.md +147 -0
  1046. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/apple/apple-imessage.md +118 -0
  1047. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/apple/apple-macos-computer-use.md +175 -0
  1048. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-claude-code.md +763 -0
  1049. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-codex.md +143 -0
  1050. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-hermes-agent.md +947 -0
  1051. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-opencode.md +237 -0
  1052. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-architecture-diagram.md +165 -0
  1053. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-ascii-art.md +338 -0
  1054. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-ascii-video.md +261 -0
  1055. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-baoyu-infographic.md +256 -0
  1056. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-claude-design.md +609 -0
  1057. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-comfyui.md +547 -0
  1058. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-design-md.md +189 -0
  1059. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-excalidraw.md +210 -0
  1060. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-humanizer.md +594 -0
  1061. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-manim-video.md +289 -0
  1062. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-p5js.md +574 -0
  1063. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-popular-web-designs.md +211 -0
  1064. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-pretext.md +238 -0
  1065. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-sketch.md +238 -0
  1066. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/creative/creative-songwriting-and-ai-music.md +305 -0
  1067. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/email/email-himalaya.md +305 -0
  1068. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/github/github-codebase-inspection.md +132 -0
  1069. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/github/github-github-auth.md +265 -0
  1070. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/github/github-github-code-review.md +499 -0
  1071. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/github/github-github-issues.md +388 -0
  1072. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/github/github-github-pr-workflow.md +385 -0
  1073. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/github/github-github-repo-management.md +534 -0
  1074. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/media/media-gif-search.md +106 -0
  1075. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/media/media-songsee.md +98 -0
  1076. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/media/media-youtube-content.md +93 -0
  1077. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/mlops/mlops-evaluation-evaluating-llms-harness.md +512 -0
  1078. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/mlops/mlops-evaluation-weights-and-biases.md +609 -0
  1079. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/mlops/mlops-huggingface-hub.md +100 -0
  1080. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/mlops/mlops-inference-llama-cpp.md +267 -0
  1081. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/mlops/mlops-inference-serving-llms-vllm.md +386 -0
  1082. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/note-taking/note-taking-obsidian.md +81 -0
  1083. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/productivity/productivity-airtable.md +243 -0
  1084. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/productivity/productivity-google-workspace.md +325 -0
  1085. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/productivity/productivity-maps.md +196 -0
  1086. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/productivity/productivity-nano-pdf.md +69 -0
  1087. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/productivity/productivity-notion.md +463 -0
  1088. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/productivity/productivity-ocr-and-documents.md +190 -0
  1089. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/productivity/productivity-powerpoint.md +257 -0
  1090. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/productivity/productivity-teams-meeting-pipeline.md +127 -0
  1091. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/research/research-arxiv.md +300 -0
  1092. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/research/research-blogwatcher.md +152 -0
  1093. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/research/research-llm-wiki.md +469 -0
  1094. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/research/research-research-paper-writing.md +2395 -0
  1095. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/smart-home/smart-home-openhue.md +124 -0
  1096. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/social-media/social-media-xurl.md +428 -0
  1097. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/software-development/software-development-dogfood.md +181 -0
  1098. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/software-development/software-development-hermes-agent-skill-authoring.md +183 -0
  1099. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/software-development/software-development-node-inspect-debugger.md +337 -0
  1100. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/software-development/software-development-python-debugpy.md +391 -0
  1101. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/software-development/software-development-requesting-code-review.md +287 -0
  1102. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/software-development/software-development-spike.md +217 -0
  1103. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/software-development/software-development-systematic-debugging.md +385 -0
  1104. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/bundled/software-development/software-development-test-driven-development.md +361 -0
  1105. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/google-workspace.md +191 -0
  1106. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-blackbox.md +162 -0
  1107. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-honcho.md +446 -0
  1108. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/blockchain/blockchain-evm.md +227 -0
  1109. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/blockchain/blockchain-hyperliquid.md +210 -0
  1110. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/blockchain/blockchain-solana.md +206 -0
  1111. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/communication/communication-one-three-one-rule.md +114 -0
  1112. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/creative/creative-audiocraft-audio-generation.md +588 -0
  1113. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/creative/creative-concept-diagrams.md +379 -0
  1114. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/creative/creative-heartmula.md +189 -0
  1115. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/creative/creative-hyperframes.md +205 -0
  1116. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/creative/creative-kanban-video-orchestrator.md +173 -0
  1117. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/creative/creative-meme-generation.md +147 -0
  1118. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/data-science/data-science-jupyter-notebook.md +180 -0
  1119. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/devops/devops-docker-management.md +297 -0
  1120. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/devops/devops-inference-sh-cli.md +173 -0
  1121. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/devops/devops-pinggy-tunnel.md +327 -0
  1122. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/devops/devops-watchers.md +126 -0
  1123. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/dogfood/dogfood-adversarial-ux-test.md +209 -0
  1124. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/email/email-agentmail.md +143 -0
  1125. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/finance/finance-3-statement-model.md +451 -0
  1126. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/finance/finance-comps-analysis.md +682 -0
  1127. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/finance/finance-dcf-model.md +1288 -0
  1128. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/finance/finance-excel-author.md +262 -0
  1129. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/finance/finance-lbo-model.md +309 -0
  1130. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/finance/finance-merger-model.md +162 -0
  1131. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/finance/finance-polymarket.md +94 -0
  1132. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/finance/finance-pptx-author.md +191 -0
  1133. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/finance/finance-stocks.md +108 -0
  1134. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/health/health-fitness-nutrition.md +255 -0
  1135. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/health/health-neuroskill-bci.md +431 -0
  1136. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mcp/mcp-fastmcp.md +315 -0
  1137. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mcp/mcp-mcporter.md +138 -0
  1138. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/migration/migration-openclaw-migration.md +316 -0
  1139. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-accelerate.md +350 -0
  1140. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-chroma.md +425 -0
  1141. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-clip.md +272 -0
  1142. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-faiss.md +240 -0
  1143. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-flash-attention.md +381 -0
  1144. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-guidance.md +591 -0
  1145. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-huggingface-tokenizers.md +535 -0
  1146. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-inference-outlines.md +671 -0
  1147. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-instructor.md +759 -0
  1148. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-lambda-labs.md +568 -0
  1149. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-llava.md +323 -0
  1150. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-modal.md +362 -0
  1151. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-models-segment-anything-model.md +525 -0
  1152. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-nemo-curator.md +401 -0
  1153. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-peft.md +452 -0
  1154. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-pinecone.md +377 -0
  1155. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-pytorch-fsdp.md +145 -0
  1156. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-pytorch-lightning.md +365 -0
  1157. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-qdrant.md +514 -0
  1158. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-saelens.md +407 -0
  1159. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-simpo.md +237 -0
  1160. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-slime.md +486 -0
  1161. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-stable-diffusion.md +542 -0
  1162. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-tensorrt-llm.md +206 -0
  1163. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-torchtitan.md +378 -0
  1164. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-training-axolotl.md +181 -0
  1165. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-training-trl-fine-tuning.md +477 -0
  1166. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-training-unsloth.md +98 -0
  1167. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/mlops/mlops-whisper.md +336 -0
  1168. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/productivity/productivity-canvas.md +114 -0
  1169. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/productivity/productivity-here-now.md +231 -0
  1170. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/productivity/productivity-memento-flashcards.md +336 -0
  1171. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/productivity/productivity-shop.md +354 -0
  1172. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/productivity/productivity-shopify.md +377 -0
  1173. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/productivity/productivity-siyuan.md +305 -0
  1174. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/productivity/productivity-telephony.md +435 -0
  1175. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/research/research-bioinformatics.md +252 -0
  1176. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/research/research-darwinian-evolver.md +188 -0
  1177. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/research/research-domain-intel.md +117 -0
  1178. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/research/research-drug-discovery.md +237 -0
  1179. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/research/research-duckduckgo-search.md +255 -0
  1180. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/research/research-gitnexus-explorer.md +213 -0
  1181. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/research/research-osint-investigation.md +243 -0
  1182. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/research/research-parallel-cli.md +411 -0
  1183. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/research/research-qmd.md +435 -0
  1184. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/research/research-scrapling.md +351 -0
  1185. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/research/research-searxng-search.md +229 -0
  1186. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/security/security-1password.md +173 -0
  1187. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/security/security-oss-forensics.md +421 -0
  1188. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/security/security-sherlock.md +208 -0
  1189. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/software-development/software-development-rest-graphql-debug.md +531 -0
  1190. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/web-development/web-development-page-agent.md +207 -0
  1191. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/skills/optional/yuanbao/yuanbao-yuanbao.md +125 -0
  1192. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/tui.md +256 -0
  1193. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/windows-native.md +325 -0
  1194. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-guide/windows-wsl-quickstart.md +332 -0
  1195. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/i18n/zh-Hans/user-stories.mdx +10 -0
  1196. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/llms-full.txt +88833 -0
  1197. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/llms.txt +267 -0
  1198. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/site-pages-map.txt +928 -0
  1199. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src/site-pages.json +4218 -0
  1200. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src-README.md +101 -0
  1201. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src-scripts/clone_repo.sh +17 -0
  1202. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src-scripts/crawl.py +82 -0
  1203. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src-scripts/gen_mapping.py +112 -0
  1204. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src-scripts/retry-none.json +305 -0
  1205. package/docs/80_upstream-docs-and-skills/hermes-dev-skill/src-scripts/verify_orphans.py +53 -0
  1206. package/docs/specs/ctx/spec.md +78 -6
  1207. package/docs/specs/model-picker-ios-blur/spec.md +168 -0
  1208. package/docs/specs/plugins-page-components/spec.md +79 -0
  1209. package/docs/superpowers/plans/2026-10-02-ctx-navigation.md +319 -0
  1210. package/docs/superpowers/specs/2026-10-02-ctx-navigation-design.md +209 -0
  1211. package/lib/client/index.js +20 -20
  1212. package/lib/compaction/index.d.ts +57 -0
  1213. package/lib/compaction/index.js +145 -0
  1214. package/lib/failover/index.d.ts +59 -0
  1215. package/lib/failover/index.js +147 -0
  1216. package/lib/fs-aware/sandbox-plugin.js +3 -3
  1217. package/lib/index.d.ts +1 -32
  1218. package/lib/index.js +193 -8034
  1219. package/lib/{lsp-server-registry-_hk-Wcia.js → lsp-server-registry-XU6aHSqZ.js} +1 -1
  1220. package/lib/mobile/plugin.d.ts +29 -0
  1221. package/lib/mobile/plugin.js +54 -0
  1222. package/lib/native-capture-x_Hos2e8.js +68 -0
  1223. package/lib/remote/plugin.d.ts +24 -0
  1224. package/lib/remote/plugin.js +1095 -0
  1225. package/lib/url-schemes/index.d.ts +88 -0
  1226. package/lib/url-schemes/index.js +7461 -0
  1227. package/lib/web-password.d.ts +156 -0
  1228. package/lib/web-password.js +562 -0
  1229. package/lib/web-trust-BO66y72w.js +361 -0
  1230. package/lib/web-trust-BihHCelF.d.ts +106 -0
  1231. package/lib/web-trust.d.ts +2 -0
  1232. package/lib/web-trust.js +3 -0
  1233. package/lib/{wrap-JFjcWwZf.js → wrap-Bzdimp4p.js} +112 -112
  1234. package/package.json +101 -56
  1235. /package/lib/{lsp-server-registry-DkaYmTwt.js → lsp-server-registry-946ysdqg.js} +0 -0
@@ -0,0 +1,2901 @@
1
+ ---
2
+ sidebar_position: 2
3
+ title: "Hermes Agent Configuration"
4
+ description: "Configure Hermes Agent — config.yaml, providers, models, API keys, and more"
5
+ ---
6
+
7
+ # Hermes Agent Configuration
8
+
9
+ All settings are stored in the `~/.hermes/` directory for easy access.
10
+
11
+ :::tip Easiest path to a working `config.yaml`
12
+ Run `hermes setup --portal` — one OAuth gets you a model provider and all four Tool Gateway tools without hand-editing YAML. Portal subscribers also get 10% off token-billed providers. See [Nous Portal](/integrations/nous-portal).
13
+ :::
14
+
15
+ ## Directory Structure
16
+
17
+ ```text
18
+ ~/.hermes/
19
+ ├── config.yaml # Settings (model, terminal, TTS, compression, etc.)
20
+ ├── .env # API keys and secrets
21
+ ├── auth.json # OAuth provider credentials (Nous Portal, etc.)
22
+ ├── SOUL.md # Primary agent identity (slot #1 in system prompt)
23
+ ├── memories/ # Persistent memory (MEMORY.md, USER.md)
24
+ ├── skills/ # Agent-created skills (managed via skill_manage tool)
25
+ ├── cron/ # Scheduled jobs
26
+ ├── sessions/ # Gateway sessions
27
+ └── logs/ # Logs (errors.log, gateway.log — secrets auto-redacted)
28
+ ```
29
+
30
+ ## Managing Configuration
31
+
32
+ ```bash
33
+ hermes config # View current configuration
34
+ hermes config edit # Open config.yaml in your editor
35
+ hermes config get KEY # Print a resolved value
36
+ hermes config set KEY VAL # Set a specific value
37
+ hermes config unset KEY # Remove a user-set value
38
+ hermes config check # Check for missing options (after updates)
39
+ hermes config migrate # Interactively add missing options
40
+
41
+ # Examples:
42
+ hermes config get model
43
+ hermes config set model anthropic/claude-opus-4
44
+ hermes config set terminal.backend docker
45
+ hermes config unset terminal.backend
46
+ hermes config set OPENROUTER_API_KEY sk-or-... # Saves to .env
47
+ ```
48
+
49
+ :::tip
50
+ The `hermes config set` command automatically routes values to the right file — every `UPPER_SNAKE` name (`OPENROUTER_API_KEY`, `DISCORD_HOME_CHANNEL`, `TELEGRAM_GROUP_ALLOWED_USERS`, `HERMES_TIMEZONE`, …) is an environment variable and is saved to `.env`, never to `config.yaml`; dotted settings go to `config.yaml`. Any other `UPPER_SNAKE` name is saved to `.env` as-is (it is exported to the process environment for plugins and skills); names on the env writer's denylist (`HERMES_YOLO_MODE`, `PATH`, …) are refused. A misspelled path under a known section (`gateway.discord.foo`) is refused with a did-you-mean before anything is written; pass `--force` to write it anyway.
51
+ :::
52
+
53
+ ## Configuration Precedence
54
+
55
+ Settings are resolved in this order (highest priority first):
56
+
57
+ 1. **CLI arguments** — e.g., `hermes chat --model anthropic/claude-sonnet-4` (per-invocation override)
58
+ 2. **`~/.hermes/config.yaml`** — the primary config file for all non-secret settings
59
+ 3. **`~/.hermes/.env`** — fallback for env vars; **required** for secrets (API keys, tokens, passwords)
60
+ 4. **Built-in defaults** — hardcoded safe defaults when nothing else is set
61
+
62
+ :::info Rule of Thumb
63
+ Secrets (API keys, bot tokens, passwords) go in `.env`. Everything else (model, terminal backend, compression settings, memory limits, toolsets) goes in `config.yaml`. When both are set, `config.yaml` wins for non-secret settings.
64
+ :::
65
+
66
+ :::tip Org deployments
67
+ An administrator can pin specific config and secret values that a standard user
68
+ cannot override, via a system-level managed directory. See
69
+ [Managed Scope](/user-guide/managed-scope).
70
+ :::
71
+
72
+ ## Runtime Limits
73
+
74
+ Long-running Hermes server surfaces (including the gateway and
75
+ `hermes serve --isolated`) apply the configured `RLIMIT_NOFILE` soft limit
76
+ during startup when the operating system supports it:
77
+
78
+ ```yaml
79
+ runtime:
80
+ nofile_soft_limit: 4096
81
+ ```
82
+
83
+ The default is `4096`. Hermes clamps the target to the operating system's hard
84
+ limit and never lowers a process that already has a higher soft limit. Set the
85
+ value to `0`, `false`, or `null` to disable the adjustment. On Windows and in
86
+ sandboxes
87
+ where the limit cannot be changed, startup continues without changing the
88
+ limit.
89
+
90
+ ## Database Settings
91
+
92
+ The `database:` section controls how Hermes opens its SQLite state database
93
+ (`state.db`), which stores sessions, messages, and gateway routing:
94
+
95
+ ```yaml
96
+ database:
97
+ # Journal mode for state.db: wal (default) or delete.
98
+ # Use delete on filesystems where WAL is unsafe (network mounts). On
99
+ # virtiofs/9p bind mounts (Docker Desktop, Podman on macOS, OrbStack)
100
+ # Hermes detects the mount and creates fresh databases in delete mode
101
+ # automatically. Note: an existing on-disk WAL database is never
102
+ # live-downgraded — Hermes keeps WAL and logs an error telling you the
103
+ # configured delete did not apply (or that the WAL database sits on a
104
+ # cross-VM mount). To convert an existing database, stop
105
+ # every process using it and run a one-time offline
106
+ # `PRAGMA journal_mode=DELETE` on the file.
107
+ journal_mode: wal
108
+
109
+ # Durability level for every state.db connection: OFF, NORMAL, FULL,
110
+ # EXTRA (or 0-3). Unset leaves SQLite's compile-time default, which
111
+ # differs between interpreter builds. On macOS this is a floor, not a
112
+ # pin: values below FULL are refused to protect against Darwin fsync
113
+ # reordering; EXTRA is honored.
114
+ # synchronous: FULL
115
+
116
+ # Optional WAL sizing pragmas (integers). Unset = SQLite defaults.
117
+ # wal_autocheckpoint: 1000 # pages between automatic checkpoints
118
+ # journal_size_limit: 67108864 # cap the WAL/journal size in bytes
119
+ ```
120
+
121
+ Hermes also warns (once per process per database) when an existing
122
+ database's on-disk journal mode is silently flipped to WAL on open — for
123
+ example a database an operator had manually converted to `delete` — and
124
+ names `database.journal_mode` as the setting that makes the choice stick.
125
+ The reverse never happens automatically: a database that is already in WAL
126
+ mode is not live-downgraded when you set `journal_mode: delete` (a downgrade
127
+ under open connections can corrupt it). `hermes doctor` warns
128
+ `<db> is in WAL mode despite database.journal_mode=delete` until you stop
129
+ every Hermes process for the profile and run a one-time offline
130
+ `PRAGMA journal_mode=DELETE` on the file.
131
+
132
+ ## Environment Variable Substitution
133
+
134
+ You can reference environment variables in `config.yaml` using `${VAR_NAME}` syntax:
135
+
136
+ ```yaml
137
+ auxiliary:
138
+ vision:
139
+ api_key: ${GOOGLE_API_KEY}
140
+ base_url: ${CUSTOM_VISION_URL}
141
+
142
+ delegation:
143
+ api_key: ${DELEGATION_KEY}
144
+ ```
145
+
146
+ Multiple references in a single value work: `url: "${HOST}:${PORT}"`. If a referenced variable is not set, the placeholder is kept verbatim (`${UNDEFINED_VAR}` stays as-is) and a warning is logged. Bare `$VAR` is not expanded.
147
+
148
+ Under a [multiplexed multi-profile gateway](/user-guide/multi-profile-gateways), references in a profile's `config.yaml` resolve against **that profile's** `.env` (its secret scope), not the shared process environment — a `${MATRIX_ACCESS_TOKEN}` in profile B stays unresolved (kept verbatim, warning logged) unless B defines the variable itself. This holds wherever B's config is loaded inside the multiplexer: routed gateway turns, B's adapter startup, and B's cron jobs. Single-profile runs are unchanged. See [What is isolated per profile](/user-guide/multi-profile-gateways#what-is-isolated-per-profile) for the full list.
149
+
150
+ Cursor-style SecretRef syntax is also accepted: `${env:VAR_NAME}` resolves exactly like `${VAR_NAME}` (the `env:` prefix is stripped), so MCP or provider snippets copied from Cursor / Claude configs work unchanged in both `config.yaml` and the `mcp_servers` block. Other SecretRef sources (`${file:...}`, `${vault:...}`, `${bitwarden:...}`) are **not** resolved inline — external secret backends inject their values into the environment at startup via the `secrets:` block, so reference them as `${env:NAME}` instead; unknown prefixes warn once and stay verbatim.
151
+
152
+ For AI provider setup (OpenRouter, Anthropic, Copilot, custom endpoints, self-hosted LLMs, fallback models, etc.), see [AI Providers](/integrations/providers).
153
+
154
+ ### Provider Timeouts
155
+
156
+ You can set `providers.<id>.request_timeout_seconds` for a provider-wide request timeout, plus `providers.<id>.models.<model>.timeout_seconds` for a model-specific override. Applies to the primary turn client on every transport (OpenAI-wire, native Anthropic, Anthropic-compatible), the fallback chain, rebuilds after credential rotation, and (for OpenAI-wire) the per-request timeout kwarg — so the configured value wins over the legacy `HERMES_API_TIMEOUT` env var.
157
+
158
+ You can also set `providers.<id>.stale_timeout_seconds` for the non-streaming stale-call detector, plus `providers.<id>.models.<model>.stale_timeout_seconds` for a model-specific override. This wins over the legacy `HERMES_API_CALL_STALE_TIMEOUT` env var.
159
+
160
+ Leaving these unset keeps the legacy defaults (`HERMES_API_TIMEOUT=1800`s, `HERMES_API_CALL_STALE_TIMEOUT=90`s, native Anthropic 900s). The non-streaming stale detector is auto-disabled for local endpoints when left implicit and can scale upward for very large contexts. Not currently wired for AWS Bedrock (both `bedrock_converse` and AnthropicBedrock SDK paths use boto3 with its own timeout configuration). See the commented example in [`cli-config.yaml.example`](https://github.com/NousResearch/hermes-agent/blob/main/cli-config.yaml.example).
161
+
162
+ ## Update Behavior
163
+
164
+ ### Background checks
165
+
166
+ Passive update checks (CLI banner, TUI badge, dashboard, desktop app) ask the
167
+ GitHub REST API for the tip of `main` and, when it differs from your checkout,
168
+ the compare endpoint for the exact count and changelog. They never run
169
+ `git fetch`, and every install asks at most **once per 24 hours** (a failed check
170
+ retries after an hour). Applying an update (`hermes update`, or the desktop's
171
+ Update button) always fetches fresh and invalidates the cached answer. Explicit
172
+ checks — `hermes update --check`, the desktop's "Check for Updates…" menu item,
173
+ Settings → About → "Check now" — bypass the cache.
174
+
175
+ ### SSH authentication
176
+
177
+ The startup update check reads the origin URL with the same isolated Git
178
+ configuration used for its network calls. Global `url.*.insteadOf` rewrites
179
+ therefore cannot hide an official SSH remote from the public HTTPS path.
180
+
181
+ Hermes's isolated internal Git commands default to `ssh -o BatchMode=yes`:
182
+ unknown host keys, passwords, and encrypted keys needing a passphrase fail
183
+ instead of opening a terminal prompt. Trusted hosts with usable keys or an
184
+ SSH agent continue to authenticate. This does not change your Git or SSH
185
+ configuration on disk, or commands you run in the terminal tool.
186
+
187
+ The internal default overrides repository `core.sshCommand` settings. An
188
+ explicit `GIT_SSH_COMMAND` environment variable still takes precedence, so
189
+ custom identity or transport commands can be retained there. Include
190
+ `-o BatchMode=yes` in such an override if it must remain non-interactive;
191
+ an override that permits prompting can still interrupt a background check.
192
+
193
+ `hermes update` settings live under `updates` in `config.yaml`:
194
+
195
+ ```yaml
196
+ updates:
197
+ pre_update_backup: quick # quick (state snapshot, default) | full (snapshot + HERMES_HOME zip) | off
198
+ backup_keep: 5 # Keep this many full pre-update backup zips
199
+ non_interactive_local_changes: stash # stash | discard
200
+ auto_switch_parked_branch: true # auto-switch a clean, fully merged parked branch back to main
201
+ ```
202
+
203
+ `pre_update_backup` is the single pre-update safety knob: `quick` (default) snapshots critical state files (pairing data, cron jobs, config, auth; files over 1 GiB are skipped) into `state-snapshots/`; `full` additionally zips all of `HERMES_HOME` into `backups/` and can add minutes on large homes; `off` disables both. Legacy booleans are honored (`true` → `full`, `false` → `off`).
204
+
205
+ Point-in-time copies of `config.yaml` itself (taken before `hermes setup` rewrites it, before `hermes migrate` edits it, every time the file parses successfully, and when it fails to parse) go to `backups/config/config.yaml.<reason>.<timestamp>`. Identical repeats are skipped and only the newest five per reason are kept, so they never pile up beside `config.yaml`. If `config.yaml` is broken, Hermes serves the newest `good` copy instead of built-in defaults and warns on every start until the YAML is fixed; the broken file is never modified.
206
+
207
+ For git installs, Hermes auto-stashes dirty tracked files and untracked files before checking out the update branch or pulling. Interactive terminal updates prompt before restoring that stash. Non-interactive updates (desktop/chat app, gateway, or `--yes`) use `updates.non_interactive_local_changes`: `stash` restores local source edits after a successful pull, while `discard` drops the update-created stash after a successful pull. Use `discard` only on managed installs where local source edits are never meant to persist.
208
+
209
+ Before that stash step, Hermes also restores tracked `package-lock.json` diffs left by npm install/build churn. Commit or manually stash intentional lockfile edits before updating.
210
+
211
+ ## Terminal Backend Configuration
212
+
213
+ Hermes supports seven terminal backends. Each determines where the agent's shell commands actually execute — your local machine, a Docker container, a remote server via SSH, a Modal cloud sandbox (direct or via the Nous-managed gateway), a Daytona workspace, a Vercel Sandbox, or a Singularity/Apptainer container.
214
+
215
+ ```yaml
216
+ terminal:
217
+ backend: local # local | docker | ssh | modal | daytona | vercel_sandbox | singularity
218
+ cwd: "." # Gateway/cron working directory (CLI always uses launch dir)
219
+ temp_dir: "" # Session temp root; empty = TMPDIR, else ~/.hermes/cache/terminal
220
+ font_family: "" # Desktop terminal font; e.g. "MesloLGS NF"
221
+ timeout: 180 # Per-command timeout in seconds
222
+ home_mode: auto # auto | real | profile — subprocess HOME policy
223
+ env_passthrough: [] # Env var names to forward to sandboxed execution (terminal + execute_code)
224
+ singularity_image: "docker://nikolaik/python-nodejs:python3.11-nodejs20" # Container image for Singularity backend
225
+ modal_image: "nikolaik/python-nodejs:python3.11-nodejs20" # Container image for Modal backend
226
+ daytona_image: "nikolaik/python-nodejs:python3.11-nodejs20" # Container image for Daytona backend
227
+ ```
228
+
229
+ `terminal.temp_dir` controls where Hermes puts session temp artifacts on the
230
+ local backend — background-process logs/pid/exit files, code-execution
231
+ sandboxes, and spilled tool results. When it's empty (the default), Hermes
232
+ honors an explicit `TMPDIR`/`TMP`/`TEMP` from the environment and otherwise
233
+ uses a managed directory on real storage at `~/.hermes/cache/terminal`
234
+ instead of `/tmp` — on many distros (Arch-based setups in particular) `/tmp`
235
+ is a small RAM-backed tmpfs that Hermes session artifacts can fill under
236
+ load. The managed directory is auto-pruned: artifacts older than 72 hours are
237
+ swept hourly by gateway housekeeping and once per process on CLI-only
238
+ installs. Set `temp_dir` to an existing absolute path to redirect session
239
+ temp anywhere else; user-set paths are never auto-pruned.
240
+
241
+ `desktop.font_family` sets the font for chat and the rest of the Hermes Desktop interface (the terminal pane has its own key above). Give it one installed family name (for example, `OpenDyslexic` or `Atkinson Hyperlegible`) or a CSS font stack; Hermes keeps the active theme's own stack behind it so CJK and emoji glyphs still resolve, and an empty value uses the theme's font. Edit it in **Settings → Appearance → Chat Font**.
242
+
243
+ `terminal.font_family` controls the embedded terminal in Hermes Desktop. It accepts either one locally installed family name (for example, `MesloLGS NF`) or a CSS font stack. Hermes appends its bundled JetBrains Mono stack as a fallback, and an empty value keeps the default. You can edit the same profile-scoped setting in **Settings → Appearance → Terminal Font**; no Google Fonts download or system-font permission is required.
244
+
245
+ For cloud sandboxes such as Modal, Daytona, and Vercel Sandbox, `container_persistent: true` means Hermes will try to preserve filesystem state across sandbox recreation. It does not promise that the same live sandbox, PID space, or background processes will still be running later.
246
+
247
+ ### Backend Overview
248
+
249
+ | Backend | Where commands run | Isolation | Best for |
250
+ |---------|-------------------|-----------|----------|
251
+ | **local** | Your machine directly | None | Development, personal use |
252
+ | **docker** | Single persistent Docker container (shared across session, `/new`, subagents) | Full (namespaces, cap-drop) | Safe sandboxing, CI/CD |
253
+ | **ssh** | Remote server via SSH | Network boundary | Remote dev, powerful hardware |
254
+ | **modal** | Modal cloud sandbox | Full (cloud VM) | Ephemeral cloud compute, evals |
255
+ | **daytona** | Daytona workspace | Full (cloud container) | Managed cloud dev environments |
256
+ | **vercel_sandbox** | Vercel Sandbox | Full (cloud microVM) | Cloud execution with snapshot-backed filesystem persistence |
257
+ | **singularity** | Singularity/Apptainer container | Namespaces (--containall) | HPC clusters, shared machines |
258
+
259
+ ### Local Backend
260
+
261
+ The default. Commands run directly on your machine with no isolation. No special setup required.
262
+
263
+ ```yaml
264
+ terminal:
265
+ backend: local
266
+ ```
267
+
268
+ By default, local tool subprocesses keep your real OS-user `HOME`. This lets
269
+ external CLIs such as `git`, `ssh`, `gh`, `az`, `npm`, Claude Code, and Codex
270
+ find the credentials and config they already use in your normal shell. Hermes
271
+ state is still profile-scoped through `HERMES_HOME`; `HOME` is not how profiles
272
+ select config, memory, sessions, or skills.
273
+
274
+ Hermes does **not** change your system-wide `HOME`, your shell startup files, or
275
+ the operating system account home. This setting only controls the environment
276
+ passed to subprocesses that Hermes launches through tools such as `terminal`,
277
+ background terminal processes, `execute_code`, and ACP helper processes.
278
+
279
+ #### `terminal.home_mode`
280
+
281
+ | Mode | Host installs | Containers | Tradeoff |
282
+ |---|---|---|---|
283
+ | `auto` | Keep the real OS-user `HOME` | Use `{HERMES_HOME}/home` | Recommended default. Host CLIs keep working; container state persists. |
284
+ | `real` | Force the real OS-user `HOME` | Force the real OS-user `HOME` if visible | Useful if a parent process accidentally started with `HOME` pointed at a profile home. |
285
+ | `profile` | Use `{HERMES_HOME}/home` when it exists | Use `{HERMES_HOME}/home` when it exists | Strict per-profile CLI config isolation, but normal `~/.ssh`, `~/.gitconfig`, `~/.azure`, `~/.config/gh`, Claude/Codex auth, npm state, etc. will not be visible unless you initialize or link them inside the profile home. |
286
+
287
+ The downside of the default is that host profiles share the same normal
288
+ user-level CLI credentials/config under `~`. If you need a profile with a
289
+ separate git identity, SSH keys, GitHub CLI login, npm config, or cloud CLI
290
+ login, use `home_mode: profile` and initialize those tools inside that profile
291
+ home deliberately.
292
+
293
+ If you intentionally want strict per-profile tool-config isolation, set:
294
+
295
+ ```yaml
296
+ terminal:
297
+ home_mode: profile
298
+ ```
299
+
300
+ In that mode tool subprocesses use `{HERMES_HOME}/home` as `HOME`. Hermes also
301
+ sets `HERMES_REAL_HOME` so scripts can still locate the actual user home when
302
+ they need it. Container backends keep using `{HERMES_HOME}/home` in `auto` mode
303
+ because that directory lives on the persistent Hermes data volume.
304
+
305
+ Scripts that need to distinguish profile state from the real user home should
306
+ prefer `HERMES_HOME` for Hermes data and `HERMES_REAL_HOME` for the account home:
307
+
308
+ ```python
309
+ from pathlib import Path
310
+ import os
311
+
312
+ hermes_home = Path(os.environ["HERMES_HOME"])
313
+ real_home = Path(os.environ.get("HERMES_REAL_HOME", os.environ["HOME"]))
314
+ ```
315
+
316
+ :::warning
317
+ The agent has the same filesystem access as your user account. Use `hermes tools` to disable tools you don't want, or switch to Docker for sandboxing.
318
+ :::
319
+
320
+ ### Docker Backend
321
+
322
+ Runs commands inside a Docker container with security hardening (all capabilities dropped, no privilege escalation, PID limits).
323
+
324
+ **Single persistent container, shared across Hermes processes.** Hermes starts ONE long-lived container on first use and routes every terminal, file, and `execute_code` call through `docker exec` into that same container — across sessions, `/new`, `/reset`, and `delegate_task` subagents. Working-directory changes, installed packages, files in `/workspace`, and **background processes** all carry over from one tool call to the next, and from one Hermes process to the next. When you close a TUI session, run `/quit`, or start a new `hermes` invocation, the container keeps running and the next Hermes process reuses it via a labeled lookup. See **Container lifecycle** below for the exact teardown rules.
325
+
326
+ **Per-session isolation mode (`container_persistent: false`).** Setting `container_persistent: false` on the Docker backend switches to one container **per session**: every chat (desktop app session, gateway conversation, TUI session) gets its own fresh sandbox, created on its first terminal/file call and removed when the session closes or goes idle past `lifetime_seconds`. Nothing carries over between sessions — no filesystem state, no mounts, no background processes. With `docker_mount_cwd_to_workspace: true`, only the workspace **attached to that session** is mounted at `/workspace`; a fresh session with no attached directory gets an empty workspace instead of inheriting the previous session's mount. `delegate_task` subagents still share their parent session's container. Use this mode when the sandbox is a security boundary between conversations; keep the default `true` when you want the long-lived shared container described above.
327
+
328
+ ```yaml
329
+ terminal:
330
+ backend: docker
331
+ docker_image: "nikolaik/python-nodejs:python3.11-nodejs20"
332
+ docker_mount_cwd_to_workspace: false # Mount launch dir into /workspace
333
+ docker_run_as_host_user: false # See "Running container as host user" below
334
+ docker_snap_compat: false # See "Snap-packaged Docker (AppArmor)" below
335
+ docker_forward_env: # Host env vars to forward into container
336
+ - "GITHUB_TOKEN"
337
+ docker_env: # Literal env vars to inject (KEY=value)
338
+ DEBUG: "1"
339
+ PYTHONUNBUFFERED: "1"
340
+ docker_volumes: # Host directory mounts
341
+ - "/home/user/projects:/workspace/projects"
342
+ - "/home/user/data:/data:ro" # :ro for read-only
343
+ docker_extra_args: # Extra flags appended verbatim to `docker run`
344
+ - "--gpus=all"
345
+ - "--network=host"
346
+ docker_network: true # false = air-gap the container (--network=none)
347
+
348
+ # Resource limits
349
+ container_cpu: 1 # CPU cores (0 = unlimited)
350
+ container_memory: 5120 # MB (0 = unlimited)
351
+ container_disk: 51200 # MB (requires overlay2 on XFS+pquota)
352
+ container_persistent: true # true = persist /workspace + /root, shared container; false = fresh container per session (see below)
353
+
354
+ # Cross-process container reuse (defaults match the "one long-lived
355
+ # container shared across sessions" contract — see Container lifecycle).
356
+ docker_persist_across_processes: true # Reuse container across Hermes restarts
357
+ docker_shared_container_key: "" # Opt in trusted profiles to one identity
358
+ docker_orphan_reaper: true # Sweep abandoned Exited containers at startup
359
+
360
+ # Cross-backend lifecycle settings (apply to docker as well)
361
+ timeout: 180 # Per-command timeout in seconds
362
+ lifetime_seconds: 300 # Idle-reaper window; also feeds 2× orphan-reaper threshold
363
+ ```
364
+
365
+ **`docker_env`** vs **`docker_forward_env`**: the former injects literal `KEY=value` pairs you specify in the config (the values live in your `config.yaml` or are passed as a JSON dict via `TERMINAL_DOCKER_ENV='{"DEBUG":"1"}'`). The latter forwards values from your shell or `~/.hermes/.env`, so the actual secret never appears in the config file. Use `docker_forward_env` for tokens and `docker_env` for static knobs the container needs.
366
+
367
+ **`terminal.docker_extra_args`** (also overridable via `TERMINAL_DOCKER_EXTRA_ARGS='["--gpus=all"]'`) lets you pass arbitrary `docker run` flags that Hermes doesn't surface as first-class keys — `--gpus`, `--network`, `--add-host`, alternative `--security-opt` overrides, etc. Each entry must be a string; the list is appended last to the assembled `docker run` invocation so it can override Hermes' defaults if needed. Use sparingly — flags that conflict with the sandbox hardening (capability drops, `--user`, the workspace bind mount) will silently weaken isolation.
368
+
369
+ **`terminal.docker_network`** (default `true`; env: `TERMINAL_DOCKER_NETWORK`) — set to `false` to run the sandbox container with `--network=none`, cutting off all network egress from agent commands. This applies to the execution container used by `terminal`, `execute_code`, and the file tools. Because containers persist across Hermes processes, flipping this to `false` while an older networked container exists will remove that container and start a fresh air-gapped one (a warning is logged); background processes running inside it are lost. Prefer this key over passing `--network=none` through `docker_extra_args`.
370
+
371
+ **Requirements:** Docker Desktop or Docker Engine installed and running. Hermes probes `$PATH` plus common macOS install locations (`/usr/local/bin/docker`, `/opt/homebrew/bin/docker`, Docker Desktop app bundle). Podman is supported out of the box: set `HERMES_DOCKER_BINARY=podman` (or the full path) to force it when both are installed.
372
+
373
+ #### Container lifecycle
374
+
375
+ Every Hermes-managed container is tagged with three labels so subsequent processes (and the orphan reaper) can identify it:
376
+
377
+ - `hermes-agent=1` — marks it as Hermes-managed
378
+ - `hermes-task-id=<sanitized task_id>` — keys the per-task reuse probe
379
+ - `hermes-profile=<sanitized profile name>` — scopes reuse and reaping to the active Hermes profile by default; when `docker_shared_container_key` is set, its sanitized value is used instead
380
+
381
+ On startup, Hermes runs `docker ps --filter label=hermes-task-id=<id> --filter label=hermes-profile=<identity>` and **attaches to the existing container** when it finds one. The identity is the active profile unless `docker_shared_container_key` explicitly opts trusted profiles into a common value. If the container is `exited` (e.g. after a Docker daemon restart), it's `docker start`'d and reused — filesystem state and any installed packages survive, but in-container background processes do not.
382
+
383
+ When a Hermes process exits — `/quit`, closing a TUI session, gateway shutdown, even SIGKILL — the cleanup path is a **no-op for the container in default mode**. The container keeps running. The next Hermes process attaches to it in milliseconds via the label probe. This is the behavior the "one long-lived container shared across sessions" contract requires: it's the only way background processes (npm watchers, dev servers, long-running pytest) survive across sessions.
384
+
385
+ **The container is only torn down (stopped and `docker rm -f`'d) in these cases:**
386
+
387
+ | Trigger | When it fires |
388
+ |---|---|
389
+ | `docker_persist_across_processes: false` | Explicit per-process isolation. Every `cleanup()` does `stop` + `rm -f`. Matches pre-issue-#20561 behavior. |
390
+ | Idle reaper (`lifetime_seconds`, default 300s) | Only when the env is `persist_across_processes=false`. Persist-mode envs are no-op'd; container survives the idle sweep. |
391
+ | Orphan reaper at next startup | Sweeps **Exited** hermes-labeled containers older than `2 × lifetime_seconds` (default 600s = 10 min), scoped to the current profile. **Running containers are never touched** — sibling-process safety. Set `docker_orphan_reaper: false` to disable. |
392
+ | Direct user action | `docker rm -f`, `docker system prune`, Docker Desktop restart. We don't set `--restart=always`, so a host reboot leaves the container `Exited` (its CoW layer survives and gets reused on next startup, but bg processes are gone). |
393
+
394
+ Edge cases worth knowing:
395
+
396
+ - **OOM kill of in-container PID 1** transitions the container to `Exited`. Next reuse will `docker start` it; filesystem state survives, bg processes do not.
397
+ - **Switching profiles** isolates containers from each other — a container labeled `hermes-profile=work` is invisible to a Hermes process running under `hermes-profile=research`. The orphan reaper is profile-scoped too, so cross-profile containers don't get reaped accidentally, but they also won't get cleaned up automatically until you start Hermes again under their original profile.
398
+ - **Explicit cross-profile sharing** — set the same non-empty `docker_shared_container_key` under `terminal:` for profiles that intentionally collaborate in one trusted workspace. This replaces only their container identity label; task, egress, and network compatibility checks still apply. Profiles without the key remain isolated. The identity label is derived from the key with a short digest suffix, so similar-looking keys (`team/workspace` vs `team_workspace`) never collide into one container. **Important: a shared container is created once, by whichever profile starts it first** — that profile's `docker_image`, volumes, shm size, and other immutable Docker settings win, and later profiles attach to it as-is; differing settings in their configs are ignored until the container is removed and recreated. Profiles sharing a key should agree on image and mounts.
399
+
400
+ Parallel subagents spawned via `delegate_task(tasks=[...])` share this one container — concurrent `cd`, env mutations, and writes to the same path will collide. If a subagent needs an isolated sandbox, it must register a per-task image override via `register_task_env_overrides()`, which RL and benchmark environments (TerminalBench2, HermesSweEnv, etc.) do automatically for their per-task Docker images.
401
+
402
+ **Security hardening:**
403
+ - `--cap-drop ALL` with only `DAC_OVERRIDE`, `CHOWN`, `FOWNER` added back
404
+ - `--security-opt no-new-privileges`
405
+ - `--pids-limit 256`
406
+ - Size-limited tmpfs for `/tmp` (512MB), `/var/tmp` (256MB), `/run` (64MB)
407
+
408
+ **Credential forwarding:** Env vars listed in `docker_forward_env` are resolved from your shell environment first, then `~/.hermes/.env`. Skills can also declare `required_environment_variables` which are merged automatically.
409
+
410
+ #### Environment variable overrides
411
+
412
+ Every key under `terminal:` has an env-var override of the form `TERMINAL_<KEY_UPPERCASE>`. The most useful ones for the Docker backend:
413
+
414
+ | Env var | Maps to | Notes |
415
+ |---|---|---|
416
+ | `TERMINAL_DOCKER_IMAGE` | `docker_image` | Base image |
417
+ | `TERMINAL_DOCKER_FORWARD_ENV` | `docker_forward_env` | JSON array: `'["GITHUB_TOKEN","OPENAI_API_KEY"]'` |
418
+ | `TERMINAL_DOCKER_ENV` | `docker_env` | JSON dict: `'{"DEBUG":"1"}'` |
419
+ | `TERMINAL_DOCKER_VOLUMES` | `docker_volumes` | JSON array of `"host:container[:ro]"` strings |
420
+ | `TERMINAL_DOCKER_EXTRA_ARGS` | `docker_extra_args` | JSON array |
421
+ | `TERMINAL_DOCKER_MOUNT_CWD_TO_WORKSPACE` | `docker_mount_cwd_to_workspace` | `true` / `false` |
422
+ | `TERMINAL_DOCKER_RUN_AS_HOST_USER` | `docker_run_as_host_user` | `true` / `false` |
423
+ | `TERMINAL_DOCKER_SNAP_COMPAT` | `docker_snap_compat` | `true` / `false` — default `false` |
424
+ | `TERMINAL_DOCKER_NETWORK` | `docker_network` | `true` / `false` — default `true`; `false` = `--network=none` |
425
+ | `TERMINAL_DOCKER_PERSIST_ACROSS_PROCESSES` | `docker_persist_across_processes` | `true` / `false` — default `true` |
426
+ | `TERMINAL_DOCKER_SHARED_CONTAINER_KEY` | `docker_shared_container_key` | Explicit shared identity for trusted profiles; empty by default |
427
+ | `TERMINAL_DOCKER_ORPHAN_REAPER` | `docker_orphan_reaper` | `true` / `false` — default `true` |
428
+ | `TERMINAL_CONTAINER_CPU` | `container_cpu` | CPU cores |
429
+ | `TERMINAL_CONTAINER_MEMORY` | `container_memory` | MB |
430
+ | `TERMINAL_CONTAINER_DISK` | `container_disk` | MB |
431
+ | `TERMINAL_CONTAINER_PERSISTENT` | `container_persistent` | `true` / `false` — controls the bind-mount workspace dirs, distinct from `docker_persist_across_processes` |
432
+ | `TERMINAL_LIFETIME_SECONDS` | `lifetime_seconds` | Idle reaper window |
433
+ | `TERMINAL_TEMP_DIR` | `temp_dir` | Session temp root (local backend) |
434
+ | `TERMINAL_TIMEOUT` | `timeout` | Per-command timeout |
435
+ | `HERMES_DOCKER_BINARY` | _none_ | Force a specific docker/podman binary path |
436
+
437
+ ### SSH Backend
438
+
439
+ Runs commands on a remote server over SSH. Uses ControlMaster for connection reuse (5-minute idle keepalive). Persistent shell is enabled by default — state (cwd, env vars) survives across commands.
440
+
441
+ ```yaml
442
+ terminal:
443
+ backend: ssh
444
+ persistent_shell: true # Keep a long-lived bash session (default: true)
445
+ ```
446
+
447
+ **Required environment variables:**
448
+
449
+ ```bash
450
+ TERMINAL_SSH_HOST=my-server.example.com
451
+ TERMINAL_SSH_USER=ubuntu
452
+ ```
453
+
454
+ **Optional:**
455
+
456
+ | Variable | Default | Description |
457
+ |----------|---------|-------------|
458
+ | `TERMINAL_SSH_PORT` | `22` | SSH port |
459
+ | `TERMINAL_SSH_KEY` | (system default) | Path to SSH private key |
460
+ | `TERMINAL_SSH_PERSISTENT` | `true` | Enable persistent shell |
461
+
462
+ **How it works:** Connects at init time with `BatchMode=yes` and `StrictHostKeyChecking=accept-new`. Persistent shell keeps a single `bash -l` process alive on the remote host, communicating via temporary files. Commands that need `stdin_data` or `sudo` automatically fall back to one-shot mode.
463
+
464
+ **Skill / config env passthrough:** variables a skill declares in `required_environment_variables`, or that you list under `terminal.env_passthrough`, are forwarded with OpenSSH `SendEnv` — the names go on the `ssh` command line and the values travel in the client's environment, never in the remote command text. The remote `sshd` must accept them; add to `/etc/ssh/sshd_config` on the server and reload sshd:
465
+
466
+ ```
467
+ AcceptEnv NEXTCLOUD_URL NEXTCLOUD_* # or the names your skills need
468
+ ```
469
+
470
+ Without a matching `AcceptEnv`, the server silently drops the variables and the remote shell sees them unset. Hermes provider credentials (`OPENAI_API_KEY`, …) are never forwarded even if listed. See [Env Var Passthrough](security.md#environment-variable-passthrough).
471
+
472
+ ### Modal Backend
473
+
474
+ Runs commands in a [Modal](https://modal.com) cloud sandbox. Each task gets an isolated VM with configurable CPU, memory, and disk. Filesystem can be snapshot/restored across sessions.
475
+
476
+ ```yaml
477
+ terminal:
478
+ backend: modal
479
+ container_cpu: 1 # CPU cores
480
+ container_memory: 5120 # MB (5GB)
481
+ container_disk: 51200 # MB (50GB)
482
+ container_persistent: true # Snapshot/restore filesystem
483
+ ```
484
+
485
+ **Required:** Either `MODAL_TOKEN_ID` + `MODAL_TOKEN_SECRET` environment variables, or a `~/.modal.toml` config file.
486
+
487
+ **Persistence:** When enabled, the sandbox filesystem is snapshotted on cleanup and restored on next session. Snapshots are tracked in `~/.hermes/modal_snapshots.json`. This preserves filesystem state, not live processes, PID space, or background jobs.
488
+
489
+ **Credential files:** Automatically mounted from `~/.hermes/` (OAuth tokens, etc.) and synced before each command.
490
+
491
+ ### Daytona Backend
492
+
493
+ Runs commands in a [Daytona](https://daytona.io) managed workspace. Supports stop/resume for persistence.
494
+
495
+ ```yaml
496
+ terminal:
497
+ backend: daytona
498
+ container_cpu: 1 # CPU cores
499
+ container_memory: 5120 # MB → converted to GiB
500
+ container_disk: 10240 # MB → converted to GiB (max 10 GiB)
501
+ container_persistent: true # Stop/resume instead of delete
502
+ ```
503
+
504
+ **Required:** `DAYTONA_API_KEY` environment variable.
505
+
506
+ **Persistence:** When enabled, sandboxes are stopped (not deleted) on cleanup and resumed on next session. Sandbox names follow the pattern `hermes-{task_id}`.
507
+
508
+ **Disk limit:** Daytona enforces a 10 GiB maximum. Requests above this are capped with a warning.
509
+
510
+ ### Vercel Sandbox Backend
511
+
512
+ Runs commands in a [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox) cloud microVM. Hermes uses the normal terminal and file tool surfaces; there are no Vercel-specific model-facing tools.
513
+
514
+ ```yaml
515
+ terminal:
516
+ backend: vercel_sandbox
517
+ vercel_runtime: node24 # node24 | node22 | python3.13
518
+ cwd: /vercel/sandbox # default workspace root
519
+ container_persistent: true # Snapshot/restore filesystem
520
+ container_disk: 51200 # Shared default only; custom disk is unsupported
521
+ ```
522
+
523
+ **Required install:** Install the optional SDK extra:
524
+
525
+ ```bash
526
+ pip install 'hermes-agent[vercel]'
527
+ ```
528
+
529
+ **Required authentication:** Configure access-token auth with all three of `VERCEL_TOKEN`, `VERCEL_PROJECT_ID`, and `VERCEL_TEAM_ID`. This is the supported setup for deployments and normal long-running Hermes processes on Render, Railway, Docker, and similar hosts.
530
+
531
+ For one-off local development, Hermes also accepts short-lived Vercel OIDC tokens:
532
+
533
+ ```bash
534
+ VERCEL_OIDC_TOKEN="$(vc project token <project-name>)" hermes chat
535
+ ```
536
+
537
+ From a linked Vercel project directory, you can omit the project name:
538
+
539
+ ```bash
540
+ VERCEL_OIDC_TOKEN="$(vc project token)" hermes chat
541
+ ```
542
+
543
+ OIDC tokens are short-lived and should not be used as the documented deployment path.
544
+
545
+ **Runtime:** `terminal.vercel_runtime` supports `node24`, `node22`, and `python3.13`. If unset, Hermes defaults to `node24`.
546
+
547
+ **Persistence:** When `container_persistent: true`, Hermes snapshots the sandbox filesystem during cleanup and restores a later sandbox for the same task from that snapshot. Snapshot contents can include Hermes-synced credentials, skills, and cache files that were copied into the sandbox. This preserves filesystem state only; it does not preserve live sandbox identity, PID space, shell state, or running background processes.
548
+
549
+ **Background commands:** `terminal(background=true)` uses Hermes' generic non-local background process flow. You can spawn, poll, wait, view logs, and kill processes through the normal process tool while the sandbox is alive. Hermes does not provide native Vercel detached-process recovery after cleanup or restart.
550
+
551
+ **Disk sizing:** Vercel Sandbox does not currently support Hermes' `container_disk` resource knob. Leave `container_disk` unset or at the shared default `51200`; non-default values fail diagnostics and backend creation instead of being silently ignored.
552
+
553
+ ### Singularity/Apptainer Backend
554
+
555
+ Runs commands in a [Singularity/Apptainer](https://apptainer.org) container. Designed for HPC clusters and shared machines where Docker isn't available.
556
+
557
+ ```yaml
558
+ terminal:
559
+ backend: singularity
560
+ singularity_image: "docker://nikolaik/python-nodejs:python3.11-nodejs20"
561
+ container_cpu: 1 # CPU cores
562
+ container_memory: 5120 # MB
563
+ container_persistent: true # Writable overlay persists across sessions
564
+ ```
565
+
566
+ **Requirements:** `apptainer` or `singularity` binary in `$PATH`.
567
+
568
+ **Image handling:** Docker URLs (`docker://...`) are automatically converted to SIF files and cached. Existing `.sif` files are used directly.
569
+
570
+ **Scratch directory:** Resolved in order: `TERMINAL_SCRATCH_DIR` → `TERMINAL_SANDBOX_DIR/singularity` → `/scratch/$USER/hermes-agent` (HPC convention) → `~/.hermes/sandboxes/singularity`.
571
+
572
+ **Isolation:** Uses `--containall --no-home` for full namespace isolation without mounting the host home directory.
573
+
574
+ ### Common Terminal Backend Issues
575
+
576
+ If terminal commands fail immediately or the terminal tool is reported as disabled:
577
+
578
+ - **Local** — No special requirements. The safest default when getting started.
579
+ - **Docker** — Run `docker version` to verify Docker is working. If it fails, fix Docker or `hermes config set terminal.backend local`.
580
+ - **SSH** — Both `TERMINAL_SSH_HOST` and `TERMINAL_SSH_USER` must be set. Hermes logs a clear error if either is missing.
581
+ - **Modal** — Needs `MODAL_TOKEN_ID` env var or `~/.modal.toml`. Run `hermes doctor` to check.
582
+ - **Daytona** — Needs `DAYTONA_API_KEY`. The Daytona SDK handles server URL configuration.
583
+ - **Singularity** — Needs `apptainer` or `singularity` in `$PATH`. Common on HPC clusters.
584
+
585
+ When in doubt, set `terminal.backend` back to `local` and verify that commands run there first.
586
+
587
+ ### Remote-to-Host State Sync on Teardown
588
+
589
+ For the **SSH**, **Modal**, and **Daytona** backends, Hermes pushes your `~/.hermes/` state (credential files, skills, cache) into the remote sandbox during the session, and on teardown **syncs changed state files back** to their original host locations. Files that differ from what was originally pushed (compared by content hash) are applied back in place; new remote files under a synced directory (e.g. a skill the agent created remotely) are mapped back to the corresponding host path. Upload-only credential files are never overwritten on the host.
590
+
591
+ - The sync-back retries up to 3 times with backoff and refuses to extract remote archives larger than 2 GiB.
592
+ - Docker and Singularity use bind mounts (live host filesystem view) and don't need this.
593
+ - This covers Hermes state (`~/.hermes/`), **not** arbitrary working-tree files inside the sandbox — have the agent copy important artifacts out explicitly (e.g. `scp`, `modal volume put`) before the sandbox is destroyed.
594
+
595
+ ### Docker Volume Mounts
596
+
597
+ When using the Docker backend, `docker_volumes` lets you share host directories with the container. Each entry uses standard Docker `-v` syntax: `host_path:container_path[:options]`.
598
+
599
+ ```yaml
600
+ terminal:
601
+ backend: docker
602
+ docker_volumes:
603
+ - "/home/user/projects:/workspace/projects" # Read-write (default)
604
+ - "/home/user/datasets:/data:ro" # Read-only
605
+ - "/home/user/.hermes/cache/documents:/output" # Gateway-visible exports
606
+ ```
607
+
608
+ This is useful for:
609
+ - **Providing files** to the agent (datasets, configs, reference code)
610
+ - **Receiving files** from the agent (generated code, reports, exports)
611
+ - **Shared workspaces** where both you and the agent access the same files
612
+
613
+ If you use a messaging gateway and want the agent to send generated files via
614
+ `MEDIA:/...`, prefer a dedicated host-visible export mount such as
615
+ `/home/user/.hermes/cache/documents:/output`.
616
+
617
+ - Write files inside Docker to `/output/...`
618
+ - Emit the **host path** in `MEDIA:`, for example:
619
+ `MEDIA:/home/user/.hermes/cache/documents/report.txt`
620
+ - Do **not** emit `/workspace/...` or `/output/...` unless that exact path also
621
+ exists for the gateway process on the host
622
+
623
+ :::warning
624
+ YAML duplicate keys silently override earlier ones. If you already have a
625
+ `docker_volumes:` block, merge new mounts into the same list instead of adding
626
+ another `docker_volumes:` key later in the file.
627
+ :::
628
+
629
+ Can also be set via environment variable: `TERMINAL_DOCKER_VOLUMES='["/host:/container"]'` (JSON array).
630
+
631
+ ### Docker Credential Forwarding
632
+
633
+ By default, Docker terminal sessions do not inherit arbitrary host credentials. If you need a specific token inside the container, add it to `terminal.docker_forward_env`.
634
+
635
+ ```yaml
636
+ terminal:
637
+ backend: docker
638
+ docker_forward_env:
639
+ - "GITHUB_TOKEN"
640
+ - "NPM_TOKEN"
641
+ ```
642
+
643
+ Hermes resolves each listed variable from your current shell first, then falls back to `~/.hermes/.env` if it was saved with `hermes config set`.
644
+
645
+ :::warning
646
+ Anything listed in `docker_forward_env` becomes visible to commands run inside the container. Only forward credentials you are comfortable exposing to the terminal session.
647
+ :::
648
+
649
+ ### Running the Container as Your Host User
650
+
651
+ By default Docker containers run as `root` (UID 0). Files created inside `/workspace` or other bind-mounts end up owned by root on the host, so after a session you have to `sudo chown` them before you can edit them from your host editor. The `terminal.docker_run_as_host_user` flag fixes this:
652
+
653
+ ```yaml
654
+ terminal:
655
+ backend: docker
656
+ docker_run_as_host_user: true # default: false
657
+ ```
658
+
659
+ When enabled, Hermes appends `--user $(id -u):$(id -g)` to the `docker run` command so files written into bind-mounted directories (`/workspace`, `/root`, anything in `docker_volumes`) are owned by your host user, not root. The trade-off: the container can no longer `apt install` or write to root-owned paths like `/root/.npm` — use a base image whose `HOME` is owned by a non-root user (or add your required tooling at image build time) if you need both.
660
+
661
+ Leave this `false` (the default) for backwards-compatible behavior. Turn it on when your workflow is mostly "edit mounted host files" and you're tired of `sudo chown -R`.
662
+
663
+ ### Snap-packaged Docker (AppArmor)
664
+
665
+ On hosts where Docker was installed as a snap (common on Ubuntu cloud images, e.g. Azure VMs), the snap's AppArmor confinement rejects two of the sandbox's hardening flags and the container dies at start:
666
+
667
+ ```
668
+ exec /sbin/docker-init: operation not permitted # --init
669
+ exec /usr/bin/sleep: operation not permitted # --security-opt no-new-privileges
670
+ ```
671
+
672
+ This is a snapd limitation ([LP#1908448](https://bugs.launchpad.net/snapd/+bug/1908448)), not something Hermes can probe around. Either install Docker from Docker's apt repository instead of the snap (preferred — all hardening stays on), or opt in:
673
+
674
+ ```yaml
675
+ terminal:
676
+ docker_snap_compat: true # drops --init and no-new-privileges; cap-drop, tmpfs, PID limits stay
677
+ ```
678
+
679
+ With it on, zombie processes inside the sandbox are not reaped by an init and a setuid binary inside the container can regain privileges; a warning is logged at container start.
680
+
681
+ ### Optional: Mount the Launch Directory into `/workspace`
682
+
683
+ Docker sandboxes stay isolated by default. Hermes does **not** pass your current host working directory into the container unless you explicitly opt in.
684
+
685
+ Enable it in `config.yaml`:
686
+
687
+ ```yaml
688
+ terminal:
689
+ backend: docker
690
+ docker_mount_cwd_to_workspace: true
691
+ ```
692
+
693
+ When enabled:
694
+ - if you launch Hermes from `~/projects/my-app`, that host directory is bind-mounted to `/workspace`
695
+ - the Docker backend starts in `/workspace`
696
+ - file tools and terminal commands both see the same mounted project
697
+
698
+ When disabled, `/workspace` stays sandbox-owned unless you explicitly mount something via `docker_volumes`.
699
+
700
+ Security tradeoff:
701
+ - `false` preserves the sandbox boundary
702
+ - `true` gives the sandbox direct access to the directory you launched Hermes from
703
+
704
+ Use the opt-in only when you intentionally want the container to work on live host files.
705
+
706
+ ### Persistent Shell
707
+
708
+ By default, each terminal command runs in its own subprocess — working directory, environment variables, and shell variables reset between commands. When **persistent shell** is enabled, a single long-lived bash process is kept alive across `execute()` calls so that state survives between commands.
709
+
710
+ This is most useful for the **SSH backend**, where it also eliminates per-command connection overhead. Persistent shell is **enabled by default for SSH** and disabled for the local backend.
711
+
712
+ ```yaml
713
+ terminal:
714
+ persistent_shell: true # default — enables persistent shell for SSH
715
+ ```
716
+
717
+ To disable:
718
+
719
+ ```bash
720
+ hermes config set terminal.persistent_shell false
721
+ ```
722
+
723
+ **What persists across commands:**
724
+ - Working directory (`cd /tmp` sticks for the next command)
725
+ - Exported environment variables (`export FOO=bar`)
726
+ - Shell variables (`MY_VAR=hello`)
727
+
728
+ **Precedence:**
729
+
730
+ | Level | Variable | Default |
731
+ |-------|----------|---------|
732
+ | Config | `terminal.persistent_shell` | `true` |
733
+ | SSH override | `TERMINAL_SSH_PERSISTENT` | follows config |
734
+ | Local override | `TERMINAL_LOCAL_PERSISTENT` | `false` |
735
+
736
+ Per-backend environment variables take highest precedence. If you want persistent shell on the local backend too:
737
+
738
+ ```bash
739
+ export TERMINAL_LOCAL_PERSISTENT=true
740
+ ```
741
+
742
+ :::note
743
+ Commands that require `stdin_data` or sudo automatically fall back to one-shot mode, since the persistent shell's stdin is already occupied by the IPC protocol.
744
+ :::
745
+
746
+ See [Code Execution](features/code-execution.md) and the [Terminal section of the README](features/tools.md) for details on each backend.
747
+
748
+ ## Skill Settings
749
+
750
+ Skills can declare their own configuration settings via their SKILL.md frontmatter. These are non-secret values (paths, preferences, domain settings) stored under the `skills.config` namespace in `config.yaml`.
751
+
752
+ ```yaml
753
+ skills:
754
+ config:
755
+ myplugin:
756
+ path: ~/myplugin-data # Example — each skill defines its own keys
757
+ ```
758
+
759
+ **How skill settings work:**
760
+
761
+ - `hermes config migrate` scans all enabled skills, finds unconfigured settings, and offers to prompt you
762
+ - `hermes config show` displays all skill settings under "Skill Settings" with the skill they belong to
763
+ - When a skill loads, its resolved config values are injected into the skill context automatically
764
+
765
+ **Setting values manually:**
766
+
767
+ ```bash
768
+ hermes config set skills.config.myplugin.path ~/myplugin-data
769
+ ```
770
+
771
+ For details on declaring config settings in your own skills, see [Creating Skills — Config Settings](/developer-guide/creating-skills#config-settings-configyaml).
772
+
773
+ ### Auto-loading skills every session
774
+
775
+ Pin skills so they are fully loaded at the start of every new session, on every surface:
776
+
777
+ ```yaml
778
+ skills:
779
+ auto_load:
780
+ - my-workflow
781
+ - github-pr-workflow
782
+ ```
783
+
784
+ Resolved once per session when the system prompt is first built (so the prompt stays cache-stable; edits apply to the next session). Missing or disabled skills warn and are skipped; `--ignore-rules` / `HERMES_IGNORE_RULES=1` suppresses the list. Profile-scoped. See [CLI — persistent auto-load](/user-guide/cli#persistent-auto-load-via-config).
785
+
786
+ ### Guard on agent-created skill writes
787
+
788
+ When the agent uses `skill_manage` to create, edit, patch, or delete a skill, Hermes can optionally scan the new/updated content for dangerous keyword patterns (credential harvesting, obvious prompt injection, exfil instructions). The scanner is **off by default** — real agent workflows that legitimately touch `~/.ssh/` or mention `$OPENAI_API_KEY` were tripping the heuristic too often. Turn it back on if you want the scanner to prompt you before the agent's skill writes land:
789
+
790
+ ```yaml
791
+ skills:
792
+ guard_agent_created: true # default: false
793
+ ```
794
+
795
+ When on, any flagged `skill_manage` write surfaces as an approval prompt with the scanner's rationale. Accepted writes land; denied writes return an explanatory error to the agent.
796
+
797
+ ### Write approval for skill writes
798
+
799
+ Independent of the content scanner above, `skills.write_approval` gates **every** agent skill write (create / edit / patch / delete / supporting files) behind your explicit approval — the same approve/deny mechanism as dangerous commands:
800
+
801
+ ```yaml
802
+ skills:
803
+ write_approval: false # false = write freely (default) | true = stage every write for review
804
+ ```
805
+
806
+ When on, skill writes are staged under `~/.hermes/pending/skills/` and reviewed with `/skills pending`, `/skills diff <id>`, `/skills approve <id>`, `/skills reject <id>` — from the CLI or any messaging platform. Toggle at runtime with `/skills approval on|off`. Memory has the same gate (`memory.write_approval`, below). Full walkthrough: [Gating agent skill writes](/user-guide/features/skills#gating-agent-skill-writes-skillswrite_approval).
807
+
808
+ ## Memory Configuration
809
+
810
+ ```yaml
811
+ memory:
812
+ memory_enabled: true
813
+ user_profile_enabled: true
814
+ memory_char_limit: 2200 # ~800 tokens
815
+ user_char_limit: 1375 # ~500 tokens
816
+ write_approval: false # true = require approval before any memory write
817
+ ```
818
+
819
+ With `memory.write_approval: true`, memory writes need your approval before they land: interactive CLI turns prompt inline; messaging sessions and the background self-improvement review stage the write for `/memory pending` → `/memory approve <id>` / `/memory reject <id>` review. Toggle at runtime with `/memory approval on|off`. See [Controlling memory writes](/user-guide/features/memory#controlling-memory-writes-write_approval).
820
+
821
+ ## Context File Truncation
822
+
823
+ Controls how much content Hermes loads from each automatic context file before applying head/tail truncation. This applies to files injected into the system prompt such as `SOUL.md`, `.hermes.md`, `AGENTS.md`, `CLAUDE.md`, and `.cursorrules`. It does **not** affect the `read_file` tool.
824
+
825
+ ```yaml
826
+ context_file_max_chars: null # default — dynamic cap scaled to the model's context window (floor 20K, ceiling 500K chars)
827
+ ```
828
+
829
+ Set a positive integer to pin a fixed cap instead of the dynamic behavior:
830
+
831
+ ```yaml
832
+ context_file_max_chars: 25000
833
+ ```
834
+
835
+ Each context file read is also bounded by `context_file_read_timeout` (seconds, default `5.0`). A file that takes longer to read — typically on a network-backed filesystem such as iCloud Drive, OneDrive or NFS — is skipped with a warning so the rest of the system prompt still loads:
836
+
837
+ ```yaml
838
+ context_file_read_timeout: 5.0
839
+ ```
840
+
841
+ ## File Read Safety
842
+
843
+ Controls how much content a single `read_file` call can return. Reads that exceed the limit are rejected with an error telling the agent to use `offset` and `limit` for a smaller range. This prevents a single read of a minified JS bundle or large data file from flooding the context window.
844
+
845
+ ```yaml
846
+ file_read_max_chars: 100000 # default — ~25-35K tokens
847
+ ```
848
+
849
+ Raise it if you're on a model with a large context window and frequently read big files. Lower it for small-context models to keep reads efficient:
850
+
851
+ ```yaml
852
+ # Large context model (200K+)
853
+ file_read_max_chars: 200000
854
+
855
+ # Small local model (16K context)
856
+ file_read_max_chars: 30000
857
+ ```
858
+
859
+ The agent also deduplicates file reads automatically — if the same file region is read twice and the file hasn't changed, a lightweight stub is returned instead of re-sending the content. This resets on context compression so the agent can re-read files after their content is summarized away.
860
+
861
+ ## Tool Output Truncation Limits
862
+
863
+ Three related caps control how much raw output a tool can return before Hermes truncates it:
864
+
865
+ ```yaml
866
+ tool_output:
867
+ max_bytes: 50000 # terminal output cap (chars)
868
+ max_lines: 2000 # read_file pagination cap
869
+ max_line_length: 2000 # per-line cap in read_file's line-numbered view
870
+ ```
871
+
872
+ - **`max_bytes`** — When a `terminal` command produces more than this many characters of combined stdout/stderr, Hermes keeps the first 40% and last 60% and inserts a `[OUTPUT TRUNCATED]` notice between them. Default `50000` (≈12-15K tokens across typical tokenisers).
873
+ - **`max_lines`** — Upper bound on the `limit` parameter of a single `read_file` call. Requests above this are clamped so a single read can't flood the context window. Default `2000`.
874
+ - **`max_line_length`** — Per-line cap applied when `read_file` emits the line-numbered view. Lines longer than this are truncated to this many chars followed by `... [truncated]`. Default `2000`.
875
+
876
+ Raise the limits on models with large context windows that can afford more raw output per call. Lower them for small-context models to keep tool results compact:
877
+
878
+ ```yaml
879
+ # Large context model (200K+)
880
+ tool_output:
881
+ max_bytes: 150000
882
+ max_lines: 5000
883
+
884
+ # Small local model (16K context)
885
+ tool_output:
886
+ max_bytes: 20000
887
+ max_lines: 500
888
+ ```
889
+
890
+ ### Tool-Result Spillover Budget
891
+
892
+ Separately from truncation, oversized tool *results* are spilled to disk rather than cut: the full output is saved under `$HERMES_HOME/cache/spillover/` and the in-context content is replaced by a preview plus the saved file's path (readable with `read_file` using `offset`/`limit`, or processable with `execute_code`). The generic per-result spillover threshold is 100,000 chars, scaled down automatically for small-context models.
893
+
894
+ MCP tool results (tools named `mcp_*`) spill at a tighter **50,000-char** default: MCP servers routinely return large un-paginated payloads (tool-discovery catalogs, batched executions) that would otherwise sit under the generic threshold and bloat context on every subsequent turn. Nothing is lost — the full result is preserved on disk. Override the threshold via:
895
+
896
+ ```yaml
897
+ tool_budget:
898
+ mcp_result_size_chars: 50000 # per-result spillover threshold for mcp_* tools
899
+ ```
900
+
901
+ The MCP threshold is always capped at the (possibly context-scaled) generic per-result threshold, so raising it cannot exceed what the active model's window allows.
902
+
903
+ Hermes also flags **provider-side elision**: when an MCP or web tool result embeds its own truncation markers (`...N more items`, `"has_more": true`, "saved to sandbox" notes), a one-line notice is appended to the result warning that the visible data is incomplete and should be paged/fetched before treating any enumeration as complete.
904
+
905
+ ## Global Toolset Disable
906
+
907
+ To suppress specific toolsets across the CLI and every gateway platform in one
908
+ place, list their names under `agent.disabled_toolsets`:
909
+
910
+ ```yaml
911
+ agent:
912
+ disabled_toolsets:
913
+ - memory # hide memory tools + MEMORY_GUIDANCE injection
914
+ - web # no web_search / web_extract anywhere
915
+ ```
916
+
917
+ This applies **after** per-platform tool config (`platform_toolsets` written by
918
+ `hermes tools`), so a toolset listed here is always removed — even if a
919
+ platform's saved config still lists it. Use this when you want a single
920
+ switch for "turn X off everywhere" rather than editing 15+ platform rows in
921
+ the `hermes tools` UI.
922
+
923
+ Leaving the list empty, or omitting the key, is a no-op.
924
+
925
+ ## Git Worktree Isolation
926
+
927
+ Enable isolated git worktrees for running multiple agents in parallel on the same repo:
928
+
929
+ ```yaml
930
+ worktree: true # Always create a worktree (same as hermes -w)
931
+ # worktree: false # Default — only when -w flag is passed
932
+ ```
933
+
934
+ When enabled, each CLI session creates a fresh worktree under `.worktrees/` with its own branch. Agents can edit files, commit, push, and create PRs without interfering with each other. Clean worktrees are removed on exit; dirty ones are kept for manual recovery.
935
+
936
+ By default the new worktree branches from the **freshly-fetched remote tip** (the current branch's upstream, otherwise the remote's default branch) so it starts current with the project rather than from the local clone's possibly-stale `HEAD`. This keeps a PR's diff scoped to the actual change instead of inheriting whatever the local clone was behind by. Set `worktree_sync: false` to branch from local `HEAD` instead — useful offline, or when you deliberately want the clone's exact current state as the base. If the remote can't be reached, it falls back to local `HEAD` automatically.
937
+
938
+ ```yaml
939
+ worktree_sync: true # Default — branch from the fetched remote tip
940
+ # worktree_sync: false # Branch from local HEAD (offline / pinned base)
941
+ ```
942
+
943
+ You can also list gitignored files to copy into worktrees via `.worktreeinclude` in your repo root:
944
+
945
+ ```
946
+ # .worktreeinclude
947
+ .env
948
+ .venv/
949
+ node_modules/
950
+ ```
951
+
952
+ ## Context Compression
953
+
954
+ Hermes automatically compresses long conversations to stay within your model's context window. The compression summarizer is a separate LLM call — you can point it at any provider or endpoint.
955
+
956
+ All compression settings live in `config.yaml` (no environment variables).
957
+
958
+ ### Full reference
959
+
960
+ ```yaml
961
+ compression:
962
+ enabled: true # Toggle compression on/off
963
+ progress_notices: false # Opt-in: deliver routine compression progress notices to chat platforms — see below
964
+ threshold: 0.50 # Compress at this % of context limit
965
+ threshold_tokens: null # Absolute token cap (optional) — takes lower of ratio vs absolute
966
+ target_ratio: 0.20 # Fraction of threshold to preserve as recent tail
967
+ tail_mode: lean # Tail retention: "lean" (default — clamped 2.5% tail, 10K-25K, with a detailed session log + anchor index + session_search recovery pointers in the summary, all from ONE auxiliary summarizer call; ~3x fewer retained tokens after compaction) or "legacy" (0.20×threshold verbatim tail)
968
+ protect_last_n: 20 # Min recent messages to keep uncompressed
969
+ protect_first_n: 3 # Non-system head messages pinned across compactions (0 = pin nothing)
970
+ in_place: true # Compact on the same session id (no rotation) — see below
971
+ idle_compact_after_seconds: 0 # Opt-in idle compaction (0 = disabled) — see below
972
+ hygiene_hard_message_limit: 5000 # Gateway safety valve — see below
973
+ hygiene_timeout_seconds: 30 # Max seconds of NO summary-model output before hygiene compression is cut off
974
+ hygiene_total_ceiling_seconds: 600 # Absolute cap on the hygiene wait even while tokens are still streaming
975
+ hygiene_max_turn_hold_seconds: 10 # Max wall-clock the incoming turn waits on hygiene compression before proceeding uncompressed — see below
976
+ hygiene_failure_cooldown_seconds: 300 # First rung of the per-session hygiene-failure backoff (x1/x3/x9, capped at 1h)
977
+ context_timeout_seconds: 120 # Inactivity budget for in-agent compress_context (loop /compress / preflight) — see below
978
+ context_total_ceiling_seconds: 600 # Absolute cap on the *pre-commit* in-agent compress_context wait even while tokens are still streaming (an already-started SessionDB commit is never abandoned; overruns are logged + surfaced)
979
+ proactive_prune_tokens: 0 # Opt-in tokens trigger for the no-LLM tool-result prune (0 = off; see below)
980
+ proactive_prune_min_result_chars: 8000 # Prune's summarize pass only touches tool results larger than this (clamped >= 200)
981
+ proactive_prune_min_reclaim_tokens: 4096 # Prune only commits when it reclaims at least this many tokens (0 = commit any)
982
+
983
+ # The summarization model/provider is configured under auxiliary:
984
+ auxiliary:
985
+ compression:
986
+ model: "" # Empty = use main chat model. Override with e.g. "google/gemini-3-flash-preview" for cheaper/faster compression.
987
+ provider: "auto" # Provider: "auto", "openrouter", "nous", "codex", "main", etc.
988
+ base_url: null # Custom OpenAI-compatible endpoint (overrides provider)
989
+ ```
990
+
991
+ :::info Legacy config migration
992
+ Older configs with `compression.summary_model`, `compression.summary_provider`, and `compression.summary_base_url` are automatically migrated to `auxiliary.compression.*` on first load (config version 17). No manual action needed.
993
+ :::
994
+
995
+ `progress_notices` (default `false`) controls whether **routine** compression progress statuses reach chat platforms (Telegram, Discord, Slack, etc.). By design, automatic compression is silent on chat surfaces — it runs in the background with server-side logging only. Set `progress_notices: true` to opt into seeing the routine lifecycle on chat platforms: the "Compacting context…" start notice, preflight/pre-API compression triggers, idle compaction, retry progress ("Compressed 30 → 12 messages, retrying…"), and the "Context compaction complete" notice. The gate is scoped to compression statuses only — unrelated operational noise (auxiliary model failures, provider rate-limit/retry chatter) stays suppressed either way. Compression **failure** notices and manual `/compress` feedback are always visible regardless of this setting. Editing this value on a running gateway takes effect on the next message.
996
+
997
+ `hygiene_hard_message_limit` is a gateway-only **pre-compression safety valve**. It exists to break a death spiral: when API calls keep disconnecting on an oversized session, the gateway never receives token-usage data, so the token-based threshold can't fire, so the transcript keeps growing and disconnects get worse. This count-based floor fires on message count alone (always known, regardless of API failures) to force compression and recover the session. Default `5000` — far above any normal session, including large-context (1M+) models doing thousands of short turns, which compress on the token threshold long before this. Raise it further for unusual platforms, lower it to force more aggressive compression. Editing this value on a running gateway takes effect on the next message (see below).
998
+
999
+ The same limit is also a **fail-closed bound on what the model is sent** whenever hygiene does not land by the time a turn starts — the turn-hold budget expired, the summary timed out or failed, a failure cooldown is active, another compression is still in flight, or compression is disabled. In that case the gateway keeps the leading system/setup rows plus the newest messages, total at most `hygiene_hard_message_limit`, and never starts the kept tail on an orphaned tool result. Only the payload of that one turn is clipped: the transcript on disk is untouched, nothing is deleted, and a summary that lands later is adopted as-is. This is what keeps a week-long DM from feeding the model the full uncompressed history when a compression pass keeps missing.
1000
+
1001
+ `hygiene_timeout_seconds` is the gateway's **inactivity budget** for this pre-agent compression pass — not a total wall-clock cap. The compression summary call streams from the model, and each arriving token counts as forward progress: a slow reasoning model that is still generating keeps extending its own deadline, so slow-but-healthy summary models are never cut off mid-generation. Only when the summary model produces **no output** for this many seconds (backend down, hung connection, silent provider) does the gateway warn the user, continue the incoming message without compression, and record a temporary per-session failure cooldown instead of appearing stuck.
1002
+
1003
+ `hygiene_total_ceiling_seconds` (default `600`) bounds the total wait even while tokens are still moving, so a degenerate trickle stream can't hold a turn hostage indefinitely. It is clamped to at least `hygiene_timeout_seconds`.
1004
+
1005
+ `hygiene_max_turn_hold_seconds` (default `10`) is the gateway's **turn-hold budget** — the maximum wall-clock the incoming message is held waiting on hygiene compression before the gateway stops waiting and proceeds on the uncompressed transcript. It exists because `hygiene_total_ceiling_seconds` alone can leave the wire silent for far longer than a chat transport's idle-timeout: a summary model that keeps streaming tokens keeps resetting the inactivity slice, so without a turn-hold budget the wait can stretch toward the ceiling while zero bytes reach the user — Telegram (and similar transports) then drop the connection and the turn appears frozen. Capping the turn's wait at this budget (well under the typical ~30s transport idle-timeout) guarantees the message is answered promptly. **The compression is not lost when the budget expires**: the worker keeps running detached and — when its commit is watermark-fenced (the normal case with a session DB) — it keeps its commit admission, so the finished summary is adopted at the next safe boundary and turns appended after the wait was abandoned survive verbatim as concurrent tail. This matters especially for **thinking/reasoning summary models** (DeepSeek, QwQ, etc.) whose reasoning phase alone can exceed the budget: their summaries land one turn late instead of never. If the commit cannot be safely fenced, the late result is discarded (`CompressionCommitFence`) and it cannot overwrite newer turns. Raise the budget if you'd rather have compression apply within the same turn and your transport tolerates the wait; lower it for snappier recovery on very slow backends.
1006
+
1007
+ `hygiene_failure_cooldown_seconds` controls that per-session cooldown after a hygiene compression timeout or abort. During the cooldown, the gateway skips repeated hygiene attempts for the same oversized session so every incoming message does not block on the same broken auxiliary backend. `/compress`, `/reset`, or a healthy later turn can still recover the session.
1008
+
1009
+ The value is the **first rung** of an escalating ladder, not a fixed interval: consecutive failures for the same session wait `1x`, `3x`, then `9x` this value, capped at one hour. A session whose summary model is permanently broken therefore backs off instead of retrying forever on a fixed interval, and a run that actually shrinks the transcript resets it to the first rung. Escalation is per-session and process-local — a gateway restart resets it to the first rung while the cooldown deadline itself survives.
1010
+
1011
+ `context_timeout_seconds` (default `120`) is the same **inactivity budget** for in-agent `compress_context` — the conversation loop, preflight compaction, and manual `/compress` — so a hung summary model cannot stall a session indefinitely. Streamed summary tokens extend the wait; only a silent worker is cut off. On timeout Hermes retries the summary once against the first entry of `auxiliary.compression.fallback_chain` (using that entry's own `timeout` when it declares one) — a stalled route never raises, so the auxiliary client's own fallback handling cannot see it. Only if that attempt also fails, or no fallback chain is configured, does Hermes skip compaction, keep the existing messages, and warn the user. Set to `0` to disable. Gateway session hygiene keeps its own `hygiene_timeout_seconds` path and is not double-wrapped.
1012
+
1013
+ `context_total_ceiling_seconds` (default `600`) bounds the in-agent **pre-commit** wait (summary / stream phase) even while tokens are still moving. It is clamped to at least `context_timeout_seconds`. The exact guarantee: **the summary phase is bounded by this ceiling; the commit phase is logged and surfaced if it exceeds it.** Once the worker has entered the compression commit fence and SessionDB mutation is in flight, the commit is never abandoned mid-flight — that would risk transcript divergence — but the wait is no longer silent: if the commit runs past the ceiling, Hermes logs the overrun (WARNING, escalating to ERROR on repeat), sends a one-shot warning through the user-visible warning channel, and keeps waiting in bounded increments until the commit completes. When the ceiling expires during the summary phase, the summary model's stream is closed at that same instant on every auxiliary wire (chat.completions, Codex Responses, Anthropic Messages) — an abandoned summary is not billed to completion on a connection nobody is waiting for, and its session lease is freed for the next attempt.
1014
+
1015
+ `protect_first_n` controls how many **non-system** head messages are pinned across every compaction. Default `3` — the opening user/assistant exchange survives every summarizer pass so the original goal stays visible. On long-running rolling-compaction sessions where the opening turn is no longer relevant, set `protect_first_n: 0` to pin nothing but the system prompt + summary + tail. The system prompt itself is always preserved regardless of this setting.
1016
+
1017
+ `in_place` (default `true`) controls what happens to the session identity when compaction fires. When `true`, compaction rewrites the message list and rebuilds the system prompt **without rotating the session id** — the conversation keeps one durable id for its whole life (no `parent_session_id` chain, no `name #2` / `#3` renumbering in session lists). Compaction is non-destructive: the live context is compacted, but the pre-compaction turns are soft-archived under the same id (marked inactive/compacted) — still searchable via `session_search` and recoverable, not deleted. Hooks see the mode via the `in_place` field on the `session:compress` event. Set `in_place: false` to restore the legacy behavior where each compaction rotates to a new session id linked to the old one.
1018
+
1019
+ `threshold_tokens` sets an optional **absolute token cap** for the compression trigger. When set, compression fires at the lower of the ratio-based `threshold` and this absolute count — so compression never fires later than the user's preferred token number regardless of which model is active. This solves the problem where switching between models with different context windows (e.g. 1M → 400K) shifts the absolute trigger point. The cap is clamped to the model's context length, so setting it higher than the model supports is safe — the ratio-based threshold is used instead. Default `null` (disabled — ratio-based threshold only). The cap survives model switches and fallback activations.
1020
+
1021
+ `idle_compact_after_seconds` is an **opt-in, time-based** trigger that complements the size-based `threshold`. Default `0` (disabled). When set above 0, a session that resumes after at least that many seconds of inactivity compacts its accumulated history up front, before the first reply — so a long-lived thread (e.g. a Telegram conversation you come back to hours later) doesn't re-read its full stale context on every subsequent turn. It never fires when the context is already at or below the post-compression target (`threshold × target_ratio`), and it honors the same failure-cooldown, anti-thrash, and per-session lock guards as every automatic compaction. Example: `idle_compact_after_seconds: 1800` compacts after 30 minutes idle.
1022
+
1023
+ `proactive_prune_tokens` enables a deterministic, no-LLM prune of old tool-result payloads that runs independently of `threshold`. On large-window models the `threshold` compaction (≈50% of the window) rarely fires, so bulky tool outputs (terminal dumps, file reads, web extracts) ride along in history and get re-sent on every subsequent turn. When re-sent history exceeds `proactive_prune_tokens` (default `0` = off; try `48000` to enable), the prune dedupes identical results, summarizes older oversized ones, and truncates large tool-call arguments — protecting the most recent `protect_last_n` messages and never calling the model. Full outputs stay recoverable from the session store. `proactive_prune_min_result_chars` (default `8000`, clamped to ≥ 200) sets the size below which a tool result is left untouched. `proactive_prune_min_reclaim_tokens` (default `4096`) prevents a prune from committing unless it reclaims at least that many tokens — a committed prune rewrites already-sent history and invalidates the provider's prompt-cache prefix, so this gate keeps those cache breaks episodic and amortized (one meaningful break, like a compression boundary) instead of firing on every tool iteration. This runs only under the built-in `compressor` engine; other context engines inherit a no-op.
1024
+
1025
+ :::tip Gateway hot-reload of compression and context length
1026
+ As of recent releases, editing `model.context_length` or any `compression.*` key in `config.yaml` on a running gateway takes effect on the next message — no gateway restart, no `/reset`, no session rotation required. The cached-agent signature includes these keys, so the gateway transparently rebuilds the agent when it sees a change. API keys and tool/skill config still require the usual reload paths.
1027
+ :::
1028
+
1029
+ ### Common setups
1030
+
1031
+ **Default (auto-detect) — no configuration needed:**
1032
+ ```yaml
1033
+ compression:
1034
+ enabled: true
1035
+ threshold: 0.50
1036
+ ```
1037
+ Uses your main provider and main model. Override per-task (e.g. `auxiliary.compression.provider: openrouter` + `model: google/gemini-2.5-flash`) if you want compression on a cheaper model than your main chat model.
1038
+
1039
+ **Force a specific provider** (OAuth or API-key based):
1040
+ ```yaml
1041
+ auxiliary:
1042
+ compression:
1043
+ provider: nous
1044
+ model: gemini-3-flash
1045
+ ```
1046
+ Works with any provider: `nous`, `openrouter`, `codex`, `anthropic`, `main`, etc.
1047
+
1048
+ **Custom endpoint** (self-hosted, Ollama, zai, DeepSeek, etc.):
1049
+ ```yaml
1050
+ auxiliary:
1051
+ compression:
1052
+ model: glm-4.7
1053
+ base_url: https://api.z.ai/api/coding/paas/v4
1054
+ ```
1055
+ Points at a custom OpenAI-compatible endpoint. Uses `OPENAI_API_KEY` for auth.
1056
+
1057
+ ### How the three knobs interact
1058
+
1059
+ | `auxiliary.compression.provider` | `auxiliary.compression.base_url` | Result |
1060
+ |---------------------|---------------------|--------|
1061
+ | `auto` (default) | not set | Auto-detect best available provider |
1062
+ | `nous` / `openrouter` / etc. | not set | Force that provider, use its auth |
1063
+ | any | set | Use the custom endpoint directly (provider ignored) |
1064
+
1065
+ :::warning Summary model context length requirement
1066
+ The summary model **must** have a context window at least as large as your main agent model's. The compressor sends the full middle section of the conversation to the summary model — if that model's context window is smaller than the main model's, the summarization call will fail with a context length error. When this happens, the middle turns are **dropped without a summary**, losing conversation context silently. If you override the model, verify its context length meets or exceeds your main model's.
1067
+ :::
1068
+
1069
+ ## Gateway Turn Lease Timeout
1070
+
1071
+ The gateway serializes turns by their resolved session ID so two routing keys
1072
+ cannot load and write the same transcript concurrently. Configure the maximum
1073
+ lease wait independently of the ordinary agent inactivity timeout:
1074
+
1075
+ ```yaml
1076
+ agent:
1077
+ gateway_turn_lease_timeout: 5
1078
+ ```
1079
+
1080
+ If another turn still holds the session lease when this budget expires, Hermes
1081
+ fails closed: it does not load the transcript or run the model for the waiting
1082
+ message. The user receives a rejection notice and must resend. Hermes does not
1083
+ automatically requeue the message because doing so without durable ordering and
1084
+ idempotency could process it twice. Non-positive values use the 5-second
1085
+ default.
1086
+
1087
+ ## Session Stall Watchdog
1088
+
1089
+ The gateway runs a notify-only stall watchdog (`agent.session_stall_timeout`, default `300` seconds, `0` = disabled). When a busy session has a **pending inbound follow-up** and the agent's shared activity clock has been idle for at least this long, the gateway logs a WARNING and sends the user a one-shot notification:
1090
+
1091
+ ```
1092
+ ⚠️ Agent session appears stalled (last activity N min ago). Try /new to reset.
1093
+ ```
1094
+
1095
+ Semantics:
1096
+
1097
+ - **Notify-only.** The watchdog never kills the turn — contrast `agent.gateway_timeout`, which cancels a run after prolonged inactivity. The stall notice just tells you the agent looks wedged so you can decide (`/new`, `/stop`, or keep waiting).
1098
+ - **One notification per stall episode.** The latch clears when the pending inbound drains or activity resumes, so a session that recovers and stalls again notifies again.
1099
+ - Progress comes only from the shared activity snapshot (tool calls, API stream progress, compression heartbeats). Pending inbound is a notify gate, not a progress clock.
1100
+
1101
+ ```yaml
1102
+ agent:
1103
+ session_stall_timeout: 300 # seconds; 0 disables the watchdog
1104
+ ```
1105
+
1106
+ ## Reconnect Attention Escalation
1107
+
1108
+ When a platform adapter fails to connect (network outage, revoked bot token, broken sidecar), the gateway retries it indefinitely with capped exponential backoff — retries never stop, so a transient outage always self-heals without operator action. The downside is that a *permanent* failure (a revoked Telegram token, missing Discord privileged intents) looks identical to a blip: "retrying", forever.
1109
+
1110
+ Two mechanisms make permanent failures visible:
1111
+
1112
+ - **Terminal classification.** Failures whose exception *type* proves they can never self-heal — rejected/revoked tokens (`telegram_auth_error`, `discord_auth_error`, `email_auth_error`), missing privileged intents (`discord_intents_required`), a Photon sidecar whose dependencies cannot install (`SIDECAR_DEPS_MISSING`) or whose node binary is missing (`SIDECAR_NODE_MISSING`) — are marked fatal instead of entering the retry queue. Classification is strictly type-based; ambiguous errors always keep retrying.
1113
+ - **Needs-attention escalation.** A platform continuously in the retry queue past `agent.reconnect_attention_after` (default `7200` seconds = 2 hours, `0` disables) gets `needs_attention: true` and a `retrying_since` timestamp in gateway runtime status (`hermes status`), plus a WARNING log. Retries continue unchanged — this is a signal, not a circuit breaker. The flag clears on successful reconnect.
1114
+
1115
+ ```yaml
1116
+ agent:
1117
+ reconnect_attention_after: 7200 # seconds; 0 disables the escalation flag
1118
+ ```
1119
+
1120
+ ## Gateway Agent Cache
1121
+
1122
+ The gateway keeps one agent per session so a conversation reuses its cached prompt prefix instead of rebuilding the system prompt every turn. That cached agent also holds the session's full transcript — tool output included, which is tens of megabytes on a session with a hundred tool calls. On a busy multi-platform gateway the cache is therefore the largest single consumer of memory in the process.
1123
+
1124
+ ```yaml
1125
+ agent:
1126
+ agent_cache:
1127
+ max_size: 128 # LRU entry cap
1128
+ idle_ttl_secs: 3600 # evict an agent idle this long
1129
+ memory_high_mb: auto # anon-RSS budget; number, "auto", or 0/off
1130
+ max_evictions_per_pass: 16
1131
+ protect_recent: 8
1132
+ ```
1133
+
1134
+ `max_size` and `idle_ttl_secs` bound the cache by count and by time. Neither knows how many bytes it holds, so `memory_high_mb` adds a third bound: once anonymous memory crosses the budget, it sheds least-recently-used transcripts, which reload from the stored session on the next turn. Lower it if the gateway is competing for memory with other services; raise it (or set `0` to switch the pass off) if you would rather keep every prefix warm.
1135
+
1136
+ `auto` derives the budget from the memory limit the gateway actually runs under — the cgroup limit for a container or systemd unit, total RAM otherwise — so a `MemoryMax`/`MemoryHigh` on the unit is respected without a second number to keep in sync. Under such a limit the measurement is scoped the same way: the cgroup's own anonymous charge (`memory.stat` `anon`), which includes child processes such as `execute_code` kernels and terminal commands that count against the unit's limit. Uncapped, the gateway's own anonymous RSS is measured.
1137
+
1138
+ Sessions that are mid-turn, the `protect_recent` most recently used ones, and any session whose transcript has not finished being written to disk are never shed. Eviction is logged at WARNING with the measured RSS and the sessions dropped:
1139
+
1140
+ ```
1141
+ Agent cache pressure: anon RSS 6802MB over budget 6656MB — evicting 5 LRU session(s): ...
1142
+ ```
1143
+
1144
+ ## Context Engine
1145
+
1146
+ The context engine controls how conversations are managed when approaching the model's token limit. The built-in `compressor` engine uses lossy summarization (see [Context Compression](/developer-guide/context-compression-and-caching)). Plugin engines can replace it with alternative strategies.
1147
+
1148
+ ```yaml
1149
+ context:
1150
+ engine: "compressor" # default — built-in lossy summarization
1151
+ ```
1152
+
1153
+ To use a plugin engine (e.g., LCM for lossless context management):
1154
+
1155
+ ```yaml
1156
+ context:
1157
+ engine: "lcm" # must match the plugin's name
1158
+ ```
1159
+
1160
+ Plugin engines are **never auto-activated** — you must explicitly set `context.engine` to the plugin name. Available engines can be browsed and selected via `hermes plugins` → Provider Plugins → Context Engine.
1161
+
1162
+ See [Memory Providers](/user-guide/features/memory-providers) for the analogous single-select system for memory plugins.
1163
+
1164
+ ## Iteration Budget
1165
+
1166
+ When the agent is working on a complex task with many tool calls, it can burn through its iteration budget (default: 500 turns). Hermes does **not** inject mid-task pressure warnings — earlier builds warned the model at 70%/90% budget, which caused models to abandon complex tasks prematurely and was removed in April 2026.
1167
+
1168
+ Instead, when the budget is actually exhausted (500/500), Hermes injects one message asking the model to wrap up and allows a single **grace call** so it can deliver a final response. If that grace call still doesn't produce text, the agent is asked to summarise what it accomplished.
1169
+
1170
+ ```yaml
1171
+ agent:
1172
+ max_turns: none # Iterations per conversation turn (default: none = unlimited)
1173
+ # Set a positive integer to cap; "none"/"null"/
1174
+ # "unlimited"/"inf"/"infinity"/"infinite"/0/-1 = no limit
1175
+ budget_warning_ratio: null # Optional one-time checkpoint warning, e.g. 0.75
1176
+ api_max_retries: 3 # Retries per provider before fallback engages (default: 3)
1177
+ ```
1178
+
1179
+ `agent.max_turns` is **unlimited by default** — the turn cap caused more problems than it solved (silent mid-task truncation), so out of the box Hermes runs a conversation turn to completion. To impose a cap, set a positive integer. To be explicit about "no limit", any of these case-insensitive spellings work: `"none"`, `"null"`, `"unlimited"`, `"infinite"`, `"infinity"`, `"inf"`, `0`, `-1` (they resolve to a `sys.maxsize` sentinel so the loop never exits on a turn count).
1180
+
1181
+ `agent.budget_warning_ratio` is off by default for ordinary and delegated conversations. When set to a value strictly between `0` and `1` alongside a finite `max_turns`, Hermes appends one model-visible checkpoint notice to the latest tool result after the threshold is reached. The notice rearms each conversation turn and uses each agent's own iteration budget. It only appends to a current tool-result tail, never an older turn, and does not add a synthetic user/system message or change the existing exhaustion grace call. Dispatcher-owned Kanban workers receive a completion checkpoint at 90% by default (an explicit ratio changes that threshold), while their tools are still available. The checkpoint asks for verified completion or a durable progress comment, not premature success.
1182
+
1183
+ `agent.api_max_retries` controls how many times Hermes retries a provider API call on transient errors (rate limits, connection drops, 5xx) **before** fallback-provider switching engages. The default is `3` — four attempts total. If you have [fallback providers](/user-guide/features/fallback-providers) configured and want to fail over faster, drop this to `0` so the first transient error on your primary immediately hands off to the fallback instead of churning retries against the flaky endpoint.
1184
+
1185
+ ## Wall-Clock Run Budget
1186
+
1187
+ Separate from the iteration budget, you can give each conversation run an optional **wall-clock** budget. This is designed for one-shot and eval-harness invocations that run under a hard external ceiling (e.g. a 900-second per-task limit): without it, a run can time out with the work essentially done — one generation short of emitting the final answer, or stuck in a single hung provider call.
1188
+
1189
+ ```yaml
1190
+ agent:
1191
+ run_budget_seconds: null # Optional; unset/null = feature fully off (default)
1192
+ ```
1193
+
1194
+ Or per-invocation via the CLI:
1195
+
1196
+ ```bash
1197
+ hermes chat --run-budget 850 -q "..."
1198
+ ```
1199
+
1200
+ When a budget is set, two things happen:
1201
+
1202
+ 1. **Wrap-up notice at 80%.** When 80% of the budget has elapsed, Hermes injects a **one-time** notice (delivered cache-safely, appended to the newest tool result like `/steer` messages) telling the model to stop new discovery/verification work and produce the final deliverable from the state it already has. It fires at most once per run and mirrors the existing iteration-budget wrap-up mechanism — there are no repeated pressure warnings.
1203
+ 2. **Deadline-scaled stale timeouts.** Implicit non-streaming stale timeouts (the 90s default and the reasoning-model floors, e.g. 600s for DeepSeek reasoning models) are capped at `max(60, remaining_budget × 0.5)` so a single silently-hung provider call can never consume the rest of the run. The cap only ever *tightens* the timeout — it never raises it — and an explicitly configured `stale_timeout_seconds` (provider/model config or `HERMES_API_CALL_STALE_TIMEOUT`) always wins untouched.
1204
+
1205
+ The budget is per `run_conversation` turn (it resets on each user message) and the feature is completely dormant when unset — no clock reads, no injection, no timeout changes.
1206
+
1207
+ ## Verify-on-Stop (coding verification)
1208
+
1209
+ When enabled, Hermes refuses to accept a final answer on a turn where the agent edited code in a workspace but produced no fresh verification evidence (a passing test run, build, lint, etc.) — it injects a synthetic follow-up asking the agent to verify or explain why it can't. Doc/markdown/skill-only edits never trigger it, and the loop is bounded so it can never trap the agent.
1210
+
1211
+ ```yaml
1212
+ agent:
1213
+ verify_on_stop: false # true | false | "auto" (surface-aware: on for CLI/TUI/desktop, off for messaging)
1214
+ verify_guidance: true # Append creative-UI / clean-diff guidance to the missing-evidence nudge
1215
+ max_verify_nudges: 3 # Cap on consecutive continue nudges per turn (built-in + pre_verify hooks)
1216
+ coding_instructions: "" # Standing project-wide coding rules appended to the coding brief
1217
+ ```
1218
+
1219
+ `verify_on_stop` accepts `true` (on everywhere), `false` (off — the default), or `"auto"` (legacy surface-aware behavior: on for interactive coding surfaces — CLI, TUI, desktop — and programmatic callers; off for messaging surfaces like Telegram/Discord where the verification narrative reads as chat noise). Off is the default everywhere: fresh installs ship `false` and the config migration turned it off on existing installs, so enabling it is an explicit opt-in. The `HERMES_VERIFY_ON_STOP` env var overrides the config value when set.
1220
+
1221
+ The evidence that feeds this guard (which test/lint/build commands ran, which files were edited since) lives in `~/.hermes/verification_evidence.db`. That ledger is only written or created while the guard is enabled; with `verify_on_stop: false` nothing is recorded and an existing file can be deleted freely.
1222
+
1223
+ For a user/plugin policy gate at the same point — keep the agent going with your own checks — see the [`pre_verify` hook](/user-guide/features/hooks#pre_verify).
1224
+
1225
+ ## Standing Goals (`/goal`)
1226
+
1227
+ When a standing goal is active, Hermes judges whether each assistant response satisfies it. If not, it feeds a continuation prompt back into the same session and keeps working until the goal is done, the turn budget is exhausted, or the user pauses/clears it. The turn budget is the real backstop — judge failures fail **open** (continue) so a flaky judge never wedges progress.
1228
+
1229
+ ```yaml
1230
+ goals:
1231
+ max_turns: 20 # Max continuation turns before Hermes auto-pauses the goal (default: 20)
1232
+ ```
1233
+
1234
+ `max_turns` caps how many continuation turns a goal can drive before Hermes auto-pauses it and asks the user to `/goal resume`. It protects against judge false negatives (goal actually done but judge says continue) and unbounded model spend on fuzzy or unachievable goals. See [Goals](/user-guide/features/goals) for the full feature.
1235
+
1236
+ ### API Timeouts
1237
+
1238
+ Hermes has separate timeout layers for streaming, plus a stale detector for non-streaming calls. The stale detectors auto-adjust for local providers only when you leave them at their implicit defaults.
1239
+
1240
+ | Timeout | Default | Local providers | Config / env |
1241
+ |---------|---------|----------------|--------------|
1242
+ | Socket read timeout | 120s | Auto-raised to 1800s | `HERMES_STREAM_READ_TIMEOUT` |
1243
+ | Stale stream detection | 180s | Raised to a 900s ceiling (`agent.local_stream_stale_timeout`) | `HERMES_STREAM_STALE_TIMEOUT` |
1244
+ | Stale non-stream detection | 90s | Auto-disabled when left implicit | `providers.<id>.stale_timeout_seconds` or `HERMES_API_CALL_STALE_TIMEOUT` |
1245
+ | API call (non-streaming) | 1800s | Unchanged | `providers.<id>.request_timeout_seconds` / `timeout_seconds` or `HERMES_API_TIMEOUT` |
1246
+
1247
+ The **socket read timeout** controls how long httpx waits for the next chunk of data from the provider. Local LLMs can take minutes for prefill on large contexts before producing the first token, so Hermes raises this to 30 minutes when it detects a local endpoint. If you explicitly set `HERMES_STREAM_READ_TIMEOUT`, that value is always used regardless of endpoint detection.
1248
+
1249
+ The **stale stream detection** kills connections that receive SSE keep-alive pings but no actual content. For local providers (which don't send keep-alive pings during prefill) the default is raised to a finite 900-second ceiling instead of the 180s base — configurable via `agent.local_stream_stale_timeout` or the `HERMES_LOCAL_STREAM_STALE_TIMEOUT` env var.
1250
+
1251
+ The **stale non-stream detection** kills non-streaming calls that produce no response for too long. By default Hermes disables this on local endpoints to avoid false positives during long prefills. If you explicitly set `providers.<id>.stale_timeout_seconds`, `providers.<id>.models.<model>.stale_timeout_seconds`, or `HERMES_API_CALL_STALE_TIMEOUT`, that explicit value is honored even on local endpoints.
1252
+
1253
+ This budget bounds every non-streaming call. A provider that accepts a request and then goes silent — connection held open, no bytes, no error — is aborted at the stale timeout and retried, rather than hanging until the much longer socket read timeout (or, for an unattended cron run, until something external kills the process).
1254
+
1255
+ The periodic provider-wait notice appears only after at least **60 seconds of silence**. The Codex Responses **waiting status** describes silence, not total generation time: active stream events (including reasoning) keep it quiet. If events stop, it reports time without stream events instead of claiming no response has arrived; the notice clears when events resume. When a reconnect starts a fresh first-event watchdog phase, the waiting status follows that phase. This display behavior does not extend the separate wall-clock stale-call budget or change watchdog timeouts. Chat-completion streams likewise clear their silence warning promptly when chunks resume, without replacing a local model-loading status.
1256
+
1257
+ Cron jobs and delegated subagents stream too. They run the request inline on their own thread (the interrupt worker other sessions use wedges inside the gateway's nested thread pools), but the wire request is still `stream: true`, so the **stale stream detection** budget above governs them — every token counts as liveness, so a reasoning model that thinks for minutes is not mistaken for a hung provider, and edge proxies that kill silent connections keep seeing bytes.
1258
+
1259
+ ### Disabling API streaming
1260
+
1261
+ `model.streaming: false` forces non-streaming requests for the whole session — parent and subagents alike. It is an escape hatch for self-hosted OpenAI-compatible servers whose *streaming* tool-call path is broken (for example vLLM with `--tool-call-parser qwen3_xml` plus a reasoning parser can leak tool-call markup into plain text and return zero `tool_calls`, so delegated tasks silently no-op). Default is `true`; leave it unless you hit that class of bug, since non-streaming calls lose the liveness properties described above. This is separate from `display.streaming`, which only controls token rendering in the terminal.
1262
+
1263
+ Hermes also switches a session to non-streaming on its own when streaming cannot make progress: the provider reports that streaming is not supported, or an OpenAI-compatible gateway answers a streaming request with a contentless SSE frame (a bare `data:` / `event: ping` keepalive with no payload, typical of a degraded relay). The turn is retried without streaming, a warning is shown, and streaming stays off for the rest of that session.
1264
+
1265
+ ```yaml
1266
+ model:
1267
+ streaming: false
1268
+ ```
1269
+
1270
+ ## Context Pressure Warnings
1271
+
1272
+ Separate from iteration budget pressure, context pressure tracks how close the conversation is to the **compaction threshold** — the point where context compression fires to summarize older messages. This helps both you and the agent understand when the conversation is getting long.
1273
+
1274
+ | Progress | Level | What happens |
1275
+ |----------|-------|-------------|
1276
+ | **≥ 60%** to threshold | Info | CLI shows a cyan progress bar; gateway sends an informational notice |
1277
+ | **≥ 85%** to threshold | Warning | CLI shows a bold yellow bar; gateway warns compaction is imminent |
1278
+
1279
+ In the CLI, context pressure appears as a progress bar in the tool output feed:
1280
+
1281
+ ```
1282
+ ◐ context ████████████░░░░░░░░ 62% to compaction 48k threshold (50%) · approaching compaction
1283
+ ```
1284
+
1285
+ On messaging platforms, a plain-text notification is sent:
1286
+
1287
+ ```
1288
+ ◐ Context: ████████████░░░░░░░░ 62% to compaction (threshold: 50% of window).
1289
+ ```
1290
+
1291
+ If auto-compression is disabled, the warning tells you context may be truncated instead.
1292
+
1293
+ Context pressure is automatic — no configuration needed. It fires purely as a user-facing notification and does not modify the message stream or inject anything into the model's context.
1294
+
1295
+ ## Credential Pool Strategies
1296
+
1297
+ When you have multiple API keys or OAuth tokens for the same provider, configure the rotation strategy:
1298
+
1299
+ ```yaml
1300
+ credential_pool_strategies:
1301
+ openrouter: round_robin # cycle through keys evenly
1302
+ anthropic: least_used # always pick the least-used key
1303
+ ```
1304
+
1305
+ Options: `fill_first` (default), `round_robin`, `least_used`, `random`. See [Credential Pools](/user-guide/features/credential-pools) for full documentation.
1306
+
1307
+ ## Prompt caching
1308
+
1309
+ Hermes turns on cross-session prompt caching automatically when the active provider supports it — no user config needed.
1310
+
1311
+ For Claude on **native Anthropic**, **OpenRouter**, and **Nous Portal**, Hermes attaches `cache_control` breakpoints with the 1-hour TTL (`ttl: "1h"`) on the system prompt and skill blocks. The first send within a fresh hour pays full input rates; subsequent sends across any session within the same hour pull from the cache at the discounted cached-read rate. This means the system prompt, loaded skill content, and the early portion of any long-context include get reused across `hermes` sessions and across forked subagents for the first hour.
1312
+
1313
+ The Qwen Cloud (Alibaba DashScope) upstream caps cache TTL at 5 minutes, so Hermes uses the 5-minute breakpoint TTL there instead. Other Claude-via-third-party paths (AWS Bedrock, Azure Foundry) fall back to the provider's own caching defaults. xAI Grok uses a separate session-pinned conversation-id mechanism — see [xAI prompt caching](/integrations/providers#xai-grok--responses-api--prompt-caching).
1314
+
1315
+ No knob exists to disable this — caching is always-on and saves money even on single-turn conversations because the system prompt alone is a meaningful fraction of the input token count.
1316
+
1317
+ The one explicit knob is the cache TTL tier Hermes requests on Anthropic-style breakpoints:
1318
+
1319
+ ```yaml
1320
+ prompt_caching:
1321
+ cache_ttl: "5m" # "5m" or "1h" (Anthropic-supported tiers); other values are ignored
1322
+ ```
1323
+
1324
+ `cache_ttl` selects the breakpoint TTL Hermes attaches for Claude via the native Anthropic API, OpenRouter, and Nous Portal. Only the two Anthropic-supported tiers (`"5m"`, `"1h"`) are honored — any other value is ignored. Providers with their own caps (e.g. Qwen Cloud, which maxes at 5 minutes) still clamp to what the upstream allows.
1325
+
1326
+ ## Auxiliary Models
1327
+
1328
+ Hermes uses "auxiliary" models for side tasks like image analysis, browser screenshot analysis, session-title generation, and context compression. By default (`auxiliary.*.provider: "auto"`), Hermes routes every auxiliary task to your **main chat model** — the same provider/model you picked in `hermes model`. You don't need to configure anything to get started, but be aware that on expensive reasoning models (Opus, MiniMax M2.7, etc.) auxiliary tasks add meaningful cost. If you want cheap-and-fast side tasks regardless of your main model, set `auxiliary.<task>.provider` and `auxiliary.<task>.model` explicitly (for example, Gemini Flash on OpenRouter for vision). (Web extraction is not an auxiliary task: `web_extract` and browser snapshots truncate long content deterministically and store the full text for `read_file` paging — no LLM involved.)
1329
+
1330
+ :::note Why "auto" uses your main model
1331
+ Earlier builds split aggregator users (OpenRouter, Nous Portal) onto a cheap provider-side default. That was surprising — users who paid for an aggregator subscription would see a different model handling their auxiliary traffic. `auto` now uses the main model for everyone, and per-task overrides in `config.yaml` still win (see [Full auxiliary config reference](#full-auxiliary-config-reference) below).
1332
+ :::
1333
+
1334
+ ### Configuring auxiliary models interactively
1335
+
1336
+ Instead of hand-editing YAML, run `hermes model` and pick **"Configure auxiliary models"** from the menu. You'll get an interactive per-task picker:
1337
+
1338
+ ```
1339
+ $ hermes model
1340
+ → Configure auxiliary models
1341
+
1342
+ [ ] vision currently: auto / main model
1343
+ [ ] title_generation currently: openrouter / google/gemini-3-flash-preview
1344
+ [ ] tts_audio_tags currently: auto / main model
1345
+ [ ] compression currently: auto / main model
1346
+ [ ] approval currently: auto / main model
1347
+ [ ] triage_specifier currently: auto / main model
1348
+ [ ] kanban_decomposer currently: auto / main model
1349
+ [ ] profile_describer currently: auto / main model
1350
+ [ ] delegation currently: auto / inherit main agent
1351
+ ```
1352
+
1353
+ Select a task, pick a provider (OAuth flows open a browser; API-key providers prompt), pick a model. The change persists to `auxiliary.<task>.*` in `config.yaml`. Same machinery as the main-model picker — no extra syntax to learn.
1354
+
1355
+ The **Delegation** entry is special: it routes the model used by `delegate_task` subagents and persists to the top-level `delegation.*` section (`delegation.provider` / `delegation.model`) rather than `auxiliary.*`, because subagents are full child agents, not side-LLM calls. Its `auto` means "inherit the parent agent's provider, model, and credentials."
1356
+
1357
+ If you do not want Hermes to auto-generate titles after the first exchange, set
1358
+ `auxiliary.title_generation.enabled: false`. Manual titles still work through
1359
+ `/title` and `hermes sessions rename`.
1360
+
1361
+ ### Stream-only endpoints
1362
+
1363
+ Some OpenAI-compatible endpoints reject non-streaming chat requests outright (e.g. Tencent Copilot returns HTTP 400 `"Non-stream chat request is currently not supported"`). Interactive chat already streams, but auxiliary tasks (title generation, compression, vision) use non-streaming calls and would fail on every attempt. Hermes always treats `copilot.tencent.com` as stream-only; for any other such endpoint, list a URL substring under `auxiliary.stream_only_base_urls`:
1364
+
1365
+ ```yaml
1366
+ auxiliary:
1367
+ stream_only_base_urls:
1368
+ - "my-stream-only-proxy.example.com"
1369
+ ```
1370
+
1371
+ Matching auxiliary calls are sent with `stream=True` and the chunks (including tool-call deltas) are aggregated client-side — no behavior change for any other endpoint.
1372
+
1373
+ ### Video Tutorial
1374
+
1375
+ <div style={{position: 'relative', width: '100%', aspectRatio: '16 / 9', marginBottom: '1.5rem'}}>
1376
+ <iframe
1377
+ src="https://www.youtube.com/embed/NoF-YajElIM"
1378
+ title="Hermes Agent — Auxiliary Models Tutorial"
1379
+ style={{position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', border: 0}}
1380
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
1381
+ allowFullScreen
1382
+ />
1383
+ </div>
1384
+
1385
+ ### The universal config pattern
1386
+
1387
+ Every model slot in Hermes — auxiliary tasks, compression, fallback — uses the same three knobs:
1388
+
1389
+ | Key | What it does | Default |
1390
+ |-----|-------------|---------|
1391
+ | `provider` | Which provider to use for auth and routing | `"auto"` |
1392
+ | `model` | Which model to request | provider's default |
1393
+ | `base_url` | Custom OpenAI-compatible endpoint (overrides provider) | not set |
1394
+
1395
+ Auxiliary task blocks additionally accept a `reasoning_effort` knob:
1396
+
1397
+ | Key | What it does | Default |
1398
+ |-----|-------------|---------|
1399
+ | `reasoning_effort` | Thinking level for that task's LLM calls: `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`, `ultra` | not set (provider default) |
1400
+
1401
+ This is the per-task counterpart of the global `agent.reasoning_effort`: run compression at `low` or vision at `none` to cut side-task latency and cost when your main model is an expensive reasoning model, without touching your main chat behavior. It applies to auxiliary-client tasks such as `vision`, `compression`, `title_generation`, and `curator`, across all three auxiliary wire formats (chat completions, Codex Responses, Anthropic Messages). An explicit `extra_body.reasoning` on the same task wins over the shorthand.
1402
+
1403
+ **Background review is different:** a same-model review fork always inherits the parent's reasoning effort. `auxiliary.background_review.reasoning_effort` is ignored on that path, including when the parent provider/model is explicitly selected. This preserves byte-identical reasoning settings, system prompt, full conversation snapshot, and tool definitions for prompt-cache parity; there is no independent-effort switch for same-model reviews. See [background review reasoning](/user-guide/features/memory#same-model-review-reasoning). When the review is routed to a different provider/model, `reasoning_effort` applies to that routed fork (unset = the routed provider's default). Hermes prints a one-time warning when the key is set but the review runs on the main model.
1404
+
1405
+ **MoA also uses a different configuration:** reasoning depth for Mixture-of-Agents is configured **per slot** in the MoA preset (`moa.presets.<name>.reference_models[].reasoning_effort` / `aggregator.reasoning_effort`), not on the `moa_reference`/`moa_aggregator` auxiliary blocks — see [Mixture of Agents](/user-guide/features/mixture-of-agents).
1406
+
1407
+ ```yaml
1408
+ auxiliary:
1409
+ compression:
1410
+ reasoning_effort: "low" # summaries don't need deep thinking
1411
+ vision:
1412
+ reasoning_effort: "none" # disable thinking for image description
1413
+ ```
1414
+
1415
+ When `base_url` is set, Hermes ignores the provider and calls that endpoint directly (using `api_key` or `OPENAI_API_KEY` for auth). When only `provider` is set, Hermes uses that provider's built-in auth and base URL.
1416
+
1417
+ Available providers for auxiliary tasks: `auto`, `main`, plus any provider in the [provider registry](/reference/environment-variables) — `openrouter`, `nous`, `openai-codex`, `copilot`, `copilot-acp`, `anthropic`, `gemini`, `qwen-oauth`, `zai`, `kimi-coding`, `kimi-coding-cn`, `minimax`, `minimax-cn`, `minimax-oauth`, `deepseek`, `nvidia`, `xai`, `xai-oauth`, `ollama-cloud`, `alibaba`, `bedrock`, `huggingface`, `arcee`, `xiaomi`, `kilocode`, `opencode-zen`, `opencode-go`, `opencode-free`, `commandcode`, `commandcode-anthropic`, `ai-gateway`, `azure-foundry` — or any named custom provider from your `providers:` dict (e.g. `provider: "beans"`).
1418
+
1419
+ :::tip MiniMax OAuth
1420
+ `minimax-oauth` logs in via browser OAuth (no API key needed). Run `hermes model` and select **MiniMax (OAuth)** to authenticate. Auxiliary tasks use `MiniMax-M2.7-highspeed` automatically. See the [MiniMax OAuth guide](../guides/minimax-oauth.md).
1421
+ :::
1422
+
1423
+ :::tip xAI Grok OAuth
1424
+ `xai-oauth` logs in via browser OAuth for SuperGrok and X Premium+ subscribers (no API key needed). Run `hermes model` and select **xAI Grok OAuth (SuperGrok / Premium+)** to authenticate. The same OAuth token is reused for every direct-to-xAI surface (chat, auxiliary tasks, TTS, image gen, video gen, transcription). See the [xAI Grok OAuth guide](../guides/xai-grok-oauth.md), and if Hermes is on a remote host see [OAuth over SSH / Remote Hosts](../guides/oauth-over-ssh.md).
1425
+ :::
1426
+
1427
+ :::warning `"main"` is for auxiliary tasks only
1428
+ The `"main"` provider option means "use whatever provider my main agent uses" — it's only valid inside `auxiliary:`, `compression:`, and primary fallback entries (`fallback_providers:` or legacy `fallback_model:`). It is **not** a valid value for your top-level `model.provider` setting. If you use a custom OpenAI-compatible endpoint, set `provider: custom` in your `model:` section. See [AI Providers](/integrations/providers) for all main model provider options.
1429
+ :::
1430
+
1431
+ ### Full auxiliary config reference
1432
+
1433
+ ```yaml
1434
+ auxiliary:
1435
+ # Image analysis (vision_analyze tool + browser screenshots)
1436
+ vision:
1437
+ provider: "auto" # "auto", "openrouter", "nous", "codex", "main", etc.
1438
+ model: "" # e.g. "openai/gpt-4o", "google/gemini-2.5-flash"
1439
+ base_url: "" # Custom OpenAI-compatible endpoint (overrides provider)
1440
+ api_key: "" # API key for base_url (falls back to OPENAI_API_KEY)
1441
+ timeout: 120 # seconds — LLM API call timeout; vision payloads need generous timeout
1442
+ download_timeout: 30 # seconds — image HTTP download; increase for slow connections
1443
+ max_concurrency: 8 # max concurrent image encode/resize bursts across the process
1444
+ # (default: host CPU core count, no ceiling) — bounds only the
1445
+ # CPU-bound encode step so a video-frame fan-out can't saturate
1446
+ # every core and starve the event loop; LLM calls stay fully
1447
+ # concurrent. Minimum 1; values < 1 are ignored.
1448
+
1449
+ # Dangerous command approval classifier
1450
+ approval:
1451
+ provider: "auto"
1452
+ model: ""
1453
+ base_url: ""
1454
+ api_key: ""
1455
+ timeout: 30 # seconds
1456
+
1457
+ # Gemini 3.1 TTS hidden audio-tag insertion
1458
+ tts_audio_tags:
1459
+ provider: "auto"
1460
+ model: "" # empty = main chat model
1461
+ base_url: ""
1462
+ api_key: ""
1463
+ timeout: 30
1464
+
1465
+ # Context compression timeout (separate from compression.* config)
1466
+ compression:
1467
+ timeout: 120 # seconds — compression summarizes long conversations, needs more time
1468
+ # fallback_chain: # Optional — providers to try on rate-limit / connectivity failure
1469
+ # - provider: nous
1470
+ # model: deepseek/deepseek-chat
1471
+ # - provider: openrouter
1472
+ # model: google/gemini-2.5-flash
1473
+ # base_url: ""
1474
+ # api_key: ""
1475
+ # max_concurrency: 2 # Optional: cap simultaneous compression LLM calls so
1476
+ # multiple sessions don't pile retries on a degraded provider
1477
+
1478
+ # Auto-generated session titles. Empty language follows the conversation;
1479
+ # set e.g. "English" or "Japanese" to pin titles to one language.
1480
+ title_generation:
1481
+ enabled: true # set false to disable auto-title generation
1482
+ provider: "auto"
1483
+ model: ""
1484
+ base_url: ""
1485
+ api_key: ""
1486
+ timeout: 30
1487
+ language: ""
1488
+
1489
+ # Skills hub — skill matching and search
1490
+ skills_hub:
1491
+ provider: "auto"
1492
+ model: ""
1493
+ base_url: ""
1494
+ api_key: ""
1495
+ timeout: 30
1496
+
1497
+ # MCP tool dispatch
1498
+ mcp:
1499
+ provider: "auto"
1500
+ model: ""
1501
+ base_url: ""
1502
+ api_key: ""
1503
+ timeout: 30
1504
+
1505
+ # Auto-generated short session titles after the first exchange
1506
+ title_generation:
1507
+ provider: "auto"
1508
+ model: ""
1509
+ base_url: ""
1510
+ api_key: ""
1511
+ timeout: 30
1512
+ # max_concurrency: 2 # Optional: cap simultaneous title-generation calls
1513
+
1514
+ # Kanban triage specifier — `hermes kanban specify <id>` (or the
1515
+ # dashboard's ✨ Specify button on Triage-column cards) uses this
1516
+ # slot to expand a one-liner into a concrete spec and promote the
1517
+ # task to `todo`. Cheap fast models work well here; spec expansion
1518
+ # is short and doesn't need reasoning depth.
1519
+ triage_specifier:
1520
+ provider: "auto"
1521
+ model: ""
1522
+ base_url: ""
1523
+ api_key: ""
1524
+ timeout: 120
1525
+ ```
1526
+
1527
+ :::tip
1528
+ Each auxiliary task has a configurable `timeout` (in seconds). Defaults: vision 120s, approval 30s, compression 120s. Increase these if you use slow local models for auxiliary tasks. Vision also has a separate `download_timeout` (default 30s) for the HTTP image download — increase this for slow connections or self-hosted image servers.
1529
+ :::
1530
+
1531
+ :::info
1532
+ Context compression has its own `compression:` block for thresholds and an `auxiliary.compression:` block for model/provider settings — see [Context Compression](#context-compression) above. The primary fallback chain uses a top-level `fallback_providers:` list — see [Fallback Providers](/integrations/providers#fallback-providers). All three follow the same provider/model/base_url pattern.
1533
+ :::
1534
+
1535
+ ### Per-task fallback chain for auxiliary tasks
1536
+
1537
+ Each auxiliary task can optionally define a `fallback_chain` — a list of provider/model entries that Hermes tries when the primary auxiliary provider fails due to rate limits, connectivity issues, or payment restrictions:
1538
+
1539
+ ```yaml
1540
+ auxiliary:
1541
+ compression:
1542
+ provider: openrouter
1543
+ model: openai/gpt-4o-mini
1544
+ fallback_chain:
1545
+ - provider: nous
1546
+ model: deepseek/deepseek-chat
1547
+ - provider: openrouter
1548
+ model: google/gemini-2.5-flash
1549
+ ```
1550
+
1551
+ When the primary auxiliary provider (`openrouter` / `openai/gpt-4o-mini`) returns a rate-limit, connection timeout, or payment-required error, Hermes walks the `fallback_chain` in order. It skips entries whose provider matches the already-failed provider, and tries each remaining entry until one succeeds or the chain is exhausted. If all fallbacks fail, Hermes falls back to the main agent model as a final safety net.
1552
+
1553
+ Each entry supports the same three knobs as any auxiliary task config:
1554
+
1555
+ | Key | Description |
1556
+ |-----|-------------|
1557
+ | `provider` | Provider name (`nous`, `openrouter`, `anthropic`, `gemini`, `main`, etc.) |
1558
+ | `model` | Model name for that provider |
1559
+ | `base_url` | (Optional) Custom OpenAI-compatible endpoint |
1560
+
1561
+ `fallback_chain` is available on any auxiliary task — `compression`, `vision`, `approval`, `skills_hub`, `mcp`, etc.
1562
+
1563
+ ### Limiting auxiliary concurrency
1564
+
1565
+ `max_concurrency` caps in-flight LLM calls for auxiliary tasks such as `compression` and `title_generation` across the whole process. `auxiliary.vision.max_concurrency` is excluded: it already controls only vision's CPU-bound image encode/resize workers, not LLM requests. This is most useful when:
1566
+
1567
+ - Many sessions can spawn background work simultaneously (Discord/Telegram channels, multiple terminals)
1568
+ - Your provider is rate-limited or going through an incident and retries would amplify the burst
1569
+
1570
+ The default is unlimited. A typical safety cap is `2`:
1571
+
1572
+ ```yaml
1573
+ auxiliary:
1574
+ title_generation:
1575
+ max_concurrency: 2
1576
+ compression:
1577
+ max_concurrency: 2
1578
+ ```
1579
+
1580
+ The semaphore wraps the entire call including retries and fallbacks, so a single slow call counts only once toward the limit.
1581
+
1582
+ ### OpenRouter routing & Pareto Code for auxiliary tasks
1583
+
1584
+ When an auxiliary task resolves to OpenRouter (either explicitly or via `provider: "main"` while your main agent is on OpenRouter), the main agent's `provider_routing` and `openrouter.min_coding_score` settings **do not propagate** — by design, each auxiliary task is independent. To set OpenRouter provider preferences or use the [Pareto Code router](/integrations/providers#openrouter-pareto-code-router) for a specific aux task, set them per-task via `extra_body`:
1585
+
1586
+ ```yaml
1587
+ auxiliary:
1588
+ compression:
1589
+ provider: openrouter
1590
+ model: openrouter/pareto-code # use the Pareto Code router for this task
1591
+ extra_body:
1592
+ provider: # OpenRouter provider routing prefs
1593
+ order: [anthropic, google] # try these providers in order
1594
+ sort: throughput # or "price" | "latency"
1595
+ # only: [anthropic] # restrict to a specific provider
1596
+ # ignore: [deepinfra] # exclude specific providers
1597
+ plugins: # OpenRouter Pareto Code router knob
1598
+ - id: pareto-router
1599
+ min_coding_score: 0.5 # 0.0–1.0; higher = stronger coders
1600
+ ```
1601
+
1602
+ The shape mirrors what OpenRouter accepts in the chat completions request body. Hermes forwards the entire `extra_body` verbatim, so any other OpenRouter request-body field documented at [openrouter.ai/docs](https://openrouter.ai/docs) works the same way.
1603
+
1604
+ ### Changing the Vision Model
1605
+
1606
+ To use GPT-4o instead of Gemini Flash for image analysis:
1607
+
1608
+ ```yaml
1609
+ auxiliary:
1610
+ vision:
1611
+ model: "openai/gpt-4o"
1612
+ ```
1613
+
1614
+ Or via environment variable (in `~/.hermes/.env`):
1615
+
1616
+ ```bash
1617
+ AUXILIARY_VISION_MODEL=openai/gpt-4o
1618
+ ```
1619
+
1620
+ ### Provider Options
1621
+
1622
+ These options apply to **auxiliary task configs** (`auxiliary:`, `compression:`) and primary fallback entries (`fallback_providers:` or legacy `fallback_model:`), not to your main `model.provider` setting.
1623
+
1624
+ | Provider | Description | Requirements |
1625
+ |----------|-------------|-------------|
1626
+ | `"auto"` | Best available (default). Vision tries OpenRouter → Nous → Codex. | — |
1627
+ | `"openrouter"` | Force OpenRouter — routes to any model (Gemini, GPT-4o, Claude, etc.) | `OPENROUTER_API_KEY` |
1628
+ | `"nous"` | Force Nous Portal | `hermes auth` |
1629
+ | `"codex"` | Force Codex OAuth (ChatGPT account). Supports vision (gpt-5.3-codex). | `hermes model` → ChatGPT or Codex Subscription |
1630
+ | `"minimax-oauth"` | Force MiniMax OAuth (browser login, no API key). Uses MiniMax-M2.7-highspeed for auxiliary tasks. | `hermes model` → MiniMax (OAuth) |
1631
+ | `"xai-oauth"` | Force xAI Grok OAuth (browser login for SuperGrok or X Premium+ subscribers, no API key). Same OAuth token covers chat, TTS, image, video, and transcription. | `hermes model` → xAI Grok OAuth (SuperGrok / Premium+) |
1632
+ | `"main"` | Use your active custom/main endpoint. This can come from `OPENAI_BASE_URL` + `OPENAI_API_KEY` or from a custom endpoint saved via `hermes model` / `config.yaml`. Works with OpenAI, local models, or any OpenAI-compatible API. **Auxiliary tasks only — not valid for `model.provider`.** | Custom endpoint credentials + base URL |
1633
+
1634
+ Direct API-key providers from the main provider catalog also work here when you want side tasks to bypass your default router. For example, `gmi` is valid once `GMI_API_KEY` is configured, and `fireworks` is valid once `FIREWORKS_API_KEY` is configured:
1635
+
1636
+ ```yaml
1637
+ auxiliary:
1638
+ compression:
1639
+ provider: "gmi"
1640
+ model: "anthropic/claude-opus-4.6"
1641
+ ```
1642
+
1643
+ For GMI auxiliary routing, use the exact model ID returned by GMI's `/v1/models` endpoint. Fireworks model IDs use the provider's native slash form, for example `accounts/fireworks/models/glm-5p2`.
1644
+
1645
+ ### Common Setups
1646
+
1647
+ **Using a direct custom endpoint** (clearer than `provider: "main"` for local/self-hosted APIs):
1648
+ ```yaml
1649
+ auxiliary:
1650
+ vision:
1651
+ base_url: "http://localhost:1234/v1"
1652
+ api_key: "local-key"
1653
+ model: "qwen2.5-vl"
1654
+ ```
1655
+
1656
+ `base_url` takes precedence over `provider`, so this is the most explicit way to route an auxiliary task to a specific endpoint. For direct endpoint overrides, Hermes uses the configured `api_key` or falls back to `OPENAI_API_KEY`; it does not reuse `OPENROUTER_API_KEY` for that custom endpoint.
1657
+
1658
+ **Using OpenAI API key for vision:**
1659
+ ```yaml
1660
+ # In ~/.hermes/.env:
1661
+ # OPENAI_BASE_URL=https://api.openai.com/v1
1662
+ # OPENAI_API_KEY=sk-...
1663
+
1664
+ auxiliary:
1665
+ vision:
1666
+ provider: "main"
1667
+ model: "gpt-4o" # or "gpt-4o-mini" for cheaper
1668
+ ```
1669
+
1670
+ **Using OpenRouter for vision** (route to any model):
1671
+ ```yaml
1672
+ auxiliary:
1673
+ vision:
1674
+ provider: "openrouter"
1675
+ model: "openai/gpt-4o" # or "google/gemini-2.5-flash", etc.
1676
+ ```
1677
+
1678
+ **Using Codex OAuth** (ChatGPT Pro/Plus account — no API key needed):
1679
+ ```yaml
1680
+ auxiliary:
1681
+ vision:
1682
+ provider: "codex" # uses your ChatGPT OAuth token
1683
+ # model defaults to gpt-5.3-codex (supports vision)
1684
+ ```
1685
+
1686
+ **Using MiniMax OAuth** (browser login, no API key needed):
1687
+ ```yaml
1688
+ model:
1689
+ default: MiniMax-M2.7
1690
+ provider: minimax-oauth
1691
+ base_url: https://api.minimax.io/anthropic
1692
+ ```
1693
+ Run `hermes model` and select **MiniMax (OAuth)** to log in and set this automatically. For the China region, the base URL will be `https://api.minimaxi.com/anthropic`. See the [MiniMax OAuth guide](../guides/minimax-oauth.md) for the full walkthrough.
1694
+
1695
+ **Using a local/self-hosted model:**
1696
+ ```yaml
1697
+ auxiliary:
1698
+ vision:
1699
+ provider: "main" # uses your active custom endpoint
1700
+ model: "my-local-model"
1701
+ ```
1702
+
1703
+ `provider: "main"` uses whatever provider Hermes uses for normal chat — whether that's a named custom provider (e.g. `beans`), a built-in provider like `openrouter`, or a legacy `OPENAI_BASE_URL` endpoint.
1704
+
1705
+ :::tip
1706
+ If you use Codex OAuth as your main model provider, vision works automatically — no extra configuration needed. Codex is included in the auto-detection chain for vision.
1707
+ :::
1708
+
1709
+ :::warning
1710
+ **Vision requires a multimodal model.** If you set `provider: "main"`, make sure your endpoint supports multimodal/vision — otherwise image analysis will fail.
1711
+ :::
1712
+
1713
+ ### Environment Variables (legacy)
1714
+
1715
+ Auxiliary models can also be configured via environment variables. However, `config.yaml` is the preferred method — it's easier to manage and supports all options including `base_url` and `api_key`.
1716
+
1717
+ | Setting | Environment Variable |
1718
+ |---------|---------------------|
1719
+ | Vision provider | `AUXILIARY_VISION_PROVIDER` |
1720
+ | Vision model | `AUXILIARY_VISION_MODEL` |
1721
+ | Vision endpoint | `AUXILIARY_VISION_BASE_URL` |
1722
+ | Vision API key | `AUXILIARY_VISION_API_KEY` |
1723
+
1724
+ Compression and fallback model settings are config.yaml-only. (`AUXILIARY_WEB_EXTRACT_*` variables are obsolete — web extraction no longer uses an auxiliary LLM.)
1725
+
1726
+ :::tip
1727
+ Run `hermes config` to see your current auxiliary model settings. Overrides only show up when they differ from the defaults.
1728
+ :::
1729
+
1730
+ ## Reasoning Effort
1731
+
1732
+ Control how much "thinking" the model does before responding:
1733
+
1734
+ ```yaml
1735
+ agent:
1736
+ reasoning_effort: "" # empty = medium. Options: none, minimal, low, medium, high, xhigh, max, ultra
1737
+ ```
1738
+
1739
+ When unset (default), reasoning effort defaults to "medium" — a balanced level that works well for most tasks. Setting a value overrides it — higher reasoning effort gives better results on complex tasks at the cost of more tokens and latency.
1740
+
1741
+ :::note Adaptive-thinking models (Claude 4.6+, Fable/Mythos-class) over OpenRouter
1742
+ These models use *adaptive* thinking and don't accept the usual `reasoning.effort`
1743
+ field — OpenRouter ignores it for them. Hermes transparently routes your
1744
+ `reasoning_effort` to OpenRouter's `verbosity` parameter instead (which maps to
1745
+ Anthropic's `output_config.effort`), so the same effort knob keeps working with
1746
+ the levels supported by the selected model. `none` (or unset) leaves the model
1747
+ on its own adaptive default. The
1748
+ native Anthropic provider already controls effort directly and is unaffected.
1749
+ :::
1750
+
1751
+ :::note OpenRouter models and supported effort levels
1752
+ For other models routed through OpenRouter, Hermes reads the live model
1753
+ catalog's reasoning metadata (`supported_parameters` + per-model
1754
+ `reasoning.supported_efforts`) to decide whether to send reasoning controls at
1755
+ all and to clamp your requested effort to the nearest level the route actually
1756
+ supports (always downward — e.g. `ultra` becomes `high` on a route that stops
1757
+ at `high`, never a silent escalation). New reasoning-capable vendors work
1758
+ automatically without waiting for a Hermes update; when the catalog is
1759
+ unreachable or a model isn't listed, Hermes falls back to its built-in
1760
+ model-family list and passes your effort through unchanged.
1761
+ :::
1762
+
1763
+ You can also change the reasoning effort at runtime with the `/reasoning` command:
1764
+
1765
+ ```
1766
+ /reasoning # Show current effort level and display state
1767
+ /reasoning high # Set reasoning effort to high (this session only)
1768
+ /reasoning high --global # Set effort and persist to config.yaml
1769
+ /reasoning none # Disable reasoning (this session only)
1770
+ /reasoning show # Show model thinking above each response
1771
+ /reasoning hide # Hide model thinking
1772
+ ```
1773
+
1774
+ Effort changes are session-scoped by default; add `--global` to save the
1775
+ new level as your `agent.reasoning_effort` default.
1776
+
1777
+ #### Per-Model Reasoning Overrides
1778
+
1779
+ You can set different reasoning effort levels for different models. This is useful when you want high reasoning for complex models but medium for faster ones:
1780
+
1781
+ ```yaml
1782
+ agent:
1783
+ reasoning_effort: "medium" # global default
1784
+ reasoning_overrides:
1785
+ "openrouter/anthropic/claude-opus-4.5": "xhigh"
1786
+ "openai/gpt-5": "low"
1787
+ "claude-sonnet-4.6": "high" # bare model name also works
1788
+ ```
1789
+
1790
+ The key matching is **spelling-tolerant** — any reasonable spelling will match:
1791
+ - `claude-opus-4.5`, `claude-opus-4-5`, `claude-opus.4.5` (dots and dashes are interchangeable)
1792
+ - `anthropic/claude-opus-4.5`, `openrouter/anthropic/claude-opus-4.5` (provider prefix optional)
1793
+ - Exact matches take precedence over variants
1794
+
1795
+ :::note
1796
+ There is no `hermes config set` support for `reasoning_overrides` keys — edit the YAML file directly. This is because model names often contain dots (e.g. `claude-opus-4.5`), which conflict with the CLI's dotted-key syntax.
1797
+ :::
1798
+
1799
+ **Resolution priority:**
1800
+
1801
+ 1. Session-scoped `/reasoning --session` override (gateway only)
1802
+ 2. Per-model override from `agent.reasoning_overrides` (spelling-tolerant)
1803
+ 3. Global `agent.reasoning_effort`
1804
+ 4. Provider default
1805
+
1806
+ The override applies automatically everywhere: CLI startup, messaging gateway, Desktop/TUI, cron jobs, `/model` mid-session switches, and fallback model activation.
1807
+
1808
+ ## Fast Mode
1809
+
1810
+ Fast mode asks the provider for faster output at a premium price: OpenAI [Priority Processing](https://openai.com/api-priority-processing/) (`service_tier: priority`), xAI Priority Processing on Grok 4.6, and Anthropic [Fast Mode](https://platform.claude.com/docs/en/build-with-claude/fast-mode) (`speed: fast`, Opus 4.8 / Opus 5 only). It is **off by default**.
1811
+
1812
+ ```yaml
1813
+ agent:
1814
+ service_tier: "" # "" / normal | fast | auto | cold
1815
+ fast_auto_seconds: 60 # window for auto / cold
1816
+ ```
1817
+
1818
+ | Mode | When fast params are sent | Use it for |
1819
+ |------|---------------------------|------------|
1820
+ | `normal` (default, `""`) | Never | Cheapest; standard latency |
1821
+ | `fast` | Every request | Long interactive sessions where you always want speed |
1822
+ | `auto` | Requests in the first `fast_auto_seconds` of **every** turn | Snappy first reply; long tool loops fall back to standard pricing |
1823
+ | `cold` | Same window, but only on the **first turn** of a session (no prior history) | Fast onboarding reply, standard pricing afterwards |
1824
+
1825
+ `/fast normal|fast|auto|cold` switches the mode for the session; add `--global` to persist to `config.yaml`. `/fast` alone shows the current mode.
1826
+
1827
+ **Cost note:** both providers bill fast requests at a multiplier on standard rates (Anthropic: $10 / $50 per MTok in/out on Opus 4.8 and Opus 5), stacking with prompt-cache pricing. `auto`/`cold` bound that premium to the window only. Fast params are only sent to the first-party endpoint that supports them (`api.openai.com` / Codex subscription, `api.anthropic.com`, `api.x.ai`); OpenRouter, Nous Portal, Copilot, Azure, Bedrock, and custom `base_url` routes never receive them in any mode. Only the per-request parameter changes between requests — the system prompt, tools, and messages stay byte-identical, so the prompt cache survives the window boundary.
1828
+
1829
+ ## Tool-Use Enforcement
1830
+
1831
+ Some models occasionally describe intended actions as text instead of making tool calls ("I would run the tests..." instead of actually calling the terminal). Tool-use enforcement injects system prompt guidance that steers the model back to actually calling tools.
1832
+
1833
+ ```yaml
1834
+ agent:
1835
+ tool_use_enforcement: "auto" # "auto" | true | false | ["model-substring", ...]
1836
+ ```
1837
+
1838
+ | Value | Behavior |
1839
+ |-------|----------|
1840
+ | `"auto"` (default) | Enabled for models matching: `gpt`, `codex`, `gemini`, `gemma`, `grok`, `glm`, `qwen`, `deepseek`, `muse`. Disabled for all others (e.g. Claude). |
1841
+ | `true` | Always enabled, regardless of model. Useful if you notice your current model describing actions instead of performing them. |
1842
+ | `false` | Always disabled, regardless of model. |
1843
+ | `["gpt", "codex", "qwen", "llama"]` | Enabled only when the model name contains one of the listed substrings (case-insensitive). |
1844
+
1845
+ ### What it injects
1846
+
1847
+ When enabled, two layers of guidance may be added to the system prompt:
1848
+
1849
+ 1. **General tool-use enforcement** (all matched models) — instructs the model to make tool calls immediately instead of describing intentions, keep working until the task is complete, and never end a turn with a promise of future action.
1850
+
1851
+ 2. **Google operational guidance** (Gemini and Gemma models only) — conciseness, absolute paths, parallel tool calls, and verify-before-edit patterns.
1852
+
1853
+ These are transparent to the user and only affect the system prompt. Models that already use tools reliably (like Claude) don't need this guidance, which is why `"auto"` excludes them.
1854
+
1855
+ ### When to turn it on
1856
+
1857
+ If you're using a model not in the default auto list and notice it frequently describes what it *would* do instead of doing it, set `tool_use_enforcement: true` or add the model substring to the list:
1858
+
1859
+ ```yaml
1860
+ agent:
1861
+ tool_use_enforcement: ["gpt", "codex", "gemini", "grok", "my-custom-model"]
1862
+ ```
1863
+
1864
+ ## Execution-Discipline Guidance
1865
+
1866
+ Separately from tool-use enforcement, Hermes injects an **execution-discipline** block for model families that share a set of agentic failure modes observed in eval traces: doing arithmetic in prose instead of code, skipping read-back verification after external writes, "repairing" malformed identifiers, claiming completeness despite count mismatches, and declaring "done" without verifying every acceptance criterion.
1867
+
1868
+ ```yaml
1869
+ agent:
1870
+ execution_guidance: "auto" # "auto" | true | false | ["model-substring", ...]
1871
+ ```
1872
+
1873
+ | Value | Behavior |
1874
+ |-------|----------|
1875
+ | `"auto"` (default) | Enabled for models matching: `gpt`, `codex`, `grok`, `deepseek`, `kimi`, `qwen`, `glm`, `minimax`, `mimo`, `mistral`, `muse`. |
1876
+ | `true` | Always enabled, regardless of model. |
1877
+ | `false` | Always disabled, regardless of model. |
1878
+ | `["deepseek", "my-custom-model"]` | Enabled only when the model name contains one of the listed substrings (case-insensitive). |
1879
+
1880
+ The injected block covers:
1881
+
1882
+ - **Tool persistence** — keep calling tools until the task is complete *and* verified; retry empty, partial, or suspiciously narrow lookup results with a broader or different query before concluding.
1883
+ - **Mandatory tool use** — arithmetic, hashes, dates, system state, and file facts always come from a tool, never from mental computation.
1884
+ - **External-write read-back** — after any state-changing write to an external system, read back the exact target before claiming success (internal file edits a tool already confirmed are not re-verified).
1885
+ - **Count reconciliation** — declared totals (`total`, `reply_count`, `has_more`) are hard assertions; on mismatch, re-fetch or parse programmatically.
1886
+ - **Literal preservation** — never normalize or "repair" identifiers that fail a stated format; a successful lookup does not validate a malformed source token.
1887
+ - **Verification-gated completion** — "done" means every named acceptance criterion is verified, never a plausible subset.
1888
+
1889
+ The gate is independent of `tool_use_enforcement` — either can be on without the other. The guidance is chosen once at session start keyed on the model name, so the system prompt stays byte-stable (and prompt-cache-friendly) for the life of the conversation. Gemini/Gemma are excluded from the auto list because they receive the more specific Google operational guidance; Claude is excluded because it doesn't exhibit these failure modes — opt any model in with `true` or a substring list.
1890
+
1891
+ ## Tool-Loop Guardrails
1892
+
1893
+ Hermes detects when the agent is stuck in an unproductive tool-calling loop — the same tool call failing repeatedly, the same tool failing over and over, or an idempotent call returning the same result with no progress. By default it injects a **warning** into the tool result so the model self-corrects. Interactive CLI, TUI, Desktop, and ACP sessions remain warning-only because a person can intervene; unattended gateway and cron sessions enable hard stops by default.
1894
+
1895
+ The platform-aware default can be disabled for an unattended deployment, or hard stops can be explicitly enabled on every platform:
1896
+
1897
+ ```yaml
1898
+ tool_loop_guardrails:
1899
+ warnings_enabled: true # inject warnings into tool results (default: true)
1900
+ hard_stop_enabled: false # also BLOCK the call past the hard-stop threshold (default: false)
1901
+ non_interactive_hard_stop_enabled: true # default hard stops for gateway/cron
1902
+ warn_after:
1903
+ exact_failure: 2 # identical failing call repeated N times
1904
+ same_tool_failure: 3 # same tool failing N times (different args)
1905
+ idempotent_no_progress: 2 # same result, no progress, N times
1906
+ hard_stop_after:
1907
+ exact_failure: 5
1908
+ same_tool_failure: 8
1909
+ idempotent_no_progress: 5
1910
+ loop_caps:
1911
+ max_web_searches: 50 # max web_search calls per turn (0 = unlimited)
1912
+ max_subagents: 50 # max subagents spawned per turn (0 = unlimited)
1913
+ ```
1914
+
1915
+ `hard_stop_enabled` explicitly enables hard stops on every platform. When it remains `false`, `non_interactive_hard_stop_enabled` still enables them for unattended gateway/cron-style platforms while preserving warning-only behavior for CLI, TUI, Desktop, ACP, subagents, and `api_server` runs (supervised task loops with a live parent or client). Set `non_interactive_hard_stop_enabled: false` to opt an unattended deployment out. See also [Docker / unattended deployments](docker.md).
1916
+
1917
+ Hard stops are designed to catch **replays** — the same call, unchanged, with nothing happening in between — not legitimate iteration:
1918
+
1919
+ - **Edit → re-run is never a loop.** Any successful mutating call (`write_file`, `patch`, a green `terminal`/`execute_code`, a browser action, a job/message/cron mutation) marks progress for every failing call still being counted. The next identical retry (re-running a red test after a fix, re-snapshotting after a click) starts a fresh streak instead of accumulating toward a block.
1920
+ - **Distinct red commands are diagnosis, not a loop.** For tools whose non-zero exit is ordinary output (`terminal`, `execute_code`, process pollers, `browser_navigate`, `web_extract`) the `same_tool_failure` threshold only warns and never halts. Only an exact-args replay with no intervening change, or an identical-result streak, can stop them.
1921
+ - **A halt ends the turn, not the session.** The agent replies with which guardrail fired and why; replying "continue" resumes with fresh per-turn counters.
1922
+
1923
+ ### Per-turn runaway-loop caps
1924
+
1925
+ Separate from the failure-based thresholds above, `loop_caps` sets hard ceilings on how many `web_search` calls and subagent spawns a single agent loop (turn) may make. The counters reset at the start of every turn, so a legitimate multi-turn session is never starved — but a single turn that spirals into an unbounded search or delegation loop is stopped. These are always on and fire regardless of `hard_stop_enabled`. A single turn issuing dozens of web searches or spawning dozens of subagents is already pathological, so the defaults are low. When a cap is reached, the offending tool call is blocked with an explanatory message and the turn stops cleanly instead of burning the rest of the budget. Set either value to `0` to disable that cap entirely.
1926
+
1927
+ A single `delegate_task` batch counts each task toward `max_subagents` (a batch of 3 spends 3), so the cap tracks real subagents spawned rather than `delegate_task` invocations.
1928
+
1929
+ This mirrors Claude Code's per-session WebSearch and subagent caps (v2.1.212), which also default to 200 and reset on `/clear`.
1930
+
1931
+ ### Runtime anti-stall guards
1932
+
1933
+ Complementing the failure-based guardrails above, `agent.stall_guards` (default `true`) enables two conservative runtime guards against wasted turns. First, an **identical-call loop breaker**: when the same tool is called 3+ consecutive times with identical arguments *and* returns an identical result, a short one-line notice is appended to that tool result telling the model not to repeat the call — in warning-only sessions it never blocks the call, and legitimately-repeatable pollers (`process`, `*_get_result`, `*_poll`) are exempt. When hard stops are active (explicit `hard_stop_enabled`, or an unattended gateway/cron platform), the same streak also becomes a hard stop once it reaches `hard_stop_after.idempotent_no_progress` consecutive identical calls — for **any** tool, not just the read-only ones the `idempotent_no_progress` guardrail tracks — so a model replaying the same successful `terminal` or `skill_view` call is halted instead of running out the iteration budget (`identical_call_streak_halt`). Second, a **continue-intent recovery**: when the model ends a turn with no tool calls but its short reply trails off announcing an action ("Let me now update the file…"), Hermes re-prompts it to act via the same bounded continuation mechanism used for intent-ack recovery (max 2 re-prompts per turn). Both are cache-safe (notices are added at result construction, never retroactively) and can be disabled together:
1934
+
1935
+ ```yaml
1936
+ agent:
1937
+ stall_guards: false
1938
+ ```
1939
+
1940
+ The same gate also enables **result-reference stubbing**: when a re-issued identical tool call returns a byte-identical fresh result, the duplicate payload enters context as a short reference stub pointing at the earlier result (tool name, `tool_call_id`, an args summary, and — if the first result was persisted to disk — its spillover path) instead of repeating the full output. The tool still executes every time, so polling semantics are preserved: a changed result always flows through whole. Results under 512 characters, error results, and multimodal results are never stubbed, and pollers *are* stubbed (an unchanged poll is exactly the case where the duplicate payload carries no information).
1941
+
1942
+ ### Turn liveness watchdog
1943
+
1944
+ `agent.turn_liveness` bounds how long a conversation turn may make **no observable progress** before Hermes force-recovers it. The watchdog keys off the activity clock (the same signal that stamps API waits, stream tokens, and tool heartbeats — lease renewal never counts), so a turn that silently wedges mid-flight (observed as issue #95548: no tool execution, no API call, no error, but the session stays "busy" indefinitely) is surfaced loudly, interrupted so it unwinds as a retriable interrupted turn, and — when the interrupt cannot unwind the wedge — its durable turn lease stops renewing so stale-turn cleanup can reclaim the session instead of it hanging until the process is killed.
1945
+
1946
+ ```yaml
1947
+ agent:
1948
+ turn_liveness:
1949
+ timeout_s: 600.0 # idle bound; <= 0 disables the watchdog
1950
+ poll_s: 15.0 # sampling interval (seconds)
1951
+ ```
1952
+
1953
+ Legitimately slow work is not penalized: streaming responses, tool heartbeats (every 30s while a tool runs), and approval waits all keep touching the clock, so only a turn making *zero* progress for the full bound fires the watchdog. Invalid values (a typo, `NaN`, `Inf`, non-positive `poll_s`) log a warning and fall back to the defaults — they never crash startup or silently disable the watchdog. A fired abort reports the stall as it begins recovery, and publishes the definitive aborted/lease-stopped outcome only once the interrupt has actually committed.
1954
+
1955
+ ## TTS Configuration
1956
+
1957
+ ```yaml
1958
+ tts:
1959
+ provider: "edge" # "edge" | "elevenlabs" | "openai" | "minimax" | "mistral" | "gemini" | "xai" | "neutts" | "kittentts" | "piper" | "deepinfra"
1960
+ speed: 1.0 # Global speed multiplier (fallback for all providers)
1961
+ edge:
1962
+ voice: "en-US-AriaNeural" # 322 voices, 74 languages
1963
+ speed: 1.0 # Speed multiplier (converted to rate percentage, e.g. 1.5 → +50%)
1964
+ elevenlabs:
1965
+ voice_id: "pNInz6obpgDQGcFmaJgB"
1966
+ model_id: "eleven_multilingual_v2"
1967
+ openai:
1968
+ model: "gpt-4o-mini-tts"
1969
+ voice: "alloy" # alloy, echo, fable, onyx, nova, shimmer
1970
+ speed: 1.0 # Speed multiplier (clamped to 0.25–4.0 by the API)
1971
+ base_url: "https://api.openai.com/v1" # Override for OpenAI-compatible TTS endpoints
1972
+ minimax:
1973
+ speed: 1.0 # Speech speed multiplier
1974
+ # base_url: "" # Optional: override for OpenAI-compatible TTS endpoints
1975
+ mistral:
1976
+ model: "voxtral-mini-tts-2603"
1977
+ voice_id: "c69964a6-ab8b-4f8a-9465-ec0925096ec8" # Paul - Neutral (default)
1978
+ gemini:
1979
+ model: "gemini-2.5-flash-preview-tts" # or gemini-3.1-flash-tts-preview
1980
+ voice: "Kore" # 30 prebuilt voices: Zephyr, Puck, Kore, Enceladus, etc.
1981
+ audio_tags: false # Hidden Gemini 3.1 TTS audio-tag insertion
1982
+ persona_prompt_file: "" # Optional Markdown/text file with Gemini voice direction
1983
+ xai:
1984
+ voice_id: "eve" # xAI TTS voice
1985
+ language: "en" # ISO 639-1
1986
+ sample_rate: 24000
1987
+ bit_rate: 128000 # MP3 bitrate
1988
+ # base_url: "https://api.x.ai/v1"
1989
+ neutts:
1990
+ ref_audio: ''
1991
+ ref_text: ''
1992
+ model: neuphonic/neutts-air-q4-gguf
1993
+ device: cpu
1994
+ ```
1995
+
1996
+ This controls both the `text_to_speech` tool and spoken replies in voice mode (`/voice tts` in the CLI or messaging gateway).
1997
+
1998
+ **Speed fallback hierarchy:** provider-specific speed (e.g. `tts.edge.speed`) → global `tts.speed` → `1.0` default. Set the global `tts.speed` to apply a uniform speed across all providers, or override per-provider for fine-grained control.
1999
+
2000
+ ## Display Settings
2001
+
2002
+ ```yaml
2003
+ display:
2004
+ tool_progress: all # off | new | all | verbose
2005
+ tool_progress_command: false # Enable /verbose slash command in messaging gateway
2006
+ focus_view: false # CLI focus view (/focus) — reduced output, display-only
2007
+ platforms: {} # Per-platform display overrides (see below)
2008
+ interim_assistant_messages: true # Gateway: send natural mid-turn assistant updates as separate messages
2009
+ show_commentary: true # Codex models: deliver commentary-channel progress narration as visible mid-turn updates
2010
+ skin: default # Built-in or custom CLI skin (see user-guide/features/skins)
2011
+ personality: "" # Legacy cosmetic field still surfaced in some summaries
2012
+ compact: false # Compact output mode (less whitespace)
2013
+ cli_multiline_shortcuts: true # CLI: Ctrl+J, \ + Enter, and supported Shift+Enter insert newlines (false = legacy c-j submit fallback)
2014
+ resume_display: full # full (show previous messages on resume) | minimal (one-liner only)
2015
+ bell_on_complete: false # Play terminal bell when agent finishes (great for long tasks)
2016
+ bell_on_prompt: false # Play terminal bell when a blocking prompt opens (clarify, approval, sudo password, secret capture) — works over SSH
2017
+ # Both bell flags also emit an OSC 9 desktop notification (Ghostty, iTerm2, Kitty, WezTerm raise an OS
2018
+ # notification; other terminals ignore it) and, inside Warp (TERM_PROGRAM=WarpTerminal with the CLI-agent
2019
+ # protocol advertised), a warp://cli-agent OSC 777 event (`stop` on completion, `permission_request` on
2020
+ # blocking prompts) so Warp's tab status and notification mailbox track Hermes. No extra keys needed.
2021
+ show_reasoning: true # Show model reasoning/thinking above each response (default: true; toggle with /reasoning show|hide)
2022
+ streaming: false # Stream tokens to terminal as they arrive (real-time output)
2023
+ show_cost: false # Show estimated $ cost in the CLI status bar
2024
+ vim_mode: false # CLI only: vi/vim keybindings in the input composer (Esc → NORMAL, i → INSERT). The live NORMAL/INSERT/REPLACE mode shows at the right of the status bar. Config-only, read at startup.
2025
+ timestamps: false # When true, prefixes user and assistant labels with timestamps in the CLI / TUI transcript
2026
+ timestamp_format: "%H:%M" # strftime format for those timestamps (e.g. "%b-%d %H:%M" for month-day)
2027
+ tool_preview_length: 0 # Max chars for tool call previews (0 = no limit, show full paths/commands)
2028
+ turn_summary: true # CLI only: print a one-line post-turn accounting footer after each interactive turn
2029
+ spinner_token_flow: true # CLI only: append live cumulative turn tokens to the spinner timer
2030
+ runtime_footer: # Gateway: append a runtime-context footer to final replies
2031
+ enabled: false
2032
+ fields: ["model", "context_pct", "cwd"]
2033
+ status_bar: # CLI/TUI: choose which status-bar fields are visible
2034
+ fields: [] # empty = show the default set; see below
2035
+ file_mutation_verifier: true # Append an advisory footer when write_file/patch calls failed this turn
2036
+ credits_notices: true # Nous credits status-bar notices (usage bands, grant-spent, depleted). false = silence them; /usage still works
2037
+ cli_rebuild_scrollback_on_redraw: false # Classic CLI: also wipe terminal scrollback (CSI 3J) on /redraw / Ctrl+L / width-change resize recovery. Enable when a terminal/tmux stack stamps stale prompt chrome into scrollback on maximize/restore.
2038
+ language: en # UI language for static messages (approval prompts, some gateway replies). en | zh | zh-hant | ja | de | es | fr | tr | uk | af | ko | it | ga | pt | ru | hu
2039
+ ```
2040
+
2041
+ ### Per-turn summary and spinner token flow
2042
+
2043
+ `display.turn_summary` (default `true`) prints one dim accounting line after each **interactive CLI** turn, summarising what that turn actually did:
2044
+
2045
+ ```
2046
+ ⋯ 12.4s · edited 2 files +18 -3 · read 4 files · ran 3 commands
2047
+ ```
2048
+
2049
+ The tally is observed from the tool-progress feed the CLI already receives, so it costs nothing extra. Details:
2050
+
2051
+ - Wall time is the turn's real duration (`2m05s` past the one-minute mark).
2052
+ - Tool calls are grouped by verb (`edited`, `read`, `ran`, `searched`, …) with correct pluralisation; plugin/MCP tools without a curated verb collapse into `called N tools`.
2053
+ - `+X -Y` line deltas appear only when the tool result already reports a diff (currently `patch`). Hermes never shells out to git to compute them, so a `write_file` edit is counted without a delta.
2054
+ - **Failed tool calls are not counted** — a denied write never renders as a successful edit (see the [file-mutation verifier](#file-mutation-verifier) for the complementary warning).
2055
+ - Long turns cap at four verb segments plus a `+N more` tail so the line never wraps.
2056
+ - A fast turn with no tool calls prints nothing at all.
2057
+
2058
+ `display.spinner_token_flow` (default `true`) appends the running turn's cumulative output tokens to the CLI spinner's live timer:
2059
+
2060
+ ```
2061
+ ⚡ Reading cli.py ( 2.3s · ↓ 1.2k tok)
2062
+ ```
2063
+
2064
+ The count is per-turn (session totals are baselined at turn start) and updates as each API call in the turn reports usage. Nothing renders before the first usage report lands, so you never see a misleading `↓ 0 tok`.
2065
+
2066
+ Both keys are display-only and CLI-only: they are suppressed in quiet mode, when `display.tool_progress` is `off`, in single-query/`-Q` batch runs, and in gateway/messaging surfaces (those use `display.runtime_footer` instead). Set either key to `false` to turn it off.
2067
+
2068
+ ### File-mutation verifier
2069
+
2070
+ When `display.file_mutation_verifier` is `true` (default), Hermes appends a one-line advisory to the assistant's final response whenever a `write_file` or `patch` call failed during the turn and the target file was neither written successfully afterwards (under any spelling of its path) nor otherwise changed on disk before the turn ended. This catches the "batch of parallel patches, half silently fail, model summarises success" class of over-claim without requiring you to manually run `git status` after every edit.
2071
+
2072
+ Example footer:
2073
+
2074
+ ```
2075
+ ⚠️ File-mutation verifier: 3 file edit(s) FAILED this turn despite any wording above that may suggest otherwise. Run `git status` or `read_file` to confirm what actually landed.
2076
+ • concepts/automatic-organization.md — [patch] Could not find match for old_string
2077
+ • concepts/lora.md — [patch] Could not find match for old_string
2078
+ • concepts/rag-pipeline.md — [patch] Could not find match for old_string
2079
+ ```
2080
+
2081
+ Set `file_mutation_verifier: false` (or `HERMES_FILE_MUTATION_VERIFIER=0`) to suppress the footer. The verifier only fires when real failures are outstanding at turn end — a model that retries a failed patch and succeeds within the same turn will not trigger it for that file.
2082
+
2083
+ **Trust the verifier over the model's summary.** The footer means the listed edit calls **failed** and Hermes saw no later change to those files, even if the assistant's closing message says the task is done. It only tracks `write_file`/`patch` receipts plus a modification-time check at turn end, so run `git status` or `read_file` to confirm what actually landed. Common causes:
2084
+
2085
+ - **Write denied** — path is on the credential denylist or outside `HERMES_WRITE_SAFE_ROOT` (see [File write safety](./security.md#file-write-safety))
2086
+ - **Patch mismatch** — `old_string` did not match the file on disk
2087
+ - **Syntax gate** — candidate content failed JSON/YAML/TOML validation before write
2088
+
2089
+ Example footer when writes are blocked:
2090
+
2091
+ ```
2092
+ ⚠️ File-mutation verifier: 2 file edit(s) FAILED this turn despite any wording above that may suggest otherwise. Run `git status` or `read_file` to confirm what actually landed.
2093
+ • ~/.hermes/cron/jobs.json — [patch] Write denied: '…' is outside HERMES_WRITE_SAFE_ROOT (/path/to/project)
2094
+ • ~/.hermes/scripts/monitor.py — [write_file] Write denied: '…' is outside HERMES_WRITE_SAFE_ROOT (/path/to/project)
2095
+ ```
2096
+
2097
+ If writes to Hermes state (cron jobs, skills, scripts under `~/.hermes/`) are failing, check whether `HERMES_WRITE_SAFE_ROOT` is set in your environment. For cron changes, use the `cronjob` tool or `hermes cron edit` instead of patching `jobs.json` directly.
2098
+
2099
+ ### UI language for static messages
2100
+
2101
+ The `display.language` setting translates a small set of static user-facing messages — the CLI approval prompt, a handful of gateway slash-command replies (e.g. restart-drain notices, "approval expired", "goal cleared"). It does **not** translate agent responses, log lines, tool output, error tracebacks, or slash-command descriptions — those stay in English. If you want the agent itself to reply in another language, just tell it in your prompt or system message.
2102
+
2103
+ Supported values: `en` (default), `zh` (Simplified Chinese), `zh-hant` (Traditional Chinese), `ja` (Japanese), `de` (German), `es` (Spanish), `fr` (French), `tr` (Turkish), `uk` (Ukrainian), `af` (Afrikaans), `ko` (Korean), `it` (Italian), `ga` (Irish), `pt` (Portuguese), `ru` (Russian), `hu` (Hungarian). Unknown values fall back to English.
2104
+
2105
+ You can also set this per-session with the `HERMES_LANGUAGE` env var, which overrides the config value.
2106
+
2107
+ ```yaml
2108
+ display:
2109
+ language: zh # CLI approval prompts appear in Chinese
2110
+ ```
2111
+
2112
+ | Mode | What you see |
2113
+ |------|-------------|
2114
+ | `off` | Silent — just the final response |
2115
+ | `new` | Tool indicator only when the tool changes |
2116
+ | `all` | Every tool call with a short preview (default) |
2117
+ | `verbose` | Full args, results, and debug logs |
2118
+
2119
+ In the CLI, cycle through these modes with `/verbose`. To use `/verbose` in messaging platforms (Telegram, Discord, Slack, etc.), set `tool_progress_command: true` in the `display` section above. The command will then cycle the mode and save to config.
2120
+
2121
+ Tool progress requires a gateway adapter that can display progress updates safely. Platforms without message editing support, including Signal, suppress tool-progress bubbles even if `/verbose` saves a non-`off` mode.
2122
+
2123
+ `off` hides tool-call *chrome* only. Application state that has its own surface in the Desktop app and TUI — the task list (`todo_list`), subagent progress, clarify questions, and MCP consent cards — keeps flowing regardless of this setting.
2124
+
2125
+ ### Focus view (`/focus`, CLI + TUI)
2126
+
2127
+ `display.focus_view: true` enables **focus view** — a reduced-output display mode for when you want the answer, not the play-by-play. It is a thin layer over the same `tool_progress` machinery rather than a second suppression path:
2128
+
2129
+ - turning it on pins `tool_progress` to `off` and stashes your previous mode in `display.focus_saved_tool_progress`;
2130
+ - `/focus off` restores that mode exactly, so a `/verbose verbose` setup survives a round trip;
2131
+ - each completed turn ends with a dim recovery line — `⋯ 7 tool lines hidden · /focus off to show` — counted against your *pre-focus* mode, so it never claims to have hidden lines you had already turned off;
2132
+ - a persistent `◉ focus` badge sits in the status bar (both the prompt_toolkit CLI and the Ink TUI) so the reduced mode is never invisible;
2133
+ - cycling `/verbose` while focus is on hands the mode back to `/verbose` and clears the badge.
2134
+
2135
+ Focus view is **display-only**. It never edits conversation history, the system prompt, tool schemas, or any request payload — hidden detail is suppressed on screen, never discarded, and prompt caching is completely unaffected.
2136
+
2137
+ ### Status-bar field selection (CLI/TUI)
2138
+
2139
+ The interactive status bar at the bottom of the CLI/TUI shows the model, context usage, compression count, background-activity counters, timers, and mode badges. `display.status_bar.fields` chooses which of those are visible — useful for a minimal bar (just model + duration) or for surfacing the opt-in session token total:
2140
+
2141
+ ```yaml
2142
+ display:
2143
+ status_bar:
2144
+ fields: ["model", "duration", "total_tokens"] # visibility only; built-in order is preserved
2145
+ ```
2146
+
2147
+ Supported fields: `model`, `context_detail` (used/total tokens), `context_pct` (percent + meter), `cache_hit` (prompt cache hit ratio — resets on model switch and compression), `latency` (rolling mean API latency, last 10 calls), `tps` (rolling output tokens/sec, last 10 calls), `compressions`, `bg_tasks`, `bg_processes`, `bg_subagents`, `goal`, `git_branch` (⎇ current git branch of the working directory — opt-in only, never shown by default; detached HEAD shows the abbreviated commit), `duration`, `prompt_elapsed`, `idle_since`, `focus`, `yolo`, `stash`, `battery`, `title` (right-aligned session badge), and `total_tokens` (session Σ — opt-in only, never shown by default).
2148
+
2149
+ Notes:
2150
+
2151
+ - An empty list (the default) keeps the standard set — everything except `total_tokens` and `git_branch`.
2152
+ - The config controls **visibility, not order**; fields render in their built-in positions.
2153
+ - Narrow terminals still drop wide-mode-only fields (`context_detail`, `cache_hit`, `latency`, `tps`, `prompt_elapsed`, `idle_since`) regardless of config (`cache_hit` also shows in the medium ≥52-col tier).
2154
+ - `latency`/`tps` stay hidden until API calls have been recorded (e.g. the Codex app-server backend reports no latency).
2155
+ - `battery` and `title` visibility here compose with their own toggles (`/battery`, `/title`) — both must be on for the segment to show.
2156
+ - The same key also filters the **Ink TUI** status rule (`hermes tui`), where `cache_hit`, `latency`, and `tps` render as width-budgeted tail segments (◎ / ◷ / ↑) on terminals ≥96/104/110 columns respectively.
2157
+ - Display-only: no effect on prompt caching or request payloads. Changes take effect on the next session start.
2158
+
2159
+ ### Runtime-metadata footer (gateway only)
2160
+
2161
+ When `display.runtime_footer.enabled: true`, Hermes appends a small runtime-context footer to the **final** message of each gateway turn. The current footer can show the model, context-window percentage, and current working directory. Off by default; opt in per-gateway if your team wants every reply to include this provenance.
2162
+
2163
+ ```yaml
2164
+ display:
2165
+ runtime_footer:
2166
+ enabled: true
2167
+ fields: ["model", "context_pct", "cwd"] # order shown; drop any to hide
2168
+ ```
2169
+
2170
+ Supported fields:
2171
+
2172
+ | Field | Renders | Example |
2173
+ | --- | --- | --- |
2174
+ | `model` | Bare model id, vendor prefix dropped | `gpt-5.4` |
2175
+ | `context_pct` | Last-call context occupancy as a percent | `5%` |
2176
+ | `latency` | Wall-clock duration of the turn | `22s`, `1m05s` |
2177
+ | `cwd` | Home-relative working directory | `~` |
2178
+
2179
+ The default field set is `["model", "context_pct", "cwd"]`. `latency` is opt-in — add it to `fields` to use it. Fields whose data is unavailable are skipped silently rather than rendering an empty slot.
2180
+
2181
+ The `/footer` slash command toggles this at runtime in any session.
2182
+
2183
+ Example footer appended to a Telegram/Discord/Slack reply:
2184
+
2185
+ ```
2186
+ — claude-opus-4.7 · 12 tool calls · 2m 14s · $0.042
2187
+ ```
2188
+
2189
+ Only the **final** message of a turn gets the footer; interim updates stay clean.
2190
+
2191
+ ### Per-platform progress overrides
2192
+
2193
+ Different platforms have different verbosity needs. Use `display.platforms` to set per-platform modes:
2194
+
2195
+ ```yaml
2196
+ display:
2197
+ tool_progress: all # global default
2198
+ platforms:
2199
+ signal:
2200
+ tool_progress: 'off' # Signal cannot currently display tool-progress bubbles
2201
+ telegram:
2202
+ tool_progress: verbose # detailed progress on Telegram
2203
+ slack:
2204
+ tool_progress: 'off' # quiet in shared Slack workspace
2205
+ ```
2206
+
2207
+ From the CLI, use the canonical path — `hermes config set display.platforms.telegram.streaming false`. The shorthand `hermes config set platforms.telegram.streaming false` is accepted too: because per-platform *display* settings (`streaming`, `show_reasoning`, `tool_progress`, …) are only ever read from `display.platforms`, `config set`/`get`/`unset` redirect that shorthand to the canonical key and print a note. Connection keys under the top-level `platforms.<name>` block (`token`, `enabled`, `reply_to_mode`, `extra`) are not redirected.
2208
+
2209
+ Platforms without an override fall back to the global `tool_progress` value. Valid platform keys: `telegram`, `discord`, `slack`, `signal`, `whatsapp`, `matrix`, `mattermost`, `email`, `sms`, `homeassistant`, `dingtalk`, `feishu`, `wecom`, `weixin`, `bluebubbles`, `qqbot`. The legacy `display.tool_progress_overrides` key still loads for backward compatibility but is deprecated and migrated into `display.platforms` on first load.
2210
+
2211
+ Signal is listed as a valid platform key because the setting can be saved per platform, but the current Signal adapter cannot edit sent messages and does not render tool-progress bubbles. Keep Signal `tool_progress` set to `off`; use the CLI or an editing-capable messaging platform if you need to watch each tool call live.
2212
+
2213
+ `interim_assistant_messages` is gateway-only. When enabled, Hermes sends completed mid-turn assistant updates as separate chat messages. This is independent from `tool_progress` and does not require gateway streaming.
2214
+
2215
+ `show_commentary` (default `true`) controls Codex Responses models' commentary channel — the polished progress narration these models produce alongside their private reasoning. When enabled, each completed commentary message is delivered as a visible mid-turn update (on the gateway this also requires `interim_assistant_messages`). Set it to `false` if the extra narration annoys you: commentary then falls back to the reasoning channel and is only shown when `show_reasoning` is enabled.
2216
+
2217
+ ## Privacy
2218
+
2219
+ ```yaml
2220
+ privacy:
2221
+ redact_pii: false # Strip PII from LLM context (gateway only)
2222
+ ```
2223
+
2224
+ When `redact_pii` is `true`, the gateway redacts personally identifiable information from the system prompt before sending it to the LLM on supported platforms:
2225
+
2226
+ | Field | Treatment |
2227
+ |-------|-----------|
2228
+ | Phone numbers (user ID on WhatsApp/Signal) | Hashed to `user_<12-char-sha256>` |
2229
+ | User IDs | Hashed to `user_<12-char-sha256>` |
2230
+ | Chat IDs | Numeric portion hashed, platform prefix preserved (`telegram:<hash>`) |
2231
+ | Home channel IDs | Numeric portion hashed |
2232
+ | User names / usernames | **Not affected** (user-chosen, publicly visible) |
2233
+
2234
+ **Platform support:** Redaction applies to WhatsApp, Signal, and Telegram. Discord and Slack are excluded because their mention systems (`<@user_id>`) require the real ID in the LLM context.
2235
+
2236
+ Hashes are deterministic — the same user always maps to the same hash, so the model can still distinguish between users in group chats. Routing and delivery use the original values internally.
2237
+
2238
+ ### OpenAI Codex request identity
2239
+
2240
+ OpenAI requires third-party Codex harnesses to identify themselves.
2241
+ ChatGPT-authenticated requests to the official Codex endpoint automatically
2242
+ send `originator: hermes-agent` and `User-Agent: HermesAgent/<version>`.
2243
+ The existing ChatGPT account header is preserved. No additional prompt content
2244
+ or telemetry request is sent.
2245
+ Direct OpenAI API requests and custom proxy endpoints are unchanged.
2246
+
2247
+ ## Speech-to-Text (STT)
2248
+
2249
+ ```yaml
2250
+ stt:
2251
+ enabled: true # Auto-transcribe inbound voice messages (default: true)
2252
+ echo_transcripts: true # Post raw transcripts back to the chat as 🎙️ "..." (default: true)
2253
+ provider: "local" # "local" | "groq" | "openai" | "mistral" | "xai" | "elevenlabs" | "deepinfra" | ...
2254
+ language: "en" # GLOBAL language hint for every provider (per-provider language wins); set "" for auto-detect
2255
+ cloud_trim_silence: true # trim long pauses with ffmpeg before uploading to a cloud provider (default: true)
2256
+ cloud_trim_threshold_db: -40 # audio quieter than this counts as silence
2257
+ cloud_trim_keep_ms: 300 # how much of each pause survives the trim (keeps natural pacing)
2258
+ # prompt: "Hermes, Teknium, Nous Research, kanban" # Static vocabulary hint (see below)
2259
+ local:
2260
+ model: "base" # tiny, base, small, medium, large-v3
2261
+ language: "" # per-provider override of stt.language
2262
+ initial_prompt: "" # optional whisper prompt to bias vocabulary/script (e.g. Simplified Chinese)
2263
+ vad: true # Silero VAD filter (default on) — silence never reaches whisper; false = raw behavior (music/ambient)
2264
+ vad_min_silence_ms: 500 # min silence (ms) that splits speech chunks when vad is on
2265
+ no_speech_prob_threshold: 0.6 # drop a segment only when no_speech_prob > this...
2266
+ logprob_threshold: -1.0 # ...AND avg_logprob < this (both must hit — quiet real speech survives)
2267
+ unload_after_idle_seconds: 0 # 0=never unload (default); e.g. 300 = release the model after 5min idle
2268
+ groq:
2269
+ language: "" # per-provider override of stt.language
2270
+ openai:
2271
+ model: "whisper-1" # whisper-1 | gpt-4o-mini-transcribe | gpt-4o-transcribe | gpt-transcribe
2272
+ language: "" # per-provider override of stt.language
2273
+ # model: "whisper-1" # Legacy fallback key still respected
2274
+ ```
2275
+
2276
+ Language resolution is the same for **every** STT provider (local, groq, openai, mistral, xai, elevenlabs, deepinfra, command providers, and plugins): `stt.<provider>.language` → `stt.language` → `HERMES_LOCAL_STT_LANGUAGE` env var → provider auto-detect. **The default is `stt.language: "en"`** — Whisper auto-detection frequently misidentifies short or accented clips, which shows up as voice notes transcribed in the wrong language. Non-English speakers should set `stt.language` to their language code once (e.g. `"es"`, `"zh"`, `"uk"`); set it to `""` to restore auto-detection for multilingual use.
2277
+
2278
+ Set `stt.echo_transcripts: false` when the gateway should transcribe voice notes for the agent but must not post the raw transcript back to the chat (for example, customer-facing WhatsApp bots).
2279
+
2280
+ Provider behavior:
2281
+
2282
+ - `local` uses `faster-whisper` running on your machine. Install it separately with `pip install faster-whisper`. Silence-hallucination hardening is on by default: a Silero VAD filter keeps silence/noise from ever reaching Whisper, cross-window conditioning is disabled, and segments the model itself flags as probably-not-speech *and* low-confidence are dropped. Set `stt.local.vad: false` to transcribe non-speech audio (music, ambient) with the raw behavior. The model stays loaded in memory between voice messages for low-latency transcription; set `stt.local.unload_after_idle_seconds` (e.g. `300` for 5 minutes) to automatically release the model when idle. This frees GPU memory on CUDA hosts (the main win when a local LLM shares the GPU); on CPU the memory becomes reusable by the process, though the OS-visible footprint may not shrink until the process needs the space for something else. The next voice message reloads the model transparently.
2283
+ - `groq` uses Groq's Whisper-compatible endpoint and reads `GROQ_API_KEY`. Pass `stt.groq.language` (or the global `HERMES_LOCAL_STT_LANGUAGE` env var) to skip auto-detection and reduce latency.
2284
+ - `openai` uses the OpenAI speech API and reads `VOICE_TOOLS_OPENAI_KEY`.
2285
+
2286
+ Cloud providers (groq, openai, mistral, xai, elevenlabs, deepinfra) get a **pre-upload silence trim** by default when `ffmpeg` is installed: long pauses in a voice note are collapsed client-side before the file uploads, keeping `cloud_trim_keep_ms` of each pause so natural pacing survives. Shorter audio means faster uploads, lower per-audio-minute billing, and fewer silence hallucinations from the remote model. Clips shorter than 12 seconds skip the trim entirely (savings can't matter there, and several providers bill a per-request minimum anyway). The trim is best-effort — if ffmpeg is missing, the trim fails, the clip is mostly silence, or trimming would save less than ~10%, the original file is uploaded untouched. Set `stt.cloud_trim_silence: false` to always upload the original (e.g. when transcribing music or ambient audio through a cloud provider). Command-type and plugin providers never get trimmed audio.
2287
+
2288
+ An explicitly selected `stt.provider` is honored strictly — if it's unavailable, transcription errors with guidance to run `hermes tools` rather than switching providers. Only when no provider has ever been selected does Hermes auto-detect in this order: `local` → `groq` → `openai`.
2289
+
2290
+ Groq and OpenAI model overrides are environment-driven:
2291
+
2292
+ ```bash
2293
+ STT_GROQ_MODEL=whisper-large-v3-turbo
2294
+ STT_OPENAI_MODEL=whisper-1
2295
+ GROQ_BASE_URL=https://api.groq.com/openai/v1
2296
+ STT_OPENAI_BASE_URL=https://api.openai.com/v1
2297
+ ```
2298
+
2299
+ ### Transcription prompt (vocabulary hints)
2300
+
2301
+ `stt.prompt` is an optional static hint passed to prompt-capable STT backends. Use it for proper nouns, product names, and jargon that Whisper-family models otherwise mis-hear:
2302
+
2303
+ ```yaml
2304
+ stt:
2305
+ provider: "local"
2306
+ prompt: "Hermes, Teknium, Nous Research, kanban, Ollama"
2307
+ ```
2308
+
2309
+ **Composition.** The config value is the base. Plugins that register the [`pre_transcription`](/user-guide/features/hooks#pre_transcription) hook mutate on top of it, last-writer-wins per field. Multiple plugins' hints compose deterministically: plugin discovery loads plugins in sorted order by plugin id, and each plugin's callbacks run in its own registration order, so the same set of plugins always produces the same final prompt. A hook returning an empty string for `prompt` clears the config prompt for that request. Hooks may also override `language` and `model`; `file_path` is read-only and any attempt to change it is logged and dropped. With no hook registered and no `stt.prompt` set, the outgoing request is identical to previous releases.
2310
+
2311
+ **Provider support.**
2312
+
2313
+ | Provider | Prompt parameter | Behavior |
2314
+ |----------|-----------------|----------|
2315
+ | `local` (faster-whisper) | `initial_prompt` | Forwarded unchanged to the local model |
2316
+ | `openai` | `prompt` | Forwarded unchanged in the transcription request |
2317
+ | `groq` | `prompt` | Forwarded unchanged in the transcription request |
2318
+ | `mistral` | `prompt` | Forwarded unchanged in the transcription request |
2319
+ | `deepinfra` | `prompt` | OpenAI-compatible path, forwarded unchanged |
2320
+ | `xai` | not supported | Logged at DEBUG, the request proceeds without the prompt |
2321
+ | `elevenlabs` | not supported | Logged at DEBUG, the request proceeds without the prompt |
2322
+ | `local_command` | not supported | Logged at DEBUG, the request proceeds without the prompt |
2323
+ | `stt.providers.<name>` with `type: command` | not supported | Logged at DEBUG, the request proceeds without the prompt |
2324
+ | Plugin-registered providers | `prompt` in the `transcribe(**extra)` kwargs | Only sent when a prompt is set, so providers that predate this key see unchanged calls |
2325
+
2326
+ **Length.** Whisper-family models only condition on the final ~224 prompt tokens. For the whisper-family backends (`local`, `openai`, `groq`, `deepinfra`) Hermes enforces that cap client-side: an over-long final prompt is truncated to its tail with a logged warning — the request never errors because of prompt length. Other backends (`mistral`, plugin providers) receive the prompt unchanged and own their own validation. Keep hints short and specific either way.
2327
+
2328
+ :::warning Prompts are uploaded with your audio
2329
+ The final prompt is sent to the configured STT provider alongside the audio file. Keep secrets and session-derived context out of `stt.prompt` and out of anything a `pre_transcription` hook returns, especially when the provider is a hosted API rather than local `faster-whisper`.
2330
+ :::
2331
+
2332
+ ## Voice Mode (CLI)
2333
+
2334
+ ```yaml
2335
+ voice:
2336
+ record_key: "ctrl+b" # Push-to-talk key inside the CLI
2337
+ max_recording_seconds: 120 # Hard stop for long recordings
2338
+ auto_tts: false # Enable spoken replies automatically when /voice on
2339
+ beep_enabled: true # Play record start/stop beeps in CLI voice mode
2340
+ beep_volume: 0.3 # Beep amplitude (0.0-1.0); raise it on quiet systems / headphones
2341
+ silence_threshold: 200 # RMS threshold for speech detection
2342
+ silence_duration: 3.0 # Seconds of silence before auto-stop
2343
+ ```
2344
+
2345
+ Use `/voice on` in the CLI to enable microphone mode, `record_key` to start/stop recording, and `/voice tts` to toggle spoken replies. See [Voice Mode](/user-guide/features/voice-mode) for end-to-end setup and platform-specific behavior.
2346
+
2347
+ ## Streaming
2348
+
2349
+ Stream tokens to the terminal or messaging platforms as they arrive, instead of waiting for the full response.
2350
+
2351
+ ### CLI Streaming
2352
+
2353
+ ```yaml
2354
+ display:
2355
+ streaming: true # Stream tokens to terminal in real-time
2356
+ show_reasoning: true # Also stream reasoning/thinking tokens (optional)
2357
+ ```
2358
+
2359
+ When enabled, responses appear token-by-token inside a streaming box. Tool calls are still captured silently. If the provider doesn't support streaming, it falls back to the normal display automatically.
2360
+
2361
+ ### Gateway Streaming (Telegram, Discord, Slack)
2362
+
2363
+ ```yaml
2364
+ streaming:
2365
+ enabled: true # Enable progressive message editing (default: false)
2366
+ transport: auto # "auto" (default) | "edit" (progressive message editing) | "off"
2367
+ edit_interval: 0.8 # Seconds between message edits (default: 0.8)
2368
+ buffer_threshold: 24 # Characters before forcing an edit flush (default: 24)
2369
+ cursor: " ▉" # Cursor shown during streaming
2370
+ fresh_final_after_seconds: 0 # Opt in to fresh final (Telegram) when preview is this old
2371
+ ```
2372
+
2373
+ When enabled, the bot sends a message on the first token, then progressively edits it as more tokens arrive. Platforms that don't support message editing (Signal, Email, Home Assistant) are auto-detected on the first attempt — streaming is gracefully disabled for that session with no flood of messages.
2374
+
2375
+ For separate natural mid-turn assistant updates without progressive token editing, set `display.interim_assistant_messages: true`.
2376
+
2377
+ **Overflow handling:** If the streamed text exceeds the platform's message length limit (~4096 chars), the current message is finalized and a new one starts automatically.
2378
+
2379
+ **Fresh final (Telegram):** Telegram's `editMessageText` preserves the original message timestamp, so a long-running streamed reply would keep the first-token timestamp even after completion. Set `fresh_final_after_seconds > 0` to opt in to delivering old previews as brand-new final messages with best-effort preview deletion. The default is `0`, which always finalizes streamed replies in place and avoids the brief duplicate-message/delete sequence on clients that show both operations.
2380
+
2381
+ :::note Per-platform streaming defaults
2382
+ The master `streaming.enabled` switch is `false` by default — nothing streams until you flip it. Once enabled, streaming is decided **per platform**: Telegram ships with `display.platforms.telegram.streaming: true` (streams) and Discord with `display.platforms.discord.streaming: false` (does not). So after enabling streaming, Telegram streams out of the box and Discord stays on whole-message replies until you change its toggle. You can adjust these per-platform switches from the dashboard's **Channels** toggles or directly in `~/.hermes/config.yaml`.
2383
+ :::
2384
+
2385
+ ## Group Chat Session Isolation
2386
+
2387
+ Limit how many chat sessions can actively be open across CLI, TUI/dashboard,
2388
+ and messaging gateway:
2389
+
2390
+ ```yaml
2391
+ max_concurrent_sessions: null # null/0 = unlimited; positive integer = active session cap
2392
+ ```
2393
+
2394
+ A slot is taken when a session runs its **first turn**, not when a chat window
2395
+ is opened. Opening, resuming or reconnecting to a chat costs nothing until you
2396
+ send a message, so idle desktop tabs (and the background resumes a flaky
2397
+ websocket triggers) cannot starve the messaging gateway that shares this cap.
2398
+
2399
+ When the cap is reached, Hermes returns a direct limit message naming which
2400
+ surfaces hold the slots. Existing active sessions keep their normal behavior.
2401
+ Run `hermes status` to see the current slot usage and every holder.
2402
+
2403
+ The canonical key is top-level `max_concurrent_sessions`. Hermes also accepts
2404
+ `gateway.max_concurrent_sessions` as a fallback, but the top-level key wins when
2405
+ both are set.
2406
+
2407
+ The cap is enforced with a local runtime lease file and is best-effort: Hermes
2408
+ fails open if the registry cannot be read or locked so users are not stranded.
2409
+ It is intended for a single host/profile runtime, not a shared `$HERMES_HOME`
2410
+ mounted across multiple machines.
2411
+
2412
+ Control whether shared chats keep one conversation per room or one conversation per participant:
2413
+
2414
+ ```yaml
2415
+ group_sessions_per_user: true # true = per-user isolation in groups/channels, false = one shared session per chat
2416
+ ```
2417
+
2418
+ - `true` is the default and recommended setting. In Discord channels, Telegram groups, Slack channels, and similar shared contexts, each sender gets their own session when the platform provides a user ID.
2419
+ - `false` reverts to the old shared-room behavior. That can be useful if you explicitly want Hermes to treat a channel like one collaborative conversation, but it also means users share context, token costs, and interrupt state.
2420
+ - Direct messages are unaffected. Hermes still keys DMs by chat/DM ID as usual.
2421
+ - Threads stay isolated from their parent channel either way; with `true`, each participant also gets their own session inside the thread.
2422
+
2423
+ For the behavior details and examples, see [Sessions](/user-guide/sessions) and the [Discord guide](/user-guide/messaging/discord).
2424
+
2425
+ ## Unauthorized DM Behavior
2426
+
2427
+ Control what Hermes does when an unknown user sends a direct message:
2428
+
2429
+ ```yaml
2430
+ unauthorized_dm_behavior: pair
2431
+
2432
+ whatsapp:
2433
+ unauthorized_dm_behavior: ignore
2434
+ ```
2435
+
2436
+ - `pair` is the default for chat-style DM platforms. Hermes denies access, but replies with a one-time pairing code in DMs.
2437
+ - `ignore` silently drops unauthorized DMs.
2438
+ - `decline` sends one short, polite decline instead of a pairing code, then stays silent toward that sender for 24 hours. Override the default text:
2439
+
2440
+ ```yaml
2441
+ unauthorized_dm_behavior: decline
2442
+ unauthorized_dm_decline_message: "Sorry, this assistant is private."
2443
+ ```
2444
+
2445
+ `hermes gateway setup` offers this as "Politely decline unknown senders" when you leave the allowlist empty; it writes `platforms.<platform>.unauthorized_dm_behavior: decline`.
2446
+
2447
+ - Email defaults to `ignore` unless `platforms.email.unauthorized_dm_behavior: pair` is set, because inboxes can contain unrelated unread mail.
2448
+ - Platform sections override the global default, so you can keep pairing enabled broadly while making one platform quieter.
2449
+
2450
+ ## Quick Commands
2451
+
2452
+ Define custom commands that either run shell commands without invoking the LLM, or alias one slash command to another. Exec quick commands are zero-token and useful from messaging platforms (Telegram, Discord, etc.) for quick server checks or utility scripts.
2453
+
2454
+ ```yaml
2455
+ quick_commands:
2456
+ status:
2457
+ type: exec
2458
+ command: systemctl status hermes-agent
2459
+ disk:
2460
+ type: exec
2461
+ command: df -h /
2462
+ update:
2463
+ type: exec
2464
+ command: cd ~/.hermes/hermes-agent && git pull && uv pip install -e .
2465
+ gpu:
2466
+ type: exec
2467
+ command: nvidia-smi --query-gpu=name,utilization.gpu,memory.used,memory.total --format=csv,noheader
2468
+ restart:
2469
+ type: alias
2470
+ target: /gateway restart
2471
+ ```
2472
+
2473
+ Usage: type `/status`, `/disk`, `/update`, `/gpu`, or `/restart` in the CLI or any messaging platform. `exec` commands run locally on the host and return the output directly — no LLM call, no tokens consumed. `alias` commands rewrite to the configured slash command target.
2474
+
2475
+ - **30-second timeout** — long-running commands are killed with an error message
2476
+ - **Priority** — quick commands are checked before skill commands, so you can override skill names
2477
+ - **Autocomplete** — quick commands are resolved at dispatch time and are not shown in the built-in slash-command autocomplete tables
2478
+ - **Type** — supported types are `exec` and `alias`; other types show an error
2479
+ - **Works everywhere** — CLI, Telegram, Discord, Slack, WhatsApp, Signal, Email, Home Assistant
2480
+
2481
+ String-only prompt shortcuts are not valid quick commands. For reusable prompt workflows, create a skill or alias to an existing slash command.
2482
+
2483
+ ## Human Delay
2484
+
2485
+ Simulate human-like response pacing in messaging platforms:
2486
+
2487
+ ```yaml
2488
+ human_delay:
2489
+ mode: "off" # off | natural | custom
2490
+ min_ms: 800 # Minimum delay (custom mode)
2491
+ max_ms: 2500 # Maximum delay (custom mode)
2492
+ ```
2493
+
2494
+ ## Code Execution
2495
+
2496
+ Configure the `execute_code` tool:
2497
+
2498
+ ```yaml
2499
+ code_execution:
2500
+ mode: project # project (default) | strict
2501
+ timeout: 300 # Max execution time in seconds
2502
+ max_tool_calls: 50 # Max tool calls within code execution
2503
+ ```
2504
+
2505
+ **`mode`** controls the working directory and Python interpreter for scripts:
2506
+
2507
+ - **`project`** (default) — scripts run in the session's working directory with the active virtualenv/conda env's python. Project deps (`pandas`, `torch`, project packages) and relative paths (`.env`, `./data.csv`) resolve naturally, matching what `terminal()` sees.
2508
+ - **`strict`** — scripts run in a temp staging directory with `sys.executable` (Hermes's own python). Maximum reproducibility, but project deps and relative paths won't resolve.
2509
+
2510
+ Environment scrubbing (strips `*_API_KEY`, `*_TOKEN`, `*_SECRET`, `*_PASSWORD`, `*_CREDENTIAL`, `*_PASSWD`, `*_AUTH`) and the tool whitelist apply identically in both modes — switching mode does not change the security posture.
2511
+
2512
+ ## Web Search Backends
2513
+
2514
+ The `web_search` and `web_extract` tools support five backend providers. Configure the backend in `config.yaml` or via `hermes tools`:
2515
+
2516
+ ```yaml
2517
+ web:
2518
+ backend: firecrawl # firecrawl | searxng | parallel | tavily | perplexity | keenable | exa
2519
+
2520
+ # Or use per-capability keys to mix providers (e.g. free search + paid extract):
2521
+ search_backend: "searxng"
2522
+ extract_backend: "firecrawl"
2523
+
2524
+ # Keyless free-tier fallback (default: true). With no backend configured
2525
+ # and no API keys present, web tools rotate across the Exa/Parallel/
2526
+ # Firecrawl/Keenable free tiers. Set false to disable.
2527
+ keyless_fallback: true
2528
+
2529
+ # One-shot keyless rescue (default: true). When the chosen/keyed backend
2530
+ # fails a call, that single call retries on the keyless ring; the next
2531
+ # call attempts the chosen backend again (never sticky).
2532
+ keyless_rescue: true
2533
+
2534
+ # Pin Exa/Parallel to a tier (set by the hermes tools Free/Paid rows).
2535
+ # free = always the anonymous endpoint; paid = always the keyed SDK path;
2536
+ # unset = auto (key present -> paid, otherwise free).
2537
+ provider_tier:
2538
+ parallel: free
2539
+ exa: paid
2540
+ ```
2541
+
2542
+ | Backend | Env Var | Search | Extract |
2543
+ |---------|---------|--------|---------|
2544
+ | **Firecrawl** (default) | `FIRECRAWL_API_KEY` | ✔ | ✔ |
2545
+ | **SearXNG** | `SEARXNG_URL` | ✔ | — |
2546
+ | **Parallel** | `PARALLEL_API_KEY` (optional — keyless free tier) | ✔ | ✔ |
2547
+ | **Tavily** | `TAVILY_API_KEY` (optional — keyless when selected) | ✔ | ✔ |
2548
+ | **Perplexity** | `PERPLEXITY_API_KEY` | ✔ | ✔ (query-relevant snippets) |
2549
+ | **Exa** | `EXA_API_KEY` (optional — keyless free tier) | ✔ | ✔ |
2550
+
2551
+ **Backend selection:** The runtime always uses the stored `web.backend` selection (set via `hermes tools`; `nous` routes through the managed Tool Gateway). Only if no web backend has ever been selected is one auto-detected from available API keys: if only `SEARXNG_URL` is set, SearXNG is used; if only `EXA_API_KEY` is set, Exa; if only `TAVILY_API_KEY` is set, Tavily; if only `PERPLEXITY_API_KEY` is set, Perplexity; if only `PARALLEL_API_KEY` is set, Parallel; if only `KEENABLE_API_KEY` is set, Keenable. With **no selection and no credentials at all**, requests rotate round-robin across the keyless free-tier ring (Exa / Parallel / Firecrawl / Keenable) with automatic next-in-line failover on rate limits — see the [Web Search guide](/user-guide/features/web-search) for details. Once a selection exists, adding a key to `.env` does not change the route. Selecting Tavily, Firecrawl, or Keenable in `hermes tools` also works without a key.
2552
+
2553
+ **SearXNG** is a free, self-hosted, privacy-respecting metasearch engine that queries 70+ search engines. No API key needed — just set `SEARXNG_URL` to your instance (e.g., `http://localhost:8080`). SearXNG is search-only; `web_extract` requires a separate extract provider (set `web.extract_backend`). See the [Web Search setup guide](/user-guide/features/web-search) for Docker setup instructions.
2554
+
2555
+ **Self-hosted Firecrawl:** Set `FIRECRAWL_API_URL` to point at your own instance. When a custom URL is set, the API key becomes optional (set `USE_DB_AUTHENTICATION=*** on the server to disable auth).
2556
+
2557
+ **Parallel search modes:** Set `PARALLEL_SEARCH_MODE` to control search behavior — `fast`, `one-shot`, or `agentic` (default: `agentic`).
2558
+
2559
+ **Exa:** Set `EXA_API_KEY` in `~/.hermes/.env`. Supports `category` filtering (`company`, `research paper`, `news`, `people`, `personal site`, `pdf`) and domain/date filters.
2560
+
2561
+ ## Browser
2562
+
2563
+ Configure browser automation behavior:
2564
+
2565
+ ```yaml
2566
+ browser:
2567
+ inactivity_timeout: 120 # Seconds before auto-closing idle sessions
2568
+ command_timeout: 30 # Timeout in seconds for browser commands (screenshot, navigate, etc.)
2569
+ record_sessions: false # Auto-record browser sessions as WebM videos to ~/.hermes/browser_recordings/
2570
+ # Optional CDP override — when set, Hermes attaches directly to your own
2571
+ # Chromium-family browser (via /browser connect) rather than starting a headless browser.
2572
+ cdp_url: ""
2573
+ # Dialog supervisor — controls how native JS dialogs (alert / confirm / prompt)
2574
+ # are handled when a CDP backend is attached (Browserbase, local Chromium-family
2575
+ # browser via /browser connect). Ignored on Camofox and default local agent-browser mode.
2576
+ dialog_policy: must_respond # must_respond | auto_dismiss | auto_accept
2577
+ dialog_timeout_s: 300 # Safety auto-dismiss under must_respond (seconds)
2578
+ camofox:
2579
+ managed_persistence: false # When true, Camofox sessions persist cookies/logins across restarts
2580
+ user_id: "" # Optional externally managed Camofox userId
2581
+ session_key: "" # Optional session key sent when Hermes creates a tab
2582
+ adopt_existing_tab: false # Reuse an existing tab for this identity before creating one
2583
+ ```
2584
+
2585
+ **Dialog policies:**
2586
+
2587
+ - `must_respond` (default) — capture the dialog, surface it in `browser_snapshot.pending_dialogs`, and wait for the agent to call `browser_dialog(action=...)`. After `dialog_timeout_s` seconds with no response, the dialog is auto-dismissed to prevent the page's JS thread from stalling forever.
2588
+ - `auto_dismiss` — capture, dismiss immediately. The agent still sees the dialog record in `browser_snapshot.recent_dialogs` with `closed_by="auto_policy"` after the fact.
2589
+ - `auto_accept` — capture, accept immediately. Useful for pages with aggressive `beforeunload` prompts.
2590
+
2591
+ See the [browser feature page](./features/browser.md#browser_dialog) for the full dialog workflow.
2592
+
2593
+ The browser toolset supports multiple providers. See the [Browser feature page](/user-guide/features/browser) for details on Browserbase, Browser Use, and local Chromium-family CDP setup.
2594
+
2595
+ ## Timezone
2596
+
2597
+ Override the server-local timezone with an IANA timezone string. Affects timestamps in logs, cron scheduling, and system prompt time injection.
2598
+
2599
+ ```yaml
2600
+ timezone: "America/New_York" # IANA timezone (default: "" = server-local time)
2601
+ ```
2602
+
2603
+ Supported values: any IANA timezone identifier (e.g. `America/New_York`, `Europe/London`, `Asia/Kolkata`, `UTC`). Leave empty or omit for server-local time.
2604
+
2605
+ `hermes doctor` (and the startup config check) reports a value the runtime cannot load — a typo such as `Asia/Tokio` would otherwise silently put the agent clock and every cron schedule on server-local time. `HERMES_TIMEZONE` overrides this key when set.
2606
+
2607
+ ## Discord
2608
+
2609
+ Configure Discord-specific behavior for the messaging gateway:
2610
+
2611
+ ```yaml
2612
+ discord:
2613
+ require_mention: true # Require @mention to respond in server channels
2614
+ free_response_channels: "" # Comma-separated channel IDs where bot responds without @mention
2615
+ auto_thread: true # Auto-create threads on @mention in channels
2616
+ ```
2617
+
2618
+ - `require_mention` — when `true` (default), the bot only responds in server channels when mentioned with `@BotName`. DMs always work without mention.
2619
+ - `free_response_channels` — comma-separated list of channel IDs where the bot responds to every message without requiring a mention.
2620
+ - `auto_thread` — when `true` (default), mentions in channels automatically create a thread for the conversation, keeping channels clean (similar to Slack threading).
2621
+
2622
+ ## Security
2623
+
2624
+ Pre-execution security scanning and secret redaction:
2625
+
2626
+ ```yaml
2627
+ security:
2628
+ redact_secrets: true # Redact API key patterns in tool output and logs (on by default)
2629
+ tirith_enabled: true # Enable Tirith security scanning for terminal commands
2630
+ tirith_path: "tirith" # Path to tirith binary (default: "tirith" in $PATH)
2631
+ tirith_timeout: 5 # Seconds to wait for tirith scan before timing out
2632
+ tirith_fail_open: true # Allow command execution if tirith is unavailable
2633
+ website_blocklist: # See Website Blocklist section below
2634
+ enabled: false
2635
+ domains: []
2636
+ shared_files: []
2637
+ ```
2638
+
2639
+ - `redact_secrets` — when `true`, automatically detects and redacts patterns that look like API keys, tokens, and passwords in tool output before it enters the conversation context and logs. **On by default**. Set to `false` explicitly only when you need raw credential-like strings for debugging or redactor development. Reading a secret-bearing file (`.env`-style files, shell rc/profile files, the Hermes `config.yaml` under `HERMES_HOME` and its `backups/config/` copies) with `read_file`, `search_files` or a terminal `cat`/`grep` also masks credential-shaped assignments (`SOME_API_TOKEN: …`) with a non-reusable `«redacted-secret»` marker, whatever the value looks like; ordinary source and project config files keep only the vendor-prefix patterns so fixtures such as `MAX_TOKENS: 100` are never mangled.
2640
+ - `tirith_enabled` — when `true`, terminal commands are scanned by [Tirith](https://github.com/sheeki03/tirith) before execution to detect potentially dangerous operations.
2641
+ - `tirith_path` — path to the tirith binary. Set this if tirith is installed in a non-standard location.
2642
+ - `tirith_timeout` — maximum seconds to wait for a tirith scan. Commands proceed if the scan times out.
2643
+ - `tirith_fail_open` — when `true` (default), commands are allowed to execute if tirith is unavailable or fails. Set to `false` to block commands when tirith cannot verify them.
2644
+
2645
+ ## Website Blocklist
2646
+
2647
+ Block specific domains from being accessed by the agent's web and browser tools:
2648
+
2649
+ ```yaml
2650
+ security:
2651
+ website_blocklist:
2652
+ enabled: false # Enable URL blocking (default: false)
2653
+ domains: # List of blocked domain patterns
2654
+ - "*.internal.company.com"
2655
+ - "admin.example.com"
2656
+ - "*.local"
2657
+ shared_files: # Load additional rules from external files
2658
+ - "/etc/hermes/blocked-sites.txt"
2659
+ ```
2660
+
2661
+ When enabled, any URL matching a blocked domain pattern is rejected before the web or browser tool executes. This applies to `web_search`, `web_extract`, `browser_navigate`, and any tool that accesses URLs.
2662
+
2663
+ Domain rules support:
2664
+ - Exact domains: `admin.example.com`
2665
+ - Wildcard subdomains: `*.internal.company.com` (blocks all subdomains)
2666
+ - TLD wildcards: `*.local`
2667
+
2668
+ Shared files contain one domain rule per line (blank lines and `#` comments are ignored). Missing or unreadable files log a warning but don't disable other web tools.
2669
+
2670
+ The policy is cached for 30 seconds, so config changes take effect quickly without restart.
2671
+
2672
+ ## Smart Approvals
2673
+
2674
+ Control how Hermes handles potentially dangerous commands:
2675
+
2676
+ ```yaml
2677
+ approvals:
2678
+ mode: smart # smart | manual | off
2679
+ ```
2680
+
2681
+ | Mode | Behavior |
2682
+ |------|----------|
2683
+ | `smart` (default) | Use an auxiliary LLM to assess whether a flagged command is actually dangerous. Low-risk commands are auto-approved for that command only. Genuinely risky commands are denied; uncertain decisions escalate to the user. |
2684
+ | `manual` | Prompt the user before executing any flagged command. In the CLI, shows an interactive approval dialog. In messaging, queues a pending approval request. |
2685
+ | `off` | Skip all approval checks. Equivalent to `HERMES_YOLO_MODE=true`. **Use with caution.** |
2686
+
2687
+ Smart mode is particularly useful for reducing approval fatigue — it lets the agent work more autonomously on safe operations while still catching genuinely destructive commands.
2688
+
2689
+ :::warning
2690
+ Setting `approvals.mode: off` disables all safety checks for terminal commands. Only use this in trusted, sandboxed environments.
2691
+ :::
2692
+
2693
+ ### Denial circuit breaker
2694
+
2695
+ `approvals.denial_breaker_threshold` (default `3`) guards against the agent retrying variations of a command the smart-approval reviewer keeps denying — each retry burns another guardian LLM call. After that many consecutive denials in a session, the deny message escalates to a hard-stop instruction telling the agent to stop, report the blocked operation, and ask you to run it manually or `/approve`. Any approval resets the count; set `0` to disable:
2696
+
2697
+ ```yaml
2698
+ approvals:
2699
+ denial_breaker_threshold: 3 # 0 disables the breaker
2700
+ ```
2701
+
2702
+ ### Deny rules
2703
+
2704
+ `approvals.deny` is a list of glob patterns that block matching terminal commands unconditionally — even under `--yolo`, `/yolo`, or `mode: off`. It's the user-editable counterpart to the built-in hardline blocklist:
2705
+
2706
+ ```yaml
2707
+ approvals:
2708
+ deny:
2709
+ - "git push --force*"
2710
+ - "*curl*|*sh*"
2711
+ ```
2712
+
2713
+ Patterns are case-insensitive fnmatch globs and must be quoted in YAML (a bare leading `*` is a parse error). See [Security — User-Defined Deny Rules](/user-guide/security#user-defined-deny-rules-approvalsdeny) for details.
2714
+
2715
+ ### Custom smart-approval policy
2716
+
2717
+ `approvals.smart_policy` lets you append your own rules to the smart-approval reviewer's instructions. When set, the text is added to the guardian LLM's system prompt (the trusted channel — never alongside the untrusted command text), so you can tighten or relax its judgment for your environment without editing code:
2718
+
2719
+ ```yaml
2720
+ approvals:
2721
+ smart_policy: |
2722
+ Always ESCALATE commands that modify anything under /etc.
2723
+ APPROVE docker compose restarts in ~/deploys — they are routine here.
2724
+ ```
2725
+
2726
+
2727
+ ## Checkpoints
2728
+
2729
+ Automatic filesystem snapshots before destructive file operations. See the [Checkpoints & Rollback](/user-guide/checkpoints-and-rollback) for details.
2730
+
2731
+ ```yaml
2732
+ checkpoints:
2733
+ enabled: false # Enable automatic checkpoints (also: hermes chat --checkpoints). Default: false (opt-in).
2734
+ max_snapshots: 20 # Max checkpoints to keep per directory (default: 20)
2735
+ ```
2736
+
2737
+
2738
+ ## Delegation
2739
+
2740
+ Configure subagent behavior for the delegate tool:
2741
+
2742
+ ```yaml
2743
+ delegation:
2744
+ # model: "google/gemini-3-flash-preview" # Override model (empty = inherit parent)
2745
+ # provider: "openrouter" # Override provider (empty = inherit parent)
2746
+ # base_url: "http://localhost:1234/v1" # Direct OpenAI-compatible endpoint (takes precedence over provider)
2747
+ # api_key: "local-key" # API key for base_url (falls back to OPENAI_API_KEY)
2748
+ # api_mode: "" # Wire protocol for base_url: "chat_completions", "codex_responses", or "anthropic_messages". Empty = auto-detect from URL (e.g. /anthropic suffix → anthropic_messages). Set explicitly for non-standard endpoints the heuristic can't detect.
2749
+ compression_threshold_tokens: 0 # Optional absolute cap on a subagent's compaction trigger (>= 16000); 0 = off, children use the ratio threshold
2750
+ # request_overrides: # Per-child request settings sent on every subagent API call (all resolution branches).
2751
+ # extra_body: # Merged into the request's extra_body — e.g. OpenRouter routing hints:
2752
+ # provider:
2753
+ # sort: throughput
2754
+ max_concurrent_children: 3 # Parallel children per batch (floor 1, no ceiling). Also via DELEGATION_MAX_CONCURRENT_CHILDREN env var.
2755
+ worktree_isolation: false # Give each child its own git worktree branched from HEAD (local backend + git repos only; inspired by Muse Code). See Subagent Delegation → Worktree Isolation.
2756
+ max_spawn_depth: 1 # Delegation tree depth cap (1-3, clamped). 1 = flat (default): parent spawns leaves that cannot delegate. 2 = orchestrator children can spawn leaf grandchildren. 3 = three levels.
2757
+ orchestrator_enabled: true # Global kill switch. When false, role="orchestrator" is ignored and every child is forced to leaf regardless of max_spawn_depth.
2758
+ ```
2759
+
2760
+ **Subagent provider:model override:** By default, subagents inherit the parent agent's provider and model. Set `delegation.provider` and `delegation.model` to route subagents to a different provider:model pair — e.g., use a cheap/fast model for narrowly-scoped subtasks while your primary agent runs an expensive reasoning model.
2761
+
2762
+ **Subagent fallback chain:** Set `delegation.fallback_providers` to give workers their own chain (same entry shape as the top-level list). An explicitly pinned child (by provider, endpoint, or model) uses that chain only when it is declared; otherwise it fails loudly instead of borrowing the parent agent's route. For an unpinned child, an absent or `null` setting preserves parent-chain inheritance. Use `fallback_providers: []` under `delegation:` to disable child fallback entirely.
2763
+
2764
+ **Direct endpoint override:** If you want the obvious custom-endpoint path, set `delegation.base_url`, `delegation.api_key`, and `delegation.model`. That sends subagents directly to that OpenAI-compatible endpoint and takes precedence over `delegation.provider`. If `delegation.api_key` is omitted, Hermes falls back to `OPENAI_API_KEY` only. When `delegation.provider` is set alongside `delegation.base_url`, the explicit endpoint and key still win, but that provider's request settings (`extra_body` overrides and max output tokens from your `custom_providers` entry) are carried into the subagent.
2765
+
2766
+ **Per-child request settings (`request_overrides`):** `delegation.request_overrides` is a dict of request settings sent on every subagent API call. Top-level keys are API kwargs (e.g. `service_tier`); an `extra_body` sub-dict is merged into the request's `extra_body`. It is honored on **all three** resolution branches — direct `base_url`, named `provider`, and pure inherit — so the key always takes effect. Precedence: explicit `request_overrides` values merge **over** any runtime- or parent-derived overrides — top-level explicit keys win, and `extra_body` is deep-merged one level so runtime `extra_body` keys (e.g. a provider's `thinking: {type: disabled}` personality) survive unless your key redefines them. The canonical use case is OpenRouter routing hints for delegation children:
2767
+
2768
+ ```yaml
2769
+ delegation:
2770
+ model: "deepseek/deepseek-v4-flash-0731"
2771
+ base_url: "https://openrouter.ai/api/v1"
2772
+ api_key: "sk-or-..."
2773
+ request_overrides:
2774
+ extra_body:
2775
+ provider:
2776
+ sort: throughput # route children to the fastest OpenRouter provider
2777
+ ```
2778
+ **Wire protocol (`api_mode`):** Hermes auto-detects the wire protocol from `delegation.base_url` (e.g. paths ending in `/anthropic` → `anthropic_messages`; Codex / native Anthropic / Kimi-coding hostnames keep their existing detection). For endpoints the heuristic can't classify — for example Azure AI Foundry, MiniMax, Zhipu GLM, or LiteLLM proxies fronting an Anthropic-shaped backend — set `delegation.api_mode` explicitly to one of `chat_completions`, `codex_responses`, or `anthropic_messages`. Leave it empty (the default) to keep auto-detection.
2779
+
2780
+ The delegation provider uses the same credential resolution as CLI/gateway startup. All configured providers are supported: `openrouter`, `nous`, `copilot`, `zai`, `kimi-coding`, `minimax`, `minimax-cn`. When a provider is set, the system automatically resolves the correct base URL, API key, and API mode — no manual credential wiring needed.
2781
+
2782
+ **Precedence:** `delegation.base_url` in config → `delegation.provider` in config → parent provider (inherited). `delegation.model` in config → parent model (inherited). Setting just `model` without `provider` changes only the model name while keeping the parent's credentials (useful for switching models within the same provider like OpenRouter).
2783
+
2784
+ **Width and depth:** `max_concurrent_children` caps how many subagents run in parallel per batch (default `3`, floor of 1, no ceiling). Can also be set via the `DELEGATION_MAX_CONCURRENT_CHILDREN` env var. When the model submits a `tasks` array longer than the cap, `delegate_task` returns a tool error explaining the limit rather than silently truncating. `max_spawn_depth` controls the delegation tree depth (clamped to 1-3). At the default `1`, delegation is flat: children cannot spawn grandchildren, and passing `role="orchestrator"` silently degrades to `leaf`. Raise to `2` so orchestrator children can spawn leaf grandchildren; `3` for three-level trees. The agent opts into orchestration per call via `role="orchestrator"`; `orchestrator_enabled: false` forces every child back to leaf regardless. Cost scales multiplicatively — at `max_spawn_depth: 3` with `max_concurrent_children: 3`, the tree can reach 3×3×3 = 27 concurrent leaf agents. See [Subagent Delegation → Depth Limit and Nested Orchestration](features/delegation.md#depth-limit-and-nested-orchestration) for usage patterns.
2785
+
2786
+ **Child process notifications:** background processes started by subagents route their completion/watch notifications to the parent conversation, but those are **suppressed** there by default — the child's consolidated result is the deliverable. Set `delegation.surface_child_process_notifications: true` to deliver them (with subagent attribution). Delegation results themselves are never suppressed. See [Subagent Delegation → Child background-process notifications](features/delegation.md#child-background-process-notifications).
2787
+
2788
+ ## Clarify
2789
+
2790
+ Configure how long the gateway waits for a response to a clarifying question. The canonical key is `agent.clarify_timeout` (default `3600` seconds); a legacy top-level `clarify.timeout` is still honored if explicitly set:
2791
+
2792
+ ```yaml
2793
+ agent:
2794
+ clarify_timeout: 3600 # Seconds to wait for user clarification response (0 or less = unlimited)
2795
+ ```
2796
+
2797
+ ## Context Files (SOUL.md, AGENTS.md)
2798
+
2799
+ Hermes uses two different context scopes:
2800
+
2801
+ | File | Purpose | Scope |
2802
+ |------|---------|-------|
2803
+ | `SOUL.md` | **Primary agent identity** — defines who the agent is (slot #1 in the system prompt) | `~/.hermes/SOUL.md` or `$HERMES_HOME/SOUL.md` |
2804
+ | `.hermes.md` / `HERMES.md` | Project-specific instructions (highest priority) | Walks to git root |
2805
+ | `AGENTS.md` | Project-specific instructions, coding conventions | Recursive directory walk |
2806
+ | `CLAUDE.md` | Claude Code context files (also detected) | Working directory only |
2807
+ | `.cursorrules` | Cursor IDE rules (also detected) | Working directory only |
2808
+ | `.cursor/rules/*.mdc` | Cursor rule files (also detected) | Working directory only |
2809
+
2810
+ - **SOUL.md** is the agent's primary identity. It occupies slot #1 in the system prompt, completely replacing the built-in default identity. Edit it to fully customize who the agent is.
2811
+ - If SOUL.md is missing, empty, or cannot be loaded, Hermes falls back to a built-in default identity.
2812
+ - **Project context files use a priority system** — only ONE type is loaded (first match wins): `.hermes.md` → `AGENTS.md` → `CLAUDE.md` → `.cursorrules`. SOUL.md is always loaded independently.
2813
+ - **AGENTS.md** is hierarchical: if subdirectories also have AGENTS.md, all are combined.
2814
+ - Hermes automatically seeds a default `SOUL.md` if one does not already exist.
2815
+ - All loaded context files are capped at `context_file_max_chars` characters (default 20,000) with smart truncation.
2816
+
2817
+ See also:
2818
+ - [Personality & SOUL.md](/user-guide/features/personality)
2819
+ - [Context Files](/user-guide/features/context-files)
2820
+
2821
+ ## Working Directory
2822
+
2823
+ | Context | Default |
2824
+ |---------|---------|
2825
+ | **CLI (`hermes`)** | Current directory where you run the command |
2826
+ | **Messaging gateway** | `terminal.cwd` from `~/.hermes/config.yaml`; if unset, home directory `~` |
2827
+ | **Docker / Singularity / Modal / SSH** | User's home directory inside the container or remote machine |
2828
+
2829
+ Override the working directory:
2830
+ ```yaml
2831
+ # In ~/.hermes/config.yaml:
2832
+ terminal:
2833
+ cwd: /home/myuser/projects
2834
+ ```
2835
+
2836
+ `MESSAGING_CWD` and direct `TERMINAL_CWD` entries in `~/.hermes/.env` are legacy compatibility fallbacks. New configurations should use `terminal.cwd`.
2837
+
2838
+ ## Network
2839
+
2840
+ Connectivity workarounds for outbound HTTP:
2841
+
2842
+ ```yaml
2843
+ network:
2844
+ force_ipv4: false # Force IPv4 for outbound connections (default: false)
2845
+ ```
2846
+
2847
+ `force_ipv4` — on servers with broken or unreachable IPv6, Python resolves AAAA records first and can hang for the full TCP timeout before falling back to IPv4. Set this to `true` to skip IPv6 entirely and connect over IPv4 directly.
2848
+
2849
+ ## Onboarding
2850
+
2851
+ First-touch onboarding hints and the structured profile-build offer:
2852
+
2853
+ ```yaml
2854
+ onboarding:
2855
+ profile_build: "ask" # "ask" (default) | "off"
2856
+ seen: {} # internal latch — leave empty
2857
+ ```
2858
+
2859
+ - `profile_build` — controls the profile-build path offered on the very first gateway message ever. `"ask"` (default) offers to build a user profile; the offer is **opt-in and consent-gated** — the agent asks before any lookup and never reads connected accounts silently. `"off"` shows a plain intro only. The offer fires at most once.
2860
+ - `seen` — internal state. Hermes latches each shown hint here so it never fires again; the profile-build offer is also recorded here once shown. Don't hand-edit it — wipe the whole `onboarding` section if you want to re-see all hints.
2861
+
2862
+ ## Dashboard
2863
+
2864
+ Configuration for the [web dashboard](/user-guide/features/web-dashboard) — visual theme, public URL, and authentication providers. The auth providers (OAuth, basic password, drain) are documented in detail on the web-dashboard page; this is the `config.yaml` shape.
2865
+
2866
+ ```yaml
2867
+ dashboard:
2868
+ theme: "default" # "default" | "midnight" | "ember" | "mono" | "cyberpunk" | "rose"
2869
+ show_token_analytics: false # Re-enable the (local-estimate-only) token/cost analytics surfaces
2870
+ public_url: "" # Full public authority for OAuth redirect_uri (env: HERMES_DASHBOARD_PUBLIC_URL)
2871
+ trusted_proxies: [] # Proxy IPs/CIDRs allowed to supply X-Forwarded-* headers
2872
+ oauth: # Portal OAuth gate (engaged with --host and not --insecure)
2873
+ client_id: "" # agent:{instance_id} — Portal provisions this
2874
+ portal_url: "" # blank → plugin default (production Portal)
2875
+ basic_auth: # Self-hosted username/password gate (dashboard_auth/basic plugin)
2876
+ username: "" # blank → plugin no-op
2877
+ password_hash: "" # scrypt$... (preferred — no plaintext at rest)
2878
+ password: "" # plaintext fallback (hashed in-memory at load)
2879
+ secret: "" # token-signing key; blank → random per-process
2880
+ session_ttl_seconds: 0 # 0 → plugin default (12h)
2881
+ drain_auth: # Drain-control service-credential gate (dashboard_auth/drain plugin)
2882
+ scope: "drain" # capability label on the verified principal
2883
+ min_secret_chars: 43 # entropy bar (url-safe-b64 chars; 43 ≈ 256 bits)
2884
+ ws_ping_interval: 20.0 # Non-loopback WebSocket keepalive ping interval (seconds)
2885
+ ws_ping_timeout: 20.0 # Non-loopback WebSocket keepalive pong timeout (seconds)
2886
+ ws_orphan_reap_grace_s: 20.0 # Grace before a WS-detached session is reaped (seconds)
2887
+ ssh_isolated_idle_grace_s: 900.0 # Desktop-over-SSH backend exits after this long with no client and no running turn
2888
+ ws_orphan_activity_stale_s: 600.0 # Activity idle bound before a detached RUNNING turn is interrupted (seconds)
2889
+ startup_orphan_sweep: true # Close session rows orphaned by a dead gateway process at boot
2890
+ ```
2891
+
2892
+ - `theme` — dashboard visual theme.
2893
+ - `show_token_analytics` — off by default. The Analytics page and token/cost figures are a **local lower-bound estimate** (they exclude auxiliary calls, retries, fallbacks, and cache writes), so they can read far below the provider bill. Set `true` only if you understand they're not billing.
2894
+ - `public_url` — when set, this is the complete authority (scheme + host + optional path prefix) the OAuth `redirect_uri` is built from. Set it for deploys behind reverse proxies that don't reliably forward `X-Forwarded-*` headers. Leave empty to use proxy-header reconstruction.
2895
+ - `trusted_proxies` — IP addresses or bounded CIDR networks allowed to supply `X-Forwarded-Proto` and `X-Forwarded-For`. Loopback remains trusted automatically. Configure this when the TLS reverse proxy connects from another container or host. Prefer the proxy's exact IP; use a small dedicated network only when its address is dynamic. Wildcards and `/0` networks are rejected.
2896
+ - `oauth` / `basic_auth` / `drain_auth` — auth provider config read by the bundled dashboard-auth plugins. The drain secret itself is **not** set here; it's provisioned via the `HERMES_DASHBOARD_DRAIN_SECRET` env var. See [Web Dashboard](/user-guide/features/web-dashboard) for full auth setup.
2897
+ - `ws_ping_interval` / `ws_ping_timeout` — WebSocket keepalive tuning for non-loopback binds (loopback connections never ping). Raise these on high-latency links (Tailscale, distant SSH tunnels) where the 20 s defaults can manufacture spurious 1006 disconnects.
2898
+ - `ssh_isolated_idle_grace_s` (default `900`) — a Desktop-owned `hermes serve --isolated` backend reached over SSH is detached from the SSH session on purpose, so a laptop that sleeps mid-connection cannot tear it down; each dark-wake reconnect used to leave another backend holding `state.db`. The backend now retires itself once no client WebSocket has been connected for this long and no agent turn is running (a turn keeps it alive; an unreadable turn state keeps it alive too). Set high if you rely on a detached backend finishing long work after the laptop sleeps. Such backends also send a slow WebSocket ping (60 s, 10 min timeout) so a half-open tunnel is noticed.
2899
+ - `ws_orphan_reap_grace_s` — how long a WS-detached session waits before the orphan reaper collects it. Raise alongside the keepalive values if clients reconnect slowly. Periodic session maintenance also completes cleanup for closed sockets and re-arms a missing orphan timer, so a detached chat cannot keep its ownership lease solely because its initial cleanup or timer was lost. Reconnecting cancels that timer; active delegated work and healthy running turns remain protected by the normal orphan-reaper checks. (`HERMES_TUI_WS_ORPHAN_REAP_GRACE_S` remains as an internal override.)
2900
+ - `ws_orphan_activity_stale_s` (default `600`) — how long a detached **running** turn's activity clock (the same clock the `agent.turn_liveness` watchdog samples: API waits, stream tokens, tool heartbeats) must be idle before the orphan reaper interrupts it. A client-absent turn that is still actively producing keeps running to completion detached — closing the laptop, backgrounding the mobile app, or a desktop update no longer cancels healthy long turns; only a genuinely wedged turn is interrupted. Set `0` to interrupt at the grace window regardless of activity (old behavior).
2901
+ - `startup_orphan_sweep` (default `true`) — the WS-orphan reap timer above is in-process, so a gateway restart (update, crash, systemd) before it fires leaves the session row open forever — phantom "active" work in `/resume` and dashboards. On every gateway boot — both the stdio TUI (`entry.main`) and the desktop/dashboard WebSocket sidecar (`handle_ws`) — rows with source `tui` / `desktop` / `subagent` / `unknown` (a row the token-accounting guard had to materialize itself) whose start time **and** newest message are both older than the session TTL (`HERMES_TUI_SESSION_TTL_S`, default 6 hours) are closed with `end_reason: startup_orphan_reap`. Messaging-platform sessions (Telegram, Discord, …) are never touched, live in-memory sessions (a client that already resumed) are excluded, and swept sessions remain resumable.