@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.
- package/AGENTS.md +20 -0
- package/CHANGELOG.md +153 -0
- package/README.md +26 -0
- package/config.example.json +45 -0
- package/console/dist/assets/chat-A439MpRy.css +1 -0
- package/console/dist/assets/{chat-BFZkUicV.js → chat-I6Pguk2e.js} +4 -4
- package/console/dist/assets/{index-BLDth_j-.js → index-DON3wuuC.js} +3 -3
- package/console/dist/assets/index-DQoS6dsR.css +1 -0
- package/console/dist/assets/{terminal-BQbAhdr-.js → terminal-BQEo_jcm.js} +1 -1
- package/console/dist/index.html +2 -2
- package/container/Dockerfile +2 -0
- package/container/dist/index.js +2 -2
- package/container/dist/index.js.map +1 -1
- package/container/dist/model-retry.js +3 -3
- package/container/dist/model-retry.js.map +1 -1
- package/container/dist/providers/hybridai.js +3 -3
- package/container/dist/providers/hybridai.js.map +1 -1
- package/container/dist/providers/local-ollama.js +3 -3
- package/container/dist/providers/local-ollama.js.map +1 -1
- package/container/dist/providers/local-openai-compat.js +3 -3
- package/container/dist/providers/local-openai-compat.js.map +1 -1
- package/container/dist/providers/openai-codex.js +2 -2
- package/container/dist/providers/openai-codex.js.map +1 -1
- package/container/dist/providers/provider-ids.js +18 -0
- package/container/dist/providers/provider-ids.js.map +1 -1
- package/container/dist/providers/shared.js +4 -4
- package/container/dist/tools.js +1 -2
- package/container/dist/tools.js.map +1 -1
- package/container/dist/web-fetch.js +0 -15
- package/container/dist/web-fetch.js.map +1 -1
- package/container/package-lock.json +2 -2
- package/container/package.json +1 -1
- package/container/shared/model-names.js +9 -0
- package/container/src/index.ts +2 -2
- package/container/src/model-retry.ts +3 -3
- package/container/src/providers/hybridai.ts +3 -3
- package/container/src/providers/local-ollama.ts +3 -3
- package/container/src/providers/local-openai-compat.ts +3 -3
- package/container/src/providers/openai-codex.ts +2 -2
- package/container/src/providers/provider-ids.ts +21 -4
- package/container/src/providers/shared.ts +4 -4
- package/container/src/tools.ts +1 -5
- package/container/src/web-fetch.ts +0 -28
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +8 -0
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/prompt-hooks.d.ts.map +1 -1
- package/dist/agent/prompt-hooks.js +3 -2
- package/dist/agent/prompt-hooks.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js +205 -4
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/plugin-command.d.ts.map +1 -1
- package/dist/cli/plugin-command.js +12 -17
- package/dist/cli/plugin-command.js.map +1 -1
- package/dist/command-registry.d.ts.map +1 -1
- package/dist/command-registry.js +73 -6
- package/dist/command-registry.js.map +1 -1
- package/dist/config/config.d.ts +27 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +77 -1
- package/dist/config/config.js.map +1 -1
- package/dist/config/runtime-config.d.ts +46 -0
- package/dist/config/runtime-config.d.ts.map +1 -1
- package/dist/config/runtime-config.js +161 -1
- package/dist/config/runtime-config.js.map +1 -1
- package/dist/doctor/provider-probes.d.ts.map +1 -1
- package/dist/doctor/provider-probes.js +15 -7
- package/dist/doctor/provider-probes.js.map +1 -1
- package/dist/doctor/utils.d.ts +1 -1
- package/dist/doctor/utils.d.ts.map +1 -1
- package/dist/doctor/utils.js +3 -3
- package/dist/doctor/utils.js.map +1 -1
- package/dist/gateway/docs.d.ts.map +1 -1
- package/dist/gateway/docs.js +112 -0
- package/dist/gateway/docs.js.map +1 -1
- package/dist/gateway/gateway-chat-service.d.ts.map +1 -1
- package/dist/gateway/gateway-chat-service.js +12 -2
- package/dist/gateway/gateway-chat-service.js.map +1 -1
- package/dist/gateway/gateway-http-proxy.d.ts.map +1 -1
- package/dist/gateway/gateway-http-proxy.js +1 -28
- package/dist/gateway/gateway-http-proxy.js.map +1 -1
- package/dist/gateway/gateway-http-server.d.ts.map +1 -1
- package/dist/gateway/gateway-http-server.js +0 -6
- package/dist/gateway/gateway-http-server.js.map +1 -1
- package/dist/gateway/gateway-http-utils.d.ts.map +1 -1
- package/dist/gateway/gateway-http-utils.js +0 -6
- package/dist/gateway/gateway-http-utils.js.map +1 -1
- package/dist/gateway/gateway-plugin-service.d.ts.map +1 -1
- package/dist/gateway/gateway-plugin-service.js +13 -1
- package/dist/gateway/gateway-plugin-service.js.map +1 -1
- package/dist/gateway/gateway-provider-service.d.ts +10 -0
- package/dist/gateway/gateway-provider-service.d.ts.map +1 -0
- package/dist/gateway/gateway-provider-service.js +139 -0
- package/dist/gateway/gateway-provider-service.js.map +1 -0
- package/dist/gateway/gateway-restart.d.ts +16 -0
- package/dist/gateway/gateway-restart.d.ts.map +1 -1
- package/dist/gateway/gateway-restart.js +101 -19
- package/dist/gateway/gateway-restart.js.map +1 -1
- package/dist/gateway/gateway-service.d.ts.map +1 -1
- package/dist/gateway/gateway-service.js +96 -191
- package/dist/gateway/gateway-service.js.map +1 -1
- package/dist/gateway/gateway-types.d.ts +2 -1
- package/dist/gateway/gateway-types.d.ts.map +1 -1
- package/dist/gateway/gateway-types.js.map +1 -1
- package/dist/gateway/gateway.js +5 -0
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/skill-commands.d.ts.map +1 -1
- package/dist/gateway/skill-commands.js +75 -1
- package/dist/gateway/skill-commands.js.map +1 -1
- package/dist/infra/container-runner.d.ts.map +1 -1
- package/dist/infra/container-runner.js +15 -4
- package/dist/infra/container-runner.js.map +1 -1
- package/dist/infra/container-setup.d.ts +6 -0
- package/dist/infra/container-setup.d.ts.map +1 -1
- package/dist/infra/container-setup.js +107 -9
- package/dist/infra/container-setup.js.map +1 -1
- package/dist/infra/host-runner.d.ts.map +1 -1
- package/dist/infra/host-runner.js +8 -0
- package/dist/infra/host-runner.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +7 -0
- package/dist/logger.js.map +1 -1
- package/dist/memory/db.d.ts.map +1 -1
- package/dist/memory/db.js +0 -7
- package/dist/memory/db.js.map +1 -1
- package/dist/migration/agent-home-migration.d.ts.map +1 -1
- package/dist/migration/agent-home-migration.js +5 -3
- package/dist/migration/agent-home-migration.js.map +1 -1
- package/dist/observability/otel.d.ts +36 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +142 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/plugins/plugin-dependencies.d.ts +4 -1
- package/dist/plugins/plugin-dependencies.d.ts.map +1 -1
- package/dist/plugins/plugin-dependencies.js +18 -8
- package/dist/plugins/plugin-dependencies.js.map +1 -1
- package/dist/plugins/plugin-install.d.ts +6 -0
- package/dist/plugins/plugin-install.d.ts.map +1 -1
- package/dist/plugins/plugin-install.js +31 -7
- package/dist/plugins/plugin-install.js.map +1 -1
- package/dist/providers/codex-constants.d.ts +1 -0
- package/dist/providers/codex-constants.d.ts.map +1 -1
- package/dist/providers/codex-constants.js +6 -0
- package/dist/providers/codex-constants.js.map +1 -1
- package/dist/providers/codex-discovery.d.ts.map +1 -1
- package/dist/providers/codex-discovery.js +17 -5
- package/dist/providers/codex-discovery.js.map +1 -1
- package/dist/providers/factory.d.ts.map +1 -1
- package/dist/providers/factory.js +11 -1
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/huggingface-discovery.d.ts.map +1 -1
- package/dist/providers/huggingface-discovery.js +5 -2
- package/dist/providers/huggingface-discovery.js.map +1 -1
- package/dist/providers/huggingface-utils.d.ts +0 -3
- package/dist/providers/huggingface-utils.d.ts.map +1 -1
- package/dist/providers/huggingface-utils.js +0 -9
- package/dist/providers/huggingface-utils.js.map +1 -1
- package/dist/providers/huggingface.d.ts.map +1 -1
- package/dist/providers/huggingface.js +5 -2
- package/dist/providers/huggingface.js.map +1 -1
- package/dist/providers/mistral-discovery.d.ts.map +1 -1
- package/dist/providers/mistral-discovery.js +5 -2
- package/dist/providers/mistral-discovery.js.map +1 -1
- package/dist/providers/mistral-utils.d.ts +0 -3
- package/dist/providers/mistral-utils.d.ts.map +1 -1
- package/dist/providers/mistral-utils.js +0 -5
- package/dist/providers/mistral-utils.js.map +1 -1
- package/dist/providers/mistral.d.ts.map +1 -1
- package/dist/providers/mistral.js +3 -2
- package/dist/providers/mistral.js.map +1 -1
- package/dist/providers/model-catalog.d.ts +1 -5
- package/dist/providers/model-catalog.d.ts.map +1 -1
- package/dist/providers/model-catalog.js +80 -20
- package/dist/providers/model-catalog.js.map +1 -1
- package/dist/providers/model-names.d.ts +1 -0
- package/dist/providers/model-names.d.ts.map +1 -1
- package/dist/providers/model-names.js +5 -0
- package/dist/providers/model-names.js.map +1 -1
- package/dist/providers/openai-compat-discovery.d.ts +20 -0
- package/dist/providers/openai-compat-discovery.d.ts.map +1 -0
- package/dist/providers/openai-compat-discovery.js +183 -0
- package/dist/providers/openai-compat-discovery.js.map +1 -0
- package/dist/providers/openai-compat-remote.d.ts +27 -0
- package/dist/providers/openai-compat-remote.d.ts.map +1 -0
- package/dist/providers/openai-compat-remote.js +171 -0
- package/dist/providers/openai-compat-remote.js.map +1 -0
- package/dist/providers/openrouter-discovery.d.ts.map +1 -1
- package/dist/providers/openrouter-discovery.js +5 -2
- package/dist/providers/openrouter-discovery.js.map +1 -1
- package/dist/providers/openrouter-utils.d.ts +0 -3
- package/dist/providers/openrouter-utils.d.ts.map +1 -1
- package/dist/providers/openrouter-utils.js +0 -5
- package/dist/providers/openrouter-utils.js.map +1 -1
- package/dist/providers/openrouter.js +3 -2
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/providers/provider-aliases.d.ts +4 -0
- package/dist/providers/provider-aliases.d.ts.map +1 -0
- package/dist/providers/provider-aliases.js +25 -0
- package/dist/providers/provider-aliases.js.map +1 -0
- package/dist/providers/provider-ids.d.ts +3 -3
- package/dist/providers/provider-ids.d.ts.map +1 -1
- package/dist/providers/provider-ids.js +18 -0
- package/dist/providers/provider-ids.js.map +1 -1
- package/dist/providers/task-routing.d.ts.map +1 -1
- package/dist/providers/task-routing.js +13 -16
- package/dist/providers/task-routing.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts.map +1 -1
- package/dist/scheduler/scheduler.js +0 -2
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/security/runtime-secrets.d.ts +1 -1
- package/dist/security/runtime-secrets.d.ts.map +1 -1
- package/dist/security/runtime-secrets.js +8 -0
- package/dist/security/runtime-secrets.js.map +1 -1
- package/dist/skills/skills.d.ts.map +1 -1
- package/dist/skills/skills.js +4 -0
- package/dist/skills/skills.js.map +1 -1
- package/dist/tui-slash-command.d.ts.map +1 -1
- package/dist/tui-slash-command.js +2 -0
- package/dist/tui-slash-command.js.map +1 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +19 -13
- package/dist/tui.js.map +1 -1
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +10 -2
- package/dist/update.js.map +1 -1
- package/dist/utils/text-format.d.ts +1 -0
- package/dist/utils/text-format.d.ts.map +1 -1
- package/dist/utils/text-format.js +3 -0
- package/dist/utils/text-format.js.map +1 -1
- package/dist/workspace.d.ts +25 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +73 -0
- package/dist/workspace.js.map +1 -1
- package/docs/chat.html +90 -38
- package/docs/content/README.md +14 -12
- package/docs/content/agents.md +4 -0
- package/docs/content/developer-guide/runtime.md +28 -4
- package/docs/content/extensibility/README.md +4 -2
- package/docs/content/extensibility/byterover-memory-plugin.md +390 -0
- package/docs/content/extensibility/gbrain-plugin.md +89 -3
- package/docs/content/extensibility/honcho-memory-plugin.md +88 -2
- package/docs/content/extensibility/mem0-memory-plugin.md +180 -0
- package/docs/content/extensibility/memory-plugins.md +142 -0
- package/docs/content/extensibility/mempalace-memory-plugin.md +113 -2
- package/docs/content/extensibility/plugins.md +7 -0
- package/docs/content/extensibility/qmd-memory-plugin.md +98 -4
- package/docs/content/getting-started/authentication.md +38 -6
- package/docs/content/getting-started/quickstart.md +4 -0
- package/docs/content/guides/bundled-skills.md +4 -2
- package/docs/content/guides/office-dependencies.md +1 -1
- package/docs/content/guides/remote-access.md +1 -1
- package/docs/content/guides/skills/README.md +45 -0
- package/docs/content/guides/skills/apple.md +112 -0
- package/docs/content/guides/skills/communication.md +82 -0
- package/docs/content/guides/skills/development.md +175 -0
- package/docs/content/guides/skills/integrations.md +249 -0
- package/docs/content/guides/skills/memory-knowledge.md +189 -0
- package/docs/content/guides/skills/office.md +248 -0
- package/docs/content/guides/skills/productivity.md +116 -0
- package/docs/content/guides/skills/publishing.md +136 -0
- package/docs/content/guides/twilio-voice.md +1 -1
- package/docs/content/guides/voice-tts.md +1 -1
- package/docs/content/reference/commands.md +27 -2
- package/docs/content/reference/configuration.md +7 -1
- package/docs/content/reference/faq.md +5 -3
- package/docs/content/reference/model-selection.md +50 -2
- package/docs/development/agents.md +2 -0
- package/docs/development/extensibility/README.md +2 -2
- package/docs/development/extensibility/byterover-memory-plugin.md +390 -0
- package/docs/development/extensibility/gbrain-plugin.md +89 -3
- package/docs/development/extensibility/honcho-memory-plugin.md +88 -2
- package/docs/development/extensibility/mem0-memory-plugin.md +180 -0
- package/docs/development/extensibility/memory-plugins.md +128 -0
- package/docs/development/extensibility/mempalace-memory-plugin.md +133 -2
- package/docs/development/extensibility/plugins.md +7 -0
- package/docs/development/extensibility/qmd-memory-plugin.md +117 -4
- package/docs/development/getting-started/authentication.md +38 -6
- package/docs/development/getting-started/quickstart.md +4 -0
- package/docs/development/guides/bundled-skills.md +4 -2
- package/docs/development/guides/office-dependencies.md +1 -1
- package/docs/development/guides/remote-access.md +1 -1
- package/docs/development/guides/skills/README.md +45 -0
- package/docs/development/guides/skills/apple.md +112 -0
- package/docs/development/guides/skills/communication.md +82 -0
- package/docs/development/guides/skills/development.md +175 -0
- package/docs/development/guides/skills/integrations.md +249 -0
- package/docs/development/guides/skills/memory-knowledge.md +189 -0
- package/docs/development/guides/skills/office.md +248 -0
- package/docs/development/guides/skills/productivity.md +116 -0
- package/docs/development/guides/skills/publishing.md +136 -0
- package/docs/development/guides/twilio-voice.md +1 -1
- package/docs/development/guides/voice-tts.md +1 -1
- package/docs/development/internals/runtime.md +9 -4
- package/docs/development/reference/commands.md +18 -2
- package/docs/development/reference/configuration.md +3 -1
- package/docs/development/reference/faq.md +5 -3
- package/docs/development/reference/model-selection.md +41 -2
- package/docs/static/docs.css +84 -0
- package/docs/static/docs.js +243 -53
- package/package.json +7 -1
- package/skills/pdf/SKILL.md +8 -56
- package/console/dist/assets/chat-CKhyYUgY.css +0 -1
- package/console/dist/assets/index-BFbE8-iL.css +0 -1
- 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:
|
package/config.example.json
CHANGED
|
@@ -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)}}
|