-
Notifications
You must be signed in to change notification settings - Fork 32
🤖 feat: add workspace archiving support #1267
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this 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.
b2175cb to
3160f1c
Compare
- 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
Workspace archiving replaces sidebar deletion with a safe, reversible action.
Changes
archived/archivedAtto workspace schemas + propagate through metadataworkspace.archive/workspace.unarchiveORPC endpointsforce: true)Behavior
force: falsewithout confirmation; only shows the force-delete modal if the non-force delete fails.Generated with
mux• Model:openai:gpt-5.2• Thinking:high