@hybridaione/hybridclaw 0.16.0 → 0.18.0
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/CHANGELOG.md +134 -0
- package/README.md +77 -54
- package/SECURITY.md +52 -0
- package/config.example.json +34 -1
- package/console/dist/assets/chat-C4lYYG3X.css +1 -0
- package/console/dist/assets/{chat-9B6dFbBr.js → chat-CBzFOOa7.js} +29 -28
- package/console/dist/assets/cx-Dx36j-u-.js +1 -0
- package/console/dist/assets/index-CbSfc5B7.css +1 -0
- package/console/dist/assets/index-mP3V4MBi.js +16 -0
- package/console/dist/assets/{terminal-BqDi2uWz.js → terminal-CfDfvr7E.js} +1 -1
- package/console/dist/index.html +3 -3
- package/container/Dockerfile +12 -1
- package/container/dist/anomaly-trace-judge.js +174 -0
- package/container/dist/anomaly-trace-judge.js.map +1 -0
- package/container/dist/approval-policy.js +363 -13
- package/container/dist/approval-policy.js.map +1 -1
- package/container/dist/behavior-anomaly.js +532 -0
- package/container/dist/behavior-anomaly.js.map +1 -0
- package/container/dist/browser-tools.js.map +1 -1
- package/container/dist/image-generation.js +1135 -0
- package/container/dist/image-generation.js.map +1 -0
- package/container/dist/index.js +58 -10
- package/container/dist/index.js.map +1 -1
- package/container/dist/providers/auxiliary.js +11 -1
- package/container/dist/providers/auxiliary.js.map +1 -1
- package/container/dist/providers/router.js +2 -1
- package/container/dist/providers/router.js.map +1 -1
- package/container/dist/search-utils.js +56 -0
- package/container/dist/search-utils.js.map +1 -0
- package/container/dist/searxng-client.js +106 -0
- package/container/dist/searxng-client.js.map +1 -0
- package/container/dist/tools.js +311 -22
- package/container/dist/tools.js.map +1 -1
- package/container/dist/types.js +1 -0
- package/container/dist/types.js.map +1 -1
- package/container/dist/video-generation.js +464 -0
- package/container/dist/video-generation.js.map +1 -0
- package/container/dist/web-search.js +126 -109
- package/container/dist/web-search.js.map +1 -1
- package/container/package-lock.json +6 -2
- package/container/package.json +6 -1
- package/container/shared/browser-navigation.d.ts +1 -0
- package/container/shared/browser-navigation.js +5 -1
- package/container/shared/browser-stealth-policy.d.ts +27 -0
- package/container/shared/browser-stealth-policy.js +108 -0
- package/container/shared/message-tool-channels.d.ts +1 -0
- package/container/shared/message-tool-channels.js +2 -0
- package/container/shared/network-policy.js +2 -2
- package/container/shared/web-search-config.d.ts +5 -0
- package/container/src/anomaly-trace-judge.ts +236 -0
- package/container/src/approval-policy.ts +453 -13
- package/container/src/behavior-anomaly.ts +660 -0
- package/container/src/browser-tools.ts +3 -23
- package/container/src/image-generation.ts +1396 -0
- package/container/src/index.ts +65 -21
- package/container/src/providers/auxiliary.ts +13 -1
- package/container/src/providers/router.ts +4 -2
- package/container/src/search-utils.ts +62 -0
- package/container/src/searxng-client.ts +157 -0
- package/container/src/tools.ts +361 -42
- package/container/src/types.ts +32 -0
- package/container/src/video-generation.ts +598 -0
- package/container/src/web-search.ts +189 -131
- package/dist/a2a/a2a-inbound.d.ts +34 -0
- package/dist/a2a/a2a-inbound.d.ts.map +1 -0
- package/dist/a2a/a2a-inbound.js +415 -0
- package/dist/a2a/a2a-inbound.js.map +1 -0
- package/dist/a2a/a2a-json-rpc.d.ts +1 -0
- package/dist/a2a/a2a-json-rpc.d.ts.map +1 -1
- package/dist/a2a/a2a-json-rpc.js +2 -0
- package/dist/a2a/a2a-json-rpc.js.map +1 -1
- package/dist/a2a/a2a-outbound.d.ts +2 -1
- package/dist/a2a/a2a-outbound.d.ts.map +1 -1
- package/dist/a2a/a2a-outbound.js +2 -1
- package/dist/a2a/a2a-outbound.js.map +1 -1
- package/dist/a2a/a2a-outbox-delivery.d.ts +3 -0
- package/dist/a2a/a2a-outbox-delivery.d.ts.map +1 -1
- package/dist/a2a/a2a-outbox-delivery.js +94 -65
- package/dist/a2a/a2a-outbox-delivery.js.map +1 -1
- package/dist/a2a/delegation-token.d.ts +86 -0
- package/dist/a2a/delegation-token.d.ts.map +1 -0
- package/dist/a2a/delegation-token.js +437 -0
- package/dist/a2a/delegation-token.js.map +1 -0
- package/dist/a2a/envelope.d.ts +7 -1
- package/dist/a2a/envelope.d.ts.map +1 -1
- package/dist/a2a/envelope.js +106 -17
- package/dist/a2a/envelope.js.map +1 -1
- package/dist/a2a/inbound-pipeline.d.ts +5 -2
- package/dist/a2a/inbound-pipeline.d.ts.map +1 -1
- package/dist/a2a/inbound-pipeline.js +20 -0
- package/dist/a2a/inbound-pipeline.js.map +1 -1
- package/dist/a2a/peer-descriptor.d.ts +1 -0
- package/dist/a2a/peer-descriptor.d.ts.map +1 -1
- package/dist/a2a/peer-descriptor.js +19 -3
- package/dist/a2a/peer-descriptor.js.map +1 -1
- package/dist/a2a/store.d.ts +13 -0
- package/dist/a2a/store.d.ts.map +1 -1
- package/dist/a2a/store.js +43 -4
- package/dist/a2a/store.js.map +1 -1
- package/dist/a2a/trust-ledger.d.ts +98 -0
- package/dist/a2a/trust-ledger.d.ts.map +1 -1
- package/dist/a2a/trust-ledger.js +745 -11
- package/dist/a2a/trust-ledger.js.map +1 -1
- package/dist/a2a/utils.d.ts +1 -1
- package/dist/a2a/utils.d.ts.map +1 -1
- package/dist/a2a/utils.js +3 -3
- package/dist/a2a/utils.js.map +1 -1
- package/dist/a2a/webhook-inbound.d.ts.map +1 -1
- package/dist/a2a/webhook-inbound.js +61 -4
- package/dist/a2a/webhook-inbound.js.map +1 -1
- package/dist/agent/prompt-hooks.d.ts.map +1 -1
- package/dist/agent/prompt-hooks.js +7 -2
- package/dist/agent/prompt-hooks.js.map +1 -1
- package/dist/agent/tool-summary.d.ts.map +1 -1
- package/dist/agent/tool-summary.js +12 -2
- package/dist/agent/tool-summary.js.map +1 -1
- package/dist/agents/agent-config-command.d.ts.map +1 -1
- package/dist/agents/agent-config-command.js +13 -1
- package/dist/agents/agent-config-command.js.map +1 -1
- package/dist/agents/agent-registry.d.ts.map +1 -1
- package/dist/agents/agent-registry.js +25 -1
- package/dist/agents/agent-registry.js.map +1 -1
- package/dist/agents/agent-types.d.ts +16 -0
- package/dist/agents/agent-types.d.ts.map +1 -1
- package/dist/agents/agent-types.js +84 -0
- package/dist/agents/agent-types.js.map +1 -1
- package/dist/audit/audit-events.d.ts.map +1 -1
- package/dist/audit/audit-events.js +29 -0
- package/dist/audit/audit-events.js.map +1 -1
- package/dist/board/card-store.d.ts +80 -0
- package/dist/board/card-store.d.ts.map +1 -0
- package/dist/board/card-store.js +446 -0
- package/dist/board/card-store.js.map +1 -0
- package/dist/browser/browser-use-cloud-provider.d.ts +6 -3
- package/dist/browser/browser-use-cloud-provider.d.ts.map +1 -1
- package/dist/browser/browser-use-cloud-provider.js +34 -24
- package/dist/browser/browser-use-cloud-provider.js.map +1 -1
- package/dist/browser/camofox-provider.d.ts +36 -0
- package/dist/browser/camofox-provider.d.ts.map +1 -0
- package/dist/browser/camofox-provider.js +119 -0
- package/dist/browser/camofox-provider.js.map +1 -0
- package/dist/browser/local-provider.d.ts +5 -34
- package/dist/browser/local-provider.d.ts.map +1 -1
- package/dist/browser/local-provider.js +6 -120
- package/dist/browser/local-provider.js.map +1 -1
- package/dist/browser/playwright-utils.d.ts +57 -3
- package/dist/browser/playwright-utils.d.ts.map +1 -1
- package/dist/browser/playwright-utils.js +203 -13
- package/dist/browser/playwright-utils.js.map +1 -1
- package/dist/browser/profile-dir.d.ts +7 -0
- package/dist/browser/profile-dir.d.ts.map +1 -0
- package/dist/browser/profile-dir.js +63 -0
- package/dist/browser/profile-dir.js.map +1 -0
- package/dist/browser/provider-factory.d.ts +12 -0
- package/dist/browser/provider-factory.d.ts.map +1 -0
- package/dist/browser/provider-factory.js +31 -0
- package/dist/browser/provider-factory.js.map +1 -0
- package/dist/browser/provider.d.ts +1 -0
- package/dist/browser/provider.d.ts.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/message/tool-actions.d.ts.map +1 -1
- package/dist/channels/message/tool-actions.js +41 -1
- package/dist/channels/message/tool-actions.js.map +1 -1
- package/dist/channels/message-tool-advertising.d.ts.map +1 -1
- package/dist/channels/message-tool-advertising.js +1 -0
- package/dist/channels/message-tool-advertising.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/threema/api.d.ts +17 -0
- package/dist/channels/threema/api.d.ts.map +1 -0
- package/dist/channels/threema/api.js +91 -0
- package/dist/channels/threema/api.js.map +1 -0
- package/dist/channels/threema/delivery.d.ts +7 -0
- package/dist/channels/threema/delivery.d.ts.map +1 -0
- package/dist/channels/threema/delivery.js +117 -0
- package/dist/channels/threema/delivery.js.map +1 -0
- package/dist/channels/threema/prompt-adapter.d.ts +3 -0
- package/dist/channels/threema/prompt-adapter.d.ts.map +1 -0
- package/dist/channels/threema/prompt-adapter.js +17 -0
- package/dist/channels/threema/prompt-adapter.js.map +1 -0
- package/dist/channels/threema/runtime.d.ts +5 -0
- package/dist/channels/threema/runtime.d.ts.map +1 -0
- package/dist/channels/threema/runtime.js +47 -0
- package/dist/channels/threema/runtime.js.map +1 -0
- package/dist/channels/threema/target.d.ts +15 -0
- package/dist/channels/threema/target.d.ts.map +1 -0
- package/dist/channels/threema/target.js +75 -0
- package/dist/channels/threema/target.js.map +1 -0
- package/dist/cli/channels-command.d.ts.map +1 -1
- package/dist/cli/channels-command.js +224 -28
- package/dist/cli/channels-command.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +12 -3
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/secret-command.d.ts.map +1 -1
- package/dist/cli/secret-command.js +3 -26
- package/dist/cli/secret-command.js.map +1 -1
- package/dist/cli/skill-command.d.ts.map +1 -1
- package/dist/cli/skill-command.js +13 -0
- package/dist/cli/skill-command.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -1
- package/dist/command-registry.d.ts.map +1 -1
- package/dist/command-registry.js +20 -2
- package/dist/command-registry.js.map +1 -1
- package/dist/commands/policy-command.d.ts.map +1 -1
- package/dist/commands/policy-command.js +67 -3
- package/dist/commands/policy-command.js.map +1 -1
- package/dist/config/config.d.ts +5 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +10 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/runtime-config-revisions.d.ts +1 -1
- package/dist/config/runtime-config-revisions.d.ts.map +1 -1
- package/dist/config/runtime-config-revisions.js +2 -0
- package/dist/config/runtime-config-revisions.js.map +1 -1
- package/dist/config/runtime-config.d.ts +57 -3
- package/dist/config/runtime-config.d.ts.map +1 -1
- package/dist/config/runtime-config.js +542 -5
- package/dist/config/runtime-config.js.map +1 -1
- package/dist/doctor/checks/channels.d.ts.map +1 -1
- package/dist/doctor/checks/channels.js +13 -2
- package/dist/doctor/checks/channels.js.map +1 -1
- package/dist/doctor/provider-probes.d.ts.map +1 -1
- package/dist/doctor/provider-probes.js +11 -2
- package/dist/doctor/provider-probes.js.map +1 -1
- package/dist/evals/eval-command.d.ts +1 -0
- package/dist/evals/eval-command.d.ts.map +1 -1
- package/dist/evals/eval-command.js +179 -4
- package/dist/evals/eval-command.js.map +1 -1
- package/dist/evals/hybridai-skills-command.d.ts.map +1 -1
- package/dist/evals/hybridai-skills-command.js +1 -0
- package/dist/evals/hybridai-skills-command.js.map +1 -1
- package/dist/evals/judge-subscriber.d.ts +42 -0
- package/dist/evals/judge-subscriber.d.ts.map +1 -0
- package/dist/evals/judge-subscriber.js +206 -0
- package/dist/evals/judge-subscriber.js.map +1 -0
- package/dist/evals/terminal-bench-native.d.ts.map +1 -1
- package/dist/evals/terminal-bench-native.js +0 -1
- package/dist/evals/terminal-bench-native.js.map +1 -1
- package/dist/evals/trace-judge-eval-dataset.d.ts +12 -0
- package/dist/evals/trace-judge-eval-dataset.d.ts.map +1 -0
- package/dist/evals/trace-judge-eval-dataset.js +265 -0
- package/dist/evals/trace-judge-eval-dataset.js.map +1 -0
- package/dist/evals/trace-judge-native.d.ts +55 -0
- package/dist/evals/trace-judge-native.d.ts.map +1 -0
- package/dist/evals/trace-judge-native.js +447 -0
- package/dist/evals/trace-judge-native.js.map +1 -0
- package/dist/gateway/gateway-chat-service.d.ts.map +1 -1
- package/dist/gateway/gateway-chat-service.js +29 -7
- package/dist/gateway/gateway-chat-service.js.map +1 -1
- package/dist/gateway/gateway-http-proxy.d.ts +1 -1
- package/dist/gateway/gateway-http-proxy.d.ts.map +1 -1
- package/dist/gateway/gateway-http-proxy.js +230 -43
- 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 +219 -1
- package/dist/gateway/gateway-http-server.js.map +1 -1
- package/dist/gateway/gateway-provider-service.d.ts +2 -2
- package/dist/gateway/gateway-provider-service.d.ts.map +1 -1
- package/dist/gateway/gateway-provider-service.js +39 -7
- package/dist/gateway/gateway-provider-service.js.map +1 -1
- package/dist/gateway/gateway-secret-injection.d.ts +3 -3
- package/dist/gateway/gateway-secret-injection.d.ts.map +1 -1
- package/dist/gateway/gateway-secret-injection.js +4 -0
- package/dist/gateway/gateway-secret-injection.js.map +1 -1
- package/dist/gateway/gateway-service.d.ts +19 -1
- package/dist/gateway/gateway-service.d.ts.map +1 -1
- package/dist/gateway/gateway-service.js +263 -75
- package/dist/gateway/gateway-service.js.map +1 -1
- package/dist/gateway/gateway-session-status.d.ts.map +1 -1
- package/dist/gateway/gateway-session-status.js +16 -2
- package/dist/gateway/gateway-session-status.js.map +1 -1
- package/dist/gateway/gateway-types.d.ts +63 -3
- package/dist/gateway/gateway-types.d.ts.map +1 -1
- package/dist/gateway/gateway-types.js.map +1 -1
- package/dist/gateway/gateway-utils.d.ts.map +1 -1
- package/dist/gateway/gateway-utils.js +2 -6
- package/dist/gateway/gateway-utils.js.map +1 -1
- package/dist/gateway/gateway.js +95 -0
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/model-provider-keys.d.ts +3 -0
- package/dist/gateway/model-provider-keys.d.ts.map +1 -0
- package/dist/gateway/model-provider-keys.js +2 -0
- package/dist/gateway/model-provider-keys.js.map +1 -0
- package/dist/gateway/openai-compatible.d.ts.map +1 -1
- package/dist/gateway/openai-compatible.js +0 -1
- package/dist/gateway/openai-compatible.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/skill-commands.d.ts.map +1 -1
- package/dist/gateway/skill-commands.js +102 -56
- package/dist/gateway/skill-commands.js.map +1 -1
- package/dist/identity/agent-id.d.ts +1 -0
- package/dist/identity/agent-id.d.ts.map +1 -1
- package/dist/identity/agent-id.js +4 -2
- package/dist/identity/agent-id.js.map +1 -1
- package/dist/infra/behavior-anomaly-runtime.d.ts +4 -0
- package/dist/infra/behavior-anomaly-runtime.d.ts.map +1 -0
- package/dist/infra/behavior-anomaly-runtime.js +22 -0
- package/dist/infra/behavior-anomaly-runtime.js.map +1 -0
- package/dist/infra/container-runner.d.ts.map +1 -1
- package/dist/infra/container-runner.js +21 -13
- package/dist/infra/container-runner.js.map +1 -1
- package/dist/infra/host-runner.d.ts.map +1 -1
- package/dist/infra/host-runner.js +19 -13
- package/dist/infra/host-runner.js.map +1 -1
- package/dist/infra/ipc.d.ts.map +1 -1
- package/dist/infra/ipc.js +1 -0
- package/dist/infra/ipc.js.map +1 -1
- package/dist/infra/web-search-runtime-config.d.ts +3 -0
- package/dist/infra/web-search-runtime-config.d.ts.map +1 -0
- package/dist/infra/web-search-runtime-config.js +21 -0
- package/dist/infra/web-search-runtime-config.js.map +1 -0
- package/dist/infra/worker-signature.d.ts +1 -0
- package/dist/infra/worker-signature.d.ts.map +1 -1
- package/dist/infra/worker-signature.js +1 -0
- package/dist/infra/worker-signature.js.map +1 -1
- package/dist/memory/db.d.ts +10 -1
- package/dist/memory/db.d.ts.map +1 -1
- package/dist/memory/db.js +146 -14
- package/dist/memory/db.js.map +1 -1
- package/dist/policy/remote-policy-authority.d.ts +76 -0
- package/dist/policy/remote-policy-authority.d.ts.map +1 -0
- package/dist/policy/remote-policy-authority.js +789 -0
- package/dist/policy/remote-policy-authority.js.map +1 -0
- package/dist/policy/secret-route-policy.d.ts +1 -1
- package/dist/policy/secret-route-policy.d.ts.map +1 -1
- package/dist/policy/secret-route-policy.js +0 -8
- package/dist/policy/secret-route-policy.js.map +1 -1
- package/dist/providers/auxiliary.d.ts.map +1 -1
- package/dist/providers/auxiliary.js +7 -4
- package/dist/providers/auxiliary.js.map +1 -1
- package/dist/providers/hybridai-bots.js +1 -1
- package/dist/providers/hybridai-bots.js.map +1 -1
- package/dist/providers/hybridai-discovery.d.ts +2 -0
- package/dist/providers/hybridai-discovery.d.ts.map +1 -1
- package/dist/providers/hybridai-discovery.js +62 -4
- package/dist/providers/hybridai-discovery.js.map +1 -1
- package/dist/providers/hybridai-health.d.ts.map +1 -1
- package/dist/providers/hybridai-health.js +8 -3
- package/dist/providers/hybridai-health.js.map +1 -1
- package/dist/providers/provider-credentials.d.ts +3 -0
- package/dist/providers/provider-credentials.d.ts.map +1 -0
- package/dist/providers/provider-credentials.js +63 -0
- package/dist/providers/provider-credentials.js.map +1 -0
- package/dist/providers/request-max-tokens.d.ts.map +1 -1
- package/dist/providers/request-max-tokens.js +2 -4
- package/dist/providers/request-max-tokens.js.map +1 -1
- package/dist/providers/task-routing.d.ts.map +1 -1
- package/dist/providers/task-routing.js +2 -4
- package/dist/providers/task-routing.js.map +1 -1
- package/dist/providers/utils.d.ts +1 -0
- package/dist/providers/utils.d.ts.map +1 -1
- package/dist/providers/utils.js +5 -0
- package/dist/providers/utils.js.map +1 -1
- package/dist/scheduler/heartbeat.d.ts.map +1 -1
- package/dist/scheduler/heartbeat.js +2 -1
- package/dist/scheduler/heartbeat.js.map +1 -1
- package/dist/scheduler/scheduled-task-runner.d.ts.map +1 -1
- package/dist/scheduler/scheduled-task-runner.js +15 -0
- package/dist/scheduler/scheduled-task-runner.js.map +1 -1
- package/dist/security/browser-stealth-policy.d.ts +10 -0
- package/dist/security/browser-stealth-policy.d.ts.map +1 -0
- package/dist/security/browser-stealth-policy.js +70 -0
- package/dist/security/browser-stealth-policy.js.map +1 -0
- package/dist/security/media-paths.d.ts.map +1 -1
- package/dist/security/media-paths.js +22 -0
- package/dist/security/media-paths.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 +3 -0
- package/dist/security/runtime-secrets.js.map +1 -1
- package/dist/security/secret-policy.d.ts +1 -1
- package/dist/security/secret-policy.d.ts.map +1 -1
- package/dist/security/secret-policy.js +4 -1
- package/dist/security/secret-policy.js.map +1 -1
- package/dist/security/secret-refs.d.ts +7 -5
- package/dist/security/secret-refs.d.ts.map +1 -1
- package/dist/security/secret-refs.js +35 -37
- package/dist/security/secret-refs.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/adaptive-skills-types.d.ts +3 -0
- package/dist/skills/adaptive-skills-types.d.ts.map +1 -1
- package/dist/skills/agent-cv.d.ts.map +1 -1
- package/dist/skills/agent-cv.js +5 -0
- package/dist/skills/agent-cv.js.map +1 -1
- package/dist/skills/agent-scoreboard.d.ts.map +1 -1
- package/dist/skills/agent-scoreboard.js +16 -4
- package/dist/skills/agent-scoreboard.js.map +1 -1
- package/dist/skills/skill-manifest.d.ts +15 -0
- package/dist/skills/skill-manifest.d.ts.map +1 -1
- package/dist/skills/skill-manifest.js +101 -8
- package/dist/skills/skill-manifest.js.map +1 -1
- package/dist/skills/skill-run-events.d.ts +8 -1
- package/dist/skills/skill-run-events.d.ts.map +1 -1
- package/dist/skills/skill-run-events.js +18 -10
- package/dist/skills/skill-run-events.js.map +1 -1
- package/dist/skills/skills-guard.d.ts.map +1 -1
- package/dist/skills/skills-guard.js +39 -21
- package/dist/skills/skills-guard.js.map +1 -1
- package/dist/skills/skills-import.d.ts.map +1 -1
- package/dist/skills/skills-import.js +20 -1
- package/dist/skills/skills-import.js.map +1 -1
- package/dist/skills/skills-lifecycle.d.ts.map +1 -1
- package/dist/skills/skills-lifecycle.js +10 -1
- package/dist/skills/skills-lifecycle.js.map +1 -1
- package/dist/skills/skills-management.d.ts +5 -1
- package/dist/skills/skills-management.d.ts.map +1 -1
- package/dist/skills/skills-management.js +11 -1
- package/dist/skills/skills-management.js.map +1 -1
- package/dist/skills/skills.d.ts +54 -3
- package/dist/skills/skills.d.ts.map +1 -1
- package/dist/skills/skills.js +191 -28
- package/dist/skills/skills.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 +1 -0
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +3 -3
- package/dist/tui.js.map +1 -1
- package/dist/types/container.d.ts +13 -0
- package/dist/types/container.d.ts.map +1 -1
- package/dist/types/execution.d.ts +15 -0
- package/dist/types/execution.d.ts.map +1 -1
- package/dist/types/execution.js.map +1 -1
- package/dist/usage/media-generation-usage.d.ts +11 -0
- package/dist/usage/media-generation-usage.d.ts.map +1 -0
- package/dist/usage/media-generation-usage.js +152 -0
- package/dist/usage/media-generation-usage.js.map +1 -0
- package/dist/usage/model-cost.d.ts +23 -0
- package/dist/usage/model-cost.d.ts.map +1 -0
- package/dist/usage/model-cost.js +64 -0
- package/dist/usage/model-cost.js.map +1 -0
- package/dist/utils/atomic-file.d.ts +6 -0
- package/dist/utils/atomic-file.d.ts.map +1 -0
- package/dist/utils/atomic-file.js +24 -0
- package/dist/utils/atomic-file.js.map +1 -0
- package/dist/utils/number-normalization.d.ts +7 -0
- package/dist/utils/number-normalization.d.ts.map +1 -0
- package/dist/utils/number-normalization.js +23 -0
- package/dist/utils/number-normalization.js.map +1 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +3 -2
- package/dist/workspace.js.map +1 -1
- package/docs/404.html +11 -10
- package/docs/about/index.html +3 -3
- package/docs/agents.html +12 -12
- package/docs/content/README.md +14 -6
- package/docs/content/channels/README.md +1 -0
- package/docs/content/channels/overview.md +1 -0
- package/docs/content/channels/threema.md +55 -0
- package/docs/content/developer-guide/approvals.md +30 -6
- package/docs/content/developer-guide/architecture.md +2 -1
- package/docs/content/developer-guide/runtime.md +6 -3
- package/docs/content/getting-started/authentication.md +11 -3
- package/docs/content/getting-started/first-channel.md +2 -0
- package/docs/content/guides/bundled-skills.md +15 -4
- package/docs/content/guides/remote-access.md +3 -3
- package/docs/content/guides/skills/README.md +3 -3
- package/docs/content/guides/skills/integrations.md +307 -2
- package/docs/content/guides/skills/publishing.md +120 -1
- package/docs/content/internal/approval-rule-pipeline.md +40 -16
- package/docs/content/internal/roadmap.md +174 -28
- package/docs/content/reference/commands.md +13 -7
- package/docs/content/reference/configuration.md +30 -7
- package/docs/content/reference/diagnostics.md +5 -0
- package/docs/content/reference/tools/web-search.md +50 -2
- package/docs/content/tutorials/README.md +3 -0
- package/docs/content/tutorials/campaign-pulse-digest.md +22 -0
- package/docs/content/tutorials/feature-explainer-videos.md +24 -3
- package/docs/development/index.html +4 -4
- package/docs/docs/index.html +10 -9
- package/docs/index.html +19 -19
- package/docs/static/docs.js +29 -11
- package/docs/tools/web-search.md +50 -2
- package/package.json +20 -10
- package/skills/airtable/SKILL.md +325 -0
- package/skills/airtable/airtable.cjs +864 -0
- package/skills/airtable/evals/scenarios.json +91 -0
- package/skills/airtable/fixtures/schema.json +73 -0
- package/skills/airtable/index.cjs +1 -0
- package/skills/download-platform-invoices/helpers/config.cjs +72 -39
- package/skills/fastbill/SKILL.md +243 -0
- package/skills/fastbill/evals/scenarios.json +218 -0
- package/skills/fastbill/fastbill.cjs +1069 -0
- package/skills/fastbill/fixtures/einvoice-readiness.json +34 -0
- package/skills/fastbill/index.cjs +1 -0
- package/skills/fastbill/references/operator-setup.md +130 -0
- package/skills/firecrawl/SKILL.md +219 -0
- package/skills/firecrawl/firecrawl.cjs +586 -0
- package/skills/firecrawl/index.cjs +1 -0
- package/skills/ga4/SKILL.md +200 -0
- package/skills/ga4/evals/scenarios.json +225 -0
- package/skills/ga4/scripts/ga4.py +832 -0
- package/skills/google-ads/SKILL.md +400 -0
- package/skills/google-ads/evals/scenarios.json +462 -0
- package/skills/google-ads/references/setup-and-operations.md +191 -0
- package/skills/google-ads/scripts/google_ads.py +2189 -0
- package/skills/hermes3000-writing/SKILL.md +254 -0
- package/skills/hermes3000-writing/agents/openai.yaml +4 -0
- package/skills/hermes3000-writing/references/api-workflow.md +302 -0
- package/skills/hermes3000-writing/scripts/hermes3000.cjs +580 -0
- package/skills/heygen/SKILL.md +239 -0
- package/skills/heygen/client.cjs +258 -0
- package/skills/heygen/eval.cjs +45 -0
- package/skills/heygen/heygen.cjs +542 -0
- package/skills/heygen/index.cjs +1 -0
- package/skills/heygen/lib/common.cjs +96 -0
- package/skills/image-generation/SKILL.md +35 -0
- package/skills/search.images/SKILL.md +34 -0
- package/skills/search.news/SKILL.md +35 -0
- package/skills/search.web/SKILL.md +34 -0
- package/skills/skill-creator/SKILL.md +2 -1
- package/skills/skill-creator/references/output-patterns.md +1 -1
- package/skills/skill-creator/scripts/quick_validate.py +12 -4
- package/skills/video-generation/SKILL.md +34 -0
- package/skills/video.from-script/SKILL.md +156 -0
- package/skills/video.from-script/video-from-script.cjs +638 -0
- package/console/dist/assets/chat-BLTK7IwH.css +0 -1
- package/console/dist/assets/cx-WK-JkhB9.js +0 -1
- package/console/dist/assets/index-BmK2dcpa.css +0 -1
- package/console/dist/assets/index-Cla9A2NT.js +0 -16
- package/docs/CNAME +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,140 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## [0.18.0](https://github.com/HybridAIOne/hybridclaw/tree/v0.18.0) - 2026-05-13
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **GA4 reporting skill**: Bundled `ga4` adds production Google Analytics 4
|
|
10
|
+
Data API reporting, request planning/review, gateway-injected bearer auth,
|
|
11
|
+
service-account support, traffic-source, landing-page, time-series, revenue,
|
|
12
|
+
session, and key-event reports, plus eval scenarios.
|
|
13
|
+
- **Hermes3000 long-form writing skill**: Bundled `hermes3000-writing` can
|
|
14
|
+
authenticate through the gateway secret rail, manage portal-backed book
|
|
15
|
+
projects, draft and revise chapters, update consistency memory, and export
|
|
16
|
+
DOCX/PDF/EPUB/HTML deliverables without exposing JWTs to the agent context.
|
|
17
|
+
- **Video-from-script skill**: Bundled `video.from-script` turns approved
|
|
18
|
+
avatar, voice, and script briefs into HeyGen MP4 jobs with planning, guarded
|
|
19
|
+
async render start, status polling, optional download, and credit-spend
|
|
20
|
+
approval gates.
|
|
21
|
+
- **Firecrawl self-host adapter**: The Firecrawl skill now supports
|
|
22
|
+
self-hosted Firecrawl origins alongside managed API mode, including optional
|
|
23
|
+
self-host auth for scrape, crawl, map, and extraction workflows.
|
|
24
|
+
- **Per-agent authenticated SearXNG search**: Agents can bind their own
|
|
25
|
+
SearXNG base URL and bearer-token SecretRef, with bearer injection routed
|
|
26
|
+
through the gateway HTTP proxy so tokens stay out of model context.
|
|
27
|
+
- **Reviewed skill unblock controls**: Blocked skills now appear in CLI, web,
|
|
28
|
+
and gateway skill listings, and local operators can run `skill unblock` or
|
|
29
|
+
use the Admin Skills page to record a reviewed scanner-bypass marker for an
|
|
30
|
+
installed copy.
|
|
31
|
+
- **Browser stealth host policy**: Camofox stealth browsing is deny-by-default
|
|
32
|
+
unless workspace policy explicitly allowlists the target host with
|
|
33
|
+
`browser.stealth.rules`.
|
|
34
|
+
- **Node version guardrails**: Source checkouts now include `.node-version`,
|
|
35
|
+
`.nvmrc`, and a `check:node` preflight so local builds and tests fail fast
|
|
36
|
+
when they are not running on Node.js 22.
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- **SecretRef handling is store-first**: Runtime SecretRefs now accept the
|
|
41
|
+
encrypted `store` source for new configuration. Legacy Browser Use Cloud
|
|
42
|
+
env-backed refs are canonicalized to stored SecretRefs, and malformed legacy
|
|
43
|
+
refs produce explicit configuration errors.
|
|
44
|
+
- **HybridAI auth diagnostics are clearer**: Provider discovery, health, bot
|
|
45
|
+
lookup, and doctor output distinguish auth, configuration, and remote service
|
|
46
|
+
failures more cleanly.
|
|
47
|
+
- **Web chat scrolling respects user position**: The chat UI now sticks to the
|
|
48
|
+
bottom only when appropriate, preserves pinned scroll position while users
|
|
49
|
+
read older content, and exposes a jump-to-latest affordance.
|
|
50
|
+
- **Console model-provider typing is narrower**: The chat model switcher no
|
|
51
|
+
longer shares broader gateway provider types that were not part of the
|
|
52
|
+
console UI contract.
|
|
53
|
+
- **Trace-judge live CI is less brittle**: Main-branch CI no longer blocks on
|
|
54
|
+
missing trace-judge live secrets.
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
- **SearXNG bearer leakage risk**: SearXNG bearer values are no longer exposed
|
|
59
|
+
through runtime env forwarding; configured SecretRefs are resolved only by
|
|
60
|
+
the gateway proxy at request time.
|
|
61
|
+
- **Camofox navigation scope**: Stealth browser sessions now enforce both safe
|
|
62
|
+
navigation schemes and host allowlisting before visiting a URL.
|
|
63
|
+
- **Browser credential fills**: SecretRef-backed browser fills require a
|
|
64
|
+
resolvable page URL and calling skill name so host, selector, skill, and
|
|
65
|
+
agent policy can be evaluated.
|
|
66
|
+
|
|
67
|
+
## [0.17.0](https://github.com/HybridAIOne/hybridclaw/tree/v0.17.0) - 2026-05-12
|
|
68
|
+
|
|
69
|
+
### Added
|
|
70
|
+
|
|
71
|
+
- **Native media generation tools**: The container runtime now exposes
|
|
72
|
+
`image_generate` and `video_generate` with provider adapters, managed output
|
|
73
|
+
persistence, reference-media validation, usage metering, and bundled
|
|
74
|
+
`image-generation` / `video-generation` skills. Image generation supports GPT
|
|
75
|
+
Image, Gemini/Nano Banana, Grok, and FLUX families where configured; video
|
|
76
|
+
generation supports OpenAI Sora and Google Veo families where configured.
|
|
77
|
+
- **New business and research skills**: Bundled skills now cover Airtable base
|
|
78
|
+
and record work, FastBill invoicing, Firecrawl scrape/crawl/map/extract
|
|
79
|
+
workflows, HeyGen avatar video generation and translation, Google Ads
|
|
80
|
+
campaign operations, and SearXNG-backed `search.web`, `search.news`, and
|
|
81
|
+
`search.images` workflows.
|
|
82
|
+
- **Threema Gateway channel**: HybridClaw can send outbound Threema Basic-mode
|
|
83
|
+
text messages with setup docs, CLI configuration, doctor/status visibility,
|
|
84
|
+
prompt hints, target validation, and delivery tests.
|
|
85
|
+
- **Camofox browser provider**: Browser automation can use a Camofox-backed
|
|
86
|
+
provider with persistent profile support and the same provider factory path
|
|
87
|
+
as local Playwright and Browser Use Cloud.
|
|
88
|
+
- **A2A inbound and trust surfaces**: JSON-RPC Agent Card inbound delivery,
|
|
89
|
+
additional delegation envelope fields, a public-key trust ledger, and an
|
|
90
|
+
admin A2A trust route extend the federation substrate.
|
|
91
|
+
- **Remote policy authority**: Signed remote policy updates can flow over the
|
|
92
|
+
federation path with validation, audit records, and targeted tests.
|
|
93
|
+
- **Board card store**: The gateway now has a persisted card-store substrate
|
|
94
|
+
for future admin work-board and agent-team coordination surfaces.
|
|
95
|
+
- **Trace-judge and anomaly evaluation path**: Skill trace judging gained a
|
|
96
|
+
subscriber pattern, an offline eval gate, and a behavioral anomaly reranker
|
|
97
|
+
for tool-call sequences.
|
|
98
|
+
|
|
99
|
+
### Changed
|
|
100
|
+
|
|
101
|
+
- **Admin console polish and performance**: Admin pages moved toward a shared
|
|
102
|
+
`Card` primitive, the Usage rollup gained skeleton and metric loading states,
|
|
103
|
+
live channel transport status is shown through toasts, the `/` command panel
|
|
104
|
+
was rebuilt for better keyboard/a11y behavior, and expensive all-session
|
|
105
|
+
scans/config fetches were removed from hot paths.
|
|
106
|
+
- **Vitest configuration is project-based**: Unit, integration, e2e, and live
|
|
107
|
+
test configuration now share one project-aware Vitest setup instead of
|
|
108
|
+
separate config files.
|
|
109
|
+
- **Browser credential handling is narrower**: Browser form fills now route
|
|
110
|
+
through SecretRef injection gates rather than exposing credential material to
|
|
111
|
+
the model or broad browser action context.
|
|
112
|
+
- **A2A delegation bearer auth**: Outbound A2A uses signed delegation JWTs as
|
|
113
|
+
the HTTP bearer credential. `bearerTokenRef` remains a required explicit
|
|
114
|
+
opt-in gate for non-loopback peer URLs, but its secret value is not sent on
|
|
115
|
+
the wire.
|
|
116
|
+
- **NPM supply-chain controls are stricter**: Workspace install and release
|
|
117
|
+
flows now enforce newer npm behavior, harden CI setup, and keep package-lock
|
|
118
|
+
metadata aligned with the release pipeline.
|
|
119
|
+
|
|
120
|
+
### Fixed
|
|
121
|
+
|
|
122
|
+
- **A2A delegation revocation cleanup**: Expired delegation-token revocation
|
|
123
|
+
records are pruned when new revocations are written, preventing stale
|
|
124
|
+
short-lived token revocations from accumulating indefinitely.
|
|
125
|
+
- **Skill blocking is visible**: Blocked skills are surfaced instead of being
|
|
126
|
+
hidden behind silent resolution failures.
|
|
127
|
+
- **Media path display-prefix handling**: Host paths that merely share a
|
|
128
|
+
display prefix are no longer remapped as if they were inside the sandboxed
|
|
129
|
+
media root.
|
|
130
|
+
- **Context ring source accuracy**: The web chat context ring reads usage from
|
|
131
|
+
the correct source after session and UI routing changes.
|
|
132
|
+
- **Auxiliary model token limits**: Auxiliary provider calls honor configured
|
|
133
|
+
max-token limits.
|
|
134
|
+
- **Console IME composition safety**: Chat composer key handling ignores IME
|
|
135
|
+
composition events so slash/submit shortcuts do not interrupt text entry.
|
|
136
|
+
- **Release publish compatibility**: Release workflows invoke npm 11 on Node
|
|
137
|
+
22 so npm package promotion uses the expected toolchain.
|
|
138
|
+
|
|
5
139
|
## [0.16.0](https://github.com/HybridAIOne/hybridclaw/tree/v0.16.0) - 2026-05-07
|
|
6
140
|
|
|
7
141
|
### Added
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[](https://www.npmjs.com/package/@hybridaione/hybridclaw)
|
|
6
6
|
[](https://nodejs.org/en/download)
|
|
7
7
|
[](https://github.com/HybridAIOne/hybridclaw/blob/main/LICENSE)
|
|
8
|
-
[](https://hybridaione.github.io/hybridclaw/docs/)
|
|
9
9
|
[](https://hybridai.one)
|
|
10
10
|
[](https://discord.gg/jsVW4vJw27)
|
|
11
11
|
|
|
@@ -23,22 +23,22 @@ Connect it to Discord, Slack, Signal, WhatsApp, Telegram, Microsoft Teams,
|
|
|
23
23
|
email, Twilio voice, or the web. Run it locally, deploy it for business
|
|
24
24
|
workflows, and keep your agents, secrets, and data under your control.
|
|
25
25
|
|
|
26
|
-
[Quick Start](https://
|
|
27
|
-
[Installation](https://
|
|
28
|
-
[Configuration](https://
|
|
29
|
-
[Migration](https://
|
|
26
|
+
[Quick Start](https://hybridaione.github.io/hybridclaw/docs/getting-started/quickstart) ·
|
|
27
|
+
[Installation](https://hybridaione.github.io/hybridclaw/docs/getting-started/installation) ·
|
|
28
|
+
[Configuration](https://hybridaione.github.io/hybridclaw/docs/reference/configuration) ·
|
|
29
|
+
[Migration](https://hybridaione.github.io/hybridclaw/docs/reference/commands#migration) ·
|
|
30
30
|
[Contributing](./CONTRIBUTING.md) ·
|
|
31
31
|
[Support](./SUPPORT.md)
|
|
32
32
|
|
|
33
33
|
## Pick your path
|
|
34
34
|
|
|
35
35
|
- Want the shortest path to a running assistant? Start with
|
|
36
|
-
[Quick Start](https://
|
|
36
|
+
[Quick Start](https://hybridaione.github.io/hybridclaw/docs/getting-started/quickstart).
|
|
37
37
|
- Want the full setup flow with providers, channels, and admin surfaces? Start
|
|
38
|
-
with [Installation](https://
|
|
39
|
-
and [Authentication](https://
|
|
38
|
+
with [Installation](https://hybridaione.github.io/hybridclaw/docs/getting-started/installation)
|
|
39
|
+
and [Authentication](https://hybridaione.github.io/hybridclaw/docs/getting-started/authentication).
|
|
40
40
|
- Want to migrate from OpenClaw or Hermes? Start with the
|
|
41
|
-
[migration commands](https://
|
|
41
|
+
[migration commands](https://hybridaione.github.io/hybridclaw/docs/reference/commands#migration).
|
|
42
42
|
- Want to contribute from source? Start with [CONTRIBUTING.md](./CONTRIBUTING.md)
|
|
43
43
|
and the maintainer docs under [docs/content/README.md](./docs/content/README.md).
|
|
44
44
|
|
|
@@ -98,7 +98,7 @@ listening on `http://127.0.0.1:9090`.
|
|
|
98
98
|
|
|
99
99
|
Release notes live in [CHANGELOG.md](./CHANGELOG.md), and the browsable
|
|
100
100
|
operator and maintainer manual lives at
|
|
101
|
-
[
|
|
101
|
+
[hybridaione.github.io/hybridclaw/docs](https://hybridaione.github.io/hybridclaw/docs/).
|
|
102
102
|
|
|
103
103
|
## See it in Action
|
|
104
104
|
|
|
@@ -110,6 +110,8 @@ Once the gateway is running, open HybridClaw locally:
|
|
|
110
110
|
- Web Chat shows live context-window usage, accepts `/context`, and lets you
|
|
111
111
|
switch the active agent and model from the composer; active agent switching is
|
|
112
112
|
preserved across session reloads and UI route changes
|
|
113
|
+
- Web Chat keeps scrolling pinned when you read older messages and shows a
|
|
114
|
+
jump-to-latest affordance when new output arrives below the current viewport
|
|
113
115
|
- Web Chat accepts `/btw <question>` side questions while a primary run is
|
|
114
116
|
active, so you can ask an ephemeral follow-up without interrupting the
|
|
115
117
|
current run
|
|
@@ -137,6 +139,8 @@ Once the gateway is running, open HybridClaw locally:
|
|
|
137
139
|
browser.
|
|
138
140
|
- `/admin/statistics` reports message, session, token, cost, and channel trends
|
|
139
141
|
across a selected date range.
|
|
142
|
+
- The Usage rollup surfaces loading skeletons, cost metrics, and per-model
|
|
143
|
+
spend summaries without scanning every stored session on page load.
|
|
140
144
|
- `/admin/agent-scoreboard` ranks agents by observed skill scores, reliability,
|
|
141
145
|
timing, best skills, and CV links.
|
|
142
146
|
- `hybridclaw agent config` accepts generated JSON payloads to upsert agent
|
|
@@ -148,6 +152,8 @@ Once the gateway is running, open HybridClaw locally:
|
|
|
148
152
|
- `/admin/approvals` manages approval policies from the browser.
|
|
149
153
|
- Approval policy evaluation runs through a hook-fed rule pipeline, so
|
|
150
154
|
workspace policy ordering and plugin tool-use hooks share one approval path.
|
|
155
|
+
- `/admin/a2a-trust` shows the local A2A public-key trust ledger for paired
|
|
156
|
+
peer instances.
|
|
151
157
|
- `/admin/gateway` reloads runtime config and refreshes secrets from the
|
|
152
158
|
browser, and shows public URL plus tunnel status, without tearing down the
|
|
153
159
|
enclosing workspace container; keep `hybridclaw gateway restart` for
|
|
@@ -182,8 +188,8 @@ Once the gateway is running, open HybridClaw locally:
|
|
|
182
188
|
the active run and returns control to the prompt.
|
|
183
189
|
- `hybridclaw doctor` checks runtime health including resource hygiene
|
|
184
190
|
maintenance for stale gateway artifacts. `hybridclaw doctor browser-use`
|
|
185
|
-
checks the local browser automation substrate and can install
|
|
186
|
-
|
|
191
|
+
checks the local Playwright browser automation substrate and can install
|
|
192
|
+
missing Chromium support with `--fix`.
|
|
187
193
|
- `hybridclaw onboarding` and related local setup flows can restore the last
|
|
188
194
|
known-good saved config snapshot or roll back to a tracked revision when
|
|
189
195
|
`config.json` becomes invalid.
|
|
@@ -192,6 +198,9 @@ Once the gateway is running, open HybridClaw locally:
|
|
|
192
198
|
- `hybridclaw skill install <source>`, `skill upgrade`, `skill revisions`, and
|
|
193
199
|
`skill rollback` manage packaged business skills with manifests, audit
|
|
194
200
|
events, and snapshots.
|
|
201
|
+
- `hybridclaw skill list blocked` and `hybridclaw skill unblock <name>` let
|
|
202
|
+
local operators review scanner-blocked skills and record a bypass marker for
|
|
203
|
+
the installed copy when the finding has been accepted.
|
|
195
204
|
- The bundled tutorials cover owner, GTM, marketing, sales, DevRel, content,
|
|
196
205
|
invoicing, webinar, and release-launch workflows that can run from the TUI,
|
|
197
206
|
web chat, or connected channels.
|
|
@@ -220,6 +229,12 @@ Once the gateway is running, open HybridClaw locally:
|
|
|
220
229
|
- Brave, Perplexity, and Tavily web-search credentials can live in the
|
|
221
230
|
encrypted runtime secret store and are passed into host or container agent
|
|
222
231
|
runtimes from the active config.
|
|
232
|
+
- Web search can also target a self-hosted SearXNG instance through
|
|
233
|
+
`web.search.searxngBaseUrl` or `SEARXNG_BASE_URL`; authenticated instances
|
|
234
|
+
use store-backed SearXNG bearer SecretRefs, and agents can override the
|
|
235
|
+
global SearXNG base URL and bearer SecretRef for tenant-specific search.
|
|
236
|
+
Bundled `search.web`, `search.news`, and `search.images` skills prefer that
|
|
237
|
+
sovereign search path.
|
|
223
238
|
- Google OAuth credentials for Workspace skills live in the encrypted runtime
|
|
224
239
|
secret store; agent runtimes receive short-lived access tokens for `gog` and
|
|
225
240
|
`gws` instead of long-lived refresh tokens.
|
|
@@ -237,12 +252,19 @@ Once the gateway is running, open HybridClaw locally:
|
|
|
237
252
|
credentials, supported channels, and per-agent autonomy policy.
|
|
238
253
|
- Bundled skills include API-backed Google Workspace workflows (`gog`, `gws`),
|
|
239
254
|
Salesforce inspection, GitHub issue queue processing (`gh-issues`),
|
|
240
|
-
monthly SaaS invoice harvesting (`download-platform-invoices`),
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
-
|
|
244
|
-
|
|
245
|
-
|
|
255
|
+
monthly SaaS invoice harvesting (`download-platform-invoices`), Airtable,
|
|
256
|
+
FastBill, managed or self-hosted Firecrawl, Google Ads, GA4 reporting,
|
|
257
|
+
HeyGen, Hermes3000 long-form writing, natural-language warehouse SQL
|
|
258
|
+
(`warehouse-sql`), brand-voice drafting, and editable Excalidraw diagram
|
|
259
|
+
creation.
|
|
260
|
+
- Native media tools generate images and videos through configured providers,
|
|
261
|
+
persist the resulting artifacts, and expose the same capability through the
|
|
262
|
+
bundled `image-generation`, `video-generation`, and `video.from-script`
|
|
263
|
+
skills.
|
|
264
|
+
- Browser automation can use local persistent Playwright profiles, Camofox
|
|
265
|
+
profiles, or Browser Use Cloud sessions with encrypted `BROWSER_USE_API_KEY`
|
|
266
|
+
storage, usage metering, shared navigation guards, SecretRef-gated credential
|
|
267
|
+
fills, and deny-by-default host allowlisting for Camofox stealth mode.
|
|
246
268
|
- The repo-shipped `brand-voice` plugin can flag, rewrite, or block final
|
|
247
269
|
responses that violate configured voice rules before they reach users.
|
|
248
270
|
- Built-in office skills handle longer PDF creation flows cleanly: the bundled
|
|
@@ -305,66 +327,67 @@ Once the gateway is running, open HybridClaw locally:
|
|
|
305
327
|
|
|
306
328
|
## Architecture
|
|
307
329
|
|
|
308
|
-
- **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, Signal, Microsoft Teams, Telegram, iMessage, WhatsApp, Twilio voice, and email
|
|
330
|
+
- **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, A2A peer trust, board-card storage, and channel integrations for Discord, Slack, Signal, Threema, Microsoft Teams, Telegram, iMessage, WhatsApp, Twilio voice, and email
|
|
309
331
|
- **TUI client** — thin client over HTTP (`/api/chat`, `/api/command`) with
|
|
310
332
|
a structured startup banner that surfaces model, sandbox, gateway, and
|
|
311
333
|
chatbot context before the first prompt, live delegate status/progress,
|
|
312
334
|
an interactive approval picker for pending approvals, and an exit summary
|
|
313
335
|
with a ready-to-run resume command
|
|
314
|
-
- **Container** (Docker, ephemeral) — HybridAI API client, sandboxed tool executor, and preinstalled browser automation runtime with cursor-aware snapshots for JS-heavy custom UI
|
|
336
|
+
- **Container** (Docker, ephemeral) — HybridAI API client, sandboxed tool executor, native media-generation tools, web/search adapters, and preinstalled browser automation runtime with cursor-aware snapshots for JS-heavy custom UI
|
|
315
337
|
- Communication via file-based IPC (input.json / output.json)
|
|
316
338
|
|
|
317
339
|
## Documentation
|
|
318
340
|
|
|
319
341
|
Browse the full manual at
|
|
320
|
-
[
|
|
342
|
+
[hybridaione.github.io/hybridclaw/docs](https://hybridaione.github.io/hybridclaw/docs/).
|
|
321
343
|
|
|
322
344
|
- Getting started:
|
|
323
|
-
[Installation](https://
|
|
324
|
-
[Authentication](https://
|
|
325
|
-
[Quick Start](https://
|
|
345
|
+
[Installation](https://hybridaione.github.io/hybridclaw/docs/getting-started/installation),
|
|
346
|
+
[Authentication](https://hybridaione.github.io/hybridclaw/docs/getting-started/authentication), and
|
|
347
|
+
[Quick Start](https://hybridaione.github.io/hybridclaw/docs/getting-started/quickstart)
|
|
326
348
|
- Enterprise deployment:
|
|
327
|
-
[Runtime Internals](https://
|
|
328
|
-
[Architecture](https://
|
|
349
|
+
[Runtime Internals](https://hybridaione.github.io/hybridclaw/docs/developer-guide/runtime) and
|
|
350
|
+
[Architecture](https://hybridaione.github.io/hybridclaw/docs/developer-guide/architecture)
|
|
329
351
|
- Operations:
|
|
330
|
-
[Remote Access](https://
|
|
352
|
+
[Remote Access](https://hybridaione.github.io/hybridclaw/docs/guides/remote-access)
|
|
331
353
|
- Security:
|
|
332
354
|
[SECURITY.md](./SECURITY.md) and [TRUST_MODEL.md](./TRUST_MODEL.md)
|
|
333
355
|
- Migration:
|
|
334
|
-
[Commands: Migration](https://
|
|
335
|
-
[FAQ](https://
|
|
356
|
+
[Commands: Migration](https://hybridaione.github.io/hybridclaw/docs/reference/commands#migration) and
|
|
357
|
+
[FAQ](https://hybridaione.github.io/hybridclaw/docs/reference/faq#can-i-migrate-an-existing-openclaw-or-hermes-agent-home)
|
|
336
358
|
- Channels:
|
|
337
|
-
[Connect Your First Channel](https://
|
|
338
|
-
[Overview](https://
|
|
339
|
-
[Twilio Voice](https://
|
|
340
|
-
[Discord](https://
|
|
341
|
-
[Slack](https://
|
|
342
|
-
[Telegram](https://
|
|
343
|
-
[Signal](https://
|
|
344
|
-
[
|
|
345
|
-
[
|
|
346
|
-
[
|
|
347
|
-
[
|
|
359
|
+
[Connect Your First Channel](https://hybridaione.github.io/hybridclaw/docs/getting-started/first-channel),
|
|
360
|
+
[Overview](https://hybridaione.github.io/hybridclaw/docs/channels/overview),
|
|
361
|
+
[Twilio Voice](https://hybridaione.github.io/hybridclaw/docs/guides/twilio-voice),
|
|
362
|
+
[Discord](https://hybridaione.github.io/hybridclaw/docs/channels/discord),
|
|
363
|
+
[Slack](https://hybridaione.github.io/hybridclaw/docs/channels/slack),
|
|
364
|
+
[Telegram](https://hybridaione.github.io/hybridclaw/docs/channels/telegram),
|
|
365
|
+
[Signal](https://hybridaione.github.io/hybridclaw/docs/channels/signal),
|
|
366
|
+
[Threema](https://hybridaione.github.io/hybridclaw/docs/channels/threema),
|
|
367
|
+
[Email](https://hybridaione.github.io/hybridclaw/docs/channels/email),
|
|
368
|
+
[WhatsApp](https://hybridaione.github.io/hybridclaw/docs/channels/whatsapp),
|
|
369
|
+
[iMessage](https://hybridaione.github.io/hybridclaw/docs/channels/imessage), and
|
|
370
|
+
[Microsoft Teams](https://hybridaione.github.io/hybridclaw/docs/channels/msteams)
|
|
348
371
|
- Tutorials:
|
|
349
|
-
[Practical Workflows](https://
|
|
372
|
+
[Practical Workflows](https://hybridaione.github.io/hybridclaw/docs/tutorials) for owner,
|
|
350
373
|
GTM, marketing, sales, DevRel, content, invoicing, webinar, and release
|
|
351
374
|
launch workflows
|
|
352
375
|
- Skills and plugins:
|
|
353
|
-
[Extensibility](https://
|
|
354
|
-
[Bundled Skills](https://
|
|
355
|
-
[Plugin System](https://
|
|
356
|
-
[Memory Plugins](https://
|
|
357
|
-
[ByteRover Memory Plugin](https://
|
|
358
|
-
[GBrain Plugin](https://
|
|
359
|
-
[Mem0 Memory Plugin](https://
|
|
360
|
-
[Honcho Memory Plugin](https://
|
|
361
|
-
[MemPalace Memory Plugin](https://
|
|
376
|
+
[Extensibility](https://hybridaione.github.io/hybridclaw/docs/extensibility),
|
|
377
|
+
[Bundled Skills](https://hybridaione.github.io/hybridclaw/docs/guides/bundled-skills),
|
|
378
|
+
[Plugin System](https://hybridaione.github.io/hybridclaw/docs/extensibility/plugins),
|
|
379
|
+
[Memory Plugins](https://hybridaione.github.io/hybridclaw/docs/extensibility/memory-plugins),
|
|
380
|
+
[ByteRover Memory Plugin](https://hybridaione.github.io/hybridclaw/docs/extensibility/byterover-memory-plugin),
|
|
381
|
+
[GBrain Plugin](https://hybridaione.github.io/hybridclaw/docs/extensibility/gbrain-plugin),
|
|
382
|
+
[Mem0 Memory Plugin](https://hybridaione.github.io/hybridclaw/docs/extensibility/mem0-memory-plugin),
|
|
383
|
+
[Honcho Memory Plugin](https://hybridaione.github.io/hybridclaw/docs/extensibility/honcho-memory-plugin), and
|
|
384
|
+
[MemPalace Memory Plugin](https://hybridaione.github.io/hybridclaw/docs/extensibility/mempalace-memory-plugin)
|
|
362
385
|
- Configuration:
|
|
363
|
-
[Configuration Reference](https://
|
|
386
|
+
[Configuration Reference](https://hybridaione.github.io/hybridclaw/docs/reference/configuration)
|
|
364
387
|
- CLI reference:
|
|
365
|
-
[Commands](https://
|
|
366
|
-
[Diagnostics](https://
|
|
367
|
-
[FAQ](https://
|
|
388
|
+
[Commands](https://hybridaione.github.io/hybridclaw/docs/reference/commands),
|
|
389
|
+
[Diagnostics](https://hybridaione.github.io/hybridclaw/docs/reference/diagnostics), and
|
|
390
|
+
[FAQ](https://hybridaione.github.io/hybridclaw/docs/reference/faq)
|
|
368
391
|
|
|
369
392
|
## Contributing
|
|
370
393
|
|
package/SECURITY.md
CHANGED
|
@@ -148,6 +148,56 @@ Verification command:
|
|
|
148
148
|
hybridclaw audit verify <sessionId>
|
|
149
149
|
```
|
|
150
150
|
|
|
151
|
+
### 6) npm Supply-Chain Controls
|
|
152
|
+
|
|
153
|
+
HybridClaw treats npm lockfiles and package-manager configuration as security
|
|
154
|
+
controls:
|
|
155
|
+
|
|
156
|
+
- `.npmrc` enforces exact saves, strict engines, and a seven-day minimum release
|
|
157
|
+
age.
|
|
158
|
+
- `package.json` requires npm 11.10+ because older npm versions do not enforce
|
|
159
|
+
the release-age policy.
|
|
160
|
+
- CI upgrades to the pinned npm version before running `npm ci`, so pull
|
|
161
|
+
requests and release publishes use the same install policy as local
|
|
162
|
+
development.
|
|
163
|
+
- Docker builds install the pinned npm version before npm install steps. The
|
|
164
|
+
gateway image copies the repository `.npmrc` before `npm ci`; the agent image
|
|
165
|
+
materializes the same safe npm config inside its isolated Docker context.
|
|
166
|
+
- CI runs `npm audit signatures` after installs to verify npm registry
|
|
167
|
+
signatures and available provenance attestations for installed packages.
|
|
168
|
+
- Release publishing uses npm provenance through the trusted-publishing-capable
|
|
169
|
+
npm CLI. The npm package should be configured on npmjs.com to use trusted
|
|
170
|
+
publishing and to disallow token-based publishes after the OIDC workflow is
|
|
171
|
+
verified.
|
|
172
|
+
|
|
173
|
+
Dependency updates should use `npm ci` for verification and keep
|
|
174
|
+
`package-lock.json` changes reviewable. Avoid unconstrained interactive or
|
|
175
|
+
ad-hoc `npm update` runs; use the lockfile-only update script below so npm's
|
|
176
|
+
configured release-age gate applies and the resulting diff can be reviewed. Do
|
|
177
|
+
not add git, tarball, or non-registry dependencies without a specific security
|
|
178
|
+
review. The current WhatsApp channel dependency chain includes a pinned GitHub
|
|
179
|
+
dependency from `@whiskeysockets/baileys` to `libsignal`; replacing that
|
|
180
|
+
dependency with a registry-only package should be prioritized before enabling
|
|
181
|
+
npm's `allow-git` restriction.
|
|
182
|
+
|
|
183
|
+
Recommended dependency update workflow:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
npm install --global npm@11.10.0 --no-audit --fund=false
|
|
187
|
+
npm run deps:update-lockfile
|
|
188
|
+
git diff -- package.json package-lock.json container/package.json container/package-lock.json
|
|
189
|
+
npm run deps:verify
|
|
190
|
+
npm run typecheck
|
|
191
|
+
npm run test:unit
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
`deps:update-lockfile` regenerates the root/workspace lockfile and the standalone
|
|
195
|
+
container lockfile through npm's configured seven-day release-age filter.
|
|
196
|
+
`deps:verify` then performs clean installs from those lockfiles and verifies npm
|
|
197
|
+
registry signatures. Review lockfile diffs before merging; unexpected new
|
|
198
|
+
maintainers, new install scripts, git/tarball URLs, or large transitive churn
|
|
199
|
+
should be treated as security review triggers.
|
|
200
|
+
|
|
151
201
|
## Incident Response
|
|
152
202
|
|
|
153
203
|
If compromise is suspected:
|
|
@@ -157,6 +207,8 @@ If compromise is suspected:
|
|
|
157
207
|
3. Review mount allowlist, workspace files, and `sessionRouting.identityLinks`.
|
|
158
208
|
4. Inspect denied/authorization events with `hybridclaw audit approvals --denied`.
|
|
159
209
|
5. Validate audit integrity with `hybridclaw audit verify`.
|
|
210
|
+
6. If compromise may involve npm install-time malware, rotate npm, GitHub, SSH,
|
|
211
|
+
cloud, and registry credentials reachable from the affected host or runner.
|
|
160
212
|
|
|
161
213
|
## Reporting A Vulnerability
|
|
162
214
|
|
package/config.example.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version":
|
|
2
|
+
"version": 28,
|
|
3
3
|
"security": {
|
|
4
4
|
"trustModelAccepted": false,
|
|
5
5
|
"trustModelAcceptedAt": "",
|
|
@@ -15,6 +15,27 @@
|
|
|
15
15
|
"health_check_interval_ms": 30000
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
|
+
"browser": {
|
|
19
|
+
"provider": "local",
|
|
20
|
+
"local": {
|
|
21
|
+
"profileRoot": "",
|
|
22
|
+
"headed": false
|
|
23
|
+
},
|
|
24
|
+
"camofox": {
|
|
25
|
+
"profileRoot": "",
|
|
26
|
+
"headed": false,
|
|
27
|
+
"launchOptions": {}
|
|
28
|
+
},
|
|
29
|
+
"browserUseCloud": {
|
|
30
|
+
"apiKeyRef": {
|
|
31
|
+
"source": "store",
|
|
32
|
+
"id": "BROWSER_USE_API_KEY"
|
|
33
|
+
},
|
|
34
|
+
"baseUrl": "",
|
|
35
|
+
"browser": {},
|
|
36
|
+
"pricing": {}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
18
39
|
"skills": {
|
|
19
40
|
"extraDirs": [],
|
|
20
41
|
"disabled": [],
|
|
@@ -24,6 +45,7 @@
|
|
|
24
45
|
"signal": [],
|
|
25
46
|
"slack": [],
|
|
26
47
|
"telegram": [],
|
|
48
|
+
"threema": [],
|
|
27
49
|
"voice": [],
|
|
28
50
|
"whatsapp": [],
|
|
29
51
|
"email": []
|
|
@@ -39,6 +61,7 @@
|
|
|
39
61
|
"signal": "",
|
|
40
62
|
"slack": "",
|
|
41
63
|
"telegram": "",
|
|
64
|
+
"threema": "",
|
|
42
65
|
"voice": "This is a live phone call. Produce plain spoken text only.\nKeep each reply short and conversational, usually one or two short sentences.\nAbsolutely no markdown, bullets, numbered lists, headings, code fences, tables, JSON, or decorative formatting.\nDo not narrate internal reasoning, planning, tool usage, or stage directions. Say only what the caller should hear.\nDo not spell punctuation, formatting marks, or raw URLs unless the caller explicitly asks for exact characters.",
|
|
43
66
|
"whatsapp": "",
|
|
44
67
|
"email": "",
|
|
@@ -185,6 +208,16 @@
|
|
|
185
208
|
"reconnectIntervalMs": 5000,
|
|
186
209
|
"outboundDelayMs": 350
|
|
187
210
|
},
|
|
211
|
+
"threema": {
|
|
212
|
+
"enabled": false,
|
|
213
|
+
"apiBaseUrl": "https://msgapi.threema.ch",
|
|
214
|
+
"identity": "",
|
|
215
|
+
"secret": "",
|
|
216
|
+
"dmPolicy": "allowlist",
|
|
217
|
+
"allowFrom": [],
|
|
218
|
+
"textChunkLimit": 3500,
|
|
219
|
+
"outboundDelayMs": 350
|
|
220
|
+
},
|
|
188
221
|
"whatsapp": {
|
|
189
222
|
"dmPolicy": "pairing",
|
|
190
223
|
"groupPolicy": "disabled",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._srOnly_jfnet_1{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._chatPage_ebl64_1{--chat-hover-bg:color-mix(in srgb, var(--muted) 94%, var(--foreground) 6%);width:100%;max-width:100vw;height:var(--chat-visual-viewport-height,100dvh);min-height:0;display:flex;overflow:hidden}._chatPage_ebl64_1>div{height:100%;min-height:0}.layout:has(._chatPage_ebl64_1){width:100%;max-width:100vw;min-height:0;height:var(--chat-visual-viewport-height,100dvh);overflow:hidden}html:has(.chatPage){width:100%;max-width:100vw;overflow-x:hidden}body:has(.chatPage){width:100%;max-width:100vw;overflow-x:hidden}#root:has(.chatPage){width:100%;max-width:100vw;overflow-x:hidden}._chatSidebarHeader_ebl64_36{justify-content:space-between;align-items:center;gap:8px;padding:0 4px;display:flex}._chatSidebarContent_ebl64_44{flex-direction:column;gap:8px;padding:0 4px;display:flex;overflow:hidden}._newChatButton_ebl64_52{appearance:none;width:100%;color:inherit;font:inherit;border-radius:var(--radius-sm);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:12px;padding:18px 8px;font-weight:500;transition:background .12s;display:flex}._newChatButton_ebl64_52:hover{background:var(--chat-hover-bg)}._newChatButton_ebl64_52>span:first-child{justify-content:center;width:20px;font-size:1.25rem;line-height:1;display:inline-flex}._sidebarLabel_ebl64_82{text-transform:uppercase;letter-spacing:.08em;color:var(--muted-foreground);margin:12px 0 4px;padding:0 6px;font-size:.7rem;font-weight:700}._sidebarListHeader_ebl64_92{justify-content:space-between;align-items:center;gap:8px;display:flex}._sidebarScopeToggle_ebl64_99{border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--muted);align-items:center;padding:2px;display:inline-flex}._sidebarScopeButton_ebl64_108{appearance:none;border-radius:calc(var(--radius-sm) - 2px);color:var(--muted-foreground);font:inherit;cursor:pointer;background:0 0;border:0;padding:5px 8px;font-size:.72rem;font-weight:600;line-height:1;transition:background .12s,color .12s,box-shadow .12s}._sidebarScopeButton_ebl64_108:hover{color:var(--text)}._sidebarScopeButtonActive_ebl64_130{background:var(--primary);color:var(--primary-foreground);box-shadow:0 1px 2px #0f172a2e, 0 0 0 1px color-mix(in srgb, var(--primary) 70%, var(--background));font-weight:700}._sidebarScopeButtonActive_ebl64_130:hover{color:var(--primary-foreground)}._sessionList_ebl64_143{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}._sessionItem_ebl64_152{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_ebl64_152:hover{background:var(--chat-hover-bg)}._sessionItemPending_ebl64_174{animation:1s ease-in-out infinite _sessionPulse_ebl64_1}@keyframes _sessionPulse_ebl64_1{0%,to{opacity:1}50%{opacity:.5}}._sessionTitle_ebl64_188{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-size:.875rem;font-weight:500;overflow:hidden}._sessionTime_ebl64_197{color:var(--muted-foreground);font-size:.72rem}._sessionSnippet_ebl64_202{color:var(--muted-foreground);white-space:nowrap;text-overflow:ellipsis;font-size:.76rem;overflow:hidden}._sessionItemActive_ebl64_210 ._sessionTitle_ebl64_188,._sessionItemActive_ebl64_210 ._sessionSnippet_ebl64_202{color:var(--primary)}._sidebarSearchWrap_ebl64_215{padding:10px 0 4px}._sidebarSearch_ebl64_215{border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel-bg);width:100%;color:var(--text);font:inherit;padding:9px 11px}._sidebarSearch_ebl64_215::placeholder{color:var(--muted-foreground)}._sidebarSearch_ebl64_215:focus{outline:2px solid var(--accent-soft);outline-offset:1px;border-color:var(--ring)}._sidebarStatus_ebl64_239{color:var(--muted-foreground);padding:6px 10px;font-size:.82rem}aside[data-state=collapsed] ._newChatButton_ebl64_52{justify-content:center;gap:0;padding:10px 8px}aside[data-state=collapsed] ._newChatButton_ebl64_52>span:not(:first-child),aside[data-state=collapsed] ._sidebarSearchWrap_ebl64_215,aside[data-state=collapsed] ._chatSidebarContent_ebl64_44{display:none}._chatMobileTrigger_ebl64_258{margin-right:auto;display:inline-flex}._chatTopbar_ebl64_263{z-index:50;flex-shrink:0;justify-content:flex-end;align-items:center;gap:10px;min-width:0;max-width:100%;padding:24px 24px 0;display:flex;position:relative;overflow:visible}._mobileQrButton_ebl64_277{appearance:none;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-bg);width:36px;height:36px;color:var(--muted-foreground);cursor:pointer;justify-content:center;align-items:center;display:inline-flex}._mobileQrButton_ebl64_277:hover{color:var(--primary);border-color:color-mix(in srgb, var(--primary) 42%, var(--line))}._mobileQrButton_ebl64_277:disabled{opacity:.55;cursor:wait}._mobileQrIcon_ebl64_301{grid-template-rows:repeat(2,7px);grid-template-columns:repeat(2,7px);gap:3px;display:grid}._mobileQrIcon_ebl64_301 span{border:2px solid;border-radius:2px}._mobileQrOverlay_ebl64_313{z-index:80;background:#02061773;justify-content:center;align-items:center;padding:18px;display:flex;position:fixed;inset:0}._mobileQrDialog_ebl64_324{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--panel-bg);width:min(360px,100%);padding:18px;box-shadow:0 18px 55px #0f172a38}._mobileQrHeader_ebl64_333{justify-content:space-between;align-items:center;gap:12px;margin-bottom:14px;display:flex}._mobileQrHeader_ebl64_333 h2{margin:0;font-size:1rem;font-weight:650}._mobileQrClose_ebl64_347{appearance:none;border:1px solid var(--line);border-radius:var(--radius-sm);width:32px;height:32px;color:var(--muted-foreground);cursor:pointer;font:inherit;background:0 0;line-height:1}._mobileQrImage_ebl64_360{border:1px solid var(--line);border-radius:var(--radius-sm);background:#fff;justify-content:center;padding:12px;display:flex}._mobileQrImage_ebl64_360 img{width:min(260px,100%);height:auto}._mobileQrLink_ebl64_374{color:var(--primary);text-align:center;word-break:break-word;margin-top:12px;font-size:.86rem;display:block}._chatMain_ebl64_383{background:var(--page-bg);flex-direction:column;flex:auto;min-width:0;height:100%;min-height:0;display:flex;position:relative;overflow:hidden}._messageArea_ebl64_395{overscroll-behavior:contain;overflow-anchor:none;flex:auto;min-width:0;min-height:0;padding:16px 24px 12px;overflow:hidden auto}._messageList_ebl64_408{flex-direction:column;gap:12px;width:100%;min-width:0;max-width:100%;display:flex}._sidebarCollapseButton_ebl64_417{align-self:center}._emptyState_ebl64_421{flex-direction:column;flex:auto;justify-content:center;align-items:center;min-height:0;padding:48px 24px;display:flex}._greeting_ebl64_431{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_ebl64_440{flex-direction:column;gap:6px;width:100%;min-width:0;max-width:100%;display:flex}._jumpToLatest_ebl64_452{left:50%;bottom:calc(var(--chat-composer-height,132px) + 12px);border:1px solid var(--line-strong);background:var(--panel-bg);color:var(--text);font:inherit;cursor:pointer;box-shadow:var(--shadow-raised);z-index:40;border-radius:999px;align-items:center;gap:6px;padding:6px 14px;font-size:.82rem;font-weight:500;transition:background .12s;display:inline-flex;position:absolute;transform:translate(-50%)}._jumpToLatest_ebl64_452:hover{background:var(--chat-hover-bg)}._jumpToLatest_ebl64_452:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 55%, transparent);outline-offset:2px}._jumpToLatest_ebl64_452 span:first-child{font-weight:700;line-height:1}._messageBlockUser_ebl64_488{align-items:flex-end}._messageBlockAssistant_ebl64_492,._messageBlockSystem_ebl64_493{align-items:flex-start}._agentLabel_ebl64_497{color:var(--muted-foreground);align-items:center;gap:8px;padding:0 4px;font-size:.82rem;font-weight:600;display:flex}._agentAvatar_ebl64_507{object-fit:cover;border-radius:999px;width:32px;height:32px}._agentInitial_ebl64_514{background:var(--primary);width:32px;height:32px;color:var(--primary-foreground);border-radius:999px;justify-content:center;align-items:center;font-size:.86rem;font-weight:700;display:flex}._bubble_ebl64_527{word-wrap:break-word;overflow-wrap:break-word;border-radius:14px;min-width:0;max-width:85%;padding:10px 14px;font-size:.92rem;line-height:1.55}._bubbleUser_ebl64_538{background:linear-gradient(135deg, var(--primary), var(--ring));color:var(--primary-foreground);border-bottom-right-radius:4px}._bubbleAssistant_ebl64_544{background:var(--card);color:var(--card-foreground);border:1px solid var(--line);box-shadow:var(--shadow-card);border-bottom-left-radius:4px}._bubbleSystem_ebl64_552{background:var(--accent-soft);color:var(--accent-foreground);text-align:center;align-self:center;max-width:90%;font-size:.84rem}._markdownContent_ebl64_561{overflow-wrap:anywhere;min-width:0;max-width:100%;line-height:1.6}._markdownContent_ebl64_561 h1,._markdownContent_ebl64_561 h2,._markdownContent_ebl64_561 h3{color:var(--foreground);letter-spacing:-.02em;margin:.6em 0 .3em;font-weight:600}._markdownContent_ebl64_561 h1{font-size:1.25rem}._markdownContent_ebl64_561 h2{font-size:1.12rem}._markdownContent_ebl64_561 h3{font-size:1rem}._markdownContent_ebl64_561 p{margin:.4em 0}._markdownContent_ebl64_561 ul,._markdownContent_ebl64_561 ol{margin:.4em 0;padding-left:20px}._markdownContent_ebl64_561 li{margin:2px 0}._markdownContent_ebl64_561 blockquote{border-left:3px solid var(--line-strong);color:var(--muted-foreground);margin:.5em 0;padding:4px 12px}._markdownContent_ebl64_561 code{background:var(--muted);color:var(--foreground);border-radius:4px;padding:2px 5px;font-size:.86em}._markdownContent_ebl64_561 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_ebl64_561 pre code{color:inherit;font-size:inherit;background:0 0;border-radius:0;padding:0}._markdownContent_ebl64_561 hr{border:none;border-top:1px solid var(--line);margin:.8em 0}._markdownContent_ebl64_561 a{color:var(--primary);text-decoration:none}._markdownContent_ebl64_561 a:hover{text-decoration:underline}._markdownContent_ebl64_561 table{border-collapse:collapse;width:100%;margin:.5em 0;font-size:.86rem}._markdownContent_ebl64_561 th,._markdownContent_ebl64_561 td{border:1px solid var(--line);text-align:left;padding:6px 10px}._markdownContent_ebl64_561 th{background:var(--muted);font-weight:600}._markdownContent_ebl64_561 tbody tr:nth-child(2n){background:var(--muted)}._messageActions_ebl64_675{gap:4px;padding:0 4px;display:flex}._messageActions_ebl64_675 ._actionButton_ebl64_681{width:24px;height:24px;min-height:unset;color:var(--muted-foreground);background:0 0;border-color:#0000;border-radius:999px;font-size:.82rem}._messageActions_ebl64_675 ._actionButton_ebl64_681:hover:not(:disabled):not([data-disabled]){background:var(--chat-hover-bg);color:var(--foreground)}._actionButtonSuccess_ebl64_697{color:var(--success)}._branchSwitcher_ebl64_701{color:var(--muted-foreground);align-items:center;gap:4px;padding:0 4px;font-size:.75rem;display:inline-flex}._branchButton_ebl64_710{width:22px;height:22px;min-height:unset;border-radius:999px;font-size:.8rem}._branchButton_ebl64_710:hover:not(:disabled):not([data-disabled]){background:var(--chat-hover-bg);color:var(--text)}._branchButton_ebl64_710:disabled{opacity:.4;cursor:default}._approvalActions_ebl64_728{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}._approvalAllow_ebl64_735{border-color:var(--success-border);background:var(--success-soft);color:var(--success)}._artifactCard_ebl64_741{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--muted);flex-direction:column;align-items:center;gap:10px;width:fit-content;max-width:100%;margin-top:8px;padding:10px 14px;display:flex}._artifactCardWithPreview_ebl64_755{align-items:stretch;width:min(720px,100%)}._artifactHeader_ebl64_760{align-items:center;gap:10px;min-width:0;display:flex}._artifactFilename_ebl64_767{color:var(--text);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:.84rem;font-weight:500;overflow:hidden}._artifactBadge_ebl64_777{background:var(--accent-soft);color:var(--accent-foreground);border-radius:4px;flex-shrink:0;padding:2px 6px;font-size:.7rem;font-weight:500}._artifactDownload_ebl64_787{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_ebl64_787:hover{text-decoration:underline}._artifactDownload_ebl64_787:disabled{opacity:.6;cursor:default;text-decoration:none}._artifactPreview_ebl64_809{border-radius:var(--radius-sm);max-width:100%;overflow:hidden}._artifactPreview_ebl64_809 img{border-radius:var(--radius-sm);max-width:100%;display:block}._artifactPdfPreview_ebl64_821{border:1px solid var(--line);background:#fff;width:100%;height:min(60vh,560px);min-height:360px}._artifactPdfPreview_ebl64_821 iframe{background:#fff;border:0;width:100%;height:100%;display:block}._thinking_ebl64_837{align-items:center;gap:4px;padding:10px 14px;display:flex}._thinkingDot_ebl64_844{background:var(--muted-foreground);border-radius:999px;width:7px;height:7px;animation:1.2s ease-in-out infinite _thinkingBounce_ebl64_1}._thinkingDot_ebl64_844:nth-child(2){animation-delay:.15s}._thinkingDot_ebl64_844:nth-child(3){animation-delay:.3s}@keyframes _thinkingBounce_ebl64_1{0%,80%,to{opacity:.4;transform:scale(.6)}40%{opacity:1;transform:scale(1)}}._composerWrapper_ebl64_873{flex-shrink:0;min-width:0;max-width:100%;margin-top:auto;padding:0 24px 20px;overflow:hidden}._composer_ebl64_873{border:1px solid var(--line-strong);background:var(--panel-bg);width:100%;min-width:0;max-width:100%;box-shadow:var(--shadow-raised);border-radius:16px;flex-direction:column;gap:8px;padding:12px 16px;transition:border-color .15s;display:flex}._pendingMediaRow_ebl64_897{flex-wrap:wrap;gap:6px;padding:10px 14px 0;display:flex}._mediaChip_ebl64_904{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_ebl64_916{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}._mediaChipRemove_ebl64_922{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_ebl64_922:hover{color:var(--danger)}._composerRow_ebl64_941{align-items:flex-end;gap:8px;padding:10px 14px;display:flex}._composerActions_ebl64_948{justify-content:space-between;align-items:center;gap:8px;display:flex}._composerLeftActions_ebl64_955{align-items:center;gap:12px;min-width:0;display:flex}._composerInput_ebl64_962{resize:none;min-height:36px;max-height:180px;color:var(--text);background:0 0;border:none;outline:none;flex:auto;padding:0;font-size:.92rem;line-height:36px}._composerInput_ebl64_962:not(:placeholder-shown){padding:6px 0;line-height:1.5}._composerInput_ebl64_962::placeholder{color:var(--muted-foreground)}._attachButton_ebl64_985,._sendButton_ebl64_986{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_ebl64_985:focus-visible,._sendButton_ebl64_986:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 55%, transparent);outline-offset:2px}._attachButton_ebl64_985{color:var(--muted-foreground);background:0 0;font-size:1.2rem}._attachButton_ebl64_985:hover{background:var(--chat-hover-bg);color:var(--text)}._composerPill_ebl64_1021{max-width:220px;height:36px;color:var(--muted-foreground);font:inherit;cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;border-radius:999px;outline:none;align-items:center;gap:8px;padding:0 16px;font-size:.78rem;font-weight:500;line-height:36px;transition:background .12s,color .12s;display:inline-flex;position:relative;overflow:hidden}._composerPill_ebl64_1021:hover:not(:disabled):not([data-disabled]),._composerPill_ebl64_1021:focus,._composerPill_ebl64_1021:focus-within,._composerPill_ebl64_1021[data-state=open]{background:var(--chat-hover-bg);color:var(--text)}._composerPill_ebl64_1021:disabled,._composerPill_ebl64_1021[data-disabled]{opacity:.55;cursor:default}._agentSelect_ebl64_1063{appearance:none;max-width:180px;height:36px;color:inherit;font:inherit;font-size:inherit;font-weight:inherit;cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;outline:none;padding:0;line-height:36px;overflow:hidden}._agentSelect_ebl64_1063:disabled{cursor:default}._composerPillChevron_ebl64_1086{opacity:.7;flex-shrink:0;align-items:center;transition:transform .16s;display:inline-flex}._composerPill_ebl64_1021[data-state=open] ._composerPillChevron_ebl64_1086{opacity:1;transform:rotate(180deg)}._sendButton_ebl64_986{color:var(--muted-foreground);border:1px solid var(--line-strong);background:0 0;font-size:.9rem}._sendButton_ebl64_986:hover:not(:disabled){background:var(--chat-hover-bg);color:var(--text)}._sendButton_ebl64_986:disabled{opacity:.5;cursor:default}._sendButton_ebl64_986._stopping_ebl64_1116{background:var(--danger-soft);color:var(--danger)}._slashSuggestions_ebl64_1121{background:var(--popover);border:1px solid var(--line);border-radius:var(--radius-md);box-shadow:var(--shadow-popover);overflow:hidden}._slashSuggestionsScroll_ebl64_1129{max-height:220px}._slashSuggestionsList_ebl64_1133{outline:none}._suggestionItem_ebl64_1137{cursor:pointer;border-left:2px solid #0000;flex-direction:column;justify-content:center;gap:2px;min-width:0;min-height:44px;padding:10px 14px;transition:background .1s;display:flex}._suggestionItemActive_ebl64_1152{background:color-mix(in srgb, var(--primary) 14%, transparent);border-left-color:var(--primary)}._suggestionItemSub_ebl64_1157{padding-left:28px}._suggestionLabel_ebl64_1161{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-size:.86rem;font-weight:500;overflow:hidden}._suggestionLabelMono_ebl64_1170{font-family:var(--font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);color:var(--muted-foreground);font-size:.82rem}._suggestionMatch_ebl64_1176{color:inherit;text-underline-offset:3px;background:0 0;font-weight:700;text-decoration:underline;text-decoration-thickness:1px}._suggestionDesc_ebl64_1185{color:var(--muted-foreground);white-space:nowrap;text-overflow:ellipsis;font-size:.76rem;overflow:hidden}._suggestionEmpty_ebl64_1193{color:var(--muted-foreground);padding:14px;font-size:.82rem}@media (width<=768px){._suggestionItem_ebl64_1137{min-height:48px;padding:12px 14px}}._errorBanner_ebl64_1210{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_ebl64_1224{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_ebl64_1239{gap:6px;margin-top:6px;display:flex}@media (width<=900px){._chatPage_ebl64_1{width:100vw;max-width:100vw;position:fixed;inset:0}._chatPage_ebl64_1,._chatPage_ebl64_1 *{max-width:100vw}._chatPage_ebl64_1{height:var(--chat-visual-viewport-height,100svh)}._chatMain_ebl64_383{flex:0 0 100vw;width:100vw;max-width:100vw}._chatTopbar_ebl64_263{width:100vw;padding:8px 16px 0}._messageArea_ebl64_395{width:100vw;max-width:100vw;padding:16px 16px calc(var(--chat-composer-height,150px) + 12px)}._messageList_ebl64_408,._messageBlock_ebl64_440{width:100%;max-width:100%;overflow-x:clip}._bubble_ebl64_527,._bubbleUser_ebl64_538,._bubbleAssistant_ebl64_544{max-width:min(95%,100vw - 32px)}._composerWrapper_ebl64_873{z-index:45;background:var(--page-bg);padding:0 16px;position:fixed;bottom:0;left:0;right:0}._slashSuggestionsScroll_ebl64_1129{max-height:40vh}}@media (width<=480px){._bubbleUser_ebl64_538,._bubbleAssistant_ebl64_544{max-width:95%}._messageArea_ebl64_395{padding:12px 8px calc(var(--chat-composer-height,150px) + 12px)}._composerWrapper_ebl64_873{padding:0 12px}._emptyState_ebl64_421 h1{font-size:1.2rem}}@media (prefers-reduced-motion:reduce){._thinkingDot_ebl64_844,._sessionItemPending_ebl64_174{animation:none}}._root_16nbt_1{flex-direction:column;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}._viewport_16nbt_10{scrollbar-width:none;-ms-overflow-style:none;outline:none;flex:auto;width:100%;min-width:0;height:100%;min-height:0;overflow:hidden scroll}._viewport_16nbt_10::-webkit-scrollbar{width:0;height:0;display:none}._scrollbar_16nbt_29{opacity:0;touch-action:none;-webkit-user-select:none;user-select:none;background:0 0;flex-direction:column;width:8px;padding:0;transition:opacity .16s;display:flex;position:absolute;top:4px;bottom:4px;right:2px}._scrollbar_16nbt_29[data-state=visible]{opacity:.6}._root_16nbt_1:hover ._scrollbar_16nbt_29[data-state=visible],._scrollbar_16nbt_29[data-state=visible]:hover,._scrollbar_16nbt_29[data-state=visible]:focus-within{opacity:1}._thumb_16nbt_55{background:color-mix(in srgb, var(--text) 26%, transparent);cursor:grab;will-change:transform;border-radius:999px;width:100%;min-height:20px;transition:background .12s}._thumb_16nbt_55:hover{background:color-mix(in srgb, var(--text) 38%, transparent)}._thumb_16nbt_55:active{background:color-mix(in srgb, var(--text) 48%, transparent);cursor:grabbing}._trigger_1fi1d_1{border:1px solid var(--line,var(--panel-bg));background-color:var(--panel-bg);max-width:220px;height:32px;color:var(--text);font:inherit;cursor:pointer;border-radius:999px;outline:none;align-items:center;gap:6px;padding:0 10px 0 12px;font-size:.78rem;font-weight:500;line-height:1;transition:background-color .12s,color .12s,border-color .12s;display:inline-flex}._trigger_1fi1d_1:hover:not([data-disabled]),._trigger_1fi1d_1[data-state=open]{background-color:color-mix(in srgb, var(--panel-bg) 80%, var(--text) 20%);border-color:color-mix(in srgb, var(--text) 22%, var(--panel-bg))}._trigger_1fi1d_1:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 55%, transparent);outline-offset:2px}._trigger_1fi1d_1[data-disabled]{opacity:.55;cursor:default}._value_1fi1d_40{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._value_1fi1d_40[data-placeholder]{color:var(--muted-foreground)}._icon_1fi1d_52{color:currentColor;opacity:.7;flex-shrink:0;align-items:center;transition:transform .16s;display:inline-flex}._trigger_1fi1d_1[data-state=open] ._icon_1fi1d_52{opacity:1;transform:rotate(180deg)}._popup_1fi1d_66{z-index:1000;box-sizing:border-box;contain:layout style;border:1px solid color-mix(in srgb, var(--text) 28%, var(--panel-bg));background-color:var(--popover,var(--card,var(--panel-bg)));width:min(420px,100vw - 16px);height:min(440px,100vh - 32px);box-shadow:var(--shadow-popover);color:var(--text);border-radius:14px;outline:none;flex-direction:column;font-size:.82rem;transition:width .16s;animation:.12s ease-out _select-in_1fi1d_1;display:flex;position:fixed;overflow:hidden}._popup_1fi1d_66:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 55%, transparent);outline-offset:2px}:root[data-theme=dark] ._popup_1fi1d_66{background-color:#1c2536}:root[data-theme=light] ._popup_1fi1d_66{background-color:#fff}@keyframes _select-in_1fi1d_1{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}._popupHeader_1fi1d_111{border-bottom:1px solid color-mix(in srgb, var(--text) 12%, transparent);flex-shrink:0;padding:8px 8px 6px}._popupBodyPlain_1fi1d_117,._popupBody_1fi1d_117{flex:auto;min-width:0;min-height:0;display:flex}._popupRail_1fi1d_131{box-sizing:border-box;border-right:1px solid color-mix(in srgb, var(--text) 12%, transparent);scrollbar-width:none;flex-direction:column;flex-grow:0;flex-shrink:0;align-items:center;gap:2px;width:48px;padding:6px 4px;display:flex;overflow:hidden auto}._popupRail_1fi1d_131::-webkit-scrollbar{display:none}._listScroll_1fi1d_151{flex:auto;min-width:0;min-height:0}._list_1fi1d_151{outline:none;padding:6px}._list_1fi1d_151:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 55%, transparent);outline-offset:-2px;border-radius:12px}._group_1fi1d_168{display:block}._group_1fi1d_168+._group_1fi1d_168{margin-top:4px}._groupLabel_1fi1d_176{color:var(--muted-foreground);letter-spacing:.01em;padding:8px 10px 4px;font-size:.72rem;font-weight:500}._separator_1fi1d_184{background:color-mix(in srgb, var(--text) 12%, transparent);height:1px;margin:4px 6px}._empty_1fi1d_190{color:var(--muted-foreground);text-align:center;padding:18px 12px;font-size:.82rem}._item_1fi1d_197{min-height:34px;color:var(--text);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;outline:none;align-items:center;gap:10px;padding:6px 10px;font-size:.84rem;line-height:1.3;display:flex;position:relative}._item_1fi1d_197:has(>._itemIndicator_1fi1d_214){padding-left:30px}._item_1fi1d_197[data-highlighted]:not([data-disabled]){background:color-mix(in srgb, var(--panel-bg) 60%, var(--text) 14%)}._item_1fi1d_197[data-state=checked]{font-weight:600}._item_1fi1d_197[data-state=checked]:not([data-highlighted]){background:color-mix(in srgb, var(--panel-bg) 75%, var(--text) 6%)}._item_1fi1d_197[data-disabled]{opacity:.5;cursor:not-allowed}._itemIndicator_1fi1d_214{color:currentColor;justify-content:center;align-items:center;display:none;position:absolute;left:8px}._item_1fi1d_197[data-state=checked]>._itemIndicator_1fi1d_214{display:inline-flex}._itemText_1fi1d_248{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._itemBody_1fi1d_256{flex-direction:column;flex:auto;align-items:flex-start;gap:1px;min-width:0;display:flex}._itemBody_1fi1d_256>*{text-overflow:ellipsis;white-space:nowrap;max-width:100%;overflow:hidden}._itemSubtitle_1fi1d_272{color:var(--muted-foreground);letter-spacing:.01em;font-size:.7rem;font-weight:400}._itemMeta_1fi1d_279{color:var(--muted-foreground);font-variant-numeric:tabular-nums;flex-shrink:0;align-items:center;gap:6px;font-size:.7rem;display:inline-flex}._search_12ewc_1{background:color-mix(in srgb, var(--panel-bg) 65%, transparent);height:30px;color:var(--muted-foreground);border-radius:8px;align-items:center;gap:8px;padding:0 10px;display:flex}._search_12ewc_1:focus-within{background:color-mix(in srgb, var(--panel-bg) 50%, var(--text) 6%);color:var(--text)}._searchInput_12ewc_17{min-width:0;height:100%;color:var(--text);font:inherit;background:0 0;border:none;outline:none;flex:auto;font-size:.82rem}._searchInput_12ewc_17::placeholder{color:var(--muted-foreground)}._rail_12ewc_33{display:contents}._railItem_12ewc_37{width:36px;height:36px;color:var(--muted-foreground);cursor:pointer;background:0 0;border:none;border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;padding:0;transition:background .12s,color .12s;display:flex}._railItem_12ewc_37:hover:not([data-active]){background:color-mix(in srgb, var(--panel-bg) 60%, var(--text) 14%);color:var(--text)}._railItem_12ewc_37[data-active]{background:color-mix(in srgb, var(--panel-bg) 50%, var(--text) 18%);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--text) 26%, transparent)}._railItem_12ewc_37:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 55%, transparent);outline-offset:1px}._railGlyph_12ewc_70{width:22px;height:22px;color:var(--muted-foreground);filter:grayscale()saturate(0);justify-content:center;align-items:center;line-height:1;display:inline-flex}._railItem_12ewc_37:hover ._railGlyph_12ewc_70,._railItem_12ewc_37[data-active] ._railGlyph_12ewc_70{color:var(--text)}._triggerPill_12ewc_90{color:var(--muted-foreground);background-color:#0000;border-color:#0000;height:36px;padding:0 16px}._triggerPill_12ewc_90:hover:not([data-disabled]),._triggerPill_12ewc_90[data-state=open]{background-color:var(--chat-hover-bg);color:var(--text);border-color:#0000}._triggerLogo_12ewc_105{color:var(--muted-foreground);filter:grayscale()saturate(0);flex-shrink:0;align-items:center;line-height:1;display:inline-flex}._itemLogo_12ewc_114{width:20px;height:20px;color:var(--muted-foreground);filter:grayscale()saturate(0);flex-shrink:0;justify-content:center;align-items:center;line-height:1;display:inline-flex}._wrap_jrif0_1{flex-shrink:0;justify-content:center;align-items:center;width:34px;height:34px;display:inline-flex;position:relative}._trigger_jrif0_11{appearance:none;width:34px;height:34px;color:inherit;cursor:pointer;background:0 0;border:none;border-radius:999px;justify-content:center;align-items:center;padding:0;transition:background .12s;display:flex}._trigger_jrif0_11:hover,._trigger_jrif0_11:focus-visible{background:var(--muted);outline:none}._ring_jrif0_33{transform:rotate(-90deg)}._ringTrack_jrif0_37{fill:none;stroke:var(--line);stroke-width:3.5px}._ringFill_jrif0_43{fill:none;stroke-width:3.5px;stroke-linecap:round;transition:stroke-dashoffset .4s,stroke .2s}._ringFillNominal_jrif0_52{stroke:var(--primary)}._ringFillWarn_jrif0_56{stroke:var(--accent,#d97706)}._ringFillDanger_jrif0_60{stroke:var(--danger,#dc2626)}._ringLabel_jrif0_64{color:var(--muted-foreground);pointer-events:none;letter-spacing:0;justify-content:center;align-items:center;font-size:.62rem;font-weight:700;display:flex;position:absolute;inset:0}._ringLabelUnknown_jrif0_77{font-size:.7rem}._popover_jrif0_81{background:var(--popover);border:1px solid var(--line);border-radius:var(--radius-md);min-width:240px;box-shadow:var(--shadow-popover);color:var(--text);z-index:30;opacity:0;pointer-events:none;flex-direction:column;gap:6px;padding:10px 12px;font-size:.8rem;transition:opacity .15s,transform .15s;display:flex;position:absolute;top:calc(100% + 6px);right:0;transform:translateY(-4px)}._wrap_jrif0_1:hover ._popover_jrif0_81,._wrap_jrif0_1:focus-within ._popover_jrif0_81{opacity:1;pointer-events:auto;transform:translateY(0)}._popoverTitle_jrif0_112{color:var(--text);justify-content:space-between;gap:8px;font-size:.82rem;font-weight:600;display:flex}._popoverTitleValue_jrif0_121{color:var(--muted-foreground);font-weight:500}._popoverRow_jrif0_126{color:var(--muted-foreground);justify-content:space-between;gap:12px;display:flex}._popoverRowValue_jrif0_133{color:var(--text);font-variant-numeric:tabular-nums}._popoverProgress_jrif0_138{background:var(--muted);border-radius:999px;width:100%;height:6px;margin-top:2px;position:relative;overflow:hidden}._popoverProgressFill_jrif0_148{background:var(--primary);transition:width .4s,background .2s;position:absolute;inset:0 auto 0 0}._popoverProgressFillWarn_jrif0_157{background:var(--accent,#d97706)}._popoverProgressFillDanger_jrif0_161{background:var(--danger,#dc2626)}._popoverFoot_jrif0_165{color:var(--muted-foreground);margin-top:2px;font-size:.72rem}._button_kxq2k_1{white-space:nowrap;cursor:pointer;border-radius:var(--radius-sm);box-sizing:border-box;border:1px solid #0000;outline:none;flex-shrink:0;justify-content:center;align-items:center;gap:6px;font-size:.875rem;font-weight:500;line-height:1;text-decoration:none;transition:background .15s,border-color .15s,opacity .15s;display:inline-flex}._button_kxq2k_1:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 55%, transparent);outline-offset:2px}._button_kxq2k_1:disabled,._button_kxq2k_1[data-disabled]{cursor:default;opacity:.72}._button_kxq2k_1:disabled{pointer-events:none}._button_kxq2k_1[data-loading]{cursor:progress}._button_kxq2k_1 svg{pointer-events:none;flex-shrink:0}._default_kxq2k_50{background:var(--primary);border-color:var(--primary);color:var(--primary-foreground)}._default_kxq2k_50:hover:not(:disabled):not([data-disabled]){opacity:.9}._ghost_kxq2k_60{background:var(--panel-bg);border-color:var(--line-strong);color:var(--text)}._ghost_kxq2k_60:hover:not(:disabled):not([data-disabled]){background:var(--muted)}._outline_kxq2k_70{border-color:var(--line-strong);color:var(--text);background:0 0}._outline_kxq2k_70:hover:not(:disabled):not([data-disabled]){background:var(--muted)}._danger_kxq2k_80{background:var(--danger-soft);border-color:var(--danger-border);color:var(--danger)}._danger_kxq2k_80:hover:not(:disabled):not([data-disabled]){opacity:.85}._sizeDefault_kxq2k_92{min-height:36px;padding:9px 12px}._sizeSm_kxq2k_97{min-height:30px;padding:6px 10px;font-size:.8125rem}._sizeIcon_kxq2k_103{width:36px;height:36px;min-height:unset;padding:0}
|