@flame0510/project-aether 1.2.0 → 1.4.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.
Files changed (102) hide show
  1. package/README.md +3 -1
  2. package/agent-templates/README.md +42 -22
  3. package/agent-templates/base-image/Dockerfile +42 -33
  4. package/agent-templates/base-image/entrypoint.sh +67 -12
  5. package/app/agents/BrowserAccessSection.tsx +510 -0
  6. package/app/agents/ChannelManager.tsx +19 -11
  7. package/app/agents/ImageDownloadBanner.tsx +53 -19
  8. package/app/agents/ModelSection.tsx +316 -0
  9. package/app/agents/PageClient.tsx +708 -167
  10. package/app/agents/UpdateSection.tsx +300 -0
  11. package/app/agents/create/PageClient.tsx +11 -49
  12. package/app/agents/create/page.tsx +8 -21
  13. package/app/api/agents/[id]/backup/route.ts +26 -69
  14. package/app/api/agents/[id]/channels/pairing/route.ts +3 -3
  15. package/app/api/agents/[id]/channels/telegram/route.ts +2 -2
  16. package/app/api/agents/[id]/cold-backup/route.ts +56 -0
  17. package/app/api/agents/[id]/devices/route.ts +126 -0
  18. package/app/api/agents/[id]/invite-link/route.ts +53 -0
  19. package/app/api/agents/[id]/lifecycle/route.ts +3 -0
  20. package/app/api/agents/[id]/model/route.ts +113 -0
  21. package/app/api/agents/[id]/open-control-ui/route.ts +58 -0
  22. package/app/api/agents/[id]/recreate/route.ts +33 -187
  23. package/app/api/agents/[id]/restart/route.ts +5 -0
  24. package/app/api/agents/[id]/restore/route.ts +40 -70
  25. package/app/api/agents/[id]/route.ts +38 -169
  26. package/app/api/agents/[id]/update/rollback/route.ts +30 -0
  27. package/app/api/agents/[id]/update/route.ts +50 -0
  28. package/app/api/agents/activity-summary/route.ts +67 -0
  29. package/app/api/agents/create/route.ts +91 -145
  30. package/app/api/agents/devices-summary/route.ts +37 -0
  31. package/app/api/agents/download-image/route.ts +16 -9
  32. package/app/api/agents/image-status/route.ts +31 -111
  33. package/app/api/agents/models-summary/route.ts +163 -0
  34. package/app/api/agents/route.ts +25 -49
  35. package/app/api/agents/token/route.ts +33 -10
  36. package/app/api/assistant/route.ts +37 -16
  37. package/app/api/gateway/agent/route.ts +37 -6
  38. package/app/api/gateway/provider/balance/route.ts +5 -2
  39. package/app/api/gateway/provider/keys.ts +13 -1
  40. package/app/api/gateway/provider/route.ts +43 -12
  41. package/app/api/gateway/sync.ts +335 -76
  42. package/app/api/models/route.ts +28 -34
  43. package/app/api/provider/auth.ts +65 -0
  44. package/app/api/provider/upstream.ts +9 -2
  45. package/app/api/provider/v1/chat/completions/route.ts +22 -16
  46. package/app/api/provider/v1/models/route.ts +26 -133
  47. package/app/api/setup/agent-image/route.ts +14 -42
  48. package/app/components/DashboardToolbar.tsx +1 -1
  49. package/app/components/PulseChat.tsx +25 -39
  50. package/app/components/ui/RemoveButton.tsx +46 -0
  51. package/app/components/ui/Select.tsx +3 -2
  52. package/app/components/ui/index.ts +1 -0
  53. package/app/credentials/PageClient.tsx +2 -2
  54. package/app/gateway/PageClient.tsx +253 -674
  55. package/app/globals.css +8 -0
  56. package/app/lib/models-context.tsx +43 -7
  57. package/app/wizard/useWizard.ts +6 -1
  58. package/bin/rev4a.js +116 -50
  59. package/daemon.js +6 -6
  60. package/docs/ARCHITECTURE.md +110 -12
  61. package/docs/FRONTEND-ARCHITECTURE.md +31 -2
  62. package/docs/REV4A.md +93 -33
  63. package/docs/dev/API-REFERENCE.md +723 -178
  64. package/docs/dev/DATABASE.md +96 -0
  65. package/docs/dev/GATEWAY.md +250 -93
  66. package/docs/dev/PROVIDERS.md +26 -13
  67. package/docs/rag/DATA-FRESHNESS.md +59 -28
  68. package/docs/rag/GLOSSARY.md +27 -16
  69. package/docs/rag/REV4A-OVERVIEW.md +37 -25
  70. package/docs/rag/WHAT-I-CAN-ANSWER.md +10 -8
  71. package/instrumentation.ts +52 -1
  72. package/lib/agent-busy.ts +21 -0
  73. package/lib/agent-devices.ts +361 -0
  74. package/lib/agent-edit-state.ts +108 -0
  75. package/lib/agent-edit.ts +157 -0
  76. package/lib/agent-images.ts +375 -0
  77. package/lib/agent-ports-server.ts +27 -0
  78. package/lib/agent-ports.ts +68 -0
  79. package/lib/agent-readiness.ts +110 -0
  80. package/lib/agent-recreate-state.ts +108 -0
  81. package/lib/agent-recreate.ts +305 -0
  82. package/lib/agent-restore-state.ts +107 -0
  83. package/lib/agent-restore.ts +135 -0
  84. package/lib/agent-setup.ts +66 -17
  85. package/lib/agent-update-state.ts +122 -0
  86. package/lib/agent-update.ts +448 -0
  87. package/lib/agent-versions.json +14 -0
  88. package/lib/agent-versions.ts +80 -0
  89. package/lib/buildAgentImage.ts +88 -290
  90. package/lib/channelManager.ts +153 -64
  91. package/lib/cold-backup.ts +354 -0
  92. package/lib/container-file.ts +27 -0
  93. package/lib/credentials/delivery.ts +3 -3
  94. package/lib/db-bootstrap.mjs +76 -0
  95. package/lib/docker-utils.ts +3 -3
  96. package/lib/model-catalogue.ts +140 -27
  97. package/lib/provider-balance.ts +33 -12
  98. package/lib/rev4a-paths.ts +0 -21
  99. package/model-pricing.json +118 -110
  100. package/models.config.json +27 -12
  101. package/package.json +1 -1
  102. package/app/api/gateway/route.ts +0 -191
@@ -1,6 +1,6 @@
1
1
  # Data Freshness in Rev4a
2
2
 
3
- > **Last updated:** 2026-07-18
3
+ > **Last updated:** 2026-09-15
4
4
 
5
5
  Understanding how current the data in Rev4a is — and what is truly real-time vs. periodically updated.
6
6
 
@@ -8,47 +8,60 @@ Understanding how current the data in Rev4a is — and what is truly real-time v
8
8
 
9
9
  ## Session data
10
10
 
11
- **Update frequency:** every 15–30 seconds
11
+ **Update frequency:** every 30 seconds
12
12
 
13
- The daemon polls `openclaw sessions --json --all-agents` on this schedule:
14
- - 15 seconds when at least one session has status `working`
15
- - 30 seconds when no sessions are actively working
13
+ The daemon polls `openclaw sessions --json --all-agents` on a fixed 30-second
14
+ timer. Session statuses, token counts, and costs are therefore up to 30 seconds
15
+ behind reality.
16
16
 
17
- This means session statuses, token counts, and costs are at most 30 seconds behind reality during quiet periods, and 15 seconds behind during active work.
17
+ The code declares a shorter 15-second interval for when a session is `working`,
18
+ but nothing uses it — the timer is always 30 seconds. Do not tell a user the
19
+ dashboard speeds up during active work.
18
20
 
19
- **What this means for PULSE:** if you ask "is Argus working right now?", the answer reflects data that is up to 30 seconds old.
21
+ **What this means for PULSE:** if you ask "is Argus working right now?", the
22
+ answer reflects data that is up to 30 seconds old.
20
23
 
21
24
  ---
22
25
 
23
26
  ## Event feed
24
27
 
25
- **Update frequency:** ~3 seconds (via SSE stream)
28
+ **Update frequency:** every 5 seconds (via SSE stream)
26
29
 
27
- The `/api/stream` endpoint pushes updates to the dashboard every ~3 seconds. This includes:
30
+ The `/api/stream` endpoint pushes updates to the dashboard every 5 seconds. It
31
+ sends exactly three things:
28
32
  - New events (spawn, complete, error, tool_call)
29
- - Updated session list
33
+ - The session list
30
34
  - Today's cost total
31
- - Lineage data
32
35
 
33
- The event feed is as close to real-time as Rev4a gets. However, events are generated by the daemon's poll cycle, so an event that just happened may take up to 30 seconds to appear.
36
+ Lineage is **not** pushed over the stream; the Lineage page fetches it itself.
37
+
38
+ The event feed is as close to real-time as Rev4a gets. However, events are
39
+ generated by the daemon's poll cycle, so an event that just happened may take up
40
+ to 30 seconds to appear, plus up to 5 more to reach the browser.
34
41
 
35
42
  ---
36
43
 
37
44
  ## System metrics (CPU, RAM, disk)
38
45
 
39
- **Update frequency:** every daemon poll cycle (15–30 seconds)
46
+ **Update frequency:** every daemon poll cycle (30 seconds)
47
+
48
+ **Retention:** 30 days (older rows are pruned automatically each cycle)
40
49
 
41
- **Retention:** last 24 hours only (older rows are pruned automatically)
50
+ These metrics are collected and stored, and served by `GET /api/metrics`. They
51
+ are **not** shown on the dashboard — see the System Health note below.
42
52
 
43
53
  ---
44
54
 
45
55
  ## Cost totals
46
56
 
47
- **Update frequency:** every 15–30 seconds (recalculated from sessions on each API call)
57
+ **Update frequency:** every 30 seconds (recalculated from sessions on each API call)
48
58
 
49
- The cost figures shown in the dashboard are always computed fresh from the database on each page load or SSE push. They are not cached.
59
+ The cost figures shown in the dashboard are always computed fresh from the
60
+ database on each page load or SSE push. They are not cached.
50
61
 
51
- **Cost override:** if a manual override is set for the current month, it is shown immediately after being saved — no delay.
62
+ **Cost override:** `/api/cost-override` exists, but no page in the dashboard
63
+ reads or writes it. There is no UI for setting one, so do not direct a user to
64
+ "the cost override screen".
52
65
 
53
66
  ---
54
67
 
@@ -66,16 +79,27 @@ Cron status (last run, next run) is fetched directly from the OpenClaw gateway e
66
79
 
67
80
  **Update frequency:** on demand (read from `openclaw.json` on each request)
68
81
 
69
- The agents list, Telegram accounts, and bindings are read directly from `openclaw.json` each time the Agents Config page is accessed. Changes saved via the UI take effect immediately.
82
+ The agents list, Telegram accounts, and bindings are read directly from
83
+ `openclaw.json` each time they are requested.
84
+
85
+ `GET /api/agents-config` serves this, but no page calls it — there is no "Agents
86
+ Config page". Per-agent settings are reached from the agent's detail panel on the
87
+ Agents page.
70
88
 
71
89
  ## Agent base image
72
90
 
73
- **Update frequency:** polled every 2 seconds during a build; on page load otherwise
91
+ **Update frequency:** polled every 2 seconds, continuously
74
92
 
75
- The `GET /api/agents/image-status` endpoint compares the local image digest
76
- with the remote registry digest (ghcr.io). Download progress is shown inline
77
- via polling `GET /api/agents/image-status` and reading logs from
78
- `/tmp/rev4a-download-<timestamp>.log`.
93
+ `GET /api/agents/image-status` lists the supported OpenClaw versions downloaded and
94
+ compares them with the versions the registry publishes. The registry list is refreshed
95
+ at most every 10 minutes, so a newly published version can take that long to appear.
96
+ The banner polls the endpoint every 2 seconds for as long as the page is open, not only
97
+ while something is running.
98
+
99
+ The operation the banner triggers is a **`docker pull`**, not a build. While it
100
+ runs the banner shows an indeterminate animated bar: there is no percentage, no
101
+ byte count, and no log output in the UI. A log is written server-side to
102
+ `/tmp/rev4a-download-<timestamp>.log`, but nothing in the dashboard reads it.
79
103
 
80
104
  ---
81
105
 
@@ -83,7 +107,9 @@ via polling `GET /api/agents/image-status` and reading logs from
83
107
 
84
108
  **Update frequency:** on demand (files read from disk on each request)
85
109
 
86
- Memory files (MEMORY.md, etc.) are read from disk each time they are requested. There is no caching.
110
+ Memory files are read from disk each time they are requested. There is no caching.
111
+
112
+ The tracked set is `USER.md`, `MEMORY.md`, `AGENTS.md`, `SOUL.md`, `HEARTBEAT.md`.
87
113
 
88
114
  ---
89
115
 
@@ -91,7 +117,7 @@ Memory files (MEMORY.md, etc.) are read from disk each time they are requested.
91
117
 
92
118
  | Data | Why it may be stale |
93
119
  |---|---|
94
- | Sessions ended more than 7 days ago | `agents-active` endpoint only looks back 7 days |
120
+ | Cron sessions older than 7 days | The daemon prunes cron session rows after 7 days |
95
121
  | Sessions never polled by daemon | If the daemon was down, sessions from that window are missing |
96
122
  | Tool calls for a session | Only captured if the OpenClaw session export includes them |
97
123
  | Costs before Rev4a was installed | Historical data before the first daemon run is not available |
@@ -100,10 +126,15 @@ Memory files (MEMORY.md, etc.) are read from disk each time they are requested.
100
126
 
101
127
  ## How to check if data is fresh
102
128
 
103
- The System Health page shows a check like "last event X seconds ago". If this number is larger than ~60 seconds, the daemon may have stopped.
129
+ System health is a card on the **Dashboard**, not a page of its own. Its checks
130
+ cover session runtime, ingestion freshness, errors in the last 24 hours, today's
131
+ usage-based cost, and cron jobs. It reports no CPU, RAM, or disk figures.
104
132
 
105
- You can also run this command on the server to check directly:
133
+ To check directly on the server:
106
134
  ```bash
107
- sqlite3 data/events.db \
135
+ sqlite3 ~/.config/rev4a/data/events.db \
108
136
  "SELECT datetime(MAX(ts)/1000, 'unixepoch', 'localtime') FROM events"
109
137
  ```
138
+
139
+ The database lives under the Rev4a data directory, which defaults to
140
+ `~/.config/rev4a/` and moves with `REV4A_DATA_DIR`. It is not inside the repo.
@@ -1,6 +1,6 @@
1
1
  # Rev4a Glossary
2
2
 
3
- > **Last updated:** 2026-08-28
3
+ > **Last updated:** 2026-09-15
4
4
 
5
5
  Terms you'll encounter while using the Rev4a dashboard.
6
6
 
@@ -10,16 +10,19 @@ Terms you'll encounter while using the Rev4a dashboard.
10
10
  An AI assistant configured with a specific role, AI model, and workspace. Each agent has a name (e.g. "Argus") and can run multiple sessions over time. Agents are deployed as Docker containers with persistent data volumes.
11
11
 
12
12
  ## Agent Template
13
- A pre-built configuration used when creating a new agent. Templates include default files (AGENTS.md, SOUL.md, MEMORY.md, IDENTITY.md, TOOLS.md, HEARTBEAT.md, BOOTSTRAP.md) and settings. Located in `agent-templates/`. Available templates: **Atlas** (general dev), **Argus** (security/audit), **Prometheus** (client-facing), and **Custom** (blank slate — bootstraps identity interactively on first run).
13
+ A pre-built configuration used when creating a new agent. Each template ships its own set of files. Atlas has AGENTS.md, SOUL.md, IDENTITY.md, TOOLS.md, MEMORY.md and HEARTBEAT.md; Argus and Prometheus have the same minus HEARTBEAT.md; Custom has only AGENTS.md, MEMORY.md and BOOTSTRAP.md. Located in `agent-templates/`. Available templates: **Atlas** (general dev), **Argus** (security/audit), **Prometheus** (client-facing), and **Custom** (blank slate — bootstraps identity interactively on first run).
14
14
 
15
15
  ## Badge
16
- A small inline label component used for status indicators and channel chips. Supports success, danger, warning, and neutral tones. Used for TG/WA chips on the agent list and pairing status in the Channel Manager.
16
+ A small inline label component used for status indicators and channel chips. Six tones: neutral, accent, success, warning, danger, info. Used for the Telegram chip on the agent list and pairing status in the Channel Manager. There is no WhatsApp support anywhere in Rev4a.
17
17
 
18
18
  ## Backup (Agent)
19
19
  A compressed archive (`.tar.gz`) of an agent's persistent volume (`/root/`). Backups exclude the npm cache to keep sizes small (~1.5 MB). Stored in the `rev4a-backups` Docker volume. Used for restore operations and auto-created before each recreate.
20
20
 
21
+ ## Browser Access
22
+ Which browsers may open an agent's Control UI. On OpenClaw 9.x every new browser must be approved once; the approval is remembered per browser. Managed in the "BROWSER ACCESS" section of the agent detail panel: approve or reject waiting browsers, rename or revoke approved ones. The Open button uses a one-time link that skips the approval. The Invite link button gives a link for someone else: their browser still waits for approval.
23
+
21
24
  ## Container
22
- A Docker container running on the server. Each agent runs in its own container. The Containers page shows all containers, including infrastructure ones (databases, reverse proxies, etc.), with CPU/memory metrics and a web terminal.
25
+ A Docker container running on the server. Each agent runs in its own container. The Containers page shows all containers, including infrastructure ones such as databases and reverse proxies, with a web terminal link. It shows no CPU or memory metrics.
23
26
 
24
27
  ## Channel
25
28
  A communication channel (Telegram) configured on an agent. Channels allow users to send DMs to the agent via messaging apps. The Channel Manager modal lets you connect/disconnect Telegram and manage pairings (approve/reject senders).
@@ -31,7 +34,7 @@ Modal in the agent detail panel for configuring Telegram channels. Connect with
31
34
  The estimated cost of an agent session in USD, calculated from tokens used and per-model pricing. Rev4a shows cost by today, 7 days, 30 days, all-time, and by model.
32
35
 
33
36
  ## Cost Override
34
- A manual correction for a month's total cost. If the automatic calculation doesn't match the actual invoice, you can set an override value for that month with an optional note.
37
+ A manual correction for a month's total cost, stored through `/api/cost-override`. There is currently no screen for it: no page in the dashboard reads or writes an override, so it can only be set by calling the API directly.
35
38
 
36
39
  ## Credential
37
40
  A third-party service token (GitHub PAT, Trello API key, Vercel token, Supabase access key, Notion API token) stored in the Rev4a vault. A credential is installed into a container only when the user syncs it, and removed on de-sync; any credential can be synced to any container. Every reveal is written to an audit table that no route or view reads.
@@ -40,25 +43,25 @@ A third-party service token (GitHub PAT, Trello API key, Vercel token, Supabase
40
43
  A scheduled task that runs an agent automatically at a fixed time (e.g. every night at 3:15 AM). Configured with standard cron syntax. Jobs can be enabled/disabled per entry.
41
44
 
42
45
  ## Dashboard
43
- The main page of Rev4a (`/`). Shows live sessions, cost summary, system health metrics (CPU, RAM, disk, load average), and a real-time event feed. A setup banner appears if the first-run wizard is incomplete.
46
+ The main page of Rev4a (`/`). Shows live sessions, cost summary, health cards for Rev4a's runtime, cron and lineage, and a real-time event feed. It shows no CPU, RAM, disk or load average, and there is no setup banner: an incomplete wizard redirects to `/wizard`.
44
47
 
45
48
  ## Event
46
- A lifecycle occurrence for a session: spawned, completed, errored, or a tool call made. Events appear in the live feed on the Dashboard and are pushed via SSE every ~3 seconds.
49
+ A lifecycle occurrence for a session: spawned, completed, errored, or a tool call made. Events appear in the live feed on the Dashboard and are pushed via SSE every 5 seconds.
47
50
 
48
51
  ## Gateway
49
- The routing layer that connects agents to AI providers. The Gateway page has two panels: Provider Sync (push the model catalogue to all agents) and Agent Model Config (set each agent's primary model and fallbacks).
52
+ The routing layer that connects agents to AI providers. The Gateway page manages provider API keys and the model catalogue, and pushes that catalogue to every agent. Which model a given agent runs is set elsewhere, in the Model section of that agent's detail panel.
50
53
 
51
54
  ## Lineage
52
- The parent-child relationship tree between sessions. When an agent spawns another agent to do work, that relationship is shown as an interactive graph on the Lineage page. Configurable time periods: 1d, 7d, 30d.
55
+ The parent-child relationship tree between sessions. When an agent spawns another agent to do work, that relationship is shown as an interactive graph on the Lineage page. Configurable time periods: 1d, 3d, 7d, 15d, 30d and all.
53
56
 
54
57
  ## Memory
55
- Files that store an agent's persistent knowledge and personality: MEMORY.md, SOUL.md, IDENTITY.md, USER.md, AGENTS.md, TOOLS.md, HEARTBEAT.md. Editing them changes how an agent behaves. The Memory page shows all files with size and budget tracking.
58
+ Files that store an agent's persistent knowledge and personality. The tracked set is USER.md, MEMORY.md, AGENTS.md, SOUL.md and HEARTBEAT.md. Editing them changes how an agent behaves. The Memory page shows these with size and budget tracking. A template may also ship IDENTITY.md or TOOLS.md, which are not tracked.
56
59
 
57
60
  ## Model
58
- The AI model used by an agent or session. Examples: GPT-5.4, Claude Sonnet 4, DeepSeek V4 Flash. Models are linked to specific providers. The Gateway page manages which models are enabled and which agent uses which model.
61
+ The AI model used by an agent or session. Examples: GPT-5.4, Claude Sonnet 5, DeepSeek Flash. Models are linked to specific providers. The Gateway page controls which models are enabled for the whole deployment; the agent detail panel sets which one a given agent runs, plus its fallbacks. A model whose name the provider has retired is tagged `deprecated` on the agent card and in that panel. The Gateway page does not show it.
59
62
 
60
63
  ## First-run wizard
61
- First-time setup wizard at `/wizard`. Steps: Welcome → Providers → First Agent → Ready. Completion is recorded in `wizard.json` under the data directory. Always accessible from the sidebar or mobile navbar.
64
+ First-time setup wizard at `/wizard`. Steps: Welcome → Providers → First Agent → Ready. Completion is recorded in `wizard.json` under the data directory. Always accessible from the sidebar. The mobile bottom navigation has five entries — Home, Agents, Workspace, Gateway, Containers — and the wizard is not one of them.
62
65
 
63
66
  ## Plugin
64
67
  An extension that adds new tools and capabilities to agents. Plugins are installed in the workspace and appear in the Plugins page with enable/disable toggles.
@@ -73,11 +76,14 @@ Rev4a's built-in proxy that gives all agents unified access to configured LLM pr
73
76
  The AI concierge embedded in Rev4a. Click the floating chat button (bottom-right) on any page to ask questions about the dashboard features and navigation.
74
77
 
75
78
  ## Recreate (Agent)
76
- Rebuild an agent container from the latest `openclaw-agent-base:latest` image while preserving the persistent volume. Auto-backups the volume first — if the backup fails, the recreate is aborted. This is how agents pick up OpenClaw image updates.
79
+ Rebuild an agent container on its own OpenClaw version while preserving the persistent volume. Auto-backups the volume first — if the backup fails, the recreate is aborted. A recreate never changes the OpenClaw version; moving to a newer version is a separate update.
77
80
 
78
81
  ## Restore (Agent)
79
82
  Replace an agent's persistent volume with a previously created backup. The container is stopped, the volume content is fully replaced, then the container is restarted.
80
83
 
84
+ ## Rollback (Agent)
85
+ Undo an agent's latest OpenClaw update: the backup taken just before the update is put back and the agent starts again on its previous version. Anything the agent did after the update is lost. Offered in the agent's OPENCLAW VERSION section while that backup exists.
86
+
81
87
  ## Session
82
88
  One instance of an agent doing work. Tracks: start/end time, tokens used, cost, model, status, and task description. A session starts when an agent receives a task and ends when it completes or fails.
83
89
 
@@ -113,13 +119,18 @@ A capability available to agents: running shell commands, reading files, searchi
113
119
  A record of an agent using a tool during a session. Useful for auditing what an agent actually did. Shown in the Session Drawer.
114
120
 
115
121
  ## Traefik
116
- Optional reverse proxy for routing web traffic to agent containers. If configured, an agent gets a public URL. Rev4a itself runs on port 3740 and does not require Traefik.
122
+ Optional reverse proxy an operator can put in front of the Rev4a dashboard or of an agent's port. Rev4a does not configure it and sets no routing labels on agents: an agent's Control UI is reached on its published port. Rev4a itself runs on port 3740 and does not require Traefik.
123
+
124
+ ## Update (Agent)
125
+ Move one agent to a newer OpenClaw version downloaded on the Agents page, from its OPENCLAW VERSION section. The agent goes offline for a few minutes: it is backed up while stopped, started on the new version (which converts its data), and checked for missing conversation history or cron jobs. Undone with Rollback.
117
126
 
118
127
  ## Vault
119
128
  Rev4a's store for third-party service tokens (GitHub, Trello, Vercel, Supabase, Notion). Provider API keys live separately in `provider-keys.json`, managed from the Gateway page. Supports reveal (written to an audit table no route or view reads), sync to and from containers, and live detection of which credentials are actually installed. Secrets are stored unencrypted.
120
129
 
121
130
  ## Workspace
122
- The directory where an agent's operational files live (config, memory files, skills, plugins, scripts). The Workspace page lets you browse, view, and edit files across the VPS host and all agent containers.
131
+ The directory where an agent's operational files live (config, memory files, skills, plugins, scripts). The Workspace page lets you browse, view, and edit files across the host workspace, which appears as `Local`, and all agent containers.
123
132
 
124
133
  ## System Health
125
- Hardware metrics shown on the Dashboard: CPU usage (%), RAM used/total (MB), disk used/total (GB), system load average (1m). The System Health API (`/api/system-health`) also generates recommendations (e.g. "Consider archiving old sessions to reduce disk usage"). Status can be `ok`, `warn`, or `error`.
134
+ A card on the Dashboard reporting whether Rev4a itself is working, not the hardware it runs on. `/api/system-health` returns checks for session runtime, feed ingestion freshness, errors in the last 24 hours, today's usage-based cost, and cron jobs, each with a health of `ok`, `warning` or `error`, plus a list of recommendations.
135
+
136
+ It reports no CPU, RAM, disk or load average. Those metrics are collected by the daemon and stored for 30 days, and are served by `/api/metrics`, but no page displays them.
@@ -1,13 +1,15 @@
1
1
  # What is Rev4a?
2
2
 
3
- > **Last updated:** 2026-09-05
3
+ > **Last updated:** 2026-09-15
4
4
 
5
5
  Rev4a is the control panel for your AI agent infrastructure. It shows you everything your agents are doing, how much they cost, and whether the system is healthy — all in one dashboard.
6
6
 
7
7
  ## What can you do in Rev4a?
8
8
 
9
9
  ### Dashboard (`/`)
10
- The main page. See live sessions (who's working right now), cost summary by model and time period (today, 7 days, 30 days), system health (CPU, RAM, disk, load average), and a real-time event feed. Click any session row to open the Session Drawer and see every tool call the agent made. If the first-run wizard is incomplete, a banner appears at the top with a link to continue.
10
+ The main page. See live sessions (who's working right now), cost summary, an overall health indicator, and a real-time event feed. Click any session row to open the Session Drawer and see every tool call the agent made.
11
+
12
+ The health cards cover Rev4a's own runtime, cron and watchdog, and lineage. They do **not** show CPU, RAM, disk, or load average: those metrics are collected and stored, but no page displays them. There is no wizard banner on the dashboard; an incomplete setup redirects to `/wizard` instead.
11
13
 
12
14
  ### First-run wizard (`/wizard`)
13
15
  First-run setup wizard that guides new users through configuration. Four steps:
@@ -16,7 +18,7 @@ First-run setup wizard that guides new users through configuration. Four steps:
16
18
  3. **First Agent** — understand how agents work and what you need to create one
17
19
  4. **Ready** — site map of key sections with quick links
18
20
 
19
- The wizard is always accessible from the sidebar. A progress badge (e.g. "1/3") shows how many steps are complete. Once finished, the badge disappears and the dashboard banner goes away.
21
+ The wizard is always accessible from the sidebar. There is no progress badge on that entry and no banner elsewhere.
20
22
 
21
23
  ### Agents (`/agents`)
22
24
  Manage Docker containers running OpenClaw agents. See which agents are running, stopped, or errored. Filter by status, view agent details (environment variables, ports, auth tokens, backups, Telegram channels), and create new agents. Each agent card shows its template, status, TG channel chip, and a direct link to its Control UI.
@@ -32,34 +34,42 @@ Manage Docker containers running OpenClaw agents. See which agents are running,
32
34
 
33
35
  The agent list also shows a compact TG chip next to each agent name (green = connected, hidden if not configured).
34
36
 
35
- The Agents page includes a banner for the **agent base image** (`openclaw-agent-base:latest`):
36
- - Green: image is up-to-date (no banner shown)
37
- - Yellow: image is outdated or missing — click "Rebuild Image" to start a build
38
- - Copper: a build is running in the background — click "View Progress" to open
39
- the build modal
40
-
41
- The build modal shows live Docker build logs (polled every 2s). You can:
42
- - **Run in Background** — close the modal, build continues on the server
43
- - **Abort** — kill the build process; the existing image stays intact
44
- - **Refresh / re-enter** — opening the modal again resumes log streaming
45
- from the last seen line
46
-
47
- The build writes logs to `/tmp/rev4a-build-<timestamp>.log` so they survive
48
- page refreshes and modal closes.
37
+ **Browser access:** on agents running OpenClaw 9.x, every new browser has to be approved once before the agent's Control UI connects. The detail panel's "BROWSER ACCESS" section lists browsers waiting for approval, with Approve and Reject, and the browsers already approved, with Rename and Revoke. A yellow "BROWSER WAITING" chip on the agent card says a request is pending. The **Open** button tries a one-time link that lets the browser in without any approval; if the agent cannot issue one (agents still on OpenClaw 2026.7.x) it opens the normal link, which on those agents needs no approval anyway. To let someone else in, **Invite link** gives a link to send them: their browser appears under waiting for approval, and nothing opens until you approve it. The link contains the token all agents share; changing the agents token cancels every link already sent.
38
+
39
+ The Agents page includes a banner for the **agent base image**, which is kept per
40
+ OpenClaw version. It is hidden when a supported version is downloaded and nothing newer
41
+ is published. When no image is downloaded it offers **Download Image**; when a newer
42
+ supported OpenClaw version is published it says so and offers **Download <version>**.
43
+ Downloading changes no agent: new agents are created on the newest version downloaded,
44
+ existing agents keep their version (a recreate never changes it), and their card shows
45
+ **UPDATE AVAILABLE**.
46
+
47
+ **Updating an agent:** the detail panel's "OPENCLAW VERSION" section shows the version the
48
+ agent runs and, when a newer one is downloaded, **Update to <version>**. The update takes
49
+ the agent offline for a few minutes: it backs the agent up while stopped, starts it on the
50
+ new version (which converts its data), and checks that no conversation history or cron job
51
+ went missing. Afterwards **Roll back to <version>** puts back the backup taken just before
52
+ the update, on the old version; anything the agent did after the update is lost. The agent
53
+ must be running to start an update.
54
+
55
+ That button runs a `docker pull` from the registry. It is a download, not a build.
56
+ While it runs the banner shows an indeterminate animated bar with no percentage and
57
+ no log output; there is no modal, no "View Progress", no "Run in Background", and
58
+ no way to abort from the UI. Status is polled every 2 seconds.
49
59
 
50
60
  ### Create Agent (`/agents/create`)
51
61
  Wizard to spin up a new agent. Steps: choose a template (Prometheus, Argus, Atlas, etc.), name your agent, pick a model, set an optional port range (default: auto-assigned 10-port block, e.g. 3700-3709). The agent is created as a Docker container with a persistent volume — all config, workspace files, and credentials survive container restarts.
52
62
 
53
63
  ### Lineage (`/lineage?period=7d`)
54
- Interactive graph showing session family trees — which agent spawned which child agent, across configurable time periods (1d, 7d, 30d). Click any node to inspect. Includes a live feed side panel.
64
+ Interactive graph showing session family trees — which agent spawned which child agent, across configurable time periods: 1d, 3d, 7d, 15d, 30d, and all. Click any node to inspect. Includes a live feed side panel.
55
65
 
56
66
  ### Gateway (`/gateway`)
57
- Central hub connecting agents to AI providers. Two panels:
58
- - **Provider Sync** — reads the model catalogue from `models.config.json`, discovers which providers have API keys, and syncs the full model list to every agent container
59
- - **Agent Model Config** — set each agent's primary model and fallback models via `PUT /api/gateway/agent`
67
+ Connects agents to AI providers. Add and remove provider API keys, enable or disable individual models in the catalogue read from `models.config.json`, and push the resulting model list to every agent container. It does not assign models to agents: choosing which model an agent runs is done per agent, in the Model section of the agent's detail panel on the Agents page.
60
68
 
61
69
  ### Containers (`/containers`)
62
- Full list of all Docker containers on the server. See name, image, status, ports, IP, CPU%, and memory usage. Click "Terminal" on any container to open an interactive shell. Use Start/Stop/Restart buttons to manage lifecycle.
70
+ Full list of all Docker containers on the server, including stopped ones. Each row shows name, status, image, IP, ports, and an agent pill where applicable. Click "Terminal" to open an interactive shell into that container.
71
+
72
+ The page shows no CPU or memory figures and has no start, stop, or restart buttons: it is read-only apart from the terminal link. Container lifecycle is managed from the Agents page.
63
73
 
64
74
  ### Container Terminal (`/containers/terminal/[id]`)
65
75
  Live web terminal into a Docker container. Run commands, inspect files, debug issues — like SSH but in the browser.
@@ -74,13 +84,15 @@ Manage third-party service credentials: GitHub, Trello, Vercel, Supabase, Notion
74
84
  Scheduled tasks auto-discovered from the host OpenClaw gateway (via `openclaw cron list --json`) and every running Docker container with the `AGENT_ID` label (via `docker exec openclaw cron list --json`). Filter jobs by agent using the toolbar tabs. Each job shows name, description, cron expression, next run, last run, and last status. Toggle on/off per job. The run history panel shows recent cron run executions for the selected job, loaded on demand from the container's gateway.
75
85
 
76
86
  ### Memory / Context (`/memory`)
77
- Browse agent memory files — MEMORY.md, SOUL.md, IDENTITY.md, USER.md, AGENTS.md, TOOLS.md, HEARTBEAT.md. These files define how agents behave, what they know, and their personality. Also shows total memory budget vs usage.
87
+ Browse agent memory files. The tracked set is USER.md, MEMORY.md, AGENTS.md, SOUL.md and HEARTBEAT.md. These files define how agents behave, what they know, and their personality. Also shows total memory budget vs usage.
88
+
89
+ A template may ship other files, such as IDENTITY.md or TOOLS.md, but those are not part of the tracked context set.
78
90
 
79
91
  ### Config (`/config`)
80
92
  Rev4a application settings. View and modify environment variables (password, tokens, secrets), restart the server. Changes are persisted to `.env`, synced to systemd, and a daemon-reload is triggered.
81
93
 
82
94
  ### Tools (`/tools`)
83
- Catalog of every tool available to agents — built-in commands, MCP server tools, plugin tools, and audio/TTS configuration. Includes timezone settings.
95
+ Catalog of the OpenClaw built-in tools available to agents, grouped by area: file and code, shell, web, messaging, sessions, media, and others. The list is curated in the app, not discovered at runtime, so it covers built-ins only and does not enumerate MCP servers or plugin tools. The page also holds audio/TTS and timezone settings.
84
96
 
85
97
  ### Plugins (`/plugins`)
86
98
  Browse installed OpenClaw plugins. Enable/disable toggle per plugin. Plugins extend agent capabilities with new tools and integrations.
@@ -101,7 +113,7 @@ Password-protected access to the dashboard. Enter the Rev4a password to authenti
101
113
 
102
114
  ## What about Pulse?
103
115
 
104
- Pulse is the AI assistant embedded in Rev4a. She appears as a floating chat button in the bottom-right corner of every page. She can:
116
+ Pulse is the AI assistant embedded in Rev4a. She appears as a floating chat button in the bottom-right corner, on every page except login, setup and the first-run wizard. She can:
105
117
 
106
118
  - Explain what any page does
107
119
  - Guide you through features ("how do I create an agent?")
@@ -1,6 +1,6 @@
1
1
  # What PULSE Can Answer
2
2
 
3
- > **Last updated:** 2026-08-28
3
+ > **Last updated:** 2026-09-15
4
4
 
5
5
  PULSE is the in-dashboard AI concierge for Rev4a. This document defines what she can and cannot answer.
6
6
 
@@ -12,7 +12,7 @@ PULSE is the in-dashboard AI concierge for Rev4a. This document defines what she
12
12
  - "How do I get to the container list?"
13
13
  - "Where can I see the first-run wizard?"
14
14
  - "Is there a page for cron jobs?"
15
- - "Where can I see my AI providers?" — The Gateway page (`/gateway`) shows providers, models, agent assignments.
15
+ - "Where can I see my AI providers?" — The Gateway page (`/gateway`) shows providers and the model catalogue. Which model an agent runs is on the Agents page, in that agent's detail panel.
16
16
  - "How do I create a new agent?"
17
17
  - "What templates are available?"
18
18
  - "What is the Custom template?"
@@ -48,14 +48,18 @@ PULSE is the in-dashboard AI concierge for Rev4a. This document defines what she
48
48
  - "How do I sync credentials to an agent?"
49
49
  - "How do I back up an agent?"
50
50
  - "How do I restore an agent from a backup?"
51
- - "How do I recreate an agent with the latest image?"
51
+ - "How do I rebuild (recreate) an agent's container?"
52
52
  - "How do I delete an agent?"
53
53
  - "How do I restart the Rev4a server?"
54
54
  - "How do I change environment variables?"
55
- - "How do I add a cost override?"
55
+ - "How do I add a cost override?" — There is no screen for it. The endpoint exists, but nothing in the dashboard calls it.
56
56
  - "How do I see the session lineage?"
57
57
  - "How do I log in to an agent's control UI?"
58
- - "How do I register a new provider via OAuth?"
58
+ - "Why does the Control UI ask me to approve this browser?"
59
+ - "How do I approve or revoke a browser for an agent?"
60
+ - "How do I give someone else access to an agent's Control UI?"
61
+ - "How do I update an agent to a newer OpenClaw version, and how do I go back?"
62
+ - "How do I register a new provider via OAuth?" — The endpoint exists but no page uses it. Providers are added by pasting an API key on the Gateway page.
59
63
  - "How do I manage agent model fallbacks?"
60
64
  - "How do I connect an agent to Telegram?"
61
65
  - "How do I approve a pairing code?"
@@ -97,9 +101,7 @@ PULSE is the in-dashboard AI concierge for Rev4a. This document defines what she
97
101
  - "What does the yellow diamond next to an agent mean?"
98
102
  - "Why is the agent base image banner showing?"
99
103
  - "How do I fix 'image is outdated'?"
100
- - "What happens if I abort a build?"
101
- - "Can I close the build modal while it's running?"
102
- - "How do agent image rebuilds work?"
104
+ - "How do agent image updates work?" — The banner on the Agents page runs a `docker pull`. It is a download, not a build: there is no modal, no live log, and no way to abort from the UI.
103
105
  - "Why is my Telegram bot not connecting?"
104
106
  - "Why can't I approve a pairing code?"
105
107
  - "Why is the TG badge missing from my agent?"
@@ -9,10 +9,61 @@ export async function register() {
9
9
  if (process.env.NEXT_RUNTIME === 'nodejs') {
10
10
  try {
11
11
  const { syncAllAgents } = await import('./app/api/gateway/sync');
12
- syncAllAgents();
12
+ // The outcome used to be discarded. syncAllAgents reports failures instead of
13
+ // throwing, so the catch below never saw a sync that reached no container —
14
+ // Docker not yet up at boot left the fleet stale with nothing in the log.
15
+ const outcome = syncAllAgents();
16
+ if (outcome.ok) {
17
+ console.log(`[rev4a] Startup sync: ${outcome.summary}`);
18
+ } else {
19
+ console.warn(`[rev4a] Startup sync incomplete: ${outcome.summary} Run Sync All Agents once the cause is fixed.`);
20
+ }
13
21
  } catch {
14
22
  // Best-effort — don't block startup if sync fails
15
23
  console.warn('[rev4a] Failed to sync agents on startup');
16
24
  }
25
+ // Updates cut off by the restart: no job runs in a fresh process, so any update
26
+ // still marked active becomes `interrupted` and waits for the operator.
27
+ try {
28
+ const { recoverInterruptedUpdates } = await import('./lib/agent-update');
29
+ const interrupted = await recoverInterruptedUpdates();
30
+ if (interrupted) console.warn(`[rev4a] ${interrupted} agent update(s) were interrupted by the restart`);
31
+ } catch {
32
+ console.warn('[rev4a] Could not check agent updates on startup');
33
+ }
34
+ // Recreates cut off by the restart: the row becomes `interrupted` and an agent the
35
+ // backup had stopped is started again, so nothing stays down.
36
+ try {
37
+ const { recoverInterruptedRecreates } = await import('./lib/agent-recreate');
38
+ const interrupted = await recoverInterruptedRecreates();
39
+ if (interrupted) console.warn(`[rev4a] ${interrupted} agent recreate(s) were interrupted by the restart`);
40
+ } catch {
41
+ console.warn('[rev4a] Could not check agent recreates on startup');
42
+ }
43
+ // Restores cut off by the restart: same treatment — the row becomes `interrupted`
44
+ // and a container left stopped is started again.
45
+ try {
46
+ const { recoverInterruptedRestores } = await import('./lib/agent-restore');
47
+ const interrupted = await recoverInterruptedRestores();
48
+ if (interrupted) console.warn(`[rev4a] ${interrupted} agent restore(s) were interrupted by the restart`);
49
+ } catch {
50
+ console.warn('[rev4a] Could not check agent restores on startup');
51
+ }
52
+ // Edits cut off by the restart: same treatment.
53
+ try {
54
+ const { recoverInterruptedEdits } = await import('./lib/agent-edit');
55
+ const interrupted = await recoverInterruptedEdits();
56
+ if (interrupted) console.warn(`[rev4a] ${interrupted} agent edit(s) were interrupted by the restart`);
57
+ } catch {
58
+ console.warn('[rev4a] Could not check agent edits on startup');
59
+ }
60
+ // Cold backups whose helper outlived a Rev4a restart: finish the exited ones (the
61
+ // agent is started again if it was running) and keep watching the rest.
62
+ try {
63
+ const { reconcileColdBackups } = await import('./lib/cold-backup');
64
+ await reconcileColdBackups();
65
+ } catch {
66
+ console.warn('[rev4a] Could not reconcile cold backups on startup');
67
+ }
17
68
  }
18
69
  }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Whether an agent is in the middle of a long operation that nothing else may touch:
3
+ * an edit (lib/agent-edit.ts), a restore (lib/agent-restore.ts), a recreate
4
+ * (lib/agent-recreate.ts), an update (lib/agent-update.ts) or a cold backup
5
+ * (lib/cold-backup.ts). The routes that change an agent answer 409 with this reason.
6
+ */
7
+ import { isColdBackupRunning } from '@/lib/cold-backup';
8
+ import { isUpdateActive } from '@/lib/agent-update-state';
9
+ import { isRecreateActive } from '@/lib/agent-recreate-state';
10
+ import { isRestoreActive } from '@/lib/agent-restore-state';
11
+ import { isEditActive } from '@/lib/agent-edit-state';
12
+
13
+ export async function agentBusyReason(agentId: string): Promise<string | null> {
14
+ if (isUpdateActive(agentId)) return 'An update of this agent is running';
15
+ if (isRecreateActive(agentId)) return 'A recreate of this agent is running';
16
+ if (isRestoreActive(agentId)) return 'A restore of this agent is running';
17
+ if (isEditActive(agentId)) return 'An edit of this agent is running';
18
+ if (await isColdBackupRunning(agentId)) return 'A backup of this agent is running';
19
+ return null;
20
+ }
21
+