diff --git a/app/src/App.tsx b/app/src/App.tsx index 12197d8..5a0e0c3 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -4,7 +4,7 @@ import { Login } from './components/Auth/Login'; import { Layout } from './components/Layout/Layout'; import { CalendarList } from './components/Calendar/CalendarList'; import { CalendarDetail } from './components/Calendar/CalendarDetail'; -import { ChatInterface } from './components/Chat/ChatInterface'; + import { authService } from './services/authService'; /** @@ -111,20 +111,6 @@ function App() { ) } /> - -
- -
- - ) : ( - - ) - } - /> } /> diff --git a/app/src/components/Calendar/CalendarDetail.tsx b/app/src/components/Calendar/CalendarDetail.tsx index 01c2879..41a1639 100644 --- a/app/src/components/Calendar/CalendarDetail.tsx +++ b/app/src/components/Calendar/CalendarDetail.tsx @@ -563,59 +563,58 @@ export function CalendarDetail() { return (
{/* ── Toolbar ── */} -
-
- {/* Back */} - +
+ {/* Back */} + - {/* Calendar dot + name */} -
-
- {calendar.name} -
+ {/* Calendar dot + name */} +
+
+ {calendar.name} +
- {/* Divider */} -
+ {/* Divider — hidden on very small screens */} +
- {/* Today button */} + {/* Today + Nav arrows */} +
+ + +
- {/* Nav arrows */} -
- - -
+ {/* Period label */} +

{headerLabel}

- {/* Period label */} -

{headerLabel}

-
+ {/* Spacer to push view switcher right */} +
{/* View switcher */}
@@ -623,7 +622,7 @@ export function CalendarDetail() { + +
-
-
-

Calendar Assistant

-

- Ask me to help manage your calendar -

+ {/* Conversations list overlay */} + {showConversations && ( +
+
+ )} -
- {isLoadingMessages && ( -
-
-
- )} + {/* Messages area */} +
+ {isLoadingMessages && ( +
+
+
+ )} - {messages.map((message) => ( + {messages.map((message) => ( +
-
{message.content}

+ -

{message.content}

- - {formatTime(message.timestamp)} - -
+ {formatTime(message.timestamp)} +
- ))} +
+ ))} - {isLoading && ( -
-
-
-
-
-
-
+ {isLoading && ( +
+
+
+
+
+
- )} - -
-
- - {pendingActions.length > 0 && ( -
-
- - - - {pendingActions.length} action{pendingActions.length !== 1 ? 's' : ''} awaiting approval -
)} -
-
- setInputValue(e.target.value)} - onKeyPress={handleKeyPress} - placeholder="Type your message..." - disabled={isLoading} - className="flex-1 px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed" - /> - +
+
+ + {pendingActions.length > 0 && ( +
+
+ + + + {pendingActions.length} action{pendingActions.length !== 1 ? 's' : ''} awaiting approval
+ )} + +
+
+ setInputValue(e.target.value)} + onKeyPress={handleKeyPress} + placeholder="Type your message..." + disabled={isLoading} + className="flex-1 px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed" + /> + +
{selectedAction && ( diff --git a/app/src/components/Chat/ConversationSidebar.tsx b/app/src/components/Chat/ConversationSidebar.tsx index 75efa1c..2f5a35d 100644 --- a/app/src/components/Chat/ConversationSidebar.tsx +++ b/app/src/components/Chat/ConversationSidebar.tsx @@ -88,7 +88,7 @@ export function ConversationSidebar({ }; return ( -
+
- ))} + +
@@ -187,9 +170,40 @@ export function Layout({ children }: LayoutProps) {
-
- {children} -
+
+
+
+ {children} +
+
+ + {/* Collapsible chat panel — full-screen overlay on mobile, side panel on md+ */} + {showChat && ( + <> + {/* Backdrop on mobile */} +
setShowChat(false)} + /> +
+
+

Assistant

+ +
+
+ +
+
+ + )} +
); } diff --git a/backend/src/agent/agent.ts b/backend/src/agent/agent.ts index c9c3f94..5dd7b04 100644 --- a/backend/src/agent/agent.ts +++ b/backend/src/agent/agent.ts @@ -21,7 +21,7 @@ You can search for events by keyword using the search_events tool, and check ava When the user asks to view calendars or events, use the appropriate list tools. When the user asks to create, update, or delete events, use the corresponding tools. These mutating operations will require user approval before being executed. -Always confirm what you're about to do before taking action. Be concise and helpful.`; +Always confirm what you're about to do before taking action. Be concise and helpful. All times to be displayed to the user must be in their local time always unless they specify otherwise.`; export async function createCalendarAgent(accessToken: string) { const llm = createLLM();