Spaces:
Sleeping
Sleeping
Commit History
-
Faster warm paths and honest numbers for Usage and Overview
Three related fixes after the factory rebuild exposed cold-start costs: - Usage cache is now stale-while-revalidate with last-good fallback, and ccusage gets 60s instead of 20s: a cold scan that used to time out surfaced as "0 tok" next to valid quota bars. The frontend also renders missing numbers as an em-dash-free "—" instead of zero, and buildUsage() joins the boot warmup so the first visit rarely pays the scan. - The Overview's remaining first-open cost was FUSE metadata, not parsing: every rebuild stat'ed hundreds of transcripts and re-walked the directory trees. Dormant files (untouched for a day) now skip the stat for a minute at a time, and directory listings are remembered for 5s. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>0dd286d -
Usage tab: read rollout tails for the codex quota, not whole files
codexQuota() read EVERY codex rollout in full and JSON-parsed every line on the event loop until it found a rate-limit snapshot — with multi-hundred-MB rollouts that froze the entire app whenever the Usage tab opened (and again on every 60s cache expiry). The newest snapshot rides the most recent token_count event, i.e. the END of the file: scan a 256KB tail per file, newest files and newest lines first, at most 20 files. Measured 78ms against a 23MB rollout. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>e1f1450
-
Keep the server responsive while a big transcript is being written
Transcript parsing is synchronous CPU on the single event loop. An actively-worked session with a large transcript (hundreds of k tokens) changes mtime continuously, so every 1s poll re-parsed tens of MB of JSONL back to back — starving every other request, including serving index.html: the app went blank white while Claude was busy. Heavy files now re-parse on a duty cycle (a file whose parse costs >150ms waits 10x its cost, capped at 10s, before re-parsing; cheap files keep 1s freshness), and the tail cap drops from 40MB to 12MB — digests only need recent activity, and totals for monster files were already flagged approximate. Also add a top-level React error boundary: an uncaught render error unmounts the whole tree (the other way to a white page); now it shows a reload card and logs the error instead. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>85187c5 -
Send Enter as its own keypress, not part of the input burst
Typing a reply into codex from the Overview left the text sitting in the composer unsubmitted: TUIs detect rapid input bursts as a paste, and the trailing CR inside the burst becomes a newline in the composer instead of a submit. sendInput now waits 300ms between the payload and the Enter so the Enter reads as a real keypress (both tmux and pty paths; callers await). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>5972612 -
Codex: no cross-session pickup in shared folders
Two ways a codex session could surface a SIBLING's conversation when several share one folder: an unpinned restart ran `codex resume --last` (cwd-scoped, so it resumes whoever spoke last), and the pin capture claimed the newest rollout by mtime — a sibling's ongoing thread gets fresh writes during the window. Unpinned restarts in shared folders now start fresh instead (capture pins the new thread immediately), and capture only claims rollouts whose session_meta says they were CREATED after this launch. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>c3210f3 -
Quickstart prompts ride the launch command, not typed keystrokes
Typing the prompt into the TUI after a fixed 4s boot wait was a race — a cold start on the bucket takes longer and silently swallows the keystrokes (agent created, prompt lost). The prompt is now queued on the session (pendingPrompt) and embedded in the FIRST launch command itself: claude --session-id <id> 'p', codex 'p', gemini -i 'p', opencode --prompt 'p' — single-quoted so quotes, $vars and newlines arrive literally. Cleared once the first launch happens; CLIs without an initial-prompt flag (hermes, openclaw) keep the typed fallback. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>b38b5c1
-
Progressive loading for the Overview and Usage pages
Both pages blocked on their slowest dependency: the Overview on the first full traces build (every transcript on the bucket parsed before anything rendered), Usage on a Promise.all over ccusage subprocesses with 20s timeouts. Three changes: - The traces cache is warmed at server boot, so the expensive first build usually finishes before anyone opens a page. - The Overview renders its full layout instantly from the tree and fills tiles progressively, top of the feed first: a new GET /api/meta/:id parses only that session's transcripts (Claude: the file is sessionUuid.jsonl; Codex: the pinned rollout) with a three-wide client queue, while the bulk poll back-fills db-backed CLIs. Pending tiles/cards show a shimmer instead of a global "reading traces…" screen; parsed files share the per-file cache so nothing is read twice. - Usage fetches each provider separately (/api/usage?provider=…) and renders the frame immediately with skeleton stats and table rows — a hung provi…e34ce4a -
Click the prompt to read it in full
The card's prompt line was a one-line ellipsis with no way to see the rest. The digest now carries lastPromptRaw (newlines preserved, same clip budget as answers) and clicking the prompt toggles between the one-liner and the full text — the counterpart of the answer's more/less. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>a3d2eef -
Overview tiles + conversation window; archive inactive sessions
The Overview's default is now a compact tile grid: status dot, one-line prompt, and a state line (spinning "running", "✓ done", "stopped") per session, groups wrapped in a fine fieldset-style outline, and an accent ring only on your-turn tiles fresher than a day. Clicking a tile opens a conversation window over the grid — the full card (turn arrows, live running state, reply) plus open-pane and close. The old list stays one toggle away (icon segment next to the filters, both centered in the bottom bar); the reply line everywhere is now a textarea where shift+enter inserts a newline. Sessions with no activity beyond a configurable window (Settings: 1 week / 1 month / never, default 1 month) are archived: hidden from the sidebar and overview, nothing stored or deleted — flipping the setting instantly (un)archives, working sessions and shells/files panes are exempt. The sidebar legend (now working / idle / stopped) gains a quiet "archived" checkbox to reveal them greyed out, and the tree…585ab8a -
Seed autonomous defaults for Codex and Claude Code on the Space
Both CLIs ship with per-command approval prompts tuned for laptops. On the Space the private container is itself the sandbox, so the prompts add friction without adding safety, and Codex's own sandbox can't work anyway (needs Landlock, unavailable in the container). On boot, seed what's missing and never touch what the operator set: Codex gets approval_policy = "never" + sandbox_mode = "danger-full-access" in $CODEX_HOME/config.toml (missing keys prepended so they stay ahead of any [section]); Claude Code gets permissions.defaultMode = "bypassPermissions" in settings.json, i.e. what shift+tab toggles per conversation, as the standing default. Gated to Space deployments via the entrypoint-set env vars, same idiom as the statusline hook. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>a5a7b57
-
Teach agents to publish web artifacts and use HF Jobs
The environment skill gains two policy sections. Artifacts: when a result reads better as a page than as terminal text, agents render a self-contained HTML page and publish it to a central static artifacts Space (default <namespace>/agent-artifacts, created on first use via the hf CLI), maintain an index.html, and put the page's direct *.static.hf.space link in their final answer; interactive demos get their own Space. Jobs: expensive compute goes to hf jobs run on dedicated hardware, with a cost policy (above $X ask the operator first; 0 = always ask). Both are operator-configurable via a new am-config.json + /api/config (GET/PUT) and a Settings section: artifacts on/off, target Space, public/private default, and the jobs threshold — segmented binary controls, sub-settings greyed out when off, all controls in one aligned column. Saving regenerates the skill. The skill's description is now imperative (READ THIS BEFORE STARTING ANY WORK + a keyword summary) since that line is exactly …b60e122 -
Quickstart: pick a harness, type a prompt, go
A lightning-bolt button next to + opens a minimal launcher: one row of harness logos (every agent CLI, uninstalled ones greyed out) and an auto-growing prompt field. Enter creates the session at the workspaces root and jumps to its pane while the server boots the CLI and types the prompt once it's up (fire-and-forget prompt param on POST /api/sessions) — no waiting for startup. Shift+Enter inserts a newline; multi-line prompts are delivered as a bracketed paste so the CLI's composer treats inner newlines as soft breaks (also fixes multi-line replies from the Overview). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>5017021 -
Overview: true running state, turn history, richer cards
The card called a Codex task "done" as soon as any assistant message appeared, but Codex emits several intermediate messages per task. Parse its task lifecycle instead: event_msg task_started/task_complete drive a digest-level running flag (with the terminal-derived state as fallback for other CLIs), the running card shows the latest model output with a spinner below it, and task_complete's last_agent_message is the authoritative answer. Web searches now count as tool calls (they were tracked separately and showed "0 tools" on search-heavy tasks). New per-request turn history: each assistant text pushes the previous one into digest.turnsLog (cleared on every new prompt), and up/down arrows on the meta line page through the model's intermediate turns with a "turn k/N" indicator. Card design: the user prompt is the loudest line (full text color, accent arrow), the reply is a quiet always-visible input whose arrow mirrors the prompt's, and the 16px anti-zoom input rule is scoped to touc…8e5d9a0
-
Bring Overview digest latency down to ~1s for Claude/Codex
Claude/Codex updates took up to ~9s (4s poll + 5s server memo); OpenClaw up to ~39s. New knobs: Overview polls at 1s, server memo TTL 400ms, opencode/Hermes hot-DB guard 15s -> 8s, OpenClaw quiet window 30s -> 10s. The OpenClaw fence guard predates moving its state to local disk (entrypoint.sh), where reads no longer disturb its metadata fingerprint — keep a small margin since its session fence is unusually touchy. Cost stays negligible thanks to per-file mtime caching: an unchanged poll serves in ~1-5ms, re-parsing an actively-written 7MB rollout takes ~15ms, and a new prompt line is visible server-side ~70ms after the CLI writes it (measured). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>436d14d -
Fix Codex pinning: session_meta first line outgrew the 8KB read
Codex embeds its full instruction text in the rollout's session_meta line (~22KB as of 0.142), so firstLine()'s fixed 8KB read truncated the JSON and every capture attempt silently failed: no Codex session ever got pinned, resume relaunched fresh conversations, and Overview attribution survived only through the cwd fallback — which goes ambiguous the moment two Codex sessions share a folder (e.g. several at the workspaces root, showing "no prompt yet"). Read the first line in chunks until the newline (1MB cap). Verified against real session_meta lines from Codex 0.133 through 0.143. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>7c805c5
-
Exclude Codex guardian subagent rollouts from traces and pinning
Codex >=0.142 spawns internal "guardian" safety-judge subagents whose rollout files share the session's cwd. The trace parser attributed them to the user's session, polluting or blanking out the Overview digest (codex-1 showed nothing), and the ID capture could pin a guardian's conversation id, which would also break resume. Flag rollouts whose session_meta says thread_source=subagent (or has a source.subagent) and skip them in trace attribution and in tryCaptureCodexId. Sessions already pinned to a guardian or missing rollout self-heal on next launch: the stale pin is cleared so the real conversation is re-captured. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>68fe810 -
Add demo mode: hide current sessions behind a settings toggle
A pure view filter for showing off a clean-slate Space. Activating from Settings snapshots the current session/group IDs and hides them from the sidebar and overview, and forces the welcome card to show. Nothing is deleted: tmux keeps running, logins and secrets stay valid. Sessions created while it's on aren't in the snapshot, so they show through. Deactivating clears the snapshot and every session reappears. State persists on the bucket (/data/demo.json) so it survives reloads and restarts until turned off. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>40f8c9b -
Pre-release hardening
Security & privacy: - Add Apache-2.0 LICENSE + SECURITY.md; license in HF frontmatter and package.json - Sanitize rendered markdown with DOMPurify (Overview + Skills) to close an XSS path - Symlink-safe file browser (realpath containment check) - Warn when a private Space's bucket visibility can't be verified without HF_TOKEN - /api/relaunch cooldown Robustness: - Process-level unhandledRejection/uncaughtException backstops; ws/wss/server error listeners - Guard FUSE persists (sessions, push subscriptions) - Memoize command-exists probes so /api/clis stops spawning ~16 subprocesses per call - Cap transcript reads (tail huge .jsonl) and evict stale fileCache entries Polish: - Remove the ?clipdebug diagnostic overlay - Welcome modal a11y: focus trap, Escape-to-close, initial focus, aria-labelledby - Surface failed sidebar mutations via an error toast - Locked-page copy button falls back to execCommand inside the HF iframe - Un-LFS the install screenshot; gitignore/untrack __pycache__ …ece21ed -
Add first-run welcome guide
Server-flagged (once per Space, persists on the bucket), reopenable from Settings. Covers persistence, starting an agent, keys/secrets via the environment skill, Overview, notifications, and privacy. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>94ef8c1
-
Polish sidebar creation and terminal headers
cae0460 -
Require explicit copy for tmux selections
Verified signaturea883217
-
pane polish: boot cover until TUI paints; styled stopped strip, no raw [exited]
Verified signaturef5c570f -
opencode guard v2: seed a real config file so the dir bug can't re-trigger mid-session
Verified signature8c11ea0 -
opencode launch guard: clear directory-shaped opencode.json (1.17.13 exit bug)
Verified signature00f2d73
-
settings polish: version self-heal, secrets autosave, de-carded rows, full usage table, skills meta + page scroll, mobile fixes
Verified signature37775da -
hermes digest + HF_TOKEN readiness; secrets section redesign; WAL-aware db change keys
Verified signaturedf0df18 -
global hermes symlink; shell PATH restore; unified setup hints; aligned agent rows
Verified signature87c8b12 -
hf CLI in image; group-scoped creation; needs-setup hints
Verified signatureea9d6ed
-
Overview: unified reply line; opencode digest via SQLite reader
Verified signature7661818 -
Hollow-accent 'your turn' dots; opencode resumes via --continue after restarts
Verified signatureb56a366 -
opencode readiness: detect 1.x config (opencode.jsonc) — auth.json is pre-1.x only
Verified signature578c443 -
Distribute skills into OpenClaw's private HOME (~/.agents/skills under OPENCLAW_HOME)
Verified signature9b82516 -
OpenClaw gets its own HOME on local disk (no symlinks — boundary check rejects them; no FUSE — fence rejects that): boot restore + 60s backup
Verified signature3c13663 -
OpenClaw state on local disk (FUSE fence incompatibility): boot restore + legacy migration + 60s rsync backup to bucket
Verified signature13aa212 -
Environment skill: delayed notifications run in the background (no long blocking sleeps in tool execs)
Verified signature7ea6362 -
Don't read hot OpenClaw session files (30s quiet window, fence-safe); tighter mobile sidebar rows
Verified signature4ee54c8 -
Notifications UX: iframe guard with direct-URL link, readiness timeout, honest ok:false when no devices subscribed
Verified signatureb4f26e5 -
Agent-initiated push notifications: VAPID+subscriptions, /api/notify (rate-limited), service worker, PWA manifest+icons, Settings enable/test, environment-skill etiquette
Verified signature9c5792a -
Parse OpenClaw traces for the Overview digest; single hairline on empty cards
Verified signaturead9c300 -
Install page v2 (plain title, ready-note, visible code panel) + public-bucket lock gate; OpenClaw onboard-then-chat; Settings agents as rows + manual update path
Verified signature545eab2 -
Add OpenClaw (openclaw chat, embedded local mode); bump base image to node:22 (OpenClaw needs 22.19+)
Verified signaturea69a644 -
Overview feed redesign: group capsules with choreographed collapse, prompt/meta/answer cards with tokens, ghost reply lines, state filter, dormant one-liners
Verified signature7c91582 -
Overview v2 (groups, markdown expand, working indicator, codex cwd fallback), page landing fix, labelled create fields, boot cover, touch scroll, flat dots
Verified signaturea9cda9b -
Overview: per-agent cards with since-last-prompt digest and reply box (wakes stopped agents via detached tmux)
Verified signature7d9aec4 -
Mobile support: full-screen list/pane navigation, per-agent chip strip for groups, touch sizing; gate skill fan-out to Space envs
Verified signatureef84d06
-
Trace analytics on Usage page (turns/tools/web/tokens per agent), quiet loading states, X for sidebar delete, compact files header
Verified signature604c3c1 -
Pane layout widget: per-group grid presets (1x1-3x3) + auto grow, pager for overflow, drag pane headers to swap tiles
Verified signaturebd25310 -
Shell quick-add opens at the workspaces root (path '' = root, auto-folder only when path omitted)
Verified signatured5d1801 -
New sessions land on top unless created inside a group; prompt tracks current dir relative to workspaces root
Verified signature2d4a54b -
Decouple names from folders (explicit paths + folder picker, visual-only groups), pin Codex conversations, fix drag-into-group, async usage, WS origin check, secrets filter
Verified signaturefd0a8b6