viba-cli 0.30.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +2 -2
  3. package/.next/fallback-build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +2 -2
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +49 -11
  14. package/.next/server/app/_not-found.rsc +69 -13
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +69 -13
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +57 -4
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/credentials/page/server-reference-manifest.json +7 -7
  22. package/.next/server/app/credentials/page.js.nft.json +1 -1
  23. package/.next/server/app/credentials/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/credentials.html +49 -11
  25. package/.next/server/app/credentials.rsc +73 -17
  26. package/.next/server/app/credentials.segments/_full.segment.rsc +73 -17
  27. package/.next/server/app/credentials.segments/_head.segment.rsc +1 -1
  28. package/.next/server/app/credentials.segments/_index.segment.rsc +57 -4
  29. package/.next/server/app/credentials.segments/_tree.segment.rsc +2 -2
  30. package/.next/server/app/credentials.segments/credentials/__PAGE__.segment.rsc +2 -2
  31. package/.next/server/app/credentials.segments/credentials.segment.rsc +1 -1
  32. package/.next/server/app/index.html +49 -11
  33. package/.next/server/app/index.rsc +72 -17
  34. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  35. package/.next/server/app/index.segments/_full.segment.rsc +72 -17
  36. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  37. package/.next/server/app/index.segments/_index.segment.rsc +57 -4
  38. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  39. package/.next/server/app/new/page/server-reference-manifest.json +54 -54
  40. package/.next/server/app/new/page.js.nft.json +1 -1
  41. package/.next/server/app/new/page_client-reference-manifest.js +1 -1
  42. package/.next/server/app/page/server-reference-manifest.json +54 -54
  43. package/.next/server/app/page.js.nft.json +1 -1
  44. package/.next/server/app/page_client-reference-manifest.js +1 -1
  45. package/.next/server/app/session/[sessionId]/page/server-reference-manifest.json +19 -19
  46. package/.next/server/app/session/[sessionId]/page.js.nft.json +1 -1
  47. package/.next/server/app/session/[sessionId]/page_client-reference-manifest.js +1 -1
  48. package/.next/server/chunks/[root-of-the-server]__d29cc8f7._.js +1 -1
  49. package/.next/server/chunks/ssr/[root-of-the-server]__0522f852._.js +1 -1
  50. package/.next/server/chunks/ssr/[root-of-the-server]__11fa4345._.js +47 -9
  51. package/.next/server/chunks/ssr/[root-of-the-server]__11fa4345._.js.map +1 -1
  52. package/.next/server/chunks/ssr/[root-of-the-server]__352d2b3c._.js +1 -1
  53. package/.next/server/chunks/ssr/[root-of-the-server]__352d2b3c._.js.map +1 -1
  54. package/.next/server/chunks/ssr/[root-of-the-server]__4c388861._.js +1 -1
  55. package/.next/server/chunks/ssr/[root-of-the-server]__4c388861._.js.map +1 -1
  56. package/.next/server/chunks/ssr/[root-of-the-server]__59834c63._.js +1 -1
  57. package/.next/server/chunks/ssr/[root-of-the-server]__59834c63._.js.map +1 -1
  58. package/.next/server/chunks/ssr/{[root-of-the-server]__89c50fcd._.js → [root-of-the-server]__6b1fc6a0._.js} +2 -2
  59. package/.next/server/chunks/ssr/[root-of-the-server]__6b1fc6a0._.js.map +1 -0
  60. package/.next/server/chunks/ssr/[root-of-the-server]__9201693f._.js +1 -1
  61. package/.next/server/chunks/ssr/[root-of-the-server]__9201693f._.js.map +1 -1
  62. package/.next/server/chunks/ssr/[root-of-the-server]__98a2dac6._.js +3 -0
  63. package/.next/server/chunks/ssr/[root-of-the-server]__98a2dac6._.js.map +1 -0
  64. package/.next/server/chunks/ssr/[root-of-the-server]__b0f6a116._.js +3 -0
  65. package/.next/server/chunks/ssr/[root-of-the-server]__b0f6a116._.js.map +1 -0
  66. package/.next/server/chunks/ssr/[root-of-the-server]__c790b631._.js +1 -1
  67. package/.next/server/chunks/ssr/[root-of-the-server]__c790b631._.js.map +1 -1
  68. package/.next/server/chunks/ssr/[root-of-the-server]__d5eaad6d._.js +1 -1
  69. package/.next/server/chunks/ssr/[root-of-the-server]__d5eaad6d._.js.map +1 -1
  70. package/.next/server/chunks/ssr/[root-of-the-server]__f56dd853._.js +3 -0
  71. package/.next/server/chunks/ssr/[root-of-the-server]__f56dd853._.js.map +1 -0
  72. package/.next/server/chunks/ssr/_16578c70._.js +3 -0
  73. package/.next/server/chunks/ssr/_16578c70._.js.map +1 -0
  74. package/.next/server/chunks/ssr/_80c85b8d._.js +3 -0
  75. package/.next/server/chunks/ssr/_80c85b8d._.js.map +1 -0
  76. package/.next/server/chunks/ssr/{node_modules_9819fed1._.js → node_modules_04e0be7d._.js} +2 -2
  77. package/.next/server/chunks/ssr/node_modules_04e0be7d._.js.map +1 -0
  78. package/.next/server/chunks/ssr/{node_modules_1924b56e._.js → node_modules_358ee037._.js} +2 -2
  79. package/.next/server/chunks/ssr/node_modules_358ee037._.js.map +1 -0
  80. package/.next/server/chunks/ssr/{node_modules_4ebcf1df._.js → node_modules_5999d873._.js} +2 -2
  81. package/.next/server/chunks/ssr/node_modules_5999d873._.js.map +1 -0
  82. package/.next/server/chunks/ssr/{node_modules_a6b22d4e._.js → node_modules_a8dcdfed._.js} +2 -2
  83. package/.next/server/chunks/ssr/node_modules_a8dcdfed._.js.map +1 -0
  84. package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js +1 -1
  85. package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js.map +1 -1
  86. package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js +1 -1
  87. package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js.map +1 -1
  88. package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js +3 -3
  89. package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js.map +1 -1
  90. package/.next/server/pages/404.html +49 -11
  91. package/.next/server/pages/500.html +2 -2
  92. package/.next/server/server-reference-manifest.js +1 -1
  93. package/.next/server/server-reference-manifest.json +101 -109
  94. package/.next/static/chunks/2ad7789dfee5726a.js +3 -0
  95. package/.next/static/chunks/2f7d04a733150228.js +3 -0
  96. package/.next/static/chunks/3bbe09af024f798b.js +3 -0
  97. package/.next/static/chunks/549fc0c87fa93adc.js +1 -0
  98. package/.next/static/chunks/6f2a92feb133f8ae.js +3 -0
  99. package/.next/static/chunks/9093805c6f933105.js +9 -0
  100. package/.next/static/chunks/b35879178d2ce3ea.css +1 -0
  101. package/package.json +1 -1
  102. package/.next/server/chunks/ssr/[root-of-the-server]__1df320f5._.js +0 -3
  103. package/.next/server/chunks/ssr/[root-of-the-server]__1df320f5._.js.map +0 -1
  104. package/.next/server/chunks/ssr/[root-of-the-server]__205f8dfa._.js +0 -3
  105. package/.next/server/chunks/ssr/[root-of-the-server]__205f8dfa._.js.map +0 -1
  106. package/.next/server/chunks/ssr/[root-of-the-server]__5b24035a._.js +0 -3
  107. package/.next/server/chunks/ssr/[root-of-the-server]__5b24035a._.js.map +0 -1
  108. package/.next/server/chunks/ssr/[root-of-the-server]__89c50fcd._.js.map +0 -1
  109. package/.next/server/chunks/ssr/node_modules_1924b56e._.js.map +0 -1
  110. package/.next/server/chunks/ssr/node_modules_4ebcf1df._.js.map +0 -1
  111. package/.next/server/chunks/ssr/node_modules_9819fed1._.js.map +0 -1
  112. package/.next/server/chunks/ssr/node_modules_a6b22d4e._.js.map +0 -1
  113. package/.next/static/chunks/4afbd10632bd9ae7.js +0 -3
  114. package/.next/static/chunks/a9c5b63f0e7da9b5.js +0 -1
  115. package/.next/static/chunks/b13357ed59140e66.js +0 -3
  116. package/.next/static/chunks/bb05c05a9e6f8abd.js +0 -3
  117. package/.next/static/chunks/bda88a62a1f3e507.js +0 -9
  118. package/.next/static/chunks/e1ec81eb91426c5a.js +0 -3
  119. package/.next/static/chunks/f50ca0ff2368d540.css +0 -1
  120. /package/.next/static/{yN2biI7fFBwe3y0qoq-hE → 3UU5w0dp_7z6yCNYh6_8C}/_buildManifest.js +0 -0
  121. /package/.next/static/{yN2biI7fFBwe3y0qoq-hE → 3UU5w0dp_7z6yCNYh6_8C}/_clientMiddlewareManifest.json +0 -0
  122. /package/.next/static/{yN2biI7fFBwe3y0qoq-hE → 3UU5w0dp_7z6yCNYh6_8C}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/actions/data%3A8b4e55%20%3Ctext/javascript%3E","../../../../src/components/GitRepoSelector.tsx","../../../../src/app/actions/data%3Ab27e1c%20%3Ctext/javascript%3E","../../../../src/components/FileBrowser.tsx","../../../../src/app/actions/data%3A1c0b5f%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ae5d677%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A63e2f2%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A8b95fd%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A4e250c%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A99509d%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aae49a4%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Af74f92%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A8149a1%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ae7e801%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A4fd538%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A6302c1%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A588986%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aceecd2%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Acbf54f%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ac93a2f%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aaea83a%20%3Ctext/javascript%3E","../../../../src/lib/repo-card-gradient.ts","../../../../node_modules/lucide-react/src/icons/check.ts","../../../../node_modules/lucide-react/src/icons/sun.ts","../../../../node_modules/lucide-react/src/icons/search.ts","../../../../node_modules/lucide-react/src/icons/cloud-download.ts","../../../../node_modules/lucide-react/src/icons/monitor.ts","../../../../node_modules/lucide-react/src/icons/bot.ts","../../../../node_modules/lucide-react/src/icons/folder-git-2.ts","../../../../node_modules/lucide-react/src/icons/moon.ts","../../../../node_modules/lucide-react/src/icons/settings.ts","../../../../node_modules/lucide-react/src/icons/folder-cog.ts"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"40abf274d8e74ae382c216e3b805611783fd2a5392\":\"installAgentCli\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_8=/*#__PURE__*/createServerReference(\"40abf274d8e74ae382c216e3b805611783fd2a5392\",callServer,void 0,findSourceMapURL,\"installAgentCli\");export{$$RSC_SERVER_ACTION_8 as installAgentCli};","'use client';\n\nimport React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { FolderGit2, Plus, X, ChevronRight, ChevronDown, FolderCog, Bot, Trash2, KeyRound, Settings, ExternalLink, CloudDownload, Search, Monitor, Sun, Moon } from 'lucide-react';\nimport FileBrowser from './FileBrowser';\nimport {\n checkIsGitRepo,\n getBranches,\n checkoutBranch,\n GitBranch,\n startTtydProcess,\n getStartupScript,\n getDefaultDevServerScript,\n listRepoFiles,\n saveAttachments,\n checkAgentCliInstalled,\n installAgentCli,\n SupportedAgentCli,\n} from '@/app/actions/git';\nimport { cloneRemoteRepository, resolveRepositoryByName } from '@/app/actions/repository';\nimport { copySessionAttachments, createSession, deleteSession, getSessionPrefillContext, listSessions, saveSessionLaunchContext, SessionMetadata } from '@/app/actions/session';\nimport { getConfig, updateConfig, updateRepoSettings, Config } from '@/app/actions/config';\nimport { listAgentApiCredentials, listCredentials } from '@/app/actions/credentials';\nimport type { Credential } from '@/lib/credentials';\nimport { useRouter } from 'next/navigation';\nimport { getBaseName } from '@/lib/path';\nimport { getStableRepoCardGradient } from '@/lib/repo-card-gradient';\nimport { notifySessionsUpdated, SESSIONS_UPDATED_EVENT, SESSIONS_UPDATED_STORAGE_KEY } from '@/lib/session-updates';\nimport Image from 'next/image';\nimport { useDialogKeyboardShortcuts } from '@/hooks/useDialogKeyboardShortcuts';\n\ntype SessionMode = 'fast' | 'plan';\ntype RepoCredentialSelection = 'auto' | string;\ntype ThemeMode = 'auto' | 'light' | 'dark';\nconst DEFAULT_REPO_STARTUP_COMMAND = 'npm install';\nconst DEFAULT_REPO_DEV_SERVER_COMMAND = 'npm run dev';\nconst THEME_MODE_STORAGE_KEY = 'viba:theme-mode';\nconst THEME_MODE_SEQUENCE: ThemeMode[] = ['auto', 'light', 'dark'];\n\nfunction getCredentialOptionLabel(credential: Credential): string {\n if (credential.type === 'github') {\n return `GitHub - ${credential.username}`;\n }\n\n let host = credential.serverUrl;\n try {\n host = new URL(credential.serverUrl).host;\n } catch {\n // Keep raw server URL if parsing fails.\n }\n\n return `GitLab - ${credential.username} @ ${host}`;\n}\n\nconst SESSION_MODE_STORAGE_KEY = 'viba:new-session-mode';\nconst SESSION_TITLE_MAX_LENGTH = 120;\nconst AGENT_LOGIN_COMMANDS: Record<SupportedAgentCli, string> = {\n codex: 'codex',\n};\nconst AGENT_CLI_LABELS: Record<SupportedAgentCli, string> = {\n codex: 'Codex CLI',\n};\n\ntype TerminalWindow = Window & {\n term?: {\n paste: (text: string) => void;\n };\n};\n\ntype GitRepoSelectorProps = {\n mode?: 'home' | 'new';\n repoPath?: string | null;\n fromRepoName?: string | null;\n prefillFromSession?: string | null;\n};\n\nfunction deriveSessionTitleFromTaskDescription(taskDescription: string): string | undefined {\n const firstNonEmptyLine = taskDescription\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => line.length > 0);\n\n if (!firstNonEmptyLine) return undefined;\n return firstNonEmptyLine.slice(0, SESSION_TITLE_MAX_LENGTH);\n}\n\nexport default function GitRepoSelector({\n mode = 'home',\n repoPath = null,\n fromRepoName = null,\n prefillFromSession = null,\n}: GitRepoSelectorProps) {\n const [isBrowsing, setIsBrowsing] = useState(false);\n const [isSelectingRoot, setIsSelectingRoot] = useState(false);\n const [isRepoSettingsDialogOpen, setIsRepoSettingsDialogOpen] = useState(false);\n const [isCloneRemoteDialogOpen, setIsCloneRemoteDialogOpen] = useState(false);\n const [remoteRepoUrl, setRemoteRepoUrl] = useState('');\n const [cloneCredentialSelection, setCloneCredentialSelection] = useState<RepoCredentialSelection>('auto');\n const [cloneRemoteError, setCloneRemoteError] = useState<string | null>(null);\n const [isCloningRemote, setIsCloningRemote] = useState(false);\n const [isLoadingCloneCredentialOptions, setIsLoadingCloneCredentialOptions] = useState(false);\n const [themeMode, setThemeMode] = useState<ThemeMode>('auto');\n const [isDarkThemeActive, setIsDarkThemeActive] = useState(false);\n\n const [config, setConfig] = useState<Config | null>(null);\n\n const [selectedRepo, setSelectedRepo] = useState<string | null>(null);\n const [repoForSettings, setRepoForSettings] = useState<string | null>(null);\n const [repoCredentialSelection, setRepoCredentialSelection] = useState<RepoCredentialSelection>('auto');\n const [repoStartupCommand, setRepoStartupCommand] = useState<string>(DEFAULT_REPO_STARTUP_COMMAND);\n const [repoDevServerCommand, setRepoDevServerCommand] = useState<string>(DEFAULT_REPO_DEV_SERVER_COMMAND);\n const [credentialOptions, setCredentialOptions] = useState<Credential[]>([]);\n\n const router = useRouter();\n\n const [branches, setBranches] = useState<GitBranch[]>([]);\n const [currentBranchName, setCurrentBranchName] = useState<string>('');\n const [existingSessions, setExistingSessions] = useState<SessionMetadata[]>([]);\n const [allSessions, setAllSessions] = useState<SessionMetadata[]>([]);\n\n const [startupScript, setStartupScript] = useState<string>('');\n const [devServerScript, setDevServerScript] = useState<string>('');\n const [showSessionAdvanced, setShowSessionAdvanced] = useState(false);\n const [initialMessage, setInitialMessage] = useState<string>('');\n const [sessionMode, setSessionMode] = useState<SessionMode>('fast');\n const [attachments, setAttachments] = useState<File[]>([]);\n const [prefilledAttachmentNames, setPrefilledAttachmentNames] = useState<string[]>([]);\n const [prefillSourceSessionName, setPrefillSourceSessionName] = useState<string | null>(null);\n const [hasAppliedPrefill, setHasAppliedPrefill] = useState(false);\n\n const [loading, setLoading] = useState(false);\n const [deletingSessionName, setDeletingSessionName] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [isResolvingRepoFromName, setIsResolvingRepoFromName] = useState(false);\n const [isLoaded, setIsLoaded] = useState(false);\n const [isInstallingAgentCli, setIsInstallingAgentCli] = useState(false);\n const [installingAgentCli, setInstallingAgentCli] = useState<SupportedAgentCli | null>(null);\n const [isLoginModalOpen, setIsLoginModalOpen] = useState(false);\n const [loginAgentCli, setLoginAgentCli] = useState<SupportedAgentCli | null>(null);\n const [loginCommand, setLoginCommand] = useState('');\n const [homeSearchQuery, setHomeSearchQuery] = useState('');\n const [loginCommandInjected, setLoginCommandInjected] = useState(false);\n const [loginModalError, setLoginModalError] = useState<string | null>(null);\n const [repoSettingsError, setRepoSettingsError] = useState<string | null>(null);\n const [isLoadingCredentialOptions, setIsLoadingCredentialOptions] = useState(false);\n const [isSavingRepoSettings, setIsSavingRepoSettings] = useState(false);\n const loginTerminalRef = useRef<HTMLIFrameElement>(null);\n\n const collapsedSessionSetupLabel = 'Show Session Setup';\n\n const notifySessionsChanged = useCallback(() => {\n notifySessionsUpdated();\n }, []);\n\n const refreshSessionData = useCallback(async (repo: string | null = selectedRepo) => {\n try {\n const [allSess, repoSess] = await Promise.all([\n listSessions(),\n repo ? listSessions(repo) : Promise.resolve([] as SessionMetadata[]),\n ]);\n setAllSessions(allSess);\n if (repo) {\n setExistingSessions(repoSess);\n }\n } catch (e) {\n console.error('Failed to refresh sessions', e);\n }\n }, [selectedRepo]);\n\n const resolveRepoCredentialSelection = useCallback((repo: string, credentials: Credential[] = credentialOptions): RepoCredentialSelection => {\n const repoSettings = config?.repoSettings?.[repo];\n if (!repoSettings) return 'auto';\n\n if (repoSettings.credentialId) {\n return repoSettings.credentialId;\n }\n\n const legacyPreference = repoSettings.credentialPreference;\n if (legacyPreference === 'github' || legacyPreference === 'gitlab') {\n const matched = credentials.find((credential) => credential.type === legacyPreference);\n if (matched) return matched.id;\n }\n\n return 'auto';\n }, [config, credentialOptions]);\n\n const getRepoCredentialLabel = useCallback((repo: string): string => {\n const repoSettings = config?.repoSettings?.[repo];\n if (!repoSettings) return 'Auto';\n\n if (repoSettings.credentialId) {\n const matched = credentialOptions.find((credential) => credential.id === repoSettings.credentialId);\n return matched ? getCredentialOptionLabel(matched) : 'Selected credential';\n }\n\n if (repoSettings.credentialPreference === 'github') return 'GitHub (legacy)';\n if (repoSettings.credentialPreference === 'gitlab') return 'GitLab (legacy)';\n\n return 'Auto';\n }, [config, credentialOptions]);\n\n const dismissRepoSettingsDialog = useCallback(() => {\n if (isSavingRepoSettings) return;\n setIsRepoSettingsDialogOpen(false);\n setRepoForSettings(null);\n setRepoCredentialSelection('auto');\n setRepoStartupCommand(DEFAULT_REPO_STARTUP_COMMAND);\n setRepoDevServerCommand(DEFAULT_REPO_DEV_SERVER_COMMAND);\n setRepoSettingsError(null);\n setIsLoadingCredentialOptions(false);\n }, [isSavingRepoSettings]);\n\n const openCloneRemoteDialog = useCallback(() => {\n setIsCloneRemoteDialogOpen(true);\n setRemoteRepoUrl('');\n setCloneCredentialSelection('auto');\n setCloneRemoteError(null);\n setIsLoadingCloneCredentialOptions(true);\n\n void (async () => {\n try {\n const result = await listCredentials();\n if (!result.success) {\n setCloneRemoteError(result.error);\n return;\n }\n\n setCredentialOptions(result.credentials);\n } catch (error) {\n console.error(error);\n setCloneRemoteError('Failed to load credentials.');\n } finally {\n setIsLoadingCloneCredentialOptions(false);\n }\n })();\n }, []);\n\n const dismissCloneRemoteDialog = useCallback(() => {\n if (isCloningRemote) return;\n setIsCloneRemoteDialogOpen(false);\n setRemoteRepoUrl('');\n setCloneCredentialSelection('auto');\n setCloneRemoteError(null);\n setIsLoadingCloneCredentialOptions(false);\n }, [isCloningRemote]);\n\n // Load config and all sessions on mount\n useEffect(() => {\n const loadData = async () => {\n try {\n const [cfg, sessions, credentialsResult] = await Promise.all([\n getConfig(),\n listSessions(),\n listCredentials(),\n ]);\n setConfig(cfg);\n setAllSessions(sessions);\n if (credentialsResult.success) {\n setCredentialOptions(credentialsResult.credentials);\n }\n } catch (e) {\n console.error('Failed to load data', e);\n } finally {\n setIsLoaded(true);\n }\n };\n loadData();\n }, []);\n\n useEffect(() => {\n try {\n const storedMode = window.localStorage.getItem(THEME_MODE_STORAGE_KEY);\n if (storedMode === 'light' || storedMode === 'dark' || storedMode === 'auto') {\n setThemeMode(storedMode);\n return;\n }\n } catch {\n // Ignore localStorage errors and keep default theme mode.\n }\n setThemeMode('auto');\n }, []);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const resolveDarkMode = () => themeMode === 'dark' || (themeMode === 'auto' && mediaQuery.matches);\n const applyThemeMode = () => {\n const shouldUseDark = resolveDarkMode();\n document.documentElement.classList.toggle('dark', shouldUseDark);\n document.documentElement.dataset.themeMode = themeMode;\n setIsDarkThemeActive(shouldUseDark);\n };\n\n applyThemeMode();\n\n try {\n window.localStorage.setItem(THEME_MODE_STORAGE_KEY, themeMode);\n } catch {\n // Ignore localStorage errors.\n }\n\n if (themeMode !== 'auto') {\n return;\n }\n\n const handleThemeChange = () => {\n applyThemeMode();\n };\n\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', handleThemeChange);\n return () => {\n mediaQuery.removeEventListener('change', handleThemeChange);\n };\n }\n\n mediaQuery.addListener(handleThemeChange);\n return () => {\n mediaQuery.removeListener(handleThemeChange);\n };\n }, [themeMode]);\n\n useEffect(() => {\n if (mode !== 'new') return;\n\n try {\n const storedMode = window.localStorage.getItem(SESSION_MODE_STORAGE_KEY);\n if (storedMode === 'fast' || storedMode === 'plan') {\n setSessionMode(storedMode);\n }\n } catch {\n // Ignore localStorage errors.\n }\n }, [mode]);\n\n useEffect(() => {\n const refresh = () => {\n const repoForList = mode === 'new' ? selectedRepo : null;\n void refreshSessionData(repoForList);\n };\n\n const handleStorage = (event: StorageEvent) => {\n if (event.key === SESSIONS_UPDATED_STORAGE_KEY) {\n refresh();\n }\n };\n\n const handleFocus = () => {\n refresh();\n };\n\n const handleSessionsUpdated = () => {\n refresh();\n };\n\n window.addEventListener('storage', handleStorage);\n window.addEventListener('focus', handleFocus);\n window.addEventListener(SESSIONS_UPDATED_EVENT, handleSessionsUpdated);\n\n return () => {\n window.removeEventListener('storage', handleStorage);\n window.removeEventListener('focus', handleFocus);\n window.removeEventListener(SESSIONS_UPDATED_EVENT, handleSessionsUpdated);\n };\n }, [mode, refreshSessionData, selectedRepo]);\n\n const loadSelectedRepoData = async (path: string) => {\n setSelectedRepo(path);\n setRepoFilesCache([]);\n\n // Load saved session scripts\n await loadSavedAgentSettings(path);\n\n // Load branches\n await loadBranches(path);\n\n await refreshSessionData(path);\n };\n\n const handleSelectRepo = async (path: string) => {\n setLoading(true);\n setError(null);\n try {\n const isValid = await checkIsGitRepo(path);\n if (!isValid) {\n setError('Selected directory is not a valid git repository.');\n return false;\n }\n\n const currentConfig = config || await getConfig();\n let newRecent = [...currentConfig.recentRepos];\n if (!newRecent.includes(path)) {\n newRecent.unshift(path);\n } else {\n // Move to top\n newRecent = [path, ...newRecent.filter(r => r !== path)];\n }\n\n // Update config\n const newConfig = await updateConfig({ recentRepos: newRecent });\n setConfig(newConfig);\n\n setIsBrowsing(false);\n\n if (mode === 'home') {\n router.push(`/new?repo=${encodeURIComponent(path)}`);\n return true;\n }\n\n await loadSelectedRepoData(path);\n return true;\n } catch (err) {\n console.error(err);\n setError('Failed to open repository.');\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n const handleCloneRemoteRepo = async () => {\n if (isCloningRemote) return;\n\n const trimmedRemoteUrl = remoteRepoUrl.trim();\n if (!trimmedRemoteUrl) {\n setCloneRemoteError('Please enter a remote repository URL.');\n return;\n }\n\n setIsCloningRemote(true);\n setCloneRemoteError(null);\n setError(null);\n\n try {\n const result = await cloneRemoteRepository(\n trimmedRemoteUrl,\n cloneCredentialSelection === 'auto' ? null : cloneCredentialSelection,\n );\n\n if (!result.success || !result.repoPath) {\n setCloneRemoteError(result.error || 'Failed to clone repository.');\n return;\n }\n\n const opened = await handleSelectRepo(result.repoPath);\n if (!opened) {\n setCloneRemoteError('Repository was cloned, but failed to open it.');\n return;\n }\n\n setIsCloneRemoteDialogOpen(false);\n setRemoteRepoUrl('');\n setCloneCredentialSelection('auto');\n setCloneRemoteError(null);\n } catch (error) {\n console.error(error);\n setCloneRemoteError('Failed to clone repository.');\n } finally {\n setIsCloningRemote(false);\n }\n };\n\n const handleCurrentRepoChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (mode !== 'new') return;\n\n const nextRepo = e.target.value;\n if (!nextRepo || nextRepo === selectedRepo) return;\n\n const changed = await handleSelectRepo(nextRepo);\n if (!changed) return;\n\n const params = new URLSearchParams();\n params.set('repo', nextRepo);\n if (prefillFromSession) {\n params.set('prefillFromSession', prefillFromSession);\n }\n\n router.replace(`/new?${params.toString()}`);\n };\n\n useEffect(() => {\n if (mode !== 'new') return;\n\n if (!repoPath) {\n setSelectedRepo(null);\n setExistingSessions([]);\n setBranches([]);\n setCurrentBranchName('');\n return;\n }\n\n if (repoPath === selectedRepo) return;\n void handleSelectRepo(repoPath);\n // `handleSelectRepo` is intentionally excluded to avoid retriggering from function identity changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mode, repoPath, selectedRepo]);\n\n useEffect(() => {\n if (mode !== 'new') return;\n if (repoPath) {\n setIsResolvingRepoFromName(false);\n return;\n }\n\n const trimmedFromRepoName = fromRepoName?.trim() ?? '';\n if (!trimmedFromRepoName) {\n setIsResolvingRepoFromName(false);\n return;\n }\n\n let isCancelled = false;\n\n const resolveFromRepoName = async () => {\n setError(null);\n setIsResolvingRepoFromName(true);\n\n const result = await resolveRepositoryByName(trimmedFromRepoName);\n if (isCancelled) return;\n\n if (!result.success) {\n setError(result.error || 'Failed to search repositories.');\n setIsResolvingRepoFromName(false);\n return;\n }\n\n if (!result.repoPath) {\n setError(`Could not find a matching repository for \"${trimmedFromRepoName}\".`);\n setIsResolvingRepoFromName(false);\n return;\n }\n\n const params = new URLSearchParams();\n params.set('repo', result.repoPath);\n if (prefillFromSession) {\n params.set('prefillFromSession', prefillFromSession);\n }\n router.replace(`/new?${params.toString()}`);\n };\n\n void resolveFromRepoName();\n\n return () => {\n isCancelled = true;\n };\n }, [fromRepoName, mode, prefillFromSession, repoPath, router]);\n\n useEffect(() => {\n setHasAppliedPrefill(false);\n setPrefilledAttachmentNames([]);\n setPrefillSourceSessionName(null);\n }, [prefillFromSession]);\n\n useEffect(() => {\n if (mode !== 'new' || !selectedRepo || !prefillFromSession || hasAppliedPrefill) {\n return;\n }\n\n let isCancelled = false;\n\n const loadPrefill = async () => {\n const prefillResult = await getSessionPrefillContext(prefillFromSession);\n if (isCancelled) return;\n\n if (!prefillResult.success || !prefillResult.context) {\n if (prefillResult.error) {\n setError(prefillResult.error);\n }\n setHasAppliedPrefill(true);\n return;\n }\n\n const context = prefillResult.context;\n if (context.repoPath !== selectedRepo) {\n setHasAppliedPrefill(true);\n return;\n }\n\n setInitialMessage(context.initialMessage || '');\n setPrefilledAttachmentNames(context.attachmentNames || []);\n setPrefillSourceSessionName(context.sourceSessionName);\n setShowSessionAdvanced(true);\n setHasAppliedPrefill(true);\n };\n\n void loadPrefill();\n\n return () => {\n isCancelled = true;\n };\n }, [hasAppliedPrefill, mode, prefillFromSession, selectedRepo]);\n\n const loadSavedAgentSettings = async (repoPath: string) => {\n // Refresh config to ensure we have latest settings?\n // We can just rely on current config state if we assume single user or minimal concurrency.\n // Or we can refetch.\n const currentConfig = config || await getConfig();\n if (!config) setConfig(currentConfig);\n\n const settings = currentConfig.repoSettings[repoPath] || {};\n\n const savedStartupScript = settings.startupScript;\n const savedDevServerScript = settings.devServerScript;\n\n if (savedStartupScript !== undefined && savedStartupScript !== null) {\n setStartupScript(savedStartupScript);\n } else {\n // Determine default based on repo content\n const defaultScript = await getStartupScript(repoPath);\n setStartupScript(defaultScript);\n }\n\n if (savedDevServerScript !== undefined && savedDevServerScript !== null) {\n setDevServerScript(savedDevServerScript);\n } else {\n const defaultDevServerScript = await getDefaultDevServerScript(repoPath);\n setDevServerScript(defaultDevServerScript);\n }\n };\n\n const handleSetDefaultRoot = async (path: string) => {\n const newConfig = await updateConfig({ defaultRoot: path });\n setConfig(newConfig);\n setIsSelectingRoot(false);\n };\n\n const loadBranches = async (repoPath: string) => {\n try {\n const data = await getBranches(repoPath);\n setBranches(data);\n\n const currentConfig = config || await getConfig();\n const settings = currentConfig.repoSettings[repoPath] || {};\n const lastPicked = settings.lastBranch;\n\n // Check current checked out branch\n const currentCheckedOut = data.find(b => b.current)?.name;\n\n if (lastPicked && data.some(b => b.name === lastPicked)) {\n setCurrentBranchName(lastPicked);\n if (lastPicked !== currentCheckedOut) {\n try {\n await checkoutBranch(repoPath, lastPicked);\n const updatedData = await getBranches(repoPath);\n setBranches(updatedData);\n } catch (e) {\n console.warn(\"Could not auto-checkout to remembered branch\", e);\n if (currentCheckedOut) setCurrentBranchName(currentCheckedOut);\n }\n }\n } else {\n if (currentCheckedOut) setCurrentBranchName(currentCheckedOut);\n }\n } catch (e) {\n console.error(\"Failed to load branches\", e);\n setError(\"Failed to load branches.\");\n }\n };\n\n const handleBranchChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newBranch = e.target.value;\n if (!selectedRepo) return;\n\n setLoading(true);\n try {\n await checkoutBranch(selectedRepo, newBranch);\n setCurrentBranchName(newBranch);\n\n const newConfig = await updateRepoSettings(selectedRepo, { lastBranch: newBranch });\n setConfig(newConfig);\n\n const data = await getBranches(selectedRepo);\n setBranches(data);\n } catch {\n setError(`Failed to checkout branch ${newBranch}`);\n } finally {\n setLoading(false);\n }\n };\n\n const handleSessionModeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const nextMode = e.target.value === 'plan' ? 'plan' : 'fast';\n setSessionMode(nextMode);\n\n try {\n window.localStorage.setItem(SESSION_MODE_STORAGE_KEY, nextMode);\n } catch {\n // Ignore localStorage errors.\n }\n };\n\n const handleStartupScriptChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const script = e.target.value;\n setStartupScript(script);\n // Debounce saving? Or just save on blur/change?\n // For simplicity, I'll save on change but it triggers server action every keystroke which is bad.\n // Better to save on blur or debounce.\n // Or just save when starting session?\n // The previous code saved on every change to localStorage.\n // Let's rely on saving when starting session? No, we want to persist even if not started.\n // I'll save on blur for now, or just save here and accept the cost.\n // Given the \"async\" nature, let's just save. But it might be laggy.\n // Actually, let's just update local state here, and use `onBlur` to save.\n };\n\n const saveStartupScript = async () => {\n if (selectedRepo) {\n const newConfig = await updateRepoSettings(selectedRepo, { startupScript });\n setConfig(newConfig);\n }\n }\n\n const handleDevServerScriptChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setDevServerScript(e.target.value);\n };\n\n const saveDevServerScriptValue = async (script: string) => {\n if (selectedRepo) {\n const newConfig = await updateRepoSettings(selectedRepo, { devServerScript: script });\n setConfig(newConfig);\n }\n };\n\n const saveDevServerScript = async () => {\n await saveDevServerScriptValue(devServerScript);\n };\n\n const normalizeAttachmentFile = useCallback((file: File, index: number): File => {\n if (file.name && file.name.trim().length > 0) {\n return file;\n }\n\n const extension = file.type\n ? file.type.split('/')[1]?.split('+')[0] || 'bin'\n : 'bin';\n const generatedName = `pasted-file-${Date.now()}-${index + 1}.${extension}`;\n\n return new File([file], generatedName, {\n type: file.type,\n lastModified: file.lastModified || Date.now(),\n });\n }, []);\n\n const appendAttachments = useCallback((incomingFiles: File[]) => {\n if (incomingFiles.length === 0) return;\n\n setAttachments(prev => {\n const byName = new Map(prev.map(file => [file.name, file]));\n incomingFiles.forEach(file => {\n byName.set(file.name, file);\n });\n return Array.from(byName.values());\n });\n }, []);\n\n // Suggestion state\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [suggestionList, setSuggestionList] = useState<string[]>([]);\n const [, setSuggestionQuery] = useState('');\n const [cursorPosition, setCursorPosition] = useState(0);\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Cache filtered files\n const [repoFilesCache, setRepoFilesCache] = useState<string[]>([]);\n\n const updateSuggestions = (query: string, files: string[], currentAttachments: File[], carriedAttachments: string[]) => {\n const lowerQ = query.toLowerCase();\n\n const attachmentNames = [...currentAttachments.map(f => f.name), ...carriedAttachments];\n // prioritize attachments\n const matchedAttachments = attachmentNames.filter(n => n.toLowerCase().includes(lowerQ));\n const matchedFiles = files.filter(f => f.toLowerCase().includes(lowerQ)).slice(0, 20);\n\n const newList = [...matchedAttachments, ...matchedFiles];\n setSuggestionList(newList);\n setSelectedIndex(0); // Reset selection\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Cmd+Enter to submit\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleStartSession();\n return;\n }\n\n if (showSuggestions && suggestionList.length > 0) {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedIndex(prev => (prev > 0 ? prev - 1 : suggestionList.length - 1)); // Wrap around\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedIndex(prev => (prev < suggestionList.length - 1 ? prev + 1 : 0)); // Wrap around\n } else if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault();\n handleSelectSuggestion(suggestionList[selectedIndex]);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setShowSuggestions(false);\n }\n }\n };\n\n const handleMessageChange = async (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const val = e.target.value;\n const pos = e.target.selectionStart;\n setInitialMessage(val);\n setCursorPosition(pos);\n\n // Check for @ mention\n const textBeforeCursor = val.substring(0, pos);\n const lastAt = textBeforeCursor.lastIndexOf('@');\n\n if (lastAt !== -1) {\n const query = textBeforeCursor.substring(lastAt + 1);\n if (!/\\s/.test(query)) {\n setSuggestionQuery(query);\n setShowSuggestions(true);\n\n if (selectedRepo) {\n let files = repoFilesCache;\n if (repoFilesCache.length === 0) {\n files = await listRepoFiles(selectedRepo);\n setRepoFilesCache(files);\n }\n updateSuggestions(query, files, attachments, prefilledAttachmentNames);\n }\n return;\n }\n }\n\n setShowSuggestions(false);\n };\n\n const handleSelectSuggestion = (suggestion: string) => {\n const textBeforeCursor = initialMessage.substring(0, cursorPosition);\n const lastAt = textBeforeCursor.lastIndexOf('@');\n\n if (lastAt !== -1) {\n const prefix = initialMessage.substring(0, lastAt);\n const suffix = initialMessage.substring(cursorPosition);\n\n const newValue = `${prefix}@${suggestion} ${suffix}`;\n setInitialMessage(newValue);\n setShowSuggestions(false);\n }\n };\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!e.target.files) return;\n\n const selectedFiles = Array.from(e.target.files).map((file, index) => normalizeAttachmentFile(file, index));\n appendAttachments(selectedFiles);\n e.target.value = '';\n };\n\n useEffect(() => {\n if (mode !== 'new' || !selectedRepo) return;\n\n const handlePaste = (event: ClipboardEvent) => {\n const clipboardData = event.clipboardData;\n if (!clipboardData) return;\n\n const fromItems = Array.from(clipboardData.items)\n .filter(item => item.kind === 'file')\n .map(item => item.getAsFile())\n .filter((file): file is File => file !== null);\n\n const pastedFiles = (fromItems.length > 0 ? fromItems : Array.from(clipboardData.files))\n .map((file, index) => normalizeAttachmentFile(file, index));\n\n if (pastedFiles.length === 0) return;\n\n event.preventDefault();\n appendAttachments(pastedFiles);\n };\n\n window.addEventListener('paste', handlePaste);\n return () => {\n window.removeEventListener('paste', handlePaste);\n };\n }, [appendAttachments, mode, normalizeAttachmentFile, selectedRepo]);\n\n const removeAttachment = (idx: number) => {\n setAttachments(prev => prev.filter((_, i) => i !== idx));\n };\n\n const removePrefilledAttachment = (idx: number) => {\n setPrefilledAttachmentNames(prev => prev.filter((_, i) => i !== idx));\n };\n\n\n const handleRemoveRecent = async (e: React.MouseEvent, repo: string) => {\n e.stopPropagation();\n if (config) {\n const newRecent = config.recentRepos.filter(r => r !== repo);\n const newConfig = await updateConfig({ recentRepos: newRecent });\n setConfig(newConfig);\n }\n };\n\n const handleOpenRepoSettings = async (e: React.MouseEvent, repo: string) => {\n e.stopPropagation();\n\n const settings = config?.repoSettings?.[repo];\n setRepoForSettings(repo);\n setRepoCredentialSelection(resolveRepoCredentialSelection(repo));\n setRepoStartupCommand(settings?.startupScript?.trim() ? settings.startupScript : DEFAULT_REPO_STARTUP_COMMAND);\n setRepoDevServerCommand(settings?.devServerScript?.trim() ? settings.devServerScript : DEFAULT_REPO_DEV_SERVER_COMMAND);\n setRepoSettingsError(null);\n setIsRepoSettingsDialogOpen(true);\n setIsLoadingCredentialOptions(true);\n\n try {\n const result = await listCredentials();\n if (!result.success) {\n setRepoSettingsError(result.error);\n setCredentialOptions([]);\n } else {\n setCredentialOptions(result.credentials);\n setRepoCredentialSelection(resolveRepoCredentialSelection(repo, result.credentials));\n }\n } catch (err) {\n console.error(err);\n setRepoSettingsError('Failed to load credentials.');\n setCredentialOptions([]);\n } finally {\n setIsLoadingCredentialOptions(false);\n }\n };\n\n const handleSaveRepoSettings = async () => {\n if (!repoForSettings) return;\n const credentialId = repoCredentialSelection === 'auto' ? null : repoCredentialSelection;\n const startupCommandToSave = repoStartupCommand.trim() || DEFAULT_REPO_STARTUP_COMMAND;\n const devServerCommandToSave = repoDevServerCommand.trim() || DEFAULT_REPO_DEV_SERVER_COMMAND;\n\n if (credentialId && !credentialOptions.some((credential) => credential.id === credentialId)) {\n setRepoSettingsError('Selected credential no longer exists. Please choose another credential.');\n return;\n }\n\n setIsSavingRepoSettings(true);\n setRepoSettingsError(null);\n try {\n const newConfig = await updateRepoSettings(repoForSettings, {\n credentialId,\n startupScript: startupCommandToSave,\n devServerScript: devServerCommandToSave,\n credentialPreference: undefined,\n });\n setConfig(newConfig);\n dismissRepoSettingsDialog();\n } catch (err) {\n console.error(err);\n setRepoSettingsError('Failed to save repository settings.');\n } finally {\n setIsSavingRepoSettings(false);\n }\n };\n\n const handleLoginTerminalLoad = useCallback(() => {\n if (!isLoginModalOpen || !loginCommand || !loginTerminalRef.current) {\n return;\n }\n\n const iframe = loginTerminalRef.current;\n const checkAndInject = (attempts = 0) => {\n if (attempts > 40) {\n setLoginModalError('Timed out while waiting for terminal to initialize.');\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win?.term) {\n win.term.paste(`${loginCommand}\\r`);\n setLoginCommandInjected(true);\n setLoginModalError(null);\n win.focus();\n return;\n }\n\n setTimeout(() => checkAndInject(attempts + 1), 300);\n } catch (e) {\n console.error('Failed to inject login command into terminal iframe:', e);\n setLoginModalError('Could not access ttyd terminal. Ensure ttyd is running and try again.');\n }\n };\n\n setTimeout(() => checkAndInject(), 500);\n }, [isLoginModalOpen, loginCommand]);\n\n const hasConfiguredAgentApiCredential = useCallback(async (agentCli: SupportedAgentCli): Promise<boolean> => {\n try {\n const result = await listAgentApiCredentials();\n if (!result.success) return false;\n return result.credentials.some((credential) => credential.agent === agentCli);\n } catch {\n return false;\n }\n }, []);\n\n const ensureAgentCliReady = useCallback(async (): Promise<boolean> => {\n const agentCli: SupportedAgentCli = 'codex';\n\n const checkResult = await checkAgentCliInstalled(agentCli);\n if (!checkResult.success) {\n setError(checkResult.error || `Failed to verify ${AGENT_CLI_LABELS[agentCli]} installation status.`);\n return false;\n }\n\n if (checkResult.installed) {\n return true;\n }\n\n setIsInstallingAgentCli(true);\n setInstallingAgentCli(agentCli);\n setError(null);\n\n const installResult = await installAgentCli(agentCli);\n setIsInstallingAgentCli(false);\n setInstallingAgentCli(null);\n\n if (!installResult.success) {\n setError(installResult.error || `Failed to install ${AGENT_CLI_LABELS[agentCli]}.`);\n return false;\n }\n\n const ttydResult = await startTtydProcess();\n if (!ttydResult.success) {\n setError(ttydResult.error || 'Failed to start ttyd');\n return false;\n }\n\n const hasAgentApiCredential = await hasConfiguredAgentApiCredential(agentCli);\n if (hasAgentApiCredential) {\n return true;\n }\n\n setLoginAgentCli(agentCli);\n setLoginCommand(AGENT_LOGIN_COMMANDS[agentCli]);\n setLoginCommandInjected(false);\n setLoginModalError(null);\n setIsLoginModalOpen(true);\n return false;\n }, [hasConfiguredAgentApiCredential]);\n\n const startSession = async (options: { skipAgentSetup?: boolean } = {}) => {\n if (!selectedRepo) return;\n setLoading(true);\n setError(null);\n\n try {\n if (!options.skipAgentSetup) {\n const isAgentCliReady = await ensureAgentCliReady();\n if (!isAgentCliReady) {\n setLoading(false);\n return;\n }\n }\n\n const trimmedDevServerScript = devServerScript.trim();\n let resolvedDevServerScript = trimmedDevServerScript;\n\n if (!resolvedDevServerScript) {\n resolvedDevServerScript = await getDefaultDevServerScript(selectedRepo);\n if (resolvedDevServerScript) {\n setDevServerScript(resolvedDevServerScript);\n }\n }\n\n // Also save startup script if changed\n await saveStartupScript();\n await saveDevServerScriptValue(resolvedDevServerScript);\n\n // 1. Start TTYD if needed\n const ttydResult = await startTtydProcess();\n if (!ttydResult.success) {\n setError(ttydResult.error || \"Failed to start ttyd\");\n setLoading(false);\n return;\n }\n\n // 2. Create Session Worktree\n // Use current selected branch as base\n const baseBranch = currentBranchName || 'main'; // Fallback to main if empty, though shouldn't happen\n const derivedTitle = deriveSessionTitleFromTaskDescription(initialMessage);\n\n const wtResult = await createSession(selectedRepo, baseBranch, {\n agent: 'codex',\n model: '',\n title: derivedTitle,\n devServerScript: resolvedDevServerScript || undefined\n });\n\n if (wtResult.success && wtResult.sessionName && wtResult.worktreePath && wtResult.branchName) {\n let uploadedAttachmentNames: string[] = [];\n let carriedAttachmentNames: string[] = [];\n\n // Upload newly selected attachments.\n if (attachments.length > 0) {\n const formData = new FormData();\n attachments.forEach(file => formData.append(file.name, file)); // Use filename as key or just 'files'\n // Backend iterates entries [name, file].\n uploadedAttachmentNames = await saveAttachments(wtResult.worktreePath, formData);\n }\n\n // Copy carried attachments from the source session.\n if (prefillSourceSessionName && prefilledAttachmentNames.length > 0) {\n const copiedResult = await copySessionAttachments(\n prefillSourceSessionName,\n wtResult.worktreePath,\n prefilledAttachmentNames\n );\n\n if (!copiedResult.success) {\n setError(copiedResult.error || 'Failed to carry over attachments from source session');\n setLoading(false);\n return;\n }\n\n carriedAttachmentNames = copiedResult.copiedAttachmentNames;\n }\n\n const allAttachmentNames = Array.from(new Set([\n ...uploadedAttachmentNames,\n ...carriedAttachmentNames,\n ]));\n\n // Process initial message mentions\n const trimmedInitialMessage = initialMessage.trim();\n let processedMessage = trimmedInitialMessage;\n\n // Helper to match replacement\n processedMessage = processedMessage.replace(/@(\\S+)/g, (match, name) => {\n if (allAttachmentNames.includes(name)) {\n return `${wtResult.worktreePath}-attachments/${name}`;\n }\n // Assume repo file - keep relative path as we run in worktree root\n return name;\n });\n\n // 3. Persist launch context for the new session\n const launchContextResult = await saveSessionLaunchContext(wtResult.sessionName, {\n title: derivedTitle,\n initialMessage: processedMessage || undefined,\n rawInitialMessage: trimmedInitialMessage || undefined,\n startupScript: startupScript || undefined,\n attachmentNames: allAttachmentNames,\n agentProvider: 'codex',\n model: '',\n sessionMode,\n });\n\n if (!launchContextResult.success) {\n setError(launchContextResult.error || 'Failed to save session context');\n setLoading(false);\n return;\n }\n\n // 4. Navigate to session page by path only\n const dest = `/session/${wtResult.sessionName}`;\n notifySessionsChanged();\n router.push(dest);\n setLoading(false);\n\n // No need to refresh sessions as we are navigating away\n } else {\n setError(wtResult.error || \"Failed to create session worktree\");\n setLoading(false);\n }\n\n } catch (e) {\n console.error(e);\n setError(\"Failed to start session\");\n setLoading(false);\n }\n };\n\n const handleStartSession = () => {\n void startSession();\n };\n\n const dismissLoginModal = useCallback(() => {\n setIsLoginModalOpen(false);\n setLoginAgentCli(null);\n setLoginCommand('');\n setLoginCommandInjected(false);\n setLoginModalError(null);\n }, []);\n\n const handleLoginDone = async () => {\n dismissLoginModal();\n await startSession({ skipAgentSetup: true });\n };\n\n useDialogKeyboardShortcuts({\n enabled: mode === 'new' && isLoginModalOpen && !!loginAgentCli,\n onConfirm: handleLoginDone,\n onDismiss: dismissLoginModal,\n canConfirm: !loading,\n });\n\n useDialogKeyboardShortcuts({\n enabled: mode === 'home' && isRepoSettingsDialogOpen && !!repoForSettings,\n onConfirm: handleSaveRepoSettings,\n onDismiss: dismissRepoSettingsDialog,\n canConfirm: !isSavingRepoSettings,\n });\n\n useDialogKeyboardShortcuts({\n enabled: mode === 'home' && isCloneRemoteDialogOpen,\n onConfirm: handleCloneRemoteRepo,\n onDismiss: dismissCloneRemoteDialog,\n canConfirm: !isCloningRemote && remoteRepoUrl.trim().length > 0 && !isLoadingCloneCredentialOptions,\n });\n\n const handleResumeSession = async (session: SessionMetadata) => {\n if (!selectedRepo) return;\n setLoading(true);\n\n try {\n // 1. Start TTYD\n const ttydResult = await startTtydProcess();\n if (!ttydResult.success) {\n setError(ttydResult.error || \"Failed to start ttyd\");\n setLoading(false);\n return;\n }\n\n // 2. Navigate — session already has initialized=true so SessionPageClient will resume\n const dest = `/session/${session.sessionName}`;\n router.push(dest);\n setLoading(false);\n\n } catch (e) {\n console.error(e);\n setError(\"Failed to resume session\");\n setLoading(false);\n }\n };\n\n const handleNewAttemptFromSession = (session: SessionMetadata) => {\n if (!selectedRepo) return;\n const nextUrl = `/new?repo=${encodeURIComponent(selectedRepo)}&prefillFromSession=${encodeURIComponent(session.sessionName)}`;\n router.push(nextUrl);\n };\n\n const handleDeleteSession = async (session: SessionMetadata) => {\n if (!selectedRepo) return;\n\n const confirmed = confirm(\n `Delete session \"${session.sessionName}\"?\\n\\nThis will remove the worktree, branch, and session metadata.`\n );\n if (!confirmed) return;\n\n setDeletingSessionName(session.sessionName);\n setError(null);\n\n try {\n const result = await deleteSession(session.sessionName);\n if (!result.success) {\n setError(result.error || 'Failed to delete session');\n return;\n }\n\n const sessions = await listSessions(selectedRepo);\n setExistingSessions(sessions);\n\n // Also refresh all sessions\n const allSess = await listSessions();\n setAllSessions(allSess);\n notifySessionsChanged();\n } catch (e) {\n console.error(e);\n setError('Failed to delete session');\n } finally {\n setDeletingSessionName(null);\n }\n };\n\n const runningSessionCountByRepo = useMemo(() => {\n const counts = new Map<string, number>();\n for (const session of allSessions) {\n counts.set(session.repoPath, (counts.get(session.repoPath) ?? 0) + 1);\n }\n return counts;\n }, [allSessions]);\n\n const recentRepos = useMemo(() => config?.recentRepos ?? [], [config?.recentRepos]);\n const filteredRecentRepos = useMemo(() => {\n const normalizedQuery = homeSearchQuery.trim().toLowerCase();\n if (!normalizedQuery) return recentRepos;\n\n return recentRepos.filter((repo) => {\n const baseName = getBaseName(repo).toLowerCase();\n return baseName.includes(normalizedQuery) || repo.toLowerCase().includes(normalizedQuery);\n });\n }, [homeSearchQuery, recentRepos]);\n const selectableRepos = selectedRepo\n ? (recentRepos.includes(selectedRepo) ? recentRepos : [selectedRepo, ...recentRepos])\n : recentRepos;\n const currentThemeModeIndex = THEME_MODE_SEQUENCE.indexOf(themeMode);\n const nextThemeMode = THEME_MODE_SEQUENCE[(currentThemeModeIndex + 1) % THEME_MODE_SEQUENCE.length];\n const themeModeLabel = themeMode === 'auto' ? 'Auto' : (themeMode === 'light' ? 'Bright' : 'Dark');\n const nextThemeModeLabel = nextThemeMode === 'auto' ? 'Auto' : (nextThemeMode === 'light' ? 'Bright' : 'Dark');\n const ThemeModeIcon = themeMode === 'auto' ? Monitor : (themeMode === 'light' ? Sun : Moon);\n const handleCycleThemeMode = () => {\n setThemeMode(nextThemeMode);\n };\n\n return (\n <>\n {mode === 'home' && (\n <div className=\"w-full max-w-7xl\">\n <div className=\"overflow-hidden rounded-[28px] border border-slate-200/80 bg-white shadow-[0_24px_80px_-36px_rgba(15,23,42,0.4)] transition-colors dark:border-slate-800/70 dark:bg-[#101726]/85 dark:shadow-[0_26px_78px_-40px_rgba(0,0,0,0.85)]\">\n <header className=\"relative z-10 flex flex-col gap-4 border-b border-slate-200/80 px-4 py-4 transition-colors md:flex-row md:items-center md:justify-between md:px-7 dark:border-slate-800/75 dark:bg-[#131b2b]/72 dark:backdrop-blur-sm\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-slate-100/90 shadow-sm dark:border dark:border-white/5 dark:bg-[#1e2532]\">\n <Image src=\"/icon.png\" alt=\"Viba\" width={22} height={22} className=\"rounded-sm\" />\n </div>\n <div>\n <h2 className=\"text-xl font-semibold tracking-tight text-slate-900 dark:text-white\">Viba</h2>\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">AI Coding Agent Dashboard</p>\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <label className=\"input input-sm flex h-10 w-full items-center gap-2 border-slate-200 bg-slate-100/90 text-slate-700 shadow-none transition-colors md:w-72 dark:border-slate-700/70 dark:bg-[#1e2532] dark:text-slate-200\">\n <Search className=\"h-4 w-4 text-slate-400 dark:text-slate-500\" />\n <input\n type=\"text\"\n className=\"grow text-sm placeholder:text-slate-400 dark:placeholder:text-slate-500\"\n placeholder=\"Search repositories...\"\n value={homeSearchQuery}\n onChange={(event) => setHomeSearchQuery(event.target.value)}\n />\n </label>\n <button\n className=\"btn btn-ghost btn-sm gap-2 text-slate-700 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\"\n onClick={() => router.push('/credentials')}\n title=\"Manage GitHub/GitLab credentials\"\n >\n <KeyRound className=\"h-4 w-4\" />\n Credentials\n </button>\n <button className=\"btn btn-primary btn-sm gap-2\" onClick={openCloneRemoteDialog}>\n <CloudDownload className=\"h-4 w-4\" />\n New Repository\n </button>\n <button\n className=\"btn btn-ghost btn-sm btn-square text-slate-700 dark:border dark:border-slate-700/60 dark:bg-[#1e2532] dark:text-slate-300 dark:hover:bg-[#252d3d] dark:hover:text-white\"\n onClick={handleCycleThemeMode}\n title={`Theme mode: ${themeModeLabel}. Click to switch to ${nextThemeModeLabel}.`}\n aria-label={`Theme mode: ${themeModeLabel}. Click to switch to ${nextThemeModeLabel}.`}\n >\n <ThemeModeIcon className=\"h-4 w-4\" />\n </button>\n </div>\n </header>\n\n <div className=\"relative z-10 px-4 py-5 md:px-7 md:py-7\">\n {error && (\n <div className=\"mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-2 text-sm text-red-700 dark:border-red-500/50 dark:bg-red-950/40 dark:text-red-200\">\n {error}\n </div>\n )}\n\n {!isLoaded ? (\n <div className=\"flex h-56 items-center justify-center rounded-2xl border border-slate-200 bg-white/70 dark:border-slate-700/55 dark:bg-[#141d2e]/70\">\n <span className=\"loading loading-spinner loading-md text-primary\"></span>\n </div>\n ) : filteredRecentRepos.length === 0 ? (\n <div className=\"flex h-56 flex-col items-center justify-center rounded-2xl border border-slate-200 bg-white/70 text-center dark:border-slate-700/55 dark:bg-[#141d2e]/70\">\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">\n {homeSearchQuery.trim() ? 'No repositories match your search.' : 'No recent repositories found.'}\n </p>\n {!homeSearchQuery.trim() && (\n <button className=\"btn btn-primary btn-sm mt-3 gap-2\" onClick={openCloneRemoteDialog}>\n <Plus className=\"h-4 w-4\" />\n Add your first repository\n </button>\n )}\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-5 md:grid-cols-2 xl:grid-cols-3\">\n {filteredRecentRepos.map((repo) => {\n const credentialLabel = getRepoCredentialLabel(repo);\n const runningSessionCount = runningSessionCountByRepo.get(repo) ?? 0;\n const cardGradient = getStableRepoCardGradient(getBaseName(repo));\n\n return (\n <div\n key={repo}\n onClick={() => handleSelectRepo(repo)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void handleSelectRepo(repo);\n }\n }}\n role=\"button\"\n tabIndex={0}\n className=\"group relative h-[248px] cursor-pointer overflow-hidden rounded-2xl border border-white/70 text-left shadow-[0_14px_40px_-24px_rgba(15,23,42,0.65)] transition-all duration-200 hover:-translate-y-1 hover:shadow-[0_24px_48px_-26px_rgba(15,23,42,0.55)] dark:border-slate-700/40 dark:shadow-[0_18px_40px_-24px_rgba(0,0,0,0.85)] dark:hover:border-slate-600/55\"\n style={isDarkThemeActive ? undefined : cardGradient}\n >\n <div className=\"absolute inset-0 bg-white/40 dark:bg-[#141a25]/58\" />\n <div className=\"relative flex h-full flex-col justify-between p-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"relative\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-white/90 text-slate-700 shadow-sm dark:border dark:border-white/10 dark:bg-[#1e2532] dark:text-slate-200\">\n <FolderGit2 className=\"h-5 w-5\" />\n </div>\n {runningSessionCount > 0 && (\n <span\n className=\"absolute -right-2 -top-2 inline-flex h-6 min-w-6 items-center justify-center rounded-full bg-emerald-500 px-1.5 text-[11px] font-bold text-white shadow-sm\"\n title={`${runningSessionCount} running session${runningSessionCount === 1 ? '' : 's'}`}\n >\n {runningSessionCount}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={(event) => {\n void handleOpenRepoSettings(event, repo);\n }}\n className=\"btn btn-circle btn-xs border-0 bg-white/70 text-slate-600 opacity-0 shadow-none transition-opacity hover:bg-white hover:text-slate-900 group-hover:opacity-100 dark:bg-[#1e2532]/90 dark:text-slate-300 dark:hover:bg-[#252d3d] dark:hover:text-white\"\n title=\"Repository settings\"\n >\n <Settings className=\"h-3.5 w-3.5\" />\n </button>\n <button\n onClick={(event) => handleRemoveRecent(event, repo)}\n className=\"btn btn-circle btn-xs border-0 bg-white/70 text-slate-500 opacity-0 shadow-none transition-opacity hover:bg-white hover:text-rose-600 group-hover:opacity-100 dark:bg-[#1e2532]/90 dark:text-slate-400 dark:hover:bg-[#252d3d] dark:hover:text-rose-300\"\n title=\"Remove from history\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <h3 className=\"truncate text-lg font-bold text-slate-900 dark:text-white\">\n {getBaseName(repo)}\n </h3>\n <p className=\"truncate font-mono text-xs text-slate-600 dark:text-slate-300\">{repo}</p>\n <p className=\"truncate text-[11px] font-medium text-slate-500 dark:text-slate-400\">\n Credential: {credentialLabel}\n </p>\n </div>\n\n <div className=\"flex items-center justify-between text-sm font-semibold text-slate-700 dark:text-slate-200\">\n <span>Open repository</span>\n <ChevronRight className=\"h-4 w-4 transition-transform group-hover:translate-x-0.5\" />\n </div>\n </div>\n </div>\n );\n })}\n\n <button\n onClick={openCloneRemoteDialog}\n className=\"group flex h-[248px] flex-col items-center justify-center gap-2 rounded-2xl border-2 border-dashed border-slate-300 bg-slate-50/70 text-slate-600 transition-all duration-200 hover:-translate-y-1 hover:border-primary/50 hover:bg-white dark:border-slate-700/35 dark:bg-[#131b2a] dark:text-slate-400 dark:hover:border-slate-600/50 dark:hover:bg-[#1d2638]\"\n >\n <span className=\"flex h-14 w-14 items-center justify-center rounded-full bg-white shadow-sm transition-transform group-hover:scale-105 dark:border dark:border-slate-700/40 dark:bg-[#1e2532]\">\n <Plus className=\"h-7 w-7 text-slate-400 transition-colors group-hover:text-primary\" />\n </span>\n <span className=\"text-lg font-semibold transition-colors group-hover:text-primary\">\n Add Repository\n </span>\n <span className=\"text-sm text-slate-400 dark:text-slate-500\">Import from local or git URL</span>\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {mode === 'home' && isRepoSettingsDialogOpen && repoForSettings && (\n <div className=\"fixed inset-0 z-[1002] flex items-center justify-center bg-slate-900/35 p-4 backdrop-blur-sm\">\n <div className=\"w-full max-w-xl overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-2xl dark:border-white/10 dark:bg-[#151b26]\">\n <div className=\"flex items-center justify-between border-b border-slate-100 bg-slate-50/70 px-5 py-4 md:px-6 dark:border-white/10 dark:bg-[#1e2532]/75\">\n <h3 className=\"text-lg font-bold text-slate-900 dark:text-white\">Repository Settings</h3>\n <button\n className=\"btn btn-circle btn-ghost btn-sm text-slate-500 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\"\n onClick={dismissRepoSettingsDialog}\n disabled={isSavingRepoSettings}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"space-y-4 p-5 md:p-6\">\n <p className=\"text-sm text-slate-600 dark:text-slate-300\">\n Choose which credential this repository should use for authenticated Git operations.\n </p>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Repository</label>\n <div className=\"rounded-lg border border-slate-200 bg-slate-50 px-3 py-2 font-mono text-xs text-slate-700 break-all dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\">\n {repoForSettings}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Credential</label>\n <select\n className=\"select w-full border-slate-200 bg-slate-50 text-slate-700 focus:border-primary focus:outline-none dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\"\n value={repoCredentialSelection}\n onChange={(event) => setRepoCredentialSelection(event.target.value)}\n disabled={isSavingRepoSettings}\n >\n <option value=\"auto\">Auto (match repository remote)</option>\n {credentialOptions.map((credential) => (\n <option key={credential.id} value={credential.id}>\n {getCredentialOptionLabel(credential)}\n </option>\n ))}\n </select>\n {credentialOptions.length === 0 && !isLoadingCredentialOptions && (\n <div className=\"text-xs text-slate-500 dark:text-slate-400\">\n No credentials found. Add credentials from the Credentials page.\n </div>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Start Up Command</label>\n <input\n className=\"input w-full border-slate-200 bg-slate-50 font-mono text-sm text-slate-800 focus:border-primary focus:outline-none dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\"\n value={repoStartupCommand}\n onChange={(event) => setRepoStartupCommand(event.target.value)}\n placeholder={DEFAULT_REPO_STARTUP_COMMAND}\n disabled={isSavingRepoSettings}\n />\n <div className=\"text-xs text-slate-500 dark:text-slate-400\">\n Default: <span className=\"font-mono\">{DEFAULT_REPO_STARTUP_COMMAND}</span>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Dev Server Command</label>\n <input\n className=\"input w-full border-slate-200 bg-slate-50 font-mono text-sm text-slate-800 focus:border-primary focus:outline-none dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\"\n value={repoDevServerCommand}\n onChange={(event) => setRepoDevServerCommand(event.target.value)}\n placeholder={DEFAULT_REPO_DEV_SERVER_COMMAND}\n disabled={isSavingRepoSettings}\n />\n <div className=\"text-xs text-slate-500 dark:text-slate-400\">\n Default: <span className=\"font-mono\">{DEFAULT_REPO_DEV_SERVER_COMMAND}</span>\n </div>\n </div>\n\n {isLoadingCredentialOptions && (\n <div className=\"flex items-center gap-2 text-sm text-slate-500 dark:text-slate-400\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n Loading credentials...\n </div>\n )}\n\n {repoSettingsError && (\n <div className=\"rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700\">\n {repoSettingsError}\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 border-t border-slate-100 pt-4 dark:border-white/10\">\n <button\n className=\"btn btn-ghost text-slate-700 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\"\n onClick={dismissRepoSettingsDialog}\n disabled={isSavingRepoSettings}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n onClick={() => void handleSaveRepoSettings()}\n disabled={isSavingRepoSettings || isLoadingCredentialOptions}\n >\n {isSavingRepoSettings ? <span className=\"loading loading-spinner loading-xs\"></span> : null}\n Save\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'home' && isCloneRemoteDialogOpen && (\n <div className=\"fixed inset-0 z-[1002] flex items-center justify-center bg-slate-900/40 p-4 backdrop-blur-sm\">\n <div className=\"flex max-h-[90vh] w-full max-w-5xl flex-col overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-2xl dark:border-white/10 dark:bg-[#151b26]\">\n <div className=\"flex items-center justify-between border-b border-slate-100 bg-slate-50/60 px-5 py-4 md:px-6 dark:border-white/10 dark:bg-[#1e2532]/75\">\n <div>\n <h3 className=\"text-lg font-bold text-slate-900 dark:text-white\">Add New Repository</h3>\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">Connect a local folder or clone from URL</p>\n </div>\n <button className=\"btn btn-circle btn-ghost btn-sm text-slate-500 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\" onClick={dismissCloneRemoteDialog} disabled={isCloningRemote}>\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex flex-1 flex-col overflow-y-auto md:flex-row\">\n <div className=\"flex-1 space-y-4 border-b border-slate-100 p-5 md:border-b-0 md:border-r md:p-6 dark:border-white/10\">\n <h4 className=\"text-sm font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Browse Local</h4>\n <p className=\"text-sm text-slate-600 dark:text-slate-300\">\n Select an existing Git repository folder from your local machine.\n </p>\n <div className=\"rounded-lg border border-slate-200 bg-slate-50 p-3 text-xs text-slate-600 dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-300\">\n Default root: <span className=\"font-mono\">{config?.defaultRoot || '~'}</span>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <button\n className=\"btn btn-primary btn-sm gap-2\"\n onClick={() => {\n dismissCloneRemoteDialog();\n setIsBrowsing(true);\n }}\n >\n <FolderGit2 className=\"h-4 w-4\" />\n Browse Local Repository\n </button>\n <button\n className=\"btn btn-ghost btn-sm gap-2 text-slate-700 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\"\n onClick={() => {\n dismissCloneRemoteDialog();\n setIsSelectingRoot(true);\n }}\n >\n <FolderCog className=\"h-4 w-4\" />\n Set Default Folder\n </button>\n </div>\n </div>\n\n <div className=\"w-full space-y-4 bg-slate-50/35 p-5 md:w-[420px] md:p-6 dark:bg-[#111722]\">\n <h4 className=\"text-sm font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Clone Remote</h4>\n <p className=\"text-sm text-slate-600 dark:text-slate-300\">\n Clone into <span className=\"font-mono\">~/.viba/repos</span> and open it immediately.\n </p>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Repository URL</label>\n <input\n className=\"input w-full border-slate-200 bg-white font-mono text-sm text-slate-800 focus:border-primary focus:outline-none dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\"\n placeholder=\"https://github.com/org/repo.git\"\n value={remoteRepoUrl}\n onChange={(event) => setRemoteRepoUrl(event.target.value)}\n disabled={isCloningRemote}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Credential</label>\n <select\n className=\"select w-full border-slate-200 bg-white text-slate-700 focus:border-primary focus:outline-none dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\"\n value={cloneCredentialSelection}\n onChange={(event) => setCloneCredentialSelection(event.target.value)}\n disabled={isCloningRemote || isLoadingCloneCredentialOptions}\n >\n <option value=\"auto\">Auto (match repository remote)</option>\n {credentialOptions.map((credential) => (\n <option key={credential.id} value={credential.id}>\n {getCredentialOptionLabel(credential)}\n </option>\n ))}\n </select>\n {credentialOptions.length === 0 && !isLoadingCloneCredentialOptions && (\n <div className=\"text-xs text-slate-500 dark:text-slate-400\">\n No credentials found. Clone uses anonymous access unless remote auth is configured.\n </div>\n )}\n </div>\n\n {isLoadingCloneCredentialOptions && (\n <div className=\"flex items-center gap-2 text-sm text-slate-500 dark:text-slate-400\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n Loading credentials...\n </div>\n )}\n\n {isCloningRemote && (\n <div className=\"flex items-center gap-2 rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm text-slate-600 dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-300\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n Cloning repository...\n </div>\n )}\n\n {cloneRemoteError && (\n <div className=\"rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700\">\n {cloneRemoteError}\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 border-t border-slate-100 pt-4 dark:border-white/10\">\n <button\n className=\"btn btn-ghost text-slate-700 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\"\n onClick={dismissCloneRemoteDialog}\n disabled={isCloningRemote}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary gap-2\"\n onClick={() => void handleCloneRemoteRepo()}\n disabled={isCloningRemote || !remoteRepoUrl.trim() || isLoadingCloneCredentialOptions}\n >\n {isCloningRemote ? <span className=\"loading loading-spinner loading-xs\"></span> : <CloudDownload className=\"h-4 w-4\" />}\n Clone Repository\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'new' && selectedRepo && (\n <div className=\"w-full max-w-[1240px]\">\n {error && (\n <div className=\"mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-2 text-sm text-red-700 dark:border-red-500/40 dark:bg-red-900/30 dark:text-red-200\">\n {error}\n </div>\n )}\n\n <div className=\"mb-8\">\n <div className=\"mb-2 flex items-center gap-4\">\n <button\n type=\"button\"\n className=\"flex h-10 w-10 items-center justify-center rounded-lg text-slate-500 transition-colors hover:bg-white hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white\"\n onClick={() => router.push('/')}\n aria-label=\"Back to home\"\n >\n <ChevronRight className=\"h-6 w-6 rotate-180\" />\n </button>\n <h1 className=\"text-3xl font-black tracking-[-0.02em] text-slate-900 md:text-4xl dark:text-white\">Assign New Task</h1>\n </div>\n <p className=\"ml-14 text-sm text-slate-500 md:text-base dark:text-slate-400\">\n Configure the environment and describe the work required for your AI agent.\n </p>\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-12\">\n <div className=\"space-y-6 lg:col-span-4\">\n <div className=\"rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-[#30363d] dark:bg-[#161b22] dark:shadow-[0_16px_36px_-24px_rgba(2,6,23,0.95)]\">\n <h3 className=\"mb-5 flex items-center gap-2 text-lg font-bold text-slate-900 dark:text-white\">\n <FolderGit2 className=\"h-5 w-5 text-primary\" />\n Context Setup\n </h3>\n\n <div className=\"space-y-4\">\n <label className=\"flex flex-col gap-2\">\n <span className=\"text-sm font-medium text-slate-700 dark:text-slate-300\">Select Repository</span>\n <div className=\"relative\">\n <select\n className=\"h-12 w-full appearance-none rounded-lg border border-slate-300 bg-white px-3 pr-10 font-mono text-sm text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/20 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100\"\n value={selectedRepo}\n onChange={(event) => {\n void handleCurrentRepoChange(event);\n }}\n disabled={loading || selectableRepos.length === 0}\n >\n {selectableRepos.map((repo) => (\n <option key={repo} value={repo}>\n {getBaseName(repo)}\n </option>\n ))}\n </select>\n <ChevronDown className=\"pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-500 dark:text-slate-500\" />\n </div>\n <span className=\"truncate font-mono text-[11px] text-slate-500 dark:text-slate-400\" title={selectedRepo}>\n {selectedRepo}\n </span>\n </label>\n\n <label className=\"flex flex-col gap-2\">\n <span className=\"text-sm font-medium text-slate-700 dark:text-slate-300\">Base Branch</span>\n <div className=\"relative\">\n <select\n className=\"h-12 w-full appearance-none rounded-lg border border-slate-300 bg-white px-3 pr-10 font-mono text-sm text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/20 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100\"\n value={currentBranchName}\n onChange={handleBranchChange}\n disabled={loading}\n >\n {branches.map((branch) => (\n <option key={branch.name} value={branch.name}>\n {branch.name}\n {branch.current ? ' (checked out)' : ''}\n </option>\n ))}\n </select>\n {loading\n ? <span className=\"loading loading-spinner loading-xs absolute right-3 top-1/2 -translate-y-1/2\"></span>\n : <ChevronDown className=\"pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-500 dark:text-slate-500\" />}\n </div>\n </label>\n\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-2 text-sm font-medium text-slate-600 transition-colors hover:text-slate-900 dark:text-slate-400 dark:hover:text-white\"\n onClick={() => setShowSessionAdvanced((prev) => !prev)}\n >\n <ChevronRight className={`h-4 w-4 transition-transform ${showSessionAdvanced ? 'rotate-90' : ''}`} />\n {showSessionAdvanced ? 'Hide Advanced Setup' : collapsedSessionSetupLabel}\n </button>\n\n {showSessionAdvanced && (\n <div className=\"space-y-4 rounded-xl border border-slate-200 bg-slate-50 p-3 dark:border-[#30363d] dark:bg-[#0d1117]/55\">\n <label className=\"flex flex-col gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Start Up Command</span>\n <input\n type=\"text\"\n className=\"h-10 rounded-lg border border-slate-300 bg-white px-3 font-mono text-sm text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/20 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100\"\n placeholder=\"npm install\"\n value={startupScript}\n onChange={handleStartupScriptChange}\n onBlur={saveStartupScript}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n handleStartSession();\n }\n }}\n disabled={loading}\n />\n </label>\n\n <label className=\"flex flex-col gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Dev Server Command</span>\n <input\n type=\"text\"\n className=\"h-10 rounded-lg border border-slate-300 bg-white px-3 font-mono text-sm text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/20 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100\"\n placeholder=\"npm run dev\"\n value={devServerScript}\n onChange={handleDevServerScriptChange}\n onBlur={saveDevServerScript}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n handleStartSession();\n }\n }}\n disabled={loading}\n />\n </label>\n\n <label className=\"flex flex-col gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Session Mode</span>\n <select\n className=\"h-10 rounded-lg border border-slate-300 bg-white px-3 text-sm text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/20 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100\"\n value={sessionMode}\n onChange={handleSessionModeChange}\n disabled={loading}\n >\n <option value=\"fast\">Fast Mode (default)</option>\n <option value=\"plan\">Plan Mode</option>\n </select>\n </label>\n\n </div>\n )}\n </div>\n </div>\n\n <div className=\"rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-[#30363d] dark:bg-[#161b22] dark:shadow-[0_16px_36px_-24px_rgba(2,6,23,0.95)]\">\n <h3 className=\"mb-4 text-lg font-bold text-slate-900 dark:text-white\">Ongoing Tasks</h3>\n <div className=\"space-y-2\">\n {existingSessions.length === 0 && (\n <div className=\"rounded-lg border border-dashed border-slate-200 bg-slate-50 px-3 py-4 text-sm text-slate-500 dark:border-[#30363d] dark:bg-[#0d1117]/45 dark:text-slate-400\">\n No ongoing sessions for this repository.\n </div>\n )}\n\n {existingSessions.map((session) => (\n <div\n key={session.sessionName}\n className=\"group flex items-center gap-3 rounded-lg border border-transparent px-3 py-3 transition-colors hover:border-slate-100 hover:bg-slate-50 dark:hover:border-slate-700/70 dark:hover:bg-slate-800/50\"\n >\n <div\n className={`h-2 w-2 flex-shrink-0 rounded-full ${\n deletingSessionName === session.sessionName ? 'animate-pulse bg-amber-400' : 'bg-emerald-500'\n }`}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-slate-900 dark:text-white\">{session.title || session.sessionName}</p>\n <p className=\"truncate text-xs text-slate-500 dark:text-slate-400\">\n {getBaseName(session.repoPath)} • {session.agent}\n </p>\n </div>\n <div className=\"flex items-center gap-1 opacity-100 transition-opacity sm:opacity-0 sm:group-hover:opacity-100\">\n <button\n type=\"button\"\n className=\"rounded p-1 text-slate-400 transition-colors hover:text-primary dark:text-slate-400 dark:hover:text-primary\"\n title=\"Open\"\n onClick={() => handleResumeSession(session)}\n disabled={loading || deletingSessionName === session.sessionName}\n >\n <ExternalLink className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n className=\"rounded p-1 text-slate-400 transition-colors hover:text-amber-500 dark:text-slate-400 dark:hover:text-amber-400\"\n title=\"New Attempt\"\n onClick={() => handleNewAttemptFromSession(session)}\n disabled={loading || deletingSessionName === session.sessionName}\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n className=\"rounded p-1 text-slate-400 transition-colors hover:text-red-500 dark:text-slate-400 dark:hover:text-red-400\"\n title={deletingSessionName === session.sessionName ? 'Deleting...' : 'Delete'}\n onClick={() => handleDeleteSession(session)}\n disabled={loading || deletingSessionName === session.sessionName}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col lg:col-span-8\">\n <div className=\"flex h-full flex-col rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-[#30363d] dark:bg-[#161b22] dark:shadow-[0_16px_36px_-24px_rgba(2,6,23,0.95)]\">\n <label className=\"mb-4 flex items-center gap-2 text-lg font-bold text-slate-900 dark:text-white\" htmlFor=\"task-description\">\n <Bot className=\"h-5 w-5 text-primary\" />\n Task Description\n </label>\n\n <div className=\"group relative mb-4 flex h-[360px] flex-grow flex-col md:h-[420px]\">\n <textarea\n id=\"task-description\"\n className=\"h-full w-full resize-none rounded-xl border border-slate-200 bg-slate-50 p-5 font-mono text-sm leading-relaxed text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/30 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100 dark:placeholder:text-slate-500\"\n placeholder={`Describe the task for the AI agent...\\nExample:\\n1. Create a new component for the user profile card.\\n2. Ensure it fetches data from the /api/user endpoint.\\n3. Add error handling for failed requests.\\n\\nTip: Type @ to mention files.`}\n value={initialMessage}\n onChange={handleMessageChange}\n onKeyDown={handleKeyDown}\n onClick={(event) => {\n setCursorPosition(event.currentTarget.selectionStart);\n setShowSuggestions(false);\n }}\n onKeyUp={(event) => setCursorPosition(event.currentTarget.selectionStart)}\n disabled={loading}\n />\n\n {showSuggestions && suggestionList.length > 0 && (\n <div className=\"absolute left-3 right-3 top-[calc(100%-8rem)] z-50 max-h-48 overflow-y-auto rounded-lg border border-slate-200 bg-white shadow-lg dark:border-[#30363d] dark:bg-[#161b22]\">\n {suggestionList.map((suggestion, idx) => (\n <button\n key={suggestion}\n className={`w-full truncate border-b border-slate-100 px-3 py-2 text-left text-xs last:border-0 ${\n idx === selectedIndex\n ? 'bg-primary text-white'\n : 'text-slate-700 hover:bg-slate-50 dark:border-slate-700/60 dark:text-slate-300 dark:hover:bg-slate-800/60'\n }`}\n onMouseDown={(event) => {\n event.preventDefault();\n handleSelectSuggestion(suggestion);\n }}\n >\n {suggestion}\n </button>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"border-t border-slate-100 pt-4 dark:border-slate-700/70\">\n <div className=\"mb-3 flex flex-col items-start justify-between gap-2 sm:flex-row sm:items-center\">\n <h4 className=\"text-sm font-semibold text-slate-700 dark:text-slate-300\">Attachments</h4>\n <label\n htmlFor=\"new-session-attachments-input\"\n className=\"inline-flex cursor-pointer items-center gap-2 text-sm font-medium text-primary transition-colors hover:text-blue-700\"\n >\n <CloudDownload className=\"h-4 w-4\" />\n Select Attachments\n </label>\n <input\n id=\"new-session-attachments-input\"\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={handleFileSelect}\n disabled={loading}\n />\n </div>\n\n <div className=\"min-h-[88px] rounded-xl border-2 border-dashed border-slate-200 bg-slate-50/70 p-3 dark:border-slate-700 dark:bg-[#0d1117]/40\">\n <div className=\"flex flex-wrap gap-3\">\n {attachments.map((file, idx) => (\n <div key={`upload-${idx}`} className=\"group relative w-20\">\n <div className=\"relative flex h-20 w-20 items-center justify-center rounded-lg border border-slate-200 bg-white dark:border-slate-700 dark:bg-slate-800\">\n <span className=\"px-2 text-center text-[11px] font-medium text-slate-700 dark:text-slate-200\">{file.name.split('.').pop()?.toUpperCase() || 'FILE'}</span>\n <button\n type=\"button\"\n className=\"absolute right-1 top-1 rounded-full bg-slate-100 p-0.5 text-slate-500 opacity-0 transition hover:text-red-500 group-hover:opacity-100 dark:bg-slate-700 dark:text-slate-400 dark:hover:text-red-400\"\n onClick={() => removeAttachment(idx)}\n title=\"Remove attachment\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n <span className=\"mt-1 block truncate text-center text-[10px] text-slate-600 dark:text-slate-400\">{file.name}</span>\n </div>\n ))}\n\n {prefilledAttachmentNames.map((name, idx) => (\n <div key={`prefill-${name}-${idx}`} className=\"group relative w-20\">\n <div className=\"relative flex h-20 w-20 items-center justify-center rounded-lg border border-slate-200 bg-white dark:border-slate-700 dark:bg-slate-800\">\n <span className=\"px-2 text-center text-[11px] font-medium text-slate-700 dark:text-slate-200\">\n {name.split('.').pop()?.toUpperCase() || 'FILE'}\n </span>\n <button\n type=\"button\"\n className=\"absolute right-1 top-1 rounded-full bg-slate-100 p-0.5 text-slate-500 opacity-0 transition hover:text-red-500 group-hover:opacity-100 dark:bg-slate-700 dark:text-slate-400 dark:hover:text-red-400\"\n onClick={() => removePrefilledAttachment(idx)}\n title=\"Remove carried attachment\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n <span className=\"mt-1 block truncate text-center text-[10px] text-slate-600 dark:text-slate-400\">{name}</span>\n </div>\n ))}\n\n <label\n htmlFor=\"new-session-attachments-input\"\n className=\"flex h-20 w-20 cursor-pointer flex-col items-center justify-center rounded-lg border-2 border-dashed border-slate-300 text-slate-400 transition hover:border-primary hover:bg-primary/5 hover:text-primary dark:border-slate-700 dark:text-slate-500\"\n >\n <Plus className=\"h-4 w-4\" />\n <span className=\"text-[9px] font-semibold uppercase\">Add File</span>\n </label>\n </div>\n </div>\n\n <div className=\"mt-2 text-xs text-slate-500 dark:text-slate-400\">Paste files from clipboard with Cmd/Ctrl+V anywhere on this page.</div>\n </div>\n\n <div className=\"mt-6 flex items-center justify-end gap-3 border-t border-slate-100 pt-5 dark:border-slate-700/70\">\n <span className=\"mr-auto hidden text-xs text-slate-400 dark:text-slate-500 sm:block\">\n Press <kbd className=\"rounded border border-slate-200 bg-slate-100 px-2 py-1 font-sans text-[11px] dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300\">Ctrl + Enter</kbd> to submit\n </span>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-2 rounded-lg bg-primary px-5 py-2 text-sm font-semibold text-white shadow-md shadow-primary/20 transition hover:bg-blue-600 disabled:cursor-not-allowed disabled:opacity-70\"\n onClick={handleStartSession}\n disabled={loading}\n >\n {loading ? <span className=\"loading loading-spinner loading-xs\"></span> : 'Create New Task'}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'new' && !selectedRepo && !!repoPath && !error && (\n <div className=\"w-full max-w-2xl rounded-2xl border border-slate-200 bg-white p-8 shadow-sm dark:border-[#30363d] dark:bg-[#161b22] dark:shadow-[0_16px_36px_-24px_rgba(2,6,23,0.95)]\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <h2 className=\"text-lg font-semibold text-slate-900 dark:text-white\">Loading repository...</h2>\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">Preparing your task workspace.</p>\n </div>\n </div>\n )}\n\n {mode === 'new' && isInstallingAgentCli && installingAgentCli && (\n <div className=\"fixed inset-0 z-[1000] flex items-center justify-center bg-base-content/45 px-4\">\n <div className=\"w-full max-w-md rounded-xl border border-base-300 bg-base-100 p-6 shadow-2xl\">\n <div className=\"flex items-center gap-4\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <div className=\"space-y-1\">\n <h3 className=\"text-lg font-semibold\">Installing {AGENT_CLI_LABELS[installingAgentCli]}</h3>\n <p className=\"text-sm opacity-70\">\n Please wait while we install the coding agent CLI.\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'new' && isLoginModalOpen && loginAgentCli && (\n <div className=\"fixed inset-0 z-[1001] flex items-center justify-center bg-base-content/60 p-4\">\n <div className=\"w-full max-w-5xl rounded-xl border border-base-300 bg-base-100 shadow-2xl\">\n <div className=\"space-y-4 p-5 md:p-6\">\n <h3 className=\"text-xl font-semibold\">Login Required</h3>\n <p className=\"text-sm opacity-80\">\n {AGENT_CLI_LABELS[loginAgentCli]} has been installed. Complete login in the terminal below, then click Done to continue.\n </p>\n <p className=\"text-xs opacity-60\">\n Command: <span className=\"font-mono\">{loginCommand}</span>\n </p>\n\n <div className=\"h-[420px] overflow-hidden rounded-lg border border-base-300 bg-base-200\">\n <iframe\n ref={loginTerminalRef}\n src=\"/terminal\"\n className=\"h-full w-full border-none\"\n allow=\"clipboard-read; clipboard-write\"\n onLoad={handleLoginTerminalLoad}\n />\n </div>\n\n {loginModalError && (\n <div className=\"alert alert-error text-sm py-2\">\n {loginModalError}\n </div>\n )}\n\n {!loginModalError && (\n <div className=\"text-xs opacity-70\">\n {loginCommandInjected\n ? 'Login command was sent to the terminal automatically.'\n : 'Waiting for terminal to initialize...'}\n </div>\n )}\n\n <div className=\"flex justify-end\">\n <button\n className=\"btn btn-primary\"\n onClick={() => void handleLoginDone()}\n disabled={loading}\n >\n Done\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'new' && !selectedRepo && (!repoPath || !!error) && (\n <div className=\"card w-full max-w-2xl bg-base-200 shadow-xl\">\n <div className=\"card-body\">\n <h2 className=\"card-title flex items-center gap-2\">\n <FolderGit2 className=\"w-6 h-6 text-primary\" />\n Git Repository Selector\n </h2>\n {isResolvingRepoFromName ? (\n <div className=\"alert text-sm py-2 px-3 mt-2 flex items-center gap-2\">\n <span className=\"loading loading-spinner loading-sm\"></span>\n {fromRepoName\n ? `Searching for repository \"${fromRepoName}\"...`\n : 'Searching for repository...'}\n </div>\n ) : error ? (\n <div className=\"alert alert-error text-sm py-2 px-3 mt-2\">{error}</div>\n ) : (\n <div className=\"text-sm opacity-70 mt-2\">No repository specified.</div>\n )}\n <div className=\"mt-4\">\n <button className=\"btn btn-primary btn-sm\" onClick={() => router.push('/')}>\n Choose Repository\n </button>\n </div>\n </div>\n </div>\n )}\n\n\n {mode === 'home' && isBrowsing && (\n <FileBrowser\n initialPath={config?.defaultRoot || undefined}\n onSelect={handleSelectRepo}\n onCancel={() => setIsBrowsing(false)}\n checkRepo={checkIsGitRepo}\n />\n )}\n\n {mode === 'home' && isSelectingRoot && (\n <FileBrowser\n title=\"Default Root Folder\"\n initialPath={config?.defaultRoot || undefined}\n onSelect={handleSetDefaultRoot}\n onCancel={() => setIsSelectingRoot(false)}\n />\n )}\n </>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40d2d821b71a316b5b956e0d68b23a20ba8ba078cf\":\"listDirectories\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_2=/*#__PURE__*/createServerReference(\"40d2d821b71a316b5b956e0d68b23a20ba8ba078cf\",callServer,void 0,findSourceMapURL,\"listDirectories\");export{$$RSC_SERVER_ACTION_2 as listDirectories};","'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { checkDirectoryAccessible, listDirectories, getHomeDirectory } from '@/app/actions/git';\nimport { Folder, ArrowLeft, Check } from 'lucide-react';\nimport { getDirName } from '@/lib/path';\nimport { useDialogKeyboardShortcuts } from '@/hooks/useDialogKeyboardShortcuts';\n\ninterface FileSystemItem {\n name: string;\n path: string;\n isDirectory: boolean;\n isGitRepo: boolean;\n}\n\ninterface FileBrowserProps {\n title?: string;\n initialPath?: string;\n onSelect: (path: string) => void | Promise<unknown>;\n onCancel: () => void;\n checkRepo?: (path: string) => Promise<boolean>;\n}\n\nexport default function FileBrowser({ title, initialPath, onSelect, onCancel, checkRepo }: FileBrowserProps) {\n const [currentPath, setCurrentPath] = useState<string>('');\n const [homePath, setHomePath] = useState<string>('');\n const [items, setItems] = useState<FileSystemItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let isMounted = true;\n\n const init = async () => {\n try {\n const home = await getHomeDirectory();\n if (!isMounted) return;\n\n setHomePath(home);\n setCurrentPath(initialPath || home);\n } catch (err) {\n console.error('Failed to resolve home directory:', err);\n if (!isMounted) return;\n setError('Failed to access your home directory.');\n setCurrentPath(initialPath || '/');\n }\n };\n\n void init();\n\n return () => {\n isMounted = false;\n };\n }, [initialPath]);\n\n useEffect(() => {\n if (!currentPath) return;\n\n let isMounted = true;\n\n const fetchItems = async () => {\n setLoading(true);\n setError(null);\n try {\n const dirs = await listDirectories(currentPath);\n if (!isMounted) return;\n\n if (dirs.length === 0 && homePath && currentPath !== homePath) {\n const accessible = await checkDirectoryAccessible(currentPath);\n if (!isMounted) return;\n\n if (!accessible) {\n setError(`Could not access \"${currentPath}\". Showing home directory.`);\n setCurrentPath(homePath);\n return;\n }\n }\n\n const mapped: FileSystemItem[] = dirs.map(d => ({\n name: d.name,\n path: d.path,\n isDirectory: d.isDirectory,\n isGitRepo: d.isGitRepo\n }));\n setItems(mapped);\n } catch (err) {\n console.error(err);\n if (!isMounted) return;\n\n if (homePath && currentPath !== homePath) {\n setError(`Could not access \"${currentPath}\". Showing home directory.`);\n setCurrentPath(homePath);\n return;\n }\n\n setItems([]);\n setError('Failed to load directory contents');\n } finally {\n if (isMounted) {\n setLoading(false);\n }\n }\n };\n\n void fetchItems();\n\n return () => {\n isMounted = false;\n };\n }, [currentPath, homePath]);\n\n const handleSelectPath = useCallback(async (path: string) => {\n if (checkRepo) {\n const isValid = await checkRepo(path);\n if (!isValid) {\n setError(\"Selected directory is not a valid git repository.\");\n // Clear error after 3 seconds\n setTimeout(() => setError(null), 3000);\n return;\n }\n }\n await onSelect(path);\n }, [checkRepo, onSelect]);\n\n const handleSelect = useCallback(async () => {\n await handleSelectPath(currentPath);\n }, [currentPath, handleSelectPath]);\n\n useDialogKeyboardShortcuts({\n onConfirm: handleSelect,\n onDismiss: onCancel,\n canConfirm: Boolean(currentPath),\n });\n\n const handleNavigate = (path: string) => {\n setCurrentPath(path);\n };\n\n const handleGoUp = () => {\n // Navigate up one directory\n // Use the cross-platform getDirName utility to handle Windows and POSIX paths.\n const parent = getDirName(currentPath);\n if (parent && parent !== currentPath) {\n setCurrentPath(parent);\n }\n };\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm p-4\">\n <div className=\"bg-base-200 rounded-lg shadow-xl w-full max-w-3xl h-[80vh] flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b border-base-300\">\n <h2 className=\"text-xl font-bold flex items-center gap-2\">\n <Folder className=\"w-5 h-5\" />\n {title || \"Browse Local Repository\"}\n </h2>\n <button onClick={onCancel} className=\"btn btn-sm btn-ghost btn-circle\">\n ✕\n </button>\n </div>\n\n {/* Current Path Bar */}\n <div className=\"flex items-center gap-2 p-3 bg-base-300\">\n <button\n onClick={handleGoUp}\n className=\"btn btn-sm btn-square btn-ghost\"\n title=\"Go Up\"\n disabled={currentPath === '/' || !currentPath}\n >\n <ArrowLeft className=\"w-4 h-4\" />\n </button>\n <div className=\"flex-1 overflow-x-auto whitespace-nowrap px-2 font-mono text-sm\">\n {currentPath}\n </div>\n <button\n onClick={handleSelect}\n className=\"btn btn-sm btn-primary\"\n >\n Select Current Folder\n </button>\n </div>\n\n {/* List Content */}\n <div className=\"flex-1 overflow-y-auto p-2\">\n {loading ? (\n <div className=\"flex justify-center items-center h-full\">\n <span className=\"loading loading-spinner loading-lg\"></span>\n </div>\n ) : error ? (\n <div className=\"alert alert-error\">{error}</div>\n ) : items.length === 0 ? (\n <div className=\"text-center text-base-content/50 mt-10\">Empty directory</div>\n ) : (\n <div className=\"grid grid-cols-1 gap-1\">\n {items.map((item) => (\n <div\n key={item.path}\n className=\"group flex items-center justify-between p-2 hover:bg-base-100 rounded-md cursor-pointer transition-colors\"\n onClick={() => handleNavigate(item.path)}\n >\n <div className=\"flex items-center gap-3 overflow-hidden\">\n <Folder className={`w-5 h-5 ${item.isGitRepo ? 'text-primary' : 'text-base-content/70'}`} />\n <span className=\"truncate\">{item.name}</span>\n {item.isGitRepo && (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-bold bg-slate-200 text-slate-600 border border-slate-300 uppercase tracking-wide\">\n GIT\n </span>\n )}\n </div>\n {item.isGitRepo && (\n <button\n className=\"flex items-center justify-center p-1.5 rounded-md bg-primary/10 text-primary hover:bg-primary hover:text-white transition-colors\"\n onClick={(e) => {\n e.stopPropagation();\n void handleSelectPath(item.path);\n }}\n title={`Select ${item.name}`}\n >\n <Check className=\"h-[18px] w-[18px]\" />\n <span className=\"sr-only\">Select</span>\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer info */}\n <div className=\"p-3 border-t border-base-300 text-xs text-base-content/50 text-center\">\n Navigate to a folder and click &quot;Select Current Folder&quot; to choose it.\n </div>\n </div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40f6a51a29791307a769eefa6ab46d52c2af27790e\":\"checkIsGitRepo\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_6=/*#__PURE__*/createServerReference(\"40f6a51a29791307a769eefa6ab46d52c2af27790e\",callServer,void 0,findSourceMapURL,\"checkIsGitRepo\");export{$$RSC_SERVER_ACTION_6 as checkIsGitRepo};","/* __next_internal_action_entry_do_not_use__ [{\"40f6164680072bd3ac5f0e2dd501140ed6e19b7d26\":\"getBranches\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_4=/*#__PURE__*/createServerReference(\"40f6164680072bd3ac5f0e2dd501140ed6e19b7d26\",callServer,void 0,findSourceMapURL,\"getBranches\");export{$$RSC_SERVER_ACTION_4 as getBranches};","/* __next_internal_action_entry_do_not_use__ [{\"601c91c8785f603eec83b24eb5bf065e4d1a35d22a\":\"checkoutBranch\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_5=/*#__PURE__*/createServerReference(\"601c91c8785f603eec83b24eb5bf065e4d1a35d22a\",callServer,void 0,findSourceMapURL,\"checkoutBranch\");export{$$RSC_SERVER_ACTION_5 as checkoutBranch};","/* __next_internal_action_entry_do_not_use__ [{\"7fc2e2ead60298e62dc6e8c6b66c8389284c086f68\":\"getStartupScript\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_16=/*#__PURE__*/createServerReference(\"7fc2e2ead60298e62dc6e8c6b66c8389284c086f68\",callServer,void 0,findSourceMapURL,\"getStartupScript\");export{$$RSC_SERVER_ACTION_16 as getStartupScript};","/* __next_internal_action_entry_do_not_use__ [{\"7f7792f0e3c5d5c94b1f1ed53bf3bd9651061032f1\":\"getDefaultDevServerScript\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_17=/*#__PURE__*/createServerReference(\"7f7792f0e3c5d5c94b1f1ed53bf3bd9651061032f1\",callServer,void 0,findSourceMapURL,\"getDefaultDevServerScript\");export{$$RSC_SERVER_ACTION_17 as getDefaultDevServerScript};","/* __next_internal_action_entry_do_not_use__ [{\"7f5645e209870767b4aa47934614f70475b1d860c1\":\"listRepoFiles\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_18=/*#__PURE__*/createServerReference(\"7f5645e209870767b4aa47934614f70475b1d860c1\",callServer,void 0,findSourceMapURL,\"listRepoFiles\");export{$$RSC_SERVER_ACTION_18 as listRepoFiles};","/* __next_internal_action_entry_do_not_use__ [{\"4064d1987b0918f62d1f1ac33e606a991b43c71161\":\"checkAgentCliInstalled\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_7=/*#__PURE__*/createServerReference(\"4064d1987b0918f62d1f1ac33e606a991b43c71161\",callServer,void 0,findSourceMapURL,\"checkAgentCliInstalled\");export{$$RSC_SERVER_ACTION_7 as checkAgentCliInstalled};","/* __next_internal_action_entry_do_not_use__ [{\"40497f856f6dd38b292eaabe85158044fed67d4546\":\"checkDirectoryAccessible\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_3=/*#__PURE__*/createServerReference(\"40497f856f6dd38b292eaabe85158044fed67d4546\",callServer,void 0,findSourceMapURL,\"checkDirectoryAccessible\");export{$$RSC_SERVER_ACTION_3 as checkDirectoryAccessible};","/* __next_internal_action_entry_do_not_use__ [{\"607dd7d9d3acf968ac4f5d0187a641c4fd651c3406\":\"cloneRemoteRepository\"},\"src/app/actions/repository.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"607dd7d9d3acf968ac4f5d0187a641c4fd651c3406\",callServer,void 0,findSourceMapURL,\"cloneRemoteRepository\");export{$$RSC_SERVER_ACTION_1 as cloneRemoteRepository};","/* __next_internal_action_entry_do_not_use__ [{\"401c302462e005eed1f3b03ae2964a3c8c62a38cc3\":\"resolveRepositoryByName\"},\"src/app/actions/repository.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"401c302462e005eed1f3b03ae2964a3c8c62a38cc3\",callServer,void 0,findSourceMapURL,\"resolveRepositoryByName\");export{$$RSC_SERVER_ACTION_0 as resolveRepositoryByName};","/* __next_internal_action_entry_do_not_use__ [{\"705343ab5665aa5483f72ff80a969f556ed3776867\":\"copySessionAttachments\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_5=/*#__PURE__*/createServerReference(\"705343ab5665aa5483f72ff80a969f556ed3776867\",callServer,void 0,findSourceMapURL,\"copySessionAttachments\");export{$$RSC_SERVER_ACTION_5 as copySessionAttachments};","/* __next_internal_action_entry_do_not_use__ [{\"70e819b9953b1cbc19bf568f714bed0e5eeb5d444e\":\"createSession\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_8=/*#__PURE__*/createServerReference(\"70e819b9953b1cbc19bf568f714bed0e5eeb5d444e\",callServer,void 0,findSourceMapURL,\"createSession\");export{$$RSC_SERVER_ACTION_8 as createSession};","/* __next_internal_action_entry_do_not_use__ [{\"40296ad3c7039c1ad7fbc1a2a6b326ab7518b6d0d6\":\"deleteSession\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_10=/*#__PURE__*/createServerReference(\"40296ad3c7039c1ad7fbc1a2a6b326ab7518b6d0d6\",callServer,void 0,findSourceMapURL,\"deleteSession\");export{$$RSC_SERVER_ACTION_10 as deleteSession};","/* __next_internal_action_entry_do_not_use__ [{\"40c65f5e655c2077aec05d886cb844ebaa578de030\":\"getSessionPrefillContext\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_4=/*#__PURE__*/createServerReference(\"40c65f5e655c2077aec05d886cb844ebaa578de030\",callServer,void 0,findSourceMapURL,\"getSessionPrefillContext\");export{$$RSC_SERVER_ACTION_4 as getSessionPrefillContext};","/* __next_internal_action_entry_do_not_use__ [{\"40934151168bfcd97cd3fb5c36e1d88f44571773df\":\"listSessions\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_7=/*#__PURE__*/createServerReference(\"40934151168bfcd97cd3fb5c36e1d88f44571773df\",callServer,void 0,findSourceMapURL,\"listSessions\");export{$$RSC_SERVER_ACTION_7 as listSessions};","/* __next_internal_action_entry_do_not_use__ [{\"6050df74d2bff4238ac40e30fca21675488bd9f406\":\"saveSessionLaunchContext\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_2=/*#__PURE__*/createServerReference(\"6050df74d2bff4238ac40e30fca21675488bd9f406\",callServer,void 0,findSourceMapURL,\"saveSessionLaunchContext\");export{$$RSC_SERVER_ACTION_2 as saveSessionLaunchContext};","/* __next_internal_action_entry_do_not_use__ [{\"60a50ea7f3cdb7c3aa973675b714915a1d03a31302\":\"updateRepoSettings\"},\"src/app/actions/config.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_3=/*#__PURE__*/createServerReference(\"60a50ea7f3cdb7c3aa973675b714915a1d03a31302\",callServer,void 0,findSourceMapURL,\"updateRepoSettings\");export{$$RSC_SERVER_ACTION_3 as updateRepoSettings};","export type RepoCardGradient = {\n backgroundImage: string;\n};\n\nconst MIN_LIGHTNESS = 86;\nconst MAX_LIGHTNESS = 94;\n\nfunction hashString(value: string): number {\n let hash = 2166136261;\n for (let i = 0; i < value.length; i += 1) {\n hash ^= value.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\nfunction normalizeName(repoName: string): string {\n return repoName.trim().toLowerCase();\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction createHsl(h: number, s: number, l: number): string {\n const hue = ((h % 360) + 360) % 360;\n const sat = clamp(s, 20, 70);\n const light = clamp(l, MIN_LIGHTNESS, MAX_LIGHTNESS);\n return `hsl(${hue} ${sat}% ${light}%)`;\n}\n\nexport function getStableRepoCardGradient(repoName: string): RepoCardGradient {\n const normalizedName = normalizeName(repoName);\n const hash = hashString(normalizedName || 'repo');\n\n const hueA = hash % 360;\n const hueB = (hueA + 35 + (hash % 75)) % 360;\n const hueC = (hueA + 220 + (hash % 60)) % 360;\n\n const satA = 32 + (hash % 16);\n const satB = 30 + ((hash >>> 5) % 16);\n const satC = 24 + ((hash >>> 10) % 14);\n\n const lightA = 90 + ((hash >>> 2) % 3);\n const lightB = 87 + ((hash >>> 6) % 4);\n const lightC = 93;\n\n return {\n backgroundImage: [\n `radial-gradient(circle at 15% 15%, ${createHsl(hueA, satA, lightA)} 0%, transparent 58%)`,\n `radial-gradient(circle at 85% 82%, ${createHsl(hueB, satB, lightB)} 0%, transparent 62%)`,\n `linear-gradient(145deg, ${createHsl(hueC, satC, lightC)} 0%, hsl(210 40% 98%) 100%)`,\n ].join(', '),\n };\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }]];\n\n/**\n * @component @name Check\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Check = createLucideIcon('check', __iconNode);\n\nexport default Check;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4', key: '4exip2' }],\n ['path', { d: 'M12 2v2', key: 'tus03m' }],\n ['path', { d: 'M12 20v2', key: '1lh1kg' }],\n ['path', { d: 'm4.93 4.93 1.41 1.41', key: '149t6j' }],\n ['path', { d: 'm17.66 17.66 1.41 1.41', key: 'ptbguv' }],\n ['path', { d: 'M2 12h2', key: '1t8f8n' }],\n ['path', { d: 'M20 12h2', key: '1q8mjw' }],\n ['path', { d: 'm6.34 17.66-1.41 1.41', key: '1m8zz5' }],\n ['path', { d: 'm19.07 4.93-1.41 1.41', key: '1shlcs' }],\n];\n\n/**\n * @component @name Sun\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiAvPgogIDxwYXRoIGQ9Ik0xMiAydjIiIC8+CiAgPHBhdGggZD0iTTEyIDIwdjIiIC8+CiAgPHBhdGggZD0ibTQuOTMgNC45MyAxLjQxIDEuNDEiIC8+CiAgPHBhdGggZD0ibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJNMiAxMmgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxMmgyIiAvPgogIDxwYXRoIGQ9Im02LjM0IDE3LjY2LTEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJtMTkuMDcgNC45My0xLjQxIDEuNDEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sun\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Sun = createLucideIcon('sun', __iconNode);\n\nexport default Sun;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm21 21-4.34-4.34', key: '14j7rj' }],\n ['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],\n];\n\n/**\n * @component @name Search\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEgMjEtNC4zNC00LjM0IiAvPgogIDxjaXJjbGUgY3g9IjExIiBjeT0iMTEiIHI9IjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/search\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Search = createLucideIcon('search', __iconNode);\n\nexport default Search;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 13v8l-4-4', key: '1f5nwf' }],\n ['path', { d: 'm12 21 4-4', key: '1lfcce' }],\n ['path', { d: 'M4.393 15.269A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.436 8.284', key: 'ui1hmy' }],\n];\n\n/**\n * @component @name CloudDownload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMTN2OGwtNC00IiAvPgogIDxwYXRoIGQ9Im0xMiAyMSA0LTQiIC8+CiAgPHBhdGggZD0iTTQuMzkzIDE1LjI2OUE3IDcgMCAxIDEgMTUuNzEgOGgxLjc5YTQuNSA0LjUgMCAwIDEgMi40MzYgOC4yODQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/cloud-download\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CloudDownload = createLucideIcon('cloud-download', __iconNode);\n\nexport default CloudDownload;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 8V4H8', key: 'hb8ula' }],\n ['rect', { width: '16', height: '12', x: '4', y: '8', rx: '2', key: 'enze0r' }],\n ['path', { d: 'M2 14h2', key: 'vft8re' }],\n ['path', { d: 'M20 14h2', key: '4cs60a' }],\n ['path', { d: 'M15 13v2', key: '1xurst' }],\n ['path', { d: 'M9 13v2', key: 'rq6x2g' }],\n];\n\n/**\n * @component @name Bot\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgOFY0SDgiIC8+CiAgPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjEyIiB4PSI0IiB5PSI4IiByeD0iMiIgLz4KICA8cGF0aCBkPSJNMiAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0xNSAxM3YyIiAvPgogIDxwYXRoIGQ9Ik05IDEzdjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/bot\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Bot = createLucideIcon('bot', __iconNode);\n\nexport default Bot;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 19a5 5 0 0 1-5-5v8', key: 'sz5oeg' }],\n [\n 'path',\n {\n d: 'M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5',\n key: '1w6njk',\n },\n ],\n ['circle', { cx: '13', cy: '12', r: '2', key: '1j92g6' }],\n ['circle', { cx: '20', cy: '19', r: '2', key: '1obnsp' }],\n];\n\n/**\n * @component @name FolderGit2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggMTlhNSA1IDAgMCAxLTUtNXY4IiAvPgogIDxwYXRoIGQ9Ik05IDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2NSIgLz4KICA8Y2lyY2xlIGN4PSIxMyIgY3k9IjEyIiByPSIyIiAvPgogIDxjaXJjbGUgY3g9IjIwIiBjeT0iMTkiIHI9IjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/folder-git-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FolderGit2 = createLucideIcon('folder-git-2', __iconNode);\n\nexport default FolderGit2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401',\n key: 'kfwtm',\n },\n ],\n];\n\n/**\n * @component @name Moon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAuOTg1IDEyLjQ4NmE5IDkgMCAxIDEtOS40NzMtOS40NzJjLjQwNS0uMDIyLjYxNy40Ni40MDIuODAzYTYgNiAwIDAgMCA4LjI2OCA4LjI2OGMuMzQ0LS4yMTUuODI1LS4wMDQuODAzLjQwMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/moon\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Moon = createLucideIcon('moon', __iconNode);\n\nexport default Moon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOS42NzEgNC4xMzZhMi4zNCAyLjM0IDAgMCAxIDQuNjU5IDAgMi4zNCAyLjM0IDAgMCAwIDMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMSAyLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwIDMuODMxIDIuMzQgMi4zNCAwIDAgMS0yLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMC0zLjMxOSAxLjkxNSAyLjM0IDIuMzQgMCAwIDEtNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAtMy4zMi0xLjkxNSAyLjM0IDIuMzQgMCAwIDEtMi4zMy00LjAzMyAyLjM0IDIuMzQgMCAwIDAgMC0zLjgzMUEyLjM0IDIuMzQgMCAwIDEgNi4zNSA2LjA1MWEyLjM0IDIuMzQgMCAwIDAgMy4zMTktMS45MTUiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.3 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.98a2 2 0 0 1 1.69.9l.66 1.2A2 2 0 0 0 12 6h8a2 2 0 0 1 2 2v3.3',\n key: '128dxu',\n },\n ],\n ['path', { d: 'm14.305 19.53.923-.382', key: '3m78fa' }],\n ['path', { d: 'm15.228 16.852-.923-.383', key: 'npixar' }],\n ['path', { d: 'm16.852 15.228-.383-.923', key: '5xggr7' }],\n ['path', { d: 'm16.852 20.772-.383.924', key: 'dpfhf9' }],\n ['path', { d: 'm19.148 15.228.383-.923', key: '1reyyz' }],\n ['path', { d: 'm19.53 21.696-.382-.924', key: '1goivc' }],\n ['path', { d: 'm20.772 16.852.924-.383', key: 'htqkph' }],\n ['path', { d: 'm20.772 19.148.924.383', key: '9w9pjp' }],\n ['circle', { cx: '18', cy: '18', r: '3', key: '1xkwt0' }],\n];\n\n/**\n * @component @name FolderCog\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuMyAyMEg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOThhMiAyIDAgMCAxIDEuNjkuOWwuNjYgMS4yQTIgMiAwIDAgMCAxMiA2aDhhMiAyIDAgMCAxIDIgMnYzLjMiIC8+CiAgPHBhdGggZD0ibTE0LjMwNSAxOS41My45MjMtLjM4MiIgLz4KICA8cGF0aCBkPSJtMTUuMjI4IDE2Ljg1Mi0uOTIzLS4zODMiIC8+CiAgPHBhdGggZD0ibTE2Ljg1MiAxNS4yMjgtLjM4My0uOTIzIiAvPgogIDxwYXRoIGQ9Im0xNi44NTIgMjAuNzcyLS4zODMuOTI0IiAvPgogIDxwYXRoIGQ9Im0xOS4xNDggMTUuMjI4LjM4My0uOTIzIiAvPgogIDxwYXRoIGQ9Im0xOS41MyAyMS42OTYtLjM4Mi0uOTI0IiAvPgogIDxwYXRoIGQ9Im0yMC43NzIgMTYuODUyLjkyNC0uMzgzIiAvPgogIDxwYXRoIGQ9Im0yMC43NzIgMTkuMTQ4LjkyNC4zODMiIC8+CiAgPGNpcmNsZSBjeD0iMTgiIGN5PSIxOCIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/folder-cog\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FolderCog = createLucideIcon('folder-cog', __iconNode);\n\nexport default FolderCog;\n"],"names":[],"mappings":"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","ignoreList":[22,23,24,25,26,27,28,29,30,31]}
1
+ {"version":3,"sources":["../../../../src/components/GitRepoSelector.tsx","../../../../src/app/actions/data%3A45ae17%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aabe8b2%20%3Ctext/javascript%3E","../../../../src/components/FileBrowser.tsx","../../../../src/app/actions/data%3A0552f3%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A203a37%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aa80d03%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Afa8555%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A29f8f0%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A0f7cc7%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A13022b%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Afa6449%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ad019ce%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ae2f60c%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A988620%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A3802cc%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Adbfec7%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Af6010e%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A2f4284%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A0f6fbc%20%3Ctext/javascript%3E","../../../../node_modules/lucide-react/src/icons/check.ts","../../../../node_modules/lucide-react/src/icons/sun.ts","../../../../node_modules/lucide-react/src/icons/search.ts","../../../../node_modules/lucide-react/src/icons/cloud-download.ts","../../../../node_modules/lucide-react/src/icons/monitor.ts","../../../../node_modules/lucide-react/src/icons/bot.ts","../../../../node_modules/lucide-react/src/icons/folder-git-2.ts","../../../../src/lib/repo-card-gradient.ts","../../../../node_modules/lucide-react/src/icons/settings.ts","../../../../node_modules/lucide-react/src/icons/folder-cog.ts","../../../../node_modules/lucide-react/src/icons/moon.ts"],"sourcesContent":["'use client';\n\nimport React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { FolderGit2, Plus, X, ChevronRight, ChevronDown, FolderCog, Bot, Trash2, KeyRound, Settings, ExternalLink, CloudDownload, Search, Monitor, Sun, Moon } from 'lucide-react';\nimport FileBrowser from './FileBrowser';\nimport {\n checkIsGitRepo,\n getBranches,\n checkoutBranch,\n GitBranch,\n startTtydProcess,\n getStartupScript,\n getDefaultDevServerScript,\n listRepoFiles,\n checkAgentCliInstalled,\n installAgentCli,\n SupportedAgentCli,\n} from '@/app/actions/git';\nimport { cloneRemoteRepository, resolveRepositoryByName } from '@/app/actions/repository';\nimport { createSession, deleteSession, getSessionPrefillContext, listSessions, saveSessionLaunchContext, SessionMetadata } from '@/app/actions/session';\nimport { getConfig, updateConfig, updateRepoSettings, Config } from '@/app/actions/config';\nimport { listAgentApiCredentials, listCredentials } from '@/app/actions/credentials';\nimport type { Credential } from '@/lib/credentials';\nimport { useRouter } from 'next/navigation';\nimport { getBaseName } from '@/lib/path';\nimport { getStableRepoCardGradient } from '@/lib/repo-card-gradient';\nimport { notifySessionsUpdated, SESSIONS_UPDATED_EVENT, SESSIONS_UPDATED_STORAGE_KEY } from '@/lib/session-updates';\nimport Image from 'next/image';\nimport { useDialogKeyboardShortcuts } from '@/hooks/useDialogKeyboardShortcuts';\nimport SessionFileBrowser from './SessionFileBrowser';\n\ntype SessionMode = 'fast' | 'plan';\ntype RepoCredentialSelection = 'auto' | string;\ntype ThemeMode = 'auto' | 'light' | 'dark';\nconst DEFAULT_REPO_STARTUP_COMMAND = 'npm install';\nconst DEFAULT_REPO_DEV_SERVER_COMMAND = 'npm run dev';\nconst THEME_MODE_STORAGE_KEY = 'viba:theme-mode';\nconst THEME_MODE_SEQUENCE: ThemeMode[] = ['auto', 'light', 'dark'];\n\nfunction getCredentialOptionLabel(credential: Credential): string {\n if (credential.type === 'github') {\n return `GitHub - ${credential.username}`;\n }\n\n let host = credential.serverUrl;\n try {\n host = new URL(credential.serverUrl).host;\n } catch {\n // Keep raw server URL if parsing fails.\n }\n\n return `GitLab - ${credential.username} @ ${host}`;\n}\n\nconst SESSION_MODE_STORAGE_KEY = 'viba:new-session-mode';\nconst SESSION_TITLE_MAX_LENGTH = 120;\nconst AGENT_LOGIN_COMMANDS: Record<SupportedAgentCli, string> = {\n codex: 'codex',\n};\nconst AGENT_CLI_LABELS: Record<SupportedAgentCli, string> = {\n codex: 'Codex CLI',\n};\n\ntype TerminalWindow = Window & {\n term?: {\n paste: (text: string) => void;\n };\n};\n\ntype GitRepoSelectorProps = {\n mode?: 'home' | 'new';\n repoPath?: string | null;\n fromRepoName?: string | null;\n prefillFromSession?: string | null;\n};\n\nfunction deriveSessionTitleFromTaskDescription(taskDescription: string): string | undefined {\n const firstNonEmptyLine = taskDescription\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => line.length > 0);\n\n if (!firstNonEmptyLine) return undefined;\n return firstNonEmptyLine.slice(0, SESSION_TITLE_MAX_LENGTH);\n}\n\nexport default function GitRepoSelector({\n mode = 'home',\n repoPath = null,\n fromRepoName = null,\n prefillFromSession = null,\n}: GitRepoSelectorProps) {\n const [isBrowsing, setIsBrowsing] = useState(false);\n const [isSelectingRoot, setIsSelectingRoot] = useState(false);\n const [isRepoSettingsDialogOpen, setIsRepoSettingsDialogOpen] = useState(false);\n const [isCloneRemoteDialogOpen, setIsCloneRemoteDialogOpen] = useState(false);\n const [remoteRepoUrl, setRemoteRepoUrl] = useState('');\n const [cloneCredentialSelection, setCloneCredentialSelection] = useState<RepoCredentialSelection>('auto');\n const [cloneRemoteError, setCloneRemoteError] = useState<string | null>(null);\n const [isCloningRemote, setIsCloningRemote] = useState(false);\n const [isLoadingCloneCredentialOptions, setIsLoadingCloneCredentialOptions] = useState(false);\n const [themeMode, setThemeMode] = useState<ThemeMode>('auto');\n const [isDarkThemeActive, setIsDarkThemeActive] = useState(false);\n\n const [config, setConfig] = useState<Config | null>(null);\n\n const [selectedRepo, setSelectedRepo] = useState<string | null>(null);\n const [repoForSettings, setRepoForSettings] = useState<string | null>(null);\n const [repoCredentialSelection, setRepoCredentialSelection] = useState<RepoCredentialSelection>('auto');\n const [repoStartupCommand, setRepoStartupCommand] = useState<string>(DEFAULT_REPO_STARTUP_COMMAND);\n const [repoDevServerCommand, setRepoDevServerCommand] = useState<string>(DEFAULT_REPO_DEV_SERVER_COMMAND);\n const [credentialOptions, setCredentialOptions] = useState<Credential[]>([]);\n\n const router = useRouter();\n\n const [branches, setBranches] = useState<GitBranch[]>([]);\n const [currentBranchName, setCurrentBranchName] = useState<string>('');\n const [existingSessions, setExistingSessions] = useState<SessionMetadata[]>([]);\n const [allSessions, setAllSessions] = useState<SessionMetadata[]>([]);\n\n const [startupScript, setStartupScript] = useState<string>('');\n const [devServerScript, setDevServerScript] = useState<string>('');\n const [showSessionAdvanced, setShowSessionAdvanced] = useState(false);\n const [initialMessage, setInitialMessage] = useState<string>('');\n const [sessionMode, setSessionMode] = useState<SessionMode>('fast');\n const [attachments, setAttachments] = useState<string[]>([]);\n const [isAttachmentBrowserOpen, setIsAttachmentBrowserOpen] = useState(false);\n const [lastAttachmentBrowserPath, setLastAttachmentBrowserPath] = useState<string>('');\n const [prefilledAttachmentPaths, setPrefilledAttachmentPaths] = useState<string[]>([]);\n const [hasAppliedPrefill, setHasAppliedPrefill] = useState(false);\n\n const [loading, setLoading] = useState(false);\n const [deletingSessionName, setDeletingSessionName] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [isResolvingRepoFromName, setIsResolvingRepoFromName] = useState(false);\n const [isLoaded, setIsLoaded] = useState(false);\n const [isInstallingAgentCli, setIsInstallingAgentCli] = useState(false);\n const [installingAgentCli, setInstallingAgentCli] = useState<SupportedAgentCli | null>(null);\n const [isLoginModalOpen, setIsLoginModalOpen] = useState(false);\n const [loginAgentCli, setLoginAgentCli] = useState<SupportedAgentCli | null>(null);\n const [loginCommand, setLoginCommand] = useState('');\n const [homeSearchQuery, setHomeSearchQuery] = useState('');\n const [loginCommandInjected, setLoginCommandInjected] = useState(false);\n const [loginModalError, setLoginModalError] = useState<string | null>(null);\n const [repoSettingsError, setRepoSettingsError] = useState<string | null>(null);\n const [isLoadingCredentialOptions, setIsLoadingCredentialOptions] = useState(false);\n const [isSavingRepoSettings, setIsSavingRepoSettings] = useState(false);\n const loginTerminalRef = useRef<HTMLIFrameElement>(null);\n\n const collapsedSessionSetupLabel = 'Show Session Setup';\n\n const notifySessionsChanged = useCallback(() => {\n notifySessionsUpdated();\n }, []);\n\n const refreshSessionData = useCallback(async (repo: string | null = selectedRepo) => {\n try {\n const [allSess, repoSess] = await Promise.all([\n listSessions(),\n repo ? listSessions(repo) : Promise.resolve([] as SessionMetadata[]),\n ]);\n setAllSessions(allSess);\n if (repo) {\n setExistingSessions(repoSess);\n }\n } catch (e) {\n console.error('Failed to refresh sessions', e);\n }\n }, [selectedRepo]);\n\n const resolveRepoCredentialSelection = useCallback((repo: string, credentials: Credential[] = credentialOptions): RepoCredentialSelection => {\n const repoSettings = config?.repoSettings?.[repo];\n if (!repoSettings) return 'auto';\n\n if (repoSettings.credentialId) {\n return repoSettings.credentialId;\n }\n\n const legacyPreference = repoSettings.credentialPreference;\n if (legacyPreference === 'github' || legacyPreference === 'gitlab') {\n const matched = credentials.find((credential) => credential.type === legacyPreference);\n if (matched) return matched.id;\n }\n\n return 'auto';\n }, [config, credentialOptions]);\n\n const getRepoCredentialLabel = useCallback((repo: string): string => {\n const repoSettings = config?.repoSettings?.[repo];\n if (!repoSettings) return 'Auto';\n\n if (repoSettings.credentialId) {\n const matched = credentialOptions.find((credential) => credential.id === repoSettings.credentialId);\n return matched ? getCredentialOptionLabel(matched) : 'Selected credential';\n }\n\n if (repoSettings.credentialPreference === 'github') return 'GitHub (legacy)';\n if (repoSettings.credentialPreference === 'gitlab') return 'GitLab (legacy)';\n\n return 'Auto';\n }, [config, credentialOptions]);\n\n const dismissRepoSettingsDialog = useCallback(() => {\n if (isSavingRepoSettings) return;\n setIsRepoSettingsDialogOpen(false);\n setRepoForSettings(null);\n setRepoCredentialSelection('auto');\n setRepoStartupCommand(DEFAULT_REPO_STARTUP_COMMAND);\n setRepoDevServerCommand(DEFAULT_REPO_DEV_SERVER_COMMAND);\n setRepoSettingsError(null);\n setIsLoadingCredentialOptions(false);\n }, [isSavingRepoSettings]);\n\n const openCloneRemoteDialog = useCallback(() => {\n setIsCloneRemoteDialogOpen(true);\n setRemoteRepoUrl('');\n setCloneCredentialSelection('auto');\n setCloneRemoteError(null);\n setIsLoadingCloneCredentialOptions(true);\n\n void (async () => {\n try {\n const result = await listCredentials();\n if (!result.success) {\n setCloneRemoteError(result.error);\n return;\n }\n\n setCredentialOptions(result.credentials);\n } catch (error) {\n console.error(error);\n setCloneRemoteError('Failed to load credentials.');\n } finally {\n setIsLoadingCloneCredentialOptions(false);\n }\n })();\n }, []);\n\n const dismissCloneRemoteDialog = useCallback(() => {\n if (isCloningRemote) return;\n setIsCloneRemoteDialogOpen(false);\n setRemoteRepoUrl('');\n setCloneCredentialSelection('auto');\n setCloneRemoteError(null);\n setIsLoadingCloneCredentialOptions(false);\n }, [isCloningRemote]);\n\n // Load config and all sessions on mount\n useEffect(() => {\n const loadData = async () => {\n try {\n const [cfg, sessions, credentialsResult] = await Promise.all([\n getConfig(),\n listSessions(),\n listCredentials(),\n ]);\n setConfig(cfg);\n setAllSessions(sessions);\n if (credentialsResult.success) {\n setCredentialOptions(credentialsResult.credentials);\n }\n } catch (e) {\n console.error('Failed to load data', e);\n } finally {\n setIsLoaded(true);\n }\n };\n loadData();\n }, []);\n\n useEffect(() => {\n try {\n const storedMode = window.localStorage.getItem(THEME_MODE_STORAGE_KEY);\n if (storedMode === 'light' || storedMode === 'dark' || storedMode === 'auto') {\n setThemeMode(storedMode);\n return;\n }\n } catch {\n // Ignore localStorage errors and keep default theme mode.\n }\n setThemeMode('auto');\n }, []);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const resolveDarkMode = () => themeMode === 'dark' || (themeMode === 'auto' && mediaQuery.matches);\n const applyThemeMode = () => {\n const shouldUseDark = resolveDarkMode();\n document.documentElement.classList.toggle('dark', shouldUseDark);\n document.documentElement.dataset.themeMode = themeMode;\n setIsDarkThemeActive(shouldUseDark);\n };\n\n applyThemeMode();\n\n try {\n window.localStorage.setItem(THEME_MODE_STORAGE_KEY, themeMode);\n } catch {\n // Ignore localStorage errors.\n }\n\n if (themeMode !== 'auto') {\n return;\n }\n\n const handleThemeChange = () => {\n applyThemeMode();\n };\n\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', handleThemeChange);\n return () => {\n mediaQuery.removeEventListener('change', handleThemeChange);\n };\n }\n\n mediaQuery.addListener(handleThemeChange);\n return () => {\n mediaQuery.removeListener(handleThemeChange);\n };\n }, [themeMode]);\n\n useEffect(() => {\n if (mode !== 'new') return;\n\n try {\n const storedMode = window.localStorage.getItem(SESSION_MODE_STORAGE_KEY);\n if (storedMode === 'fast' || storedMode === 'plan') {\n setSessionMode(storedMode);\n }\n } catch {\n // Ignore localStorage errors.\n }\n }, [mode]);\n\n useEffect(() => {\n const refresh = () => {\n const repoForList = mode === 'new' ? selectedRepo : null;\n void refreshSessionData(repoForList);\n };\n\n const handleStorage = (event: StorageEvent) => {\n if (event.key === SESSIONS_UPDATED_STORAGE_KEY) {\n refresh();\n }\n };\n\n const handleFocus = () => {\n refresh();\n };\n\n const handleSessionsUpdated = () => {\n refresh();\n };\n\n window.addEventListener('storage', handleStorage);\n window.addEventListener('focus', handleFocus);\n window.addEventListener(SESSIONS_UPDATED_EVENT, handleSessionsUpdated);\n\n return () => {\n window.removeEventListener('storage', handleStorage);\n window.removeEventListener('focus', handleFocus);\n window.removeEventListener(SESSIONS_UPDATED_EVENT, handleSessionsUpdated);\n };\n }, [mode, refreshSessionData, selectedRepo]);\n\n const loadSelectedRepoData = async (path: string) => {\n setSelectedRepo(path);\n setRepoFilesCache([]);\n\n // Load saved session scripts\n await loadSavedAgentSettings(path);\n\n // Load branches\n await loadBranches(path);\n\n await refreshSessionData(path);\n };\n\n const handleSelectRepo = async (path: string) => {\n setLoading(true);\n setError(null);\n try {\n const isValid = await checkIsGitRepo(path);\n if (!isValid) {\n setError('Selected directory is not a valid git repository.');\n return false;\n }\n\n const currentConfig = config || await getConfig();\n let newRecent = [...currentConfig.recentRepos];\n if (!newRecent.includes(path)) {\n newRecent.unshift(path);\n } else {\n // Move to top\n newRecent = [path, ...newRecent.filter(r => r !== path)];\n }\n\n // Update config\n const newConfig = await updateConfig({ recentRepos: newRecent });\n setConfig(newConfig);\n\n setIsBrowsing(false);\n\n if (mode === 'home') {\n router.push(`/new?repo=${encodeURIComponent(path)}`);\n return true;\n }\n\n await loadSelectedRepoData(path);\n return true;\n } catch (err) {\n console.error(err);\n setError('Failed to open repository.');\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n const handleCloneRemoteRepo = async () => {\n if (isCloningRemote) return;\n\n const trimmedRemoteUrl = remoteRepoUrl.trim();\n if (!trimmedRemoteUrl) {\n setCloneRemoteError('Please enter a remote repository URL.');\n return;\n }\n\n setIsCloningRemote(true);\n setCloneRemoteError(null);\n setError(null);\n\n try {\n const result = await cloneRemoteRepository(\n trimmedRemoteUrl,\n cloneCredentialSelection === 'auto' ? null : cloneCredentialSelection,\n );\n\n if (!result.success || !result.repoPath) {\n setCloneRemoteError(result.error || 'Failed to clone repository.');\n return;\n }\n\n const opened = await handleSelectRepo(result.repoPath);\n if (!opened) {\n setCloneRemoteError('Repository was cloned, but failed to open it.');\n return;\n }\n\n setIsCloneRemoteDialogOpen(false);\n setRemoteRepoUrl('');\n setCloneCredentialSelection('auto');\n setCloneRemoteError(null);\n } catch (error) {\n console.error(error);\n setCloneRemoteError('Failed to clone repository.');\n } finally {\n setIsCloningRemote(false);\n }\n };\n\n const handleCurrentRepoChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (mode !== 'new') return;\n\n const nextRepo = e.target.value;\n if (!nextRepo || nextRepo === selectedRepo) return;\n\n const changed = await handleSelectRepo(nextRepo);\n if (!changed) return;\n\n const params = new URLSearchParams();\n params.set('repo', nextRepo);\n if (prefillFromSession) {\n params.set('prefillFromSession', prefillFromSession);\n }\n\n router.replace(`/new?${params.toString()}`);\n };\n\n useEffect(() => {\n if (mode !== 'new') return;\n\n if (!repoPath) {\n setSelectedRepo(null);\n setExistingSessions([]);\n setBranches([]);\n setCurrentBranchName('');\n return;\n }\n\n if (repoPath === selectedRepo) return;\n void handleSelectRepo(repoPath);\n // `handleSelectRepo` is intentionally excluded to avoid retriggering from function identity changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mode, repoPath, selectedRepo]);\n\n useEffect(() => {\n if (mode !== 'new' || !selectedRepo) return;\n setLastAttachmentBrowserPath((prev) => prev || selectedRepo);\n }, [mode, selectedRepo]);\n\n useEffect(() => {\n if (mode !== 'new') return;\n if (repoPath) {\n setIsResolvingRepoFromName(false);\n return;\n }\n\n const trimmedFromRepoName = fromRepoName?.trim() ?? '';\n if (!trimmedFromRepoName) {\n setIsResolvingRepoFromName(false);\n return;\n }\n\n let isCancelled = false;\n\n const resolveFromRepoName = async () => {\n setError(null);\n setIsResolvingRepoFromName(true);\n\n const result = await resolveRepositoryByName(trimmedFromRepoName);\n if (isCancelled) return;\n\n if (!result.success) {\n setError(result.error || 'Failed to search repositories.');\n setIsResolvingRepoFromName(false);\n return;\n }\n\n if (!result.repoPath) {\n setError(`Could not find a matching repository for \"${trimmedFromRepoName}\".`);\n setIsResolvingRepoFromName(false);\n return;\n }\n\n const params = new URLSearchParams();\n params.set('repo', result.repoPath);\n if (prefillFromSession) {\n params.set('prefillFromSession', prefillFromSession);\n }\n router.replace(`/new?${params.toString()}`);\n };\n\n void resolveFromRepoName();\n\n return () => {\n isCancelled = true;\n };\n }, [fromRepoName, mode, prefillFromSession, repoPath, router]);\n\n useEffect(() => {\n setHasAppliedPrefill(false);\n setPrefilledAttachmentPaths([]);\n }, [prefillFromSession]);\n\n useEffect(() => {\n if (mode !== 'new' || !selectedRepo || !prefillFromSession || hasAppliedPrefill) {\n return;\n }\n\n let isCancelled = false;\n\n const loadPrefill = async () => {\n const prefillResult = await getSessionPrefillContext(prefillFromSession);\n if (isCancelled) return;\n\n if (!prefillResult.success || !prefillResult.context) {\n if (prefillResult.error) {\n setError(prefillResult.error);\n }\n setHasAppliedPrefill(true);\n return;\n }\n\n const context = prefillResult.context;\n if (context.repoPath !== selectedRepo) {\n setHasAppliedPrefill(true);\n return;\n }\n\n setInitialMessage(context.initialMessage || '');\n setPrefilledAttachmentPaths(context.attachmentPaths || []);\n setShowSessionAdvanced(true);\n setHasAppliedPrefill(true);\n };\n\n void loadPrefill();\n\n return () => {\n isCancelled = true;\n };\n }, [hasAppliedPrefill, mode, prefillFromSession, selectedRepo]);\n\n const loadSavedAgentSettings = async (repoPath: string) => {\n // Refresh config to ensure we have latest settings?\n // We can just rely on current config state if we assume single user or minimal concurrency.\n // Or we can refetch.\n const currentConfig = config || await getConfig();\n if (!config) setConfig(currentConfig);\n\n const settings = currentConfig.repoSettings[repoPath] || {};\n\n const savedStartupScript = settings.startupScript;\n const savedDevServerScript = settings.devServerScript;\n\n if (savedStartupScript !== undefined && savedStartupScript !== null) {\n setStartupScript(savedStartupScript);\n } else {\n // Determine default based on repo content\n const defaultScript = await getStartupScript(repoPath);\n setStartupScript(defaultScript);\n }\n\n if (savedDevServerScript !== undefined && savedDevServerScript !== null) {\n setDevServerScript(savedDevServerScript);\n } else {\n const defaultDevServerScript = await getDefaultDevServerScript(repoPath);\n setDevServerScript(defaultDevServerScript);\n }\n };\n\n const handleSetDefaultRoot = async (path: string) => {\n const newConfig = await updateConfig({ defaultRoot: path });\n setConfig(newConfig);\n setIsSelectingRoot(false);\n };\n\n const loadBranches = async (repoPath: string) => {\n try {\n const data = await getBranches(repoPath);\n setBranches(data);\n\n const currentConfig = config || await getConfig();\n const settings = currentConfig.repoSettings[repoPath] || {};\n const lastPicked = settings.lastBranch;\n\n // Check current checked out branch\n const currentCheckedOut = data.find(b => b.current)?.name;\n\n if (lastPicked && data.some(b => b.name === lastPicked)) {\n setCurrentBranchName(lastPicked);\n if (lastPicked !== currentCheckedOut) {\n try {\n await checkoutBranch(repoPath, lastPicked);\n const updatedData = await getBranches(repoPath);\n setBranches(updatedData);\n } catch (e) {\n console.warn(\"Could not auto-checkout to remembered branch\", e);\n if (currentCheckedOut) setCurrentBranchName(currentCheckedOut);\n }\n }\n } else {\n if (currentCheckedOut) setCurrentBranchName(currentCheckedOut);\n }\n } catch (e) {\n console.error(\"Failed to load branches\", e);\n setError(\"Failed to load branches.\");\n }\n };\n\n const handleBranchChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newBranch = e.target.value;\n if (!selectedRepo) return;\n\n setLoading(true);\n try {\n await checkoutBranch(selectedRepo, newBranch);\n setCurrentBranchName(newBranch);\n\n const newConfig = await updateRepoSettings(selectedRepo, { lastBranch: newBranch });\n setConfig(newConfig);\n\n const data = await getBranches(selectedRepo);\n setBranches(data);\n } catch {\n setError(`Failed to checkout branch ${newBranch}`);\n } finally {\n setLoading(false);\n }\n };\n\n const handleSessionModeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const nextMode = e.target.value === 'plan' ? 'plan' : 'fast';\n setSessionMode(nextMode);\n\n try {\n window.localStorage.setItem(SESSION_MODE_STORAGE_KEY, nextMode);\n } catch {\n // Ignore localStorage errors.\n }\n };\n\n const handleStartupScriptChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const script = e.target.value;\n setStartupScript(script);\n // Debounce saving? Or just save on blur/change?\n // For simplicity, I'll save on change but it triggers server action every keystroke which is bad.\n // Better to save on blur or debounce.\n // Or just save when starting session?\n // The previous code saved on every change to localStorage.\n // Let's rely on saving when starting session? No, we want to persist even if not started.\n // I'll save on blur for now, or just save here and accept the cost.\n // Given the \"async\" nature, let's just save. But it might be laggy.\n // Actually, let's just update local state here, and use `onBlur` to save.\n };\n\n const saveStartupScript = async () => {\n if (selectedRepo) {\n const newConfig = await updateRepoSettings(selectedRepo, { startupScript });\n setConfig(newConfig);\n }\n }\n\n const handleDevServerScriptChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setDevServerScript(e.target.value);\n };\n\n const saveDevServerScriptValue = async (script: string) => {\n if (selectedRepo) {\n const newConfig = await updateRepoSettings(selectedRepo, { devServerScript: script });\n setConfig(newConfig);\n }\n };\n\n const saveDevServerScript = async () => {\n await saveDevServerScriptValue(devServerScript);\n };\n\n const appendAttachmentPaths = useCallback((incomingPaths: string[]) => {\n if (incomingPaths.length === 0) return;\n\n setAttachments((prev) => {\n const normalized = incomingPaths.map((entry) => entry.trim()).filter(Boolean);\n return Array.from(new Set([...prev, ...normalized]));\n });\n }, []);\n\n // Suggestion state\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [suggestionList, setSuggestionList] = useState<string[]>([]);\n const [, setSuggestionQuery] = useState('');\n const [cursorPosition, setCursorPosition] = useState(0);\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Cache filtered files\n const [repoFilesCache, setRepoFilesCache] = useState<string[]>([]);\n const selectedAttachmentNames = useMemo(\n () => attachments.map((attachmentPath) => getBaseName(attachmentPath)),\n [attachments],\n );\n const prefilledAttachmentNames = useMemo(\n () => prefilledAttachmentPaths.map((attachmentPath) => getBaseName(attachmentPath)),\n [prefilledAttachmentPaths],\n );\n\n const updateSuggestions = (query: string, files: string[], currentAttachments: string[], carriedAttachments: string[]) => {\n const lowerQ = query.toLowerCase();\n\n const attachmentNames = [...currentAttachments, ...carriedAttachments];\n // prioritize attachments\n const matchedAttachments = attachmentNames.filter(n => n.toLowerCase().includes(lowerQ));\n const matchedFiles = files.filter(f => f.toLowerCase().includes(lowerQ)).slice(0, 20);\n\n const newList = [...matchedAttachments, ...matchedFiles];\n setSuggestionList(newList);\n setSelectedIndex(0); // Reset selection\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Cmd+Enter to submit\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleStartSession();\n return;\n }\n\n if (showSuggestions && suggestionList.length > 0) {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedIndex(prev => (prev > 0 ? prev - 1 : suggestionList.length - 1)); // Wrap around\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedIndex(prev => (prev < suggestionList.length - 1 ? prev + 1 : 0)); // Wrap around\n } else if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault();\n handleSelectSuggestion(suggestionList[selectedIndex]);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setShowSuggestions(false);\n }\n }\n };\n\n const handleMessageChange = async (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const val = e.target.value;\n const pos = e.target.selectionStart;\n setInitialMessage(val);\n setCursorPosition(pos);\n\n // Check for @ mention\n const textBeforeCursor = val.substring(0, pos);\n const lastAt = textBeforeCursor.lastIndexOf('@');\n\n if (lastAt !== -1) {\n const query = textBeforeCursor.substring(lastAt + 1);\n if (!/\\s/.test(query)) {\n setSuggestionQuery(query);\n setShowSuggestions(true);\n\n if (selectedRepo) {\n let files = repoFilesCache;\n if (repoFilesCache.length === 0) {\n files = await listRepoFiles(selectedRepo);\n setRepoFilesCache(files);\n }\n updateSuggestions(query, files, selectedAttachmentNames, prefilledAttachmentNames);\n }\n return;\n }\n }\n\n setShowSuggestions(false);\n };\n\n const handleSelectSuggestion = (suggestion: string) => {\n const textBeforeCursor = initialMessage.substring(0, cursorPosition);\n const lastAt = textBeforeCursor.lastIndexOf('@');\n\n if (lastAt !== -1) {\n const prefix = initialMessage.substring(0, lastAt);\n const suffix = initialMessage.substring(cursorPosition);\n\n const newValue = `${prefix}@${suggestion} ${suffix}`;\n setInitialMessage(newValue);\n setShowSuggestions(false);\n }\n };\n\n const removeAttachment = (idx: number) => {\n setAttachments(prev => prev.filter((_, i) => i !== idx));\n };\n\n const removePrefilledAttachment = (idx: number) => {\n setPrefilledAttachmentPaths(prev => prev.filter((_, i) => i !== idx));\n };\n\n\n const handleRemoveRecent = async (e: React.MouseEvent, repo: string) => {\n e.stopPropagation();\n if (config) {\n const newRecent = config.recentRepos.filter(r => r !== repo);\n const newConfig = await updateConfig({ recentRepos: newRecent });\n setConfig(newConfig);\n }\n };\n\n const handleOpenRepoSettings = async (e: React.MouseEvent, repo: string) => {\n e.stopPropagation();\n\n const settings = config?.repoSettings?.[repo];\n setRepoForSettings(repo);\n setRepoCredentialSelection(resolveRepoCredentialSelection(repo));\n setRepoStartupCommand(settings?.startupScript?.trim() ? settings.startupScript : DEFAULT_REPO_STARTUP_COMMAND);\n setRepoDevServerCommand(settings?.devServerScript?.trim() ? settings.devServerScript : DEFAULT_REPO_DEV_SERVER_COMMAND);\n setRepoSettingsError(null);\n setIsRepoSettingsDialogOpen(true);\n setIsLoadingCredentialOptions(true);\n\n try {\n const result = await listCredentials();\n if (!result.success) {\n setRepoSettingsError(result.error);\n setCredentialOptions([]);\n } else {\n setCredentialOptions(result.credentials);\n setRepoCredentialSelection(resolveRepoCredentialSelection(repo, result.credentials));\n }\n } catch (err) {\n console.error(err);\n setRepoSettingsError('Failed to load credentials.');\n setCredentialOptions([]);\n } finally {\n setIsLoadingCredentialOptions(false);\n }\n };\n\n const handleSaveRepoSettings = async () => {\n if (!repoForSettings) return;\n const credentialId = repoCredentialSelection === 'auto' ? null : repoCredentialSelection;\n const startupCommandToSave = repoStartupCommand.trim() || DEFAULT_REPO_STARTUP_COMMAND;\n const devServerCommandToSave = repoDevServerCommand.trim() || DEFAULT_REPO_DEV_SERVER_COMMAND;\n\n if (credentialId && !credentialOptions.some((credential) => credential.id === credentialId)) {\n setRepoSettingsError('Selected credential no longer exists. Please choose another credential.');\n return;\n }\n\n setIsSavingRepoSettings(true);\n setRepoSettingsError(null);\n try {\n const newConfig = await updateRepoSettings(repoForSettings, {\n credentialId,\n startupScript: startupCommandToSave,\n devServerScript: devServerCommandToSave,\n credentialPreference: undefined,\n });\n setConfig(newConfig);\n dismissRepoSettingsDialog();\n } catch (err) {\n console.error(err);\n setRepoSettingsError('Failed to save repository settings.');\n } finally {\n setIsSavingRepoSettings(false);\n }\n };\n\n const handleLoginTerminalLoad = useCallback(() => {\n if (!isLoginModalOpen || !loginCommand || !loginTerminalRef.current) {\n return;\n }\n\n const iframe = loginTerminalRef.current;\n const checkAndInject = (attempts = 0) => {\n if (attempts > 40) {\n setLoginModalError('Timed out while waiting for terminal to initialize.');\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win?.term) {\n win.term.paste(`${loginCommand}\\r`);\n setLoginCommandInjected(true);\n setLoginModalError(null);\n win.focus();\n return;\n }\n\n setTimeout(() => checkAndInject(attempts + 1), 300);\n } catch (e) {\n console.error('Failed to inject login command into terminal iframe:', e);\n setLoginModalError('Could not access ttyd terminal. Ensure ttyd is running and try again.');\n }\n };\n\n setTimeout(() => checkAndInject(), 500);\n }, [isLoginModalOpen, loginCommand]);\n\n const hasConfiguredAgentApiCredential = useCallback(async (agentCli: SupportedAgentCli): Promise<boolean> => {\n try {\n const result = await listAgentApiCredentials();\n if (!result.success) return false;\n return result.credentials.some((credential) => credential.agent === agentCli);\n } catch {\n return false;\n }\n }, []);\n\n const ensureAgentCliReady = useCallback(async (): Promise<boolean> => {\n const agentCli: SupportedAgentCli = 'codex';\n\n const checkResult = await checkAgentCliInstalled(agentCli);\n if (!checkResult.success) {\n setError(checkResult.error || `Failed to verify ${AGENT_CLI_LABELS[agentCli]} installation status.`);\n return false;\n }\n\n if (checkResult.installed) {\n return true;\n }\n\n setIsInstallingAgentCli(true);\n setInstallingAgentCli(agentCli);\n setError(null);\n\n const installResult = await installAgentCli(agentCli);\n setIsInstallingAgentCli(false);\n setInstallingAgentCli(null);\n\n if (!installResult.success) {\n setError(installResult.error || `Failed to install ${AGENT_CLI_LABELS[agentCli]}.`);\n return false;\n }\n\n const ttydResult = await startTtydProcess();\n if (!ttydResult.success) {\n setError(ttydResult.error || 'Failed to start ttyd');\n return false;\n }\n\n const hasAgentApiCredential = await hasConfiguredAgentApiCredential(agentCli);\n if (hasAgentApiCredential) {\n return true;\n }\n\n setLoginAgentCli(agentCli);\n setLoginCommand(AGENT_LOGIN_COMMANDS[agentCli]);\n setLoginCommandInjected(false);\n setLoginModalError(null);\n setIsLoginModalOpen(true);\n return false;\n }, [hasConfiguredAgentApiCredential]);\n\n const startSession = async (options: { skipAgentSetup?: boolean } = {}) => {\n if (!selectedRepo) return;\n setLoading(true);\n setError(null);\n\n try {\n if (!options.skipAgentSetup) {\n const isAgentCliReady = await ensureAgentCliReady();\n if (!isAgentCliReady) {\n setLoading(false);\n return;\n }\n }\n\n const trimmedDevServerScript = devServerScript.trim();\n let resolvedDevServerScript = trimmedDevServerScript;\n\n if (!resolvedDevServerScript) {\n resolvedDevServerScript = await getDefaultDevServerScript(selectedRepo);\n if (resolvedDevServerScript) {\n setDevServerScript(resolvedDevServerScript);\n }\n }\n\n // Also save startup script if changed\n await saveStartupScript();\n await saveDevServerScriptValue(resolvedDevServerScript);\n\n // 1. Start TTYD if needed\n const ttydResult = await startTtydProcess();\n if (!ttydResult.success) {\n setError(ttydResult.error || \"Failed to start ttyd\");\n setLoading(false);\n return;\n }\n\n // 2. Create Session Worktree\n // Use current selected branch as base\n const baseBranch = currentBranchName || 'main'; // Fallback to main if empty, though shouldn't happen\n const derivedTitle = deriveSessionTitleFromTaskDescription(initialMessage);\n\n const wtResult = await createSession(selectedRepo, baseBranch, {\n agent: 'codex',\n model: '',\n title: derivedTitle,\n devServerScript: resolvedDevServerScript || undefined\n });\n\n if (wtResult.success && wtResult.sessionName && wtResult.worktreePath && wtResult.branchName) {\n const allAttachmentPaths = Array.from(\n new Set(\n [...attachments, ...prefilledAttachmentPaths]\n .map((entry) => entry.trim())\n .filter(Boolean)\n )\n );\n const attachmentPathByName = new Map<string, string>();\n for (const attachmentPath of allAttachmentPaths) {\n const baseName = getBaseName(attachmentPath).trim();\n if (!baseName) continue;\n if (!attachmentPathByName.has(baseName)) {\n attachmentPathByName.set(baseName, attachmentPath);\n }\n }\n const allAttachmentNames = Array.from(attachmentPathByName.keys());\n\n // Process initial message mentions\n const trimmedInitialMessage = initialMessage.trim();\n let processedMessage = trimmedInitialMessage;\n\n // Helper to match replacement\n processedMessage = processedMessage.replace(/@(\\S+)/g, (match, name) => {\n const attachmentPath = attachmentPathByName.get(name);\n if (attachmentPath) {\n return attachmentPath;\n }\n // Assume repo file - keep relative path as we run in worktree root\n return name;\n });\n\n // 3. Persist launch context for the new session\n const launchContextResult = await saveSessionLaunchContext(wtResult.sessionName, {\n title: derivedTitle,\n initialMessage: processedMessage || undefined,\n rawInitialMessage: trimmedInitialMessage || undefined,\n startupScript: startupScript || undefined,\n attachmentPaths: allAttachmentPaths,\n attachmentNames: allAttachmentNames,\n agentProvider: 'codex',\n model: '',\n sessionMode,\n });\n\n if (!launchContextResult.success) {\n setError(launchContextResult.error || 'Failed to save session context');\n setLoading(false);\n return;\n }\n\n // 4. Navigate to session page by path only\n const dest = `/session/${wtResult.sessionName}`;\n notifySessionsChanged();\n router.push(dest);\n setLoading(false);\n\n // No need to refresh sessions as we are navigating away\n } else {\n setError(wtResult.error || \"Failed to create session worktree\");\n setLoading(false);\n }\n\n } catch (e) {\n console.error(e);\n setError(\"Failed to start session\");\n setLoading(false);\n }\n };\n\n const handleStartSession = () => {\n void startSession();\n };\n\n const dismissLoginModal = useCallback(() => {\n setIsLoginModalOpen(false);\n setLoginAgentCli(null);\n setLoginCommand('');\n setLoginCommandInjected(false);\n setLoginModalError(null);\n }, []);\n\n const handleLoginDone = async () => {\n dismissLoginModal();\n await startSession({ skipAgentSetup: true });\n };\n\n useDialogKeyboardShortcuts({\n enabled: mode === 'new' && isLoginModalOpen && !!loginAgentCli,\n onConfirm: handleLoginDone,\n onDismiss: dismissLoginModal,\n canConfirm: !loading,\n });\n\n useDialogKeyboardShortcuts({\n enabled: mode === 'home' && isRepoSettingsDialogOpen && !!repoForSettings,\n onConfirm: handleSaveRepoSettings,\n onDismiss: dismissRepoSettingsDialog,\n canConfirm: !isSavingRepoSettings,\n });\n\n useDialogKeyboardShortcuts({\n enabled: mode === 'home' && isCloneRemoteDialogOpen,\n onConfirm: handleCloneRemoteRepo,\n onDismiss: dismissCloneRemoteDialog,\n canConfirm: !isCloningRemote && remoteRepoUrl.trim().length > 0 && !isLoadingCloneCredentialOptions,\n });\n\n const handleResumeSession = async (session: SessionMetadata) => {\n if (!selectedRepo) return;\n setLoading(true);\n\n try {\n // 1. Start TTYD\n const ttydResult = await startTtydProcess();\n if (!ttydResult.success) {\n setError(ttydResult.error || \"Failed to start ttyd\");\n setLoading(false);\n return;\n }\n\n // 2. Navigate — session already has initialized=true so SessionPageClient will resume\n const dest = `/session/${session.sessionName}`;\n router.push(dest);\n setLoading(false);\n\n } catch (e) {\n console.error(e);\n setError(\"Failed to resume session\");\n setLoading(false);\n }\n };\n\n const handleNewAttemptFromSession = (session: SessionMetadata) => {\n if (!selectedRepo) return;\n const nextUrl = `/new?repo=${encodeURIComponent(selectedRepo)}&prefillFromSession=${encodeURIComponent(session.sessionName)}`;\n router.push(nextUrl);\n };\n\n const handleDeleteSession = async (session: SessionMetadata) => {\n if (!selectedRepo) return;\n\n const confirmed = confirm(\n `Delete session \"${session.sessionName}\"?\\n\\nThis will remove the worktree, branch, and session metadata.`\n );\n if (!confirmed) return;\n\n setDeletingSessionName(session.sessionName);\n setError(null);\n\n try {\n const result = await deleteSession(session.sessionName);\n if (!result.success) {\n setError(result.error || 'Failed to delete session');\n return;\n }\n\n const sessions = await listSessions(selectedRepo);\n setExistingSessions(sessions);\n\n // Also refresh all sessions\n const allSess = await listSessions();\n setAllSessions(allSess);\n notifySessionsChanged();\n } catch (e) {\n console.error(e);\n setError('Failed to delete session');\n } finally {\n setDeletingSessionName(null);\n }\n };\n\n const runningSessionCountByRepo = useMemo(() => {\n const counts = new Map<string, number>();\n for (const session of allSessions) {\n counts.set(session.repoPath, (counts.get(session.repoPath) ?? 0) + 1);\n }\n return counts;\n }, [allSessions]);\n\n const recentRepos = useMemo(() => config?.recentRepos ?? [], [config?.recentRepos]);\n const filteredRecentRepos = useMemo(() => {\n const normalizedQuery = homeSearchQuery.trim().toLowerCase();\n if (!normalizedQuery) return recentRepos;\n\n return recentRepos.filter((repo) => {\n const baseName = getBaseName(repo).toLowerCase();\n return baseName.includes(normalizedQuery) || repo.toLowerCase().includes(normalizedQuery);\n });\n }, [homeSearchQuery, recentRepos]);\n const selectableRepos = selectedRepo\n ? (recentRepos.includes(selectedRepo) ? recentRepos : [selectedRepo, ...recentRepos])\n : recentRepos;\n const currentThemeModeIndex = THEME_MODE_SEQUENCE.indexOf(themeMode);\n const nextThemeMode = THEME_MODE_SEQUENCE[(currentThemeModeIndex + 1) % THEME_MODE_SEQUENCE.length];\n const themeModeLabel = themeMode === 'auto' ? 'Auto' : (themeMode === 'light' ? 'Bright' : 'Dark');\n const nextThemeModeLabel = nextThemeMode === 'auto' ? 'Auto' : (nextThemeMode === 'light' ? 'Bright' : 'Dark');\n const ThemeModeIcon = themeMode === 'auto' ? Monitor : (themeMode === 'light' ? Sun : Moon);\n const handleCycleThemeMode = () => {\n setThemeMode(nextThemeMode);\n };\n const handleRepoCardMouseMove = useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n const wrapper = event.currentTarget;\n const card = wrapper.querySelector<HTMLElement>('.repo-card-tilt');\n if (!card) return;\n\n const rect = wrapper.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const centerX = rect.width / 2;\n const centerY = rect.height / 2;\n\n if (centerX <= 0 || centerY <= 0) return;\n\n const rotateX = ((y - centerY) / centerY) * -12;\n const rotateY = ((x - centerX) / centerX) * 12;\n const bgPosX = 50 + (((x - centerX) / centerX) * 40);\n const bgPosY = 50 + (((y - centerY) / centerY) * 40);\n\n card.style.setProperty('--tilt-mouse-x', `${x}px`);\n card.style.setProperty('--tilt-mouse-y', `${y}px`);\n card.style.setProperty('--tilt-bg-pos-x', `${bgPosX}%`);\n card.style.setProperty('--tilt-bg-pos-y', `${bgPosY}%`);\n card.style.setProperty('--tilt-rotate-x', `${rotateX.toFixed(2)}deg`);\n card.style.setProperty('--tilt-rotate-y', `${rotateY.toFixed(2)}deg`);\n card.style.setProperty('--tilt-scale', '1.02');\n }, []);\n const handleRepoCardMouseLeave = useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n const card = event.currentTarget.querySelector<HTMLElement>('.repo-card-tilt');\n if (!card) return;\n\n card.style.setProperty('--tilt-rotate-x', '0deg');\n card.style.setProperty('--tilt-rotate-y', '0deg');\n card.style.setProperty('--tilt-scale', '1');\n card.style.setProperty('--tilt-bg-pos-x', '50%');\n card.style.setProperty('--tilt-bg-pos-y', '50%');\n }, []);\n\n return (\n <>\n {mode === 'home' && (\n <div className=\"w-full max-w-7xl\">\n <header className=\"relative z-10 flex flex-col gap-4 rounded-xl border border-slate-200/80 bg-white/82 px-4 py-4 shadow-[0_14px_36px_-24px_rgba(15,23,42,0.4)] backdrop-blur-md transition-colors md:flex-row md:items-center md:justify-between md:px-7 dark:border-slate-700/75 dark:bg-[#131b2b]/72 dark:shadow-[0_18px_44px_-30px_rgba(0,0,0,0.75)]\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-slate-100/90 shadow-sm dark:border dark:border-white/5 dark:bg-[#1e2532]\">\n <Image src=\"/icon.png\" alt=\"Viba\" width={22} height={22} className=\"rounded-sm\" />\n </div>\n <div>\n <h2 className=\"text-xl font-semibold tracking-tight text-slate-900 dark:text-white\">Viba</h2>\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">AI Coding Agent Dashboard</p>\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <label className=\"input input-sm flex h-10 w-full items-center gap-2 border-slate-200 bg-slate-100/90 text-slate-700 shadow-none transition-colors md:w-72 dark:border-slate-700/70 dark:bg-[#1e2532] dark:text-slate-200\">\n <Search className=\"h-4 w-4 text-slate-400 dark:text-slate-500\" />\n <input\n type=\"text\"\n className=\"grow text-sm placeholder:text-slate-400 dark:placeholder:text-slate-500\"\n placeholder=\"Search repositories...\"\n value={homeSearchQuery}\n onChange={(event) => setHomeSearchQuery(event.target.value)}\n />\n </label>\n <button\n className=\"btn btn-ghost btn-sm gap-2 text-slate-700 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\"\n onClick={() => router.push('/credentials')}\n title=\"Manage GitHub/GitLab credentials\"\n >\n <KeyRound className=\"h-4 w-4\" />\n Credentials\n </button>\n <button className=\"btn btn-primary btn-sm gap-2\" onClick={openCloneRemoteDialog}>\n <CloudDownload className=\"h-4 w-4\" />\n New Repository\n </button>\n <button\n className=\"btn btn-ghost btn-sm btn-square text-slate-700 dark:border dark:border-slate-700/60 dark:bg-[#1e2532] dark:text-slate-300 dark:hover:bg-[#252d3d] dark:hover:text-white\"\n onClick={handleCycleThemeMode}\n title={`Theme mode: ${themeModeLabel}. Click to switch to ${nextThemeModeLabel}.`}\n aria-label={`Theme mode: ${themeModeLabel}. Click to switch to ${nextThemeModeLabel}.`}\n >\n <ThemeModeIcon className=\"h-4 w-4\" />\n </button>\n </div>\n </header>\n\n <div className=\"relative z-10 px-1 py-5 md:py-7\">\n {error && (\n <div className=\"mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-2 text-sm text-red-700 dark:border-red-500/50 dark:bg-red-950/40 dark:text-red-200\">\n {error}\n </div>\n )}\n\n {!isLoaded ? (\n <div className=\"flex h-56 items-center justify-center rounded-2xl border border-slate-200 bg-white/70 dark:border-slate-700/55 dark:bg-[#141d2e]/70\">\n <span className=\"loading loading-spinner loading-md text-primary\"></span>\n </div>\n ) : filteredRecentRepos.length === 0 ? (\n <div className=\"flex h-56 flex-col items-center justify-center rounded-2xl border border-slate-200 bg-white/70 text-center dark:border-slate-700/55 dark:bg-[#141d2e]/70\">\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">\n {homeSearchQuery.trim() ? 'No repositories match your search.' : 'No recent repositories found.'}\n </p>\n {!homeSearchQuery.trim() && (\n <button className=\"btn btn-primary btn-sm mt-3 gap-2\" onClick={openCloneRemoteDialog}>\n <Plus className=\"h-4 w-4\" />\n Add your first repository\n </button>\n )}\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-5 md:grid-cols-2 xl:grid-cols-3\">\n {filteredRecentRepos.map((repo) => {\n const credentialLabel = getRepoCredentialLabel(repo);\n const runningSessionCount = runningSessionCountByRepo.get(repo) ?? 0;\n const cardGradient = getStableRepoCardGradient(getBaseName(repo));\n\n return (\n <div\n key={repo}\n onClick={() => handleSelectRepo(repo)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void handleSelectRepo(repo);\n }\n }}\n onMouseMove={handleRepoCardMouseMove}\n onMouseLeave={handleRepoCardMouseLeave}\n role=\"button\"\n tabIndex={0}\n className=\"repo-card-tilt-wrapper group relative h-[248px] cursor-pointer text-left transition-transform duration-200\"\n >\n <div\n className=\"repo-card-tilt relative h-full overflow-hidden rounded-2xl border border-white/70 bg-white/55 dark:border-slate-700/40 dark:bg-[#141a25]/64 dark:hover:border-slate-600/55\"\n style={isDarkThemeActive ? undefined : cardGradient}\n >\n <div className=\"absolute inset-0 bg-white/38 dark:bg-[#141a25]/58\" />\n <div className=\"repo-card-tilt-content relative flex h-full flex-col justify-between p-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"relative\">\n <div className=\"repo-card-tilt-icon flex h-10 w-10 items-center justify-center rounded-xl bg-white/90 text-slate-700 shadow-sm dark:border dark:border-white/10 dark:bg-[#1e2532] dark:text-slate-200\">\n <FolderGit2 className=\"h-5 w-5\" />\n </div>\n {runningSessionCount > 0 && (\n <span\n className=\"absolute -right-2 -top-2 inline-flex h-6 min-w-6 items-center justify-center rounded-full bg-emerald-500 px-1.5 text-[11px] font-bold text-white shadow-sm\"\n title={`${runningSessionCount} running session${runningSessionCount === 1 ? '' : 's'}`}\n >\n {runningSessionCount}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={(event) => {\n void handleOpenRepoSettings(event, repo);\n }}\n className=\"btn btn-circle btn-xs border-0 bg-white/70 text-slate-600 opacity-0 shadow-none transition-opacity hover:bg-white hover:text-slate-900 group-hover:opacity-100 dark:bg-[#1e2532]/90 dark:text-slate-300 dark:hover:bg-[#252d3d] dark:hover:text-white\"\n title=\"Repository settings\"\n >\n <Settings className=\"h-3.5 w-3.5\" />\n </button>\n <button\n onClick={(event) => handleRemoveRecent(event, repo)}\n className=\"btn btn-circle btn-xs border-0 bg-white/70 text-slate-500 opacity-0 shadow-none transition-opacity hover:bg-white hover:text-rose-600 group-hover:opacity-100 dark:bg-[#1e2532]/90 dark:text-slate-400 dark:hover:bg-[#252d3d] dark:hover:text-rose-300\"\n title=\"Remove from history\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <h3 className=\"truncate text-lg font-bold text-slate-900 dark:text-white\">\n {getBaseName(repo)}\n </h3>\n <p className=\"truncate font-mono text-xs text-slate-600 dark:text-slate-300\">{repo}</p>\n <p className=\"truncate text-[11px] font-medium text-slate-500 dark:text-slate-400\">\n Credential: {credentialLabel}\n </p>\n </div>\n\n <div className=\"flex items-center justify-between text-sm font-semibold text-slate-700 dark:text-slate-200\">\n <span>Open repository</span>\n <ChevronRight className=\"h-4 w-4 transition-transform group-hover:translate-x-0.5\" />\n </div>\n </div>\n </div>\n </div>\n );\n })}\n\n <button\n onClick={openCloneRemoteDialog}\n className=\"group flex h-[248px] flex-col items-center justify-center gap-2 rounded-2xl border-2 border-dashed border-slate-300 bg-slate-50/70 text-slate-600 transition-all duration-200 hover:-translate-y-1 hover:border-primary/50 hover:bg-white dark:border-slate-700/35 dark:bg-[#131b2a] dark:text-slate-400 dark:hover:border-slate-600/50 dark:hover:bg-[#1d2638]\"\n >\n <span className=\"flex h-14 w-14 items-center justify-center rounded-full bg-white shadow-sm transition-transform group-hover:scale-105 dark:border dark:border-slate-700/40 dark:bg-[#1e2532]\">\n <Plus className=\"h-7 w-7 text-slate-400 transition-colors group-hover:text-primary\" />\n </span>\n <span className=\"text-lg font-semibold transition-colors group-hover:text-primary\">\n Add Repository\n </span>\n <span className=\"text-sm text-slate-400 dark:text-slate-500\">Import from local or git URL</span>\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n\n {mode === 'home' && isRepoSettingsDialogOpen && repoForSettings && (\n <div className=\"fixed inset-0 z-[1002] flex items-center justify-center bg-slate-900/35 p-4 backdrop-blur-sm\">\n <div className=\"w-full max-w-xl overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-2xl dark:border-white/10 dark:bg-[#151b26]\">\n <div className=\"flex items-center justify-between border-b border-slate-100 bg-slate-50/70 px-5 py-4 md:px-6 dark:border-white/10 dark:bg-[#1e2532]/75\">\n <h3 className=\"text-lg font-bold text-slate-900 dark:text-white\">Repository Settings</h3>\n <button\n className=\"btn btn-circle btn-ghost btn-sm text-slate-500 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\"\n onClick={dismissRepoSettingsDialog}\n disabled={isSavingRepoSettings}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"space-y-4 p-5 md:p-6\">\n <p className=\"text-sm text-slate-600 dark:text-slate-300\">\n Choose which credential this repository should use for authenticated Git operations.\n </p>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Repository</label>\n <div className=\"rounded-lg border border-slate-200 bg-slate-50 px-3 py-2 font-mono text-xs text-slate-700 break-all dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\">\n {repoForSettings}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Credential</label>\n <select\n className=\"select w-full border-slate-200 bg-slate-50 text-slate-700 focus:border-primary focus:outline-none dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\"\n value={repoCredentialSelection}\n onChange={(event) => setRepoCredentialSelection(event.target.value)}\n disabled={isSavingRepoSettings}\n >\n <option value=\"auto\">Auto (match repository remote)</option>\n {credentialOptions.map((credential) => (\n <option key={credential.id} value={credential.id}>\n {getCredentialOptionLabel(credential)}\n </option>\n ))}\n </select>\n {credentialOptions.length === 0 && !isLoadingCredentialOptions && (\n <div className=\"text-xs text-slate-500 dark:text-slate-400\">\n No credentials found. Add credentials from the Credentials page.\n </div>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Start Up Command</label>\n <input\n className=\"input w-full border-slate-200 bg-slate-50 font-mono text-sm text-slate-800 focus:border-primary focus:outline-none dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\"\n value={repoStartupCommand}\n onChange={(event) => setRepoStartupCommand(event.target.value)}\n placeholder={DEFAULT_REPO_STARTUP_COMMAND}\n disabled={isSavingRepoSettings}\n />\n <div className=\"text-xs text-slate-500 dark:text-slate-400\">\n Default: <span className=\"font-mono\">{DEFAULT_REPO_STARTUP_COMMAND}</span>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Dev Server Command</label>\n <input\n className=\"input w-full border-slate-200 bg-slate-50 font-mono text-sm text-slate-800 focus:border-primary focus:outline-none dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\"\n value={repoDevServerCommand}\n onChange={(event) => setRepoDevServerCommand(event.target.value)}\n placeholder={DEFAULT_REPO_DEV_SERVER_COMMAND}\n disabled={isSavingRepoSettings}\n />\n <div className=\"text-xs text-slate-500 dark:text-slate-400\">\n Default: <span className=\"font-mono\">{DEFAULT_REPO_DEV_SERVER_COMMAND}</span>\n </div>\n </div>\n\n {isLoadingCredentialOptions && (\n <div className=\"flex items-center gap-2 text-sm text-slate-500 dark:text-slate-400\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n Loading credentials...\n </div>\n )}\n\n {repoSettingsError && (\n <div className=\"rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700\">\n {repoSettingsError}\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 border-t border-slate-100 pt-4 dark:border-white/10\">\n <button\n className=\"btn btn-ghost text-slate-700 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\"\n onClick={dismissRepoSettingsDialog}\n disabled={isSavingRepoSettings}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n onClick={() => void handleSaveRepoSettings()}\n disabled={isSavingRepoSettings || isLoadingCredentialOptions}\n >\n {isSavingRepoSettings ? <span className=\"loading loading-spinner loading-xs\"></span> : null}\n Save\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'home' && isCloneRemoteDialogOpen && (\n <div className=\"fixed inset-0 z-[1002] flex items-center justify-center bg-slate-900/40 p-4 backdrop-blur-sm\">\n <div className=\"flex max-h-[90vh] w-full max-w-5xl flex-col overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-2xl dark:border-white/10 dark:bg-[#151b26]\">\n <div className=\"flex items-center justify-between border-b border-slate-100 bg-slate-50/60 px-5 py-4 md:px-6 dark:border-white/10 dark:bg-[#1e2532]/75\">\n <div>\n <h3 className=\"text-lg font-bold text-slate-900 dark:text-white\">Add New Repository</h3>\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">Connect a local folder or clone from URL</p>\n </div>\n <button className=\"btn btn-circle btn-ghost btn-sm text-slate-500 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\" onClick={dismissCloneRemoteDialog} disabled={isCloningRemote}>\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex flex-1 flex-col overflow-y-auto md:flex-row\">\n <div className=\"flex-1 space-y-4 border-b border-slate-100 p-5 md:border-b-0 md:border-r md:p-6 dark:border-white/10\">\n <h4 className=\"text-sm font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Browse Local</h4>\n <p className=\"text-sm text-slate-600 dark:text-slate-300\">\n Select an existing Git repository folder from your local machine.\n </p>\n <div className=\"rounded-lg border border-slate-200 bg-slate-50 p-3 text-xs text-slate-600 dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-300\">\n Default root: <span className=\"font-mono\">{config?.defaultRoot || '~'}</span>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <button\n className=\"btn btn-primary btn-sm gap-2\"\n onClick={() => {\n dismissCloneRemoteDialog();\n setIsBrowsing(true);\n }}\n >\n <FolderGit2 className=\"h-4 w-4\" />\n Browse Local Repository\n </button>\n <button\n className=\"btn btn-ghost btn-sm gap-2 text-slate-700 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\"\n onClick={() => {\n dismissCloneRemoteDialog();\n setIsSelectingRoot(true);\n }}\n >\n <FolderCog className=\"h-4 w-4\" />\n Set Default Folder\n </button>\n </div>\n </div>\n\n <div className=\"w-full space-y-4 bg-slate-50/35 p-5 md:w-[420px] md:p-6 dark:bg-[#111722]\">\n <h4 className=\"text-sm font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Clone Remote</h4>\n <p className=\"text-sm text-slate-600 dark:text-slate-300\">\n Clone into <span className=\"font-mono\">~/.viba/repos</span> and open it immediately.\n </p>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Repository URL</label>\n <input\n className=\"input w-full border-slate-200 bg-white font-mono text-sm text-slate-800 focus:border-primary focus:outline-none dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\"\n placeholder=\"https://github.com/org/repo.git\"\n value={remoteRepoUrl}\n onChange={(event) => setRemoteRepoUrl(event.target.value)}\n disabled={isCloningRemote}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Credential</label>\n <select\n className=\"select w-full border-slate-200 bg-white text-slate-700 focus:border-primary focus:outline-none dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-200\"\n value={cloneCredentialSelection}\n onChange={(event) => setCloneCredentialSelection(event.target.value)}\n disabled={isCloningRemote || isLoadingCloneCredentialOptions}\n >\n <option value=\"auto\">Auto (match repository remote)</option>\n {credentialOptions.map((credential) => (\n <option key={credential.id} value={credential.id}>\n {getCredentialOptionLabel(credential)}\n </option>\n ))}\n </select>\n {credentialOptions.length === 0 && !isLoadingCloneCredentialOptions && (\n <div className=\"text-xs text-slate-500 dark:text-slate-400\">\n No credentials found. Clone uses anonymous access unless remote auth is configured.\n </div>\n )}\n </div>\n\n {isLoadingCloneCredentialOptions && (\n <div className=\"flex items-center gap-2 text-sm text-slate-500 dark:text-slate-400\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n Loading credentials...\n </div>\n )}\n\n {isCloningRemote && (\n <div className=\"flex items-center gap-2 rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm text-slate-600 dark:border-slate-700 dark:bg-[#1e2532] dark:text-slate-300\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n Cloning repository...\n </div>\n )}\n\n {cloneRemoteError && (\n <div className=\"rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700\">\n {cloneRemoteError}\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 border-t border-slate-100 pt-4 dark:border-white/10\">\n <button\n className=\"btn btn-ghost text-slate-700 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white\"\n onClick={dismissCloneRemoteDialog}\n disabled={isCloningRemote}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary gap-2\"\n onClick={() => void handleCloneRemoteRepo()}\n disabled={isCloningRemote || !remoteRepoUrl.trim() || isLoadingCloneCredentialOptions}\n >\n {isCloningRemote ? <span className=\"loading loading-spinner loading-xs\"></span> : <CloudDownload className=\"h-4 w-4\" />}\n Clone Repository\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'new' && selectedRepo && (\n <div className=\"w-full max-w-[1240px]\">\n {error && (\n <div className=\"mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-2 text-sm text-red-700 dark:border-red-500/40 dark:bg-red-900/30 dark:text-red-200\">\n {error}\n </div>\n )}\n\n <div className=\"mb-8\">\n <div className=\"mb-2 flex items-center gap-4\">\n <button\n type=\"button\"\n className=\"flex h-10 w-10 items-center justify-center rounded-lg text-slate-500 transition-colors hover:bg-white hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white\"\n onClick={() => router.push('/')}\n aria-label=\"Back to home\"\n >\n <ChevronRight className=\"h-6 w-6 rotate-180\" />\n </button>\n <h1 className=\"text-3xl font-black tracking-[-0.02em] text-slate-900 md:text-4xl dark:text-white\">Assign New Task</h1>\n </div>\n <p className=\"ml-14 text-sm text-slate-500 md:text-base dark:text-slate-400\">\n Configure the environment and describe the work required for your AI agent.\n </p>\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-12\">\n <div className=\"space-y-6 lg:col-span-4\">\n <div className=\"rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-[#30363d] dark:bg-[#161b22] dark:shadow-[0_16px_36px_-24px_rgba(2,6,23,0.95)]\">\n <h3 className=\"mb-5 flex items-center gap-2 text-lg font-bold text-slate-900 dark:text-white\">\n <FolderGit2 className=\"h-5 w-5 text-primary\" />\n Context Setup\n </h3>\n\n <div className=\"space-y-4\">\n <label className=\"flex flex-col gap-2\">\n <span className=\"text-sm font-medium text-slate-700 dark:text-slate-300\">Select Repository</span>\n <div className=\"relative\">\n <select\n className=\"h-12 w-full appearance-none rounded-lg border border-slate-300 bg-white px-3 pr-10 font-mono text-sm text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/20 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100\"\n value={selectedRepo}\n onChange={(event) => {\n void handleCurrentRepoChange(event);\n }}\n disabled={loading || selectableRepos.length === 0}\n >\n {selectableRepos.map((repo) => (\n <option key={repo} value={repo}>\n {getBaseName(repo)}\n </option>\n ))}\n </select>\n <ChevronDown className=\"pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-500 dark:text-slate-500\" />\n </div>\n <span className=\"truncate font-mono text-[11px] text-slate-500 dark:text-slate-400\" title={selectedRepo}>\n {selectedRepo}\n </span>\n </label>\n\n <label className=\"flex flex-col gap-2\">\n <span className=\"text-sm font-medium text-slate-700 dark:text-slate-300\">Base Branch</span>\n <div className=\"relative\">\n <select\n className=\"h-12 w-full appearance-none rounded-lg border border-slate-300 bg-white px-3 pr-10 font-mono text-sm text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/20 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100\"\n value={currentBranchName}\n onChange={handleBranchChange}\n disabled={loading}\n >\n {branches.map((branch) => (\n <option key={branch.name} value={branch.name}>\n {branch.name}\n {branch.current ? ' (checked out)' : ''}\n </option>\n ))}\n </select>\n {loading\n ? <span className=\"loading loading-spinner loading-xs absolute right-3 top-1/2 -translate-y-1/2\"></span>\n : <ChevronDown className=\"pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-500 dark:text-slate-500\" />}\n </div>\n </label>\n\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-2 text-sm font-medium text-slate-600 transition-colors hover:text-slate-900 dark:text-slate-400 dark:hover:text-white\"\n onClick={() => setShowSessionAdvanced((prev) => !prev)}\n >\n <ChevronRight className={`h-4 w-4 transition-transform ${showSessionAdvanced ? 'rotate-90' : ''}`} />\n {showSessionAdvanced ? 'Hide Advanced Setup' : collapsedSessionSetupLabel}\n </button>\n\n {showSessionAdvanced && (\n <div className=\"space-y-4 rounded-xl border border-slate-200 bg-slate-50 p-3 dark:border-[#30363d] dark:bg-[#0d1117]/55\">\n <label className=\"flex flex-col gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Start Up Command</span>\n <input\n type=\"text\"\n className=\"h-10 rounded-lg border border-slate-300 bg-white px-3 font-mono text-sm text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/20 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100\"\n placeholder=\"npm install\"\n value={startupScript}\n onChange={handleStartupScriptChange}\n onBlur={saveStartupScript}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n handleStartSession();\n }\n }}\n disabled={loading}\n />\n </label>\n\n <label className=\"flex flex-col gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Dev Server Command</span>\n <input\n type=\"text\"\n className=\"h-10 rounded-lg border border-slate-300 bg-white px-3 font-mono text-sm text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/20 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100\"\n placeholder=\"npm run dev\"\n value={devServerScript}\n onChange={handleDevServerScriptChange}\n onBlur={saveDevServerScript}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n handleStartSession();\n }\n }}\n disabled={loading}\n />\n </label>\n\n <label className=\"flex flex-col gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">Session Mode</span>\n <select\n className=\"h-10 rounded-lg border border-slate-300 bg-white px-3 text-sm text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/20 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100\"\n value={sessionMode}\n onChange={handleSessionModeChange}\n disabled={loading}\n >\n <option value=\"fast\">Fast Mode (default)</option>\n <option value=\"plan\">Plan Mode</option>\n </select>\n </label>\n\n </div>\n )}\n </div>\n </div>\n\n <div className=\"rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-[#30363d] dark:bg-[#161b22] dark:shadow-[0_16px_36px_-24px_rgba(2,6,23,0.95)]\">\n <h3 className=\"mb-4 text-lg font-bold text-slate-900 dark:text-white\">Ongoing Tasks</h3>\n <div className=\"space-y-2\">\n {existingSessions.length === 0 && (\n <div className=\"rounded-lg border border-dashed border-slate-200 bg-slate-50 px-3 py-4 text-sm text-slate-500 dark:border-[#30363d] dark:bg-[#0d1117]/45 dark:text-slate-400\">\n No ongoing sessions for this repository.\n </div>\n )}\n\n {existingSessions.map((session) => (\n <div\n key={session.sessionName}\n className=\"group flex items-center gap-3 rounded-lg border border-transparent px-3 py-3 transition-colors hover:border-slate-100 hover:bg-slate-50 dark:hover:border-slate-700/70 dark:hover:bg-slate-800/50\"\n >\n <div\n className={`h-2 w-2 flex-shrink-0 rounded-full ${\n deletingSessionName === session.sessionName ? 'animate-pulse bg-amber-400' : 'bg-emerald-500'\n }`}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-slate-900 dark:text-white\">{session.title || session.sessionName}</p>\n <p className=\"truncate text-xs text-slate-500 dark:text-slate-400\">\n {getBaseName(session.repoPath)} • {session.agent}\n </p>\n </div>\n <div className=\"flex items-center gap-1 opacity-100 transition-opacity sm:opacity-0 sm:group-hover:opacity-100\">\n <button\n type=\"button\"\n className=\"rounded p-1 text-slate-400 transition-colors hover:text-primary dark:text-slate-400 dark:hover:text-primary\"\n title=\"Open\"\n onClick={() => handleResumeSession(session)}\n disabled={loading || deletingSessionName === session.sessionName}\n >\n <ExternalLink className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n className=\"rounded p-1 text-slate-400 transition-colors hover:text-amber-500 dark:text-slate-400 dark:hover:text-amber-400\"\n title=\"New Attempt\"\n onClick={() => handleNewAttemptFromSession(session)}\n disabled={loading || deletingSessionName === session.sessionName}\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n className=\"rounded p-1 text-slate-400 transition-colors hover:text-red-500 dark:text-slate-400 dark:hover:text-red-400\"\n title={deletingSessionName === session.sessionName ? 'Deleting...' : 'Delete'}\n onClick={() => handleDeleteSession(session)}\n disabled={loading || deletingSessionName === session.sessionName}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col lg:col-span-8\">\n <div className=\"flex h-full flex-col rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-[#30363d] dark:bg-[#161b22] dark:shadow-[0_16px_36px_-24px_rgba(2,6,23,0.95)]\">\n <label className=\"mb-4 flex items-center gap-2 text-lg font-bold text-slate-900 dark:text-white\" htmlFor=\"task-description\">\n <Bot className=\"h-5 w-5 text-primary\" />\n Task Description\n </label>\n\n <div className=\"group relative mb-4 flex h-[360px] flex-grow flex-col md:h-[420px]\">\n <textarea\n id=\"task-description\"\n className=\"h-full w-full resize-none rounded-xl border border-slate-200 bg-slate-50 p-5 font-mono text-sm leading-relaxed text-slate-900 outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/30 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-100 dark:placeholder:text-slate-500\"\n placeholder={`Describe the task for the AI agent...\\nExample:\\n1. Create a new component for the user profile card.\\n2. Ensure it fetches data from the /api/user endpoint.\\n3. Add error handling for failed requests.\\n\\nTip: Type @ to mention files.`}\n value={initialMessage}\n onChange={handleMessageChange}\n onKeyDown={handleKeyDown}\n onClick={(event) => {\n setCursorPosition(event.currentTarget.selectionStart);\n setShowSuggestions(false);\n }}\n onKeyUp={(event) => setCursorPosition(event.currentTarget.selectionStart)}\n disabled={loading}\n />\n\n {showSuggestions && suggestionList.length > 0 && (\n <div className=\"absolute left-3 right-3 top-[calc(100%-8rem)] z-50 max-h-48 overflow-y-auto rounded-lg border border-slate-200 bg-white shadow-lg dark:border-[#30363d] dark:bg-[#161b22]\">\n {suggestionList.map((suggestion, idx) => (\n <button\n key={suggestion}\n className={`w-full truncate border-b border-slate-100 px-3 py-2 text-left text-xs last:border-0 ${\n idx === selectedIndex\n ? 'bg-primary text-white'\n : 'text-slate-700 hover:bg-slate-50 dark:border-slate-700/60 dark:text-slate-300 dark:hover:bg-slate-800/60'\n }`}\n onMouseDown={(event) => {\n event.preventDefault();\n handleSelectSuggestion(suggestion);\n }}\n >\n {suggestion}\n </button>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"border-t border-slate-100 pt-4 dark:border-slate-700/70\">\n <div className=\"mb-3 flex flex-col items-start justify-between gap-2 sm:flex-row sm:items-center\">\n <h4 className=\"text-sm font-semibold text-slate-700 dark:text-slate-300\">Attachments</h4>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-2 text-sm font-medium text-primary transition-colors hover:text-blue-700 disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={() => setIsAttachmentBrowserOpen(true)}\n disabled={loading || !selectedRepo}\n >\n <CloudDownload className=\"h-4 w-4\" />\n Select Attachments\n </button>\n </div>\n\n <div className=\"min-h-[88px] rounded-xl border-2 border-dashed border-slate-200 bg-slate-50/70 p-3 dark:border-slate-700 dark:bg-[#0d1117]/40\">\n <div className=\"flex flex-wrap gap-2\">\n {attachments.map((attachmentPath, idx) => (\n <span\n key={`upload-${attachmentPath}-${idx}`}\n className=\"inline-flex max-w-full items-center gap-2 rounded-full border border-slate-300 bg-white px-3 py-1 text-xs text-slate-700 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200\"\n title={attachmentPath}\n >\n <span className=\"truncate\">{getBaseName(attachmentPath)}</span>\n <button\n type=\"button\"\n className=\"rounded text-slate-500 transition hover:text-red-500 dark:text-slate-400 dark:hover:text-red-400\"\n onClick={() => removeAttachment(idx)}\n title=\"Remove attachment\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n\n {prefilledAttachmentPaths.map((attachmentPath, idx) => (\n <span\n key={`prefill-${attachmentPath}-${idx}`}\n className=\"inline-flex max-w-full items-center gap-2 rounded-full border border-slate-300 bg-white px-3 py-1 text-xs text-slate-700 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200\"\n title={attachmentPath}\n >\n <span className=\"truncate\">{getBaseName(attachmentPath)}</span>\n <button\n type=\"button\"\n className=\"rounded text-slate-500 transition hover:text-red-500 dark:text-slate-400 dark:hover:text-red-400\"\n onClick={() => removePrefilledAttachment(idx)}\n title=\"Remove carried attachment\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n\n {(attachments.length === 0 && prefilledAttachmentPaths.length === 0) && (\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">No attachments selected.</span>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"mt-6 flex items-center justify-end gap-3 border-t border-slate-100 pt-5 dark:border-slate-700/70\">\n <span className=\"mr-auto hidden text-xs text-slate-400 dark:text-slate-500 sm:block\">\n Press <kbd className=\"rounded border border-slate-200 bg-slate-100 px-2 py-1 font-sans text-[11px] dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300\">Ctrl + Enter</kbd> to submit\n </span>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-2 rounded-lg bg-primary px-5 py-2 text-sm font-semibold text-white shadow-md shadow-primary/20 transition hover:bg-blue-600 disabled:cursor-not-allowed disabled:opacity-70\"\n onClick={handleStartSession}\n disabled={loading}\n >\n {loading ? <span className=\"loading loading-spinner loading-xs\"></span> : 'Create New Task'}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'new' && !selectedRepo && !!repoPath && !error && (\n <div className=\"w-full max-w-2xl rounded-2xl border border-slate-200 bg-white p-8 shadow-sm dark:border-[#30363d] dark:bg-[#161b22] dark:shadow-[0_16px_36px_-24px_rgba(2,6,23,0.95)]\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <h2 className=\"text-lg font-semibold text-slate-900 dark:text-white\">Loading repository...</h2>\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">Preparing your task workspace.</p>\n </div>\n </div>\n )}\n\n {mode === 'new' && isInstallingAgentCli && installingAgentCli && (\n <div className=\"fixed inset-0 z-[1000] flex items-center justify-center bg-base-content/45 px-4\">\n <div className=\"w-full max-w-md rounded-xl border border-base-300 bg-base-100 p-6 shadow-2xl\">\n <div className=\"flex items-center gap-4\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <div className=\"space-y-1\">\n <h3 className=\"text-lg font-semibold\">Installing {AGENT_CLI_LABELS[installingAgentCli]}</h3>\n <p className=\"text-sm opacity-70\">\n Please wait while we install the coding agent CLI.\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'new' && isLoginModalOpen && loginAgentCli && (\n <div className=\"fixed inset-0 z-[1001] flex items-center justify-center bg-base-content/60 p-4\">\n <div className=\"w-full max-w-5xl rounded-xl border border-base-300 bg-base-100 shadow-2xl\">\n <div className=\"space-y-4 p-5 md:p-6\">\n <h3 className=\"text-xl font-semibold\">Login Required</h3>\n <p className=\"text-sm opacity-80\">\n {AGENT_CLI_LABELS[loginAgentCli]} has been installed. Complete login in the terminal below, then click Done to continue.\n </p>\n <p className=\"text-xs opacity-60\">\n Command: <span className=\"font-mono\">{loginCommand}</span>\n </p>\n\n <div className=\"h-[420px] overflow-hidden rounded-lg border border-base-300 bg-base-200\">\n <iframe\n ref={loginTerminalRef}\n src=\"/terminal\"\n className=\"h-full w-full border-none\"\n allow=\"clipboard-read; clipboard-write\"\n onLoad={handleLoginTerminalLoad}\n />\n </div>\n\n {loginModalError && (\n <div className=\"alert alert-error text-sm py-2\">\n {loginModalError}\n </div>\n )}\n\n {!loginModalError && (\n <div className=\"text-xs opacity-70\">\n {loginCommandInjected\n ? 'Login command was sent to the terminal automatically.'\n : 'Waiting for terminal to initialize...'}\n </div>\n )}\n\n <div className=\"flex justify-end\">\n <button\n className=\"btn btn-primary\"\n onClick={() => void handleLoginDone()}\n disabled={loading}\n >\n Done\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'new' && !selectedRepo && (!repoPath || !!error) && (\n <div className=\"card w-full max-w-2xl bg-base-200 shadow-xl\">\n <div className=\"card-body\">\n <h2 className=\"card-title flex items-center gap-2\">\n <FolderGit2 className=\"w-6 h-6 text-primary\" />\n Git Repository Selector\n </h2>\n {isResolvingRepoFromName ? (\n <div className=\"alert text-sm py-2 px-3 mt-2 flex items-center gap-2\">\n <span className=\"loading loading-spinner loading-sm\"></span>\n {fromRepoName\n ? `Searching for repository \"${fromRepoName}\"...`\n : 'Searching for repository...'}\n </div>\n ) : error ? (\n <div className=\"alert alert-error text-sm py-2 px-3 mt-2\">{error}</div>\n ) : (\n <div className=\"text-sm opacity-70 mt-2\">No repository specified.</div>\n )}\n <div className=\"mt-4\">\n <button className=\"btn btn-primary btn-sm\" onClick={() => router.push('/')}>\n Choose Repository\n </button>\n </div>\n </div>\n </div>\n )}\n\n\n {mode === 'new' && selectedRepo && isAttachmentBrowserOpen && (\n <SessionFileBrowser\n initialPath={lastAttachmentBrowserPath || selectedRepo}\n onPathChange={setLastAttachmentBrowserPath}\n onConfirm={async (paths) => {\n appendAttachmentPaths(paths);\n setIsAttachmentBrowserOpen(false);\n }}\n onCancel={() => setIsAttachmentBrowserOpen(false)}\n />\n )}\n\n {mode === 'home' && isBrowsing && (\n <FileBrowser\n initialPath={config?.defaultRoot || undefined}\n onSelect={handleSelectRepo}\n onCancel={() => setIsBrowsing(false)}\n checkRepo={checkIsGitRepo}\n />\n )}\n\n {mode === 'home' && isSelectingRoot && (\n <FileBrowser\n title=\"Default Root Folder\"\n initialPath={config?.defaultRoot || undefined}\n onSelect={handleSetDefaultRoot}\n onCancel={() => setIsSelectingRoot(false)}\n />\n )}\n </>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40ef05ed2b93d833cbca239d38b324dce181a0a3d2\":\"listDirectories\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_2=/*#__PURE__*/createServerReference(\"40ef05ed2b93d833cbca239d38b324dce181a0a3d2\",callServer,void 0,findSourceMapURL,\"listDirectories\");export{$$RSC_SERVER_ACTION_2 as listDirectories};","/* __next_internal_action_entry_do_not_use__ [{\"409ed2581b63653010cb38cea1d297c149fd1b48f6\":\"checkDirectoryAccessible\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_3=/*#__PURE__*/createServerReference(\"409ed2581b63653010cb38cea1d297c149fd1b48f6\",callServer,void 0,findSourceMapURL,\"checkDirectoryAccessible\");export{$$RSC_SERVER_ACTION_3 as checkDirectoryAccessible};","'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { checkDirectoryAccessible, listDirectories, getHomeDirectory } from '@/app/actions/git';\nimport { Folder, ArrowLeft, Check } from 'lucide-react';\nimport { getDirName } from '@/lib/path';\nimport { useDialogKeyboardShortcuts } from '@/hooks/useDialogKeyboardShortcuts';\n\ninterface FileSystemItem {\n name: string;\n path: string;\n isDirectory: boolean;\n isGitRepo: boolean;\n}\n\ninterface FileBrowserProps {\n title?: string;\n initialPath?: string;\n onSelect: (path: string) => void | Promise<unknown>;\n onCancel: () => void;\n checkRepo?: (path: string) => Promise<boolean>;\n}\n\nexport default function FileBrowser({ title, initialPath, onSelect, onCancel, checkRepo }: FileBrowserProps) {\n const [currentPath, setCurrentPath] = useState<string>('');\n const [homePath, setHomePath] = useState<string>('');\n const [items, setItems] = useState<FileSystemItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let isMounted = true;\n\n const init = async () => {\n try {\n const home = await getHomeDirectory();\n if (!isMounted) return;\n\n setHomePath(home);\n setCurrentPath(initialPath || home);\n } catch (err) {\n console.error('Failed to resolve home directory:', err);\n if (!isMounted) return;\n setError('Failed to access your home directory.');\n setCurrentPath(initialPath || '/');\n }\n };\n\n void init();\n\n return () => {\n isMounted = false;\n };\n }, [initialPath]);\n\n useEffect(() => {\n if (!currentPath) return;\n\n let isMounted = true;\n\n const fetchItems = async () => {\n setLoading(true);\n setError(null);\n try {\n const dirs = await listDirectories(currentPath);\n if (!isMounted) return;\n\n if (dirs.length === 0 && homePath && currentPath !== homePath) {\n const accessible = await checkDirectoryAccessible(currentPath);\n if (!isMounted) return;\n\n if (!accessible) {\n setError(`Could not access \"${currentPath}\". Showing home directory.`);\n setCurrentPath(homePath);\n return;\n }\n }\n\n const mapped: FileSystemItem[] = dirs.map(d => ({\n name: d.name,\n path: d.path,\n isDirectory: d.isDirectory,\n isGitRepo: d.isGitRepo\n }));\n setItems(mapped);\n } catch (err) {\n console.error(err);\n if (!isMounted) return;\n\n if (homePath && currentPath !== homePath) {\n setError(`Could not access \"${currentPath}\". Showing home directory.`);\n setCurrentPath(homePath);\n return;\n }\n\n setItems([]);\n setError('Failed to load directory contents');\n } finally {\n if (isMounted) {\n setLoading(false);\n }\n }\n };\n\n void fetchItems();\n\n return () => {\n isMounted = false;\n };\n }, [currentPath, homePath]);\n\n const handleSelectPath = useCallback(async (path: string) => {\n if (checkRepo) {\n const isValid = await checkRepo(path);\n if (!isValid) {\n setError(\"Selected directory is not a valid git repository.\");\n // Clear error after 3 seconds\n setTimeout(() => setError(null), 3000);\n return;\n }\n }\n await onSelect(path);\n }, [checkRepo, onSelect]);\n\n const handleSelect = useCallback(async () => {\n await handleSelectPath(currentPath);\n }, [currentPath, handleSelectPath]);\n\n useDialogKeyboardShortcuts({\n onConfirm: handleSelect,\n onDismiss: onCancel,\n canConfirm: Boolean(currentPath),\n });\n\n const handleNavigate = (path: string) => {\n setCurrentPath(path);\n };\n\n const handleGoUp = () => {\n // Navigate up one directory\n // Use the cross-platform getDirName utility to handle Windows and POSIX paths.\n const parent = getDirName(currentPath);\n if (parent && parent !== currentPath) {\n setCurrentPath(parent);\n }\n };\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm p-4\">\n <div className=\"bg-base-200 rounded-lg shadow-xl w-full max-w-3xl h-[80vh] flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b border-base-300\">\n <h2 className=\"text-xl font-bold flex items-center gap-2\">\n <Folder className=\"w-5 h-5\" />\n {title || \"Browse Local Repository\"}\n </h2>\n <button onClick={onCancel} className=\"btn btn-sm btn-ghost btn-circle\">\n ✕\n </button>\n </div>\n\n {/* Current Path Bar */}\n <div className=\"flex items-center gap-2 p-3 bg-base-300\">\n <button\n onClick={handleGoUp}\n className=\"btn btn-sm btn-square btn-ghost\"\n title=\"Go Up\"\n disabled={currentPath === '/' || !currentPath}\n >\n <ArrowLeft className=\"w-4 h-4\" />\n </button>\n <div className=\"flex-1 overflow-x-auto whitespace-nowrap px-2 font-mono text-sm\">\n {currentPath}\n </div>\n <button\n onClick={handleSelect}\n className=\"btn btn-sm btn-primary\"\n >\n Select Current Folder\n </button>\n </div>\n\n {/* List Content */}\n <div className=\"flex-1 overflow-y-auto p-2\">\n {loading ? (\n <div className=\"flex justify-center items-center h-full\">\n <span className=\"loading loading-spinner loading-lg\"></span>\n </div>\n ) : error ? (\n <div className=\"alert alert-error\">{error}</div>\n ) : items.length === 0 ? (\n <div className=\"text-center text-base-content/50 mt-10\">Empty directory</div>\n ) : (\n <div className=\"grid grid-cols-1 gap-1\">\n {items.map((item) => (\n <div\n key={item.path}\n className=\"group flex items-center justify-between p-2 hover:bg-base-100 rounded-md cursor-pointer transition-colors\"\n onClick={() => handleNavigate(item.path)}\n >\n <div className=\"flex items-center gap-3 overflow-hidden\">\n <Folder className={`w-5 h-5 ${item.isGitRepo ? 'text-primary' : 'text-base-content/70'}`} />\n <span className=\"truncate\">{item.name}</span>\n {item.isGitRepo && (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-bold bg-slate-200 text-slate-600 border border-slate-300 uppercase tracking-wide\">\n GIT\n </span>\n )}\n </div>\n {item.isGitRepo && (\n <button\n className=\"flex items-center justify-center p-1.5 rounded-md bg-primary/10 text-primary hover:bg-primary hover:text-white transition-colors\"\n onClick={(e) => {\n e.stopPropagation();\n void handleSelectPath(item.path);\n }}\n title={`Select ${item.name}`}\n >\n <Check className=\"h-[18px] w-[18px]\" />\n <span className=\"sr-only\">Select</span>\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer info */}\n <div className=\"p-3 border-t border-base-300 text-xs text-base-content/50 text-center\">\n Navigate to a folder and click &quot;Select Current Folder&quot; to choose it.\n </div>\n </div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"400301d7e1c6c0c6d05abfbc0b70de7d59b02fa15e\":\"checkIsGitRepo\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_6=/*#__PURE__*/createServerReference(\"400301d7e1c6c0c6d05abfbc0b70de7d59b02fa15e\",callServer,void 0,findSourceMapURL,\"checkIsGitRepo\");export{$$RSC_SERVER_ACTION_6 as checkIsGitRepo};","/* __next_internal_action_entry_do_not_use__ [{\"406ac2b035e497f1f7455228564309c3a10d66aab7\":\"getBranches\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_4=/*#__PURE__*/createServerReference(\"406ac2b035e497f1f7455228564309c3a10d66aab7\",callServer,void 0,findSourceMapURL,\"getBranches\");export{$$RSC_SERVER_ACTION_4 as getBranches};","/* __next_internal_action_entry_do_not_use__ [{\"603376fdd5d2a3668d90b291665a5202fe1782f31a\":\"checkoutBranch\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_5=/*#__PURE__*/createServerReference(\"603376fdd5d2a3668d90b291665a5202fe1782f31a\",callServer,void 0,findSourceMapURL,\"checkoutBranch\");export{$$RSC_SERVER_ACTION_5 as checkoutBranch};","/* __next_internal_action_entry_do_not_use__ [{\"7f8640b8e4f1fc6de62f678a721f7074343fe65efa\":\"getStartupScript\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_16=/*#__PURE__*/createServerReference(\"7f8640b8e4f1fc6de62f678a721f7074343fe65efa\",callServer,void 0,findSourceMapURL,\"getStartupScript\");export{$$RSC_SERVER_ACTION_16 as getStartupScript};","/* __next_internal_action_entry_do_not_use__ [{\"7f6b2e62921042a7611bd4d82d16f3482da13eb7c4\":\"getDefaultDevServerScript\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_17=/*#__PURE__*/createServerReference(\"7f6b2e62921042a7611bd4d82d16f3482da13eb7c4\",callServer,void 0,findSourceMapURL,\"getDefaultDevServerScript\");export{$$RSC_SERVER_ACTION_17 as getDefaultDevServerScript};","/* __next_internal_action_entry_do_not_use__ [{\"7fba72896b99de10151a43fed29069eeacfee9180f\":\"listRepoFiles\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_18=/*#__PURE__*/createServerReference(\"7fba72896b99de10151a43fed29069eeacfee9180f\",callServer,void 0,findSourceMapURL,\"listRepoFiles\");export{$$RSC_SERVER_ACTION_18 as listRepoFiles};","/* __next_internal_action_entry_do_not_use__ [{\"406aea1f9c17b43afbc9cb54039db7c6ad55e17ba2\":\"checkAgentCliInstalled\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_7=/*#__PURE__*/createServerReference(\"406aea1f9c17b43afbc9cb54039db7c6ad55e17ba2\",callServer,void 0,findSourceMapURL,\"checkAgentCliInstalled\");export{$$RSC_SERVER_ACTION_7 as checkAgentCliInstalled};","/* __next_internal_action_entry_do_not_use__ [{\"40d232d362313dcda50e81184b2e4a29ec4cabd146\":\"installAgentCli\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_8=/*#__PURE__*/createServerReference(\"40d232d362313dcda50e81184b2e4a29ec4cabd146\",callServer,void 0,findSourceMapURL,\"installAgentCli\");export{$$RSC_SERVER_ACTION_8 as installAgentCli};","/* __next_internal_action_entry_do_not_use__ [{\"602df1c60b1ecf1a01e195747e758f1972dd08bb9d\":\"cloneRemoteRepository\"},\"src/app/actions/repository.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"602df1c60b1ecf1a01e195747e758f1972dd08bb9d\",callServer,void 0,findSourceMapURL,\"cloneRemoteRepository\");export{$$RSC_SERVER_ACTION_1 as cloneRemoteRepository};","/* __next_internal_action_entry_do_not_use__ [{\"40fde4c82e661a44f2a8bd7595fa21ff59247b93a0\":\"resolveRepositoryByName\"},\"src/app/actions/repository.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40fde4c82e661a44f2a8bd7595fa21ff59247b93a0\",callServer,void 0,findSourceMapURL,\"resolveRepositoryByName\");export{$$RSC_SERVER_ACTION_0 as resolveRepositoryByName};","/* __next_internal_action_entry_do_not_use__ [{\"705c40ed6db5f3d31fe99fc055670ec058d840c1ec\":\"createSession\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_8=/*#__PURE__*/createServerReference(\"705c40ed6db5f3d31fe99fc055670ec058d840c1ec\",callServer,void 0,findSourceMapURL,\"createSession\");export{$$RSC_SERVER_ACTION_8 as createSession};","/* __next_internal_action_entry_do_not_use__ [{\"4034e95adf3477b547602c8ca38fbeb1c19b170a3d\":\"deleteSession\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_10=/*#__PURE__*/createServerReference(\"4034e95adf3477b547602c8ca38fbeb1c19b170a3d\",callServer,void 0,findSourceMapURL,\"deleteSession\");export{$$RSC_SERVER_ACTION_10 as deleteSession};","/* __next_internal_action_entry_do_not_use__ [{\"40dc8e44456d314551d580cda4b2c438b928089807\":\"getSessionPrefillContext\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_4=/*#__PURE__*/createServerReference(\"40dc8e44456d314551d580cda4b2c438b928089807\",callServer,void 0,findSourceMapURL,\"getSessionPrefillContext\");export{$$RSC_SERVER_ACTION_4 as getSessionPrefillContext};","/* __next_internal_action_entry_do_not_use__ [{\"403d9783a568e714feef0d07614dd45ecf1eb7a14c\":\"listSessions\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_7=/*#__PURE__*/createServerReference(\"403d9783a568e714feef0d07614dd45ecf1eb7a14c\",callServer,void 0,findSourceMapURL,\"listSessions\");export{$$RSC_SERVER_ACTION_7 as listSessions};","/* __next_internal_action_entry_do_not_use__ [{\"60db72cdb573fd8e83b31402cf62e339bd1dbb1951\":\"saveSessionLaunchContext\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_2=/*#__PURE__*/createServerReference(\"60db72cdb573fd8e83b31402cf62e339bd1dbb1951\",callServer,void 0,findSourceMapURL,\"saveSessionLaunchContext\");export{$$RSC_SERVER_ACTION_2 as saveSessionLaunchContext};","/* __next_internal_action_entry_do_not_use__ [{\"6064c5ff074410d342ffa12d21c2425799db25f13c\":\"updateRepoSettings\"},\"src/app/actions/config.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_3=/*#__PURE__*/createServerReference(\"6064c5ff074410d342ffa12d21c2425799db25f13c\",callServer,void 0,findSourceMapURL,\"updateRepoSettings\");export{$$RSC_SERVER_ACTION_3 as updateRepoSettings};","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }]];\n\n/**\n * @component @name Check\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Check = createLucideIcon('check', __iconNode);\n\nexport default Check;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4', key: '4exip2' }],\n ['path', { d: 'M12 2v2', key: 'tus03m' }],\n ['path', { d: 'M12 20v2', key: '1lh1kg' }],\n ['path', { d: 'm4.93 4.93 1.41 1.41', key: '149t6j' }],\n ['path', { d: 'm17.66 17.66 1.41 1.41', key: 'ptbguv' }],\n ['path', { d: 'M2 12h2', key: '1t8f8n' }],\n ['path', { d: 'M20 12h2', key: '1q8mjw' }],\n ['path', { d: 'm6.34 17.66-1.41 1.41', key: '1m8zz5' }],\n ['path', { d: 'm19.07 4.93-1.41 1.41', key: '1shlcs' }],\n];\n\n/**\n * @component @name Sun\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiAvPgogIDxwYXRoIGQ9Ik0xMiAydjIiIC8+CiAgPHBhdGggZD0iTTEyIDIwdjIiIC8+CiAgPHBhdGggZD0ibTQuOTMgNC45MyAxLjQxIDEuNDEiIC8+CiAgPHBhdGggZD0ibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJNMiAxMmgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxMmgyIiAvPgogIDxwYXRoIGQ9Im02LjM0IDE3LjY2LTEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJtMTkuMDcgNC45My0xLjQxIDEuNDEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sun\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Sun = createLucideIcon('sun', __iconNode);\n\nexport default Sun;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm21 21-4.34-4.34', key: '14j7rj' }],\n ['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],\n];\n\n/**\n * @component @name Search\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEgMjEtNC4zNC00LjM0IiAvPgogIDxjaXJjbGUgY3g9IjExIiBjeT0iMTEiIHI9IjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/search\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Search = createLucideIcon('search', __iconNode);\n\nexport default Search;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 13v8l-4-4', key: '1f5nwf' }],\n ['path', { d: 'm12 21 4-4', key: '1lfcce' }],\n ['path', { d: 'M4.393 15.269A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.436 8.284', key: 'ui1hmy' }],\n];\n\n/**\n * @component @name CloudDownload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMTN2OGwtNC00IiAvPgogIDxwYXRoIGQ9Im0xMiAyMSA0LTQiIC8+CiAgPHBhdGggZD0iTTQuMzkzIDE1LjI2OUE3IDcgMCAxIDEgMTUuNzEgOGgxLjc5YTQuNSA0LjUgMCAwIDEgMi40MzYgOC4yODQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/cloud-download\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CloudDownload = createLucideIcon('cloud-download', __iconNode);\n\nexport default CloudDownload;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 8V4H8', key: 'hb8ula' }],\n ['rect', { width: '16', height: '12', x: '4', y: '8', rx: '2', key: 'enze0r' }],\n ['path', { d: 'M2 14h2', key: 'vft8re' }],\n ['path', { d: 'M20 14h2', key: '4cs60a' }],\n ['path', { d: 'M15 13v2', key: '1xurst' }],\n ['path', { d: 'M9 13v2', key: 'rq6x2g' }],\n];\n\n/**\n * @component @name Bot\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgOFY0SDgiIC8+CiAgPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjEyIiB4PSI0IiB5PSI4IiByeD0iMiIgLz4KICA8cGF0aCBkPSJNMiAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0xNSAxM3YyIiAvPgogIDxwYXRoIGQ9Ik05IDEzdjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/bot\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Bot = createLucideIcon('bot', __iconNode);\n\nexport default Bot;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 19a5 5 0 0 1-5-5v8', key: 'sz5oeg' }],\n [\n 'path',\n {\n d: 'M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5',\n key: '1w6njk',\n },\n ],\n ['circle', { cx: '13', cy: '12', r: '2', key: '1j92g6' }],\n ['circle', { cx: '20', cy: '19', r: '2', key: '1obnsp' }],\n];\n\n/**\n * @component @name FolderGit2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggMTlhNSA1IDAgMCAxLTUtNXY4IiAvPgogIDxwYXRoIGQ9Ik05IDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2NSIgLz4KICA8Y2lyY2xlIGN4PSIxMyIgY3k9IjEyIiByPSIyIiAvPgogIDxjaXJjbGUgY3g9IjIwIiBjeT0iMTkiIHI9IjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/folder-git-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FolderGit2 = createLucideIcon('folder-git-2', __iconNode);\n\nexport default FolderGit2;\n","export type RepoCardGradient = {\n backgroundImage: string;\n};\n\ntype GradientFamily = {\n highlight: string;\n secondary: string;\n baseStart: string;\n baseEnd: string;\n anchorA: [number, number];\n anchorB: [number, number];\n};\n\nconst GRADIENT_FAMILIES: GradientFamily[] = [\n {\n highlight: '#dce4ff',\n secondary: '#c7d2fe',\n baseStart: '#f8fafc',\n baseEnd: '#f3f6ff',\n anchorA: [12, 10],\n anchorB: [86, 84],\n },\n {\n highlight: '#dcfce7',\n secondary: '#bbf7d0',\n baseStart: '#f8fafc',\n baseEnd: '#effcf4',\n anchorA: [86, 14],\n anchorB: [14, 84],\n },\n {\n highlight: '#fae8ff',\n secondary: '#f5d0fe',\n baseStart: '#f8fafc',\n baseEnd: '#fbf2ff',\n anchorA: [50, 8],\n anchorB: [50, 90],\n },\n {\n highlight: '#ffedd5',\n secondary: '#fed7aa',\n baseStart: '#f8fafc',\n baseEnd: '#fff7ed',\n anchorA: [35, 35],\n anchorB: [84, 86],\n },\n];\n\nfunction hashString(value: string): number {\n let hash = 2166136261;\n for (let i = 0; i < value.length; i += 1) {\n hash ^= value.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\nfunction normalizeName(repoName: string): string {\n return repoName.trim().toLowerCase();\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction hexToRgba(hexColor: string, alpha: number): string {\n const hex = hexColor.replace('#', '');\n const expandedHex = hex.length === 3\n ? hex.split('').map((part) => `${part}${part}`).join('')\n : hex;\n const value = Number.parseInt(expandedHex, 16);\n\n const red = (value >> 16) & 255;\n const green = (value >> 8) & 255;\n const blue = value & 255;\n\n return `rgba(${red}, ${green}, ${blue}, ${clamp(alpha, 0, 1)})`;\n}\n\nfunction clampPoint(point: [number, number]): [number, number] {\n return [\n clamp(point[0], 0, 100),\n clamp(point[1], 0, 100),\n ];\n}\n\nexport function getStableRepoCardGradient(repoName: string): RepoCardGradient {\n const normalizedName = normalizeName(repoName);\n const hash = hashString(normalizedName || 'repo');\n const family = GRADIENT_FAMILIES[hash % GRADIENT_FAMILIES.length];\n\n const jitterA: [number, number] = [\n ((hash >>> 3) % 13) - 6,\n ((hash >>> 7) % 13) - 6,\n ];\n const jitterB: [number, number] = [\n ((hash >>> 11) % 13) - 6,\n ((hash >>> 15) % 13) - 6,\n ];\n const anchorA = clampPoint([family.anchorA[0] + jitterA[0], family.anchorA[1] + jitterA[1]]);\n const anchorB = clampPoint([family.anchorB[0] + jitterB[0], family.anchorB[1] + jitterB[1]]);\n\n const accentHue = hash % 360;\n const accentAlpha = 0.16 + ((hash >>> 20) % 10) / 100;\n\n return {\n backgroundImage: [\n `radial-gradient(circle at ${anchorA[0]}% ${anchorA[1]}%, ${hexToRgba(family.highlight, 0.82)} 0%, transparent 74%)`,\n `radial-gradient(circle at ${anchorB[0]}% ${anchorB[1]}%, ${hexToRgba(family.secondary, 0.78)} 0%, transparent 74%)`,\n `radial-gradient(circle at 50% 100%, hsla(${accentHue} 82% 86% / ${accentAlpha}) 0%, transparent 78%)`,\n `linear-gradient(145deg, ${family.baseStart} 0%, ${family.baseEnd} 100%)`,\n ].join(', '),\n };\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOS42NzEgNC4xMzZhMi4zNCAyLjM0IDAgMCAxIDQuNjU5IDAgMi4zNCAyLjM0IDAgMCAwIDMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMSAyLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwIDMuODMxIDIuMzQgMi4zNCAwIDAgMS0yLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMC0zLjMxOSAxLjkxNSAyLjM0IDIuMzQgMCAwIDEtNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAtMy4zMi0xLjkxNSAyLjM0IDIuMzQgMCAwIDEtMi4zMy00LjAzMyAyLjM0IDIuMzQgMCAwIDAgMC0zLjgzMUEyLjM0IDIuMzQgMCAwIDEgNi4zNSA2LjA1MWEyLjM0IDIuMzQgMCAwIDAgMy4zMTktMS45MTUiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.3 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.98a2 2 0 0 1 1.69.9l.66 1.2A2 2 0 0 0 12 6h8a2 2 0 0 1 2 2v3.3',\n key: '128dxu',\n },\n ],\n ['path', { d: 'm14.305 19.53.923-.382', key: '3m78fa' }],\n ['path', { d: 'm15.228 16.852-.923-.383', key: 'npixar' }],\n ['path', { d: 'm16.852 15.228-.383-.923', key: '5xggr7' }],\n ['path', { d: 'm16.852 20.772-.383.924', key: 'dpfhf9' }],\n ['path', { d: 'm19.148 15.228.383-.923', key: '1reyyz' }],\n ['path', { d: 'm19.53 21.696-.382-.924', key: '1goivc' }],\n ['path', { d: 'm20.772 16.852.924-.383', key: 'htqkph' }],\n ['path', { d: 'm20.772 19.148.924.383', key: '9w9pjp' }],\n ['circle', { cx: '18', cy: '18', r: '3', key: '1xkwt0' }],\n];\n\n/**\n * @component @name FolderCog\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuMyAyMEg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOThhMiAyIDAgMCAxIDEuNjkuOWwuNjYgMS4yQTIgMiAwIDAgMCAxMiA2aDhhMiAyIDAgMCAxIDIgMnYzLjMiIC8+CiAgPHBhdGggZD0ibTE0LjMwNSAxOS41My45MjMtLjM4MiIgLz4KICA8cGF0aCBkPSJtMTUuMjI4IDE2Ljg1Mi0uOTIzLS4zODMiIC8+CiAgPHBhdGggZD0ibTE2Ljg1MiAxNS4yMjgtLjM4My0uOTIzIiAvPgogIDxwYXRoIGQ9Im0xNi44NTIgMjAuNzcyLS4zODMuOTI0IiAvPgogIDxwYXRoIGQ9Im0xOS4xNDggMTUuMjI4LjM4My0uOTIzIiAvPgogIDxwYXRoIGQ9Im0xOS41MyAyMS42OTYtLjM4Mi0uOTI0IiAvPgogIDxwYXRoIGQ9Im0yMC43NzIgMTYuODUyLjkyNC0uMzgzIiAvPgogIDxwYXRoIGQ9Im0yMC43NzIgMTkuMTQ4LjkyNC4zODMiIC8+CiAgPGNpcmNsZSBjeD0iMTgiIGN5PSIxOCIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/folder-cog\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FolderCog = createLucideIcon('folder-cog', __iconNode);\n\nexport default FolderCog;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401',\n key: 'kfwtm',\n },\n ],\n];\n\n/**\n * @component @name Moon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAuOTg1IDEyLjQ4NmE5IDkgMCAxIDEtOS40NzMtOS40NzJjLjQwNS0uMDIyLjYxNy40Ni40MDIuODAzYTYgNiAwIDAgMCA4LjI2OCA4LjI2OGMuMzQ0LS4yMTUuODI1LS4wMDQuODAzLjQwMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/moon\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Moon = createLucideIcon('moon', __iconNode);\n\nexport default Moon;\n"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,sC0ByBmB,EAAiB,CGZpB,AHYoB,CGZpB,AHYoB,CAAA,AGZpB,CHYoB,AGZpB,CAAA,AHYoB,CAAA,AGZpB,qLHNL,CDAA,AJAA,AKAA,gCAGkB,yBAA6B,YAC3C,GAAI,CGAH,ADYC,IFZQ,CGAT,ADYC,AFZQ,CGAT,AHAS,AEYR,CCZD,ADYC,AFZY,CGAb,ADYC,AFZY,CEYZ,ACZD,AHAa,CGAb,AHAa,AEYZ,oBFZ+B,GAChD,E1BXA,IAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,U6B8BM,EAAA,CAAA,EAAA,EAAA,OAAA,AAAY,EAAiB,CAAA,CAAA,CAAA,CAAA,UAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,oIAtB9C,CJYD,CAAA,uCIZ6C,uCACb,CRAH,ASYH,ADZM,GAAA,UAAe,uCACf,CAAA,AHAD,GAAA,UGAgB,CACzD,CAAC,OAAQ,CAAE,EAAA,0BAA8B,CAAA,ARYP,CQZO,ARYP,CQZO,ARYG,CAAA,AQZH,AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,EACvD,CHYH,AGZG,CHYH,AGZG,KAAQ,CAAA,AAAE,EAAA,wCAA6C,CHYN,AGXlD,CHWkD,AGXjD,CHW2D,AGX3D,CHW2D,AGX3D,CAAA,CAAA,CAAA,CAAA,CAAA,AAAQ,CAAA,AAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,AAA2B,CAAA,CAAA,CAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CACxD,CAAC,OAAQ,CAAA,AAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,uBAAgC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CACxD,CAAC,OAAQ,CAAA,AAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,oBAA0B,CAAA,CAAA,CAAA,CAAA,AAAK,QAAA,EAAU,CACvD,CAAC,SAAU,IAAM,IAAA,CAAM,AAAN,CAAM,CAAA,CAAI,CAAA,IAAM,CAAA,CAAA,AAAG,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,AAAK,QAAA,CAAU,CAAA,CAC1D,EJGA,EAAA,CAAA,EAAA,EAAA,OAAA,AAAY,EAAA,8CAlBT,+BAAqC,EAAA,MAAW,WAAc,IAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,gJAIhD,KzBNhC,IAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,gB4BsBiB,EAAA,OAAA,EAAA,YAA6B,CCZF,ADYE,AFZH,UENlC,CPAN,AQAM,AJAN,AGAM,AEAA,sWFIU,CHYP,AIZI,ARAA,CQAA,ARAA,AIYJ,CAAA,AIZI,ARAA,COAG,AHYP,AJZI,AQAA,CAAA,ADAG,AHYP,AJZI,GOAa,CCAb,ARAA,AIYa,AGZA,CAAA,ACAb,ARAA,AIYa,CJZb,AIYa,AGZA,ACAb,CRAA,AQAA,AJYa,AGZA,CCAb,ADAa,AHYA,AJZb,MOA2B,CPAF,AOAE,ACAD,AJYN,CJZK,AQAC,AJYN,AGZO,EHYP,azBpBpC,IAAA,EAAA,EAAA,CAAA,CAAA,gBuBiBsB,CGZb,ADAO,AJAA,AGYA,ADAM,CEZN,AJAA,AGYA,AEZP,AHYa,ACAN,CHZA,AKAP,ADAO,ADYA,ADAM,CAAA,AGZb,ADAO,ADYA,AHZA,CAAA,AKAP,ADAO,AFYM,ACAN,IAAA,EAAA,+KDdkE,CAAA,CAAA,CAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,QDalF,EAAA,OAAA,EAAA,kEAdA,GAAI,KAAM,GAAI,eAAmB,CEAF,CAAA,gBAe9B,CAAA,AMZL,ATAK,AQAL,ADAA,AFAF,ADAO,CDYA,AHZA,AQAL,ADAA,AFAF,ADAO,AJAA,CGYA,AHZA,AKAP,ADAO,AFYV,CEZU,ADYA,AEZP,ALAO,AEYV,CCAU,ADAV,AGZG,ADAO,AJAA,IAAA,EAAA,2CGJwB,EAAA,aAAoB,CAAA,CAAA,CAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,iBAC1D,CAAA,AFAH,ADAH,AIAI,AFAJ,CDAG,AEAG,AHAN,AEAA,CAAA,yBCAyC,CFAC,AEAD,ACAD,kBDC7C,CHAA,AEAA,AEAA,ADAA,GAAM,CHAD,AEAA,AEAA,ADAC,CHAD,AGAC,ADAD,AEAA,CAAA,AJAA,AGAC,ADAD,CAAA,ACAC,AHAD,AIAA,CAAA,AFAA,ACAC,AHAD,wBGAqC,CDArC,ACAqC,CDArC,ACAqC,CAAA,ADArC,CCAqC,ADArC,aFoBV,CQZH,CAAA,CRYG,AQZH,CRYG,AQZH,CAAA,EAAA,OAAA,ARYS,EAAiB,CQZb,ARYa,CQZb,ARYa,CQZb,ARYa,CQZb,ARYa,CAAA,AQZb,CAAA,CRYoB,CQZpB,ARYoB,CQZpB,ARYoB,CQZpB,ARYoB,CQZpB,ARYoB,CAAA,AQZpB,CRYoB,AQZpB,QRVG,iCAAuC,2DAE9B,CAAA,AIAD,ADAA,ADAX,CFAY,AEAZ,ACAW,ACAA,CAAA,ADAA,ADAX,AFAY,CAAA,UAAe,CGAA,ADA3B,CCA2B,ADA3B,wHFGW,CIAA,AJAA,CIAA,AJAA,CIAA,AJAA,CIAA,AJAA,UAAe,CACxC,QAAS,CAAA,AAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,AAAY,CAAA,CAAA,CAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,oGAEa,GSYlD,CTZH,AQAA,CCYG,ATZH,AQAA,ACYG,CTZH,ASYG,ADZH,CRAA,AQAA,ACYG,CAAA,EAAA,OAAA,EAAwB,CTZd,AQAA,ACYc,CDZd,ARAA,ASYc,CAAA,AJZD,ALAb,AQAA,CRAA,ASYc,AJZD,AGAb,oICJL,CAAA,ALAA,AJAA,AOAA,ACAA,AHAF,SIGT,E5BXuL,IAAA,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAM,EAAmC,CAAA,EAAA,EAAA,iBAAb,IA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","ignoreList":[20,21,22,23,24,25,26,28,29,30]}