diff --git a/src/App.tsx b/src/App.tsx
index c11602c1..6101ae9b 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -66,7 +66,7 @@ function WorkspaceTabRoute() {
tab: string;
}>();
- if (!workspaceId) {
+ if (!workspaceId && !sessionId) {
return ;
}
@@ -74,7 +74,7 @@ function WorkspaceTabRoute() {
return ;
}
- const decodedWorkspaceId = decodeURIComponent(workspaceId);
+ const decodedWorkspaceId = workspaceId ? decodeURIComponent(workspaceId) : null;
const decodedSessionId = sessionId ? decodeURIComponent(sessionId) : null;
const decodedTab = tab ? decodeURIComponent(tab) : 'chat';
@@ -83,7 +83,10 @@ function WorkspaceTabRoute() {
{decodedTab} view
- Workspace: {decodedWorkspaceId}
+ Workspace:{' '}
+
+ {decodedWorkspaceId || 'none (session-level route)'}
+
Session:{' '}
@@ -102,20 +105,20 @@ const router = createBrowserRouter(
path: '/',
element: ,
children: [
- { index: true, element: },
+ { index: true, element: }, // TODO: Show empty state component loader here.
{
path: 'workspaces/:workspaceId',
element: ,
children: [
{ index: true, element: },
{ path: ':tab', element: },
- {
- path: 'sessions/:sessionId',
- children: [
- { index: true, element: },
- { path: ':tab', element: },
- ],
- },
+ ],
+ },
+ {
+ path: 'sessions/:sessionId',
+ children: [
+ { index: true, element: },
+ { path: ':tab', element: },
],
},
],
diff --git a/src/components/refactored/shared/layout/MainHeading.tsx b/src/components/refactored/shared/layout/MainHeading.tsx
index 87b520bb..e0670931 100644
--- a/src/components/refactored/shared/layout/MainHeading.tsx
+++ b/src/components/refactored/shared/layout/MainHeading.tsx
@@ -111,22 +111,20 @@ export function MainHeading() {
return () => observer.disconnect();
}, [isMobile, updateScrollState]);
- if (!workspaceId) {
+ if (!workspaceId && !sessionId) {
return null;
}
const handleTabSelect = (nextTab: AppTab) => {
- // Preserve workspace/session context while switching only the active tab path segment.
- const encodedWorkspaceId = encodeURIComponent(decodedWorkspaceId);
+ // Preserve route context while switching only the active tab path segment.
const encodedTab = encodeURIComponent(nextTab);
if (decodedSessionId) {
- navigate(
- `/workspaces/${encodedWorkspaceId}/sessions/${encodeURIComponent(decodedSessionId)}/${encodedTab}`,
- );
+ navigate(`/sessions/${encodeURIComponent(decodedSessionId)}/${encodedTab}`);
return;
}
+ const encodedWorkspaceId = encodeURIComponent(decodedWorkspaceId);
navigate(`/workspaces/${encodedWorkspaceId}/${encodedTab}`);
};
@@ -158,7 +156,7 @@ export function MainHeading() {
{title}
- {decodedWorkspaceId}
+ {decodedWorkspaceId || t('mainContent.newSession')}
diff --git a/src/components/refactored/shared/layout/MobileNav.tsx b/src/components/refactored/shared/layout/MobileNav.tsx
index c8f24ad7..381989a8 100644
--- a/src/components/refactored/shared/layout/MobileNav.tsx
+++ b/src/components/refactored/shared/layout/MobileNav.tsx
@@ -89,21 +89,19 @@ export function MobileNav() {
}, [moreOpen]);
const navigateToTab = (nextTab: AppTab) => {
- if (!workspaceId) {
+ if (!workspaceId && !sessionId) {
return;
}
- const encodedWorkspaceId = encodeURIComponent(decodeValue(workspaceId));
const encodedTab = encodeURIComponent(nextTab);
const decodedSessionId = decodeValue(sessionId);
if (decodedSessionId) {
- navigate(
- `/workspaces/${encodedWorkspaceId}/sessions/${encodeURIComponent(decodedSessionId)}/${encodedTab}`,
- );
+ navigate(`/sessions/${encodeURIComponent(decodedSessionId)}/${encodedTab}`);
return;
}
+ const encodedWorkspaceId = encodeURIComponent(decodeValue(workspaceId));
navigate(`/workspaces/${encodedWorkspaceId}/${encodedTab}`);
};
diff --git a/src/components/refactored/sidebar/hooks/useWorkspaces.ts b/src/components/refactored/sidebar/hooks/useWorkspaces.ts
index e2f71be6..72bbb540 100644
--- a/src/components/refactored/sidebar/hooks/useWorkspaces.ts
+++ b/src/components/refactored/sidebar/hooks/useWorkspaces.ts
@@ -23,7 +23,7 @@ import {
splitWorkspacesByStarred,
} from '@/components/refactored/sidebar/utils/workspaceTransforms';
-const SESSION_ROUTE_PATTERN = /^\/workspaces\/[^/]+\/sessions\/([^/]+)(?:\/[^/]+)?$/;
+const SESSION_ROUTE_PATTERN = /^\/sessions\/([^/]+)(?:\/[^/]+)?$/;
const extractSessionIdFromPathname = (pathname: string): string | null => {
const sessionMatch = pathname.match(SESSION_ROUTE_PATTERN);
@@ -120,7 +120,7 @@ export const useWorkspaces = () => {
}
navigate(
- `/workspaces/${encodeURIComponent(matchedWorkspace.workspaceId)}/sessions/${encodeURIComponent(sessionId)}`,
+ `/sessions/${encodeURIComponent(sessionId)}`,
);
},
[navigate, workspaces],