Commit Graph
85 Commits
Author SHA1 Message Date
Tuğcan Topaloğlu d6198d0218 Merge pull request #29 from tardigrde/add-dockerfile
feat: add Dockerfile for containerized deployment
2026-03-17 13:48:51 +03:00
Levente CsokeandClaude Opus 4.6 6d09a1aa8f docs: add Docker installation instructions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:31:21 +01:00
Levente CsokeandClaude Opus 4.6 773ee8ca89 feat: add Dockerfile for containerized deployment
Adds a production-ready Dockerfile based on node:24-alpine:
- Installs only runtime dependencies (docker-cli, curl)
- Runs as non-root `node` user
- Includes HEALTHCHECK for container orchestration
- Adds .dockerignore to keep image lean

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 22:19:55 +01:00
Tuğcan Topaloğlu e60534b57e Merge pull request #28 from Symbolk/patch-1
Allow access for Tailscale IPs in HTTPS enforcement
2026-03-11 12:07:07 +03:00
BoShen db8cc3026e Allow access for Tailscale IPs in HTTPS enforcement 2026-03-11 16:21:06 +08:00
Tugcan Topaloglu b08c0b7cd4 docs: v3.0.0 release notes v3.0.0 2026-03-05 12:35:58 +03:00
Tugcan Topaloglu 57b26ea5f3 docs: add new features, endpoints, shortcuts to README 2026-03-05 12:33:35 +03:00
Tugcan Topaloglu 1a958b90b0 docs: add optional dependencies table to README 2026-03-05 12:32:10 +03:00
Tugcan Topaloglu 0693f7b32a docs: update dependency claim, list optional deps 2026-03-05 12:31:14 +03:00
Tugcan Topaloglu 0e082dadb3 fix: update install.sh for password auth, add dependency checks 2026-03-05 12:30:06 +03:00
Tugcan Topaloglu da020cb512 fix: limit memory files to 5 with show more, crash labels, remove disk trend text 2026-03-05 12:10:53 +03:00
Tugcan Topaloglu c72f2c796b feat: add temp and disk sparkline graphs to system gauges 2026-03-05 12:06:17 +03:00
Tugcan Topaloglu f9d7819926 feat: notification center with audit log events and badge counter 2026-03-05 12:00:56 +03:00
Tugcan Topaloglu e74fdc43c2 feat: docker management page with container controls and image listing 2026-03-05 11:52:04 +03:00
Tugcan Topaloglu 8166ae1928 feat: config editor with re-auth, JSON validation and auto-backup 2026-03-05 11:47:57 +03:00
Tugcan Topaloglu b18a30c84a feat: system security dashboard with re-auth gate for security tabs 2026-03-05 11:38:35 +03:00
Tugcan Topaloglu 34f67db0ae feat: dark/light theme toggle with comprehensive CSS overrides 2026-03-05 10:24:28 +03:00
Tugcan Topaloglu b076eadc43 feat: add Claude CLI usage scraper scripts 2026-03-05 10:13:29 +03:00
Tugcan Topaloglu b5795d270a remove scrape script from dashboard repo 2026-03-05 09:55:01 +03:00
Tugcan Topaloglu e9c15fe7fb remove scripts dir - scrape scripts live in workspace not dashboard repo 2026-03-05 09:54:50 +03:00
Tugcan Topaloglu fdfa43d9f4 fix: use /usage instead of /u+Down for Claude CLI scraper 2026-03-05 09:48:24 +03:00
Tuğcan Topaloğlu 4243f4505f Update README with image header and badges
Added an image header and updated badges in README.
2026-03-02 23:13:04 +03:00
Tuğcan Topaloğlu b8e0f70388 chore: remove .rej merge artifact from PR #17 2026-02-27 09:57:31 +03:00
Tuğcan Topaloğlu 87e7e601f9 Merge pull request #17 from adrteh/fix-crash-detection-user-scope
fix: user-scope service support for logs and crash detection
2026-02-27 09:57:19 +03:00
Adrian Teh 0e2eb60e3f docs: update memory with dashboard fix details
- Document user-scope service support fixes
- Record PR #17 creation process
- Include test output examples
- Note GitHub token usage (expires 90 days)
2026-02-27 14:35:35 +08:00
Adrian Teh 3d8c38aeb9 fix: show log blocks with newest last (chronological by latest entry)
- Sort blocks by latest timestamp ascending (oldest → newest)
- Newest logs appear at bottom (user expectation)
- Clear header indicates chronological order
- Each block internally chronological (oldest → newest)

Final UX: user scrolls down to see current logs, can see historical logs above.
2026-02-27 13:15:32 +08:00
Tuğcan Topaloğlu dd94b7e5e3 fix: add Opus 4.5/4.6, Sonnet 4.6, Gemini Pro pricing and model normalization v2.4.0 2026-02-25 20:24:29 +03:00
Tuğcan Topaloğlu 1d9f7e0747 Merge pull request #15 from Mariano215/feat/multi-provider-cost
feat: multi-provider cost estimation with dynamic pricing
2026-02-25 20:22:46 +03:00
Tuğcan Topaloğlu 363c805110 Merge pull request #14 from Mariano215/fix/log-retrieval-multi-scope
fix: try multiple journal units and scopes for log retrieval
2026-02-25 20:21:56 +03:00
Tuğcan Topaloğlu 296d08a657 fix: harden service detection with input sanitization and correct process patterns
- Add regex validation for pgrep patterns and systemctl unit names
- Fix agent-dashboard process pattern (was dashboard-v2, now matches our structure)
- Prevents potential shell injection even though values are hardcoded
2026-02-25 20:20:14 +03:00
Tuğcan Topaloğlu 5d2c330511 Merge pull request #13 from Mariano215/fix/service-detection
fix: detect services via user-level systemd and pgrep fallback
2026-02-25 20:18:09 +03:00
Tuğcan Topaloğlu 82abb5b198 Merge pull request #12 from Mariano215/feat/configurable-auth-dir
feat: configurable auth data directory via DASHBOARD_AUTH_DIR
2026-02-25 20:13:37 +03:00
Tuğcan Topaloğlu 4afef1b601 Merge pull request #11 from Mariano215/fix/auth-json-parse
fix: harden auth handlers against non-JSON error responses
2026-02-25 20:13:25 +03:00
Tuğcan Topaloğlu a36e41bfc0 Merge pull request #10 from Mariano215/fix/api-base-path
fix: handle /index.html in API base path derivation
2026-02-25 20:13:16 +03:00
Tuğcan Topaloğlu 692b63ac78 Merge pull request #9 from Mariano215/fix/health-endpoint
Clean addition. Placed correctly before the auth middleware so it stays unauthenticated. Only exposes process uptime which is safe for monitoring and load balancer health checks. No sensitive data leaked.
2026-02-25 20:12:58 +03:00
Mariano MatteiandClaude Opus 4.6 535435f478 feat: multi-provider cost estimation with dynamic pricing
Replace the hardcoded opus/sonnet pricing with a generic,
file-backed, multi-provider cost estimation system.

Server-side:
- Add DEFAULT_MODEL_PRICING table covering OpenAI, Anthropic,
  Google, xAI, and Nvidia models
- Add estimateMsgCost() that uses explicit cost when available,
  falling back to rate-table calculation
- Add normalizeProvider/normalizeModel helpers for consistent
  model key formatting (provider/model)
- Support optional data/model_pricing_usd_per_million.json file
  to override default rates
- Track cacheRead/cacheWrite tokens separately in usage windows
- Use estimateMsgCost() across getSessionCost, getCostData,
  getUsageWindows, and session detail endpoint

Client-side:
- Remove hardcoded pricing object from updateLimits()
- Read perModelCost from server response instead
- Display cache costs when present
- Use var and string concatenation for iOS Safari compatibility

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 07:46:57 -05:00
Mariano MatteiandClaude Opus 4.6 484843dd7b fix: try multiple journal units and scopes for log retrieval
The /api/logs endpoint only tried a single system-level journalctl
unit, so user-level services and compound services (e.g.
openclaw-gateway) returned "No logs available".

Now iterates over candidate unit names per service and both system
and user journal scopes, returning the first non-empty result.
Prefixes output with [source scope:unit] for debugging, and shows
a helpful message listing what was tried when no logs are found.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 07:43:49 -05:00
Mariano MatteiandClaude Opus 4.6 f11f5e8a97 fix: detect services via user-level systemd and pgrep fallback
The service status panel only checked system-level systemctl, so
services running as user-level systemd units (systemctl --user)
or standalone processes showed as inactive.

Now checks system systemctl first, then user systemctl, then falls
back to pgrep pattern matching. Also checks alternative unit names
(e.g. openclaw-gateway, openclaw-webhooks) for compound services.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 07:41:14 -05:00
Mariano MatteiandClaude Opus 4.6 998e925fed feat: configurable auth data directory via DASHBOARD_AUTH_DIR
Allow credential files (credentials.json, mfa-secret.txt, audit.log)
to be stored in a separate directory from the workspace data folder
by setting the DASHBOARD_AUTH_DIR environment variable.

Defaults to the existing dataDir when unset, so no behavior change
for current deployments.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 07:40:01 -05:00
Mariano MatteiandClaude Opus 4.6 05fa7d7be8 fix: harden auth handlers against non-JSON error responses
Wrap res.json() in try/catch in the register, login, and recovery
handlers so a 502 proxy error or HTML response doesn't throw an
unhandled exception. Falls back to an empty object and shows the
HTTP status code in the error message instead.

Uses var for iOS Safari compatibility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 07:38:03 -05:00
Mariano MatteiandClaude Opus 4.6 cdb42016c3 fix: handle /index.html in API base path derivation
When the dashboard is accessed via an explicit /index.html path
(e.g. from a bookmark or direct link), API_BASE was set to a path
ending in /index.html, causing all API calls to 404.

Extract a getApiBasePath() helper that strips a trailing /index.html
segment before deriving the base path. Uses var for iOS Safari compat.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 07:36:30 -05:00
Mariano MatteiandClaude Opus 4.6 a0c41b0e83 fix: add unauthenticated /api/health endpoint
Add a lightweight health check endpoint that returns JSON
{"status":"ok","uptime":...} without requiring authentication.

Placed before the auth gate so load balancers, uptime monitors,
and Tailscale Funnel health probes can verify the server is running.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 07:33:11 -05:00
Tuğcan Topaloğlu 5f51f08136 docs: add Gemini usage tracking to README 2026-02-19 09:42:57 +03:00
Tuğcan Topaloğlu 129ce89a82 feat: add Gemini usage tracking with provider/model switching
- Gemini usage scrape endpoint (/api/gemini-usage, /api/gemini-usage-scrape)
- Provider switch (Claude/Gemini) on overview card with localStorage persistence
- Per-model dropdown selector (Session/Weekly/Sonnet for Claude; all models for Gemini)
- Model selection persisted per-provider in localStorage
- Auto-refresh respects selected provider
- XSS sanitization on dynamic model names and reset labels
- Rate Limits page: dedicated Gemini Usage section with per-model bars
v2.3.0
2026-02-19 09:37:07 +03:00
Tuğcan Topaloğlu 176c55a7a7 refactor: extract session file helpers, fix sid parsing and watcher consistency v2.2.0 2026-02-18 14:15:33 +03:00
Tuğcan Topaloğlu 2faa31a23b Merge pull request #6 from adrteh/feat/cumulative-reset-stats
Include reset session files in stats calculations
2026-02-18 14:14:33 +03:00
Adrian Teh dadbc9351a feat: include reset sessions in stats 2026-02-18 16:25:37 +08:00
Tuğcan Topaloğlu d3f21baf7d revert unsafe CORS fallback from PR #5 v2.1.0 2026-02-17 09:09:03 +03:00
b4bdfc33e1 fix: logs auth token, portable data paths, registration error handling
* Fix registration endpoint bugs causing 400 errors

- Fix CORS headers not being set when origin doesn't match host
- Add missing 'ip' variable definition in registration handler
- Fix hardcoded /root/ paths to use configurable dataDir
- Add error logging for better debugging

These changes resolve the "Bad request" error when creating new accounts.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* Fix logs endpoint authentication

The fetchLogs() function was making unauthenticated API calls,
causing 401 Unauthorized errors. Added Bearer token authentication
header to the fetch request.

Also improved error handling to show HTTP status codes.

Fixes logs viewer and ensures all API calls include proper authentication.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Dave Lutz <dave@lutzfamily.net>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-17 09:08:33 +03:00
Mariano Mattei e014b3e1d7 fix: iOS Safari compatibility and cache-busting 2026-02-17 09:05:30 +03:00