fix: login for unauthenticated users would not work

This commit is contained in:
simosmik
2026-02-16 19:12:46 +00:00
parent 151e8ee808
commit 520e3f2280
9 changed files with 34 additions and 32 deletions

View File

@@ -520,13 +520,13 @@ function FileTree({ selectedProject, onFileOpen }) {
{item.name} {item.name}
</span> </span>
</div> </div>
<div className="col-span-2 text-xs text-muted-foreground tabular-nums"> <div className="col-span-2 text-sm text-muted-foreground tabular-nums">
{item.type === 'file' ? formatFileSize(item.size) : ''} {item.type === 'file' ? formatFileSize(item.size) : ''}
</div> </div>
<div className="col-span-3 text-xs text-muted-foreground"> <div className="col-span-3 text-sm text-muted-foreground">
{formatRelativeTime(item.modified)} {formatRelativeTime(item.modified)}
</div> </div>
<div className="col-span-2 text-xs text-muted-foreground font-mono"> <div className="col-span-2 text-sm text-muted-foreground font-mono">
{item.permissionsRwx || ''} {item.permissionsRwx || ''}
</div> </div>
</div> </div>
@@ -573,7 +573,7 @@ function FileTree({ selectedProject, onFileOpen }) {
{item.name} {item.name}
</span> </span>
</div> </div>
<div className="flex items-center gap-3 text-xs text-muted-foreground flex-shrink-0 ml-2"> <div className="flex items-center gap-3 text-sm text-muted-foreground flex-shrink-0 ml-2">
{item.type === 'file' && ( {item.type === 'file' && (
<> <>
<span className="tabular-nums">{formatFileSize(item.size)}</span> <span className="tabular-nums">{formatFileSize(item.size)}</span>
@@ -615,7 +615,7 @@ function FileTree({ selectedProject, onFileOpen }) {
{/* Header */} {/* Header */}
<div className="px-3 pt-3 pb-2 border-b border-border space-y-2"> <div className="px-3 pt-3 pb-2 border-b border-border space-y-2">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<h3 className="text-xs font-semibold uppercase tracking-wider text-muted-foreground"> <h3 className="text-sm font-medium text-foreground">
{t('fileTree.files')} {t('fileTree.files')}
</h3> </h3>
<div className="flex gap-0.5"> <div className="flex gap-0.5">
@@ -657,7 +657,7 @@ function FileTree({ selectedProject, onFileOpen }) {
placeholder={t('fileTree.searchPlaceholder')} placeholder={t('fileTree.searchPlaceholder')}
value={searchQuery} value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)} onChange={(e) => setSearchQuery(e.target.value)}
className="pl-7 pr-7 h-7 text-xs" className="pl-8 pr-8 h-8 text-sm"
/> />
{searchQuery && ( {searchQuery && (
<Button <Button

View File

@@ -656,11 +656,11 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
<p className="text-sm font-medium text-foreground truncate"> <p className="text-sm font-medium text-foreground truncate">
{commit.message} {commit.message}
</p> </p>
<p className="text-xs text-muted-foreground mt-1"> <p className="text-sm text-muted-foreground mt-1">
{commit.author} {commit.date} {commit.author} {commit.date}
</p> </p>
</div> </div>
<span className="text-xs font-mono text-muted-foreground/60 flex-shrink-0"> <span className="text-sm font-mono text-muted-foreground/60 flex-shrink-0">
{commit.hash.substring(0, 7)} {commit.hash.substring(0, 7)}
</span> </span>
</div> </div>
@@ -669,7 +669,7 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
{isExpanded && diff && ( {isExpanded && diff && (
<div className="bg-muted/50"> <div className="bg-muted/50">
<div className="max-h-96 overflow-y-auto p-2"> <div className="max-h-96 overflow-y-auto p-2">
<div className="text-xs font-mono text-muted-foreground mb-2"> <div className="text-sm font-mono text-muted-foreground mb-2">
{commit.stats} {commit.stats}
</div> </div>
<DiffViewer diff={diff} fileName="commit" isMobile={isMobile} wrapText={wrapText} /> <DiffViewer diff={diff} fileName="commit" isMobile={isMobile} wrapText={wrapText} />
@@ -792,7 +792,7 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
e.stopPropagation(); e.stopPropagation();
setWrapText(!wrapText); setWrapText(!wrapText);
}} }}
className="text-xs text-muted-foreground hover:text-foreground transition-colors" className="text-sm text-muted-foreground hover:text-foreground transition-colors"
title={wrapText ? "Switch to horizontal scroll" : "Switch to text wrap"} title={wrapText ? "Switch to horizontal scroll" : "Switch to text wrap"}
> >
{wrapText ? '↔️ Scroll' : '↩️ Wrap'} {wrapText ? '↔️ Scroll' : '↩️ Wrap'}
@@ -898,7 +898,7 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
message: `Publish branch "${currentBranch}" to ${remoteStatus.remoteName}?` message: `Publish branch "${currentBranch}" to ${remoteStatus.remoteName}?`
})} })}
disabled={isPublishing} disabled={isPublishing}
className="px-2.5 py-1 text-xs bg-purple-600 text-white rounded-lg hover:bg-purple-700 disabled:opacity-50 flex items-center gap-1 transition-colors" className="px-2.5 py-1 text-sm bg-purple-600 text-white rounded-lg hover:bg-purple-700 disabled:opacity-50 flex items-center gap-1 transition-colors"
title={`Publish branch "${currentBranch}" to ${remoteStatus.remoteName}`} title={`Publish branch "${currentBranch}" to ${remoteStatus.remoteName}`}
> >
<Upload className={`w-3 h-3 ${isPublishing ? 'animate-pulse' : ''}`} /> <Upload className={`w-3 h-3 ${isPublishing ? 'animate-pulse' : ''}`} />
@@ -917,7 +917,7 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
message: `Pull ${remoteStatus.behind} commit${remoteStatus.behind !== 1 ? 's' : ''} from ${remoteStatus.remoteName}?` message: `Pull ${remoteStatus.behind} commit${remoteStatus.behind !== 1 ? 's' : ''} from ${remoteStatus.remoteName}?`
})} })}
disabled={isPulling} disabled={isPulling}
className="px-2.5 py-1 text-xs bg-green-600 text-white rounded-lg hover:bg-green-700 disabled:opacity-50 flex items-center gap-1 transition-colors" className="px-2.5 py-1 text-sm bg-green-600 text-white rounded-lg hover:bg-green-700 disabled:opacity-50 flex items-center gap-1 transition-colors"
title={`Pull ${remoteStatus.behind} commit${remoteStatus.behind !== 1 ? 's' : ''} from ${remoteStatus.remoteName}`} title={`Pull ${remoteStatus.behind} commit${remoteStatus.behind !== 1 ? 's' : ''} from ${remoteStatus.remoteName}`}
> >
<Download className={`w-3 h-3 ${isPulling ? 'animate-pulse' : ''}`} /> <Download className={`w-3 h-3 ${isPulling ? 'animate-pulse' : ''}`} />
@@ -933,7 +933,7 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
message: `Push ${remoteStatus.ahead} commit${remoteStatus.ahead !== 1 ? 's' : ''} to ${remoteStatus.remoteName}?` message: `Push ${remoteStatus.ahead} commit${remoteStatus.ahead !== 1 ? 's' : ''} to ${remoteStatus.remoteName}?`
})} })}
disabled={isPushing} disabled={isPushing}
className="px-2.5 py-1 text-xs bg-orange-600 text-white rounded-lg hover:bg-orange-700 disabled:opacity-50 flex items-center gap-1 transition-colors" className="px-2.5 py-1 text-sm bg-orange-600 text-white rounded-lg hover:bg-orange-700 disabled:opacity-50 flex items-center gap-1 transition-colors"
title={`Push ${remoteStatus.ahead} commit${remoteStatus.ahead !== 1 ? 's' : ''} to ${remoteStatus.remoteName}`} title={`Push ${remoteStatus.ahead} commit${remoteStatus.ahead !== 1 ? 's' : ''} to ${remoteStatus.remoteName}`}
> >
<Upload className={`w-3 h-3 ${isPushing ? 'animate-pulse' : ''}`} /> <Upload className={`w-3 h-3 ${isPushing ? 'animate-pulse' : ''}`} />
@@ -946,7 +946,7 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
<button <button
onClick={handleFetch} onClick={handleFetch}
disabled={isFetching} disabled={isFetching}
className="px-2.5 py-1 text-xs bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 disabled:opacity-50 flex items-center gap-1 transition-colors" className="px-2.5 py-1 text-sm bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 disabled:opacity-50 flex items-center gap-1 transition-colors"
title={`Fetch from ${remoteStatus.remoteName}`} title={`Fetch from ${remoteStatus.remoteName}`}
> >
<RefreshCw className={`w-3 h-3 ${isFetching ? 'animate-spin' : ''}`} /> <RefreshCw className={`w-3 h-3 ${isFetching ? 'animate-spin' : ''}`} />
@@ -1098,7 +1098,7 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
</div> </div>
</div> </div>
<div className="flex items-center justify-between mt-2"> <div className="flex items-center justify-between mt-2">
<span className="text-xs text-muted-foreground"> <span className="text-sm text-muted-foreground">
{selectedFiles.size} file{selectedFiles.size !== 1 ? 's' : ''} selected {selectedFiles.size} file{selectedFiles.size !== 1 ? 's' : ''} selected
</span> </span>
<button <button
@@ -1127,7 +1127,7 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
? 'max-h-16 opacity-100 translate-y-0' ? 'max-h-16 opacity-100 translate-y-0'
: 'max-h-0 opacity-0 -translate-y-2 overflow-hidden' : 'max-h-0 opacity-0 -translate-y-2 overflow-hidden'
}`}> }`}>
<span className="text-xs text-muted-foreground"> <span className="text-sm text-muted-foreground">
{selectedFiles.size} of {(gitStatus?.modified?.length || 0) + (gitStatus?.added?.length || 0) + (gitStatus?.deleted?.length || 0) + (gitStatus?.untracked?.length || 0)} {isMobile ? '' : 'files'} selected {selectedFiles.size} of {(gitStatus?.modified?.length || 0) + (gitStatus?.added?.length || 0) + (gitStatus?.deleted?.length || 0) + (gitStatus?.untracked?.length || 0)} {isMobile ? '' : 'files'} selected
</span> </span>
<div className={`flex ${isMobile ? 'gap-1' : 'gap-2'}`}> <div className={`flex ${isMobile ? 'gap-1' : 'gap-2'}`}>
@@ -1141,14 +1141,14 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
]); ]);
setSelectedFiles(allFiles); setSelectedFiles(allFiles);
}} }}
className="text-xs text-primary hover:text-primary/80 transition-colors" className="text-sm text-primary hover:text-primary/80 transition-colors"
> >
{isMobile ? 'All' : 'Select All'} {isMobile ? 'All' : 'Select All'}
</button> </button>
<span className="text-border">|</span> <span className="text-border">|</span>
<button <button
onClick={() => setSelectedFiles(new Set())} onClick={() => setSelectedFiles(new Set())}
className="text-xs text-primary hover:text-primary/80 transition-colors" className="text-sm text-primary hover:text-primary/80 transition-colors"
> >
{isMobile ? 'None' : 'Deselect All'} {isMobile ? 'None' : 'Deselect All'}
</button> </button>
@@ -1161,7 +1161,7 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
<div className="border-b border-border/60"> <div className="border-b border-border/60">
<button <button
onClick={() => setShowLegend(!showLegend)} onClick={() => setShowLegend(!showLegend)}
className="w-full px-4 py-2 bg-muted/30 hover:bg-muted/50 text-xs text-muted-foreground flex items-center justify-center gap-1 transition-colors" className="w-full px-4 py-2 bg-muted/30 hover:bg-muted/50 text-sm text-muted-foreground flex items-center justify-center gap-1 transition-colors"
> >
<Info className="w-3 h-3" /> <Info className="w-3 h-3" />
<span>File Status Guide</span> <span>File Status Guide</span>
@@ -1169,7 +1169,7 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
</button> </button>
{showLegend && ( {showLegend && (
<div className="px-4 py-3 bg-muted/30 text-xs"> <div className="px-4 py-3 bg-muted/30 text-sm">
<div className={`${isMobile ? 'grid grid-cols-2 gap-3 justify-items-center' : 'flex justify-center gap-6'}`}> <div className={`${isMobile ? 'grid grid-cols-2 gap-3 justify-items-center' : 'flex justify-center gap-6'}`}>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<span className="inline-flex items-center justify-center w-5 h-5 bg-yellow-100 text-yellow-700 dark:bg-yellow-900/40 dark:text-yellow-300 rounded border border-yellow-200 dark:border-yellow-800/50 font-bold text-[10px]"> <span className="inline-flex items-center justify-center w-5 h-5 bg-yellow-100 text-yellow-700 dark:bg-yellow-900/40 dark:text-yellow-300 rounded border border-yellow-200 dark:border-yellow-800/50 font-bold text-[10px]">
@@ -1298,7 +1298,7 @@ function GitPanel({ selectedProject, isMobile, onFileOpen }) {
autoFocus autoFocus
/> />
</div> </div>
<div className="text-xs text-muted-foreground mb-4"> <div className="text-sm text-muted-foreground mb-4">
This will create a new branch from the current branch ({currentBranch}) This will create a new branch from the current branch ({currentBranch})
</div> </div>
<div className="flex justify-end space-x-3"> <div className="flex justify-end space-x-3">

View File

@@ -21,7 +21,8 @@ function LoginModal({
project, project,
onComplete, onComplete,
customCommand, customCommand,
isAuthenticated = false isAuthenticated = false,
isOnboarding = false
}) { }) {
if (!isOpen) return null; if (!isOpen) return null;
@@ -30,13 +31,13 @@ function LoginModal({
switch (provider) { switch (provider) {
case 'claude': case 'claude':
return isAuthenticated ? 'claude setup-token --dangerously-skip-permissions' : 'claude /exit --dangerously-skip-permissions'; return isAuthenticated ? 'claude setup-token --dangerously-skip-permissions' : isOnboarding ? 'claude /exit --dangerously-skip-permissions' : 'claude /login --dangerously-skip-permissions';
case 'cursor': case 'cursor':
return 'cursor-agent login'; return 'cursor-agent login';
case 'codex': case 'codex':
return IS_PLATFORM ? 'codex login --device-auth' : 'codex login'; return IS_PLATFORM ? 'codex login --device-auth' : 'codex login';
default: default:
return isAuthenticated ? 'claude setup-token --dangerously-skip-permissions' : 'claude /exit --dangerously-skip-permissions'; return isAuthenticated ? 'claude setup-token --dangerously-skip-permissions' : isOnboarding ? 'claude /exit --dangerously-skip-permissions' : 'claude /login --dangerously-skip-permissions';
} }
}; };

View File

@@ -577,6 +577,7 @@ const Onboarding = ({ onComplete }) => {
provider={activeLoginProvider} provider={activeLoginProvider}
project={selectedProject} project={selectedProject}
onComplete={handleLoginComplete} onComplete={handleLoginComplete}
isOnboarding={true}
/> />
)} )}
</> </>

View File

@@ -42,7 +42,7 @@ export default function ChatInputControls({
<button <button
type="button" type="button"
onClick={onModeSwitch} onClick={onModeSwitch}
className={`px-2.5 py-1 sm:px-3 sm:py-1.5 rounded-lg text-xs sm:text-sm font-medium border transition-all duration-200 ${ className={`px-2.5 py-1 sm:px-3 sm:py-1.5 rounded-lg text-sm font-medium border transition-all duration-200 ${
permissionMode === 'default' permissionMode === 'default'
? 'bg-muted/50 text-muted-foreground border-border/60 hover:bg-muted' ? 'bg-muted/50 text-muted-foreground border-border/60 hover:bg-muted'
: permissionMode === 'acceptEdits' : permissionMode === 'acceptEdits'

View File

@@ -162,13 +162,13 @@ export default function ProviderSelectionEmptyState({
{/* Model picker — appears after provider is chosen */} {/* Model picker — appears after provider is chosen */}
<div className={`transition-all duration-200 ${provider ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-1 pointer-events-none'}`}> <div className={`transition-all duration-200 ${provider ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-1 pointer-events-none'}`}>
<div className="flex items-center justify-center gap-2 mb-5"> <div className="flex items-center justify-center gap-2 mb-5">
<span className="text-xs text-muted-foreground">{t('providerSelection.selectModel')}</span> <span className="text-sm text-muted-foreground">{t('providerSelection.selectModel')}</span>
<div className="relative"> <div className="relative">
<select <select
value={currentModel} value={currentModel}
onChange={(e) => handleModelChange(e.target.value)} onChange={(e) => handleModelChange(e.target.value)}
tabIndex={-1} tabIndex={-1}
className="appearance-none pl-3 pr-7 py-1.5 text-xs font-medium bg-muted/50 border border-border/60 rounded-lg text-foreground cursor-pointer hover:bg-muted transition-colors focus:outline-none focus:ring-2 focus:ring-primary/20" className="appearance-none pl-3 pr-7 py-1.5 text-sm font-medium bg-muted/50 border border-border/60 rounded-lg text-foreground cursor-pointer hover:bg-muted transition-colors focus:outline-none focus:ring-2 focus:ring-primary/20"
> >
{modelConfig.OPTIONS.map(({ value, label }: { value: string; label: string }) => ( {modelConfig.OPTIONS.map(({ value, label }: { value: string; label: string }) => (
<option key={value} value={value}>{label}</option> <option key={value} value={value}>{label}</option>
@@ -178,7 +178,7 @@ export default function ProviderSelectionEmptyState({
</div> </div>
</div> </div>
<p className="text-center text-xs text-muted-foreground/70"> <p className="text-center text-sm text-muted-foreground/70">
{provider === 'claude' {provider === 'claude'
? t('providerSelection.readyPrompt.claude', { model: claudeModel }) ? t('providerSelection.readyPrompt.claude', { model: claudeModel })
: provider === 'cursor' : provider === 'cursor'

View File

@@ -48,7 +48,7 @@ export default function MainContentTabSwitcher({
<Tooltip key={tab.id} content={t(tab.labelKey)} position="bottom"> <Tooltip key={tab.id} content={t(tab.labelKey)} position="bottom">
<button <button
onClick={() => setActiveTab(tab.id)} onClick={() => setActiveTab(tab.id)}
className={`relative flex items-center gap-1.5 px-2.5 py-[5px] text-xs font-medium rounded-md transition-all duration-150 ${ className={`relative flex items-center gap-1.5 px-2.5 py-[5px] text-sm font-medium rounded-md transition-all duration-150 ${
isActive isActive
? 'bg-background text-foreground shadow-sm' ? 'bg-background text-foreground shadow-sm'
: 'text-muted-foreground hover:text-foreground' : 'text-muted-foreground hover:text-foreground'

View File

@@ -36,7 +36,7 @@ export default function SidebarFooter({
<span className="absolute -top-0.5 -right-0.5 w-1.5 h-1.5 bg-blue-500 rounded-full animate-pulse" /> <span className="absolute -top-0.5 -right-0.5 w-1.5 h-1.5 bg-blue-500 rounded-full animate-pulse" />
</div> </div>
<div className="min-w-0 flex-1"> <div className="min-w-0 flex-1">
<span className="text-xs font-medium text-blue-600 dark:text-blue-300 truncate block"> <span className="text-sm font-medium text-blue-600 dark:text-blue-300 truncate block">
{releaseInfo?.title || `v${latestVersion}`} {releaseInfo?.title || `v${latestVersion}`}
</span> </span>
<span className="text-[10px] text-blue-500/70 dark:text-blue-400/60"> <span className="text-[10px] text-blue-500/70 dark:text-blue-400/60">
@@ -79,7 +79,7 @@ export default function SidebarFooter({
onClick={onShowSettings} onClick={onShowSettings}
> >
<Settings className="w-3.5 h-3.5" /> <Settings className="w-3.5 h-3.5" />
<span className="text-xs">{t('actions.settings')}</span> <span className="text-sm">{t('actions.settings')}</span>
</button> </button>
</div> </div>

View File

@@ -109,7 +109,7 @@ export default function SidebarHeader({
placeholder={t('projects.searchPlaceholder')} placeholder={t('projects.searchPlaceholder')}
value={searchFilter} value={searchFilter}
onChange={(event) => onSearchFilterChange(event.target.value)} onChange={(event) => onSearchFilterChange(event.target.value)}
className="nav-search-input pl-9 pr-8 h-9 text-xs rounded-xl border-0 placeholder:text-muted-foreground/40 focus-visible:ring-0 focus-visible:ring-offset-0 transition-all duration-200" className="nav-search-input pl-9 pr-8 h-9 text-sm rounded-xl border-0 placeholder:text-muted-foreground/40 focus-visible:ring-0 focus-visible:ring-offset-0 transition-all duration-200"
/> />
{searchFilter && ( {searchFilter && (
<button <button