├── database
├── .gitignore
├── seeders
│ └── DatabaseSeeder.php
├── factories
│ ├── ChatFactory.php
│ ├── MessageFactory.php
│ └── UserFactory.php
└── migrations
│ ├── 2025_05_28_173049_create_chats_table.php
│ ├── 2025_05_28_173221_create_messages_table.php
│ ├── 0001_01_01_000001_create_cache_table.php
│ ├── 0001_01_01_000000_create_users_table.php
│ └── 0001_01_01_000002_create_jobs_table.php
├── bootstrap
├── cache
│ └── .gitignore
├── providers.php
└── app.php
├── storage
├── logs
│ └── .gitignore
├── app
│ ├── private
│ │ └── .gitignore
│ ├── public
│ │ └── .gitignore
│ └── .gitignore
└── framework
│ ├── testing
│ └── .gitignore
│ ├── views
│ └── .gitignore
│ ├── cache
│ ├── data
│ │ └── .gitignore
│ └── .gitignore
│ ├── sessions
│ └── .gitignore
│ └── .gitignore
├── public
├── robots.txt
├── favicon.ico
├── apple-touch-icon.png
├── index.php
├── .htaccess
└── favicon.svg
├── resources
├── js
│ ├── types
│ │ ├── vite-env.d.ts
│ │ ├── global.d.ts
│ │ └── index.d.ts
│ ├── lib
│ │ └── utils.ts
│ ├── hooks
│ │ ├── use-mobile-navigation.ts
│ │ ├── use-initials.tsx
│ │ ├── use-mobile.tsx
│ │ └── use-appearance.tsx
│ ├── components
│ │ ├── ui
│ │ │ ├── skeleton.tsx
│ │ │ ├── icon.tsx
│ │ │ ├── label.tsx
│ │ │ ├── placeholder-pattern.tsx
│ │ │ ├── separator.tsx
│ │ │ ├── collapsible.tsx
│ │ │ ├── input.tsx
│ │ │ ├── checkbox.tsx
│ │ │ ├── avatar.tsx
│ │ │ ├── toggle.tsx
│ │ │ ├── badge.tsx
│ │ │ ├── card.tsx
│ │ │ ├── scroll-area.tsx
│ │ │ ├── alert.tsx
│ │ │ ├── tooltip.tsx
│ │ │ ├── toggle-group.tsx
│ │ │ ├── button.tsx
│ │ │ └── breadcrumb.tsx
│ │ ├── heading-small.tsx
│ │ ├── heading.tsx
│ │ ├── input-error.tsx
│ │ ├── icon.tsx
│ │ ├── app-logo.tsx
│ │ ├── app-shell.tsx
│ │ ├── text-link.tsx
│ │ ├── streaming-indicator.tsx
│ │ ├── app-content.tsx
│ │ ├── app-logo-icon.tsx
│ │ ├── user-info.tsx
│ │ ├── nav-main.tsx
│ │ ├── title-generator.tsx
│ │ ├── sidebar-title-updater.tsx
│ │ ├── chat-title-updater.tsx
│ │ ├── app-sidebar.tsx
│ │ ├── nav-footer.tsx
│ │ ├── breadcrumbs.tsx
│ │ ├── appearance-tabs.tsx
│ │ ├── nav-user.tsx
│ │ ├── user-menu-content.tsx
│ │ ├── app-sidebar-header.tsx
│ │ ├── appearance-dropdown.tsx
│ │ ├── test-event-stream.tsx
│ │ └── conversation.tsx
│ ├── layouts
│ │ ├── auth-layout.tsx
│ │ ├── app
│ │ │ ├── app-header-layout.tsx
│ │ │ └── app-sidebar-layout.tsx
│ │ ├── app-layout.tsx
│ │ ├── auth
│ │ │ ├── auth-card-layout.tsx
│ │ │ ├── auth-simple-layout.tsx
│ │ │ └── auth-split-layout.tsx
│ │ └── settings
│ │ │ └── layout.tsx
│ ├── app.tsx
│ ├── pages
│ │ ├── settings
│ │ │ └── appearance.tsx
│ │ ├── auth
│ │ │ ├── verify-email.tsx
│ │ │ ├── confirm-password.tsx
│ │ │ ├── forgot-password.tsx
│ │ │ └── reset-password.tsx
│ │ └── dashboard.tsx
│ └── ssr.tsx
└── views
│ └── app.blade.php
├── .prettierignore
├── tests
├── Unit
│ ├── ExampleTest.php
│ └── ChatPersistenceTest.php
├── Feature
│ ├── ExampleTest.php
│ ├── DashboardTest.php
│ ├── Auth
│ │ ├── RegistrationTest.php
│ │ ├── PasswordConfirmationTest.php
│ │ ├── AuthenticationTest.php
│ │ ├── EmailVerificationTest.php
│ │ └── PasswordResetTest.php
│ ├── Settings
│ │ ├── PasswordUpdateTest.php
│ │ └── ProfileUpdateTest.php
│ ├── ChatAuthenticationFlowTest.php
│ ├── ChatTest.php
│ ├── SidebarStateTest.php
│ └── ChatFirstMessageTest.php
├── TestCase.php
└── Pest.php
├── app
├── Http
│ ├── Controllers
│ │ ├── Controller.php
│ │ ├── Auth
│ │ │ ├── EmailVerificationNotificationController.php
│ │ │ ├── EmailVerificationPromptController.php
│ │ │ ├── VerifyEmailController.php
│ │ │ ├── PasswordResetLinkController.php
│ │ │ ├── ConfirmablePasswordController.php
│ │ │ ├── AuthenticatedSessionController.php
│ │ │ ├── RegisteredUserController.php
│ │ │ └── NewPasswordController.php
│ │ ├── Api
│ │ │ └── ChatController.php
│ │ └── Settings
│ │ │ ├── PasswordController.php
│ │ │ └── ProfileController.php
│ ├── Middleware
│ │ ├── HandleAppearance.php
│ │ └── HandleInertiaRequests.php
│ └── Requests
│ │ ├── Settings
│ │ └── ProfileUpdateRequest.php
│ │ └── Auth
│ │ └── LoginRequest.php
├── Providers
│ └── AppServiceProvider.php
├── Models
│ ├── Chat.php
│ ├── Message.php
│ └── User.php
└── Policies
│ └── ChatPolicy.php
├── .gitattributes
├── routes
├── console.php
├── web.php
├── chat.php
├── settings.php
└── auth.php
├── .editorconfig
├── .gitignore
├── artisan
├── .prettierrc
├── components.json
├── vite.config.ts
├── .github
└── workflows
│ ├── lint.yml
│ └── tests.yml
├── config
├── services.php
├── inertia.php
├── openai.php
├── filesystems.php
├── cache.php
├── mail.php
└── queue.php
├── phpunit.xml
├── .env.example
├── eslint.config.js
├── package.json
├── composer.json
└── CLAUDE.md
/database/.gitignore:
--------------------------------------------------------------------------------
1 | *.sqlite*
2 |
--------------------------------------------------------------------------------
/bootstrap/cache/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/logs/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Disallow:
3 |
--------------------------------------------------------------------------------
/storage/app/private/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/app/public/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/testing/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/views/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/cache/data/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/sessions/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/cache/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !data/
3 | !.gitignore
4 |
--------------------------------------------------------------------------------
/storage/app/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !private/
3 | !public/
4 | !.gitignore
5 |
--------------------------------------------------------------------------------
/resources/js/types/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
{description}
} 6 |{description}
} 6 |7 | {message} 8 |
9 | ) : null; 10 | } 11 | -------------------------------------------------------------------------------- /resources/js/components/icon.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from '@/lib/utils'; 2 | import { type LucideProps } from 'lucide-react'; 3 | import { type ComponentType } from 'react'; 4 | 5 | interface IconProps extends Omit{description}
27 |25 |28 |“{quote.message}”
26 | 27 |
{description}
39 |Chat ID: {chatId}
71 |useEventStream Message: {message || 'No message yet'}
72 |Manual EventSource Status: {status}
73 |Manual EventSource Message: {manualMessage || 'No message yet'}
74 |Type your message below and hit enter to send.
} 56 | {messages.map((message, index) => { 57 | // Create a unique key that won't conflict between saved and new messages 58 | const key = message.id ? `db-${message.id}` : `local-${index}-${message.content.substring(0, 10)}`; 59 | 60 | return ( 61 |{message.content}
72 |{streamingData}
80 |