Skip to content

workspaces + chat: codex inheritance fix, Overview dashboard, two-kinds-of-chat#182

Merged
luokerenx4 merged 8 commits into
masterfrom
dev
May 13, 2026
Merged

workspaces + chat: codex inheritance fix, Overview dashboard, two-kinds-of-chat#182
luokerenx4 merged 8 commits into
masterfrom
dev

Conversation

@luokerenx4
Copy link
Copy Markdown
Contributor

@luokerenx4 luokerenx4 commented May 13, 2026

Summary

  • Workspace AI provider config is now strictly workspace-owned — no
    symlink inheritance from ~/.codex/, no ~/.codex/config.toml
    pollution.
  • New Workspaces Overview dashboard, with template-grouped sections
    driven by each template.json (extensible to many template types
    via JSON declarations, no frontend code change).
  • Chat activity sidebar restructured into two clearly labeled
    sections — Workspace chat (recommended) and Traditional — surfacing
    the cost / capability split between native-CLI chats and the
    ChatHook-driven path used by connectors.
  • README documents the "Two kinds of chat" split.

Per-session contributions

2026-05-13 — Codex inheritance, Overview dashboard, two-kinds-of-chat split

  • Tier-1 UX polish (c575415): readable tab titles, sidebar tag
    truncate, session SDK icons.
  • Codex global-config inheritance removed (6b52853): drop the
    symlink + workspace config.toml MCP block; wire MCP per-spawn via
    -c mcp_servers.openalice.url=...; reset deletes the workspace's
    .codex/ directory entirely; wire_api default flipped to
    responses (codex-cli ≥ 0.130 dropped chat).
  • TODO (907fcda): profile + AI Provider model needs structural
    rethink — flagged alongside the native-Anthropic / native-OpenAI
    TODOs.
  • Workspaces Overview dashboard (bb7b991): pinned Overview row,
    card-based view per workspace, sorted by recent activity, with
    override badge + latest commit footer.
  • Template-grouped sections (5164253): dashboard cards group by
    template; section order driven by each template.json's
    displayName + groupOrder — new template types just need a JSON
    entry.
  • Two kinds of chat (24b424f): Chat sidebar split into Workspace
    chat (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

24b424f feat(chat): two-section sidebar — workspace chat (recommended) + traditional
5164253 feat(workspaces): group Overview dashboard by template type
bb7b991 feat(workspaces): Overview dashboard with card-based status view
907fcda docs(TODO): flag profile + AI Provider model needs structural rethink
6b52853 refactor(workspaces): drop global-config inheritance, wire MCP per-spawn
c575415 feat(workspaces/ui): readable tab titles + sidebar truncate + SDK icons

Test plan

  • tsc --noEmit clean
  • pnpm test passes (1687 tests)
  • Fresh chat workspace creates no .codex/ skeleton; codex spawn uses global ChatGPT auth + sees OpenAlice MCP via -c flag.
  • UI Save writes .codex/{config.toml, env.json} only (no MCP block, no auth.json); UI Reset deletes the entire .codex/ directory.
  • ~/.codex/config.toml unmodified after all operations.
  • Overview dashboard renders cards with correct status / sessions / override / commit; sections respect groupOrder from template.json (CHAT before AUTO-QUANT); card / session / override clicks route correctly.
  • Chat sidebar: Workspace chat section shows only template==chat workspaces; create form locked to chat template; clicking workspace opens /workspaces/<id> tab; Traditional section unchanged; "Why two kinds of chat?" link goes to README anchor.

🤖 Generated with Claude Code

Ame and others added 8 commits May 13, 2026 16:01
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>
@luokerenx4 luokerenx4 changed the title workspaces: codex config inheritance fix + tier-1 UX polish workspaces + chat: codex inheritance fix, Overview dashboard, two-kinds-of-chat May 13, 2026
@luokerenx4 luokerenx4 merged commit b6706b0 into master May 13, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant