-
Notifications
You must be signed in to change notification settings - Fork 43
feat(sidebar): refactor project sidebar into spaces with pinned sidebar and card redesign #2837
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
Merged
Merged
Changes from all commits
Commits
Show all changes
148 commits
Select commit
Hold shift + click to select a range
f83d3d2
feat(sidebar): add agents accordion section and simplify sidebar layout
tlgimenes b3fe360
feat(spaces): unify projects and agents into spaces with pinned sidebar
tlgimenes d5e723d
feat(sidebar): refactor project sidebar with spaces list and simplifi…
tlgimenes 27dce57
feat(spaces): redesign project card and restore home page agents list
tlgimenes c2183c3
feat(sidebar): add settings gear icon to space menu items
tlgimenes 949ee7c
refactor(spaces): remove breadcrumb from virtual MCP detail view
tlgimenes 1755795
feat(sidebar): enhance spaces popover with details, create new, and s…
tlgimenes 4cf3d11
before resizing
tlgimenes 442dd5f
feat(sidebar): double collapsed sidebar width and center icons
tlgimenes 678d6b8
fix(sidebar): make collapsed spaces list HTML-compliant and fill width
tlgimenes 04945a5
fix(sidebar): make collapsed menu buttons square
tlgimenes 0a41e7b
fix(sidebar): use w-full aspect-square for collapsed menu buttons
tlgimenes 13d09e5
feat(sidebar): make space icons fill collapsed button area
tlgimenes ca18f53
refactor(sidebar): simplify sidebar components and add settings layout
tlgimenes 67ae000
merge: resolve conflicts from origin/main
tlgimenes edc6728
fix(sidebar): pin+open spaces and reduce collapsed width
tlgimenes d569dd9
fix(sidebar): reduce collapsed sidebar width and unify button styles
tlgimenes 90324c0
fix(sidebar): pin new spaces and increase sidebar gap
tlgimenes 2fa9173
feat(tasks-panel): add gear icon and use URL for virtualMcpId
tlgimenes af6b7ab
merge: resolve conflicts from origin/main
tlgimenes 9d8ff5f
fix(ui): fix tasks panel syntax error and remove settings padding
tlgimenes 3533382
feat(sidebar): project sidebar refactor + remove panel dividers
rafavalls 201836b
feat(ui): remove page headers inside spaces and clean up chat panel c…
rafavalls b5cc937
feat(sidebar): add agents accordion section and simplify sidebar layout
tlgimenes 1f130c5
feat(spaces): unify projects and agents into spaces with pinned sidebar
tlgimenes 15d7176
feat(sidebar): refactor project sidebar with spaces list and simplifi…
tlgimenes a3d057f
feat(spaces): redesign project card and restore home page agents list
tlgimenes 1683462
feat(sidebar): add settings gear icon to space menu items
tlgimenes 6da34ae
refactor(spaces): remove breadcrumb from virtual MCP detail view
tlgimenes 550aaf4
feat(sidebar): enhance spaces popover with details, create new, and s…
tlgimenes c3d7e9b
before resizing
tlgimenes e0fe97e
feat(sidebar): double collapsed sidebar width and center icons
tlgimenes e0ea3ae
fix(sidebar): make collapsed spaces list HTML-compliant and fill width
tlgimenes d783dc8
fix(sidebar): make collapsed menu buttons square
tlgimenes c361cf8
fix(sidebar): use w-full aspect-square for collapsed menu buttons
tlgimenes 5502f69
feat(sidebar): make space icons fill collapsed button area
tlgimenes 2a2d34c
refactor(sidebar): simplify sidebar components and add settings layout
tlgimenes 0509d10
fix(sidebar): pin+open spaces and reduce collapsed width
tlgimenes f8688ee
fix(sidebar): reduce collapsed sidebar width and unify button styles
tlgimenes 0ab8376
fix(sidebar): pin new spaces and increase sidebar gap
tlgimenes 2cfb8d4
feat(tasks-panel): add gear icon and use URL for virtualMcpId
tlgimenes 384fc0e
fix(ui): fix tasks panel syntax error and remove settings padding
tlgimenes 33c0da8
feat(shell): scope tasks/chat panels to space routes only
tlgimenes a02d0b1
fix(connections): fix navigation route after rebase conflict resolution
tlgimenes 6c45310
fix(knip): remove unused files and unexport unused function
tlgimenes 8365b35
feat(shell): refactor space layout — show settings as home, consolida…
tlgimenes 9d63dc2
feat(tasks): add Incoming section showing space automations in tasks …
tlgimenes b94f3b6
fix(shell): simplify virtual MCP mount effect and fix panel layout
tlgimenes b097a30
fix(lint): use cn() for className interpolation in side-panel-tasks
tlgimenes 3552efa
fix(shell): replace CSS panel collapse with react-resizable-panels na…
tlgimenes 862309d
merge: resolve conflict in use-project-sidebar-items after merging main
tlgimenes 318e6b3
new sidebar and onboarding wip
rafavalls 79ac112
refactor(ui): extract cron utilities to shared module
tlgimenes bbe5b7d
refactor(ui): extract shared automation sub-components
tlgimenes ba4394f
feat(ui): parameterize SettingsTab for embedded mode with fixed agent
tlgimenes a96dc72
feat(ui): add automations tab entry to project settings
tlgimenes e7c83c2
feat(ui): add automations tab list+detail component
tlgimenes b08ab6d
feat(ui): wire automations tab into project settings view
tlgimenes 1a1897b
merge: integrate sidebar changes from #2870, excluding onboarding
tlgimenes 4160d87
refactor(ui): move settings to nav item, remove /settings route, rest…
tlgimenes fd53b62
feat(ui): add toolbar breadcrumb for spaces routes, unify agent/proje…
tlgimenes 92cc0be
merge: integrate main into project-sidebar-refactor
tlgimenes f171646
fix(ui): resolve lint error and remove unused files
tlgimenes f24d102
fix(ui): remove sidebar border and fix padding in settings pages
rafavalls 8ec78fe
fix(ui): reduce user avatar size in sidebar footer
rafavalls 5a72fd1
feat(ui): add account popover with org switcher and update sidebar la…
rafavalls 056b8ad
refactor(ui): move virtual-mcp and automations views out of component…
tlgimenes e36e726
merge: integrate main into project-sidebar-refactor
tlgimenes 43d5dda
fix(ui): restore branch's simplified sidebar after merge
tlgimenes d564ae9
fix(ui): compact space identity header in task panel
rafavalls 2c836f1
fix(deco-sites): remove hardcoded demo email override and stub sites
rafavalls 5ed655b
fix(ui): prevent chat panel race condition when navigating back from …
tlgimenes 20faec9
refactor(ui): migrate settings to route-based pages and clean up comp…
tlgimenes 27b0418
fix(ui): normalize panel spacing so all gaps are a consistent 6px
rafavalls 8c795b0
fix(ui): move tasks toggle button to left toolbar next to nav arrows
rafavalls 32c8a6c
fix(ui): move tasks toggle to the left of nav arrows
rafavalls 342da84
fix(ui): hide main panel toggle on org home
rafavalls b1f15e6
fix(ui): skip main panel on org home to prevent it stealing space
rafavalls 6da7e25
fix(ui): remove redundant chat/close toggles from tasks panel header
rafavalls 35b6322
fix(ui): consistent icon button styles in tasks panel + always-open s…
rafavalls 8caec4c
fix(ui): toggle search in tasks panel + uniform size-7/size-16 icon b…
rafavalls 7ea0814
fix(ui): owner filter button active/hover state matches other icon bu…
rafavalls 710d66a
fix(ui): remove persistent active state from owner filter button
rafavalls 294d582
fix(ui): use CollectionSearch component when search is open in tasks …
rafavalls 975ea38
feat(ui): add automation create/toggle in sidebar and ?main= central …
tlgimenes 9d00a99
merge main into branch
tlgimenes 0af33ae
fix(ci): resolve merge conflicts with main and clean up dead code
tlgimenes 27864b1
fix(ui): address PR review feedback — migration constraint, ref loops…
tlgimenes 6a8b779
feat(ui): add new task button in toolbar and fix chat panel default w…
rafavalls e06e90e
feat(ui): restore sidebar alignment and chat panel fixes after rebase
rafavalls 084738e
fix(ui): fix connection create dialog navigation route
rafavalls b558e76
fix(ui): remove agents/capabilities tabs, fix test-agent button, and …
tlgimenes fd82837
merge origin/main into tlgimenes/project-sidebar-refactor
tlgimenes a0786b2
refactor(ui): rename selectedAgent to selectedVirtualMcp, pass virtua…
tlgimenes fcac9c1
fix(ui): key ChatProvider by virtualMcpId to force clean remount on s…
tlgimenes be8f544
refactor(ui): rename spaces to agents across codebase and UI
tlgimenes 3557873
refactor(ui): simplify toolApprovalLevel flow, remove task item avata…
tlgimenes 750c688
fix(ui): address PR review feedback — remove dead code, fix bugs, cle…
tlgimenes 8855c77
fix(ui): address PR review feedback — remove dead code, fix bugs, cle…
tlgimenes 8fca475
Merge remote-tracking branch 'origin/main' into tlgimenes/project-sid…
tlgimenes db5c6a1
fix(ci): remove unused files and stale knip ignores
tlgimenes 55c15d7
fix(ci): format knip.jsonc with biome
tlgimenes 09bbb99
fix(auth): handle invalid baseUrl in getTrustedOrigins during test lo…
tlgimenes 9851b86
fix(core): fallback port to 3000 in getBaseUrl when settings.port is …
tlgimenes fcd2df2
feat(ui): redesign mobile layout — full-screen chat with sidebar sheet
rafavalls 2945709
feat(threads): replace agent_ids with virtual_mcp_id + SSE-driven badges
tlgimenes 109b957
feat(chat): add 3-context ChatContextProvider and new hooks
tlgimenes 357ce38
refactor(chat): integrate 3-context provider, migrate consumers, dele…
tlgimenes e9960cd
Merge remote-tracking branch 'origin/main' into tlgimenes/project-sid…
tlgimenes 56481e6
fix(chat): stabilize useStreamManager subscribe to prevent infinite r…
tlgimenes ba35855
Revert "fix(chat): stabilize useStreamManager subscribe to prevent in…
tlgimenes 037afe6
fix(chat): seed taskId in router validateSearch to prevent mount loop
tlgimenes 666aaeb
fix(chat): skip message query when taskId is null
tlgimenes 29ab245
fix(chat): remove safety-net polling from useStreamManager
tlgimenes 9662b0a
fix(shell): remove 8 useEffect cascades from ShellLayoutInner
tlgimenes 0caa527
chore: cherry-pick non-effect changes from 8f13459c6
tlgimenes 4aa5678
wip
tlgimenes 645aae2
fix(ui): move panel toggle to left of nav arrows, align sidebar top w…
rafavalls 207d83e
refactor(web): project sidebar refactor - use Sidebar components, rem…
tlgimenes 7bb7456
fix(chat): correct virtualMcpId resolution, remove debug logs
tlgimenes 381f70d
Merge remote-tracking branch 'origin/main' into tlgimenes/project-sid…
tlgimenes 8e1310f
refactor(web): remove unused createTask from project sidebar
tlgimenes 5244946
refactor(web): consolidate panel context and simplify project sidebar
tlgimenes beb9426
feat(web): add right-click context menu and delayed X icon on sidebar…
rafavalls aa0c664
refactor(web): extract useNavigateToNewTask hook for sidebar navigation
tlgimenes 3946979
refactor(web): simplify Suspense boundaries and expand sidebar on set…
tlgimenes d4cfad1
fix(decopilot): set virtual_mcp_id on threads created via chat stream
tlgimenes e25428d
refactor(web): simplify tasks panel and rename agent context to virtu…
tlgimenes 643c089
refactor(web): remove agent prop from TaskRow, add automation delete,…
tlgimenes bb2ed0f
fix(web): improve tasks panel UX and SSE cache invalidation
tlgimenes afccfc1
fix(web): show active starter count in incoming section header
tlgimenes 3a6d1b5
refactor(web): lazy-load AI provider and model fetches in chat
tlgimenes 021af3a
fix(threads): update test to match in_progress default status
tlgimenes ef81c7f
fix(web): remove unused files and exports flagged by knip
tlgimenes 822fdb6
refactor(web): decouple tasks panel from ChatContextProvider lifecycle
tlgimenes 2b97add
fix(web): don't throw when taskId is absent on non-agent routes
tlgimenes 3b4bf51
fix(web): add validateSearch to orgHomeRoute to seed taskId
tlgimenes 74beb56
fix: resolve TypeScript errors and update test expectations
tlgimenes f5610ea
fix(web): debounced autosave for virtual MCP settings and tasks panel
tlgimenes 094b819
fix(web): navigate to settings tab when clicking virtual MCP edit icon
tlgimenes 8289bbf
fix e2e
tlgimenes 8a43b10
fix e2e: handle query params in org home URL regex
tlgimenes 8eb7413
fix(e2e): loosen waitForURL regex to allow nested post-signup routes
tlgimenes e312569
fix(web): address PR review feedback across 39 comments
tlgimenes b473bf2
fix(web): use KEYS constants for automation query keys and add sound …
tlgimenes 6f6ab84
fix(ci): remove unused use-notification.ts and fix e2e connection test
tlgimenes 08f4cf3
fix(web): sort threads by most recently updated first
tlgimenes acb69ff
fix(schema): add layout field to VirtualMcpUISchema to fix output val…
tlgimenes File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,73 @@ | ||
| import type { Kysely } from "kysely"; | ||
| import { sql } from "kysely"; | ||
|
|
||
| export async function up(db: Kysely<unknown>): Promise<void> { | ||
| // Add pinned column | ||
| await db.schema | ||
| .alterTable("connections") | ||
| .addColumn("pinned", "boolean", (col) => col.notNull().defaultTo(false)) | ||
| .execute(); | ||
|
|
||
| // Backfill: projects become pinned, agents/null become unpinned | ||
| await sql`UPDATE connections SET pinned = true WHERE subtype = 'project' AND connection_type = 'VIRTUAL'`.execute( | ||
| db, | ||
| ); | ||
|
|
||
| // Drop the old composite index on (organization_id, connection_type, subtype) | ||
| await db.schema | ||
| .dropIndex("idx_connections_org_type_subtype") | ||
| .ifExists() | ||
| .execute(); | ||
|
|
||
| // Drop the CHECK constraint on subtype | ||
| await sql`ALTER TABLE connections DROP CONSTRAINT IF EXISTS chk_connections_subtype`.execute( | ||
| db, | ||
| ); | ||
|
|
||
| // Drop the subtype column | ||
| await db.schema.alterTable("connections").dropColumn("subtype").execute(); | ||
|
|
||
| // Add new composite index for pinned queries | ||
| await db.schema | ||
| .createIndex("idx_connections_org_type_pinned") | ||
| .on("connections") | ||
| .columns(["organization_id", "connection_type", "pinned"]) | ||
| .execute(); | ||
| } | ||
|
|
||
| export async function down(db: Kysely<unknown>): Promise<void> { | ||
| // Drop new index | ||
| await db.schema | ||
| .dropIndex("idx_connections_org_type_pinned") | ||
| .ifExists() | ||
| .execute(); | ||
|
|
||
| // Re-add subtype column | ||
| await db.schema | ||
| .alterTable("connections") | ||
| .addColumn("subtype", "text") | ||
| .execute(); | ||
|
|
||
| // Backfill: pinned items become projects, unpinned become agents | ||
| await sql`UPDATE connections SET subtype = 'project' WHERE pinned = true AND connection_type = 'VIRTUAL'`.execute( | ||
| db, | ||
| ); | ||
| await sql`UPDATE connections SET subtype = 'agent' WHERE pinned = false AND connection_type = 'VIRTUAL'`.execute( | ||
| db, | ||
| ); | ||
|
|
||
| // Re-add CHECK constraint | ||
| await sql`ALTER TABLE connections ADD CONSTRAINT chk_connections_subtype CHECK (subtype IN ('agent', 'project') OR subtype IS NULL)`.execute( | ||
| db, | ||
| ); | ||
|
|
||
| // Re-add old index | ||
| await db.schema | ||
| .createIndex("idx_connections_org_type_subtype") | ||
| .on("connections") | ||
| .columns(["organization_id", "connection_type", "subtype"]) | ||
| .execute(); | ||
|
|
||
| // Drop pinned column | ||
| await db.schema.alterTable("connections").dropColumn("pinned").execute(); | ||
| } |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| /** | ||
| * Automation Project Scope Migration | ||
| * | ||
| * Adds `virtual_mcp_id` column to `automations` table so automations can be | ||
| * scoped to a specific project or space (Virtual MCP). | ||
| * NULL means org-level (existing behavior). | ||
| */ | ||
|
|
||
| import { Kysely } from "kysely"; | ||
|
|
||
| export async function up(db: Kysely<unknown>): Promise<void> { | ||
| await db.schema | ||
| .alterTable("automations") | ||
| .addColumn("virtual_mcp_id", "text") | ||
| .execute(); | ||
|
|
||
| await db.schema | ||
| .createIndex("idx_automations_virtual_mcp") | ||
| .on("automations") | ||
| .columns(["virtual_mcp_id"]) | ||
| .execute(); | ||
| } | ||
|
|
||
| export async function down(db: Kysely<unknown>): Promise<void> { | ||
| await db.schema.dropIndex("idx_automations_virtual_mcp").execute(); | ||
|
|
||
| await db.schema | ||
| .alterTable("automations") | ||
| .dropColumn("virtual_mcp_id") | ||
| .execute(); | ||
| } |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,58 @@ | ||
| /** | ||
| * Thread Virtual MCP ID Migration | ||
| * | ||
| * Replaces the `agent_ids` JSON text column with a simple `virtual_mcp_id` | ||
| * foreign key. Each thread is associated with exactly one virtual MCP | ||
| * (the agent it was initiated with). | ||
| * | ||
| * - Adds `virtual_mcp_id` column (NOT NULL, defaults to empty string) | ||
| * - Backfills from `agent_ids[0]` where available | ||
| * - Adds composite index for efficient querying | ||
| * - Drops `agent_ids` column | ||
| */ | ||
|
|
||
| import type { Kysely } from "kysely"; | ||
| import { sql } from "kysely"; | ||
|
|
||
| export async function up(db: Kysely<unknown>): Promise<void> { | ||
| await db.schema | ||
| .alterTable("threads") | ||
| .addColumn("virtual_mcp_id", "text", (col) => col.notNull().defaultTo("")) | ||
| .execute(); | ||
|
|
||
| await sql` | ||
| UPDATE threads | ||
| SET virtual_mcp_id = (agent_ids::jsonb ->> 0) | ||
| WHERE agent_ids IS NOT NULL | ||
| AND agent_ids != '[]' | ||
| AND agent_ids != '' | ||
| AND (agent_ids::jsonb ->> 0) IS NOT NULL | ||
| `.execute(db); | ||
|
|
||
| await sql` | ||
| CREATE INDEX idx_threads_virtual_mcp_id | ||
| ON threads (organization_id, virtual_mcp_id, hidden, updated_at DESC) | ||
| `.execute(db); | ||
|
|
||
| await db.schema.alterTable("threads").dropColumn("agent_ids").execute(); | ||
| } | ||
|
|
||
| export async function down(db: Kysely<unknown>): Promise<void> { | ||
| await db.schema | ||
| .alterTable("threads") | ||
| .addColumn("agent_ids", "text", (col) => col.defaultTo("[]")) | ||
| .execute(); | ||
|
|
||
| await sql` | ||
| UPDATE threads | ||
| SET agent_ids = CASE | ||
| WHEN virtual_mcp_id IS NOT NULL AND virtual_mcp_id != '' | ||
| THEN jsonb_build_array(virtual_mcp_id)::text | ||
| ELSE '[]' | ||
| END | ||
| `.execute(db); | ||
|
|
||
| await sql`DROP INDEX IF EXISTS idx_threads_virtual_mcp_id`.execute(db); | ||
|
|
||
| await db.schema.alterTable("threads").dropColumn("virtual_mcp_id").execute(); | ||
| } | ||
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
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
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
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
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
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
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
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
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.
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.
P0: This migration is not registered in
migrations/index.ts. It needs both an import (import * as migration055threadvirtualmcpid from "./055-thread-virtual-mcp-id.ts") and an entry in themigrationsmap, otherwise it will never run.(Based on your team's feedback about checking migrations/index.ts registration before flagging.)
View Feedback
Prompt for AI agents
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.
Already registered — the import is on line 58 and the entry in the migrations object is on line 128 of
migrations/index.ts. No changes needed.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.
Thanks for the clarification—looks like it’s already registered. I’ll treat this as a false positive.