@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.
- package/README.md +3 -1
- package/agent-templates/README.md +42 -22
- package/agent-templates/base-image/Dockerfile +42 -33
- package/agent-templates/base-image/entrypoint.sh +67 -12
- package/app/agents/BrowserAccessSection.tsx +510 -0
- package/app/agents/ChannelManager.tsx +19 -11
- package/app/agents/ImageDownloadBanner.tsx +53 -19
- package/app/agents/ModelSection.tsx +316 -0
- package/app/agents/PageClient.tsx +708 -167
- package/app/agents/UpdateSection.tsx +300 -0
- package/app/agents/create/PageClient.tsx +11 -49
- package/app/agents/create/page.tsx +8 -21
- package/app/api/agents/[id]/backup/route.ts +26 -69
- package/app/api/agents/[id]/channels/pairing/route.ts +3 -3
- package/app/api/agents/[id]/channels/telegram/route.ts +2 -2
- package/app/api/agents/[id]/cold-backup/route.ts +56 -0
- package/app/api/agents/[id]/devices/route.ts +126 -0
- package/app/api/agents/[id]/invite-link/route.ts +53 -0
- package/app/api/agents/[id]/lifecycle/route.ts +3 -0
- package/app/api/agents/[id]/model/route.ts +113 -0
- package/app/api/agents/[id]/open-control-ui/route.ts +58 -0
- package/app/api/agents/[id]/recreate/route.ts +33 -187
- package/app/api/agents/[id]/restart/route.ts +5 -0
- package/app/api/agents/[id]/restore/route.ts +40 -70
- package/app/api/agents/[id]/route.ts +38 -169
- package/app/api/agents/[id]/update/rollback/route.ts +30 -0
- package/app/api/agents/[id]/update/route.ts +50 -0
- package/app/api/agents/activity-summary/route.ts +67 -0
- package/app/api/agents/create/route.ts +91 -145
- package/app/api/agents/devices-summary/route.ts +37 -0
- package/app/api/agents/download-image/route.ts +16 -9
- package/app/api/agents/image-status/route.ts +31 -111
- package/app/api/agents/models-summary/route.ts +163 -0
- package/app/api/agents/route.ts +25 -49
- package/app/api/agents/token/route.ts +33 -10
- package/app/api/assistant/route.ts +37 -16
- package/app/api/gateway/agent/route.ts +37 -6
- package/app/api/gateway/provider/balance/route.ts +5 -2
- package/app/api/gateway/provider/keys.ts +13 -1
- package/app/api/gateway/provider/route.ts +43 -12
- package/app/api/gateway/sync.ts +335 -76
- package/app/api/models/route.ts +28 -34
- package/app/api/provider/auth.ts +65 -0
- package/app/api/provider/upstream.ts +9 -2
- package/app/api/provider/v1/chat/completions/route.ts +22 -16
- package/app/api/provider/v1/models/route.ts +26 -133
- package/app/api/setup/agent-image/route.ts +14 -42
- package/app/components/DashboardToolbar.tsx +1 -1
- package/app/components/PulseChat.tsx +25 -39
- package/app/components/ui/RemoveButton.tsx +46 -0
- package/app/components/ui/Select.tsx +3 -2
- package/app/components/ui/index.ts +1 -0
- package/app/credentials/PageClient.tsx +2 -2
- package/app/gateway/PageClient.tsx +253 -674
- package/app/globals.css +8 -0
- package/app/lib/models-context.tsx +43 -7
- package/app/wizard/useWizard.ts +6 -1
- package/bin/rev4a.js +116 -50
- package/daemon.js +6 -6
- package/docs/ARCHITECTURE.md +110 -12
- package/docs/FRONTEND-ARCHITECTURE.md +31 -2
- package/docs/REV4A.md +93 -33
- package/docs/dev/API-REFERENCE.md +723 -178
- package/docs/dev/DATABASE.md +96 -0
- package/docs/dev/GATEWAY.md +250 -93
- package/docs/dev/PROVIDERS.md +26 -13
- package/docs/rag/DATA-FRESHNESS.md +59 -28
- package/docs/rag/GLOSSARY.md +27 -16
- package/docs/rag/REV4A-OVERVIEW.md +37 -25
- package/docs/rag/WHAT-I-CAN-ANSWER.md +10 -8
- package/instrumentation.ts +52 -1
- package/lib/agent-busy.ts +21 -0
- package/lib/agent-devices.ts +361 -0
- package/lib/agent-edit-state.ts +108 -0
- package/lib/agent-edit.ts +157 -0
- package/lib/agent-images.ts +375 -0
- package/lib/agent-ports-server.ts +27 -0
- package/lib/agent-ports.ts +68 -0
- package/lib/agent-readiness.ts +110 -0
- package/lib/agent-recreate-state.ts +108 -0
- package/lib/agent-recreate.ts +305 -0
- package/lib/agent-restore-state.ts +107 -0
- package/lib/agent-restore.ts +135 -0
- package/lib/agent-setup.ts +66 -17
- package/lib/agent-update-state.ts +122 -0
- package/lib/agent-update.ts +448 -0
- package/lib/agent-versions.json +14 -0
- package/lib/agent-versions.ts +80 -0
- package/lib/buildAgentImage.ts +88 -290
- package/lib/channelManager.ts +153 -64
- package/lib/cold-backup.ts +354 -0
- package/lib/container-file.ts +27 -0
- package/lib/credentials/delivery.ts +3 -3
- package/lib/db-bootstrap.mjs +76 -0
- package/lib/docker-utils.ts +3 -3
- package/lib/model-catalogue.ts +140 -27
- package/lib/provider-balance.ts +33 -12
- package/lib/rev4a-paths.ts +0 -21
- package/model-pricing.json +118 -110
- package/models.config.json +27 -12
- package/package.json +1 -1
- package/app/api/gateway/route.ts +0 -191
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Data Freshness in Rev4a
|
|
2
2
|
|
|
3
|
-
> **Last updated:** 2026-
|
|
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
|
|
11
|
+
**Update frequency:** every 30 seconds
|
|
12
12
|
|
|
13
|
-
The daemon polls `openclaw sessions --json --all-agents` on
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
|
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:**
|
|
28
|
+
**Update frequency:** every 5 seconds (via SSE stream)
|
|
26
29
|
|
|
27
|
-
The `/api/stream` endpoint pushes updates to the dashboard every
|
|
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
|
-
-
|
|
33
|
+
- The session list
|
|
30
34
|
- Today's cost total
|
|
31
|
-
- Lineage data
|
|
32
35
|
|
|
33
|
-
|
|
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 (
|
|
46
|
+
**Update frequency:** every daemon poll cycle (30 seconds)
|
|
47
|
+
|
|
48
|
+
**Retention:** 30 days (older rows are pruned automatically each cycle)
|
|
40
49
|
|
|
41
|
-
|
|
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
|
|
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
|
|
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:**
|
|
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
|
|
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
|
|
91
|
+
**Update frequency:** polled every 2 seconds, continuously
|
|
74
92
|
|
|
75
|
-
|
|
76
|
-
with the
|
|
77
|
-
|
|
78
|
-
|
|
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
|
|
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
|
-
|
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
package/docs/rag/GLOSSARY.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Rev4a Glossary
|
|
2
2
|
|
|
3
|
-
> **Last updated:** 2026-
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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-
|
|
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
|
|
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.
|
|
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
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
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
|
-
- "
|
|
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
|
-
- "
|
|
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?"
|
package/instrumentation.ts
CHANGED
|
@@ -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
|
+
|