Skip to content

Conversation

@ammar-agent
Copy link
Collaborator

@ammar-agent ammar-agent commented Dec 21, 2025

Workspace archiving replaces sidebar deletion with a safe, reversible action.

Changes

  • Add archived / archivedAt to workspace schemas + propagate through metadata
  • Add workspace.archive / workspace.unarchive ORPC endpoints
  • Sidebar: replace Delete with Archive and hide archived workspaces
  • Project page (create-workspace flow): show Archived Workspaces with search + timeline grouping
  • Archived list supports:
    • Restore
    • Permanent delete (only from archived view; bulk delete always uses force: true)
    • Bulk selection via checkboxes (+ shift-click range select) with a progress modal
  • Archiving interrupts any active stream for that workspace (prevents "headless" streams)

Behavior

  1. Archiving removes a workspace from the sidebar (and it’s filtered out of the frontend workspace tracking map).
  2. Archived workspaces are visible on the project page (create-workspace view), where they can be restored.
  3. Permanent deletion is only available for archived workspaces.
  4. Single-delete tries force: false without confirmation; only shows the force-delete modal if the non-force delete fails.

Generated with mux • Model: openai:gpt-5.2 • Thinking: high

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Replace delete with archive in the sidebar for a safe, reversible operation.
Archived workspaces are hidden from the sidebar but visible on the welcome
page where they can be restored or permanently deleted.

Changes:
- Add archived/archivedAt fields to workspace schemas
- Add archive/unarchive API endpoints and handlers
- Update ProjectSidebar to archive instead of delete
- Filter archived workspaces from sidebar display
- Add ArchivedWorkspaces component for welcome page
- Add custom ArchiveIcon/ArchiveRestoreIcon SVG components
- Remove ForceDeleteModal from sidebar (archiving is safe)

---
_Generated with `mux` • Model: `anthropic:claude-opus-4-5` • Thinking: `high`_
Extract workspace creation + archived workspaces into a dedicated ProjectPage
component that shows when a project is selected but no workspace is active.

- Creates ProjectPage.tsx combining ChatInput (creation) with ArchivedWorkspaces
- Simplifies App.tsx by delegating to ProjectPage
- Removes unused imports and refs from App.tsx
- Filter archived workspaces out of workspaceMetadata map during load
- Backend workspace.list now filters by archived status (archivedOnly param)
- ProjectPage fetches archived workspaces separately via API
- Add onWorkspacesChanged callback to refresh after unarchive/delete
- Remove redundant sidebar filter (archived already excluded from map)
Move archive button outside the inner flex-col so it centers against the
entire workspace item (title + status row) rather than just the title row.
- Use flex spacers to vertically center content
- Move ConnectionStatusIndicator to top
- Chat input inside scrollable area (centered when no archived workspaces)
- Archived workspaces shown above chat input with proper spacing
The archived fields were being stored in config but not copied to the
WorkspaceMetadata objects returned by getAllWorkspaceMetadata(). This
caused archived workspaces to still appear in sidebar and prevented
the archivedOnly filter from working.
- Remove ChatInput's internal wrapper for creation variant
- ProjectPage handles layout: scrollable flex column with spacers
- Chat input centered, archived workspaces at bottom
- No overlap when height constrained (content scrolls)
- Renamed archivedOnly to archived in API
- Added search and timeline grouping to ArchivedWorkspaces
- Checkboxes for multi-select with shift+click range selection
- Bulk action buttons in header when items selected
- Progress modal showing operation status
- Select all checkbox in search bar
- Added story: ArchivedWorkspacesBulkSelection
Refactored BulkProgressModal to use the standard Dialog component pattern
from ui/dialog.tsx instead of a custom fixed overlay. This aligns with
other modals in the app (ForceDeleteModal, SecretsModal, etc.) and fixes
the transparent/confusing background issue.
- Remove `archived: boolean` from schemas
- Archived state is now derived: archivedAt > unarchivedAt
- Archive just sets archivedAt, unarchive just sets unarchivedAt
- Add unarchivedAt to recency calculation (bumps restored workspaces to top)
- Update aggregator to accept and track unarchivedAt
- Update all filtering/checks to use timestamp comparison
@ammario ammario merged commit 18a7d72 into main Dec 21, 2025
20 checks passed
@ammario ammario deleted the workspace-archiving branch December 21, 2025 20:17
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.

2 participants