Home

mweinbach / agent-coworker

publicmweinbach/agent-coworker
Overview Code History Branches Pull requestsIssuesInsights
main
HomeOverview Code PRsIssues

feat: native web search, workspace settings, and desktop UI redesign (#47)

7 months ago

b6e3f43
Authored
Max Weinbach3/18/2026, 4:55:31 AM
* Add native Codex web search with desktop and TUI support

* Refine desktop provider and subagent settings layout

* improvements

* feat: add shared workspace settings with per-workspace opt-in toggle

All workspaces share settings by default. A toggle in the Advanced tab
enables per-workspace configuration. Disabling syncs all workspaces
to the current workspace's settings after confirmation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: move MCP config files card into collapsible Advanced section

The config files card is now hidden behind an "Advanced" collapsible
toggle at the bottom of the MCP servers page, reducing visual clutter.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: hide workspace name and active workspace card in shared settings mode

In shared mode (default), the sidebar workspace name and the Active
workspace card are hidden since they're not relevant. Removes the
"Shared" badge — shared is the silent default. Tests updated to set
perWorkspaceSettings: true where workspace-specific UI is expected.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: redesign Memory and Usage settings pages

Memory page: replace always-visible form with dialog modal, add
expandable entry list matching MCP servers pattern, inline scope
filter buttons, relative timestamps, delete confirmation, and
polished empty state with BrainIcon.

Usage page: switch from per-session view to aggregate view across
all threads. Group by provider and model with expandable sections,
show total cost/tokens/turns/sessions. Add loadAllThreadUsage store
action to populate usage data from all thread transcripts on mount.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: redesign activity group card with timeline layout

Replace the heavy card-based thinking UI with a clean timeline layout
inspired by conversational AI patterns. Reasoning entries show with
clock icons and full markdown text, tool entries get subtle outlined
cards with status indicators, and a vertical line connects everything.

- "Thinking" → "Thought process" with lighter header and Done indicator
- Timeline nodes with vertical connectors between entries
- Scrollable content area (max ~20 lines) with bottom fade mask
- Animated open/close transitions on the collapsible card
- Minimal drop shadow on the card container

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: add sources carousel with favicon, title, and domain for web search results

Replaces the plain "Sources: 1, 2, 3, 4" text footer with a horizontally
scrolling card carousel. Each card shows the site favicon, page title, and
domain. Supports both native web search (OpenAI) and Exa webSearch tool.
Titles are extracted from Exa results directly; for native web search URLs,
titles are derived from the URL slug.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: allow clearing web search allowed domains and location fields

pickStringArray now returns [] instead of undefined for empty arrays,
so explicitly clearing allowedDomains is preserved through the merge.

pickCodexWebSearchLocation now returns {} instead of undefined when all
fields are blank, and the merge logic detects an explicit empty location
patch and removes the stale location instead of preserving it.

Fixes the two issues flagged in PR #47 review comments.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: sync shared settings to active threads in other workspaces

When toggling per-workspace settings off, the copied defaults were only
updated in local state. Active threads in other workspaces kept stale
config until manual edit or reconnect. Now calls
applyWorkspaceDefaultsToThread for all threads in affected workspaces.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: call useMemo unconditionally for aggregate usage

The ternary made the useMemo call conditional on props.aggregate,
which violates React's rules of hooks and could cause a hook-order
mismatch. Now always computes the memoized value and picks between
the prop and the computed value afterward.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Parentd017a49

82 files changed
  • apps/TUI/component/markdown.tsx+3−0
  • apps/TUI/component/message/assistant.tsx+6−1
  • apps/TUI/component/message/tool-part.tsx+1−1
  • apps/TUI/component/prompt/slash-commands.ts+129−0
  • apps/TUI/component/tool/web.tsx+29−3
  • apps/TUI/context/modelStream.ts+2−1
  • apps/TUI/context/syncEventReducer.ts+1−0
  • apps/TUI/context/syncModelStreamLifecycle.ts
+23
−2
  • apps/TUI/context/syncTypes.ts+29−11
  • apps/TUI/routes/session/index.tsx+1−0
  • apps/desktop/bun.lock+274−15
  • apps/desktop/index.html+6−0
  • apps/desktop/package.json+3−0
  • apps/desktop/src/app/modelStream.ts+2−2
  • apps/desktop/src/app/openaiCompatibleProviderOptions.ts+106−101
  • apps/desktop/src/app/store.actions/bootstrap.ts+50−1
  • apps/desktop/src/app/store.actions/provider.ts+22−14
  • apps/desktop/src/app/store.actions/thread.ts+33−2
  • apps/desktop/src/app/store.feedMapping.ts+22−2
  • apps/desktop/src/app/store.helpers.ts+4−0
  • apps/desktop/src/app/store.helpers/persistence.ts+1−0
  • apps/desktop/src/app/store.ts+1−0
  • apps/desktop/src/app/types.ts+9−1
  • apps/desktop/src/components/ai-elements/message.tsx+17−1
  • apps/desktop/src/components/ai-elements/sources-carousel.tsx+187−0
  • apps/desktop/src/components/ui/tooltip.tsx+34−0
  • apps/desktop/src/lib/desktopSchemas.ts+42−1
  • apps/desktop/src/lib/providerDisplayNames.ts+1−1
  • apps/desktop/src/lib/providerOrdering.ts+32−0
  • apps/desktop/src/styles.css+22−0
  • apps/desktop/src/ui/ChatView.tsx+13−1
  • apps/desktop/src/ui/chat/ActivityGroupCard.tsx+121−84
  • apps/desktop/src/ui/chat/activityGroups.ts+1−1
  • apps/desktop/src/ui/chat/toolCards/toolCardFormatting.ts+80−0
  • apps/desktop/src/ui/onboarding/DesktopOnboarding.tsx+1−5
  • apps/desktop/src/ui/settings/SettingsShell.tsx+3−2
  • apps/desktop/src/ui/settings/pages/McpServersPage.tsx+41−24
  • apps/desktop/src/ui/settings/pages/MemoryPage.tsx+231−117
  • apps/desktop/src/ui/settings/pages/ProvidersPage.tsx+155−59
  • apps/desktop/src/ui/settings/pages/UsagePage.tsx+263−303
  • apps/desktop/src/ui/settings/pages/WorkspacesPage.tsx+907−333
  • apps/desktop/test/chat-activity-group-card.test.tsx+2−2
  • apps/desktop/test/chat-activity-groups.test.ts+1−1
  • apps/desktop/test/memory-page.test.ts+4−4
  • apps/desktop/test/model-stream-mapper.test.ts+76−1
  • apps/desktop/test/onboarding-ui.test.tsx+68−0
  • apps/desktop/test/providers-page.test.ts+243−10
  • apps/desktop/test/store-feed-mapping.test.ts+284−0
  • apps/desktop/test/tool-card-formatting.test.ts+11−0
  • apps/desktop/test/usage-page.test.ts+141−169
  • apps/desktop/test/workspace-settings-sync.test.ts+32−0
  • apps/desktop/test/workspace-startup.test.ts+37−0
  • apps/desktop/test/workspaces-page.test.ts+257−16
  • docs/websocket-protocol.md+51−3
  • prompts/system-models/gpt-5.4.md+4−2
  • prompts/system.md+4−2
  • src/client/modelStream.ts+72−1
  • src/client/modelStreamReplay.ts+9−3
  • src/prompt.ts+31−0
  • src/runtime/openaiNativeResponses.ts+118−4
  • src/runtime/openaiResponsesProjector.ts+22−1
  • src/runtime/openaiResponsesShared.ts+7−2
  • src/runtime/piMessageBridge.ts+11−0
  • src/runtime/piRuntimeOptions.ts+38−0
  • src/runtime/piStreamParts.ts+1−0
  • src/server/modelStream.ts+2−1
  • src/server/protocol.ts+1−1
  • src/server/protocolEventParser.ts+22−3
  • src/server/protocolParser.ts+60−2
  • src/shared/displayCitationMarkers.ts+270−23
  • src/shared/openaiCompatibleOptions.ts+193−19
  • src/tools/index.ts+8−1
  • tasks/lessons.md+13−0
  • test/displayCitationMarkers.test.ts+89−0
  • test/modelStreamReplay.test.ts+49−0
  • test/protocol.test.ts+92−0
  • test/runtime.openai-responses-runtime.test.ts+196−9
  • test/runtime.pi-options.test.ts+34−0
  • test/shared/openaiCompatibleOptions.test.ts+86−0
  • test/tools.test.ts+36−0
  • test/tui.model-stream.test.ts+79−1
  • test/tui.slash-commands.test.ts+108−0