- Added session context read-only endpoints to proxy (list sessions, fetch full JSONL context).
- Added gated “session contexts” tab for claimed agents (kwkaiser only) with session list + message viewer.
- Added tests covering session tab gate and visibility.
- Fixed proxy session parsing against live OpenClaw schema (
message.role/message.content, sessionId/sessionFile) and made session file resolution robust. - Added
kwkaiser read-only session viewer access on all-agents expanded panels (no claim required), including viewer_name passthrough for /activity, /sessions, and /sessions/{ref}. - Added website tests for all-agents session viewer helpers and rebuilt encrypted
index.html. - Fixed Fly.io proxy CI deploy build failure by removing Dockerfile hard copies of gitignored
agents.json and workspaces/, setting AGENTS_JSON_PATH=/data/agents.json, and creating /app/workspaces fallback for first-boot safety. - Extended GitHub deploy workflow to build/push the bot gateway image on main/master merges using
flyctl deploy --build-only --app mangrove-alexbot, so bot container changes are published without automatic full-fleet restarts. - Updated CI deploy flow to use
FLYIO_PROXY_TOKEN for the bot-image build job and added a new manual-only manual-bot-redeploy GitHub workflow that redeploys mangrove-karlbot from the latest gateway container build context. - Fixed bot-related GitHub workflows after CI failure: both bot image build and manual karlbot redeploy now use a generated minimal
ci.fly.toml ([build].dockerfile) to bypass invalid parsing of gateway/fly.toml by current flyctl in Actions. - Hardened
manual-bot-redeploy workflow so generated ci.fly.toml now includes bot runtime settings and the persistent volume mount (openclaw_data -> /data), ensuring redeploy keeps using the state volume. - Added bot image version stamping: gateway Dockerfile now writes
/VERSION from build arg GIT_SHA (default unknown), and both CI bot build + manual karlbot redeploy workflows now pass --build-arg GIT_SHA=${GITHUB_SHA}. - Fixed
manual-bot-redeploy after Fly volume mismatch: switched from fly deploy rollout to two-step flow (fly deploy --build-only --push --image-label ... then fly machine update targeting the existing /data-mounted machine with openclaw_data), preserving vol_r63x7mgww9djqgpr. - Pinned OpenClaw install in bot gateway Dockerfile to
openclaw@2026.3.12 and changed manual karlbot redeploy to skip rebuilds entirely (it now updates the existing mounted machine to the prebuilt registry.fly.io/mangrove-karlbot:bot-gateway-latest image from CI bot build). - Fixed manual redeploy image selection: workflow now resolves
IMAGE_REF from flyctl releases --json --app mangrove-karlbot (latest complete release ImageRef) with optional workflow_dispatch override input, instead of hardcoding a missing tag. - Created shared Fly app namespace
mangrove-openclaw-common and built/pushed a common gateway image tag registry.fly.io/mangrove-openclaw-common:openclaw-common-defaults-20260313-215812 via flyctl deploy --build-only --push; no existing bot app/machine was redeployed or modified. - Updated gateway entrypoint safety semantics: baked
/app/openclaw.json now installs only when /data/openclaw.json is missing, and stale workspace subdirectory cleanup was removed so existing /data/workspaces/* content is never deleted by image boot logic. - Built/pushed a refreshed shared image after the entrypoint safety fix:
registry.fly.io/mangrove-openclaw-common:openclaw-common-defaults-20260313-220334 (digest sha256:0a2908e2d5211a807f99875258a259c764132aa640026ad03ad94590c92e77be), still with zero machines on mangrove-openclaw-common. - Updated GitHub
deploy.yml bot-image build job to publish to the shared image app namespace (--app mangrove-openclaw-common) instead of mangrove-alexbot. - Updated
manual-bot-redeploy.yml default image resolution for karlbot to use the shared image tag registry.fly.io/mangrove-openclaw-common:bot-gateway-latest (still supports explicit image_ref override). - Added a new Python gateway push daemon skeleton at
agent_proxy/gateway/data_push.py that resolves agent ID from Fly app config and emits hello from agent <agent_id> on a 30-minute loop (interval overridable via env vars). - Wired
data_push.py into gateway startup (entrypoint.sh) as a managed background daemon and updated gateway build plumbing (gateway/Dockerfile, deploy_agents.py build-context file copy list) to include the new script. - Updated
.github/workflows/deploy.yml so the common bot image build job now also applies registry.fly.io/mangrove-openclaw-common:bot-gateway-latest to mangrove-karlbot as the final step (equivalent to manual-bot-redeploy machine-update flow), while keeping manual-bot-redeploy.yml unchanged for on-demand redeploys. - Added workflow-level GitHub Actions concurrency to
.github/workflows/deploy.yml (cancel-in-progress: true) so newer pushes cancel older in-flight runs on the same branch. - Investigated
mangrove-karlbot Fly deployment failure with flyctl: identified two stray 256MB unmounted machines created by prior rollout path (843ed3c2474d68, 90800729ad0048) failing on missing /data (cp ... /data/openclaw.json: No such file or directory). - Removed both failing unmounted machines from
mangrove-karlbot; confirmed only the original mounted machine remains (3d8d5146b12938 with volume vol_r63x7mgww9djqgpr at /data). - Audited mount pattern across core Mangrove bot apps (
alexbot, fredbot, bijanbot, barisbot, adityabot, eunjeongbot, jannikbot, woogbot, negevbot, giobot, charlesbot, jasminebot, corleone, tessio) and confirmed standard openclaw_data → /data volume attachment model. - Hardened karlbot rollout logic in
.github/workflows/deploy.yml and .github/workflows/manual-bot-redeploy.yml: resolve openclaw_data volume first, target machine by matching mounted volume ID, fall back to volume attachment metadata if needed, and fail closed if no volume-backed machine exists (prevents volume-less redeploys). - Updated both karlbot machine-update workflow paths to set
--vm-memory 1024 (1GB) on redeploy. - Extended
agent_proxy/gateway/data_push.py to best-effort parse latest OpenClaw session data on each loop: read sessions.json, select the highest-updatedAt session entry, parse each JSONL line with Pydantic (SessionJsonlRecord via TypeAdapter), and keep running while printing caught exceptions for index/file/record parse failures. - Switched karlbot rollout source from mutable tag to immutable refs in both deploy workflows: CI now builds
mangrove-openclaw-common as bot-gateway-<sha12>-<run_id>-<attempt>, resolves the latest complete immutable bot-gateway-* image from Fly releases, and uses that exact image ref for mangrove-karlbot machine updates. - Iterated immutable-tag resolver after CI failure (
flyctl releases --app mangrove-openclaw-common --json returns [] for build-only app with no releases): deploy workflow now uses the exact immutable image just built in-run, and manual redeploy now resolves latest build-successful deploy run via GitHub Actions API/gh api (bot-gateway-<sha12>-<run_id>-<attempt>), with JSON parsing hardened by replacing echo "$JSON" with printf '%s\n' "$JSON". - Added manifest-availability retry loops to karlbot machine updates in both CI deploy and manual redeploy workflows: on
MANIFEST_UNKNOWN/failed to get manifest, retry up to 10 attempts with 60-second waits; fail fast for non-retryable update errors. - Fixed workflow dependency regression from retry matcher: replaced
rg -q with built-in grep -Eq in both karlbot update loops so retries work on default GitHub runners without requiring ripgrep installation. - Added RTDB propagation to
agent_proxy/gateway/data_push.py: after parsing latest session data, daemon now PATCHes payload to session_snapshots/{agentId}/sessions (configurable root via DATA_PUSH_RTDB_ROOT) at FIREBASE_URL, with robust HTTP/JSON/file exception handling so failures log and loop continues. - Added
DATA_PUSH_SESSIONS_DIR override for session source path (default /data/agents/main/sessions) and validated parser+push path locally with fixture sessions data; observed expected non-fatal RTDB connection error handling in loop.