@hybridaione/hybridclaw 0.12.6 → 0.12.8

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 (308) hide show
  1. package/AGENTS.md +20 -0
  2. package/CHANGELOG.md +153 -0
  3. package/README.md +26 -0
  4. package/config.example.json +45 -0
  5. package/console/dist/assets/chat-A439MpRy.css +1 -0
  6. package/console/dist/assets/{chat-BFZkUicV.js → chat-I6Pguk2e.js} +4 -4
  7. package/console/dist/assets/{index-BLDth_j-.js → index-DON3wuuC.js} +3 -3
  8. package/console/dist/assets/index-DQoS6dsR.css +1 -0
  9. package/console/dist/assets/{terminal-BQbAhdr-.js → terminal-BQEo_jcm.js} +1 -1
  10. package/console/dist/index.html +2 -2
  11. package/container/Dockerfile +2 -0
  12. package/container/dist/index.js +2 -2
  13. package/container/dist/index.js.map +1 -1
  14. package/container/dist/model-retry.js +3 -3
  15. package/container/dist/model-retry.js.map +1 -1
  16. package/container/dist/providers/hybridai.js +3 -3
  17. package/container/dist/providers/hybridai.js.map +1 -1
  18. package/container/dist/providers/local-ollama.js +3 -3
  19. package/container/dist/providers/local-ollama.js.map +1 -1
  20. package/container/dist/providers/local-openai-compat.js +3 -3
  21. package/container/dist/providers/local-openai-compat.js.map +1 -1
  22. package/container/dist/providers/openai-codex.js +2 -2
  23. package/container/dist/providers/openai-codex.js.map +1 -1
  24. package/container/dist/providers/provider-ids.js +18 -0
  25. package/container/dist/providers/provider-ids.js.map +1 -1
  26. package/container/dist/providers/shared.js +4 -4
  27. package/container/dist/tools.js +1 -2
  28. package/container/dist/tools.js.map +1 -1
  29. package/container/dist/web-fetch.js +0 -15
  30. package/container/dist/web-fetch.js.map +1 -1
  31. package/container/package-lock.json +2 -2
  32. package/container/package.json +1 -1
  33. package/container/shared/model-names.js +9 -0
  34. package/container/src/index.ts +2 -2
  35. package/container/src/model-retry.ts +3 -3
  36. package/container/src/providers/hybridai.ts +3 -3
  37. package/container/src/providers/local-ollama.ts +3 -3
  38. package/container/src/providers/local-openai-compat.ts +3 -3
  39. package/container/src/providers/openai-codex.ts +2 -2
  40. package/container/src/providers/provider-ids.ts +21 -4
  41. package/container/src/providers/shared.ts +4 -4
  42. package/container/src/tools.ts +1 -5
  43. package/container/src/web-fetch.ts +0 -28
  44. package/dist/agent/agent.d.ts.map +1 -1
  45. package/dist/agent/agent.js +8 -0
  46. package/dist/agent/agent.js.map +1 -1
  47. package/dist/agent/prompt-hooks.d.ts.map +1 -1
  48. package/dist/agent/prompt-hooks.js +3 -2
  49. package/dist/agent/prompt-hooks.js.map +1 -1
  50. package/dist/cli/auth-command.d.ts.map +1 -1
  51. package/dist/cli/auth-command.js +205 -4
  52. package/dist/cli/auth-command.js.map +1 -1
  53. package/dist/cli/help.d.ts.map +1 -1
  54. package/dist/cli/help.js +1 -0
  55. package/dist/cli/help.js.map +1 -1
  56. package/dist/cli/plugin-command.d.ts.map +1 -1
  57. package/dist/cli/plugin-command.js +12 -17
  58. package/dist/cli/plugin-command.js.map +1 -1
  59. package/dist/command-registry.d.ts.map +1 -1
  60. package/dist/command-registry.js +73 -6
  61. package/dist/command-registry.js.map +1 -1
  62. package/dist/config/config.d.ts +27 -0
  63. package/dist/config/config.d.ts.map +1 -1
  64. package/dist/config/config.js +77 -1
  65. package/dist/config/config.js.map +1 -1
  66. package/dist/config/runtime-config.d.ts +46 -0
  67. package/dist/config/runtime-config.d.ts.map +1 -1
  68. package/dist/config/runtime-config.js +161 -1
  69. package/dist/config/runtime-config.js.map +1 -1
  70. package/dist/doctor/provider-probes.d.ts.map +1 -1
  71. package/dist/doctor/provider-probes.js +15 -7
  72. package/dist/doctor/provider-probes.js.map +1 -1
  73. package/dist/doctor/utils.d.ts +1 -1
  74. package/dist/doctor/utils.d.ts.map +1 -1
  75. package/dist/doctor/utils.js +3 -3
  76. package/dist/doctor/utils.js.map +1 -1
  77. package/dist/gateway/docs.d.ts.map +1 -1
  78. package/dist/gateway/docs.js +112 -0
  79. package/dist/gateway/docs.js.map +1 -1
  80. package/dist/gateway/gateway-chat-service.d.ts.map +1 -1
  81. package/dist/gateway/gateway-chat-service.js +12 -2
  82. package/dist/gateway/gateway-chat-service.js.map +1 -1
  83. package/dist/gateway/gateway-http-proxy.d.ts.map +1 -1
  84. package/dist/gateway/gateway-http-proxy.js +1 -28
  85. package/dist/gateway/gateway-http-proxy.js.map +1 -1
  86. package/dist/gateway/gateway-http-server.d.ts.map +1 -1
  87. package/dist/gateway/gateway-http-server.js +0 -6
  88. package/dist/gateway/gateway-http-server.js.map +1 -1
  89. package/dist/gateway/gateway-http-utils.d.ts.map +1 -1
  90. package/dist/gateway/gateway-http-utils.js +0 -6
  91. package/dist/gateway/gateway-http-utils.js.map +1 -1
  92. package/dist/gateway/gateway-plugin-service.d.ts.map +1 -1
  93. package/dist/gateway/gateway-plugin-service.js +13 -1
  94. package/dist/gateway/gateway-plugin-service.js.map +1 -1
  95. package/dist/gateway/gateway-provider-service.d.ts +10 -0
  96. package/dist/gateway/gateway-provider-service.d.ts.map +1 -0
  97. package/dist/gateway/gateway-provider-service.js +139 -0
  98. package/dist/gateway/gateway-provider-service.js.map +1 -0
  99. package/dist/gateway/gateway-restart.d.ts +16 -0
  100. package/dist/gateway/gateway-restart.d.ts.map +1 -1
  101. package/dist/gateway/gateway-restart.js +101 -19
  102. package/dist/gateway/gateway-restart.js.map +1 -1
  103. package/dist/gateway/gateway-service.d.ts.map +1 -1
  104. package/dist/gateway/gateway-service.js +96 -191
  105. package/dist/gateway/gateway-service.js.map +1 -1
  106. package/dist/gateway/gateway-types.d.ts +2 -1
  107. package/dist/gateway/gateway-types.d.ts.map +1 -1
  108. package/dist/gateway/gateway-types.js.map +1 -1
  109. package/dist/gateway/gateway.js +5 -0
  110. package/dist/gateway/gateway.js.map +1 -1
  111. package/dist/gateway/skill-commands.d.ts.map +1 -1
  112. package/dist/gateway/skill-commands.js +75 -1
  113. package/dist/gateway/skill-commands.js.map +1 -1
  114. package/dist/infra/container-runner.d.ts.map +1 -1
  115. package/dist/infra/container-runner.js +15 -4
  116. package/dist/infra/container-runner.js.map +1 -1
  117. package/dist/infra/container-setup.d.ts +6 -0
  118. package/dist/infra/container-setup.d.ts.map +1 -1
  119. package/dist/infra/container-setup.js +107 -9
  120. package/dist/infra/container-setup.js.map +1 -1
  121. package/dist/infra/host-runner.d.ts.map +1 -1
  122. package/dist/infra/host-runner.js +8 -0
  123. package/dist/infra/host-runner.js.map +1 -1
  124. package/dist/logger.d.ts.map +1 -1
  125. package/dist/logger.js +7 -0
  126. package/dist/logger.js.map +1 -1
  127. package/dist/memory/db.d.ts.map +1 -1
  128. package/dist/memory/db.js +0 -7
  129. package/dist/memory/db.js.map +1 -1
  130. package/dist/migration/agent-home-migration.d.ts.map +1 -1
  131. package/dist/migration/agent-home-migration.js +5 -3
  132. package/dist/migration/agent-home-migration.js.map +1 -1
  133. package/dist/observability/otel.d.ts +36 -0
  134. package/dist/observability/otel.d.ts.map +1 -0
  135. package/dist/observability/otel.js +142 -0
  136. package/dist/observability/otel.js.map +1 -0
  137. package/dist/plugins/plugin-dependencies.d.ts +4 -1
  138. package/dist/plugins/plugin-dependencies.d.ts.map +1 -1
  139. package/dist/plugins/plugin-dependencies.js +18 -8
  140. package/dist/plugins/plugin-dependencies.js.map +1 -1
  141. package/dist/plugins/plugin-install.d.ts +6 -0
  142. package/dist/plugins/plugin-install.d.ts.map +1 -1
  143. package/dist/plugins/plugin-install.js +31 -7
  144. package/dist/plugins/plugin-install.js.map +1 -1
  145. package/dist/providers/codex-constants.d.ts +1 -0
  146. package/dist/providers/codex-constants.d.ts.map +1 -1
  147. package/dist/providers/codex-constants.js +6 -0
  148. package/dist/providers/codex-constants.js.map +1 -1
  149. package/dist/providers/codex-discovery.d.ts.map +1 -1
  150. package/dist/providers/codex-discovery.js +17 -5
  151. package/dist/providers/codex-discovery.js.map +1 -1
  152. package/dist/providers/factory.d.ts.map +1 -1
  153. package/dist/providers/factory.js +11 -1
  154. package/dist/providers/factory.js.map +1 -1
  155. package/dist/providers/huggingface-discovery.d.ts.map +1 -1
  156. package/dist/providers/huggingface-discovery.js +5 -2
  157. package/dist/providers/huggingface-discovery.js.map +1 -1
  158. package/dist/providers/huggingface-utils.d.ts +0 -3
  159. package/dist/providers/huggingface-utils.d.ts.map +1 -1
  160. package/dist/providers/huggingface-utils.js +0 -9
  161. package/dist/providers/huggingface-utils.js.map +1 -1
  162. package/dist/providers/huggingface.d.ts.map +1 -1
  163. package/dist/providers/huggingface.js +5 -2
  164. package/dist/providers/huggingface.js.map +1 -1
  165. package/dist/providers/mistral-discovery.d.ts.map +1 -1
  166. package/dist/providers/mistral-discovery.js +5 -2
  167. package/dist/providers/mistral-discovery.js.map +1 -1
  168. package/dist/providers/mistral-utils.d.ts +0 -3
  169. package/dist/providers/mistral-utils.d.ts.map +1 -1
  170. package/dist/providers/mistral-utils.js +0 -5
  171. package/dist/providers/mistral-utils.js.map +1 -1
  172. package/dist/providers/mistral.d.ts.map +1 -1
  173. package/dist/providers/mistral.js +3 -2
  174. package/dist/providers/mistral.js.map +1 -1
  175. package/dist/providers/model-catalog.d.ts +1 -5
  176. package/dist/providers/model-catalog.d.ts.map +1 -1
  177. package/dist/providers/model-catalog.js +80 -20
  178. package/dist/providers/model-catalog.js.map +1 -1
  179. package/dist/providers/model-names.d.ts +1 -0
  180. package/dist/providers/model-names.d.ts.map +1 -1
  181. package/dist/providers/model-names.js +5 -0
  182. package/dist/providers/model-names.js.map +1 -1
  183. package/dist/providers/openai-compat-discovery.d.ts +20 -0
  184. package/dist/providers/openai-compat-discovery.d.ts.map +1 -0
  185. package/dist/providers/openai-compat-discovery.js +183 -0
  186. package/dist/providers/openai-compat-discovery.js.map +1 -0
  187. package/dist/providers/openai-compat-remote.d.ts +27 -0
  188. package/dist/providers/openai-compat-remote.d.ts.map +1 -0
  189. package/dist/providers/openai-compat-remote.js +171 -0
  190. package/dist/providers/openai-compat-remote.js.map +1 -0
  191. package/dist/providers/openrouter-discovery.d.ts.map +1 -1
  192. package/dist/providers/openrouter-discovery.js +5 -2
  193. package/dist/providers/openrouter-discovery.js.map +1 -1
  194. package/dist/providers/openrouter-utils.d.ts +0 -3
  195. package/dist/providers/openrouter-utils.d.ts.map +1 -1
  196. package/dist/providers/openrouter-utils.js +0 -5
  197. package/dist/providers/openrouter-utils.js.map +1 -1
  198. package/dist/providers/openrouter.js +3 -2
  199. package/dist/providers/openrouter.js.map +1 -1
  200. package/dist/providers/provider-aliases.d.ts +4 -0
  201. package/dist/providers/provider-aliases.d.ts.map +1 -0
  202. package/dist/providers/provider-aliases.js +25 -0
  203. package/dist/providers/provider-aliases.js.map +1 -0
  204. package/dist/providers/provider-ids.d.ts +3 -3
  205. package/dist/providers/provider-ids.d.ts.map +1 -1
  206. package/dist/providers/provider-ids.js +18 -0
  207. package/dist/providers/provider-ids.js.map +1 -1
  208. package/dist/providers/task-routing.d.ts.map +1 -1
  209. package/dist/providers/task-routing.js +13 -16
  210. package/dist/providers/task-routing.js.map +1 -1
  211. package/dist/scheduler/scheduler.d.ts.map +1 -1
  212. package/dist/scheduler/scheduler.js +0 -2
  213. package/dist/scheduler/scheduler.js.map +1 -1
  214. package/dist/security/runtime-secrets.d.ts +1 -1
  215. package/dist/security/runtime-secrets.d.ts.map +1 -1
  216. package/dist/security/runtime-secrets.js +8 -0
  217. package/dist/security/runtime-secrets.js.map +1 -1
  218. package/dist/skills/skills.d.ts.map +1 -1
  219. package/dist/skills/skills.js +4 -0
  220. package/dist/skills/skills.js.map +1 -1
  221. package/dist/tui-slash-command.d.ts.map +1 -1
  222. package/dist/tui-slash-command.js +2 -0
  223. package/dist/tui-slash-command.js.map +1 -1
  224. package/dist/tui.d.ts.map +1 -1
  225. package/dist/tui.js +19 -13
  226. package/dist/tui.js.map +1 -1
  227. package/dist/update.d.ts.map +1 -1
  228. package/dist/update.js +10 -2
  229. package/dist/update.js.map +1 -1
  230. package/dist/utils/text-format.d.ts +1 -0
  231. package/dist/utils/text-format.d.ts.map +1 -1
  232. package/dist/utils/text-format.js +3 -0
  233. package/dist/utils/text-format.js.map +1 -1
  234. package/dist/workspace.d.ts +25 -0
  235. package/dist/workspace.d.ts.map +1 -1
  236. package/dist/workspace.js +73 -0
  237. package/dist/workspace.js.map +1 -1
  238. package/docs/chat.html +90 -38
  239. package/docs/content/README.md +14 -12
  240. package/docs/content/agents.md +4 -0
  241. package/docs/content/developer-guide/runtime.md +28 -4
  242. package/docs/content/extensibility/README.md +4 -2
  243. package/docs/content/extensibility/byterover-memory-plugin.md +390 -0
  244. package/docs/content/extensibility/gbrain-plugin.md +89 -3
  245. package/docs/content/extensibility/honcho-memory-plugin.md +88 -2
  246. package/docs/content/extensibility/mem0-memory-plugin.md +180 -0
  247. package/docs/content/extensibility/memory-plugins.md +142 -0
  248. package/docs/content/extensibility/mempalace-memory-plugin.md +113 -2
  249. package/docs/content/extensibility/plugins.md +7 -0
  250. package/docs/content/extensibility/qmd-memory-plugin.md +98 -4
  251. package/docs/content/getting-started/authentication.md +38 -6
  252. package/docs/content/getting-started/quickstart.md +4 -0
  253. package/docs/content/guides/bundled-skills.md +4 -2
  254. package/docs/content/guides/office-dependencies.md +1 -1
  255. package/docs/content/guides/remote-access.md +1 -1
  256. package/docs/content/guides/skills/README.md +45 -0
  257. package/docs/content/guides/skills/apple.md +112 -0
  258. package/docs/content/guides/skills/communication.md +82 -0
  259. package/docs/content/guides/skills/development.md +175 -0
  260. package/docs/content/guides/skills/integrations.md +249 -0
  261. package/docs/content/guides/skills/memory-knowledge.md +189 -0
  262. package/docs/content/guides/skills/office.md +248 -0
  263. package/docs/content/guides/skills/productivity.md +116 -0
  264. package/docs/content/guides/skills/publishing.md +136 -0
  265. package/docs/content/guides/twilio-voice.md +1 -1
  266. package/docs/content/guides/voice-tts.md +1 -1
  267. package/docs/content/reference/commands.md +27 -2
  268. package/docs/content/reference/configuration.md +7 -1
  269. package/docs/content/reference/faq.md +5 -3
  270. package/docs/content/reference/model-selection.md +50 -2
  271. package/docs/development/agents.md +2 -0
  272. package/docs/development/extensibility/README.md +2 -2
  273. package/docs/development/extensibility/byterover-memory-plugin.md +390 -0
  274. package/docs/development/extensibility/gbrain-plugin.md +89 -3
  275. package/docs/development/extensibility/honcho-memory-plugin.md +88 -2
  276. package/docs/development/extensibility/mem0-memory-plugin.md +180 -0
  277. package/docs/development/extensibility/memory-plugins.md +128 -0
  278. package/docs/development/extensibility/mempalace-memory-plugin.md +133 -2
  279. package/docs/development/extensibility/plugins.md +7 -0
  280. package/docs/development/extensibility/qmd-memory-plugin.md +117 -4
  281. package/docs/development/getting-started/authentication.md +38 -6
  282. package/docs/development/getting-started/quickstart.md +4 -0
  283. package/docs/development/guides/bundled-skills.md +4 -2
  284. package/docs/development/guides/office-dependencies.md +1 -1
  285. package/docs/development/guides/remote-access.md +1 -1
  286. package/docs/development/guides/skills/README.md +45 -0
  287. package/docs/development/guides/skills/apple.md +112 -0
  288. package/docs/development/guides/skills/communication.md +82 -0
  289. package/docs/development/guides/skills/development.md +175 -0
  290. package/docs/development/guides/skills/integrations.md +249 -0
  291. package/docs/development/guides/skills/memory-knowledge.md +189 -0
  292. package/docs/development/guides/skills/office.md +248 -0
  293. package/docs/development/guides/skills/productivity.md +116 -0
  294. package/docs/development/guides/skills/publishing.md +136 -0
  295. package/docs/development/guides/twilio-voice.md +1 -1
  296. package/docs/development/guides/voice-tts.md +1 -1
  297. package/docs/development/internals/runtime.md +9 -4
  298. package/docs/development/reference/commands.md +18 -2
  299. package/docs/development/reference/configuration.md +3 -1
  300. package/docs/development/reference/faq.md +5 -3
  301. package/docs/development/reference/model-selection.md +41 -2
  302. package/docs/static/docs.css +84 -0
  303. package/docs/static/docs.js +243 -53
  304. package/package.json +7 -1
  305. package/skills/pdf/SKILL.md +8 -56
  306. package/console/dist/assets/chat-CKhyYUgY.css +0 -1
  307. package/console/dist/assets/index-BFbE8-iL.css +0 -1
  308. package/skills/salesforce/scripts/__pycache__/salesforce_query.cpython-314.pyc +0 -0
package/AGENTS.md CHANGED
@@ -91,6 +91,26 @@ User message → Gateway (HTTP/Discord) → ContainerInput (JSON)
91
91
  | Approval rule | `.hybridclaw/policy.yaml` | §7.4 |
92
92
  | Template | `templates/<name>.md` + `src/workspace.ts` | §7.5 |
93
93
 
94
+ ### OpenTelemetry (Distributed Tracing)
95
+
96
+ The gateway supports optional OpenTelemetry instrumentation for distributed
97
+ tracing in cloud deployments. OTel is OFF by default (zero overhead).
98
+
99
+ | Env Var | Purpose |
100
+ |----------------------------------|--------------------------------------------------------------|
101
+ | `OTEL_ENABLED=true` | Enable OTel SDK initialization |
102
+ | `OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP collector endpoint (also enables OTel if set) |
103
+ | `OTEL_EXPORTER_OTLP_PROTOCOL` | `grpc` (default) or `http/protobuf` |
104
+ | `OTEL_SERVICE_NAME` | Service name reported in spans (default: `hybridclaw-gateway`)|
105
+
106
+ When enabled, spans are emitted for: gateway message handling, agent runs,
107
+ host/container execution, and skill loading. Trace context (traceId, spanId)
108
+ is injected into structured log lines for correlation.
109
+
110
+ Implementation: `src/observability/otel.ts`. The SDK packages
111
+ (`@opentelemetry/sdk-node`, exporters) are dynamically imported only when
112
+ OTel is active.
113
+
94
114
  ---
95
115
 
96
116
  ## 3) Engineering Principles
package/CHANGELOG.md CHANGED
@@ -1,5 +1,154 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ ## [0.12.8](https://github.com/HybridAIOne/hybridclaw/tree/v0.12.8)
6
+
7
+ ### Changed
8
+
9
+ - **`hybridclaw update` can restart the gateway automatically**: After a
10
+ successful global npm upgrade, HybridClaw now attempts to restart a running
11
+ local gateway with its recorded launch command and flags. If no running
12
+ gateway is found, or the recorded process cannot be replayed or signalled,
13
+ the CLI falls back to manual `hybridclaw gateway restart` instructions.
14
+ - **Container status is more informative**: `hybridclaw gateway status` and
15
+ `!claw status` now include the configured container image name plus the
16
+ resolved image version and short image id when sandbox mode is `container`.
17
+ - **Release-built agent images carry version metadata**: `npm run
18
+ build:container` now passes the container package version into the image's
19
+ OCI labels so runtime status output can report the actual image version when
20
+ available.
21
+ - **Bundled deliverable guidance now prefers workspace-relative outputs**:
22
+ Built-in prompt hooks and the PDF skill now reserve `/tmp` for scratch files
23
+ and direct final PDFs, reports, and similar user-visible outputs into the
24
+ workspace so they persist and can be attached.
25
+
26
+ ### Fixed
27
+
28
+ - **Source-checkout Docker workspaces bootstrap `node_modules` correctly**:
29
+ Container launches now pre-stage or repair the workspace `node_modules`
30
+ symlink to `/app/node_modules`, so bundled JS skills can import repo-managed
31
+ dependencies reliably inside Docker even when a stale host symlink already
32
+ exists.
33
+ - **Default agent image release and pull flow no longer depends on GHCR**:
34
+ The packaged runtime now pulls the default `hybridclaw-agent` image from
35
+ Docker Hub only, and the release workflow stops publishing the private GHCR
36
+ agent image or advertising a dead fallback path.
37
+ - **Ordered-list rendering is restored across chat and docs surfaces**: Web
38
+ chat, docs pages, and console markdown rendering now preserve ordered-list
39
+ numbering across intervening bullets, support nested list indentation, and
40
+ handle LLM-emitted `**1. Heading**` list items correctly.
41
+
42
+ ## [0.12.7](https://github.com/HybridAIOne/hybridclaw/tree/v0.12.7)
43
+
44
+ ### Added
45
+
46
+ - **Nine new external API providers**: Google Gemini (`gemini/`), DeepSeek
47
+ (`deepseek/`), xAI / Grok (`xai/`), Z.AI / GLM (`zai/`), Kimi / Moonshot
48
+ (`kimi/`), MiniMax (`minimax/`), DashScope / Qwen (`dashscope/`), Xiaomi
49
+ MiMo (`xiaomi/`), and Kilo Code (`kilo/`). Each provider supports
50
+ `auth login`, `auth status`, and `auth logout` with `--api-key`,
51
+ `--base-url`, `--model`, and `--no-default` flags, plus full runtime config
52
+ enablement and model-prefix routing.
53
+ - **Runtime model discovery for OpenAI-compat remote providers**: The nine
54
+ providers above now auto-discover their current model lineups at runtime
55
+ via `GET <baseUrl>/models` and surface them through `/model list <provider>`
56
+ alongside any user-pinned entries in `<provider>.models`. Discovered models
57
+ are cached for one hour, deduplicated with pinned entries, and silently
58
+ fall back to the configured list if the provider's `/v1/models` endpoint is
59
+ unreachable, absent (404), or otherwise errors.
60
+ - **ByteRover memory plugin**: New bundled `byterover-memory` external memory
61
+ provider that injects prompt-time recall through `brv query`, exposes
62
+ `brv_query` / `brv_curate` / `brv_status` model tools, and curates
63
+ completed turns, native memory writes, and pre-compaction summaries into
64
+ ByteRover's Context Tree. Works offline by default with optional cloud sync.
65
+ - **Mem0 memory plugin**: New bundled `mem0-memory` external memory provider
66
+ that layers Mem0 profile and search recall on top of built-in memory,
67
+ exposes `mem0_profile` / `mem0_search` / `mem0_conclude` tools and a local
68
+ `/mem0 ...` command surface, mirrors completed turns and explicit native
69
+ memory writes into Mem0, prefetches profile context on `session_start`, and
70
+ curates compaction snapshots before older turns are archived.
71
+ - **Skill availability controls**: Added `hybridclaw skill enable <name>
72
+ [--channel <kind>]`, `hybridclaw skill disable <name> [--channel <kind>]`,
73
+ interactive TUI `/skill config` toggles, and matching gateway slash-command
74
+ support for enabling or disabling skills globally or per channel.
75
+ - **OpenTelemetry distributed tracing**: The gateway can now emit spans for
76
+ message handling, agent runs, host/container execution, and skill loading to
77
+ OTLP collectors when `OTEL_ENABLED=true` or
78
+ `OTEL_EXPORTER_OTLP_ENDPOINT` is set, with `traceId` / `spanId` correlation
79
+ injected into structured logs.
80
+ - **Memory plugin and skills docs expansion**: Added a memory-plugin
81
+ comparison guide, per-category bundled-skills guides, and richer browser
82
+ docs prompt blocks with copy buttons and styled callouts.
83
+
84
+ ### Changed
85
+
86
+ - **Model and provider surfaces now share one registry**: `/model list`,
87
+ `/model info`, provider status output, and `/admin/models` now use the same
88
+ data-driven provider catalog, show model counts consistently, and sort
89
+ enabled or reachable providers first in the admin console.
90
+ - **Fresh installs default HybridAI to `gpt-5.4-mini`**: New runtime homes now
91
+ seed `hybridai.defaultModel` from the shared `DEFAULT_HYBRIDAI_MODEL`
92
+ constant so onboarding, migration, and fresh-install defaults stay aligned.
93
+ - **Kilo Code base URL migrated to `https://api.kilo.ai/api/gateway`**: The
94
+ retired `api.kilocode.ai` host now serves a marketing site, so the default
95
+ Kilo Code base URL has been updated across `config.ts`, the runtime config
96
+ defaults, the `auth login kilo` normalizer (suffix `/api/gateway`), and
97
+ `config.example.json`. Persisted runtime configs still pointing at
98
+ `https://api.kilocode.ai/v1` are silently migrated to the new URL on load
99
+ so existing installations self-heal.
100
+ - **Codex model catalog handling is more resilient**: HybridClaw now pins the
101
+ `client_version` needed for the full upstream Codex catalog and ships static
102
+ supplemental entries for UI-known Codex variants when the upstream list is
103
+ temporarily incomplete.
104
+ - **Renamed `HybridAIRequestError` → `ProviderRequestError`**: The error class
105
+ wraps failures from every OpenAI-compat provider (HybridAI, OpenRouter,
106
+ Mistral, Kilo Code, local Ollama, etc.), so the HybridAI-specific name was
107
+ misleading. The error-message prefix now reads `Provider API error <status>`
108
+ instead of `HybridAI API error <status>`. `HybridAIRequestError` is kept as
109
+ a deprecated alias for backward compatibility; new code should import
110
+ `ProviderRequestError` directly.
111
+ - **Simpler `formatModelForDisplay` rule**: Models that already carry a
112
+ provider prefix (`kilo/...`, `gemini/...`, etc.) no longer incorrectly pick
113
+ up a leading `hybridai/`. The function now treats any slash-containing
114
+ non-`hybridai/` model as already-namespaced, removing the fragile
115
+ `NON_HYBRID_PROVIDER_PREFIXES` whitelist dependency for this path.
116
+ - **TUI reply metadata is clearer**: The usage footer now shows the active
117
+ skill name alongside tools and plugins when a response was driven by a
118
+ skill.
119
+ - **Plugin dependency checks are quieter**: `plugin install` and
120
+ `plugin check` now treat global binaries as satisfying declared
121
+ dependencies, skipping unnecessary npm or pip installs and approval prompts
122
+ when the required executable is already on `PATH`.
123
+ - **Memory plugin docs standardized**: All six memory-plugin doc pages now follow
124
+ the same structure: Prerequisites, HybridClaw Setup, Config, Commands,
125
+ Example Prompts & Use Cases, Tips & Tricks, and Troubleshooting. Added
126
+ external links, local vs cloud options, and researched tips for each.
127
+ - **Browser docs prompt UX expanded**: The docs shell now groups tips and
128
+ multi-step prompts into styled callouts, adds copy buttons for try-it
129
+ blocks, and publishes bundled-skill pages grouped by category.
130
+
131
+ ### Fixed
132
+
133
+ - **Bundled ESM skill scripts resolve repo-managed dependencies in the
134
+ sandbox**: Source-checkout container runs now symlink the workspace
135
+ `node_modules` directory into the agent workspace so bundled skill scripts
136
+ can import repo dependencies consistently inside Docker.
137
+ - **`/auth status` suggestions list every supported provider**: Slash-command
138
+ provider completion and status suggestions now include the full provider set
139
+ instead of omitting newer backends.
140
+ - **Mem0 sync no longer sends unsupported `app_id` fields**: Stored-turn
141
+ mirroring and later recall now work against Mem0's accepted write shape.
142
+ - **Dream consolidation works for cloud sessions**: `/dream` memory
143
+ consolidation now runs correctly when the session is backed by cloud state.
144
+ - **Fresh-install model migration tracks the shared default constant**:
145
+ Migration logic now respects `DEFAULT_HYBRIDAI_MODEL` instead of relying on
146
+ a stale sentinel when deciding whether a runtime home is still on the
147
+ original default model.
148
+ - **Browser docs renderer edge cases**: Separate callout blocks no longer
149
+ merge together, copy actions strip leading numbering more reliably, and the
150
+ docs copy icon renders and positions consistently across browsers.
151
+
3
152
  ## [0.12.6](https://github.com/HybridAIOne/hybridclaw/tree/v0.12.6)
4
153
 
5
154
  ### Added
@@ -129,6 +278,10 @@
129
278
  - **Immediate one-shot scheduler jobs**: Added config-backed `one_shot` jobs
130
279
  that run immediately, retry up to `maxRetries`, preserve review state, and
131
280
  surface richer delivery output across the gateway and admin scheduler UI.
281
+ - **Mem0 memory plugin**: Added a bundled `mem0-memory` plugin so local
282
+ HybridClaw installs can mirror turns into Mem0 cloud memory, inject
283
+ prompt-time Mem0 recall, expose `mem0_*` tools, and mirror explicit native
284
+ memory writes back into Mem0.
132
285
 
133
286
  ### Changed
134
287
 
package/README.md CHANGED
@@ -100,6 +100,12 @@ Once the gateway is running, open HybridClaw locally:
100
100
 
101
101
  ## Operator workflows
102
102
 
103
+ - `hybridclaw gateway status` reports sandbox/runtime details, and in
104
+ container mode it includes the configured image name plus the resolved
105
+ version and short image id.
106
+ - `hybridclaw update --yes` upgrades a global npm install and auto-restarts a
107
+ running local gateway with its original launch parameters when possible,
108
+ falling back to `hybridclaw gateway restart` if not.
103
109
  - `/admin/agents` edits allowlisted bootstrap markdown files such as
104
110
  `AGENTS.md`, keeps saved revisions, and restores earlier versions from the
105
111
  browser.
@@ -121,6 +127,23 @@ Once the gateway is running, open HybridClaw locally:
121
127
  honor server `Retry-After` backoff, and WhatsApp startup avoids intermittent
122
128
  init-query bad-request failures.
123
129
 
130
+ ## Models, Skills, and Memory
131
+
132
+ - `hybridclaw auth login` and `/model list` cover HybridAI, Codex, OpenRouter,
133
+ Mistral, Hugging Face, Gemini, DeepSeek, xAI, Z.AI, Kimi, MiniMax,
134
+ DashScope, Xiaomi, Kilo Code, and local backends such as Ollama, LM Studio,
135
+ llama.cpp, and vLLM. Remote OpenAI-compatible providers can merge
136
+ runtime-discovered model catalogs with operator-pinned lists.
137
+ - Skills can be enabled or disabled globally or per channel from
138
+ `hybridclaw skill enable|disable`, TUI `/skill config`, or the admin
139
+ `Skills` page.
140
+ - Built-in memory can stay standalone or layer with ByteRover, Mem0, Honcho,
141
+ MemPalace, QMD, and GBrain plugins depending on whether you want
142
+ local-first recall, hosted memory, or domain-specific retrieval.
143
+ - Optional OpenTelemetry tracing exports gateway and agent spans to OTLP
144
+ backends and annotates structured logs with trace ids for cross-system
145
+ correlation.
146
+
124
147
  ## How HybridClaw compares
125
148
 
126
149
  | Capability | HybridClaw | OpenClaw | Hermes Agent |
@@ -211,7 +234,10 @@ Browse the full manual at
211
234
  [Extensibility](https://www.hybridclaw.io/docs/extensibility),
212
235
  [Bundled Skills](https://www.hybridclaw.io/docs/guides/bundled-skills),
213
236
  [Plugin System](https://www.hybridclaw.io/docs/extensibility/plugins),
237
+ [Memory Plugins](https://www.hybridclaw.io/docs/extensibility/memory-plugins),
238
+ [ByteRover Memory Plugin](https://www.hybridclaw.io/docs/extensibility/byterover-memory-plugin),
214
239
  [GBrain Plugin](https://www.hybridclaw.io/docs/extensibility/gbrain-plugin),
240
+ [Mem0 Memory Plugin](https://www.hybridclaw.io/docs/extensibility/mem0-memory-plugin),
215
241
  [Honcho Memory Plugin](https://www.hybridclaw.io/docs/extensibility/honcho-memory-plugin), and
216
242
  [MemPalace Memory Plugin](https://www.hybridclaw.io/docs/extensibility/mempalace-memory-plugin)
217
243
  - Configuration:
@@ -246,6 +246,51 @@
246
246
  "baseUrl": "https://router.huggingface.co/v1",
247
247
  "models": ["huggingface/meta-llama/Llama-3.1-8B-Instruct"]
248
248
  },
249
+ "gemini": {
250
+ "enabled": false,
251
+ "baseUrl": "https://generativelanguage.googleapis.com/v1beta/openai",
252
+ "models": ["gemini/gemini-2.5-pro"]
253
+ },
254
+ "deepseek": {
255
+ "enabled": false,
256
+ "baseUrl": "https://api.deepseek.com/v1",
257
+ "models": ["deepseek/deepseek-chat"]
258
+ },
259
+ "xai": {
260
+ "enabled": false,
261
+ "baseUrl": "https://api.x.ai/v1",
262
+ "models": ["xai/grok-3"]
263
+ },
264
+ "zai": {
265
+ "enabled": false,
266
+ "baseUrl": "https://api.z.ai/api/paas/v4",
267
+ "models": ["zai/glm-5.1"]
268
+ },
269
+ "kimi": {
270
+ "enabled": false,
271
+ "baseUrl": "https://api.moonshot.ai/v1",
272
+ "models": ["kimi/kimi-k2.5"]
273
+ },
274
+ "minimax": {
275
+ "enabled": false,
276
+ "baseUrl": "https://api.minimax.io/v1",
277
+ "models": ["minimax/MiniMax-M2"]
278
+ },
279
+ "dashscope": {
280
+ "enabled": false,
281
+ "baseUrl": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
282
+ "models": ["dashscope/qwen3-coder-plus"]
283
+ },
284
+ "xiaomi": {
285
+ "enabled": false,
286
+ "baseUrl": "https://api.xiaomimimo.com/v1",
287
+ "models": ["xiaomi/MiMo-7B-RL"]
288
+ },
289
+ "kilo": {
290
+ "enabled": false,
291
+ "baseUrl": "https://api.kilo.ai/api/gateway",
292
+ "models": ["kilo/anthropic/claude-sonnet-4.6"]
293
+ },
249
294
  "local": {
250
295
  "backends": {
251
296
  "ollama": {
@@ -0,0 +1 @@
1
+ ._chatPage_ezgbk_1{grid-template-columns:260px 1fr;height:100%;min-height:0;display:grid;overflow:hidden}._sidebar_ezgbk_9{background:var(--sidebar);border-right:1px solid var(--line);flex-direction:column;gap:8px;min-height:0;padding:16px 12px;display:flex;overflow-y:auto}._sidebarHeader_ezgbk_20{align-items:center;gap:10px;padding:4px 6px 12px;display:flex}._sidebarLogo_ezgbk_27{flex-shrink:0;width:28px;height:28px}._sidebarBrand_ezgbk_33{color:var(--text);letter-spacing:-.02em;font-size:1rem;font-weight:700}._newChatButton_ezgbk_40{border-radius:var(--radius-sm);border:1px solid var(--line-strong);background:var(--panel-bg);width:100%;color:var(--text);cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:9px 12px;font-size:.875rem;font-weight:500;transition:background .15s;display:flex}._newChatButton_ezgbk_40:hover{background:var(--accent-soft)}._sidebarLabel_ezgbk_61{text-transform:uppercase;letter-spacing:.08em;color:var(--muted-foreground);margin:12px 0 4px;padding:0 6px;font-size:.7rem;font-weight:700}._sessionList_ezgbk_71{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}._sessionItem_ezgbk_80{appearance:none;border-radius:var(--radius-sm);cursor:pointer;text-align:left;width:100%;font:inherit;color:inherit;background:0 0;border:0;flex-direction:column;gap:2px;padding:8px 10px;transition:background .12s;display:flex;overflow:hidden}._sessionItem_ezgbk_80:hover{background:var(--panel-bg)}._sessionItemActive_ezgbk_102{background:var(--panel-bg);box-shadow:var(--shadow-raised)}._sessionTitle_ezgbk_107{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-size:.875rem;font-weight:500;overflow:hidden}._sessionTime_ezgbk_116{color:var(--muted-foreground);font-size:.72rem}._chatMain_ezgbk_121{flex-direction:column;min-height:0;display:flex;position:relative;overflow:hidden}._messageArea_ezgbk_129{scroll-behavior:smooth;flex:auto;min-height:0;padding:24px 24px 12px;overflow-y:auto}._messageList_ezgbk_137{flex-direction:column;gap:12px;width:100%;max-width:860px;margin:0 auto;display:flex}._emptyState_ezgbk_146{flex-direction:column;flex:auto;justify-content:center;align-items:center;min-height:0;padding:48px 24px;display:flex}._greeting_ezgbk_156{color:var(--muted-foreground);text-align:center;letter-spacing:-.02em;font-size:clamp(1.6rem,3vw,2.2rem);font-weight:700;line-height:1.3}._messageBlock_ezgbk_165{flex-direction:column;gap:6px;display:flex}._messageBlockUser_ezgbk_171{align-items:flex-end}._messageBlockAssistant_ezgbk_175,._messageBlockSystem_ezgbk_176{align-items:flex-start}._agentLabel_ezgbk_180{color:var(--muted-foreground);align-items:center;gap:6px;padding:0 4px;font-size:.75rem;font-weight:600;display:flex}._agentAvatar_ezgbk_190{object-fit:cover;border-radius:999px;width:20px;height:20px}._agentInitial_ezgbk_197{background:var(--primary);width:20px;height:20px;color:var(--primary-foreground);border-radius:999px;justify-content:center;align-items:center;font-size:.65rem;font-weight:700;display:flex}._bubble_ezgbk_210{word-wrap:break-word;overflow-wrap:break-word;border-radius:14px;max-width:85%;padding:10px 14px;font-size:.92rem;line-height:1.55}._bubbleUser_ezgbk_220{background:linear-gradient(135deg, var(--primary), var(--ring));color:var(--primary-foreground);border-bottom-right-radius:4px}._bubbleAssistant_ezgbk_226{background:var(--card);color:var(--card-foreground);border:1px solid var(--line);box-shadow:var(--shadow-card);border-bottom-left-radius:4px}._bubbleSystem_ezgbk_234{background:var(--accent-soft);color:var(--accent-foreground);text-align:center;align-self:center;max-width:90%;font-size:.84rem}._markdownContent_ezgbk_243{line-height:1.6}._markdownContent_ezgbk_243 h1,._markdownContent_ezgbk_243 h2,._markdownContent_ezgbk_243 h3{color:var(--foreground);letter-spacing:-.02em;margin:.6em 0 .3em;font-weight:600}._markdownContent_ezgbk_243 h1{font-size:1.25rem}._markdownContent_ezgbk_243 h2{font-size:1.12rem}._markdownContent_ezgbk_243 h3{font-size:1rem}._markdownContent_ezgbk_243 p{margin:.4em 0}._markdownContent_ezgbk_243 ul,._markdownContent_ezgbk_243 ol{margin:.4em 0;padding-left:20px}._markdownContent_ezgbk_243 li{margin:2px 0}._markdownContent_ezgbk_243 blockquote{border-left:3px solid var(--line-strong);color:var(--muted-foreground);margin:.5em 0;padding:4px 12px}._markdownContent_ezgbk_243 code{background:var(--muted);color:var(--foreground);border-radius:4px;padding:2px 5px;font-size:.86em}._markdownContent_ezgbk_243 pre{background:var(--terminal);color:var(--terminal-foreground);border-radius:var(--radius-sm);margin:.5em 0;padding:12px 14px;font-size:.84rem;line-height:1.5;overflow-x:auto}._markdownContent_ezgbk_243 pre code{color:inherit;font-size:inherit;background:0 0;border-radius:0;padding:0}._markdownContent_ezgbk_243 hr{border:none;border-top:1px solid var(--line);margin:.8em 0}._markdownContent_ezgbk_243 a{color:var(--primary);text-decoration:none}._markdownContent_ezgbk_243 a:hover{text-decoration:underline}._markdownContent_ezgbk_243 table{border-collapse:collapse;width:100%;margin:.5em 0;font-size:.86rem}._markdownContent_ezgbk_243 th,._markdownContent_ezgbk_243 td{border:1px solid var(--line);text-align:left;padding:6px 10px}._markdownContent_ezgbk_243 th{background:var(--muted);font-weight:600}._markdownContent_ezgbk_243 tbody tr:nth-child(2n){background:var(--muted)}._messageActions_ezgbk_354{opacity:0;gap:4px;padding:0 4px;transition:opacity .15s;display:flex}._messageBlock_ezgbk_165:hover ._messageActions_ezgbk_354{opacity:1}._actionButton_ezgbk_366{width:28px;height:28px;color:var(--muted-foreground);cursor:pointer;background:0 0;border:none;border-radius:999px;justify-content:center;align-items:center;font-size:.82rem;transition:background .12s,color .12s;display:flex}._actionButton_ezgbk_366:hover{background:var(--muted);color:var(--text)}._actionButtonSuccess_ezgbk_388{color:var(--success)}._branchSwitcher_ezgbk_392{color:var(--muted-foreground);align-items:center;gap:4px;padding:0 4px;font-size:.75rem;display:inline-flex}._branchButton_ezgbk_401{width:22px;height:22px;color:var(--muted-foreground);cursor:pointer;background:0 0;border:none;border-radius:999px;justify-content:center;align-items:center;font-size:.8rem;display:flex}._branchButton_ezgbk_401:hover{background:var(--muted);color:var(--text)}._branchButton_ezgbk_401:disabled{opacity:.4;cursor:default}._approvalActions_ezgbk_425{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}._approvalAllow_ezgbk_432{border-radius:var(--radius-sm);border:1px solid var(--success-border);background:var(--success-soft);color:var(--success);cursor:pointer;padding:6px 12px;font-size:.82rem;font-weight:500}._approvalAllow_ezgbk_432:hover{opacity:.85}._approvalDeny_ezgbk_447{border-radius:var(--radius-sm);border:1px solid var(--danger-border);background:var(--danger-soft);color:var(--danger);cursor:pointer;padding:6px 12px;font-size:.82rem;font-weight:500}._approvalDeny_ezgbk_447:hover{opacity:.85}._approvalAllow_ezgbk_432:disabled,._approvalDeny_ezgbk_447:disabled{opacity:.5;cursor:default}._artifactCard_ezgbk_468{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--muted);align-items:center;gap:10px;margin-top:8px;padding:10px 14px;display:flex}._artifactFilename_ezgbk_479{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-size:.84rem;font-weight:500;overflow:hidden}._artifactBadge_ezgbk_488{background:var(--accent-soft);color:var(--accent-foreground);border-radius:4px;flex-shrink:0;padding:2px 6px;font-size:.7rem;font-weight:500}._artifactDownload_ezgbk_498{color:var(--primary);cursor:pointer;background:0 0;border:none;flex-shrink:0;margin-left:auto;padding:0;font-size:.82rem;text-decoration:none}._artifactDownload_ezgbk_498:hover{text-decoration:underline}._artifactDownload_ezgbk_498:disabled{opacity:.6;cursor:default;text-decoration:none}._artifactPreview_ezgbk_520{border-radius:var(--radius-sm);max-width:100%;margin-top:8px}._artifactPreview_ezgbk_520 img{border-radius:var(--radius-sm);max-width:100%}._thinking_ezgbk_531{align-items:center;gap:4px;padding:10px 14px;display:flex}._thinkingDot_ezgbk_538{background:var(--muted-foreground);border-radius:999px;width:7px;height:7px;animation:1.2s ease-in-out infinite _thinkingBounce_ezgbk_1}._thinkingDot_ezgbk_538:nth-child(2){animation-delay:.15s}._thinkingDot_ezgbk_538:nth-child(3){animation-delay:.3s}@keyframes _thinkingBounce_ezgbk_1{0%,80%,to{opacity:.4;transform:scale(.6)}40%{opacity:1;transform:scale(1)}}._composerWrapper_ezgbk_567{flex-shrink:0;padding:0 24px 20px}._composer_ezgbk_567{border:1px solid var(--line-strong);background:var(--panel-bg);width:100%;max-width:860px;box-shadow:var(--shadow-raised);border-radius:24px;flex-direction:column;margin:0 auto;display:flex;overflow:hidden}._pendingMediaRow_ezgbk_585{flex-wrap:wrap;gap:6px;padding:10px 14px 0;display:flex}._mediaChip_ezgbk_592{background:var(--muted);color:var(--text);border-radius:6px;align-items:center;gap:4px;max-width:180px;padding:4px 8px;font-size:.78rem;display:inline-flex}._mediaChipName_ezgbk_604{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}._mediaChipRemove_ezgbk_610{width:16px;height:16px;color:var(--muted-foreground);cursor:pointer;background:0 0;border:none;border-radius:999px;flex-shrink:0;justify-content:center;align-items:center;font-size:.7rem;display:flex}._mediaChipRemove_ezgbk_610:hover{color:var(--danger)}._composerRow_ezgbk_629{align-items:flex-end;gap:8px;padding:10px 14px;display:flex}._composerInput_ezgbk_636{resize:none;min-height:24px;max-height:180px;color:var(--text);background:0 0;border:none;outline:none;flex:auto;padding:2px 0;font-size:.92rem;line-height:1.5}._composerInput_ezgbk_636::placeholder{color:var(--muted-foreground)}._attachButton_ezgbk_654,._sendButton_ezgbk_655{cursor:pointer;border:none;border-radius:999px;flex-shrink:0;justify-content:center;align-items:center;width:36px;height:36px;transition:background .12s,color .12s;display:flex}._attachButton_ezgbk_654{color:var(--muted-foreground);background:0 0;font-size:1.2rem}._attachButton_ezgbk_654:hover{background:var(--muted);color:var(--text)}._sendButton_ezgbk_655{background:var(--primary);color:var(--primary-foreground);font-size:.9rem}._sendButton_ezgbk_655:disabled{opacity:.5;cursor:default}._sendButton_ezgbk_655._stopping_ezgbk_692{background:var(--danger-soft);color:var(--danger)}._slashSuggestions_ezgbk_697{background:var(--popover);border:1px solid var(--line);border-radius:var(--radius-md);max-height:220px;box-shadow:var(--shadow-popover);z-index:20;margin-bottom:4px;position:absolute;bottom:100%;left:0;right:0;overflow-y:auto}._suggestionItem_ezgbk_712{cursor:pointer;flex-direction:column;gap:2px;padding:8px 14px;transition:background .1s;display:flex}._suggestionItem_ezgbk_712:hover,._suggestionItemActive_ezgbk_722{background:var(--muted)}._suggestionLabel_ezgbk_726{color:var(--text);font-size:.86rem;font-weight:500}._suggestionDesc_ezgbk_732{color:var(--muted-foreground);font-size:.76rem}._errorBanner_ezgbk_737{border-radius:var(--radius-sm);background:var(--danger-soft);border:1px solid var(--danger-border);color:var(--danger);width:calc(100% - 48px);max-width:860px;margin:0 auto;padding:8px 14px;font-size:.84rem}._editArea_ezgbk_751{resize:vertical;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel-bg);width:100%;min-height:48px;max-height:200px;color:var(--text);padding:8px 10px;font-family:inherit;font-size:.92rem;line-height:1.5}._editButtons_ezgbk_766{gap:6px;margin-top:6px;display:flex}@media (width<=900px){._chatPage_ezgbk_1{grid-template-columns:1fr}._sidebar_ezgbk_9{display:none}._sidebarOpen_ezgbk_781{z-index:100;width:280px;max-width:85vw;animation:.2s _slideIn_ezgbk_1;display:flex;position:fixed;inset:0}._sidebarBackdrop_ezgbk_791{z-index:99;cursor:default;background:#0006;border:none;padding:0;position:fixed;inset:0}._mobileHeader_ezgbk_801{border-bottom:1px solid var(--line);flex-shrink:0;align-items:center;gap:10px;padding:12px 16px;display:flex}._messageArea_ezgbk_129{padding:16px 16px 8px}._composerWrapper_ezgbk_567{padding:0 16px 12px}}@media (width>=901px){._mobileHeader_ezgbk_801,._sidebarBackdrop_ezgbk_791{display:none}}@keyframes _slideIn_ezgbk_1{0%{transform:translate(-100%)}to{transform:translate(0)}}