@hybridaione/hybridclaw 0.12.3 → 0.12.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -2
- package/CHANGELOG.md +70 -0
- package/README.md +65 -14
- package/SECURITY.md +20 -2
- package/config.example.json +12 -0
- package/console/dist/assets/index-B6FqEYWi.css +1 -0
- package/console/dist/assets/index-tnmE9Yuc.js +23 -0
- package/console/dist/assets/{terminal-Ck76zy5f.js → terminal-BZDT_b4f.js} +1 -1
- package/console/dist/index.html +2 -2
- package/container/package-lock.json +2 -2
- package/container/package.json +1 -1
- package/dist/agent/prompt-hooks.js +1 -1
- package/dist/agent/prompt-hooks.js.map +1 -1
- package/dist/agents/agent-registry.d.ts.map +1 -1
- package/dist/agents/agent-registry.js +7 -0
- package/dist/agents/agent-registry.js.map +1 -1
- package/dist/agents/agent-types.d.ts +1 -0
- package/dist/agents/agent-types.d.ts.map +1 -1
- package/dist/agents/agent-types.js.map +1 -1
- package/dist/agents/claw-archive.d.ts.map +1 -1
- package/dist/agents/claw-archive.js +11 -0
- package/dist/agents/claw-archive.js.map +1 -1
- package/dist/agents/claw-manifest.d.ts +1 -0
- package/dist/agents/claw-manifest.d.ts.map +1 -1
- package/dist/agents/claw-manifest.js +4 -13
- package/dist/agents/claw-manifest.js.map +1 -1
- package/dist/auth/codex-auth.d.ts.map +1 -1
- package/dist/auth/codex-auth.js +1 -3
- package/dist/auth/codex-auth.js.map +1 -1
- package/dist/channels/channel-registry.d.ts.map +1 -1
- package/dist/channels/channel-registry.js +5 -1
- package/dist/channels/channel-registry.js.map +1 -1
- package/dist/channels/channel.d.ts +3 -2
- package/dist/channels/channel.d.ts.map +1 -1
- package/dist/channels/channel.js +10 -0
- package/dist/channels/channel.js.map +1 -1
- package/dist/channels/discord/approval-buttons.d.ts.map +1 -1
- package/dist/channels/discord/approval-buttons.js +6 -5
- package/dist/channels/discord/approval-buttons.js.map +1 -1
- package/dist/channels/discord/delivery.d.ts.map +1 -1
- package/dist/channels/discord/delivery.js +2 -1
- package/dist/channels/discord/delivery.js.map +1 -1
- package/dist/channels/discord/human-delay.d.ts +0 -1
- package/dist/channels/discord/human-delay.d.ts.map +1 -1
- package/dist/channels/discord/human-delay.js +0 -6
- package/dist/channels/discord/human-delay.js.map +1 -1
- package/dist/channels/discord/reactions.d.ts.map +1 -1
- package/dist/channels/discord/reactions.js +1 -3
- package/dist/channels/discord/reactions.js.map +1 -1
- package/dist/channels/discord/retry.d.ts +4 -0
- package/dist/channels/discord/retry.d.ts.map +1 -0
- package/dist/channels/discord/retry.js +32 -0
- package/dist/channels/discord/retry.js.map +1 -0
- package/dist/channels/discord/runtime.d.ts +4 -2
- package/dist/channels/discord/runtime.d.ts.map +1 -1
- package/dist/channels/discord/runtime.js +24 -46
- package/dist/channels/discord/runtime.js.map +1 -1
- package/dist/channels/discord/stream.d.ts.map +1 -1
- package/dist/channels/discord/stream.js +15 -46
- package/dist/channels/discord/stream.js.map +1 -1
- package/dist/channels/email/connection.d.ts.map +1 -1
- package/dist/channels/email/connection.js +13 -2
- package/dist/channels/email/connection.js.map +1 -1
- package/dist/channels/message/tool-actions.d.ts.map +1 -1
- package/dist/channels/message/tool-actions.js +7 -0
- package/dist/channels/message/tool-actions.js.map +1 -1
- package/dist/channels/msteams/retry.d.ts.map +1 -1
- package/dist/channels/msteams/retry.js +13 -25
- package/dist/channels/msteams/retry.js.map +1 -1
- package/dist/channels/prompt-adapters.d.ts.map +1 -1
- package/dist/channels/prompt-adapters.js +3 -0
- package/dist/channels/prompt-adapters.js.map +1 -1
- package/dist/channels/slack/approval-buttons.d.ts +45 -0
- package/dist/channels/slack/approval-buttons.d.ts.map +1 -0
- package/dist/channels/slack/approval-buttons.js +95 -0
- package/dist/channels/slack/approval-buttons.js.map +1 -0
- package/dist/channels/slack/delivery.d.ts +3 -0
- package/dist/channels/slack/delivery.d.ts.map +1 -0
- package/dist/channels/slack/delivery.js +59 -0
- package/dist/channels/slack/delivery.js.map +1 -0
- package/dist/channels/slack/inbound.d.ts +67 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -0
- package/dist/channels/slack/inbound.js +335 -0
- package/dist/channels/slack/inbound.js.map +1 -0
- package/dist/channels/slack/prompt-adapter.d.ts +3 -0
- package/dist/channels/slack/prompt-adapter.d.ts.map +1 -0
- package/dist/channels/slack/prompt-adapter.js +26 -0
- package/dist/channels/slack/prompt-adapter.js.map +1 -0
- package/dist/channels/slack/runtime.d.ts +58 -0
- package/dist/channels/slack/runtime.d.ts.map +1 -0
- package/dist/channels/slack/runtime.js +753 -0
- package/dist/channels/slack/runtime.js.map +1 -0
- package/dist/channels/slack/slash-commands.d.ts +27 -0
- package/dist/channels/slack/slash-commands.d.ts.map +1 -0
- package/dist/channels/slack/slash-commands.js +173 -0
- package/dist/channels/slack/slash-commands.js.map +1 -0
- package/dist/channels/slack/target.d.ts +12 -0
- package/dist/channels/slack/target.d.ts.map +1 -0
- package/dist/channels/slack/target.js +62 -0
- package/dist/channels/slack/target.js.map +1 -0
- package/dist/channels/slack/tool-actions.d.ts +5 -0
- package/dist/channels/slack/tool-actions.d.ts.map +1 -0
- package/dist/channels/slack/tool-actions.js +294 -0
- package/dist/channels/slack/tool-actions.js.map +1 -0
- package/dist/channels/telegram/delivery.d.ts.map +1 -1
- package/dist/channels/telegram/delivery.js +8 -20
- package/dist/channels/telegram/delivery.js.map +1 -1
- package/dist/channels/whatsapp/connection.d.ts.map +1 -1
- package/dist/channels/whatsapp/connection.js +1 -0
- package/dist/channels/whatsapp/connection.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js +176 -5
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/cli/channels-command.d.ts.map +1 -1
- package/dist/cli/channels-command.js +175 -4
- package/dist/cli/channels-command.js.map +1 -1
- package/dist/cli/help.d.ts +1 -0
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +36 -5
- package/dist/cli/help.js.map +1 -1
- package/dist/config/config.d.ts +11 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +26 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/runtime-config-revisions.d.ts +15 -0
- package/dist/config/runtime-config-revisions.d.ts.map +1 -1
- package/dist/config/runtime-config-revisions.js +38 -1
- package/dist/config/runtime-config-revisions.js.map +1 -1
- package/dist/config/runtime-config.d.ts +29 -3
- package/dist/config/runtime-config.d.ts.map +1 -1
- package/dist/config/runtime-config.js +127 -5
- package/dist/config/runtime-config.js.map +1 -1
- package/dist/gateway/approval-button-labels.d.ts +8 -0
- package/dist/gateway/approval-button-labels.d.ts.map +1 -0
- package/dist/gateway/approval-button-labels.js +8 -0
- package/dist/gateway/approval-button-labels.js.map +1 -0
- package/dist/gateway/approval-confirmation.d.ts.map +1 -1
- package/dist/gateway/approval-confirmation.js +6 -5
- package/dist/gateway/approval-confirmation.js.map +1 -1
- package/dist/gateway/approval-presentation.d.ts +16 -0
- package/dist/gateway/approval-presentation.d.ts.map +1 -0
- package/dist/gateway/approval-presentation.js +55 -0
- package/dist/gateway/approval-presentation.js.map +1 -0
- package/dist/gateway/docs.d.ts.map +1 -1
- package/dist/gateway/docs.js +119 -44
- package/dist/gateway/docs.js.map +1 -1
- package/dist/gateway/gateway-http-server.d.ts.map +1 -1
- package/dist/gateway/gateway-http-server.js +226 -46
- package/dist/gateway/gateway-http-server.js.map +1 -1
- package/dist/gateway/gateway-scheduled-task-service.d.ts.map +1 -1
- package/dist/gateway/gateway-scheduled-task-service.js +48 -8
- package/dist/gateway/gateway-scheduled-task-service.js.map +1 -1
- package/dist/gateway/gateway-service.d.ts +29 -13
- package/dist/gateway/gateway-service.d.ts.map +1 -1
- package/dist/gateway/gateway-service.js +525 -5
- package/dist/gateway/gateway-service.js.map +1 -1
- package/dist/gateway/gateway-types.d.ts +56 -0
- package/dist/gateway/gateway-types.d.ts.map +1 -1
- package/dist/gateway/gateway-types.js.map +1 -1
- package/dist/gateway/gateway.js +267 -7
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/pending-approvals.d.ts +7 -0
- package/dist/gateway/pending-approvals.d.ts.map +1 -1
- package/dist/gateway/pending-approvals.js +23 -1
- package/dist/gateway/pending-approvals.js.map +1 -1
- package/dist/gateway/proactive-delivery.d.ts.map +1 -1
- package/dist/gateway/proactive-delivery.js +3 -0
- package/dist/gateway/proactive-delivery.js.map +1 -1
- package/dist/gateway/text-channel-commands.d.ts +2 -1
- package/dist/gateway/text-channel-commands.d.ts.map +1 -1
- package/dist/gateway/text-channel-commands.js +3 -1
- package/dist/gateway/text-channel-commands.js.map +1 -1
- package/dist/infra/container-runner.js +1 -1
- package/dist/infra/container-runner.js.map +1 -1
- package/dist/infra/host-runner.js +1 -1
- package/dist/infra/host-runner.js.map +1 -1
- package/dist/media/managed-temp-media.d.ts +1 -0
- package/dist/media/managed-temp-media.d.ts.map +1 -1
- package/dist/media/managed-temp-media.js +5 -1
- package/dist/media/managed-temp-media.js.map +1 -1
- package/dist/memory/db.d.ts +1 -1
- package/dist/memory/db.d.ts.map +1 -1
- package/dist/memory/db.js +49 -7
- package/dist/memory/db.js.map +1 -1
- package/dist/onboarding.d.ts.map +1 -1
- package/dist/onboarding.js +115 -2
- package/dist/onboarding.js.map +1 -1
- package/dist/scheduler/scheduled-task-runner.d.ts.map +1 -1
- package/dist/scheduler/scheduled-task-runner.js +31 -0
- package/dist/scheduler/scheduled-task-runner.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts +1 -0
- package/dist/scheduler/scheduler.d.ts.map +1 -1
- package/dist/scheduler/scheduler.js +141 -10
- 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 +2 -0
- package/dist/security/runtime-secrets.js.map +1 -1
- package/dist/session/session-context.d.ts.map +1 -1
- package/dist/session/session-context.js +1 -0
- package/dist/session/session-context.js.map +1 -1
- package/dist/session/session-reset.d.ts.map +1 -1
- package/dist/session/session-reset.js +3 -0
- package/dist/session/session-reset.js.map +1 -1
- package/dist/skills/skills-import-hubs.d.ts.map +1 -1
- package/dist/skills/skills-import-hubs.js +1 -3
- package/dist/skills/skills-import-hubs.js.map +1 -1
- package/dist/skills/skills.d.ts.map +1 -1
- package/dist/skills/skills.js +9 -1
- package/dist/skills/skills.js.map +1 -1
- package/dist/tui-approval-prompt.d.ts +24 -0
- package/dist/tui-approval-prompt.d.ts.map +1 -0
- package/dist/tui-approval-prompt.js +344 -0
- package/dist/tui-approval-prompt.js.map +1 -0
- package/dist/tui-approval.d.ts +1 -0
- package/dist/tui-approval.d.ts.map +1 -1
- package/dist/tui-approval.js +15 -0
- package/dist/tui-approval.js.map +1 -1
- package/dist/tui-exit-summary.d.ts +8 -0
- package/dist/tui-exit-summary.d.ts.map +1 -0
- package/dist/tui-exit-summary.js +16 -0
- package/dist/tui-exit-summary.js.map +1 -0
- package/dist/tui-proactive.d.ts.map +1 -1
- package/dist/tui-proactive.js +7 -0
- package/dist/tui-proactive.js.map +1 -1
- package/dist/tui-session.d.ts +7 -0
- package/dist/tui-session.d.ts.map +1 -1
- package/dist/tui-session.js +9 -0
- package/dist/tui-session.js.map +1 -1
- package/dist/tui-skill-config.d.ts +1 -1
- package/dist/tui-skill-config.d.ts.map +1 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +102 -87
- package/dist/tui.js.map +1 -1
- package/dist/utils/normalized-strings.d.ts +2 -0
- package/dist/utils/normalized-strings.d.ts.map +1 -1
- package/dist/utils/normalized-strings.js +19 -0
- package/dist/utils/normalized-strings.js.map +1 -1
- package/dist/utils/transport-retry.d.ts +10 -0
- package/dist/utils/transport-retry.d.ts.map +1 -0
- package/dist/utils/transport-retry.js +42 -0
- package/dist/utils/transport-retry.js.map +1 -0
- package/dist/workspace.d.ts +1 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +3 -3
- package/dist/workspace.js.map +1 -1
- package/docs/404.html +3 -3
- package/docs/content/README.md +72 -0
- package/docs/content/_category_.json +5 -0
- package/docs/content/agents.md +85 -0
- package/docs/content/channels/README.md +34 -0
- package/docs/content/channels/_category_.json +5 -0
- package/docs/content/channels/admin-console.md +58 -0
- package/docs/content/channels/discord.md +78 -0
- package/docs/content/channels/email.md +103 -0
- package/docs/content/channels/imessage.md +357 -0
- package/docs/content/channels/local-config-and-secrets.md +58 -0
- package/docs/content/channels/msteams.md +136 -0
- package/docs/content/channels/overview.md +61 -0
- package/docs/content/channels/policies-and-allowlists.md +56 -0
- package/docs/content/channels/slack.md +414 -0
- package/docs/content/channels/telegram.md +160 -0
- package/docs/content/channels/whatsapp.md +98 -0
- package/docs/content/developer-guide/README.md +19 -0
- package/docs/content/developer-guide/_category_.json +5 -0
- package/docs/content/developer-guide/architecture.md +114 -0
- package/docs/content/developer-guide/memory.md +379 -0
- package/docs/content/developer-guide/runtime.md +406 -0
- package/docs/content/developer-guide/session-routing.md +113 -0
- package/docs/content/extensibility/README.md +191 -0
- package/docs/content/extensibility/_category_.json +5 -0
- package/docs/content/extensibility/adaptive-skills.md +120 -0
- package/docs/content/extensibility/agent-packages.md +454 -0
- package/docs/content/extensibility/gbrain-plugin.md +606 -0
- package/docs/content/extensibility/honcho-memory-plugin.md +489 -0
- package/docs/content/extensibility/mempalace-memory-plugin.md +523 -0
- package/docs/content/extensibility/otel-plugin.md +269 -0
- package/docs/content/extensibility/plugins.md +413 -0
- package/docs/content/extensibility/qmd-memory-plugin.md +178 -0
- package/docs/content/extensibility/skills.md +168 -0
- package/docs/content/getting-started/README.md +27 -0
- package/docs/content/getting-started/_category_.json +5 -0
- package/docs/content/getting-started/authentication.md +157 -0
- package/docs/content/getting-started/first-channel.md +70 -0
- package/docs/content/getting-started/installation.md +53 -0
- package/docs/content/getting-started/quickstart.md +112 -0
- package/docs/content/guides/README.md +21 -0
- package/docs/content/guides/_category_.json +5 -0
- package/docs/content/guides/bundled-skills.md +43 -0
- package/docs/content/guides/local-providers.md +49 -0
- package/docs/content/guides/office-dependencies.md +50 -0
- package/docs/content/guides/remote-access.md +205 -0
- package/docs/content/guides/tui-mcp.md +35 -0
- package/docs/content/guides/voice-tts.md +129 -0
- package/docs/content/reference/README.md +20 -0
- package/docs/content/reference/_category_.json +5 -0
- package/docs/content/reference/commands.md +397 -0
- package/docs/content/reference/configuration.md +251 -0
- package/docs/content/reference/diagnostics.md +51 -0
- package/docs/content/reference/faq.md +133 -0
- package/docs/content/reference/model-selection.md +98 -0
- package/docs/content/reference/tools/README.md +13 -0
- package/docs/content/reference/tools/_category_.json +5 -0
- package/docs/content/reference/tools/web-search.md +74 -0
- package/docs/development/getting-started/README.md +2 -2
- package/docs/development/getting-started/channels.md +11 -8
- package/docs/development/getting-started/installation.md +1 -1
- package/docs/development/getting-started/quickstart.md +4 -0
- package/docs/development/index.html +3 -3
- package/docs/development/internals/architecture.md +68 -4
- package/docs/development/internals/runtime.md +3 -1
- package/docs/development/reference/commands.md +12 -5
- package/docs/docs/index.html +3 -3
- package/docs/index.html +34 -39
- package/docs/slack.md +384 -0
- package/docs/static/docs.js +82 -20
- package/package.json +3 -1
- package/skills/hybridclaw-help/SKILL.md +6 -6
- package/templates/README.md +1 -1
- package/console/dist/assets/index-B2MuW9U9.css +0 -1
- package/console/dist/assets/index-CxfHZER4.js +0 -23
package/AGENTS.md
CHANGED
|
@@ -363,7 +363,7 @@ When the user says "bump release":
|
|
|
363
363
|
- Do not include personal identity, real phone numbers, or live config values
|
|
364
364
|
in tests, examples, docs, or commits.
|
|
365
365
|
- Do not edit `.dockerignore` without verifying the resulting Docker image
|
|
366
|
-
still contains all runtime-required files (especially `docs/
|
|
366
|
+
still contains all runtime-required files (especially `docs/content/`).
|
|
367
367
|
Build the image and confirm the affected paths exist inside it before
|
|
368
368
|
marking the change complete.
|
|
369
369
|
- Do not edit `node_modules/` or vendored files.
|
|
@@ -406,7 +406,7 @@ When multiple agents may be working on this repo concurrently:
|
|
|
406
406
|
| `CONTRIBUTING.md` | Human contributors | Quickstart, PR workflow |
|
|
407
407
|
| `SECURITY.md` | Security reviewers | Runtime security controls |
|
|
408
408
|
| `TRUST_MODEL.md` | Operators | Trust acceptance policy |
|
|
409
|
-
| `docs/
|
|
409
|
+
| `docs/content/` | Maintainers | User docs, developer guide, reference |
|
|
410
410
|
| `templates/*.md` | Product runtime | Agent workspace bootstrap |
|
|
411
411
|
|
|
412
412
|
---
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,73 @@
|
|
|
2
2
|
|
|
3
3
|
## [Coming up]
|
|
4
4
|
|
|
5
|
+
## [0.12.5](https://github.com/HybridAIOne/hybridclaw/tree/v0.12.5)
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **Admin agent file editor**: The admin console now includes `/admin/agents`
|
|
10
|
+
for editing each registered agent's allowlisted workspace bootstrap markdown
|
|
11
|
+
files, with saved revision history and restore controls.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- **Local TUI approval workflow**: Pending approvals in `hybridclaw tui` open a
|
|
16
|
+
keyboard-driven picker with `Up`/`Down` navigation, `Enter` confirmation,
|
|
17
|
+
number-key quick select, `Esc` to skip, and a text fallback for
|
|
18
|
+
non-interactive terminals.
|
|
19
|
+
- **Admin destructive-action confirmations**: Browser-based operator flows now
|
|
20
|
+
use explicit confirmation dialogs for destructive actions so restarts,
|
|
21
|
+
deletes, and similar changes require a deliberate confirm step.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- **TUI approval replay handling**: Replayed or restated approval prompts reuse
|
|
26
|
+
cached approval details more reliably, and web `/approve` flows preserve
|
|
27
|
+
pending-approval metadata so follow-up approvals reopen the same picker
|
|
28
|
+
instead of dropping back to raw text.
|
|
29
|
+
- **TUI exit summaries**: Exit output either shows the remote usage/tool/file
|
|
30
|
+
totals for the session or an explicit unavailable summary, and gateway
|
|
31
|
+
history breakdowns resolve canonical TUI session ids consistently for
|
|
32
|
+
tool/file counts.
|
|
33
|
+
- **Invalid runtime-config recovery**: Interactive onboarding can restore the
|
|
34
|
+
last known-good saved config snapshot, or roll back to the newest saved
|
|
35
|
+
revision, when `config.json` becomes invalid JSON instead of leaving setup
|
|
36
|
+
stuck on in-memory defaults.
|
|
37
|
+
- **Transport retry backoff**: Retry-aware channel transports honor
|
|
38
|
+
service-provided `Retry-After` delays and reject invalid retry values early
|
|
39
|
+
instead of silently retrying with bad timing.
|
|
40
|
+
- **Email first-sync cursor handling**: The built-in email transport seeds a
|
|
41
|
+
missing mailbox cursor from the current mailbox head so old inbox mail is not
|
|
42
|
+
replayed as new traffic on first startup, while later restarts still deliver
|
|
43
|
+
mail that arrived while the gateway was offline.
|
|
44
|
+
- **WhatsApp startup reliability**: The built-in WhatsApp transport disables
|
|
45
|
+
Baileys init queries that can trigger intermittent `400`/`bad-request`
|
|
46
|
+
failures during startup and pairing.
|
|
47
|
+
|
|
48
|
+
## [0.12.4](https://github.com/HybridAIOne/hybridclaw/tree/v0.12.4)
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- **Slack channel transport**: Added a built-in Slack Socket Mode transport
|
|
53
|
+
with `hybridclaw auth login slack`, DM and channel policy controls,
|
|
54
|
+
thread-aware session routing, file/media handling, approval buttons, and a
|
|
55
|
+
dedicated setup guide for operator rollout.
|
|
56
|
+
- **Immediate one-shot scheduler jobs**: Added config-backed `one_shot` jobs
|
|
57
|
+
that run immediately, retry up to `maxRetries`, preserve review state, and
|
|
58
|
+
surface richer delivery output across the gateway and admin scheduler UI.
|
|
59
|
+
|
|
60
|
+
### Changed
|
|
61
|
+
|
|
62
|
+
- **Admin console dialog and toast UX**: Replaced inline banners with
|
|
63
|
+
accessible dialog/toast primitives, tightened scheduler and jobs feedback
|
|
64
|
+
flows, and refined the mobile topbar/sidebar interaction.
|
|
65
|
+
- **Per-agent skill filtering**: Agent `skills` settings narrow the
|
|
66
|
+
globally enabled skill set, while omitting `skills` keeps the existing
|
|
67
|
+
global scope for backward compatibility.
|
|
68
|
+
- **Approval presentation across channels**: Gateway approval copy and channel
|
|
69
|
+
actions render more consistently across Discord, Slack, and
|
|
70
|
+
gateway-managed approval surfaces.
|
|
71
|
+
|
|
5
72
|
## [0.12.3](https://github.com/HybridAIOne/hybridclaw/tree/v0.12.3)
|
|
6
73
|
|
|
7
74
|
### Added
|
|
@@ -50,6 +117,9 @@
|
|
|
50
117
|
- **Telegram config reload behavior**: Running gateways now restart the
|
|
51
118
|
Telegram integration automatically when `telegram.*` config changes land, so
|
|
52
119
|
most setup edits apply within a few seconds without a full gateway restart.
|
|
120
|
+
- **Per-agent skill allowlists**: Agent `skills` settings now narrow the
|
|
121
|
+
globally enabled skill set, while omitting `skills` keeps the existing
|
|
122
|
+
globally enabled scope for backward compatibility.
|
|
53
123
|
|
|
54
124
|
### Fixed
|
|
55
125
|
|
package/README.md
CHANGED
|
@@ -19,10 +19,29 @@ security, and operational visibility. It combines sandboxed execution, secure
|
|
|
19
19
|
credentials, approvals, persistent memory, and admin surfaces behind a single
|
|
20
20
|
gateway.
|
|
21
21
|
|
|
22
|
-
Connect it to Discord, WhatsApp, Telegram, Microsoft Teams, email, or the web. Run it
|
|
22
|
+
Connect it to Discord, Slack, WhatsApp, Telegram, Microsoft Teams, email, or the web. Run it
|
|
23
23
|
locally, deploy it for business workflows, and keep your agents, secrets, and
|
|
24
24
|
data under your control.
|
|
25
25
|
|
|
26
|
+
[Quick Start](https://www.hybridclaw.io/docs/getting-started/quickstart) ·
|
|
27
|
+
[Installation](https://www.hybridclaw.io/docs/getting-started/installation) ·
|
|
28
|
+
[Configuration](https://www.hybridclaw.io/docs/reference/configuration) ·
|
|
29
|
+
[Migration](https://www.hybridclaw.io/docs/reference/commands#migration) ·
|
|
30
|
+
[Contributing](./CONTRIBUTING.md) ·
|
|
31
|
+
[Support](./SUPPORT.md)
|
|
32
|
+
|
|
33
|
+
## Pick your path
|
|
34
|
+
|
|
35
|
+
- Want the shortest path to a running assistant? Start with
|
|
36
|
+
[Quick Start](https://www.hybridclaw.io/docs/getting-started/quickstart).
|
|
37
|
+
- Want the full setup flow with providers, channels, and admin surfaces? Start
|
|
38
|
+
with [Installation](https://www.hybridclaw.io/docs/getting-started/installation)
|
|
39
|
+
and [Authentication](https://www.hybridclaw.io/docs/getting-started/authentication).
|
|
40
|
+
- Want to migrate from OpenClaw or Hermes? Start with the
|
|
41
|
+
[migration commands](https://www.hybridclaw.io/docs/reference/commands#migration).
|
|
42
|
+
- Want to contribute from source? Start with [CONTRIBUTING.md](./CONTRIBUTING.md)
|
|
43
|
+
and the maintainer docs under [docs/content/README.md](./docs/content/README.md).
|
|
44
|
+
|
|
26
45
|
## Coming from OpenClaw or Hermes?
|
|
27
46
|
|
|
28
47
|
```bash
|
|
@@ -58,7 +77,8 @@ hybridclaw tui
|
|
|
58
77
|
Open locally:
|
|
59
78
|
|
|
60
79
|
- Chat UI: `http://127.0.0.1:9090/chat`
|
|
61
|
-
- Admin UI: `http://127.0.0.1:9090/admin` for channels,
|
|
80
|
+
- Admin UI: `http://127.0.0.1:9090/admin` for channels, versioned agent files,
|
|
81
|
+
scheduler, audit, and config
|
|
62
82
|
- Agents UI: `http://127.0.0.1:9090/agents`
|
|
63
83
|
- OpenAI-compatible API: `http://127.0.0.1:9090/v1/models` and `http://127.0.0.1:9090/v1/chat/completions`
|
|
64
84
|
|
|
@@ -73,9 +93,25 @@ operator and maintainer manual lives at
|
|
|
73
93
|
Once the gateway is running, open HybridClaw locally:
|
|
74
94
|
|
|
75
95
|
- Web Chat: `http://127.0.0.1:9090/chat`
|
|
76
|
-
- Admin Console: `http://127.0.0.1:9090/admin` for channels,
|
|
96
|
+
- Admin Console: `http://127.0.0.1:9090/admin` for channels, versioned agent files,
|
|
97
|
+
scheduler, audit, and config
|
|
77
98
|
- Agent Dashboard: `http://127.0.0.1:9090/agents`
|
|
78
|
-
- or connect WhatsApp, Telegram, Discord, Microsoft Teams, Email
|
|
99
|
+
- or connect Slack, WhatsApp, Telegram, Discord, Microsoft Teams, Email
|
|
100
|
+
|
|
101
|
+
## Operator workflows
|
|
102
|
+
|
|
103
|
+
- `/admin/agents` edits allowlisted bootstrap markdown files such as
|
|
104
|
+
`AGENTS.md`, keeps saved revisions, and restores earlier versions from the
|
|
105
|
+
browser.
|
|
106
|
+
- `hybridclaw tui` includes a keyboard-driven approval picker and prints a
|
|
107
|
+
ready-to-run `hybridclaw tui --resume <sessionId>` command on exit.
|
|
108
|
+
- `hybridclaw onboarding` and related local setup flows can restore the last
|
|
109
|
+
known-good saved config snapshot or roll back to a tracked revision when
|
|
110
|
+
`config.json` becomes invalid.
|
|
111
|
+
- Channel delivery stays predictable: email seeds its first mailbox cursor from
|
|
112
|
+
the current head instead of replaying old inbox mail, retry-aware transports
|
|
113
|
+
honor server `Retry-After` backoff, and WhatsApp startup avoids intermittent
|
|
114
|
+
init-query bad-request failures.
|
|
79
115
|
|
|
80
116
|
## How HybridClaw compares
|
|
81
117
|
|
|
@@ -111,6 +147,7 @@ Once the gateway is running, open HybridClaw locally:
|
|
|
111
147
|
## Built for real workflows
|
|
112
148
|
|
|
113
149
|
- channels
|
|
150
|
+
- versioned agent workspace prompt files with saved revisions and restore
|
|
114
151
|
- browser sessions
|
|
115
152
|
- office docs
|
|
116
153
|
- skills / plugins / MCP
|
|
@@ -124,10 +161,11 @@ Once the gateway is running, open HybridClaw locally:
|
|
|
124
161
|
|
|
125
162
|
## Architecture
|
|
126
163
|
|
|
127
|
-
- **Gateway service** (Node.js) — shared message/command handlers, SQLite persistence (KV + semantic + knowledge graph + canonical sessions + usage events), scheduler, heartbeat, web/API, loopback OpenAI-compatible API, and channel integrations for Discord, Microsoft Teams, Telegram, iMessage, WhatsApp, and email
|
|
164
|
+
- **Gateway service** (Node.js) — shared message/command handlers, SQLite persistence (KV + semantic + knowledge graph + canonical sessions + usage events), scheduler, heartbeat, web/API, loopback OpenAI-compatible API, and channel integrations for Discord, Slack, Microsoft Teams, Telegram, iMessage, WhatsApp, and email
|
|
128
165
|
- **TUI client** — thin client over HTTP (`/api/chat`, `/api/command`) with
|
|
129
166
|
a structured startup banner that surfaces model, sandbox, gateway, and
|
|
130
|
-
chatbot context before the first prompt
|
|
167
|
+
chatbot context before the first prompt, an interactive approval picker for
|
|
168
|
+
pending approvals, and an exit summary with a ready-to-run resume command
|
|
131
169
|
- **Container** (Docker, ephemeral) — HybridAI API client, sandboxed tool executor, and preinstalled browser automation runtime with cursor-aware snapshots for JS-heavy custom UI
|
|
132
170
|
- Communication via file-based IPC (input.json / output.json)
|
|
133
171
|
|
|
@@ -141,8 +179,8 @@ Browse the full manual at
|
|
|
141
179
|
[Authentication](https://www.hybridclaw.io/docs/getting-started/authentication), and
|
|
142
180
|
[Quick Start](https://www.hybridclaw.io/docs/getting-started/quickstart)
|
|
143
181
|
- Enterprise deployment:
|
|
144
|
-
[Runtime Internals](https://www.hybridclaw.io/docs/
|
|
145
|
-
[Architecture](https://www.hybridclaw.io/docs/
|
|
182
|
+
[Runtime Internals](https://www.hybridclaw.io/docs/developer-guide/runtime) and
|
|
183
|
+
[Architecture](https://www.hybridclaw.io/docs/developer-guide/architecture)
|
|
146
184
|
- Operations:
|
|
147
185
|
[Remote Access](https://www.hybridclaw.io/docs/guides/remote-access)
|
|
148
186
|
- Security:
|
|
@@ -151,9 +189,15 @@ Browse the full manual at
|
|
|
151
189
|
[Commands: Migration](https://www.hybridclaw.io/docs/reference/commands#migration) and
|
|
152
190
|
[FAQ](https://www.hybridclaw.io/docs/reference/faq#can-i-migrate-an-existing-openclaw-or-hermes-agent-home)
|
|
153
191
|
- Channels:
|
|
154
|
-
[Channel
|
|
155
|
-
[
|
|
156
|
-
[
|
|
192
|
+
[Connect Your First Channel](https://www.hybridclaw.io/docs/getting-started/first-channel),
|
|
193
|
+
[Overview](https://www.hybridclaw.io/docs/channels/overview),
|
|
194
|
+
[Discord](https://www.hybridclaw.io/docs/channels/discord),
|
|
195
|
+
[Slack](https://www.hybridclaw.io/docs/channels/slack),
|
|
196
|
+
[Telegram](https://www.hybridclaw.io/docs/channels/telegram),
|
|
197
|
+
[Email](https://www.hybridclaw.io/docs/channels/email),
|
|
198
|
+
[WhatsApp](https://www.hybridclaw.io/docs/channels/whatsapp),
|
|
199
|
+
[iMessage](https://www.hybridclaw.io/docs/channels/imessage), and
|
|
200
|
+
[Microsoft Teams](https://www.hybridclaw.io/docs/channels/msteams)
|
|
157
201
|
- Skills and plugins:
|
|
158
202
|
[Extensibility](https://www.hybridclaw.io/docs/extensibility),
|
|
159
203
|
[Bundled Skills](https://www.hybridclaw.io/docs/guides/bundled-skills),
|
|
@@ -170,20 +214,27 @@ Browse the full manual at
|
|
|
170
214
|
|
|
171
215
|
## Contributing
|
|
172
216
|
|
|
173
|
-
|
|
217
|
+
Contributor quick start:
|
|
174
218
|
|
|
175
219
|
```bash
|
|
176
220
|
npm install
|
|
177
221
|
npm run setup
|
|
178
222
|
npm run build
|
|
223
|
+
npm run typecheck
|
|
224
|
+
npm run test:unit
|
|
179
225
|
```
|
|
180
226
|
|
|
181
227
|
Use `npm run typecheck`, `npm run lint`, and targeted tests for code changes.
|
|
182
|
-
For docs-only changes, verify links, commands, and examples.
|
|
183
|
-
|
|
228
|
+
For docs-only changes, verify links, commands, and examples. GitHub issue forms
|
|
229
|
+
cover bug reports, setup help, feature requests, and docs fixes, and the PR
|
|
230
|
+
template asks for validation and scope boundaries up front. See
|
|
231
|
+
[CONTRIBUTING.md](./CONTRIBUTING.md) for the full workflow, check matrix, and
|
|
232
|
+
community guidance.
|
|
184
233
|
|
|
185
234
|
## Community
|
|
186
235
|
|
|
187
236
|
- Discord: [discord.gg/jsVW4vJw27](https://discord.gg/jsVW4vJw27)
|
|
188
237
|
- Issues: [github.com/HybridAIOne/hybridclaw/issues](https://github.com/HybridAIOne/hybridclaw/issues)
|
|
189
238
|
- Discussions: [github.com/HybridAIOne/hybridclaw/discussions](https://github.com/HybridAIOne/hybridclaw/discussions)
|
|
239
|
+
- Support guide: [SUPPORT.md](./SUPPORT.md)
|
|
240
|
+
- Community standards: [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md)
|
package/SECURITY.md
CHANGED
|
@@ -20,7 +20,7 @@ System prompts include safety constraints for every conversation turn:
|
|
|
20
20
|
- Do not exfiltrate credentials, tokens, or private keys.
|
|
21
21
|
- Prefer least-privilege actions and avoid destructive operations without explicit intent.
|
|
22
22
|
|
|
23
|
-
Implementation: [src/prompt-hooks.ts](./src/prompt-hooks.ts)
|
|
23
|
+
Implementation: [src/agent/prompt-hooks.ts](./src/agent/prompt-hooks.ts)
|
|
24
24
|
|
|
25
25
|
### 1.1) Browser Authentication Flows
|
|
26
26
|
|
|
@@ -67,7 +67,8 @@ Tool execution runs inside Docker with sandbox constraints:
|
|
|
67
67
|
- controlled workspace/IPC mounts
|
|
68
68
|
- additional mount allowlist validation
|
|
69
69
|
|
|
70
|
-
Implementation: [src/container-runner.ts](./src/container-runner.ts),
|
|
70
|
+
Implementation: [src/infra/container-runner.ts](./src/infra/container-runner.ts),
|
|
71
|
+
[src/security/mount-security.ts](./src/security/mount-security.ts)
|
|
71
72
|
|
|
72
73
|
### 4) Session Isolation
|
|
73
74
|
|
|
@@ -123,3 +124,20 @@ If compromise is suspected:
|
|
|
123
124
|
3. Review mount allowlist, workspace files, and `sessionRouting.identityLinks`.
|
|
124
125
|
4. Inspect denied/authorization events with `hybridclaw audit approvals --denied`.
|
|
125
126
|
5. Validate audit integrity with `hybridclaw audit verify`.
|
|
127
|
+
|
|
128
|
+
## Reporting A Vulnerability
|
|
129
|
+
|
|
130
|
+
Do not report security vulnerabilities in public GitHub issues or Discussions.
|
|
131
|
+
|
|
132
|
+
Report vulnerabilities privately to
|
|
133
|
+
[support@hybridai.one](mailto:support@hybridai.one?subject=HybridClaw%20security%20report)
|
|
134
|
+
with:
|
|
135
|
+
|
|
136
|
+
- affected HybridClaw version
|
|
137
|
+
- deployment details and operating system
|
|
138
|
+
- reproduction steps or proof-of-concept
|
|
139
|
+
- impact assessment
|
|
140
|
+
- suggested mitigation if you have one
|
|
141
|
+
|
|
142
|
+
Please redact secrets, tokens, and personal data from any attached logs or
|
|
143
|
+
screenshots.
|
package/config.example.json
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"channelDisabled": {
|
|
13
13
|
"discord": [],
|
|
14
14
|
"msteams": [],
|
|
15
|
+
"slack": [],
|
|
15
16
|
"telegram": [],
|
|
16
17
|
"whatsapp": [],
|
|
17
18
|
"email": []
|
|
@@ -122,6 +123,17 @@
|
|
|
122
123
|
"teams.microsoft.com"
|
|
123
124
|
]
|
|
124
125
|
},
|
|
126
|
+
"slack": {
|
|
127
|
+
"enabled": false,
|
|
128
|
+
"groupPolicy": "allowlist",
|
|
129
|
+
"dmPolicy": "allowlist",
|
|
130
|
+
"allowFrom": [],
|
|
131
|
+
"groupAllowFrom": [],
|
|
132
|
+
"requireMention": true,
|
|
133
|
+
"textChunkLimit": 12000,
|
|
134
|
+
"replyStyle": "thread",
|
|
135
|
+
"mediaMaxMb": 20
|
|
136
|
+
},
|
|
125
137
|
"telegram": {
|
|
126
138
|
"enabled": false,
|
|
127
139
|
"botToken": "",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._backdrop_1aapm_1{z-index:50;background:#0a0f1980;animation:.15s _dialogFadeIn_1aapm_1;position:fixed;inset:0}._viewport_1aapm_9{z-index:51;pointer-events:none;place-items:center;padding:24px;display:grid;position:fixed;inset:0}._content_1aapm_19{pointer-events:auto;background:var(--panel-bg);width:100%;max-width:440px;max-height:calc(100vh - 48px);color:var(--text);border:1px solid var(--line);border-radius:var(--radius-lg);box-shadow:var(--shadow-popover);gap:20px;padding:24px;animation:.15s _dialogSlideIn_1aapm_1;display:grid;overflow-y:auto}._sm_1aapm_36{max-width:360px}._lg_1aapm_40{max-width:560px}._header_1aapm_44{gap:8px;display:grid}._title_1aapm_49{letter-spacing:-.01em;margin:0;font-size:1.1rem;font-weight:600;line-height:1.3}._description_1aapm_57{color:var(--muted-foreground);margin:0;line-height:1.5}._footer_1aapm_63{justify-content:flex-end;gap:10px;display:flex}@keyframes _dialogFadeIn_1aapm_1{0%{opacity:0}}@keyframes _dialogSlideIn_1aapm_1{0%{opacity:0;transform:scale(.96)translateY(4px)}}._backdrop_1aapm_1._exiting_1aapm_82{animation:.15s forwards _dialogFadeOut_1aapm_1}._content_1aapm_19._exiting_1aapm_82{animation:.15s forwards _dialogSlideOut_1aapm_1}@keyframes _dialogFadeOut_1aapm_1{to{opacity:0}}@keyframes _dialogSlideOut_1aapm_1{to{opacity:0;transform:scale(.96)translateY(4px)}}@media (prefers-reduced-motion:reduce){._backdrop_1aapm_1,._content_1aapm_19,._backdrop_1aapm_1._exiting_1aapm_82,._content_1aapm_19._exiting_1aapm_82{animation:none}}._trigger_sn70v_1{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-bg);color:var(--text);cursor:pointer;align-items:center;gap:4px;padding:6px 8px;display:inline-flex}._trigger_sn70v_1:hover{border-color:var(--line-strong)}._content_sn70v_17{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-bg);width:max-content;min-width:160px;box-shadow:var(--shadow-dropdown);z-index:50;padding:4px;position:fixed}._item_sn70v_29{width:100%;color:var(--text);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:8px;padding:8px 10px;font-size:.875rem;display:flex}._item_sn70v_29:hover{background:var(--panel-muted)}._item_sn70v_29[data-active=true]{background:var(--accent-soft);color:var(--accent-foreground)}._overlay_185qr_1{z-index:40;opacity:0;pointer-events:none;cursor:default;background:#0a0f1980;border:0;padding:0;transition:opacity .18s;position:fixed;inset:0}._overlayVisible_185qr_14{opacity:1;pointer-events:auto}._content_185qr_19{z-index:50;background:var(--sidebar-bg,var(--page-bg));color:var(--sidebar-fg);border:1px solid var(--sidebar-border,var(--line));box-shadow:var(--shadow-dropdown);grid-template-rows:auto minmax(0,1fr) auto;transition:transform .18s;display:grid;position:fixed;overflow:hidden}._left_185qr_34{width:var(--sheet-width,18rem);border-top:0;border-bottom:0;border-left:0;top:0;bottom:0;left:0;transform:translate(calc(-100% - 24px))}._right_185qr_45{width:var(--sheet-width,18rem);border-top:0;border-bottom:0;border-right:0;top:0;bottom:0;right:0;transform:translate(calc(100% + 24px))}._top_185qr_56{height:var(--sheet-height,50vh);border-top:0;border-left:0;border-right:0;top:0;left:0;right:0;transform:translateY(calc(-100% - 24px))}._bottom_185qr_67{height:var(--sheet-height,50vh);border-bottom:0;border-left:0;border-right:0;bottom:0;left:0;right:0;transform:translateY(calc(100% + 24px))}._contentOpen_185qr_78{transform:translate(0)}._srOnly_185qr_84{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._layout_crl1d_1{--sidebar-width:15.5rem;--sidebar-width-icon:4rem;--sidebar-width-mobile:18rem;background:var(--page-bg);min-height:100vh;display:flex}._root_crl1d_10{z-index:30;width:var(--sidebar-width);border-right:1px solid var(--sidebar-border);background:var(--sidebar-bg);height:100vh;color:var(--sidebar-fg);grid-template-rows:auto minmax(0,1fr) auto;transition:width .18s,transform .18s;display:grid;position:sticky;top:0;overflow:visible}._header_crl1d_27,._footer_crl1d_28{z-index:1;background:inherit;padding:12px;position:relative}._header_crl1d_27{padding-top:14px;padding-bottom:8px}._content_crl1d_40{align-content:start;gap:14px;min-height:0;padding:6px 12px 12px;display:grid;overflow-y:auto}._footer_crl1d_28{border-top:1px solid var(--sidebar-border);padding-top:10px;padding-bottom:14px;display:block}._inset_crl1d_56{flex-direction:column;flex:auto;min-width:0;min-height:100dvh;display:flex}._trigger_crl1d_64{border:1px solid var(--line);background:var(--background);color:var(--muted-foreground);cursor:pointer;border-radius:var(--radius-md);justify-content:center;align-items:center;width:36px;height:36px;transition:color .12s,border-color .12s,background .12s;display:inline-flex}._trigger_crl1d_64:hover{color:var(--text);background:var(--accent-soft);border-color:var(--line-strong)}._trigger_crl1d_64 svg{width:18px;height:18px}._group_crl1d_97,._groupContent_crl1d_98{gap:8px;display:grid}._eyebrow_crl1d_107{text-transform:uppercase;letter-spacing:.08em;color:var(--muted-foreground);margin:0;font-size:.64rem;font-weight:600}._groupLabel_crl1d_116{color:var(--muted-foreground);align-items:center;gap:8px;margin:0;padding:0 8px;font-size:.64rem;font-weight:500;display:flex}._groupLabel_crl1d_116:after{content:"";background:var(--sidebar-border);flex:1;height:1px}._menu_crl1d_134{gap:2px;display:grid}._menuItem_crl1d_139{display:grid}._menuButton_crl1d_143{border-radius:var(--radius-sm);min-height:34px;color:var(--sidebar-fg);white-space:nowrap;background:0 0;border:1px solid #0000;align-items:center;gap:8px;padding:7px 10px;font-size:.875rem;font-weight:500;text-decoration:none;transition:background .12s,border-color .12s,color .12s;display:flex;overflow:hidden}._menuButton_crl1d_143:hover{background:var(--accent-soft);color:var(--text)}._menuButtonActive_crl1d_169{background:var(--accent-soft);border-color:var(--line);color:var(--accent-foreground)}._brand_crl1d_175{padding:2px 6px;display:grid}._brandTitle_crl1d_180{align-items:flex-start;gap:10px;min-height:34px;display:flex}._brandText_crl1d_187{gap:1px;min-width:0;padding-top:1px;display:grid}._brandTitle_crl1d_180 h1{letter-spacing:-.01em;margin:0;font-size:.9rem;font-weight:600;line-height:1.1}._brandMark_crl1d_202,._menuIcon_crl1d_203,._icon_crl1d_204{flex:none;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex}._brandMark_crl1d_202{border-radius:var(--radius-sm);width:32px;height:32px;color:var(--accent-foreground)}._menuIcon_crl1d_203{color:var(--muted-foreground)}._menuButtonActive_crl1d_169 ._menuIcon_crl1d_203{color:var(--accent-foreground)}._brandMark_crl1d_202 svg{width:32px;height:32px}._menuIcon_crl1d_203 svg,._icon_crl1d_204 svg{width:16px;height:16px}._footerMeta_crl1d_239{align-items:center;display:flex}._footerValue_crl1d_244{color:var(--sidebar-fg);padding:0 8px;font-size:.75rem;font-weight:500;line-height:1}._footerBlock_crl1d_252{justify-content:space-between;align-items:center;gap:6px;display:flex}._footerDivider_crl1d_259{background:var(--sidebar-border);height:1px;margin:6px 0}._footerActions_crl1d_265,._footerMenu_crl1d_266,._footerAction_crl1d_265{align-items:stretch;display:flex}._footerActions_crl1d_265{flex:none}._footerMenu_crl1d_266{flex-direction:row;gap:6px}._footerButton_crl1d_281{border-radius:var(--radius-sm);min-height:34px;color:var(--sidebar-fg);cursor:pointer;background:0 0;border:1px solid #0000;align-items:center;gap:8px;padding:7px 10px;font-size:.875rem;font-weight:500;transition:background .12s,border-color .12s,color .12s;display:inline-flex}._footerButton_crl1d_281:hover{background:var(--accent-soft);color:var(--text)}._root_crl1d_10[data-state=collapsed]{width:var(--sidebar-width-icon);overflow:hidden}._root_crl1d_10[data-state=collapsed] ._groupLabel_crl1d_116,._root_crl1d_10[data-state=collapsed] ._brandText_crl1d_187,._root_crl1d_10[data-state=collapsed] ._footerMeta_crl1d_239,._root_crl1d_10[data-state=collapsed] ._footerDivider_crl1d_259,._root_crl1d_10[data-state=collapsed] ._footerButton_crl1d_281 span:not(._icon_crl1d_204),._root_crl1d_10[data-state=collapsed] ._themeToggleLabel_crl1d_317{display:none}._root_crl1d_10[data-state=collapsed] ._menuButton_crl1d_143{justify-content:center;padding:7px}._root_crl1d_10[data-state=collapsed] ._menuButton_crl1d_143>span:not(._menuIcon_crl1d_203){display:none}@media (width<=780px){._header_crl1d_27,._content_crl1d_40,._footer_crl1d_28{padding-left:16px;padding-right:16px}}._viewport_1175c_1{z-index:100;pointer-events:none;outline:none;gap:8px;width:380px;max-width:calc(100vw - 48px);display:grid;position:fixed;bottom:24px;right:24px}._viewport_1175c_1:empty{display:none}._toast_1175c_18{pointer-events:auto;border-radius:var(--radius-md);border:1px solid color-mix(in srgb, var(--line) 72%, transparent);background:color-mix(in srgb, var(--panel-bg) 76%, transparent);color:var(--text);box-shadow:var(--shadow-raised);-webkit-backdrop-filter:blur(12px)saturate(120%);align-items:flex-start;gap:12px;padding:14px 16px;animation:.2s _toastSlideIn_1175c_1;display:flex}._toast_1175c_18._exiting_1175c_34{animation:.2s forwards _toastSlideOut_1175c_1}._body_1175c_40{flex:auto;gap:4px;min-width:0;display:grid}._title_1175c_47{margin:0;font-size:.875rem;font-weight:600;line-height:1.35}._description_1175c_54{color:var(--muted-foreground);margin:0;font-size:.8125rem;line-height:1.45}._success_1175c_63{background:color-mix(in srgb, var(--success-soft) 68%, transparent);border-color:color-mix(in srgb, var(--success-border) 72%, transparent)}._success_1175c_63 ._title_1175c_47{color:var(--success)}._error_1175c_72{background:color-mix(in srgb, var(--danger-soft) 68%, transparent);border-color:color-mix(in srgb, var(--danger-border) 72%, transparent)}._error_1175c_72 ._title_1175c_47{color:var(--danger)}._info_1175c_81{background:color-mix(in srgb, var(--accent) 68%, transparent);border-color:color-mix(in srgb, var(--primary) 24%, transparent)}._info_1175c_81 ._title_1175c_47{color:var(--primary)}._actions_1175c_92{flex:none;align-items:center;gap:6px;display:flex}._actionButton_1175c_99{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-bg);color:var(--text);cursor:pointer;padding:4px 10px;font-size:.8125rem;font-weight:500}._actionButton_1175c_99:hover{border-color:var(--line-strong)}._closeButton_1175c_114{width:24px;height:24px;color:var(--muted-foreground);cursor:pointer;background:0 0;border:none;border-radius:6px;place-items:center;padding:0;font-size:1.1rem;line-height:1;display:grid}._closeButton_1175c_114:hover{background:var(--panel-muted);color:var(--text)}@keyframes _toastSlideIn_1175c_1{0%{opacity:0;transform:translate(16px)}}@keyframes _toastSlideOut_1175c_1{to{opacity:0;transform:translate(16px)}}@media (prefers-reduced-motion:reduce){._toast_1175c_18,._toast_1175c_18._exiting_1175c_34{animation:none}}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--background:#fff;--foreground:#1f2937;--card:#fff;--card-foreground:#1f2937;--popover:#fff;--popover-foreground:#1f2937;--muted:#f8fafc;--muted-foreground:#64748b;--border:#e5e7eb;--border-strong:#d1d5db;--input:#e5e7eb;--ring:#4a6cf7;--primary:#4a6cf7;--primary-foreground:#fff;--secondary:#f1f5f9;--secondary-foreground:#1f2937;--accent:#eef2ff;--accent-foreground:#4a6cf7;--destructive:#b42318;--destructive-foreground:#fff;--success:#0f766e;--success-foreground:#fff;--success-soft:#ecfdf5;--danger:#b42318;--danger-soft:#fef3f2;--sidebar:#f1f5f9;--sidebar-foreground:#1f2937;--sidebar-border:#e5e7eb;--terminal:#0f172a;--terminal-foreground:#cbd5e1;--terminal-overlay-start:#0f172ac2;--terminal-overlay-end:#0f172aeb;--editor:#0f172a;--editor-border:#334155;--editor-foreground:#e2e8f0;--status-success-border:#bbf7d0;--success-border:#a7f3d0;--danger-border:#fecaca;--status-idle:#94a3b8;--jobs-board:#fcfcfd;--jobs-empty:#f8fafca6;--jobs-card-border:#ebeef3;--jobs-pill-success-bg:#eafaf3;--jobs-pill-success-fg:#109669;--jobs-column-backlog-rgb:203, 213, 225;--jobs-column-progress-rgb:147, 197, 253;--jobs-column-review-rgb:252, 211, 77;--jobs-column-success-rgb:134, 239, 172;--jobs-column-danger-rgb:252, 165, 165;--tone-progress:#bfdbfe;--tone-review:#fcd34d;--tone-success:#bbf7d0;--tone-danger:#fecaca;--shadow-popover:0 12px 32px #0f172a1f;--shadow-raised:0 1px 2px #0f172a14;--shadow-board:0 10px 32px #0f172a0d;--shadow-card:0 1px 2px #0f172a0a;--shadow-focus:0 0 0 1px #4a6cf72e;--shadow-dropdown:0 4px 12px #00000026;--shell-background:none;--shell-accent:none;--sidebar-surface:none;--panel-surface:none;--panel-border-subtle:transparent;--nav-hover:var(--panel-bg);--nav-active:var(--panel-bg);--nav-active-border:var(--line);--chip-surface:var(--panel-bg);--chrome-surface:var(--panel-muted);--page-bg:var(--background);--sidebar-bg:var(--sidebar);--panel-bg:var(--card);--panel-muted:var(--muted);--line:var(--border);--line-strong:var(--border-strong);--text:var(--foreground);--accent-soft:var(--accent)}:root,html[data-theme=light]{--sidebar-fg:var(--sidebar-foreground)}html[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--background:#0b1220;--foreground:#e5edf7;--card:#111827;--card-foreground:#e5edf7;--popover:#111827;--popover-foreground:#e5edf7;--muted:#0f172a;--muted-foreground:#93a4b8;--border:#1f2937;--border-strong:#263347;--input:#1f2937;--ring:#7da2ff;--primary:#7da2ff;--primary-foreground:#0b1220;--secondary:#0f172a;--secondary-foreground:#e5edf7;--accent:#162240;--accent-foreground:#a3c1ff;--destructive:#ff7b72;--destructive-foreground:#18181b;--success:#7ee3a5;--success-foreground:#03150f;--success-soft:#7ee3a529;--danger:#ff7b72;--danger-soft:#301614;--sidebar:#0b1220;--sidebar-foreground:#c7d2e3;--sidebar-border:#1f2937;--terminal:#0f172a;--terminal-foreground:#e2e8f0;--terminal-overlay-start:#0b1220c2;--terminal-overlay-end:#0b1220eb;--editor:#0f172a;--editor-border:#263347;--editor-foreground:#e2e8f0;--status-success-border:#18594b;--success-border:#18594b;--danger-border:#6a2220;--status-idle:#5f7287;--jobs-board:#0f172a;--jobs-empty:#0f172acc;--jobs-card-border:#263347;--jobs-pill-success-bg:#7ee3a529;--jobs-pill-success-fg:#7ee3a5;--jobs-column-backlog-rgb:77, 101, 124;--jobs-column-progress-rgb:100, 140, 200;--jobs-column-review-rgb:214, 155, 64;--jobs-column-success-rgb:126, 227, 165;--jobs-column-danger-rgb:220, 108, 98;--tone-progress:#7da2ff;--tone-review:#d69b40;--tone-success:#7ee3a5;--tone-danger:#dc6c62;--shadow-popover:0 18px 48px #0000006b;--shadow-raised:0 8px 24px #00000038;--shadow-board:0 16px 40px #00000047;--shadow-card:0 12px 28px #0000002e;--shadow-focus:0 0 0 1px color-mix(in srgb, var(--primary) 36%, transparent), 0 0 0 5px color-mix(in srgb, var(--primary) 14%, transparent);--shadow-dropdown:0 16px 40px #0000006b;--shell-background:none;--shell-accent:none;--sidebar-surface:none;--panel-surface:none;--panel-border-subtle:transparent;--nav-hover:var(--panel-bg);--nav-active:var(--panel-bg);--nav-active-border:color-mix(in srgb, var(--primary) 32%, var(--border));--chip-surface:var(--panel-bg);--chrome-surface:var(--panel-muted);--page-bg:var(--background);--sidebar-bg:var(--sidebar);--panel-bg:var(--card);--panel-muted:var(--muted);--line:var(--border);--line-strong:var(--border-strong);--text:var(--foreground);--accent-soft:var(--accent);--sidebar-fg:var(--sidebar-foreground)}:root{--radius-lg:14px;--radius-md:10px;--radius-sm:8px;--control-height:44px;--control-line-height:22px;--control-padding-y:10px;--sans:system-ui, ui-sans-serif, -apple-system, BlinkMacSystemFont, Inter, NotoSansHans, sans-serif}*{box-sizing:border-box}html,body,#root{min-height:100%}body{background:var(--page-bg);color:var(--text);font-family:var(--sans);margin:0}button,input,select,textarea{font:inherit}code{font-family:SFMono-Regular,JetBrains Mono,Fira Code,monospace}.main-panel{flex-direction:column;min-width:0;padding:24px;display:flex}.page-content,.page-stack,.detail-stack,.stack-form,.list-stack,.field,.config-section{gap:12px;display:grid}.page-content{flex:auto;min-height:0}.topbar h2,.panel h4,.login-card h1{letter-spacing:-.02em;margin:0;font-weight:600}.topbar h2{font-size:clamp(1.9rem,2.4vw,2.35rem)}.panel h4{font-size:1rem}.eyebrow{text-transform:uppercase;letter-spacing:.08em;color:var(--muted-foreground);margin:0;font-size:.74rem;font-weight:700}.supporting-text,.metric-card small,.list-row small,.summary-block span,.key-value-grid span{color:var(--muted-foreground);margin:0}.inline-popover{margin-top:4px;display:inline-block;position:relative}.inline-popover summary{list-style:none}.inline-popover summary::-webkit-details-marker{display:none}.inline-popover-trigger{color:var(--muted-foreground);cursor:pointer;text-decoration:underline;-webkit-text-decoration-color:var(--line-strong);text-decoration-color:var(--line-strong);text-underline-offset:2px;background:0 0;border:0;align-items:center;gap:6px;padding:0;font-size:.875rem;line-height:1.35;display:inline-flex}.inline-popover-trigger:hover{color:var(--text)}.inline-popover-panel{z-index:20;border:1px solid var(--line);border-radius:var(--radius-md);background:var(--panel-bg);width:min(360px,70vw);box-shadow:var(--shadow-popover);padding:12px;position:absolute;top:calc(100% + 8px);left:0}.inline-popover-header{color:var(--muted-foreground);text-transform:uppercase;letter-spacing:.08em;margin-bottom:8px;font-size:.8rem;font-weight:700}.inline-popover-list{gap:10px;display:grid}.inline-popover-entry{gap:4px;display:grid}.inline-popover-entry strong{font-size:.88rem;line-height:1.3}.inline-popover-entry small,.inline-popover-entry p{color:var(--muted-foreground);margin:0}.inline-popover-entry p{color:var(--text);overflow-wrap:anywhere;word-break:break-word}.nav-link-icon{flex:none;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex}.nav-link-icon svg{width:16px;height:16px}.button-row,.header-actions{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.topbar{justify-content:space-between;align-items:center;gap:16px;margin-bottom:14px;padding-bottom:12px;display:flex}.topbar-title{flex:auto;min-width:0;overflow:hidden}.topbar-heading{align-items:center;gap:12px;min-width:0;display:flex}.topbar-title h2{text-overflow:ellipsis;white-space:nowrap;line-height:1.05;overflow:hidden}.topbar-sidebar-trigger{flex:none;display:none}@media (width<=1080px){.topbar-sidebar-trigger{display:inline-flex}}.view-switch{border:1px solid var(--line);background:var(--chrome-surface);border-radius:999px;flex-wrap:wrap;align-items:center;gap:8px;padding:6px;display:inline-flex}.view-switch-link{color:var(--muted-foreground);border-radius:999px;align-items:center;gap:8px;padding:9px 14px;font-weight:600;text-decoration:none;display:inline-flex}.view-switch-link:hover{color:var(--text)}.view-switch-link.active{background:var(--nav-active);color:var(--accent-foreground);box-shadow:var(--shadow-raised)}.meta-chip,.status-pill{border:1px solid var(--line);background:var(--chip-surface);color:var(--muted-foreground);border-radius:999px;align-items:center;gap:8px;padding:7px 10px;font-size:.84rem;font-weight:500;display:inline-flex}.status-pill-success{border-color:var(--status-success-border);background:var(--success-soft);color:var(--success)}.status-dot{background:var(--status-idle);border-radius:999px;width:8px;height:8px}.status-dot.live,.status-dot-success{background:var(--success)}.status-dot-danger{background:var(--danger)}.page-stack,.detail-stack,.stack-form,.list-stack,.page-content{gap:20px}.page-header{justify-content:space-between;align-items:center;gap:18px;display:flex}.page-header-description{max-width:62ch}.panel{border-radius:var(--radius-lg);border:1px solid var(--line);background:var(--panel-bg);padding:8px}.terminal-page{flex-direction:column;flex:auto;gap:10px;height:100%;min-height:0;display:flex}.terminal-panel-body{flex-direction:column;flex:auto;gap:16px;min-width:0;min-height:0;display:flex}.terminal-page .page-header .button-row{justify-content:flex-end}.terminal-page .page-header .status-pill{margin-right:6px}.terminal-page .page-header .header-actions{justify-content:flex-end;width:100%}.terminal-page .page-header{justify-content:flex-end}.terminal-page .page-header>span:first-child{display:none}.terminal-page .page-header .button-row{margin-bottom:4px}.terminal-shell{background:var(--terminal);border-radius:12px;flex:auto;width:100%;min-height:320px;display:flex;position:relative;overflow:hidden}.terminal-host{flex:auto;min-width:0;height:calc(100% - 12px);min-height:0;margin-bottom:12px;padding:4px 6px;overflow:hidden}.terminal-host .xterm{width:100%;min-width:0;max-width:100%;height:100%;overflow:hidden}.terminal-host .xterm-viewport{overflow-x:hidden}.terminal-host .xterm-screen{width:100%;max-width:100%}.terminal-empty-state{text-align:center;color:var(--terminal-foreground);background:linear-gradient(180deg, var(--terminal-overlay-start), var(--terminal-overlay-end));place-items:center;padding:24px;display:grid;position:absolute;inset:0}.terminal-empty-copy{white-space:nowrap}.terminal-error-banner{margin-top:16px}@media (width<=960px){.terminal-panel-body{gap:12px}}.panel.warm,.metric-card,.config-section,.empty-state,.summary-block,.key-value-grid div,.usage-stack{background:var(--panel-muted)}.panel-header{margin-bottom:16px}.metric-grid,.two-column-grid,.field-grid,.usage-grid,.config-grid,.key-value-grid{gap:16px;display:grid}.metric-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.two-column-grid{grid-template-columns:minmax(0,1.1fr) minmax(340px,.9fr)}.usage-grid,.field-grid,.config-grid,.key-value-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.metric-card{border-radius:var(--radius-md);border:1px solid var(--line);gap:6px;padding:14px 16px;display:grid}.metric-card-link{color:inherit;text-decoration:none}.metric-card-link:hover{border-color:var(--line-strong)}.metric-card strong{font-size:1.8rem;font-weight:700}.list-row,.selectable-row{border-radius:var(--radius-md);border:1px solid var(--line);background:var(--panel-bg);justify-content:space-between;align-items:flex-start;gap:12px;padding:12px 14px;display:flex}.list-row>div{flex:auto;gap:4px;min-width:0;display:grid}.list-row strong{overflow-wrap:anywhere;word-break:break-word;line-height:1.25;display:block}.list-row small{line-height:1.35;display:block}.list-row>span:last-child{white-space:nowrap;flex:none;padding-left:12px}.list-status{align-items:center;gap:8px;font-weight:500;display:inline-flex}.list-status-success{color:var(--success)}.list-status-danger{color:var(--danger)}.row-status-stack{text-align:right;flex:none;justify-items:end;gap:6px;padding-left:12px;display:grid}.row-status-stack small{color:var(--muted-foreground)}.row-status-stack .row-status-note-danger{color:var(--danger)}.selectable-row{text-align:left;cursor:pointer;width:100%;min-width:0}.selectable-row>div{flex:auto;gap:4px;min-width:0;display:grid}.selectable-row strong,.selectable-row small{display:block}.selectable-row strong{overflow-wrap:anywhere;word-break:break-word;line-height:1.25}.selectable-row small{line-height:1.35}.selectable-row.active{border-color:var(--accent);background:var(--accent-soft)}.channel-selectable-row{align-items:center}.channel-row-main{align-items:center;gap:12px;min-width:0;display:flex}.channel-row-copy{gap:4px;min-width:0;display:grid}.channel-logo{background:color-mix(in srgb, var(--panel-bg) 82%, white);border:1px solid color-mix(in srgb, var(--line) 78%, white);border-radius:14px;flex:none;place-items:center;width:42px;height:42px;display:grid;box-shadow:inset 0 1px #ffffff2e}.channel-logo svg{width:32px;height:32px}.channel-status-badge{border:1px solid var(--line);letter-spacing:.04em;text-transform:uppercase;border-radius:999px;justify-content:center;align-items:center;width:fit-content;margin-left:auto;padding:5px 10px;font-size:.76rem;font-weight:600;display:inline-flex}.channel-status-active{border-color:color-mix(in srgb, var(--success) 30%, var(--line));background:color-mix(in srgb, var(--success) 14%, transparent);color:var(--success)}.channel-status-configured{border-color:color-mix(in srgb, var(--accent) 30%, var(--line));background:color-mix(in srgb, var(--accent) 14%, transparent);color:var(--accent-strong)}.channel-status-available{color:var(--muted-foreground)}.table-shell{overflow-x:auto}table{border-collapse:collapse;width:100%}th,td{border-bottom:1px solid var(--line);text-align:left;vertical-align:top;padding:12px 10px}th{text-transform:uppercase;letter-spacing:.08em;color:var(--muted-foreground);font-size:.75rem}.table-sort-button{width:100%;color:inherit;font:inherit;text-transform:inherit;letter-spacing:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;padding:0;display:inline-flex}.table-sort-button:hover{color:var(--text)}.table-sort-button:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 55%, transparent);outline-offset:3px}.table-sort-indicator{flex:none;width:10px;height:12px;position:relative}.table-sort-indicator:before,.table-sort-indicator:after{content:"";opacity:.2;border-left:4px solid #0000;border-right:4px solid #0000;position:absolute;left:50%;transform:translate(-50%)}.table-sort-indicator:before{border-bottom:5px solid;top:0}.table-sort-indicator:after{border-top:5px solid;bottom:0}.table-sort-indicator.is-active:before,.table-sort-indicator.is-active:after{opacity:.12}.table-sort-indicator.is-active.is-asc:before,.table-sort-indicator.is-active.is-desc:after{opacity:.9}.field,.toggle-row,.config-section{gap:8px}.field input,.field select,.field textarea,.compact-search{width:100%;padding:var(--control-padding-y) 12px;border-radius:var(--radius-sm);border:1px solid var(--line-strong);background:var(--panel-bg);color:var(--text)}.field input,.field select,.compact-search{min-height:var(--control-height);height:var(--control-height);line-height:var(--control-line-height)}.managed-secret-field{align-content:start}.managed-secret-editor{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--panel-muted);gap:10px;padding:12px;display:grid}.whatsapp-pairing-field{align-content:start}.whatsapp-pairing-qr{border:1px solid var(--line);border-radius:var(--radius-md);color:#111827;white-space:pre;background:#fff;margin:0;padding:16px;font-family:ui-monospace,SFMono-Regular,SFMono,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.68rem;line-height:1;overflow-x:auto}.field textarea,.code-editor{resize:vertical}.toggle-row{grid-template-columns:auto 1fr;align-items:center;display:grid}.boolean-field{align-items:start}.boolean-pill{border:1px solid var(--line);text-transform:lowercase;border-radius:999px;align-items:center;gap:8px;width:fit-content;padding:6px 10px;font-size:.82rem;font-weight:600;display:inline-flex}.boolean-pill.is-on{background:var(--success-soft);border-color:var(--status-success-border);color:var(--success)}.boolean-pill.is-off{background:var(--panel-muted);border-color:var(--line-strong);color:var(--muted-foreground)}.boolean-pill.is-off.tone-danger{background:var(--danger-soft);border-color:var(--danger-border);color:var(--danger)}.boolean-pill-dot{background:currentColor;border-radius:999px;width:8px;height:8px}.binary-toggle{width:fit-content;border:1px solid var(--line-strong);background:var(--panel-bg);border-radius:999px;grid-auto-columns:1fr;grid-auto-flow:column;align-items:stretch;min-inline-size:0;margin:0;padding:0;display:inline-grid;overflow:hidden}.binary-toggle-button{min-width:max-content;color:var(--muted-foreground);cursor:pointer;text-align:center;text-transform:lowercase;white-space:nowrap;background:0 0;border:0;justify-content:center;align-items:center;padding:8px 12px;font-size:.9rem;display:inline-flex}.binary-toggle-button+.binary-toggle-button{border-left:1px solid var(--line-strong)}.binary-toggle-button.active{font-weight:600}.binary-toggle.boolean-toggle:has(.binary-toggle-button.active.is-on){border-color:var(--status-success-border);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--success) 18%, transparent)}.binary-toggle-button.active.is-on{background:var(--success-soft);color:var(--success)}.binary-toggle-button.active.is-off{background:var(--panel-muted);color:var(--text)}.binary-toggle-button:disabled{cursor:default;opacity:.65}.config-section{border-radius:var(--radius-md);border:1px solid var(--line);padding:16px}.primary-button,.ghost-button,.danger-button{border-radius:var(--radius-sm);cursor:pointer;border:1px solid #0000;padding:9px 12px}.primary-button{background:var(--primary);border-color:var(--primary);color:var(--primary-foreground)}.ghost-button{background:var(--panel-bg);border-color:var(--line-strong);color:var(--text)}.danger-button{background:var(--danger-soft);color:var(--danger);border-color:var(--danger-border)}.primary-button:disabled,.ghost-button:disabled,.danger-button:disabled{cursor:default;opacity:.72}.button-with-spinner{align-items:center;gap:8px;display:inline-flex}.button-spinner{border:2px solid;border-right-color:#0000;border-radius:999px;width:14px;height:14px;animation:.75s linear infinite button-spinner-rotate}@keyframes button-spinner-rotate{to{transform:rotate(360deg)}}.table-link-button{color:var(--text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;padding:0;font-weight:700}.table-link-button:hover{color:var(--accent)}.skill-review-actions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;display:flex}.empty-state,.success-banner,.error-banner,.summary-block{border-radius:var(--radius-md);border:1px solid var(--line);padding:14px 16px}.empty-state{color:var(--muted-foreground)}.empty-state.error,.error-banner{background:var(--danger-soft);border-color:var(--danger-border);color:var(--danger)}.success-banner{background:var(--success-soft);border-color:var(--success-border);color:var(--success)}.summary-block p{margin:0;line-height:1.55}.agent-file-meta{min-width:0}.agent-file-meta .supporting-text{color:var(--muted-foreground);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:.82rem;line-height:1.45;overflow:hidden}.agent-file-editor-title{color:var(--foreground);font-weight:700}.summary-block-header,.jobs-output-actions{justify-content:space-between;align-items:center;gap:10px;display:flex}.jobs-output-list{gap:12px;display:grid}.jobs-output-card{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--panel-bg);gap:10px;padding:12px;display:grid}.jobs-output-actions small{color:var(--muted-foreground)}.jobs-output-pre{white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;font:inherit;margin:0;line-height:1.55}.payload-block{white-space:pre-wrap;word-break:break-word;max-height:480px;margin:0;font-family:SFMono-Regular,JetBrains Mono,Fira Code,monospace;font-size:.88rem;line-height:1.45;overflow:auto}.sessions-layout,.selectable-list,.sessions-layout .panel,.sessions-layout .detail-stack,.session-row-main,.key-value-grid div{min-width:0}.mailbox-shell{background:var(--panel-bg);border-radius:18px;grid-template-columns:220px minmax(0,1fr);min-height:720px;display:grid;overflow:hidden}.mailbox-sidebar,.mailbox-main,.mailbox-detail{min-width:0}.mailbox-sidebar{background:var(--panel-muted);border-right:1px solid var(--line);align-content:start;gap:18px;padding:18px 12px 18px 0;display:grid}.mailbox-sidebar-section,.mailbox-folder-list,.mailbox-tag-list,.mailbox-message-metadata,.mailbox-thread-copy,.mailbox-detail-copy,.mailbox-message-list{gap:10px;display:grid}.mailbox-folder-button,.mailbox-thread-button{text-align:left;cursor:pointer;width:100%;min-width:0}.mailbox-folder-button{color:var(--text);background:0 0;border:0;border-radius:0 999px 999px 0;padding:0;display:block}.mailbox-folder-row{border-radius:0 999px 999px 0;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px 10px 18px;display:flex}.mailbox-folder-title{align-items:center;gap:12px;min-width:0;display:inline-flex}.mailbox-folder-symbol{width:1.25rem;height:1.25rem;color:var(--muted-foreground);flex:0 0 1.25rem;justify-content:center;align-items:center;line-height:1;display:inline-flex}.mailbox-folder-symbol svg{width:100%;height:100%}.mailbox-folder-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-weight:500;overflow:hidden}.mailbox-folder-button strong{color:var(--muted-foreground);flex:none;font-size:.95rem;font-weight:600}.mailbox-folder-button:hover .mailbox-folder-row{background:color-mix(in srgb, var(--accent-soft) 48%, transparent)}.mailbox-folder-button.is-emphasized .mailbox-folder-label,.mailbox-folder-button.is-emphasized strong{font-weight:700}.mailbox-folder-button.active .mailbox-folder-row{background:color-mix(in srgb, var(--accent-soft) 82%, white)}.mailbox-folder-button.active .mailbox-folder-symbol,.mailbox-folder-button.active .mailbox-folder-label,.mailbox-folder-button.active strong{color:var(--accent-strong)}.mailbox-tag-list{align-content:start}.mailbox-main{background:color-mix(in srgb, var(--panel-bg) 92%, var(--panel-muted));grid-template-rows:auto minmax(0,1fr);display:grid}.mailbox-column-header,.mailbox-detail-toolbar,.mailbox-detail-header,.mailbox-thread-top,.mailbox-thread-meta,.mailbox-message-header{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.mailbox-column-header{border-bottom:1px solid var(--line);background:var(--panel-bg);padding:16px 18px}.mailbox-column-actions,.mailbox-pagination{align-items:center;gap:10px;display:inline-flex}.mailbox-column-actions{flex-wrap:wrap;justify-content:flex-end}.mailbox-pagination small{color:var(--muted-foreground);white-space:nowrap}.mailbox-page-button{min-width:5.75rem}.mailbox-column-header strong,.mailbox-column-header small,.mailbox-thread-copy span,.mailbox-thread-copy small,.mailbox-message-header strong,.mailbox-message-header small{display:block}.mailbox-column-header small,.mailbox-thread-copy small,.mailbox-message-header small{color:var(--muted-foreground)}.mailbox-thread-list,.mailbox-message-list{min-height:0;overflow-y:auto}.mailbox-thread-list{background:linear-gradient(180deg, color-mix(in srgb, var(--panel-bg) 94%, transparent), color-mix(in srgb, var(--panel-muted) 20%, transparent));align-content:start;padding:0}.mailbox-thread-row{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,1fr) auto;align-items:center;display:grid}.mailbox-thread-row:hover{background:color-mix(in srgb, var(--accent-soft) 42%, transparent)}.mailbox-thread-button{background:0 0;border:0;border-radius:0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:14px;padding:14px 18px;display:grid}.mailbox-icon-button{width:2.15rem;height:2.15rem;color:var(--muted-foreground);cursor:pointer;background:0 0;border:0;border-radius:999px;justify-content:center;align-items:center;padding:0;display:inline-flex}.mailbox-icon-button:hover{background:color-mix(in srgb, var(--accent-soft) 52%, transparent);color:var(--text)}.mailbox-icon-button:disabled{cursor:default;opacity:.55}.mailbox-icon-button svg{width:1.1rem;height:1.1rem}.mailbox-thread-delete{margin-right:10px}.mailbox-thread-summary,.mailbox-thread-sender,.mailbox-thread-subject,.mailbox-thread-preview,.mailbox-thread-time{overflow-wrap:anywhere;word-break:break-word}.mailbox-thread-summary{white-space:nowrap;align-items:center;gap:8px;min-width:0;display:flex;overflow:hidden}.mailbox-thread-sender,.mailbox-thread-subject{line-height:1.25}.mailbox-thread-sender{text-overflow:ellipsis;flex:0 18ch;min-width:0;font-weight:600;overflow:hidden}.mailbox-thread-separator,.mailbox-thread-time{color:var(--muted-foreground)}.mailbox-thread-subject{text-overflow:ellipsis;flex:0 auto;font-weight:600;overflow:hidden}.mailbox-thread-preview{text-overflow:ellipsis;flex:auto;overflow:hidden}.mailbox-thread-time{white-space:nowrap;flex:none;font-size:.92rem}.mailbox-thread-button,.mailbox-thread-summary{min-width:0}.mailbox-thread-sender,.mailbox-thread-subject{color:var(--text)}.mailbox-thread-preview{color:var(--muted-foreground)}.mailbox-thread-sender,.mailbox-thread-subject{font-weight:600}.mailbox-thread-preview{font-weight:400}.mailbox-thread-summary>*{min-width:0}.mailbox-thread-separator{flex:none}.mailbox-thread-row.is-unread .mailbox-thread-sender,.mailbox-thread-row.is-unread .mailbox-thread-subject,.mailbox-thread-row.is-unread .mailbox-thread-time{color:var(--text);font-weight:700}.mailbox-detail{background:var(--panel-bg);grid-template-rows:auto minmax(0,1fr);min-height:0;display:grid}.mailbox-detail-toolbar{border-bottom:1px solid var(--line);background:var(--panel-bg);padding:14px 18px}.mailbox-detail-toolbar-main{align-items:center;gap:10px;min-width:0;display:inline-flex}.mailbox-detail-toolbar-copy{gap:2px;display:grid}.mailbox-detail-toolbar small{color:var(--muted-foreground)}.mailbox-back-button{width:2.25rem;height:2.25rem;color:var(--text);cursor:pointer;background:0 0;border:0;border-radius:999px;justify-content:center;align-items:center;padding:0;display:inline-flex}.mailbox-back-button:hover{background:color-mix(in srgb, var(--accent-soft) 52%, transparent)}.mailbox-back-button svg{width:1.2rem;height:1.2rem}.mailbox-detail-delete{align-items:center;gap:8px;display:inline-flex}.mailbox-detail-delete-icon{width:1rem;height:1rem;display:inline-flex}.mailbox-detail-delete-icon svg{width:100%;height:100%}.mailbox-inline-error{border:1px solid var(--danger-border);border-radius:var(--radius-sm);background:var(--danger-soft);color:var(--danger);margin:14px 18px 0;padding:10px 12px}.mailbox-detail-empty{margin:18px}.mailbox-detail-header{border-bottom:1px solid var(--line);background:linear-gradient(180deg, color-mix(in srgb, var(--accent-soft) 72%, transparent), transparent);padding:22px 24px 18px}.mailbox-detail-heading{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.mailbox-detail-heading h3{letter-spacing:-.02em;margin:0;font-size:clamp(1.3rem,2vw,1.8rem);line-height:1.1}.mailbox-role-pill{border:1px solid var(--line);letter-spacing:.03em;text-transform:uppercase;border-radius:999px;justify-content:center;align-items:center;padding:6px 10px;font-size:.78rem;font-weight:700;display:inline-flex}.mailbox-role-pill.needs-reply{border-color:color-mix(in srgb, var(--accent) 28%, var(--line));background:color-mix(in srgb, var(--accent) 12%, transparent);color:var(--accent-strong)}.mailbox-role-pill.replied{border-color:color-mix(in srgb, var(--success) 28%, var(--line));background:color-mix(in srgb, var(--success) 12%, transparent);color:var(--success)}.mailbox-message-list{background:linear-gradient(180deg, color-mix(in srgb, var(--panel-muted) 12%, transparent), transparent 220px);align-content:start;padding:18px}.mailbox-message-card{border:1px solid var(--line);background:var(--panel-bg);box-shadow:var(--shadow-card);border-radius:18px;gap:12px;padding:16px 18px;display:grid}.mailbox-message-card.assistant{border-color:color-mix(in srgb, var(--accent) 18%, var(--line));background:color-mix(in srgb, var(--accent-soft) 52%, var(--panel-bg))}.mailbox-message-card.user{background:color-mix(in srgb, var(--panel-bg) 86%, var(--panel-muted))}.mailbox-message-metadata{flex-wrap:wrap;gap:8px;display:flex}.mailbox-message-metadata small{border:1px solid color-mix(in srgb, var(--line) 92%, transparent);background:color-mix(in srgb, var(--accent-soft) 28%, transparent);color:var(--muted-foreground);border-radius:999px;align-items:center;padding:6px 10px;font-size:.78rem;line-height:1.2;display:inline-flex}.mailbox-message-header span{white-space:nowrap;color:var(--muted-foreground);flex:none}.mailbox-message-body{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;line-height:1.65}.session-row-main{flex:auto}.session-row-main strong,.session-row-meta,.key-value-grid strong{overflow-wrap:anywhere;word-break:break-word;display:block}.session-row-main strong{line-height:1.25}.session-row-meta{margin-top:4px;font-size:.95rem;line-height:1.35}.session-row-time{white-space:nowrap;color:var(--muted-foreground);flex:none;font-size:.95rem}.key-value-grid div,.usage-stack{border-radius:var(--radius-md);border:1px solid var(--line);gap:4px;padding:14px;display:grid}.usage-stack strong{font-size:1.3rem}.table-shell td strong,.table-shell td small{display:block}.table-shell td strong{overflow-wrap:anywhere;word-break:break-word;line-height:1.25}.table-shell td small{margin-top:4px;line-height:1.35}.login-shell{background:var(--panel-muted);place-items:center;min-height:100vh;padding:24px;display:grid}.login-card{border-radius:var(--radius-lg);border:1px solid var(--line);background:var(--panel-bg);width:min(480px,100%);padding:24px}.login-card h1{font-size:1.75rem}.compact-search{min-width:240px}.jobs-column-header{align-items:center;display:flex}.jobs-column{min-width:0}.jobs-columns,.jobs-column-body{gap:12px;display:grid}.jobs-card-pill{border-radius:999px;justify-content:center;align-items:center;font-size:.78rem;font-weight:700;display:inline-flex}.jobs-header-search{flex:0 260px;min-width:180px}.page-header .header-actions{flex-wrap:nowrap;justify-content:flex-end;width:auto}.page-header .header-actions .primary-button{flex:none}.jobs-board-layout{border:1px solid var(--line);background:var(--panel-bg);min-width:0;min-height:720px;box-shadow:var(--shadow-board);border-radius:18px;grid-template-columns:minmax(0,1fr);display:grid;overflow:hidden}.jobs-board-layout.has-detail{grid-template-columns:minmax(0,1fr) 320px}.jobs-card strong,.jobs-card p{overflow-wrap:anywhere;word-break:break-word}.jobs-card strong,.jobs-card p,.jobs-card small{margin:0}.jobs-card p,.jobs-card small{color:var(--muted-foreground)}.jobs-columns{background:var(--jobs-board);border-right:1px solid var(--line);grid-auto-columns:minmax(220px,1fr);grid-auto-flow:column;align-items:stretch;gap:4px;padding:12px 14px;display:grid;overflow-x:auto}.jobs-column{--jobs-column-rgb:var(--jobs-column-backlog-rgb);background:rgba(var(--jobs-column-rgb), .04);border:0;border-radius:16px;grid-template-rows:auto minmax(0,1fr);gap:10px;min-width:0;margin:0;padding:10px 8px;display:grid}.jobs-column.drop-target{background:color-mix(in srgb, var(--primary) 8%, transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--primary) 20%, transparent)}.jobs-column-backlog{--jobs-column-rgb:var(--jobs-column-backlog-rgb)}.jobs-column-in_progress{--jobs-column-rgb:var(--jobs-column-progress-rgb)}.jobs-column-review{--jobs-column-rgb:var(--jobs-column-review-rgb)}.jobs-column-done{--jobs-column-rgb:var(--jobs-column-success-rgb)}.jobs-column-cancelled{--jobs-column-rgb:var(--jobs-column-danger-rgb)}.jobs-column-header{border:1px solid var(--line);background:rgba(var(--jobs-column-rgb), .08);border-radius:14px;justify-content:space-between;gap:10px;padding:10px 12px;font-size:.95rem}.jobs-column-header span{background:var(--panel-muted);color:var(--muted-foreground);border-radius:999px;padding:2px 7px;font-size:.8rem;font-weight:700}.jobs-column-body{align-content:start;min-width:0;max-height:640px;padding-right:4px;overflow-y:auto}.jobs-column-empty{border:1px dashed var(--line-strong);color:var(--muted-foreground);background:var(--jobs-empty);border-radius:12px;padding:12px}.jobs-card{border:1px solid var(--jobs-card-border);background:var(--panel-bg);box-shadow:var(--shadow-card);border-radius:16px;gap:8px;padding:12px;display:grid}.jobs-card-top{justify-content:space-between;align-items:flex-start;gap:8px;display:flex}.jobs-card.tone-progress{border-color:var(--tone-progress)}.jobs-card.tone-review{border-color:var(--tone-review)}.jobs-card.tone-success{border-color:var(--tone-success)}.jobs-card.tone-danger{border-color:var(--tone-danger)}.jobs-card strong{font-size:.95rem;line-height:1.25}.jobs-card p{min-height:2.5em;font-size:.92rem;line-height:1.35}.jobs-card small{text-transform:uppercase;letter-spacing:.04em;font-size:.78rem}.jobs-card-pill{background:var(--jobs-pill-success-bg);width:fit-content;color:var(--jobs-pill-success-fg);padding:5px 8px}.jobs-card-frame{width:100%;display:block}.jobs-card-frame.drop-target .jobs-card{box-shadow:var(--shadow-focus)}.jobs-card-shell{position:relative}.jobs-card-button{text-align:left;cursor:pointer;background:0 0;border:0;width:100%;padding:0;display:block}.jobs-card-button:focus-visible .jobs-card{border-color:var(--accent);box-shadow:var(--shadow-focus)}.jobs-card-shell.draggable{cursor:grab}.jobs-inline-trigger{width:100%;min-width:0;color:var(--text);font:inherit;text-align:left;overflow-wrap:anywhere;word-break:break-word;cursor:pointer;background:0 0;border:0;padding:0;font-weight:700}.jobs-inline-trigger:disabled{cursor:default}.jobs-inline-select{box-sizing:border-box;width:100%;min-width:0;max-width:100%}.jobs-card-frame.dragging{opacity:.58}.jobs-card-frame.dragging .jobs-card{border-style:dashed}.jobs-card-shell.active .jobs-card{border-color:var(--accent);box-shadow:var(--shadow-focus)}.jobs-detail{background:var(--panel-bg);min-width:0;padding:18px}.jobs-detail-header{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:16px;display:flex}.jobs-detail-header h4{margin:4px 0 0;font-size:1.15rem}.jobs-detail-stack,.jobs-runtime-list{gap:14px;display:grid}.jobs-runtime-row{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--panel-muted);gap:4px;padding:10px 12px;display:grid}.jobs-runtime-row strong,.jobs-runtime-row small{overflow-wrap:anywhere;word-break:break-word;margin:0}.jobs-runtime-row small{color:var(--muted-foreground)}.code-editor{background:var(--editor);border-color:var(--editor-border);min-height:540px;color:var(--editor-foreground)}@media (width<=1080px){.metric-grid,.two-column-grid,.usage-grid,.field-grid,.config-grid,.key-value-grid,.jobs-board-layout{grid-template-columns:1fr}.jobs-columns{border-right:none;border-bottom:1px solid var(--line)}.mailbox-shell{grid-template-columns:1fr}.mailbox-sidebar{border-right:none;border-bottom:1px solid var(--line)}}@media (width<=780px){.main-panel{padding:0}.panel,.login-card{padding:18px}.page-content{padding:16px 18px 24px}.topbar{z-index:10;background:var(--page-bg);border-bottom:1px solid var(--line);gap:10px;margin-bottom:0;padding:12px 18px 10px;position:sticky;top:0}.topbar h2{font-size:1.1rem}.page-header{flex-direction:column}.topbar-actions{justify-items:stretch;width:100%}.view-switch{flex:none;gap:2px;padding:4px}.view-switch-link{gap:0;padding:8px}.view-switch-link span:not(.nav-link-icon){clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.jobs-header-search{min-width:0}.mailbox-thread-button{grid-template-columns:minmax(0,1fr);gap:6px}.mailbox-thread-summary{white-space:normal;gap:4px;display:grid}.mailbox-thread-separator{display:none}.mailbox-thread-sender,.mailbox-thread-subject,.mailbox-thread-preview{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mailbox-thread-time{justify-self:start}.terminal-shell,.terminal-host{min-height:60vh}.mailbox-detail-header,.mailbox-column-header,.mailbox-message-header{flex-direction:column}}
|