@chrysb/alphaclaw 0.8.1 → 0.8.3-beta.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/README.md +33 -24
- package/bin/alphaclaw.js +13 -2
- package/lib/public/css/chat.css +426 -0
- package/lib/public/css/explorer.css +101 -0
- package/lib/public/css/tailwind.generated.css +1 -0
- package/lib/public/css/tailwind.input.css +3 -0
- package/lib/public/css/theme.css +28 -0
- package/lib/public/css/vendor/xterm.css +218 -0
- package/lib/public/dist/app.bundle.js +10706 -0
- package/lib/public/dist/chunks/addon-fit-W4YZGRNV.js +1 -0
- package/lib/public/dist/chunks/chunk-72ZECFVW.js +1 -0
- package/lib/public/dist/chunks/xterm-KOX4YMOF.js +9 -0
- package/lib/public/js/app.js +38 -4
- package/lib/public/js/components/action-button.js +8 -8
- package/lib/public/js/components/add-channel-menu.js +2 -2
- package/lib/public/js/components/agent-send-modal.js +6 -6
- package/lib/public/js/components/agents-tab/agent-bindings-section/channel-item-trailing.js +7 -7
- package/lib/public/js/components/agents-tab/agent-bindings-section/index.js +3 -3
- package/lib/public/js/components/agents-tab/agent-bindings-section/use-agent-bindings.js +1 -1
- package/lib/public/js/components/agents-tab/agent-bindings-section/use-channel-items.js +4 -4
- package/lib/public/js/components/agents-tab/agent-detail-panel.js +5 -5
- package/lib/public/js/components/agents-tab/agent-identity-section.js +18 -18
- package/lib/public/js/components/agents-tab/agent-overview/index.js +2 -2
- package/lib/public/js/components/agents-tab/agent-overview/manage-card.js +2 -2
- package/lib/public/js/components/agents-tab/agent-overview/model-card.js +8 -8
- package/lib/public/js/components/agents-tab/agent-overview/tools-card.js +5 -5
- package/lib/public/js/components/agents-tab/agent-overview/use-model-card.js +1 -1
- package/lib/public/js/components/agents-tab/agent-overview/use-workspace-card.js +1 -1
- package/lib/public/js/components/agents-tab/agent-overview/workspace-card.js +4 -4
- package/lib/public/js/components/agents-tab/agent-pairing-section.js +4 -4
- package/lib/public/js/components/agents-tab/agent-tools/index.js +5 -5
- package/lib/public/js/components/agents-tab/agent-tools/use-agent-tools.js +1 -1
- package/lib/public/js/components/agents-tab/create-agent-modal.js +13 -13
- package/lib/public/js/components/agents-tab/create-channel-modal.js +34 -34
- package/lib/public/js/components/agents-tab/delete-agent-dialog.js +3 -3
- package/lib/public/js/components/agents-tab/edit-agent-modal.js +9 -9
- package/lib/public/js/components/agents-tab/index.js +3 -3
- package/lib/public/js/components/agents-tab/use-agents.js +1 -1
- package/lib/public/js/components/badge.js +6 -6
- package/lib/public/js/components/channel-account-status-badge.js +2 -2
- package/lib/public/js/components/channel-operations-panel.js +2 -2
- package/lib/public/js/components/channels.js +9 -9
- package/lib/public/js/components/confirm-dialog.js +5 -5
- package/lib/public/js/components/credentials-modal.js +22 -22
- package/lib/public/js/components/cron-tab/cron-calendar.js +6 -6
- package/lib/public/js/components/cron-tab/cron-insights-panel.js +10 -10
- package/lib/public/js/components/cron-tab/cron-job-detail.js +4 -4
- package/lib/public/js/components/cron-tab/cron-job-list.js +4 -4
- package/lib/public/js/components/cron-tab/cron-job-settings-card.js +15 -15
- package/lib/public/js/components/cron-tab/cron-job-trends-panel.js +5 -5
- package/lib/public/js/components/cron-tab/cron-job-usage.js +16 -16
- package/lib/public/js/components/cron-tab/cron-overview.js +10 -10
- package/lib/public/js/components/cron-tab/cron-prompt-editor.js +3 -3
- package/lib/public/js/components/cron-tab/cron-run-history-panel.js +39 -39
- package/lib/public/js/components/cron-tab/cron-runs-trend-card.js +4 -4
- package/lib/public/js/components/cron-tab/index.js +5 -5
- package/lib/public/js/components/cron-tab/use-cron-tab.js +1 -1
- package/lib/public/js/components/device-pairings.js +12 -12
- package/lib/public/js/components/doctor/findings-list.js +22 -22
- package/lib/public/js/components/doctor/fix-card-modal.js +2 -2
- package/lib/public/js/components/doctor/general-warning.js +5 -5
- package/lib/public/js/components/doctor/index.js +26 -26
- package/lib/public/js/components/doctor/summary-cards.js +5 -5
- package/lib/public/js/components/envars.js +16 -16
- package/lib/public/js/components/features.js +4 -4
- package/lib/public/js/components/file-tree.js +4 -4
- package/lib/public/js/components/file-viewer/diff-viewer.js +2 -2
- package/lib/public/js/components/file-viewer/editor-surface.js +2 -2
- package/lib/public/js/components/file-viewer/frontmatter-panel.js +2 -2
- package/lib/public/js/components/file-viewer/index.js +3 -3
- package/lib/public/js/components/file-viewer/markdown-split-view.js +2 -2
- package/lib/public/js/components/file-viewer/media-preview.js +2 -2
- package/lib/public/js/components/file-viewer/scroll-sync.js +1 -1
- package/lib/public/js/components/file-viewer/sqlite-viewer.js +2 -2
- package/lib/public/js/components/file-viewer/status-banners.js +2 -2
- package/lib/public/js/components/file-viewer/toolbar.js +2 -2
- package/lib/public/js/components/file-viewer/use-editor-line-number-sync.js +1 -1
- package/lib/public/js/components/file-viewer/use-editor-selection-restore.js +1 -1
- package/lib/public/js/components/file-viewer/use-file-diff.js +1 -1
- package/lib/public/js/components/file-viewer/use-file-loader.js +1 -1
- package/lib/public/js/components/file-viewer/use-file-viewer-draft-sync.js +1 -1
- package/lib/public/js/components/file-viewer/use-file-viewer-hotkeys.js +1 -1
- package/lib/public/js/components/file-viewer/use-file-viewer.js +2 -2
- package/lib/public/js/components/gateway.js +12 -12
- package/lib/public/js/components/general/index.js +7 -7
- package/lib/public/js/components/general/use-general-tab.js +1 -1
- package/lib/public/js/components/global-restart-banner.js +2 -2
- package/lib/public/js/components/google/account-row.js +7 -7
- package/lib/public/js/components/google/add-account-modal.js +8 -8
- package/lib/public/js/components/google/gmail-setup-wizard.js +24 -24
- package/lib/public/js/components/google/gmail-watch-toggle.js +5 -5
- package/lib/public/js/components/google/index.js +6 -6
- package/lib/public/js/components/google/use-gmail-watch.js +1 -1
- package/lib/public/js/components/google/use-google-accounts.js +1 -1
- package/lib/public/js/components/icons.js +2 -2
- package/lib/public/js/components/info-tooltip.js +3 -3
- package/lib/public/js/components/loading-spinner.js +2 -2
- package/lib/public/js/components/modal-shell.js +5 -5
- package/lib/public/js/components/models-tab/index.js +11 -11
- package/lib/public/js/components/models-tab/model-picker.js +9 -9
- package/lib/public/js/components/models-tab/provider-auth-card.js +12 -12
- package/lib/public/js/components/models-tab/use-models.js +1 -1
- package/lib/public/js/components/models.js +18 -18
- package/lib/public/js/components/nodes-tab/browser-attach/index.js +5 -5
- package/lib/public/js/components/nodes-tab/connected-nodes/index.js +34 -32
- package/lib/public/js/components/nodes-tab/connected-nodes/use-connected-nodes-card.js +18 -3
- package/lib/public/js/components/nodes-tab/exec-allowlist/index.js +10 -10
- package/lib/public/js/components/nodes-tab/exec-allowlist/use-exec-allowlist.js +1 -1
- package/lib/public/js/components/nodes-tab/exec-config/index.js +13 -13
- package/lib/public/js/components/nodes-tab/exec-config/use-exec-config.js +1 -1
- package/lib/public/js/components/nodes-tab/index.js +2 -2
- package/lib/public/js/components/nodes-tab/setup-wizard/index.js +14 -14
- package/lib/public/js/components/nodes-tab/setup-wizard/use-setup-wizard.js +1 -1
- package/lib/public/js/components/nodes-tab/use-nodes-tab.js +1 -1
- package/lib/public/js/components/onboarding/use-welcome-codex.js +1 -1
- package/lib/public/js/components/onboarding/use-welcome-pairing.js +1 -1
- package/lib/public/js/components/onboarding/use-welcome-storage.js +1 -1
- package/lib/public/js/components/onboarding/welcome-config.js +3 -3
- package/lib/public/js/components/onboarding/welcome-form-step.js +34 -34
- package/lib/public/js/components/onboarding/welcome-header.js +2 -2
- package/lib/public/js/components/onboarding/welcome-import-step.js +22 -22
- package/lib/public/js/components/onboarding/welcome-pairing-step.js +15 -15
- package/lib/public/js/components/onboarding/welcome-placeholder-review-step.js +7 -7
- package/lib/public/js/components/onboarding/welcome-pre-step.js +9 -9
- package/lib/public/js/components/onboarding/welcome-secret-review-step.js +15 -15
- package/lib/public/js/components/onboarding/welcome-setup-step.js +8 -8
- package/lib/public/js/components/overflow-menu.js +3 -3
- package/lib/public/js/components/page-header.js +2 -2
- package/lib/public/js/components/pairings.js +14 -14
- package/lib/public/js/components/pane-shell.js +2 -2
- package/lib/public/js/components/pill-tabs.js +4 -4
- package/lib/public/js/components/pop-actions.js +3 -3
- package/lib/public/js/components/providers.js +17 -17
- package/lib/public/js/components/routes/agents-route.js +2 -2
- package/lib/public/js/components/routes/browse-route.js +2 -2
- package/lib/public/js/components/routes/chat-route.js +1094 -0
- package/lib/public/js/components/routes/cron-route.js +2 -2
- package/lib/public/js/components/routes/doctor-route.js +2 -2
- package/lib/public/js/components/routes/envars-route.js +2 -2
- package/lib/public/js/components/routes/general-route.js +2 -2
- package/lib/public/js/components/routes/index.js +1 -0
- package/lib/public/js/components/routes/models-route.js +2 -2
- package/lib/public/js/components/routes/nodes-route.js +2 -2
- package/lib/public/js/components/routes/providers-route.js +2 -2
- package/lib/public/js/components/routes/route-redirect.js +2 -2
- package/lib/public/js/components/routes/telegram-route.js +2 -2
- package/lib/public/js/components/routes/usage-route.js +2 -2
- package/lib/public/js/components/routes/watchdog-route.js +2 -2
- package/lib/public/js/components/routes/webhooks-route.js +2 -2
- package/lib/public/js/components/scope-picker.js +9 -9
- package/lib/public/js/components/secret-input.js +5 -5
- package/lib/public/js/components/segmented-control.js +2 -2
- package/lib/public/js/components/session-select-field.js +7 -7
- package/lib/public/js/components/sidebar-git-panel.js +3 -3
- package/lib/public/js/components/sidebar.js +55 -3
- package/lib/public/js/components/summary-stat-card.js +3 -3
- package/lib/public/js/components/telegram-workspace/index.js +10 -10
- package/lib/public/js/components/telegram-workspace/manage.js +36 -36
- package/lib/public/js/components/telegram-workspace/onboarding.js +73 -73
- package/lib/public/js/components/toast.js +8 -8
- package/lib/public/js/components/toggle-switch.js +2 -2
- package/lib/public/js/components/tooltip.js +5 -5
- package/lib/public/js/components/update-action-button.js +2 -2
- package/lib/public/js/components/update-modal.js +9 -9
- package/lib/public/js/components/usage-tab/constants.js +2 -2
- package/lib/public/js/components/usage-tab/index.js +3 -3
- package/lib/public/js/components/usage-tab/overview-section.js +15 -15
- package/lib/public/js/components/usage-tab/sessions-section.js +19 -19
- package/lib/public/js/components/usage-tab/use-usage-tab.js +2 -2
- package/lib/public/js/components/watchdog-tab/console/index.js +22 -8
- package/lib/public/js/components/watchdog-tab/console/use-console.js +28 -2
- package/lib/public/js/components/watchdog-tab/helpers.js +35 -6
- package/lib/public/js/components/watchdog-tab/incidents/index.js +6 -6
- package/lib/public/js/components/watchdog-tab/incidents/use-incidents.js +1 -1
- package/lib/public/js/components/watchdog-tab/index.js +4 -2
- package/lib/public/js/components/watchdog-tab/resource-bar.js +5 -5
- package/lib/public/js/components/watchdog-tab/resources/index.js +14 -3
- package/lib/public/js/components/watchdog-tab/resources/use-resources.js +1 -1
- package/lib/public/js/components/watchdog-tab/settings/index.js +97 -30
- package/lib/public/js/components/watchdog-tab/settings/use-settings.js +1 -1
- package/lib/public/js/components/watchdog-tab/terminal/index.js +3 -3
- package/lib/public/js/components/watchdog-tab/terminal/use-terminal.js +41 -5
- package/lib/public/js/components/watchdog-tab/use-watchdog-tab.js +2 -0
- package/lib/public/js/components/webhooks/create-webhook-modal/index.js +17 -17
- package/lib/public/js/components/webhooks/helpers.js +3 -3
- package/lib/public/js/components/webhooks/index.js +4 -4
- package/lib/public/js/components/webhooks/request-history/index.js +14 -14
- package/lib/public/js/components/webhooks/request-history/use-request-history.js +1 -1
- package/lib/public/js/components/webhooks/webhook-detail/index.js +41 -41
- package/lib/public/js/components/webhooks/webhook-detail/use-webhook-detail.js +1 -1
- package/lib/public/js/components/webhooks/webhook-list/index.js +11 -11
- package/lib/public/js/components/webhooks/webhook-list/use-webhook-list.js +1 -1
- package/lib/public/js/components/welcome/index.js +3 -3
- package/lib/public/js/components/welcome/use-welcome.js +10 -10
- package/lib/public/js/hooks/use-app-shell-controller.js +1 -1
- package/lib/public/js/hooks/use-app-shell-ui.js +1 -1
- package/lib/public/js/hooks/use-browse-navigation.js +14 -3
- package/lib/public/js/hooks/use-cached-fetch.js +1 -1
- package/lib/public/js/hooks/use-destination-session-selection.js +1 -1
- package/lib/public/js/hooks/use-hash-location.js +1 -1
- package/lib/public/js/hooks/useAgentSessions.js +1 -1
- package/lib/public/js/hooks/usePolling.js +1 -1
- package/lib/public/js/lib/app-navigation.js +1 -0
- package/lib/public/js/lib/storage-keys.js +3 -0
- package/lib/public/js/tailwind-config.js +39 -0
- package/lib/public/login.html +3 -18
- package/lib/public/setup.html +3 -18
- package/lib/server/auth-profiles.js +1 -1
- package/lib/server/chat-ws.js +835 -0
- package/lib/server/init/register-server-routes.js +2 -0
- package/lib/server/onboarding/validation.js +15 -10
- package/lib/server/routes/nodes.js +10 -2
- package/lib/server/routes/pairings.js +5 -1
- package/lib/server/routes/system.js +5 -0
- package/lib/server/routes/watchdog.js +15 -0
- package/lib/server/watchdog-terminal-ws.js +14 -1
- package/lib/server/watchdog.js +137 -51
- package/lib/server.js +38 -0
- package/package.json +14 -3
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT" /></a>
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
|
-
<p align="center">AlphaClaw wraps <a href="https://github.com/openclaw/openclaw">OpenClaw</a> with a convenient setup wizard, self-healing watchdog, Git-backed rollback, and full browser-based observability. Ships with anti-drift prompt hardening to keep your agent disciplined, and simplifies integrations (e.g. Google Workspace, Google Pub/Sub, Telegram Topics) so you can manage
|
|
16
|
+
<p align="center">AlphaClaw wraps <a href="https://github.com/openclaw/openclaw">OpenClaw</a> with a convenient setup wizard, self-healing watchdog, Git-backed rollback, and full browser-based observability. Ships with anti-drift prompt hardening to keep your agent disciplined, and simplifies integrations (e.g. Google Workspace, Google Pub/Sub, Telegram Topics, Slack, Discord) so you can manage multiple agents from one UI instead of config files.</p>
|
|
17
17
|
|
|
18
18
|
<p align="center"><em>First deploy to first message in under five minutes.</em></p>
|
|
19
19
|
|
|
@@ -28,15 +28,18 @@
|
|
|
28
28
|
|
|
29
29
|
- **Setup UI:** Password-protected web dashboard for onboarding, configuration, and day-to-day management.
|
|
30
30
|
- **Guided Onboarding:** Step-by-step setup wizard — model selection, provider credentials, GitHub repo, channel pairing.
|
|
31
|
+
- **Multi-Agent Management:** Sidebar-driven agent navigation with create, rename, and delete flows. Per-agent overview cards, channel bindings, and URL-driven agent selection.
|
|
31
32
|
- **Gateway Manager:** Spawns, monitors, restarts, and proxies the OpenClaw gateway as a managed child process.
|
|
32
|
-
- **Watchdog:** Crash detection, crash-loop recovery, auto-repair (`openclaw doctor --fix`),
|
|
33
|
-
- **Channel Orchestration:** Telegram and
|
|
34
|
-
- **Webhooks:** Named webhook endpoints with per-hook transform modules, request logging, and payload inspection.
|
|
33
|
+
- **Watchdog:** Crash detection, crash-loop recovery, auto-repair (`openclaw doctor --fix`), Telegram/Discord/Slack notifications, and a live interactive terminal for monitoring gateway output directly from the browser.
|
|
34
|
+
- **Channel Orchestration:** Telegram, Discord, and Slack bot pairing with per-agent channel bindings, credential sync, and a guided wizard for splitting Telegram into multi-threaded topic groups as your usage grows.
|
|
35
35
|
- **Google Workspace:** OAuth integration for Gmail, Calendar, Drive, Docs, Sheets, Tasks, Contacts, and Meet, plus guided Gmail watch setup with Google Pub/Sub topic, subscription, and push endpoint handling.
|
|
36
|
+
- **Cron Jobs:** Dedicated cron tab with job management, an interactive rolling calendar, run-history drilldowns, trend analytics, and per-run usage breakdowns.
|
|
37
|
+
- **Nodes:** Guided local-node setup for VPS deployments with per-node browser attach checks, reconnect commands, and routing/pairing controls.
|
|
38
|
+
- **Webhooks:** Named webhook endpoints with per-hook transform modules, request logging, payload inspection, editable delivery destinations, and OAuth callback support for third-party auth flows.
|
|
36
39
|
- **File Explorer:** Browser-based workspace explorer with file visibility, inline edits, diff view, and Git-aware sync for quick fixes without SSH.
|
|
37
40
|
- **Prompt Hardening:** Ships anti-drift bootstrap prompts (`AGENTS.md`, `TOOLS.md`) injected into your agent's system prompt on every message — enforcing safe practices, commit discipline, and change summaries out of the box.
|
|
38
41
|
- **Git Sync:** Automatic hourly commits of your OpenClaw workspace to GitHub with configurable cron schedule. Combined with prompt hardening, every agent action is version-controlled and auditable.
|
|
39
|
-
- **Version Management:** In-place updates for both AlphaClaw and OpenClaw with changelog review and one-click apply.
|
|
42
|
+
- **Version Management:** In-place updates for both AlphaClaw and OpenClaw with in-app release notes, changelog review, and one-click apply.
|
|
40
43
|
- **Codex OAuth:** Built-in PKCE flow for OpenAI Codex CLI model access.
|
|
41
44
|
|
|
42
45
|
## Why AlphaClaw
|
|
@@ -59,6 +62,8 @@ AlphaClaw simply wraps OpenClaw, it's not a dependency. Remove AlphaClaw and you
|
|
|
59
62
|
|
|
60
63
|
Set `SETUP_PASSWORD` at deploy time and visit your deployment URL. The welcome wizard handles the rest.
|
|
61
64
|
|
|
65
|
+
> **Railway users:** after deploying, upgrade to the **Hobby plan** and redeploy to ensure your service has at least **8 GB of RAM**. The Trial plan's memory limit can cause out-of-memory crashes during normal operation.
|
|
66
|
+
|
|
62
67
|
### Local / Docker
|
|
63
68
|
|
|
64
69
|
```bash
|
|
@@ -82,15 +87,17 @@ CMD ["alphaclaw", "start"]
|
|
|
82
87
|
|
|
83
88
|
## Setup UI
|
|
84
89
|
|
|
85
|
-
| Tab | What it manages
|
|
86
|
-
| ------------- |
|
|
87
|
-
| **General** | Gateway status, channel health, pending pairings, Google Workspace, repo sync schedule, OpenClaw dashboard
|
|
88
|
-
| **Browse** | File explorer for workspace visibility, inline edits, diff review, and Git-backed sync
|
|
89
|
-
| **Usage** | Token summaries, per-session and per-agent cost and token breakdown
|
|
90
|
-
| **
|
|
91
|
-
| **
|
|
92
|
-
| **
|
|
93
|
-
| **
|
|
90
|
+
| Tab | What it manages |
|
|
91
|
+
| ------------- | ------------------------------------------------------------------------------------------------------------------------ |
|
|
92
|
+
| **General** | Gateway status, channel health, pending pairings, Google Workspace, repo sync schedule, OpenClaw dashboard |
|
|
93
|
+
| **Browse** | File explorer for workspace visibility, inline edits, diff review, and Git-backed sync |
|
|
94
|
+
| **Usage** | Token summaries, per-session and per-agent cost and token breakdown with source/agent dimension comparisons |
|
|
95
|
+
| **Cron** | Cron job management, interactive rolling calendar, run-history drilldowns, trend analytics, and per-run usage breakdowns |
|
|
96
|
+
| **Nodes** | Guided local-node setup for VPS deployments, per-node browser attach, reconnect commands, and routing/pairing controls |
|
|
97
|
+
| **Watchdog** | Health monitoring, crash-loop status, auto-repair toggle, notifications, event log, live log tail, interactive terminal |
|
|
98
|
+
| **Providers** | AI provider credentials (Anthropic, OpenAI, Gemini, Mistral, Voyage, Groq, Deepgram) and model selection |
|
|
99
|
+
| **Envars** | Environment variables — view, edit, add — with gateway restart prompts |
|
|
100
|
+
| **Webhooks** | Webhook endpoints, transform modules, request history, payload inspection, OAuth callbacks, Gmail watch delivery flows |
|
|
94
101
|
|
|
95
102
|
## CLI
|
|
96
103
|
|
|
@@ -124,14 +131,14 @@ graph TD
|
|
|
124
131
|
|
|
125
132
|
The built-in watchdog monitors gateway health and recovers from failures automatically.
|
|
126
133
|
|
|
127
|
-
| Capability | Details
|
|
128
|
-
| ------------------------ |
|
|
129
|
-
| **Health checks** | Periodic `openclaw health` with configurable interval
|
|
130
|
-
| **Crash detection** | Listens for gateway exit events
|
|
131
|
-
| **Crash-loop detection** | Threshold-based (default: 3 crashes in 300s)
|
|
132
|
-
| **Auto-repair** | Runs `openclaw doctor --fix --yes`, relaunches gateway
|
|
133
|
-
| **Notifications** | Telegram and
|
|
134
|
-
| **Event log** | SQLite-backed incident history with API and UI access
|
|
134
|
+
| Capability | Details |
|
|
135
|
+
| ------------------------ | ---------------------------------------------------------------------- |
|
|
136
|
+
| **Health checks** | Periodic `openclaw health` with configurable interval |
|
|
137
|
+
| **Crash detection** | Listens for gateway exit events |
|
|
138
|
+
| **Crash-loop detection** | Threshold-based (default: 3 crashes in 300s) |
|
|
139
|
+
| **Auto-repair** | Runs `openclaw doctor --fix --yes`, relaunches gateway |
|
|
140
|
+
| **Notifications** | Telegram, Discord, and Slack alerts for crashes, repairs, and recovery |
|
|
141
|
+
| **Event log** | SQLite-backed incident history with API and UI access |
|
|
135
142
|
|
|
136
143
|
## Environment Variables
|
|
137
144
|
|
|
@@ -143,6 +150,7 @@ The built-in watchdog monitors gateway health and recovers from failures automat
|
|
|
143
150
|
| `GITHUB_WORKSPACE_REPO` | Yes | GitHub repo for workspace sync (e.g. `owner/repo`) |
|
|
144
151
|
| `TELEGRAM_BOT_TOKEN` | Optional | Telegram bot token |
|
|
145
152
|
| `DISCORD_BOT_TOKEN` | Optional | Discord bot token |
|
|
153
|
+
| `SLACK_BOT_TOKEN` | Optional | Slack bot token (Socket Mode) |
|
|
146
154
|
| `WATCHDOG_AUTO_REPAIR` | Optional | Enable auto-repair on crash (`true`/`false`) |
|
|
147
155
|
| `WATCHDOG_NOTIFICATIONS_DISABLED` | Optional | Disable watchdog notifications (`true`/`false`) |
|
|
148
156
|
| `PORT` | Optional | Server port (default `3000`) |
|
|
@@ -156,7 +164,7 @@ AlphaClaw is a convenience wrapper — it intentionally trades some of OpenClaw'
|
|
|
156
164
|
| Area | What AlphaClaw does | Trade-off |
|
|
157
165
|
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
158
166
|
| **Setup password** | All gateway access is gated behind a single `SETUP_PASSWORD`. Brute-force protection is built in (exponential backoff lockout). | Simpler than OpenClaw's pairing code flow, but the password must be strong. |
|
|
159
|
-
| **One-click pairing** | Channel pairings (Telegram/Discord) can be approved from the Setup UI instead of the CLI.
|
|
167
|
+
| **One-click pairing** | Channel pairings (Telegram/Discord/Slack) can be approved from the Setup UI instead of the CLI. | No terminal access required, but anyone with the setup password can approve pairings. |
|
|
160
168
|
| **Auto CLI approval** | The first CLI device pairing is auto-approved so you can connect without a second screen. Subsequent requests appear in the UI. | Removes the manual pairing step for the initial CLI connection. |
|
|
161
169
|
| **Query-string tokens** | Webhook URLs support `?token=<WEBHOOK_TOKEN>` for providers that don't support `Authorization` headers. Warnings are shown in the UI. | Tokens may appear in server logs and referrer headers. Use header auth when your provider supports it. |
|
|
162
170
|
| **Gateway token** | `OPENCLAW_GATEWAY_TOKEN` is auto-generated and injected into the environment so the proxy can authenticate with the gateway. | The token lives in the `.env` file on the server — standard for managed deployments but worth noting. |
|
|
@@ -167,7 +175,8 @@ If you need OpenClaw's full security posture (manual pairing codes, no query-str
|
|
|
167
175
|
|
|
168
176
|
```bash
|
|
169
177
|
npm install
|
|
170
|
-
npm
|
|
178
|
+
npm run build:ui # Generate Setup UI bundle, Tailwind CSS, and vendor CSS (required for local runs from a git checkout)
|
|
179
|
+
npm test # Full suite (440 tests)
|
|
171
180
|
npm run test:watchdog # Watchdog-focused suite (14 tests)
|
|
172
181
|
npm run test:watch # Watch mode
|
|
173
182
|
npm run test:coverage # Coverage report
|
package/bin/alphaclaw.js
CHANGED
|
@@ -131,13 +131,13 @@ const resolveGithubRepoPath = (value) =>
|
|
|
131
131
|
// ---------------------------------------------------------------------------
|
|
132
132
|
|
|
133
133
|
const rootDir =
|
|
134
|
-
flagValue(
|
|
134
|
+
flagValue(args, "--root-dir") ||
|
|
135
135
|
process.env.ALPHACLAW_ROOT_DIR ||
|
|
136
136
|
path.join(os.homedir(), ".alphaclaw");
|
|
137
137
|
|
|
138
138
|
process.env.ALPHACLAW_ROOT_DIR = rootDir;
|
|
139
139
|
|
|
140
|
-
const portFlag = flagValue(
|
|
140
|
+
const portFlag = flagValue(args, "--port");
|
|
141
141
|
if (portFlag) {
|
|
142
142
|
process.env.PORT = portFlag;
|
|
143
143
|
}
|
|
@@ -466,6 +466,17 @@ if (
|
|
|
466
466
|
process.exit(runTelegramTopicAdd());
|
|
467
467
|
}
|
|
468
468
|
|
|
469
|
+
const kPort = String(process.env.PORT || "3000").trim();
|
|
470
|
+
if (kPort === "18789") {
|
|
471
|
+
console.error(
|
|
472
|
+
[
|
|
473
|
+
"[alphaclaw] Fatal config error: AlphaClaw cannot be started on port 18789.",
|
|
474
|
+
"[alphaclaw] Port 18789 is reserved for the OpenClaw gateway.",
|
|
475
|
+
].join("\n"),
|
|
476
|
+
);
|
|
477
|
+
process.exit(1);
|
|
478
|
+
}
|
|
479
|
+
|
|
469
480
|
const kSetupPassword = String(process.env.SETUP_PASSWORD || "").trim();
|
|
470
481
|
if (!kSetupPassword) {
|
|
471
482
|
console.error(
|
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
/* ── Chat route ──────────────────────────────── */
|
|
2
|
+
|
|
3
|
+
.app-content-pane.chat-pane {
|
|
4
|
+
padding: 0;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.chat-route-shell {
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
min-height: 100%;
|
|
11
|
+
height: 100%;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.chat-route-header {
|
|
15
|
+
padding: 16px 24px 10px;
|
|
16
|
+
border-bottom: 1px solid var(--border);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.chat-route-title {
|
|
20
|
+
font-size: 16px;
|
|
21
|
+
font-weight: 600;
|
|
22
|
+
color: var(--text);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.chat-route-subtitle {
|
|
26
|
+
margin-top: 4px;
|
|
27
|
+
font-size: 12px;
|
|
28
|
+
color: var(--text-muted);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.chat-route-warning {
|
|
32
|
+
margin-top: 8px;
|
|
33
|
+
font-size: 12px;
|
|
34
|
+
color: #fca5a5;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.chat-thread {
|
|
38
|
+
flex: 1 1 auto;
|
|
39
|
+
min-height: 0;
|
|
40
|
+
overflow-y: auto;
|
|
41
|
+
padding: 16px 24px;
|
|
42
|
+
display: flex;
|
|
43
|
+
flex-direction: column;
|
|
44
|
+
gap: 10px;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.chat-empty-state {
|
|
48
|
+
color: var(--text-dim);
|
|
49
|
+
font-size: 12px;
|
|
50
|
+
text-align: center;
|
|
51
|
+
margin-top: 24px;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.chat-bubble {
|
|
55
|
+
max-width: 86%;
|
|
56
|
+
border-radius: 10px;
|
|
57
|
+
border: 1px solid var(--panel-border-contrast);
|
|
58
|
+
background: rgba(255, 255, 255, 0.02);
|
|
59
|
+
padding: 12px 14px;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.chat-bubble.is-user {
|
|
63
|
+
align-self: flex-end;
|
|
64
|
+
background: rgba(99, 235, 255, 0.06);
|
|
65
|
+
border-color: rgba(99, 235, 255, 0.24);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.chat-bubble.is-assistant {
|
|
69
|
+
align-self: flex-start;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.chat-bubble-meta {
|
|
73
|
+
display: flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
justify-content: space-between;
|
|
76
|
+
gap: 10px;
|
|
77
|
+
margin-bottom: 8px;
|
|
78
|
+
font-size: 11px;
|
|
79
|
+
color: var(--text-muted);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.chat-bubble-content {
|
|
83
|
+
margin: 0;
|
|
84
|
+
font-family: inherit;
|
|
85
|
+
font-size: 12px;
|
|
86
|
+
color: var(--text);
|
|
87
|
+
line-height: 1.6;
|
|
88
|
+
white-space: pre-wrap;
|
|
89
|
+
overflow-wrap: anywhere;
|
|
90
|
+
word-break: break-word;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.chat-bubble-markdown > :first-child {
|
|
94
|
+
margin-top: 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.chat-bubble-markdown > :last-child {
|
|
98
|
+
margin-bottom: 0;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.chat-bubble-markdown {
|
|
102
|
+
white-space: normal;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.chat-bubble-markdown p,
|
|
106
|
+
.chat-bubble-markdown ul,
|
|
107
|
+
.chat-bubble-markdown ol,
|
|
108
|
+
.chat-bubble-markdown pre,
|
|
109
|
+
.chat-bubble-markdown blockquote {
|
|
110
|
+
margin: 8px 0;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.chat-bubble-markdown ul,
|
|
114
|
+
.chat-bubble-markdown ol {
|
|
115
|
+
padding-left: 18px;
|
|
116
|
+
padding-top: 0;
|
|
117
|
+
padding-bottom: 0;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.chat-bubble-markdown ul {
|
|
121
|
+
list-style: disc;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.chat-bubble-markdown ol {
|
|
125
|
+
list-style: decimal;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.chat-bubble-markdown li > p {
|
|
129
|
+
margin: 0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.chat-bubble-markdown li + li {
|
|
133
|
+
margin-top: 4px;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.chat-bubble-markdown > * + * {
|
|
137
|
+
margin-top: 8px;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.chat-bubble-markdown h1,
|
|
141
|
+
.chat-bubble-markdown h2,
|
|
142
|
+
.chat-bubble-markdown h3,
|
|
143
|
+
.chat-bubble-markdown h4 {
|
|
144
|
+
margin: 0;
|
|
145
|
+
line-height: 1.25;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.chat-bubble-markdown h1 {
|
|
149
|
+
font-size: 16px;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.chat-bubble-markdown h2 {
|
|
153
|
+
font-size: 14px;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.chat-bubble-markdown h3,
|
|
157
|
+
.chat-bubble-markdown h4 {
|
|
158
|
+
font-size: 13px;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.chat-bubble-markdown h1 + *,
|
|
162
|
+
.chat-bubble-markdown h2 + *,
|
|
163
|
+
.chat-bubble-markdown h3 + *,
|
|
164
|
+
.chat-bubble-markdown h4 + * {
|
|
165
|
+
margin-top: 10px;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.chat-bubble-markdown code {
|
|
169
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
|
|
170
|
+
"Courier New", monospace;
|
|
171
|
+
font-size: 11px;
|
|
172
|
+
background: rgba(255, 255, 255, 0.06);
|
|
173
|
+
padding: 1px 4px;
|
|
174
|
+
border-radius: 4px;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.chat-bubble-markdown pre code {
|
|
178
|
+
display: block;
|
|
179
|
+
white-space: pre-wrap;
|
|
180
|
+
overflow-wrap: anywhere;
|
|
181
|
+
padding: 8px;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.chat-bubble-json {
|
|
185
|
+
white-space: pre-wrap;
|
|
186
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
|
|
187
|
+
"Courier New", monospace;
|
|
188
|
+
font-size: 11px;
|
|
189
|
+
line-height: 1.6;
|
|
190
|
+
background: rgba(255, 255, 255, 0.04);
|
|
191
|
+
border: 1px solid var(--panel-border-contrast);
|
|
192
|
+
border-radius: 8px;
|
|
193
|
+
padding: 10px;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.chat-message-json {
|
|
197
|
+
margin-top: 10px;
|
|
198
|
+
border-top: 1px dashed var(--border);
|
|
199
|
+
padding-top: 8px;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.chat-message-json summary {
|
|
203
|
+
cursor: pointer;
|
|
204
|
+
color: var(--text-muted);
|
|
205
|
+
font-size: 11px;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.chat-message-json pre {
|
|
209
|
+
margin: 8px 0 0;
|
|
210
|
+
font-size: 11px;
|
|
211
|
+
line-height: 1.45;
|
|
212
|
+
color: var(--text-muted);
|
|
213
|
+
white-space: pre-wrap;
|
|
214
|
+
overflow-wrap: anywhere;
|
|
215
|
+
word-break: break-word;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.chat-tool-call-list {
|
|
219
|
+
display: flex;
|
|
220
|
+
flex-direction: column;
|
|
221
|
+
gap: 8px;
|
|
222
|
+
margin-top: 6px;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.chat-tool-call-row {
|
|
226
|
+
border: 1px dashed var(--border);
|
|
227
|
+
border-radius: 8px;
|
|
228
|
+
padding: 6px 8px;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.chat-tool-call-row summary {
|
|
232
|
+
cursor: pointer;
|
|
233
|
+
display: flex;
|
|
234
|
+
align-items: center;
|
|
235
|
+
justify-content: space-between;
|
|
236
|
+
gap: 8px;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.chat-tool-call-name {
|
|
240
|
+
color: var(--text);
|
|
241
|
+
font-size: 12px;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.chat-tool-call-status {
|
|
245
|
+
color: var(--text-muted);
|
|
246
|
+
font-size: 10px;
|
|
247
|
+
text-transform: lowercase;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.chat-tool-inline {
|
|
251
|
+
font-weight: 600;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.chat-tool-inline-message {
|
|
255
|
+
margin: 0;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.chat-tool-inline-message summary {
|
|
259
|
+
cursor: pointer;
|
|
260
|
+
list-style: none;
|
|
261
|
+
color: var(--text);
|
|
262
|
+
display: flex;
|
|
263
|
+
align-items: center;
|
|
264
|
+
justify-content: flex-start;
|
|
265
|
+
gap: 10px;
|
|
266
|
+
font-size: 12px;
|
|
267
|
+
line-height: 1.6;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.chat-tool-inline-message summary::-webkit-details-marker {
|
|
271
|
+
display: none;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.chat-tool-inline-message summary::before {
|
|
275
|
+
content: "▸";
|
|
276
|
+
color: var(--text-muted);
|
|
277
|
+
font-size: 12px;
|
|
278
|
+
line-height: 1;
|
|
279
|
+
margin-right: 2px;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.chat-tool-inline-message[open] summary::before {
|
|
283
|
+
content: "▾";
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.chat-tool-inline-icon {
|
|
287
|
+
font-size: 12px;
|
|
288
|
+
line-height: 1;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.chat-tool-inline-title {
|
|
292
|
+
font-weight: 600;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.chat-tool-inline-time {
|
|
296
|
+
margin-left: auto;
|
|
297
|
+
font-size: 11px;
|
|
298
|
+
color: var(--text-muted);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.chat-tool-inline-body {
|
|
302
|
+
margin-top: 8px;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.chat-tool-inline-label {
|
|
306
|
+
margin-top: 8px;
|
|
307
|
+
margin-bottom: 4px;
|
|
308
|
+
font-size: 11px;
|
|
309
|
+
color: var(--text-muted);
|
|
310
|
+
text-transform: uppercase;
|
|
311
|
+
letter-spacing: 0.04em;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
.chat-tool-inline-body pre {
|
|
315
|
+
margin: 0;
|
|
316
|
+
font-size: 11px;
|
|
317
|
+
line-height: 1.45;
|
|
318
|
+
color: var(--text-muted);
|
|
319
|
+
white-space: pre-wrap;
|
|
320
|
+
overflow-wrap: anywhere;
|
|
321
|
+
word-break: break-word;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
.chat-typing-indicator {
|
|
325
|
+
min-width: 170px;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
.chat-typing-dots {
|
|
329
|
+
display: inline-flex;
|
|
330
|
+
align-items: center;
|
|
331
|
+
gap: 5px;
|
|
332
|
+
padding: 2px 0 1px;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.chat-typing-dots span {
|
|
336
|
+
width: 6px;
|
|
337
|
+
height: 6px;
|
|
338
|
+
border-radius: 999px;
|
|
339
|
+
background: var(--text-muted);
|
|
340
|
+
opacity: 0.45;
|
|
341
|
+
animation: chatTypingPulse 1.2s infinite ease-in-out;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.chat-typing-dots span:nth-child(2) {
|
|
345
|
+
animation-delay: 0.15s;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.chat-typing-dots span:nth-child(3) {
|
|
349
|
+
animation-delay: 0.3s;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
@keyframes chatTypingPulse {
|
|
353
|
+
0%,
|
|
354
|
+
80%,
|
|
355
|
+
100% {
|
|
356
|
+
transform: translateY(0);
|
|
357
|
+
opacity: 0.35;
|
|
358
|
+
}
|
|
359
|
+
40% {
|
|
360
|
+
transform: translateY(-2px);
|
|
361
|
+
opacity: 0.9;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.chat-composer {
|
|
366
|
+
border-top: 1px solid var(--border);
|
|
367
|
+
padding: 12px 24px 16px;
|
|
368
|
+
display: flex;
|
|
369
|
+
align-items: flex-end;
|
|
370
|
+
gap: 10px;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.chat-composer-input {
|
|
374
|
+
flex: 1;
|
|
375
|
+
min-height: 68px;
|
|
376
|
+
max-height: 180px;
|
|
377
|
+
border-radius: 10px;
|
|
378
|
+
resize: vertical;
|
|
379
|
+
font-family: inherit;
|
|
380
|
+
font-size: 12px;
|
|
381
|
+
line-height: 1.4;
|
|
382
|
+
padding: 10px;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
.chat-composer-send {
|
|
386
|
+
white-space: nowrap;
|
|
387
|
+
padding: 8px 14px;
|
|
388
|
+
border-radius: 9px;
|
|
389
|
+
font-family: inherit;
|
|
390
|
+
font-size: 12px;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
.chat-composer-actions {
|
|
394
|
+
display: inline-flex;
|
|
395
|
+
align-items: center;
|
|
396
|
+
gap: 8px;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.chat-composer-stop {
|
|
400
|
+
white-space: nowrap;
|
|
401
|
+
padding: 8px 12px;
|
|
402
|
+
border-radius: 9px;
|
|
403
|
+
font-family: inherit;
|
|
404
|
+
font-size: 12px;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.chat-raw-debug {
|
|
408
|
+
margin-top: 8px;
|
|
409
|
+
border-top: 1px dashed var(--border);
|
|
410
|
+
padding-top: 8px;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
.chat-raw-debug summary {
|
|
414
|
+
cursor: pointer;
|
|
415
|
+
color: var(--text-muted);
|
|
416
|
+
font-size: 11px;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
.chat-raw-debug pre {
|
|
420
|
+
margin: 8px 0 0;
|
|
421
|
+
font-size: 11px;
|
|
422
|
+
color: var(--text-muted);
|
|
423
|
+
white-space: pre-wrap;
|
|
424
|
+
overflow-wrap: anywhere;
|
|
425
|
+
word-break: break-word;
|
|
426
|
+
}
|
|
@@ -210,6 +210,107 @@
|
|
|
210
210
|
margin-top: 8px;
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
+
/* ── Sidebar chat sessions ───────────────────── */
|
|
214
|
+
|
|
215
|
+
.sidebar-chat-header {
|
|
216
|
+
display: flex;
|
|
217
|
+
align-items: center;
|
|
218
|
+
justify-content: space-between;
|
|
219
|
+
gap: 8px;
|
|
220
|
+
padding: 12px 16px 4px;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.sidebar-chat-label {
|
|
224
|
+
padding: 0;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.sidebar-chat-new-button {
|
|
228
|
+
border: none;
|
|
229
|
+
background: transparent;
|
|
230
|
+
color: var(--text-muted);
|
|
231
|
+
font: inherit;
|
|
232
|
+
display: inline-flex;
|
|
233
|
+
align-items: center;
|
|
234
|
+
justify-content: center;
|
|
235
|
+
line-height: 1;
|
|
236
|
+
padding: 6px;
|
|
237
|
+
margin: -6px;
|
|
238
|
+
cursor: pointer;
|
|
239
|
+
opacity: 0.9;
|
|
240
|
+
transition: color 0.1s, opacity 0.1s;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.sidebar-chat-new-icon {
|
|
244
|
+
width: 16px;
|
|
245
|
+
height: 16px;
|
|
246
|
+
display: block;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.sidebar-chat-new-button:hover {
|
|
250
|
+
color: var(--text);
|
|
251
|
+
opacity: 1;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.sidebar-chat-sessions-list {
|
|
255
|
+
flex: 1 1 auto;
|
|
256
|
+
min-height: 0;
|
|
257
|
+
overflow-y: auto;
|
|
258
|
+
padding: 2px 0 8px;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.sidebar-chat-session-item {
|
|
262
|
+
display: flex;
|
|
263
|
+
align-items: center;
|
|
264
|
+
gap: 6px;
|
|
265
|
+
padding: 6px 16px 6px 24px;
|
|
266
|
+
color: var(--text-muted);
|
|
267
|
+
font-size: 13px;
|
|
268
|
+
line-height: 1.4;
|
|
269
|
+
cursor: pointer;
|
|
270
|
+
transition: background 0.1s, color 0.1s;
|
|
271
|
+
position: relative;
|
|
272
|
+
user-select: none;
|
|
273
|
+
border: none;
|
|
274
|
+
background: transparent;
|
|
275
|
+
width: 100%;
|
|
276
|
+
text-align: left;
|
|
277
|
+
font-family: inherit;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.sidebar-chat-session-item:hover {
|
|
281
|
+
background: var(--bg-hover);
|
|
282
|
+
color: var(--text);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.sidebar-chat-session-item.active {
|
|
286
|
+
background: var(--bg-active);
|
|
287
|
+
color: var(--accent);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.sidebar-chat-session-item.active::before {
|
|
291
|
+
content: "";
|
|
292
|
+
position: absolute;
|
|
293
|
+
left: 0;
|
|
294
|
+
top: 0;
|
|
295
|
+
bottom: 0;
|
|
296
|
+
width: 2px;
|
|
297
|
+
background: var(--accent);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.sidebar-chat-session-name {
|
|
301
|
+
flex: 1;
|
|
302
|
+
min-width: 0;
|
|
303
|
+
overflow: hidden;
|
|
304
|
+
text-overflow: ellipsis;
|
|
305
|
+
white-space: nowrap;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.sidebar-chat-empty {
|
|
309
|
+
padding: 10px 16px 10px 24px;
|
|
310
|
+
color: var(--text-dim);
|
|
311
|
+
font-size: 12px;
|
|
312
|
+
}
|
|
313
|
+
|
|
213
314
|
.file-tree-wrap {
|
|
214
315
|
width: 100%;
|
|
215
316
|
display: flex;
|