What We Shipped: Geta.Team v2.1.6 — Four Session Bugs, Codex Image Tools, and a New Admin Container Panel

Share
What We Shipped: Geta.Team v2.1.6 — Four Session Bugs, Codex Image Tools, and a New Admin Container Panel

v2.1.6 closes a chain of four bugs that all looked the same from the outside — "I started a fresh chat and the old conversation came back" — but had four completely different root causes. We found them while investigating one report, then kept pulling the thread until they were all gone. It also ships a real admin panel for managing live employee containers, which closes the longstanding "SSH and docker rm -f" loop most admins have been doing.

Here's what changed.

Four "the old conversation came back" bugs, four different fixes

These are worth grouping because they were the same symptom from different angles, and each one needed its own fix.

Custom LLM / OpenCode chats reverting after a server restart. When the GetATeam server restarted (without recycling the employee containers), the chat UI would revert to the very first OpenCode session ever created in that container — recent messages gone, conversation rewound to day one. The fix makes the database the authoritative source of which session is active after any restart, instead of an in-memory map that survived the restart and won against the fresh data. The DB value now wins; the in-memory map gets updated, not consulted first.

Switching AI providers mixing the old chat into the new session. When an employee was switched from one Custom LLM to another (say Gemini → DeepSeek), the container was correctly recycled and the new model only ever saw the new prompts, but the chat UI still showed the previous provider's messages above the new ones. Visually it looked like one continuous conversation that didn't actually exist on the LLM side. The fix clears the stored transcript path the moment a CLI-type switch happens, so the UI starts on a genuinely empty session instead of stacking on top of the old one. Covers all transitions: Claude ↔ Codex, Codex ↔ OpenCode, Custom LLM ↔ Custom LLM, and so on.

Clear Session for Codex not actually clearing. Hitting Clear Session on a Codex employee and starting a new chat would surface the previous conversation immediately. The wipe step in the backend was real, but it pointed at the legacy filesystem path Codex used before v2.1.0. Post-migration agents store rollouts somewhere else entirely, so the wipe was a no-op and the new container picked up the old rollout file. The fix wipes both the current path and the legacy one as a safety net.

First message after a fresh session disappearing. Starting a new chat and immediately hitting Send caused the message to vanish silently. v2.1.5 fixed this for OpenCode by waiting for a real readiness signal from the backend, but Codex and Claude regressed back into the failure mode. The new approach is different: the user can type and click Send anytime — if the session isn't actually ready yet, the message is queued, the user bubble and processing indicator appear immediately, and the message is forwarded for real once the underlying CLI is ready. No more refreshing. No more wondering if it sent.

Codex tool rendering, finally fixed

Two Codex-specific issues that made the right-side Tools panel painful to read.

Inline image preview for view_image. Until v2.1.6, Codex's view_image tool returned its output as a base64-encoded image embedded in the JSON. The right-side panel rendered that as a wall of characters — often more than 100KB of data:image/jpeg;base64,... text. The user couldn't actually see the image they'd uploaded. Now it renders the image inline, the way it should have from the start.

Internal metadata stripped from exec_command outputs. Codex tool outputs (Bash, Read, Grep, Glob, Edit, Write — all wrapped under exec_command) included header noise like Chunk ID: xxx, Wall time: 0.05s, Process exited with code 0, Original token count: NNN. Useful internally, useless to the reader. The cleaning function existed but had never been wired up. It's wired up now.

Claude OAuth: two small but annoying fixes

Cancelling the OAuth modal now actually cleans up. Closing the Claude OAuth modal used to leave the underlying employee container running in an unauthenticated waiting state — wasted resources, blocked slot, manual reset required. Cancel now triggers the full Clear Session flow: container destroyed, transcript path cleared, fresh container spawns when the user comes back.

The OAuth URL is no longer truncated mid-UUID. The Claude OAuth URL displayed in the modal could get cut off mid-UUID — typically right around client_id=9d1c250a-e61b-44d9-88... — which led the user to a Claude error page when they clicked the link. The cleaner that strips ANSI codes from the captured terminal output wasn't catching cursor-control sequences that Claude CLI also emits, so the regex extracting the URL would halt at the first invisible escape byte. Fixed by stripping the broader set of escape sequences and broadening the URL regex. Works for claude.ai, claude.com, and whatever URL pattern Anthropic ships next.

A real admin panel for managing employee containers

The big new feature this release. Admins now get a dedicated Geta.Team Containers panel under Admin → Containers in the sidebar — a real UI for what used to require SSH-ing to the host and running docker rm -f by hand.

What's in it:

  • Lists all running and stopped Vibecoder containers (employees, Claude OAuth, Codex OAuth) — never any infrastructure containers, hard-guarded by the backend.
  • Each row enriched with the user it belongs to, employee name, uptime, live CPU/memory stats, network and disk I/O, and image size.
  • Sparklines on each row for CPU and memory — last 30 samples (about 5 minutes of history) rendered as tiny inline line graphs. Persisted across sheet open/close so reopening the panel shows existing history immediately.
  • Header totals: container counts, total CPU%, total memory in human-readable units.
  • Live filter on employee ID, employee name, user email, or container name.
  • Sort: default groups containers by user, with collapsible cards. Or flat-list sorted by name, CPU%, or memory.
  • Polling interval dropdown: 5s / 10s (default) / 15s. Faster intervals were considered but docker stats itself takes about a second on a busy host, so they'd saturate the loop.
  • Destroy button per container with an AlertDialog confirmation — for employee containers, it runs the full Clear-Session-equivalent (transcript reset, codex rollouts wiped, both current and legacy paths). For OAuth containers, just docker rm -f.

Net effect: the day-to-day admin loop of "which emp containers are running, are any of them eating memory, kill the orphaned ones" now happens in one panel instead of three terminal sessions.

Nothing in this release adds a flashy capability for end users — but it closes a chain of session bugs that had been quietly eroding trust in Clear Session and provider switching, and gives admins the operational visibility they should have had from the start.

Want to test the most advanced AI employees? Try it here: https://Geta.Team

Read more