workspaces + chat: codex inheritance fix, Overview dashboard, two-kinds-of-chat#182
Merged
Conversation
Three small frontend polish items on the Workspaces surface: **1. Tab titles use tag + session name instead of UUID slices.** Before: tab strip showed `40216df4 · bd4ef4` — opaque hex prefixes from the workspace UUID and session UUID. Useless. Now: `chat-with-alice · c1` — same shape every other workspace tool uses. Threads `workspaces` into `TitleCtx` (was channels-only) so `workspaceModule.title` can look up the tag/sessionName by ID. Falls back to UUID prefix when the workspace hasn't loaded yet (first paint). **2. Sidebar workspace row tag truncates instead of wrapping.** Before: long workspace tags like `chat-with-alice` wrapped to 3 lines inside the narrow sidebar column (`chat-/with-/alice`). Wasted vertical space + ugly. Now: ellipsis truncation + hover tooltip with the full tag. `min-width: 0` on `.sidebar-row-main` lets the `.sidebar-tag` child shrink below its intrinsic width (the standard flex-overflow gotcha). **3. Session badges show SDK icons instead of `c` / `x` / `sh` letters.** Before: every session row had a colored badge with a single letter (`c` claude, `x` codex, `sh` shell). At-a-glance recognition was bad — `c` and `x` collide visually, `sh` doesn't fit the one-char convention, and the letters don't communicate "this is the agent SDK". Now: Lucide icons inside the badge — `Sparkles` (claude), `Cpu` (codex), `Terminal` (shell). Unknown adapter ids still fall back to the first letter so future adapters don't render blank. Background colour-coding kept (blue / green / orange). Verified live via DOM probe — all `.sidebar-agent-badge` instances now have `<svg>` children (was text nodes), badge size 16×14 unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Workspace agent config is now strictly workspace-owned. Default state = no `.claude/` or `.codex/` files, CLIs use their own globals (claude OAuth keychain, codex `~/.codex/`). Override state = files written by the UI. OpenAlice no longer plays inheritance games on either path. - Bootstrap drops the `.codex/auth.json` symlink. That was a spawn-time inheritance trick — codex resolved it to the user's global login at startup, violating "workspace handles only its own config files". - Codex adapter wires OpenAlice MCP via per-spawn `-c mcp_servers.openalice.url=...` instead of writing the workspace's config.toml or polluting `~/.codex/config.toml`. Verified empirically: `-c` adds the entry ephemerally without touching disk. - Adapter's `CODEX_HOME` guard is now "workspace's `.codex/` exists" not "auth.json exists". Codex doesn't actually require auth.json on startup (empirically verified; the old crash comment was wrong) — the current trigger is "any override file present" rather than the symlink-only legacy. - Reset paths delete the file / directory entirely instead of leaving empty stubs. `CODEX_HOME` is exclusive (not a merge layer); a half-empty `.codex/` would shadow the user's global login. Drive-by: codex-cli ≥ 0.130 dropped support for `wire_api = "chat"`. The provider modal still defaulted to it, which made every Codex override unusable on current codex builds. Default flipped to `responses`; legacy `chat` remains selectable but labelled. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Surfaced 2026-05-13 during workspaces' per-workspace codex override testing (commit 6b52853). `ai-provider-manager.json` profiles are claude-shaped — applying them to codex via the workspace AI config modal produces invalid endpoints (Anthropic baseUrl + OpenAI wire shape → 404). Parking as redesign item because the underlying schema conflates four concepts (Anthropic endpoints / OpenAI endpoints / vendor identity / `(baseUrl, model)` triple). Should land together with the native Anthropic / native OpenAI provider work already on TODO. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pinned "Overview" row at the top of the workspaces sidebar opens a
dashboard tab — card-based at-a-glance view of every workspace, sorted
by most-recent-activity. Each card surfaces the workspace's running /
paused sessions, AI-provider override status, and latest commit. Card
body opens the workspace tab; session rows drill straight into that
session; the ⚙ override row opens the AI-provider modal for that
workspace.
Designed future-friendly for "publish workspace state externally" —
no internal paths or secrets surface, clean status-page aesthetic.
Files:
- `src/workspaces/service.ts` — publicMeta returns `agentOverride:
{ claude, codex }` based on `.claude/settings.local.json` / `.codex/`
existence. Single statSync per workspace per poll, cheap.
- `ui/src/components/workspace/OverviewCard.tsx` — new. Header (status
dot + tag), template + relative-time subtitle, sessions block (icon
+ name + state, each clickable), override + commit footer block.
- `ui/src/pages/WorkspaceListPage.tsx` — replaced the "pick a workspace"
placeholder with the dashboard. Fetches latest commits in parallel
via existing /git/log endpoint on mount (not on the 3s poll — git
log is too expensive to run that often).
- `ui/src/components/workspace/Sidebar.tsx` + `WorkspacesSidebar.tsx`
+ `workspaces.css` — pinned Overview row with active highlight when
the dashboard tab is focused.
- `ui/src/components/workspace/api.ts` — `Workspace` type extended
with the optional `agentOverride` field.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Each workspace template declares its own `displayName` + `groupOrder` in `template.json`. The dashboard groups cards by template into sections, ordered by `groupOrder` (declared templates first, by groupOrder ascending; templates without an order sort after, by name; unknown / missing templates land in a trailing "Other" bucket). Cards within a section sort by most-recent-activity. Section headers show the resolved `displayName` and a count. Empty sections are skipped. New template types just add a directory under `src/workspaces/templates/<name>/` with a `bootstrap.sh` + a `template.json` declaring `displayName` and `groupOrder`. The dashboard picks them up automatically — no frontend code change. Designed to scale to many template types (chat / auto-quant / research / trading / ...). Drive-by: removed the per-card "Chat workspace · " subtitle prefix. Section headers now convey the template type, so the per-card label was redundant. Subtitle becomes just "Active <relative time>". Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…itional OpenAlice ships two paths for chatting with the agent that have very different performance and capability characteristics. Make the split visible in the Chat activity sidebar so users discover the recommendation without having to read docs first. - **Workspace chat (recommended)**: chat-template workspaces. The underlying CLI (claude / codex / shell) brings its own prompt cache and TUI rendering — 10× cost reduction on long sessions, plus the full MCP + local-file tool surface. Requires a CLI binary on the host. - **Traditional chat**: the original `/chat` channels backed by OpenAlice's ChatHook. Higher token use, capability constrained, but works in any environment — the only path connectors (Telegram / MCP Ask / webhook) can use, since they have no PTY. The two sections coexist; traditional isn't deprecated, just demoted. Changes: - `ui/src/components/ChatChannelListContainer.tsx` — Chat sidebar restructured into two clearly labelled sections with a footer link to the README anchor "Why two kinds of chat?" - `ui/src/components/workspace/ChatWorkspaceSection.tsx` — new. Filters workspaces to template=='chat', surfaces the same `WorkspaceRow` used in the Workspaces activity (spawn / pause / resume / config / delete unchanged). Compact create form with template locked to `chat` (only tag + agent picks exposed). - `ui/src/components/workspace/Sidebar.tsx` — export `WorkspaceRow`, `WorkspaceRowProps`, and `Selection` so the chat-section can reuse the existing row UI without duplicating ~200 LOC. - `README.md` — new top-level section "Two kinds of chat" with the Workspace vs Traditional matrix and "which one should I use" table. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… parity Three usability fixes to the Workspace Chat section in the Chat activity sidebar: - **Auto-filled tag.** Entering create mode pre-fills the input with a date-based default (`chat-may13`, `chat-may13-2`, … to dodge collisions). Input is focused + selected so a custom tag overwrites in one keystroke; or just hit enter to accept the default. - **Create form hidden by default.** Section header has a `+` toggle that opens an inline form; the form was always-visible before, burning ~80px of sidebar real estate on a feature used once per session. Closes after a successful create. - **Collapsible session groups + visual parity with Traditional channels.** Each workspace is a collapsible row (chevron prefix, expanded by default). Row body shows status dot + tag — no trailing "4h" meta — matching the `# channel` rows below. Action buttons (⚙ AI Provider, × delete) are hover-revealed on the workspace row, same pattern as the channel rows' settings/delete affordances. - Clicking a workspace name navigates to its **most-recent-active session** when one exists (matches the "pick up where I left off" mental model of a chat sidebar). Session sub-rows still drill into specific sessions for power users. The Workspaces activity remains the surface for new-session spawn-by-agent. `Sidebar.tsx` exports `SessionRow` so ChatWorkspaceSection can reuse the same session-row UI without duplicating its pause / resume / delete logic. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Workspaces hardening + Chat sidebar dual-mode + Overview dashboard. - **Codex inheritance removed.** Workspace AI provider config is now strictly workspace-owned — no `.codex/auth.json` symlink to global, no `~/.codex/config.toml` pollution. OpenAlice MCP is wired per-spawn via `codex -c mcp_servers.openalice.url=...`. Reset deletes the workspace's `.codex/` entirely. `wire_api` default flipped to `responses` (codex-cli ≥ 0.130 dropped `chat`). - **Workspaces Overview dashboard.** Pinned "Overview" row in the Workspaces sidebar opens a card-based status view; sorted by recent-activity; cards show running/paused sessions + AI provider override + latest commit. Cards group by template type, with each template declaring its own `displayName` + `groupOrder` in `template.json` — adding new template types is JSON-only, no frontend change. - **Two kinds of chat split.** Chat activity sidebar restructured into two clearly labelled sections — Workspace chat (recommended, native CLI cache + frontend) and Traditional (ChatHook-based, the only path connectors can use). README adds the trade-off matrix. - **Chat sidebar UX.** Workspace Chat section gets a date-based default tag (`chat-may13`), collapsible session groups (chevron prefix), hover-revealed actions, and a `+` toggle for the create form — visual parity with the Traditional channels list. - **TODO.** Profile + AI Provider model needs a structural rethink to un-conflate Anthropic-shape / OpenAI-shape endpoints with vendor identity. Park alongside the native-Anthropic / native-OpenAI provider TODOs already on the list. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
symlink inheritance from
~/.codex/, no~/.codex/config.tomlpollution.
driven by each
template.json(extensible to many template typesvia JSON declarations, no frontend code change).
sections — Workspace chat (recommended) and Traditional — surfacing
the cost / capability split between native-CLI chats and the
ChatHook-driven path used by connectors.
Per-session contributions
2026-05-13 — Codex inheritance, Overview dashboard, two-kinds-of-chat split
c575415): readable tab titles, sidebar tagtruncate, session SDK icons.
6b52853): drop thesymlink + workspace config.toml MCP block; wire MCP per-spawn via
-c mcp_servers.openalice.url=...; reset deletes the workspace's.codex/directory entirely;wire_apidefault flipped toresponses(codex-cli ≥ 0.130 droppedchat).907fcda): profile + AI Provider model needs structuralrethink — flagged alongside the native-Anthropic / native-OpenAI
TODOs.
bb7b991): pinned Overview row,card-based view per workspace, sorted by recent activity, with
override badge + latest commit footer.
5164253): dashboard cards group bytemplate; section order driven by each
template.json'sdisplayName+groupOrder— new template types just need a JSONentry.
24b424f): Chat sidebar split into Workspacechat (recommended) + Traditional, with footer link to the README
anchor. README adds a top-level "Two kinds of chat" section with
the Workspace vs Traditional matrix.
Full commit log
Test plan
tsc --noEmitcleanpnpm testpasses (1687 tests).codex/skeleton; codex spawn uses global ChatGPT auth + sees OpenAlice MCP via-cflag..codex/{config.toml, env.json}only (no MCP block, no auth.json); UI Reset deletes the entire.codex/directory.~/.codex/config.tomlunmodified after all operations.groupOrderfromtemplate.json(CHAT before AUTO-QUANT); card / session / override clicks route correctly./workspaces/<id>tab; Traditional section unchanged; "Why two kinds of chat?" link goes to README anchor.🤖 Generated with Claude Code